@next-bricks/diagram 0.63.0 → 0.63.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bricks.json +3 -3
- package/dist/chunks/{8522.dcbc8592.js → 8522.6e5772ce.js} +2 -2
- package/dist/chunks/8522.6e5772ce.js.map +1 -0
- package/dist/chunks/{main.69738be9.js → main.48677ce1.js} +2 -2
- package/dist/chunks/{main.69738be9.js.map → main.48677ce1.js.map} +1 -1
- package/dist/examples.json +3 -3
- package/dist/{index.b30ff5f9.js → index.82d1267c.js} +2 -2
- package/dist/{index.b30ff5f9.js.map → index.82d1267c.js.map} +1 -1
- package/dist/manifest.json +40 -40
- package/dist/types.json +74 -74
- package/package.json +2 -2
- package/dist/chunks/8522.dcbc8592.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunks/8522.6e5772ce.js","mappings":"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","sources":["webpack:///./src/draw-canvas/processors/getUnrelatedCells.ts","webpack:///./src/draw-canvas/processors/asserts.ts","webpack:///./src/shared/canvas/processors/nodeViewToNodeRect.ts","webpack:///./src/shared/canvas/processors/getSmartLinePoints.ts","webpack:///./src/draw-canvas/SmartConnectLineComponent.tsx","webpack:///./src/shared/canvas/processors/getConnectLinePoints.ts","webpack:///./src/draw-canvas/processors/normalizeAlignOrigin.ts","webpack:///./src/shared/canvas/useLayout.ts","webpack:///./src/shared/canvas/useAutoCenter.ts","webpack:///./src/shared/canvas/processors/getTransformToCenter.ts","webpack:///./src/shared/canvas/useActiveTarget.ts","webpack:///./src/shared/canvas/processors/getEditingLinePoints.ts","webpack:///./src/draw-canvas/EditingLineComponent.tsx","webpack:///./src/draw-canvas/processors/handleNodeContainedChange.ts","webpack:///./src/draw-canvas/LineEditorComponent.tsx","webpack:///./src/draw-canvas/processors/handleLasso.ts","webpack:///./src/draw-canvas/LineConnectorComponent.tsx","webpack:///./src/draw-canvas/processors/handleKeyboard.ts","webpack:///./src/draw-canvas/processors/toggleLock.ts","webpack:///./src/shared/canvas/styles.shadow.css","webpack:///./src/draw-canvas/constants.ts","webpack:///./src/draw-canvas/ConnectLineComponent.tsx","webpack:///./src/draw-canvas/processors/initializeCells.ts","webpack:///./src/draw-canvas/LineLabelComponent.tsx","webpack:///./src/draw-canvas/EdgeComponent.tsx","webpack:///./src/draw-canvas/processors/getLabelMaskAndOffset.ts","webpack:///./src/draw-canvas/LockIcon.tsx","webpack:///./src/draw-canvas/NodeComponent.tsx","webpack:///./src/draw-canvas/processors/getSnapPositions.ts","webpack:///./src/draw-canvas/processors/handleMouseDown.ts","webpack:///./src/draw-canvas/processors/normalizeSnapOptions.ts","webpack:///./src/draw-canvas/processors/getContentEditable.ts","webpack:///./src/draw-canvas/decorators/DecoratorText.tsx","webpack:///./src/draw-canvas/decorators/index.tsx","webpack:///./src/draw-canvas/decorators/DecoratorContainer.tsx","webpack:///./src/draw-canvas/decorators/DecoratorArea.tsx","webpack:///./src/draw-canvas/decorators/DecoratorRect.tsx","webpack:///./src/draw-canvas/decorators/DecoratorLine.tsx","webpack:///./src/draw-canvas/processors/getLineLockIconPosition.ts","webpack:///./src/draw-canvas/processors/computeContainerRect.ts","webpack:///./src/draw-canvas/CellComponent.tsx","webpack:///./src/draw-canvas/processors/findNodeOrAreaDecorator.ts","webpack:///./src/shared/canvas/collectLineJumpsFactory.ts","webpack:///./src/shared/canvas/useEditableLineMap.ts","webpack:///./src/draw-canvas/processors/targetIsActive.ts","webpack:///./src/draw-canvas/reducers/cells.ts","webpack:///./src/draw-canvas/reducers/index.ts","webpack:///./src/draw-canvas/reducers/layoutKey.ts","webpack:///./src/shared/canvas/forceLayout.ts","webpack:///./src/shared/canvas/ZoomBarComponent.shadow.css","webpack:///./src/draw-canvas/processors/updateCells.ts","webpack:///./src/draw-canvas/processors/transformToCenter.ts","webpack:///./src/shared/canvas/icons/center.svg","webpack:///./src/shared/canvas/icons/zoom-in.svg","webpack:///./src/shared/canvas/icons/zoom-out.svg","webpack:///./src/shared/canvas/ZoomBarComponent.tsx","webpack:///./src/shared/canvas/useLineMarkers.ts","webpack:///./src/shared/canvas/useZoom.ts","webpack:///./src/draw-canvas/processors/sameTarget.ts","webpack:///./src/shared/canvas/useReady.ts","webpack:///./src/shared/canvas/shapes/Rectangle.ts","webpack:///./src/draw-canvas/processors/isLocked.ts","webpack:///./src/shared/canvas/dagreLayout.ts","webpack:///./src/shared/canvas/processors/getCellsRect.ts","webpack:///./src/draw-canvas/processors/cellToTarget.ts","webpack:///./src/draw-canvas/HoverStateContext.ts"],"sourcesContent":["import type { ActiveTarget, Cell, ConnectLineState } from \"../interfaces\";\nimport { targetIsActive } from \"./targetIsActive\";\n\nexport function getUnrelatedCells(\n cells: Cell[],\n connectLineState: ConnectLineState | null,\n activeTarget: ActiveTarget | null,\n allowEdgeToArea?: boolean\n): Cell[] {\n const unrelated: Cell[] = [];\n if (connectLineState) {\n const existedTargets = new Set<string>();\n for (const cell of cells) {\n if (cell.type === \"edge\" && cell.source === connectLineState.source.id) {\n existedTargets.add(cell.target);\n }\n }\n for (const cell of cells) {\n switch (cell.type) {\n case \"node\":\n if (existedTargets.has(cell.id)) {\n unrelated.push(cell);\n }\n break;\n case \"decorator\":\n if (\n !allowEdgeToArea ||\n cell.decorator == \"text\" ||\n existedTargets.has(cell.id)\n ) {\n unrelated.push(cell);\n }\n break;\n default:\n unrelated.push(cell);\n }\n }\n } else {\n switch (activeTarget?.type) {\n case \"multi\": {\n const nodesMap = new Map<string, Cell>();\n const activeNodeIds = new Set<string>();\n const relatedNodeIds = new Set<string>();\n for (const active of activeTarget.targets) {\n if (active.type === \"node\") {\n activeNodeIds.add(active.id);\n relatedNodeIds.add(active.id);\n }\n }\n for (const cell of cells) {\n if (cell.type === \"node\") {\n nodesMap.set(cell.id, cell);\n } else if (cell.type === \"edge\") {\n if (activeNodeIds.has(cell.source)) {\n relatedNodeIds.add(cell.target);\n } else if (activeNodeIds.has(cell.target)) {\n relatedNodeIds.add(cell.source);\n } else if (!targetIsActive(cell, activeTarget)) {\n unrelated.push(cell);\n }\n } else if (!targetIsActive(cell, activeTarget)) {\n unrelated.push(cell);\n }\n }\n for (const [id, cell] of nodesMap) {\n if (!relatedNodeIds.has(id)) {\n unrelated.push(cell);\n }\n }\n break;\n }\n\n case \"node\": {\n const nodesMap = new Map<string, Cell>();\n const relatedNodeIds = new Set<string>([activeTarget.id]);\n for (const cell of cells) {\n if (cell.type === \"node\") {\n nodesMap.set(cell.id, cell);\n } else if (cell.type === \"edge\") {\n if (cell.source === activeTarget.id) {\n relatedNodeIds.add(cell.target);\n } else if (cell.target === activeTarget.id) {\n relatedNodeIds.add(cell.source);\n } else {\n unrelated.push(cell);\n }\n } else {\n unrelated.push(cell);\n }\n }\n for (const [id, cell] of nodesMap) {\n if (!relatedNodeIds.has(id)) {\n unrelated.push(cell);\n }\n }\n break;\n }\n\n case \"edge\":\n for (const cell of cells) {\n if (\n !(cell.type === \"edge\"\n ? targetIsActive(cell, activeTarget)\n : cell.type === \"node\" &&\n (cell.id === activeTarget.source ||\n cell.id === activeTarget.target))\n ) {\n unrelated.push(cell);\n }\n }\n break;\n }\n }\n\n return unrelated;\n}\n","import type {\n Cell,\n DecoratorCell,\n EdgeCell,\n EditableEdgeLine,\n EditableLine,\n InitialCell,\n InitialNodeCell,\n LayoutType,\n LineDecoratorCell,\n LineType,\n NodeCell,\n} from \"../interfaces\";\nimport { MoveCellPayload } from \"../reducers/interfaces\";\n\nexport function isNodeCell(cell: Cell | MoveCellPayload): cell is NodeCell {\n return cell.type === \"node\";\n}\n\nexport function isDecoratorCell(cell: Cell): cell is DecoratorCell {\n return cell.type === \"decorator\";\n}\n\nexport function isInitialNodeCell(cell: InitialCell): cell is InitialNodeCell {\n return cell.type === \"node\";\n}\n\nexport function isEdgeCell(cell: Cell): cell is EdgeCell {\n return cell.type === \"edge\";\n}\n\nexport function isNodeOrEdgeCell(cell: Cell): cell is NodeCell | EdgeCell {\n return cell.type === \"node\" || cell.type === \"edge\";\n}\n\nexport function isNodeOrAreaDecoratorCell(\n cell: Cell\n): cell is NodeCell | DecoratorCell {\n return (\n cell.type === \"node\" ||\n (cell.type === \"decorator\" && cell.decorator === \"area\")\n );\n}\n\nexport function isEdgeSide(\n cell: Cell,\n allowEdgeToArea: boolean | undefined\n): cell is NodeCell | DecoratorCell {\n return (\n cell.type === \"node\" ||\n (!!allowEdgeToArea &&\n cell.type === \"decorator\" &&\n cell.decorator === \"area\")\n );\n}\n\nexport function isNodeOrTextDecoratorCell(\n cell: Cell | MoveCellPayload\n): cell is NodeCell | DecoratorCell {\n return (\n cell.type === \"node\" ||\n (cell.type === \"decorator\" && cell.decorator === \"text\")\n );\n}\n\nexport function isTextDecoratorCell(cell: Cell): cell is DecoratorCell {\n return cell.type === \"decorator\" && cell.decorator === \"text\";\n}\nexport function isContainerDecoratorCell(\n cell: Cell | MoveCellPayload\n): cell is DecoratorCell {\n return cell.type === \"decorator\" && cell.decorator === \"container\";\n}\n\nexport function isRectDecoratorCell(\n cell: Cell | MoveCellPayload\n): cell is DecoratorCell {\n return cell.type === \"decorator\" && cell.decorator === \"rect\";\n}\n\nexport function isLineDecoratorCell(\n cell: Cell | LineDecoratorCell | MoveCellPayload\n): cell is LineDecoratorCell {\n return cell.type === \"decorator\" && cell.decorator === \"line\";\n}\n\nexport function isNoManualLayout(layout: LayoutType) {\n return ![\"manual\", undefined].includes(layout!);\n}\n\nexport function isStraightType(type: LineType | undefined) {\n return !(type === \"polyline\" || type === \"curve\");\n}\n\nexport function isEditableEdgeLine(\n line: EditableLine\n): line is EditableEdgeLine {\n return !!(line as EditableEdgeLine).edge;\n}\n","import type { NodeRect } from \"../../../diagram/interfaces\";\nimport type { NodeView } from \"../../../draw-canvas/interfaces\";\n\nexport function nodeViewToNodeRect(view: NodeView, padding: number): NodeRect {\n return {\n x: view.x + view.width / 2,\n y: view.y + view.height / 2,\n width: view.width + padding,\n height: view.height + padding,\n };\n}\n","import { pull } from \"lodash\";\nimport type { NodePosition } from \"../../../diagram/interfaces\";\nimport { getConnectPointsOfRectangleWithDirection } from \"../shapes/Rectangle\";\nimport type {\n BiDirection,\n EditableLineView,\n NodeView,\n} from \"../../../draw-canvas/interfaces\";\nimport { getPolyLinePoints } from \"../../../diagram/lines/getPolyLinePoints\";\nimport { nodeViewToNodeRect } from \"./nodeViewToNodeRect\";\nimport {\n DEFAULT_NODE_PADDING_FOR_LINES,\n DEFAULT_NODE_PADDING_FOR_SMART_LINES,\n} from \"../../../draw-canvas/constants\";\nimport { getDirectLinePoints } from \"../../../diagram/lines/getDirectLinePoints\";\nimport { isStraightType } from \"../../../draw-canvas/processors/asserts\";\n\nconst DEFAULT_DIRECTIONS = [\"right\", \"top\", \"left\", \"bottom\"] as const;\n\nexport function getSmartLinePoints(\n sourceView: NodeView,\n targetView: NodeView,\n lineView: EditableLineView | undefined,\n parallelGap?: number,\n /** @default \"edge\" */\n cellType?: \"edge\" | \"decorator\"\n): NodePosition[] | null {\n const {\n type,\n vertices,\n exitPosition: originalExit,\n entryPosition: originalEntry,\n } = lineView ?? {};\n\n if (isStraightType(type)) {\n if (cellType === \"decorator\") {\n return [\n { x: sourceView.x, y: sourceView.y },\n ...(vertices ?? []),\n { x: targetView.x, y: targetView.y },\n ];\n }\n\n return getDirectLinePoints(\n nodeViewToNodeRect(\n sourceView,\n originalExit\n ? DEFAULT_NODE_PADDING_FOR_SMART_LINES\n : DEFAULT_NODE_PADDING_FOR_LINES\n ),\n nodeViewToNodeRect(\n targetView,\n originalEntry\n ? DEFAULT_NODE_PADDING_FOR_SMART_LINES\n : DEFAULT_NODE_PADDING_FOR_LINES\n ),\n parallelGap,\n lineView\n );\n }\n\n if (vertices?.length) {\n const firstVertex = vertices[0];\n const lastVertex = vertices[vertices.length - 1];\n\n let exitPoint: NodePosition;\n let entryPoint: NodePosition;\n let exitDirection: BiDirection | undefined;\n let entryDirection: BiDirection | undefined;\n\n // Auto decide the exit and entry position.\n if (originalExit) {\n exitPoint = getAbsolutePosition(sourceView, originalExit);\n } else {\n let possibleFirstNextPoint: NodePosition | undefined;\n if (vertices.length > 1) {\n // Decide exit point by the first two vertices.\n possibleFirstNextPoint = vertices[1];\n } else if (originalEntry) {\n // Decide exit point by the entry position.\n possibleFirstNextPoint = getAbsolutePosition(targetView, originalEntry);\n }\n if (possibleFirstNextPoint) {\n exitPoint = getDefaultAbsolutePosition(\n firstVertex,\n sourceView,\n firstVertex.y === possibleFirstNextPoint.y\n );\n } else {\n // No other vertices nor the entry position, decide exit point by the\n // relative position between the last vertex and the target node.\n const prefer =\n lastVertex.y < targetView.y ||\n lastVertex.y > targetView.y + targetView.height\n ? \"ns\"\n : \"ew\";\n ({ point: exitPoint, direction: exitDirection } =\n fitEndpointAndDirection(sourceView, targetView, vertices, prefer));\n }\n }\n\n if (originalEntry) {\n entryPoint = getAbsolutePosition(targetView, originalEntry);\n } else {\n let possibleLastPreviousPoint: NodePosition | undefined;\n if (vertices.length > 1) {\n // Decide entry point by the last two vertices.\n possibleLastPreviousPoint = vertices[vertices.length - 2];\n } else if (originalExit) {\n // Decide entry point by the exit position.\n possibleLastPreviousPoint = getAbsolutePosition(\n sourceView,\n originalExit\n );\n }\n if (possibleLastPreviousPoint) {\n entryPoint = getDefaultAbsolutePosition(\n lastVertex,\n targetView,\n lastVertex.y === possibleLastPreviousPoint.y\n );\n } else {\n // No other vertices nor the exit position, decide entry point by the\n // relative position between the first vertex and the source node.\n const prefer =\n firstVertex.x < sourceView.x ||\n firstVertex.x > sourceView.x + sourceView.width\n ? \"ew\"\n : \"ns\";\n ({ point: entryPoint, direction: entryDirection } =\n fitEndpointAndDirection(\n targetView,\n sourceView,\n vertices.slice().reverse(),\n prefer\n ));\n }\n }\n\n const { x: sourceX, y: sourceY } = exitPoint;\n const { x: targetX, y: targetY } = entryPoint;\n\n const newLinePoints = [exitPoint, ...vertices, entryPoint];\n\n const newVertices = [...vertices];\n\n // If the first vertex is not on any axis of the source exit point,\n // add a vertex to connect them.\n if (firstVertex && firstVertex.x !== sourceX && firstVertex.y !== sourceY) {\n newVertices.unshift(\n exitDirection === \"ns\"\n ? { x: sourceX, y: firstVertex.y }\n : exitDirection === \"ew\"\n ? { x: firstVertex.x, y: sourceY }\n : firstVertex.x === newLinePoints[2].x\n ? { x: sourceX, y: firstVertex.y }\n : { x: firstVertex.x, y: sourceY }\n );\n }\n\n // If the last vertex is not on any axis of the target entry point,\n // add a vertex to connect them.\n if (lastVertex && lastVertex.x !== targetX && lastVertex.y !== targetY) {\n newVertices.push(\n entryDirection === \"ns\"\n ? { x: targetX, y: lastVertex.y }\n : entryDirection === \"ew\"\n ? { x: lastVertex.x, y: targetY }\n : lastVertex.x === newLinePoints[newLinePoints.length - 3].x\n ? { x: targetX, y: lastVertex.y }\n : { x: lastVertex.x, y: targetY }\n );\n }\n\n return [\n exitPoint,\n ...simplifyVertices(exitPoint, newVertices, entryPoint),\n entryPoint,\n ];\n }\n\n const exitPosition =\n originalExit ?? getDefaultPosition(targetView, sourceView);\n const entryPosition =\n originalEntry ?? getDefaultPosition(sourceView, targetView);\n\n const { x: sourceX, y: sourceY } = getAbsolutePosition(\n sourceView,\n exitPosition\n );\n const { x: targetX, y: targetY } = getAbsolutePosition(\n targetView,\n entryPosition\n );\n\n const connectPoints = getConnectPointsOfRectangleWithDirection();\n const originalSourceDirections =\n connectPoints.find((p) => p.x === exitPosition.x && p.y === exitPosition.y)\n ?.d ?? DEFAULT_DIRECTIONS;\n const originalTargetDirections =\n connectPoints.find(\n (p) => p.x === entryPosition.x && p.y === entryPosition.y\n )?.d ?? DEFAULT_DIRECTIONS;\n const sourceDirections = [...originalSourceDirections];\n const targetDirections = [...originalTargetDirections];\n\n if (sourceX < targetX) {\n pull(sourceDirections, \"left\");\n pull(targetDirections, \"right\");\n } else {\n pull(sourceDirections, \"right\");\n pull(targetDirections, \"left\");\n }\n\n if (sourceY < targetY) {\n pull(sourceDirections, \"top\");\n pull(targetDirections, \"bottom\");\n } else {\n pull(sourceDirections, \"bottom\");\n pull(targetDirections, \"top\");\n }\n\n const sourceDirection = sourceDirections[0] ?? originalSourceDirections[0];\n const targetDirection = targetDirections[0] ?? originalTargetDirections[0];\n\n const sourcePosition =\n sourceDirection === \"left\" || sourceDirection === \"right\"\n ? exitPosition.y\n : exitPosition.x;\n const targetPosition =\n targetDirection === \"left\" || targetDirection === \"right\"\n ? entryPosition.y\n : entryPosition.x;\n\n return getPolyLinePoints(\n nodeViewToNodeRect(sourceView, DEFAULT_NODE_PADDING_FOR_SMART_LINES),\n nodeViewToNodeRect(targetView, DEFAULT_NODE_PADDING_FOR_SMART_LINES),\n sourceDirection,\n targetDirection,\n sourcePosition,\n targetPosition\n );\n}\n\nexport function simplifyVertices(\n exitPoint: NodePosition,\n vertices: NodePosition[],\n entryPoint: NodePosition\n): NodePosition[] {\n // Simplify the vertices, ignore all vertices that its previous and next points are on the same axis\n // E.g, ignore two vertices of index 1 and index 3 for the following line.\n // 0---1---2\n // |\n // 3\n // |\n // 4\n const simplifiedVertices: NodePosition[] = [];\n let prev = exitPoint;\n let prevDirection: \"ns\" | \"ew\" | undefined;\n let index = 0;\n while (index < vertices.length) {\n const vertex = vertices[index];\n const isHorizontal = vertex.x !== prev.x;\n const isVertical = vertex.y !== prev.y;\n if (isHorizontal || isVertical) {\n const direction = isHorizontal ? \"ew\" : \"ns\";\n if (direction !== prevDirection) {\n const next =\n index === vertices.length - 1 ? entryPoint : vertices[index + 1];\n const isHorizontalNext = next.x !== vertex.x;\n const isVerticalNext = next.y !== vertex.y;\n if (isHorizontalNext || isVerticalNext) {\n const nextDirection = isHorizontalNext ? \"ew\" : \"ns\";\n if (direction !== nextDirection) {\n prevDirection = direction;\n simplifiedVertices.push(vertex);\n prev = vertex;\n }\n }\n }\n }\n index++;\n }\n\n return simplifiedVertices;\n}\n\nfunction getDefaultPosition(\n sourceView: NodeView,\n targetView: NodeView\n): NodePosition {\n if (targetView.y + targetView.height < sourceView.y) {\n return { x: 0.5, y: 1 };\n }\n if (targetView.y > sourceView.y + sourceView.height) {\n return { x: 0.5, y: 0 };\n }\n return targetView.x < sourceView.x ? { x: 1, y: 0.5 } : { x: 0, y: 0.5 };\n}\n\nfunction getAbsolutePosition(view: NodeView, position: NodePosition) {\n const halfPadding = DEFAULT_NODE_PADDING_FOR_SMART_LINES / 2;\n return {\n x:\n view.x -\n halfPadding +\n position.x * (view.width + DEFAULT_NODE_PADDING_FOR_SMART_LINES),\n y:\n view.y -\n halfPadding +\n position.y * (view.height + DEFAULT_NODE_PADDING_FOR_SMART_LINES),\n };\n}\n\nfunction getDefaultAbsolutePosition(\n sourceView: NodePosition,\n targetView: NodeView,\n flip?: boolean\n): NodePosition {\n let xAxis: \"x\" | \"y\";\n let yAxis: \"x\" | \"y\";\n let xSize: \"width\" | \"height\";\n let ySize: \"width\" | \"height\";\n if (flip) {\n xAxis = \"y\";\n yAxis = \"x\";\n xSize = \"height\";\n ySize = \"width\";\n } else {\n xAxis = \"x\";\n yAxis = \"y\";\n xSize = \"width\";\n ySize = \"height\";\n }\n let position: NodePosition | undefined;\n if (targetView[yAxis] + targetView[ySize] < sourceView[yAxis]) {\n position = { [xAxis]: 0.5, [yAxis]: 1 } as unknown as NodePosition;\n }\n if (targetView[yAxis] > sourceView[yAxis]) {\n position = { [xAxis]: 0.5, [yAxis]: 0 } as unknown as NodePosition;\n }\n if (position) {\n return getAbsolutePosition(targetView, position);\n }\n\n const xPosition = targetView[xAxis] < sourceView[xAxis] ? 1 : 0;\n\n return {\n [xAxis]:\n targetView[xAxis] -\n DEFAULT_NODE_PADDING_FOR_SMART_LINES / 2 +\n xPosition * (targetView[xSize] + DEFAULT_NODE_PADDING_FOR_SMART_LINES),\n [yAxis]: sourceView[yAxis],\n } as unknown as NodePosition;\n}\n\nfunction fitEndpointAndDirection(\n view: NodeView,\n oppositeView: NodeView,\n vertices: NodePosition[],\n prefer: BiDirection\n): { point: NodePosition; direction: BiDirection } {\n let point: NodePosition;\n let direction: BiDirection;\n\n let xAxis: \"x\" | \"y\";\n let yAxis: \"x\" | \"y\";\n let xSize: \"width\" | \"height\";\n let ySize: \"width\" | \"height\";\n let nsDirection: BiDirection;\n let ewDirection: BiDirection;\n if (prefer === \"ns\") {\n xAxis = \"x\";\n yAxis = \"y\";\n xSize = \"width\";\n ySize = \"height\";\n nsDirection = \"ns\";\n ewDirection = \"ew\";\n } else {\n xAxis = \"y\";\n yAxis = \"x\";\n xSize = \"height\";\n ySize = \"width\";\n nsDirection = \"ew\";\n ewDirection = \"ns\";\n }\n const vertex = vertices[0];\n\n if (\n vertex[xAxis] >= view[xAxis] &&\n vertex[xAxis] <= view[xAxis] + view[xSize]\n ) {\n if (vertex[yAxis] > view[yAxis] + view[ySize]) {\n point = {\n [xAxis]: vertex[xAxis],\n [yAxis]: view[yAxis] + view[ySize],\n } as unknown as NodePosition;\n direction = nsDirection;\n } else if (vertex[yAxis] < view[yAxis]) {\n point = {\n [xAxis]: vertex[xAxis],\n [yAxis]: view[yAxis],\n } as unknown as NodePosition;\n direction = nsDirection;\n } else {\n const nextVertex = vertices[1] ?? oppositeView;\n point = {\n [xAxis]: vertex[xAxis],\n [yAxis]:\n nextVertex[yAxis] < vertex[yAxis]\n ? vertex[yAxis]\n : view[yAxis] + view[ySize],\n } as unknown as NodePosition;\n direction = nsDirection;\n }\n } else {\n if (vertex[yAxis] < view[yAxis]) {\n point = {\n [xAxis]: view[xAxis] + view[xSize] / 2,\n [yAxis]: view[yAxis],\n } as unknown as NodePosition;\n direction = nsDirection;\n } else if (vertex[yAxis] > view[yAxis] + view[ySize]) {\n point = {\n [xAxis]: view[xAxis] + view[xSize] / 2,\n [yAxis]: view[yAxis] + view[ySize],\n } as unknown as NodePosition;\n direction = nsDirection;\n } else if (vertex[xAxis] < view[xAxis]) {\n point = {\n [xAxis]: view[xAxis],\n [yAxis]: vertex[yAxis],\n } as unknown as NodePosition;\n direction = ewDirection;\n } else {\n point = {\n [xAxis]: view[xAxis] + view[xSize],\n [yAxis]: vertex[yAxis],\n } as unknown as NodePosition;\n direction = ewDirection;\n }\n }\n return { point, direction: direction };\n}\n","// istanbul ignore file: experimental\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport classNames from \"classnames\";\nimport type { ComputedLineConnecterConf, LineSettings } from \"./interfaces\";\nimport type {\n LineMarkerConf,\n PositionTuple,\n TransformLiteral,\n} from \"../diagram/interfaces\";\nimport { curveLine } from \"../diagram/lines/curveLine\";\nimport { useHoverStateContext } from \"./HoverStateContext\";\nimport { getConnectLinePoints } from \"../shared/canvas/processors/getConnectLinePoints\";\nimport { getMarkers } from \"../shared/canvas/useLineMarkers\";\n\nexport interface SmartConnectLineComponentProps {\n transform: TransformLiteral;\n lineSettings?: LineSettings;\n options: ComputedLineConnecterConf;\n}\n\nexport function SmartConnectLineComponent({\n transform,\n lineSettings,\n options,\n}: SmartConnectLineComponentProps): JSX.Element {\n const [connectLineTo, setConnectLineTo] = useState<PositionTuple | null>(\n null\n );\n const { hoverState, smartConnectLineState, setSmartConnectLineState } =\n useHoverStateContext();\n\n useEffect(() => {\n if (!smartConnectLineState) {\n return;\n }\n function onMouseMove(e: MouseEvent) {\n // Set connect line to based on the mouse position and the transform\n setConnectLineTo([\n (e.clientX - transform.x - smartConnectLineState!.offset[0]) /\n transform.k,\n (e.clientY - transform.y - smartConnectLineState!.offset[1]) /\n transform.k,\n ]);\n }\n function onMouseUp(e: MouseEvent) {\n e.preventDefault();\n reset();\n }\n function reset() {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n setConnectLineTo(null);\n setSmartConnectLineState(null);\n }\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n\n return reset;\n }, [setSmartConnectLineState, smartConnectLineState, transform]);\n\n const line = useMemo(() => {\n const points = getConnectLinePoints(\n smartConnectLineState,\n connectLineTo,\n hoverState,\n lineSettings\n );\n return curveLine(\n points,\n lineSettings?.type === \"curve\" ? lineSettings.curveType : \"curveLinear\",\n 0,\n 1\n );\n }, [connectLineTo, hoverState, smartConnectLineState, lineSettings]);\n\n let markerStart: string | undefined;\n let markerEnd: string | undefined;\n const lineMarkers: LineMarkerConf[] = getMarkers(options);\n for (const marker of lineMarkers) {\n if (marker.placement === \"start\") {\n markerStart = options.$markerStartUrl;\n } else {\n markerEnd = options.$markerEndUrl;\n }\n }\n\n return (\n <path\n className={classNames(\"connect-line\", {\n connecting: !!(smartConnectLineState && connectLineTo),\n })}\n d={line}\n fill=\"none\"\n stroke={options.strokeColor}\n strokeWidth={options.strokeWidth}\n markerStart={markerStart}\n markerEnd={markerEnd}\n />\n );\n}\n","import type { NodePosition, PositionTuple } from \"../../../diagram/interfaces\";\nimport type { HoverState } from \"../../../draw-canvas/HoverStateContext\";\nimport type {\n LineSettings,\n SmartConnectLineState,\n} from \"../../../draw-canvas/interfaces\";\nimport { getSmartLinePoints } from \"./getSmartLinePoints\";\n\nexport function getConnectLinePoints(\n smartConnectLineState: SmartConnectLineState | null,\n connectLineTo: PositionTuple | null,\n hoverState: HoverState | null,\n lineSettings?: LineSettings\n): NodePosition[] | null {\n if (\n !smartConnectLineState ||\n !(connectLineTo || hoverState?.activePointIndex !== undefined)\n ) {\n return null;\n }\n\n const sourceView = smartConnectLineState.source.view;\n if (hoverState?.activePointIndex !== undefined) {\n return getSmartLinePoints(sourceView, hoverState.cell.view, {\n ...lineSettings,\n exitPosition: smartConnectLineState.exitPosition,\n entryPosition: hoverState.relativePoints[hoverState.activePointIndex],\n });\n }\n\n const [x1, y1] = connectLineTo!;\n\n return getSmartLinePoints(\n sourceView,\n { x: x1, y: y1, width: 0, height: 0 },\n {\n ...lineSettings,\n exitPosition: smartConnectLineState.exitPosition,\n }\n );\n}\n","import type { AlignOrigin, NormalizedAlignOrigin } from \"../interfaces\";\n\nconst KeywordMap = new Map([\n [\"center\", 0.5],\n [\"left\", 0],\n [\"right\", 1],\n [\"top\", 0],\n [\"bottom\", 1],\n]);\n\nexport function normalizeAlignOrigin(\n alignOrigin: AlignOrigin | undefined\n): NormalizedAlignOrigin {\n const origin = alignOrigin ?? [0.5, 0.5];\n return [\n normalizeAlignAxis(origin[0], \"x\"),\n normalizeAlignAxis(origin[1], \"y\"),\n ];\n}\n\nfunction normalizeAlignAxis(value: string | number, axis: \"x\" | \"y\"): number {\n if (typeof value === \"string\") {\n const newX = KeywordMap.get(value);\n if (newX !== undefined) {\n return newX;\n }\n const matches = value.match(/^(-?\\d+(?:\\.\\d+)?)%$/);\n if (matches) {\n return Number(matches[1]) / 100;\n }\n // eslint-disable-next-line no-console\n console.error(\"Unexpected align origin %s:\", axis, value);\n } else if (typeof value === \"number\") {\n return value;\n } else {\n // eslint-disable-next-line no-console\n console.error(\n \"Unexpected align origin %s, expected %s, received %s:\",\n axis,\n \"string | number\",\n typeof value,\n value\n );\n }\n\n return 0.5;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { ZoomBehavior } from \"d3-zoom\";\nimport type {\n Cell,\n LayoutOptions,\n LayoutOptionsForce,\n LayoutOptionsDagre,\n LayoutType,\n NodeId,\n NodeView,\n AutoSize,\n} from \"../../draw-canvas/interfaces\";\nimport type { FullRectTuple, RangeTuple } from \"../../diagram/interfaces\";\nimport { useAutoCenter } from \"./useAutoCenter\";\nimport {\n isNodeCell,\n isNodeOrAreaDecoratorCell,\n isNodeOrEdgeCell,\n} from \"../../draw-canvas/processors/asserts\";\nimport {\n SYMBOL_FOR_LAYOUT_INITIALIZED,\n SYMBOL_FOR_SIZE_INITIALIZED,\n} from \"../../draw-canvas/constants\";\nimport type { DrawCanvasAction } from \"../../draw-canvas/reducers/interfaces\";\nimport { forceLayout } from \"./forceLayout\";\nimport { dagreLayout } from \"./dagreLayout\";\nimport { normalizeAlignOrigin } from \"../../draw-canvas/processors/normalizeAlignOrigin\";\n\nexport interface UseLayoutOptions {\n layout: LayoutType;\n layoutOptions?: LayoutOptions;\n autoSize?: AutoSize;\n rootRef: React.RefObject<SVGSVGElement>;\n cells: Cell[];\n zoomable?: boolean;\n zoomer: ZoomBehavior<SVGSVGElement, unknown>;\n scaleRange: RangeTuple;\n layoutKey: number;\n allowEdgeToArea?: boolean;\n autoCenterWhenCellsChange?: boolean;\n dispatch: (value: DrawCanvasAction) => void;\n}\n\nexport function useLayout({\n layout,\n layoutOptions,\n autoSize,\n rootRef,\n cells,\n zoomable,\n zoomer,\n scaleRange,\n layoutKey,\n allowEdgeToArea,\n autoCenterWhenCellsChange,\n dispatch,\n}: UseLayoutOptions) {\n const [layoutInitialized, setLayoutInitialized] = useState(\n layout !== \"force\" && layout !== \"dagre\"\n );\n\n const layoutKeyRef = useRef(layoutKey);\n\n const getNextLayoutKey = useCallback(() => {\n return ++layoutKeyRef.current;\n }, []);\n\n const [centered, setCentered] = useAutoCenter({\n rootRef,\n layoutInitialized,\n cells,\n zoomable,\n zoomer,\n scaleRange,\n autoCenterWhenCellsChange,\n autoSize,\n padding: layoutOptions?.padding,\n });\n\n const previousLayoutRef = useRef<Cell[] | null>(null);\n\n useEffect(() => {\n // Wait for all nodes to be size-initialized before layout.\n if (\n cells.some(\n (cell) => isNodeCell(cell) && !cell[SYMBOL_FOR_SIZE_INITIALIZED]\n ) ||\n // Skip layout if no cells.\n cells.length === 0\n ) {\n return;\n }\n\n if (layout !== \"force\" && layout !== \"dagre\") {\n setLayoutInitialized(true);\n return;\n }\n\n // DO NOT re-layout if layout key mismatched.\n // DO NOT re-layout if nodes and edges not changed.\n if (\n layoutKeyRef.current !== layoutKey ||\n isSameArray(previousLayoutRef.current, cells.filter(isNodeOrEdgeCell))\n ) {\n // Layout key mismatch happens when this effect is performed after\n // update-node-size dispatched but not yet applied.\n // If didn't ignore mismatched layout, it will cause the update-cells\n // action overwrites those update-node-size actions.\n return;\n }\n\n let getNodeView: (id: NodeId) => NodeView;\n let nodePaddings: FullRectTuple;\n\n if (layout === \"force\") {\n ({ getNodeView, nodePaddings } = forceLayout({\n cells,\n layoutOptions: layoutOptions as LayoutOptionsForce,\n allowEdgeToArea,\n }));\n } else {\n ({ getNodeView, nodePaddings } = dagreLayout({\n cells,\n layoutOptions: layoutOptions as LayoutOptionsDagre,\n allowEdgeToArea,\n }));\n }\n\n const alignOrigin = normalizeAlignOrigin(\n (layoutOptions as LayoutOptionsForce | LayoutOptionsDagre)?.alignOrigin\n );\n\n const newCells: Cell[] = cells.map((cell) => {\n if (\n (allowEdgeToArea && isNodeOrAreaDecoratorCell(cell)) ||\n isNodeCell(cell)\n ) {\n const nodeView = getNodeView(cell.id);\n return {\n ...cell,\n view: {\n ...cell.view,\n x: nodeView.x! - nodeView.width * alignOrigin[0] + nodePaddings[3],\n y: nodeView.y! - nodeView.height * alignOrigin[1] + nodePaddings[0],\n },\n [SYMBOL_FOR_LAYOUT_INITIALIZED]: true,\n };\n }\n return cell;\n });\n previousLayoutRef.current = newCells.filter(isNodeOrEdgeCell);\n\n dispatch({ type: \"update-cells\", payload: newCells });\n // setCentered(false);\n setLayoutInitialized(true);\n }, [\n cells,\n dispatch,\n layout,\n layoutKey,\n layoutOptions,\n allowEdgeToArea /* , setCentered */,\n ]);\n\n return { centered, setCentered, getNextLayoutKey };\n}\n\nfunction isSameArray<T = unknown>(a: T[] | null, b: T[]): boolean {\n return a?.length === b.length && a.every((v, i) => v === b[i]);\n}\n","import React, { useEffect, useState } from \"react\";\nimport { select } from \"d3-selection\";\nimport { ZoomTransform, type ZoomBehavior } from \"d3-zoom\";\nimport type { PartialRectTuple, RangeTuple } from \"../../diagram/interfaces\";\nimport {\n DEFAULT_CANVAS_PADDING,\n SYMBOL_FOR_SIZE_INITIALIZED,\n} from \"../../draw-canvas/constants\";\nimport type { AutoSize, Cell } from \"../../draw-canvas/interfaces\";\nimport {\n isDecoratorCell,\n isNodeCell,\n} from \"../../draw-canvas/processors/asserts\";\nimport { getCellsRect } from \"./processors/getCellsRect\";\nimport { extractPartialRectTuple } from \"../../diagram/processors/extractPartialRectTuple\";\nimport { getTransformToCenter } from \"./processors/getTransformToCenter\";\n\nexport interface UseAutoCenterOptions {\n rootRef: React.RefObject<SVGSVGElement>;\n cells: Cell[];\n layoutInitialized: boolean;\n zoomable?: boolean;\n zoomer: ZoomBehavior<SVGSVGElement, unknown>;\n scaleRange: RangeTuple;\n autoCenterWhenCellsChange?: boolean;\n autoSize?: AutoSize;\n padding?: PartialRectTuple;\n}\n\nexport type UseAutoCenterResult = [\n centered: boolean,\n setCentered: React.Dispatch<React.SetStateAction<boolean>>,\n];\n\nexport function useAutoCenter({\n rootRef,\n cells,\n layoutInitialized,\n zoomable,\n zoomer,\n scaleRange,\n autoCenterWhenCellsChange,\n autoSize,\n padding,\n}: UseAutoCenterOptions): UseAutoCenterResult {\n const [centered, setCentered] = useState(false);\n\n useEffect(() => {\n // Reset auto centering when nodes and decorators are all removed,\n // or when cells change and autoCenterWhenCellsChange is enabled.\n if (\n !cells.some((cell) => isNodeCell(cell) || isDecoratorCell(cell)) ||\n autoCenterWhenCellsChange\n ) {\n setCentered(false);\n }\n }, [cells, autoCenterWhenCellsChange]);\n\n useEffect(() => {\n const root = rootRef.current;\n if (\n !root ||\n !layoutInitialized ||\n centered ||\n !cells.some((cell) => isNodeCell(cell) || isDecoratorCell(cell)) ||\n cells.some(\n (cell) => isNodeCell(cell) && !cell[SYMBOL_FOR_SIZE_INITIALIZED]\n )\n ) {\n return;\n }\n\n const rect = getCellsRect(cells);\n let width = root.clientWidth;\n let height = root.clientHeight;\n const fitWidth = !!autoSize?.width;\n const fitHeight = !!autoSize?.height;\n const fullPadding = extractPartialRectTuple(\n padding ?? DEFAULT_CANVAS_PADDING\n );\n\n // Todo: handle ratio\n if (fitWidth) {\n width = Math.min(\n Math.max(\n rect.width + fullPadding![1] + fullPadding![3],\n autoSize.minWidth ?? 0\n ),\n autoSize.maxWidth ?? Infinity\n );\n root.style.minWidth = `${width}px`;\n }\n if (fitHeight) {\n height = Math.min(\n Math.max(\n rect.height + fullPadding![0] + fullPadding![2],\n autoSize.minHeight ?? 0\n ),\n autoSize.maxHeight ?? Infinity\n );\n root.style.minHeight = `${height}px`;\n }\n\n const { k, x, y } = getTransformToCenter(rect, {\n canvasWidth: width,\n canvasHeight: height,\n canvasPadding: fullPadding,\n scaleRange: zoomable ? scaleRange : undefined,\n });\n // istanbul ignore next\n if (process.env.NODE_ENV !== \"test\") {\n // jsdom doesn't support svg baseVal yet.\n // https://github.com/jsdom/jsdom/issues/2531\n zoomer.transform(select(root), new ZoomTransform(k, x, y));\n }\n setCentered(true);\n }, [\n cells,\n centered,\n layoutInitialized,\n rootRef,\n scaleRange,\n zoomable,\n zoomer,\n autoSize,\n padding,\n ]);\n\n return [centered, setCentered];\n}\n","import type {\n FullRectTuple,\n TransformLiteral,\n} from \"../../../diagram/interfaces\";\nimport type { CellsRect } from \"../../../draw-canvas/interfaces\";\n\nexport interface TransformToCenterOptions {\n canvasWidth: number;\n canvasHeight: number;\n canvasPadding?: FullRectTuple | null;\n scaleRange?: [min: number, max: number];\n}\n\nexport function getTransformToCenter(\n rect: CellsRect,\n {\n canvasWidth,\n canvasHeight,\n canvasPadding,\n scaleRange,\n }: TransformToCenterOptions\n): TransformLiteral {\n const { left, top, width, height, empty } = rect;\n\n // Apply padding to available canvas dimensions\n const [paddingTop, paddingRight, paddingBottom, paddingLeft] =\n canvasPadding ?? [0, 0, 0, 0];\n const availableWidth = canvasWidth - paddingLeft - paddingRight;\n const availableHeight = canvasHeight - paddingTop - paddingBottom;\n\n const scale =\n scaleRange && !empty && (width > availableWidth || height > availableHeight)\n ? Math.max(\n Math.min(\n availableWidth / width,\n availableHeight / height,\n scaleRange[1]\n ),\n scaleRange[0]\n )\n : 1;\n\n // Adjust center calculation to account for padding\n const x = empty\n ? 0\n : (availableWidth - width * scale) / 2 + paddingLeft - left * scale;\n const y = empty\n ? 0\n : (availableHeight - height * scale) / 2 + paddingTop - top * scale;\n\n return { x, y, k: scale };\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport type { ActiveTarget } from \"../../draw-canvas/interfaces\";\nimport { sameTarget } from \"../../draw-canvas/processors/sameTarget\";\n\nexport interface UseActiveTargetOptions {\n rootRef: React.RefObject<SVGGElement>;\n activeTarget?: ActiveTarget | null;\n doNotResetActiveTargetForSelector?: string;\n doNotResetActiveTargetOutsideCanvas?: boolean;\n onActiveTargetChange(target: ActiveTarget | null): void;\n}\n\nexport type UseActiveTargetResult = ActiveTarget | null;\n\nexport function useActiveTarget({\n rootRef,\n activeTarget: _activeTarget,\n doNotResetActiveTargetForSelector,\n doNotResetActiveTargetOutsideCanvas,\n onActiveTargetChange,\n}: UseActiveTargetOptions): UseActiveTargetResult {\n const newActiveTarget = _activeTarget ?? null;\n const [activeTarget, setActiveTarget] = useState<ActiveTarget | null>(\n newActiveTarget\n );\n\n useEffect(() => {\n setActiveTarget((previous) =>\n sameTarget(previous, newActiveTarget) ? previous : newActiveTarget\n );\n }, [newActiveTarget]);\n\n const activeTargetChangeInitialized = useRef(false);\n useEffect(() => {\n if (!activeTargetChangeInitialized.current) {\n activeTargetChangeInitialized.current = true;\n return;\n }\n onActiveTargetChange(activeTarget);\n }, [activeTarget, onActiveTargetChange]);\n\n useEffect(() => {\n if (!activeTarget) {\n return;\n }\n const resetActiveTarget = (e: MouseEvent) => {\n const path = e.composedPath();\n const rootIndex = path.indexOf(rootRef.current!);\n // Reset active target to null when clicking outside of the cells container,\n // Or inside the cells container but not on any cell.\n if (\n doNotResetActiveTargetOutsideCanvas\n ? rootIndex === 0\n : rootIndex <= 0 &&\n !(\n doNotResetActiveTargetForSelector &&\n path.some(\n (el) =>\n el instanceof Element &&\n el.matches(doNotResetActiveTargetForSelector)\n )\n )\n ) {\n setActiveTarget(null);\n }\n };\n document.addEventListener(\"click\", resetActiveTarget);\n return () => {\n document.removeEventListener(\"click\", resetActiveTarget);\n };\n }, [\n activeTarget,\n doNotResetActiveTargetOutsideCanvas,\n doNotResetActiveTargetForSelector,\n rootRef,\n ]);\n\n return activeTarget;\n}\n","import { pick } from \"lodash\";\nimport type { NodePosition, PositionTuple } from \"../../../diagram/interfaces\";\nimport type { HoverState } from \"../../../draw-canvas/HoverStateContext\";\nimport type {\n LineEditorState,\n LineEditorStateOfControl,\n EditableLine,\n EditableLineCell,\n EditableLineView,\n DecoratorLineView,\n NodeView,\n} from \"../../../draw-canvas/interfaces\";\nimport { getSmartLinePoints, simplifyVertices } from \"./getSmartLinePoints\";\nimport { isEditableEdgeLine } from \"../../../draw-canvas/processors/asserts\";\n\nexport function getEditingLinePoints(\n activeEditableLine: EditableLineCell | null,\n lineEditorState: LineEditorState | null,\n editableLineMap: WeakMap<EditableLineCell, EditableLine>,\n connectLineTo: PositionTuple | null,\n hoverState: HoverState | null\n): NodePosition[] | null {\n if (\n !activeEditableLine ||\n !lineEditorState ||\n !(\n connectLineTo ||\n (lineEditorState.type !== \"control\" &&\n hoverState?.activePointIndex !== undefined)\n )\n ) {\n return null;\n }\n\n const editableLine = editableLineMap.get(activeEditableLine);\n if (!editableLine) {\n return null;\n }\n\n const { type } = lineEditorState;\n let sourceView: NodeView;\n let targetView: NodeView;\n\n const cellType = activeEditableLine.type;\n if (isEditableEdgeLine(editableLine)) {\n sourceView = editableLine.source.view;\n targetView = editableLine.target.view;\n } else {\n const view = editableLine.decorator.view as DecoratorLineView;\n sourceView = { ...view.source, width: 0, height: 0 };\n targetView = { ...view.target, width: 0, height: 0 };\n }\n const view = activeEditableLine.view as EditableLineView;\n const { exitPosition, entryPosition, vertices } = view ?? {};\n const lineSettings = pick(view, [\"type\", \"curveType\"]);\n\n if (type === \"control\") {\n const newVertices = getNewLineVertices(\n activeEditableLine,\n lineEditorState,\n editableLineMap,\n connectLineTo!\n );\n\n return getSmartLinePoints(\n sourceView,\n targetView,\n {\n ...lineSettings,\n exitPosition,\n entryPosition,\n vertices: newVertices,\n },\n 0,\n cellType\n );\n }\n\n if (type === \"corner\") {\n const newVertices = [...vertices!];\n newVertices.splice(lineEditorState.control.index, 1, {\n x: connectLineTo![0],\n y: connectLineTo![1],\n });\n\n return getSmartLinePoints(\n sourceView,\n targetView,\n {\n ...lineSettings,\n exitPosition,\n entryPosition,\n vertices: newVertices,\n },\n 0,\n cellType\n );\n }\n\n if (type === \"break\") {\n const newVertices = [...(vertices ?? [])];\n newVertices.splice(lineEditorState.control.index, 0, {\n x: connectLineTo![0],\n y: connectLineTo![1],\n });\n\n return getSmartLinePoints(\n sourceView,\n targetView,\n {\n ...lineSettings,\n exitPosition,\n entryPosition,\n vertices: newVertices,\n },\n 0,\n cellType\n );\n }\n\n if (cellType === \"edge\" && hoverState?.activePointIndex !== undefined) {\n const position = hoverState.relativePoints[hoverState.activePointIndex];\n // Assert `hoverState.cell` is `target`\n return getSmartLinePoints(\n sourceView,\n targetView,\n {\n ...lineSettings,\n ...(type === \"entry\"\n ? {\n exitPosition,\n entryPosition: position,\n }\n : {\n exitPosition: position,\n entryPosition,\n }),\n vertices,\n },\n 0,\n cellType\n );\n }\n\n const [x1, y1] = connectLineTo!;\n\n if (type === \"entry\") {\n return getSmartLinePoints(\n sourceView,\n { x: x1, y: y1, width: 0, height: 0 },\n { ...lineSettings, exitPosition, vertices },\n 0,\n cellType\n );\n }\n\n return getSmartLinePoints(\n { x: x1, y: y1, width: 0, height: 0 },\n targetView,\n { ...lineSettings, entryPosition, vertices },\n 0,\n cellType\n );\n}\n\nexport function getNewLineVertices(\n activeEditableLine: EditableLineCell,\n lineEditorState: LineEditorStateOfControl,\n editableLineMap: WeakMap<EditableLineCell, EditableLine>,\n connectLineTo: PositionTuple\n) {\n const { control } = lineEditorState;\n const { points: linePoints } = editableLineMap.get(activeEditableLine)!;\n const newVertices: NodePosition[] = [];\n const [x1, y1] = connectLineTo!;\n const exitPoint = linePoints[0];\n const entryPoint = linePoints[linePoints.length - 1];\n\n // If moving the first control, prepend a vertex to connect the control to the source\n if (control.index === 0) {\n newVertices.push(\n control.direction === \"ns\"\n ? { x: exitPoint.x, y: y1 }\n : { x: x1, y: exitPoint.y }\n );\n }\n\n // Adjust the related two controls, and leave other controls unchanged\n for (let i = 1; i < linePoints.length - 1; i++) {\n const vertex = linePoints[i];\n newVertices.push(\n i === control.index || i === control.index + 1\n ? control.direction === \"ns\"\n ? { x: vertex.x, y: y1 }\n : { x: x1, y: vertex.y }\n : vertex\n );\n }\n\n // If moving the last control, append a vertex to connect the control to the target\n if (control.index === linePoints.length - 2) {\n newVertices.push(\n control.direction === \"ns\"\n ? { x: entryPoint.x, y: y1 }\n : { x: x1, y: entryPoint.y }\n );\n }\n\n return simplifyVertices(exitPoint, newVertices, entryPoint);\n}\n","// istanbul ignore file: experimental\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport classNames from \"classnames\";\nimport type {\n Cell,\n ComputedLineConnecterConf,\n EditableEdgeLine,\n EditableLine,\n EditableLineCell,\n EditableLineView,\n LineEditorState,\n LineEditorStateOfControl,\n} from \"./interfaces\";\nimport type {\n LineMarkerConf,\n NodePosition,\n PositionTuple,\n TransformLiteral,\n} from \"../diagram/interfaces\";\nimport { curveLine } from \"../diagram/lines/curveLine\";\nimport { useHoverStateContext } from \"./HoverStateContext\";\nimport {\n getEditingLinePoints,\n getNewLineVertices,\n} from \"../shared/canvas/processors/getEditingLinePoints\";\nimport { getMarkers } from \"../shared/canvas/useLineMarkers\";\nimport { isEdgeCell, isLineDecoratorCell } from \"./processors/asserts\";\n\nconst LOOSE_CONTROL_TYPES = [\n \"control\",\n \"corner\",\n \"break\",\n] as LineEditorState[\"type\"][];\n\nexport interface EditingLineComponentProps {\n cells: Cell[];\n editableLineMap: WeakMap<EditableLineCell, EditableLine>;\n transform: TransformLiteral;\n options: ComputedLineConnecterConf;\n activeEditableLine: EditableLineCell | null;\n}\n\nexport function EditingLineComponent({\n cells,\n editableLineMap,\n transform,\n options,\n activeEditableLine,\n}: EditingLineComponentProps): JSX.Element {\n const [connectLineTo, setConnectLineTo] = useState<PositionTuple | null>(\n null\n );\n const {\n hoverState,\n lineEditorState,\n setLineEditorState,\n onChangeEdgeView,\n onChangeDecoratorView,\n } = useHoverStateContext();\n const movedRef = useRef(false);\n\n useEffect(() => {\n if (!lineEditorState) {\n setTimeout(() => {\n movedRef.current = false;\n }, 0);\n }\n }, [lineEditorState]);\n\n useEffect(() => {\n if (!activeEditableLine || !lineEditorState) {\n return;\n }\n movedRef.current = false;\n const { type, offset, from } = lineEditorState;\n // Set connect line to based on the mouse position and the transform\n const getConnectTo = (e: MouseEvent): PositionTuple => {\n const position: NodePosition = {\n x: (e.clientX - transform.x - offset[0]) / transform.k,\n y: (e.clientY - transform.y - offset[1]) / transform.k,\n };\n const linePoints = editableLineMap.get(activeEditableLine)!.points;\n const snapDistance = 5;\n const diff: NodePosition = { x: Infinity, y: Infinity };\n let otherPoints: NodePosition[];\n let axises: (\"x\" | \"y\")[];\n\n const getFinalPosition = (): PositionTuple => {\n if (!movedRef.current) {\n const movementX = (e.clientX - from[0]) / transform.k;\n const movementY = (e.clientY - from[1]) / transform.k;\n movedRef.current = movementX ** 2 + movementY ** 2 >= 9;\n }\n\n return [position.x, position.y];\n };\n\n if (LOOSE_CONTROL_TYPES.includes(type) && !e.altKey) {\n // Snap to other points\n const control = (lineEditorState as LineEditorStateOfControl).control;\n axises =\n type === \"control\"\n ? [control.direction === \"ns\" ? \"y\" : \"x\"]\n : [\"x\", \"y\"];\n otherPoints = linePoints.filter(\n (_, i) =>\n i === 0 ||\n i === linePoints.length - 1 ||\n (type === \"control\"\n ? i !== control.index && i !== control.index + 1\n : type !== \"corner\" || i !== control.index + 1)\n );\n } else if (\n isLineDecoratorCell(activeEditableLine) &&\n (type === \"exit\" || type === \"entry\") &&\n !e.altKey\n ) {\n const endpoint =\n type === \"exit\" ? linePoints[0] : linePoints[linePoints.length - 1];\n otherPoints = linePoints.filter((p) => p !== endpoint);\n axises = [\"x\", \"y\"];\n } else {\n return getFinalPosition();\n }\n\n // Snap to control points of other lines\n for (const cell of cells) {\n if (\n !(isEdgeCell(cell) || isLineDecoratorCell(cell)) ||\n cell === activeEditableLine\n ) {\n continue;\n }\n const editableLine = editableLineMap.get(cell);\n if (editableLine) {\n otherPoints.push(...editableLine.points.slice(1, -1));\n }\n }\n\n for (const point of otherPoints) {\n for (const axis of axises) {\n const newDiff = Math.abs(point[axis] - position[axis]);\n if (newDiff <= snapDistance && newDiff < diff[axis]) {\n position[axis] = point[axis];\n diff[axis] = newDiff;\n }\n }\n }\n\n return getFinalPosition();\n };\n const onMouseMove = (e: MouseEvent) => {\n const newConnectTo = getConnectTo(e);\n if (movedRef.current) {\n setConnectLineTo(newConnectTo);\n }\n };\n function onMouseUp(e: MouseEvent) {\n e.preventDefault();\n reset();\n\n if (!movedRef.current) {\n return;\n }\n\n const newConnectTo = getConnectTo(e);\n const isEdge = isEdgeCell(activeEditableLine!);\n\n if (lineEditorState?.type === \"control\") {\n if (isEdge) {\n const editableLine = editableLineMap.get(\n activeEditableLine!\n ) as EditableEdgeLine;\n const { source, target } = editableLine;\n onChangeEdgeView?.(source, target, {\n ...activeEditableLine!.view,\n vertices: getNewLineVertices(\n activeEditableLine!,\n lineEditorState,\n editableLineMap,\n newConnectTo\n ),\n });\n } else {\n onChangeDecoratorView?.(activeEditableLine!, {\n ...activeEditableLine!.view,\n vertices: getNewLineVertices(\n activeEditableLine!,\n lineEditorState,\n editableLineMap,\n newConnectTo\n ),\n });\n }\n return;\n }\n\n if (isEdge) {\n return;\n }\n\n switch (lineEditorState?.type) {\n case \"entry\":\n case \"exit\":\n onChangeDecoratorView?.(activeEditableLine!, {\n ...activeEditableLine!.view,\n [lineEditorState.type === \"entry\" ? \"target\" : \"source\"]: {\n x: newConnectTo[0],\n y: newConnectTo[1],\n },\n });\n break;\n case \"corner\":\n onChangeDecoratorView?.(activeEditableLine!, {\n ...activeEditableLine!.view,\n vertices: activeEditableLine!.view.vertices!.map((point, i) =>\n i === lineEditorState.control.index\n ? { x: newConnectTo[0], y: newConnectTo[1] }\n : point\n ),\n });\n break;\n case \"break\": {\n const newVertices = [...(activeEditableLine!.view.vertices ?? [])];\n newVertices.splice(lineEditorState.control.index, 0, {\n x: newConnectTo[0],\n y: newConnectTo[1],\n });\n onChangeDecoratorView?.(activeEditableLine!, {\n ...activeEditableLine!.view,\n vertices: newVertices,\n });\n break;\n }\n }\n }\n function reset() {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n setConnectLineTo(null);\n setLineEditorState(null);\n }\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n\n return reset;\n }, [\n activeEditableLine,\n editableLineMap,\n lineEditorState,\n transform,\n setLineEditorState,\n onChangeEdgeView,\n cells,\n onChangeDecoratorView,\n ]);\n\n useEffect(() => {\n if (!activeEditableLine) {\n return;\n }\n const handleBodyClick = (e: MouseEvent) => {\n if (movedRef.current) {\n e.stopPropagation();\n e.preventDefault();\n }\n };\n document.body.addEventListener(\"click\", handleBodyClick);\n return () => {\n document.body.removeEventListener(\"click\", handleBodyClick);\n };\n }, [activeEditableLine]);\n\n const line = useMemo(() => {\n const points = getEditingLinePoints(\n activeEditableLine,\n lineEditorState,\n editableLineMap,\n connectLineTo,\n hoverState\n );\n const view = activeEditableLine?.view as EditableLineView | undefined;\n return curveLine(\n points,\n view?.type === \"curve\" ? view.curveType : \"curveLinear\",\n 0,\n 1\n );\n }, [\n connectLineTo,\n hoverState,\n activeEditableLine,\n lineEditorState,\n editableLineMap,\n ]);\n let markerStart: string | undefined;\n let markerEnd: string | undefined;\n const lineMarkers: LineMarkerConf[] = getMarkers(options);\n for (const marker of lineMarkers) {\n if (marker.placement === \"start\") {\n markerStart = options.$editingStartMarkerUrl;\n } else {\n markerEnd = options.$editingEndMarkerUrl;\n }\n }\n\n return (\n <path\n className={classNames(\"editing-line\", {\n editing: !!(lineEditorState && connectLineTo),\n })}\n d={line}\n fill=\"none\"\n stroke={options.editingStrokeColor}\n markerStart={markerStart}\n markerEnd={markerEnd}\n />\n );\n}\n","import { Cell, DecoratorCell, NodeCell } from \"../interfaces\";\nimport { MoveCellPayload } from \"../reducers/interfaces\";\nimport { isContainerDecoratorCell, isNodeCell } from \"./asserts\";\n\nexport function handleNodeContainedChange(\n payloads: MoveCellPayload[],\n cells: Cell[],\n onContainerContainerChange?: (detail: MoveCellPayload[]) => void\n) {\n const nodeCells = cells.filter((c): c is NodeCell => isNodeCell(c));\n const containerIds = payloads\n .filter((p) => isContainerDecoratorCell(p))\n .map((v) => v.id);\n const nodePayloads = payloads.filter((p) => {\n const nodeCell = nodeCells.find((v) => v.id === p.id)!;\n const includeNodeFlag =\n nodeCell?.containerId && containerIds.includes(nodeCell.containerId);\n return isNodeCell(p) && !includeNodeFlag;\n });\n nodePayloads.forEach((payload) => {\n const left = payload.x;\n const right = payload.x + payload.width!;\n const top = payload.y;\n const bottom = payload.y + payload!.height!;\n const containerDecoratorCells = cells.filter(\n (cell): cell is DecoratorCell =>\n isContainerDecoratorCell(cell) && !cell.view?.locked\n );\n for (const containerCell of containerDecoratorCells) {\n const containerLeft = containerCell.view.x;\n const containerRight = containerCell.view.x + containerCell.view.width;\n const containerTop = containerCell.view.y;\n const containerBottom = containerCell.view.y + containerCell.view.height;\n if (\n left >= containerLeft &&\n right <= containerRight &&\n top >= containerTop &&\n bottom <= containerBottom\n ) {\n payload.containerCell = containerCell;\n break; //A node can be associated with only one container\n }\n }\n });\n let containedChanges = [];\n containedChanges = nodePayloads.filter((payload) => {\n const nodeCell = nodeCells.find((c) => c.id === payload.id);\n const containerId = nodeCell?.containerId;\n const containerCellId = payload.containerCell?.id;\n //过滤掉一直没有combo关系或者combo关系没有改变的\n return containerId !== containerCellId;\n });\n if (containedChanges.length > 0) {\n onContainerContainerChange?.(containedChanges);\n }\n return containedChanges;\n}\n","// istanbul ignore file: experimental\nimport React, { useEffect, useMemo, useRef } from \"react\";\nimport type { NodePosition } from \"../diagram/interfaces\";\nimport { useHoverStateContext } from \"./HoverStateContext\";\nimport type {\n ControlPoint,\n EditableLine,\n EditableLineCell,\n EditableLineView,\n} from \"./interfaces\";\nimport { isLineDecoratorCell, isStraightType } from \"./processors/asserts\";\n\nconst POINT_HELPER_IMAGE =\n \"data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIyMnB4IiBoZWlnaHQ9IjIycHgiIHZlcnNpb249IjEuMSI+PGNpcmNsZSBjeD0iMTEiIGN5PSIxMSIgcj0iNyIgc3Ryb2tlPSIjZmZmIiBmaWxsPSIjMjliNmYyIi8+PGNpcmNsZSBjeD0iMTEiIGN5PSIxMSIgcj0iMyIgc3Ryb2tlPSIjZmZmIiBmaWxsPSJ0cmFuc3BhcmVudCIvPjwvc3ZnPg==\";\nconst END_POINT_HELPER_IMAGE =\n \"data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZlcnNpb249IjEuMSIgc3R5bGU9ImNvbG9yLXNjaGVtZTogbGlnaHQgZGFyazsiPjxjaXJjbGUgY3g9IjkiIGN5PSI5IiByPSI2IiBzdHJva2U9IiNmZmYiIGZpbGw9IiMyOWI2ZjIiLz48L3N2Zz4=\";\nconst ANCHORED_POINT_HELPER_IMAGE =\n \"data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIyMnB4IiBoZWlnaHQ9IjIycHgiIHZlcnNpb249IjEuMSI+PGNpcmNsZSBjeD0iMTEiIGN5PSIxMSIgcj0iNyIgc3Ryb2tlPSIjZmZmIiBmaWxsPSIjMDFiZDIyIi8+PHBhdGggZD0ibSA4IDggTCAxNCAxNE0gOCAxNCBMIDE0IDgiIHN0cm9rZT0iI2ZmZiIvPjwvc3ZnPg==\";\nconst VERTEX_HELPER_IMAGE =\n \"data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZlcnNpb249IjEuMSI+PGNpcmNsZSBjeD0iOSIgY3k9IjkiIHI9IjUiIHN0cm9rZT0iI2ZmZiIgZmlsbD0iIzI5YjZmMiIvPjwvc3ZnPg==\";\nconst POINT_HELPER_BG_SIZE = 22;\n\nexport interface LineEditorComponentProps {\n scale: number;\n editableLineMap: WeakMap<EditableLineCell, EditableLine>;\n activeEditableLine: EditableLineCell;\n updateCurActiveEditableLine?: (\n activeEditableLine: EditableLineCell | null\n ) => void;\n}\n\nexport function LineEditorComponent({\n scale,\n editableLineMap,\n activeEditableLine,\n updateCurActiveEditableLine,\n}: LineEditorComponentProps): JSX.Element | null {\n const { rootRef, movingCells, lineEditorState, setLineEditorState } =\n useHoverStateContext();\n const exitRef = useRef<SVGImageElement>(null);\n const entryRef = useRef<SVGImageElement>(null);\n const controlPointsRef = useRef<(SVGImageElement | null)[]>([]);\n const isLineDecorator = isLineDecoratorCell(activeEditableLine);\n\n useEffect(() => {\n const exit = exitRef.current;\n const entry = entryRef.current;\n if (!exit || !entry || !activeEditableLine) {\n return;\n }\n const handleMouseDownFactory = (type: \"exit\" | \"entry\") => {\n return (e: MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n const rect = rootRef.current!.getBoundingClientRect();\n setLineEditorState({\n offset: [rect.left, rect.top],\n from: [e.clientX, e.clientY],\n type,\n });\n updateCurActiveEditableLine?.(activeEditableLine);\n };\n };\n const handleStartMouseDown = handleMouseDownFactory(\"exit\");\n const handleEndMouseDown = handleMouseDownFactory(\"entry\");\n exit.addEventListener(\"mousedown\", handleStartMouseDown);\n entry.addEventListener(\"mousedown\", handleEndMouseDown);\n return () => {\n exit.removeEventListener(\"mousedown\", handleStartMouseDown);\n entry.removeEventListener(\"mousedown\", handleEndMouseDown);\n };\n }, [\n activeEditableLine,\n rootRef,\n setLineEditorState,\n updateCurActiveEditableLine,\n ]);\n\n const controlPoints = useMemo(() => {\n if (!activeEditableLine) {\n return [];\n }\n\n const points = editableLineMap.get(activeEditableLine)!.points!;\n\n if (isStraightType((activeEditableLine.view as EditableLineView)?.type)) {\n return isLineDecorator ? getStraightControlPoints(points) : [];\n }\n\n return getControlPoints(points);\n }, [activeEditableLine, editableLineMap, isLineDecorator]);\n\n useEffect(() => {\n if (!activeEditableLine) {\n return;\n }\n const controlElements = controlPointsRef.current;\n const handleMouseDownFactory = (control: ControlPoint) => {\n return (e: MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n updateCurActiveEditableLine?.(activeEditableLine);\n const rect = rootRef.current!.getBoundingClientRect();\n setLineEditorState({\n offset: [rect.left, rect.top],\n from: [e.clientX, e.clientY],\n type: control.type,\n control,\n });\n };\n };\n const handlers = controlPoints.map((control) =>\n handleMouseDownFactory(control)\n );\n controlElements.forEach((el, i) => {\n el?.addEventListener(\"mousedown\", handlers[i]);\n });\n return () => {\n controlElements.forEach((el, i) => {\n el?.removeEventListener(\"mousedown\", handlers[i]);\n });\n };\n }, [\n activeEditableLine,\n controlPoints,\n rootRef,\n setLineEditorState,\n updateCurActiveEditableLine,\n ]);\n\n const gRef = useRef<SVGGElement>(null);\n useEffect(() => {\n const g = gRef.current;\n const onClick = (e: MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n };\n g?.addEventListener(\"click\", onClick);\n return () => {\n g?.removeEventListener(\"click\", onClick);\n };\n }, []);\n\n if (movingCells) {\n return null;\n }\n\n const view = activeEditableLine.view as EditableLineView;\n const linePoints = editableLineMap.get(activeEditableLine)!.points!;\n const { exitPosition, entryPosition } = view ?? {};\n\n const commonProps: React.SVGAttributes<SVGImageElement> = {\n width: POINT_HELPER_BG_SIZE / scale,\n height: POINT_HELPER_BG_SIZE / scale,\n preserveAspectRatio: \"none\",\n cursor: \"pointer\",\n pointerEvents: \"fill\",\n };\n const exitPoint = linePoints[0];\n const entryPoint = linePoints[linePoints.length - 1];\n const offset = POINT_HELPER_BG_SIZE / scale / 2;\n\n return (\n <g ref={gRef}>\n <image\n ref={exitRef}\n {...commonProps}\n x={exitPoint.x - offset}\n y={exitPoint.y - offset}\n xlinkHref={\n isLineDecorator\n ? VERTEX_HELPER_IMAGE\n : exitPosition\n ? ANCHORED_POINT_HELPER_IMAGE\n : POINT_HELPER_IMAGE\n }\n />\n {controlPoints.map((point, i) => (\n <image\n key={i}\n ref={(el) => {\n controlPointsRef.current[i] = el;\n }}\n {...commonProps}\n x={point.x - offset}\n y={point.y - offset}\n opacity={\n point.type === \"break\" &&\n !(\n lineEditorState?.type === \"break\" &&\n lineEditorState.control === point\n )\n ? 0.4\n : 1\n }\n xlinkHref={VERTEX_HELPER_IMAGE}\n cursor={\n isLineDecorator\n ? \"crosshair\"\n : point.direction === \"ns\"\n ? \"row-resize\"\n : \"col-resize\"\n }\n />\n ))}\n <image\n ref={entryRef}\n {...commonProps}\n x={entryPoint.x - offset}\n y={entryPoint.y - offset}\n xlinkHref={\n isLineDecorator\n ? END_POINT_HELPER_IMAGE\n : entryPosition\n ? ANCHORED_POINT_HELPER_IMAGE\n : POINT_HELPER_IMAGE\n }\n />\n </g>\n );\n}\n\nfunction getControlPoints(linePoints: NodePosition[]): ControlPoint[] {\n const controlPoints: ControlPoint[] = [];\n let prev = linePoints[0];\n let cursor = 1;\n while (cursor < linePoints.length) {\n const next = linePoints[cursor];\n const ns = prev.y === next.y;\n const ew = prev.x === next.x;\n if (!(ns && ew)) {\n const direction = ns ? \"ns\" : \"ew\";\n controlPoints.push({\n type: \"control\",\n direction,\n index: cursor - 1,\n x: (prev.x + next.x) / 2,\n y: (prev.y + next.y) / 2,\n });\n }\n prev = next;\n cursor++;\n }\n\n return controlPoints;\n}\n\nfunction getStraightControlPoints(linePoints: NodePosition[]): ControlPoint[] {\n const controlPoints: ControlPoint[] = [];\n let prev = linePoints[0];\n let cursor = 1;\n while (cursor < linePoints.length) {\n const next = linePoints[cursor];\n controlPoints.push({\n type: \"break\",\n index: cursor - 1,\n x: (prev.x + next.x) / 2,\n y: (prev.y + next.y) / 2,\n });\n if (cursor < linePoints.length - 1) {\n controlPoints.push({\n ...next,\n type: \"corner\",\n index: cursor - 1,\n });\n }\n prev = next;\n cursor++;\n }\n\n return controlPoints;\n}\n","import type { PositionTuple, TransformLiteral } from \"../../diagram/interfaces\";\nimport type { NodeView } from \"../interfaces\";\n\nexport interface HandleLassoOptions {\n transform: TransformLiteral;\n offset: PositionTuple;\n onLassoing(rect: NodeView): void;\n onLassoed(rect: NodeView): void;\n}\n\nexport function handleLasso(\n event: MouseEvent,\n { transform, offset, onLassoing, onLassoed }: HandleLassoOptions\n) {\n if (event.ctrlKey || event.button) {\n return;\n }\n\n event.stopPropagation();\n\n const from: PositionTuple = [event.clientX, event.clientY];\n const x0 = (event.clientX - offset[0] - transform.x) / transform.k;\n const y0 = (event.clientY - offset[1] - transform.y) / transform.k;\n\n function getMovement(e: MouseEvent): PositionTuple {\n return [\n (e.clientX - from[0]) / transform.k,\n (e.clientY - from[1]) / transform.k,\n ];\n }\n\n let moved = false;\n\n const handleMove = (e: MouseEvent, finished?: boolean) => {\n // Respect the scale\n const movement = getMovement(e);\n if (!moved) {\n moved = movement[0] ** 2 + movement[1] ** 2 >= 9;\n }\n if (moved) {\n let [width, height] = movement;\n let x = x0;\n let y = y0;\n if (width < 0) {\n x = x0 + width;\n width = -width;\n }\n if (height < 0) {\n y = y0 + height;\n height = -height;\n }\n (finished ? onLassoed : onLassoing)({\n x,\n y,\n width,\n height,\n });\n }\n };\n\n const onMouseMove = (e: MouseEvent) => {\n handleMove(e);\n };\n const onMouseUp = (e: MouseEvent) => {\n handleMove(e, true);\n moved = false;\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n}\n","// istanbul ignore file: experimental\nimport React, { useCallback, useEffect, useRef } from \"react\";\nimport { useHoverStateContext } from \"./HoverStateContext\";\nimport type {\n ActiveTarget,\n Cell,\n EditableEdgeLine,\n EditableLine,\n EditableLineCell,\n NodeCell,\n} from \"./interfaces\";\nimport { targetIsActive } from \"./processors/targetIsActive\";\nimport type { NodePosition } from \"../diagram/interfaces\";\nimport { DEFAULT_NODE_PADDING_FOR_SMART_LINES } from \"./constants\";\nimport { isEditableEdgeLine } from \"./processors/asserts\";\n\nconst HELPER_IMAGE =\n \"data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI1cHgiIGhlaWdodD0iNXB4IiB2ZXJzaW9uPSIxLjEiPjxwYXRoIGQ9Im0gMCAwIEwgNSA1IE0gMCA1IEwgNSAwIiBzdHJva2Utd2lkdGg9IjIiIHN0eWxlPSJzdHJva2Utb3BhY2l0eTowLjQiIHN0cm9rZT0iI2ZmZmZmZiIvPjxwYXRoIGQ9Im0gMCAwIEwgNSA1IE0gMCA1IEwgNSAwIiBzdHJva2U9IiMyOWI2ZjIiLz48L3N2Zz4=\";\nconst HELPER_RADIUS = 5;\nconst HELPER_BG_RADIUS = 8;\nconst HALF_HELPER_RADIUS = HELPER_RADIUS / 2;\n\nexport interface LineConnectorComponentProps {\n activeTarget: ActiveTarget | null;\n editableLineMap: WeakMap<EditableLineCell, EditableLine>;\n scale: number;\n activeEditableLine: EditableLineCell | null;\n disabled?: boolean;\n}\n\nexport function LineConnectorComponent({\n activeTarget,\n editableLineMap,\n scale,\n activeEditableLine,\n disabled,\n}: LineConnectorComponentProps): JSX.Element | null {\n const {\n unsetHoverStateTimeoutRef,\n hoverState,\n setHoverState,\n smartConnectLineState,\n lineEditorState,\n } = useHoverStateContext();\n\n const unsetTimeout = useCallback(() => {\n if (unsetHoverStateTimeoutRef.current !== null) {\n clearTimeout(unsetHoverStateTimeoutRef.current);\n unsetHoverStateTimeoutRef.current = null;\n }\n }, [unsetHoverStateTimeoutRef]);\n\n const unsetActivePointIndex = useCallback(() => {\n unsetTimeout();\n setHoverState((prev) =>\n prev?.activePointIndex === undefined\n ? prev\n : { ...hoverState!, activePointIndex: undefined }\n );\n }, [hoverState, setHoverState, unsetTimeout]);\n\n const unsetHoverState = useCallback(() => {\n unsetHoverStateTimeoutRef.current = setTimeout(() => {\n setHoverState(null);\n }) as unknown as number;\n }, [setHoverState, unsetHoverStateTimeoutRef]);\n\n let source: Cell | undefined;\n let target: Cell | undefined;\n let editableLine: EditableLine | undefined;\n\n const available =\n !disabled &&\n hoverState &&\n (!!smartConnectLineState ||\n (activeEditableLine && lineEditorState\n ? (editableLine = editableLineMap.get(activeEditableLine)) &&\n (isEditableEdgeLine(editableLine)\n ? (({ source, target } = editableLine),\n lineEditorState.type === \"entry\")\n ? hoverState.cell === target\n : lineEditorState.type === \"exit\" && hoverState.cell === source\n : // TODO(steve): decorator line\n false)\n : !targetIsActive(hoverState.cell, activeTarget) &&\n !hasActiveEdge(activeTarget)));\n\n const padding = DEFAULT_NODE_PADDING_FOR_SMART_LINES;\n const halfPadding = padding / 2;\n\n return (\n <g onMouseEnter={unsetActivePointIndex} onMouseLeave={unsetHoverState}>\n {available && (\n <>\n <rect\n x={hoverState.cell.view.x - halfPadding}\n y={hoverState.cell.view.y - halfPadding}\n width={hoverState.cell.view.width + padding}\n height={hoverState.cell.view.height + padding}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={(HELPER_BG_RADIUS * 2) / scale}\n pointerEvents=\"stroke\"\n />\n {hoverState.activePointIndex !== undefined && (\n <circle\n cx={hoverState.points[hoverState.activePointIndex].x}\n cy={hoverState.points[hoverState.activePointIndex].y}\n r={HELPER_BG_RADIUS / scale}\n fill=\"lightgreen\"\n fillOpacity={0.5}\n pointerEvents=\"none\"\n />\n )}\n {hoverState.points.map((point, index) => (\n <ConnectPointComponent\n key={index}\n editableLineMap={editableLineMap}\n index={index}\n point={point}\n scale={scale}\n activeEditableLine={activeEditableLine}\n unsetActivePointIndex={unsetActivePointIndex}\n unsetTimeout={unsetTimeout}\n />\n ))}\n </>\n )}\n </g>\n );\n}\n\ninterface ConnectPointComponentProps {\n editableLineMap: WeakMap<EditableLineCell, EditableLine>;\n index: number;\n point: NodePosition;\n scale: number;\n activeEditableLine: EditableLineCell | null;\n unsetTimeout: () => void;\n unsetActivePointIndex: () => void;\n}\n\nfunction ConnectPointComponent({\n editableLineMap,\n index,\n point,\n scale,\n activeEditableLine,\n unsetTimeout,\n unsetActivePointIndex,\n}: ConnectPointComponentProps): JSX.Element {\n const {\n rootRef,\n smartConnectLineState,\n hoverState,\n setHoverState,\n setSmartConnectLineState,\n onConnect,\n lineEditorState,\n setLineEditorState,\n onChangeEdgeView,\n } = useHoverStateContext();\n const ref = useRef<SVGGElement>(null);\n\n useEffect(() => {\n const g = ref.current;\n const handleMouseEnter = (e: MouseEvent) => {\n // There is a chance that mouseenter will not be triggered when the element is shown aync.\n // So we also listen to the mousemove event, but only once.\n if (e.type === \"mousemove\") {\n g?.removeEventListener(e.type, handleMouseEnter);\n }\n unsetTimeout();\n setHoverState((prev) =>\n prev && prev.activePointIndex !== index\n ? { ...hoverState!, activePointIndex: index }\n : prev\n );\n };\n g?.addEventListener(\"mouseenter\", handleMouseEnter);\n g?.addEventListener(\"mousemove\", handleMouseEnter);\n return () => {\n g?.removeEventListener(\"mouseenter\", handleMouseEnter);\n g?.removeEventListener(\"mousemove\", handleMouseEnter);\n };\n }, [hoverState, index, setHoverState, unsetTimeout]);\n\n useEffect(() => {\n if (lineEditorState) {\n return;\n }\n const handleMouseDown = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const rect = rootRef.current!.getBoundingClientRect();\n const originalPoint = hoverState!.points[index];\n setSmartConnectLineState({\n source: hoverState!.cell as NodeCell,\n from: [originalPoint.x, originalPoint.y],\n offset: [rect.left, rect.top],\n exitPosition: hoverState!.relativePoints[index],\n });\n };\n const g = ref.current;\n g?.addEventListener(\"mousedown\", handleMouseDown);\n return () => {\n g?.removeEventListener(\"mousedown\", handleMouseDown);\n };\n }, [hoverState, index, lineEditorState, rootRef, setSmartConnectLineState]);\n\n useEffect(() => {\n const handleMouseUp = (e: MouseEvent) => {\n if (\n activeEditableLine &&\n lineEditorState &&\n activeEditableLine.type === \"decorator\"\n ) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n if (smartConnectLineState) {\n if (smartConnectLineState.source !== hoverState?.cell) {\n onConnect?.(\n smartConnectLineState.source,\n hoverState!.cell,\n smartConnectLineState.exitPosition,\n hoverState!.relativePoints[hoverState!.activePointIndex!]\n );\n }\n setSmartConnectLineState(null);\n } else if (activeEditableLine && lineEditorState) {\n const position =\n hoverState!.relativePoints[hoverState!.activePointIndex!];\n const { type } = lineEditorState;\n const { source, target } = editableLineMap.get(\n activeEditableLine!\n ) as EditableEdgeLine;\n const { view } = activeEditableLine!;\n if (type === \"entry\") {\n onChangeEdgeView?.(source, target, {\n ...view,\n entryPosition: position,\n });\n } else {\n onChangeEdgeView?.(source, target, {\n ...view,\n exitPosition: position,\n });\n }\n setLineEditorState(null);\n }\n };\n const g = ref.current;\n g?.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n g?.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [\n smartConnectLineState,\n hoverState,\n onConnect,\n setSmartConnectLineState,\n activeEditableLine,\n lineEditorState,\n editableLineMap,\n onChangeEdgeView,\n setLineEditorState,\n ]);\n\n return (\n <g ref={ref} onMouseLeave={unsetActivePointIndex}>\n <circle\n cx={point.x}\n cy={point.y}\n r={HELPER_BG_RADIUS}\n fill=\"transparent\"\n />\n <image\n x={point.x - HALF_HELPER_RADIUS / scale}\n y={point.y - HALF_HELPER_RADIUS / scale}\n width={HELPER_RADIUS / scale}\n height={HELPER_RADIUS / scale}\n xlinkHref={HELPER_IMAGE}\n preserveAspectRatio=\"none\"\n />\n </g>\n );\n}\n\nfunction hasActiveEdge(activeTarget: ActiveTarget | null) {\n return (\n activeTarget &&\n (activeTarget.type === \"edge\" ||\n (activeTarget.type === \"multi\" &&\n activeTarget.targets.some((target) => target.type === \"edge\")))\n );\n}\n","import type { ActiveTarget, Cell } from \"../interfaces\";\nimport { isLocked } from \"./isLocked\";\nimport { targetIsActive } from \"./targetIsActive\";\n\nexport type KeyboardAction = KeyboardActionDeleteCells;\n\nexport interface KeyboardActionDeleteCells {\n action: \"delete-cells\";\n cells: Cell[];\n}\n\nexport function handleKeyboard(\n event: KeyboardEvent,\n {\n cells,\n activeTarget,\n lockedContainerIds,\n }: {\n cells: Cell[];\n activeTarget: ActiveTarget | null | undefined;\n lockedContainerIds?: string[];\n }\n): KeyboardAction | undefined {\n const activeCells = cells.filter(\n (cell) =>\n targetIsActive(cell, activeTarget) && !isLocked(cell, lockedContainerIds)\n );\n\n if (activeCells.length === 0) {\n return;\n }\n\n const key =\n event.key ||\n /* istanbul ignore next: compatibility */ event.keyCode ||\n /* istanbul ignore next: compatibility */ event.which;\n\n switch (key) {\n case \"Backspace\":\n case 8:\n case \"Delete\":\n case 46: {\n event.preventDefault();\n event.stopPropagation();\n return {\n action: \"delete-cells\",\n cells: activeCells,\n };\n }\n }\n}\n","import type { ActiveTarget, Cell } from \"../interfaces\";\nimport { isNodeCell } from \"./asserts\";\nimport { targetIsActive } from \"./targetIsActive\";\n\nexport function toggleLock(\n target: ActiveTarget,\n type: \"toggle\" | \"lock\" | \"unlock\",\n cells: Cell[],\n lockedContainerIds: string[]\n): { newCells: Cell[] | null; updates: Cell[] } {\n const previousLocked: Cell[] = [];\n const previousUnlocked: Cell[] = [];\n for (const cell of cells) {\n if (targetIsActive(cell, target)) {\n // 如果容器已锁定,禁止其子节点的锁定状态改变\n if (\n isNodeCell(cell) &&\n cell.containerId &&\n lockedContainerIds.includes(cell.containerId)\n ) {\n continue;\n }\n (cell.view?.locked ? previousLocked : previousUnlocked).push(cell);\n }\n }\n\n let newCells: Cell[] | null = null;\n const updates: Cell[] = [];\n\n if (type !== \"unlock\" && previousUnlocked.length > 0) {\n // Lock all unlocked targets\n newCells = cells.map((cell) => {\n if (previousUnlocked.includes(cell)) {\n const update = {\n ...cell,\n view: { ...cell.view, locked: true },\n } as Cell;\n updates.push(update);\n return update;\n }\n return cell;\n });\n } else if (type !== \"lock\" && previousLocked.length > 0) {\n // Unlock all locked targets\n newCells = cells.map((cell) => {\n if (previousLocked.includes(cell)) {\n const update = {\n ...cell,\n view: { ...cell.view, locked: false },\n } as Cell;\n updates.push(update);\n return update;\n }\n return cell;\n });\n }\n\n return { newCells, updates };\n}\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `*{box-sizing:border-box}:host{display:block;position:relative;overflow:hidden;--animation-dasharray:48;--stroke-dashedoffset:96;--stroke-dottedoffset:24;--dasharray:4;--dotted:1;--area-bg-color:rgba(119,141,195,0.1)}:host,\n.root{width:100%;height:100%}:host([hidden]){display:none}.root{opacity:0}.root.ready{opacity:1}.root:focus{outline:none}@keyframes solidAnimation{to{stroke-dashoffset:0}}@keyframes dashedAnimation{0%{stroke-dashoffset:var(--stroke-dashedoffset)}to{stroke-dashoffset:0}}@keyframes dottedAnimation{0%{stroke-dashoffset:var(--stroke-dottedoffset)}to{stroke-dashoffset:0}}.solid-animation{stroke-dasharray:var(--solid-length);stroke-dashoffset:var(--solid-length);animation:solidAnimation var(--time) linear infinite}.dashed-animation{animation:dashedAnimation var(--time) linear infinite}.dotted-animation{animation:dottedAnimation var(--time) linear infinite}.decorator-area .area,\n.container-wrapper .container{background-color:var(--area-bg-color);border:1px solid transparent}.decorator-text .text-container{border:1px solid transparent}.decorator-rect-container .rect-container{border:1px solid rgba(73,126,255,0.7)}.cell.active .decorator-area .area,\n.cell.active .decorator-rect-container .rect-container,\n.cell.active .decorator-text .text-container,\n.cell.active .container-wrapper .container,\n.container-dragover .decorator-container .container{border-style:dashed;border-color:rgba(73,126,255,0.7)}.node,\n.container-wrapper{overflow:visible}.decorator-text,\n.decorator-rect,\n.decorator-area{overflow:visible;pointer-events:none}.lock-icon,\n.decorator-text > *,\n.decorator-rect > *,\n.decorator-area > *{pointer-events:auto}.cell.active .line-active-bg{stroke:var(--palette-blue-5);stroke-dasharray:var(--dasharray);stroke-width:1}.cell:not(.read-only){-webkit-user-select:none;user-select:none}.resize-handle{cursor:nwse-resize;opacity:0}.resize-handle rect{fill:transparent;stroke:none}.resize-handle path{fill:none;stroke:var(--palette-gray-5);stroke-width:1.5}.decorator-area-container:hover .resize-handle,\n.decorator-rect-container:hover .resize-handle,\n.decorator-container:hover .resize-handle{opacity:1}.connect-line{pointer-events:none}.connect-line:not(.connecting){display:none}.editing-line{pointer-events:none;stroke-dasharray:var(--dasharray);stroke-width:1}.editing-line:not(.editing){display:none}.line.dashed{stroke-dasharray:var(--dasharray)}.line.dotted{stroke-dasharray:var(--dotted)}.decorator-text .text-container{width:max-content;padding:0.5em;white-space:pre}.cell:not(.read-only) .decorator-text .text-container:hover{color:#497eff}.decorator-text .text:focus{outline:none}.cell.faded{opacity:0.3}.cell.container-dragover{opacity:1}.cell .node{pointer-events:none}.cell .node > *{position:fixed;pointer-events:auto}.degraded{pointer-events:bounding-box}.degraded circle{fill:rgb(119,141,195)}.degraded text{text-anchor:middle;fill:var(--antd-text-color)}.cell.active .degraded circle,\n.cell.active .degraded text,\n.degraded:hover circle,\n.degraded:hover text{fill:var(--color-brand)}.decorator-container{--defaultSize:24px}.decorator-container .text-container{display:flex;align-items:center;justify-content:center;padding:0.5em;text-align:center;font-size:16px;color:#262626;background-color:rgba(119,141,195,0.25);overflow:hidden}.decorator-container .horizontal{height:max-content;width:100%}.decorator-container .horizontal .text{min-height:var(--defaultSize)}.decorator-container .vertical{width:max-content;height:100%;writing-mode:vertical-lr;-webkit-text-orientation:upright;text-orientation:upright;letter-spacing:4px}.decorator-container .vertical .text{min-width:var(--defaultSize)}.line-label-container{overflow:visible;opacity:0}.line-label-container.ready{opacity:1}.line-label{position:absolute;display:block;transform:translate(-50%,-50%);white-space:pre-line;width:max-content;text-align:center}.line-label.text{font-size:11px;color:var(--color-secondary-text);font-weight:400;line-height:1.63636364}.motion:not(.visible){opacity:0}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n","export const SYMBOL_FOR_SIZE_INITIALIZED = Symbol.for(\"size-initialized\");\nexport const SYMBOL_FOR_LAYOUT_INITIALIZED = Symbol.for(\"layout-initialized\");\nexport const DEFAULT_NODE_SIZE = 20;\nexport const DEFAULT_NODE_GAP_H = 36;\nexport const DEFAULT_NODE_GAP_V = 50;\nexport const DEFAULT_AREA_WIDTH = 180;\nexport const DEFAULT_AREA_HEIGHT = 120;\nexport const DEFAULT_SCALE_RANGE_MIN = 0.5;\nexport const DEFAULT_SCALE_RANGE_MAX = 2;\nexport const DEFAULT_LINE_STROKE_COLOR = \"gray\";\nexport const DEFAULT_LINE_STROKE_WIDTH = 1;\nexport const DEFAULT_DECORATOR_LINE_STROKE_COLOR = \"rgba(73, 126, 255, 0.7)\";\nexport const DEFAULT_LINE_INTERACT_STROKE_WIDTH = 15;\nexport const DEFAULT_LINE_INTERACT_SHOW_START_ARROW = false;\nexport const DEFAULT_LINE_INTERACT_SHOW_END_ARROW = true;\nexport const DEFAULT_LINE_INTERACT_ANIMATE_DURATION = 1;\nexport const DEFAULT_DEGRADED_THRESHOLD = 500;\nexport const DEFAULT_SNAP_GRID_SIZE = 10;\nexport const DEFAULT_SNAP_OBJECT_DISTANCE = 5;\nexport const DEFAULT_SNAP_OBJECT_POSITIONS = \"all\";\n/** Padding left + padding right, as well as top + bottom */\nexport const DEFAULT_NODE_PADDING_FOR_LINES = 5;\n/** Padding left + padding right, as well as top + bottom */\nexport const DEFAULT_NODE_PADDING_FOR_SMART_LINES = 0;\nexport const DEFAULT_CANVAS_PADDING = 0;\n\nexport const POINT_HELPER_RADIUS = 5;\nexport const DEFAULT_MOTION_SPEED = 50;\n","import React, { useEffect, useState } from \"react\";\nimport classNames from \"classnames\";\nimport type { ConnectLineState } from \"./interfaces\";\nimport type { PositionTuple, TransformLiteral } from \"../diagram/interfaces\";\n\nexport interface ConnectLineComponentProps {\n connectLineState: ConnectLineState | null;\n transform: TransformLiteral;\n markerEnd: string;\n onConnect(state: ConnectLineState, to: PositionTuple): void;\n}\n\nexport function ConnectLineComponent({\n connectLineState,\n transform,\n markerEnd,\n onConnect,\n}: ConnectLineComponentProps): JSX.Element {\n const [connectLineTo, setConnectLineTo] = useState<PositionTuple | null>(\n null\n );\n\n useEffect(() => {\n if (connectLineState) {\n setConnectLineTo(connectLineState.from);\n }\n }, [connectLineState]);\n\n useEffect(() => {\n if (connectLineState) {\n const getConnectTo = (e: MouseEvent): PositionTuple => [\n (e.clientX - transform.x - connectLineState.offset[0]) / transform.k,\n (e.clientY - transform.y - connectLineState.offset[1]) / transform.k,\n ];\n const onMouseMove = (e: MouseEvent) => {\n // Set connect line to based on the mouse position and the transform\n setConnectLineTo(getConnectTo(e));\n };\n const onMouseDown = (e: MouseEvent) => {\n e.stopPropagation();\n };\n const onClick = (e: MouseEvent) => {\n e.stopPropagation();\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n reset();\n onConnect(connectLineState, getConnectTo(e));\n };\n const reset = () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mousedown\", onMouseDown, {\n capture: true,\n });\n document.removeEventListener(\"click\", onClick, { capture: true });\n setConnectLineTo(null);\n };\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mousedown\", onMouseDown, { capture: true });\n document.addEventListener(\"click\", onClick, { capture: true });\n\n return reset;\n }\n }, [connectLineState, onConnect, transform]);\n\n return (\n <path\n className={classNames(\"connect-line\", {\n connecting:\n !!connectLineState &&\n connectLineTo &&\n // Do not show when the distance of mouse move is less than 5px\n (connectLineTo[0] - connectLineState.from[0]) ** 2 +\n (connectLineTo[1] - connectLineState.from[1]) ** 2 >\n 25,\n })}\n d={\n connectLineState && connectLineTo\n ? `M${connectLineState.from.join(\" \")}L${connectLineTo.join(\" \")}`\n : \"\"\n }\n fill=\"none\"\n stroke=\"gray\"\n strokeWidth={1}\n markerEnd={`url(#${markerEnd})`}\n />\n );\n}\n","import type { SizeTuple } from \"../../diagram/interfaces\";\nimport type { Cell, InitialCell, NodeCell } from \"../interfaces\";\nimport { isInitialNodeCell } from \"./asserts\";\n\nexport function initializeCells(\n initialCells: InitialCell[] | undefined,\n {\n defaultNodeSize,\n }: {\n defaultNodeSize: SizeTuple;\n }\n): Cell[] {\n const originalCells = initialCells ?? [];\n const finalCells: Cell[] = originalCells.map<Cell>((cell) => {\n if (\n !isInitialNodeCell(cell) ||\n (cell.view?.width !== undefined && cell.view?.height !== undefined)\n ) {\n return cell as NodeCell;\n }\n return {\n ...cell,\n view: {\n width: defaultNodeSize[0],\n height: defaultNodeSize[1],\n ...cell.view,\n },\n } as NodeCell;\n });\n return finalCells;\n}\n","import React, { useCallback, useEffect, useMemo } from \"react\";\nimport { checkIfOfComputed } from \"@next-core/runtime\";\nimport { ReactUseBrick } from \"@next-core/react-runtime\";\nimport classNames from \"classnames\";\nimport type {\n LineLabelConf,\n PositionTuple,\n TextOptions,\n} from \"../diagram/interfaces\";\nimport type { EdgeCell, PositionAndAngle } from \"./interfaces\";\n\nexport interface LineLabelComponentProps {\n edge: EdgeCell;\n position?: PositionAndAngle | null;\n offset?: PositionTuple | null;\n label?: LineLabelConf;\n text?: TextOptions;\n onRendered?: (element: HTMLElement | null) => void;\n onClick?: () => void;\n}\n\nexport function LineLabelComponent({\n edge,\n position,\n offset,\n label,\n text,\n onRendered,\n onClick,\n}: LineLabelComponentProps): JSX.Element | null {\n if (!label && !text) {\n return null;\n }\n const ready = !!(position && offset);\n return (\n <foreignObject\n className={classNames(\"line-label-container\", { ready })}\n x={ready ? position[0] + offset[0] : 0}\n y={ready ? position[1] + offset[1] : 0}\n onClick={onClick}\n >\n {label ? (\n <div className=\"line-label label\">\n <LineLabelUseBrickComponent\n edge={edge}\n label={label}\n onRendered={onRendered}\n />\n </div>\n ) : (\n <LineLabelTextComponent text={text!} onRendered={onRendered} />\n )}\n </foreignObject>\n );\n}\n\ninterface LineLabelTextComponentProps {\n text: TextOptions;\n onRendered?: (element: HTMLElement | null) => void;\n}\n\nfunction LineLabelTextComponent({\n text,\n onRendered,\n}: LineLabelTextComponentProps): JSX.Element {\n const refCallback = useCallback(\n (element: HTMLDivElement) => {\n onRendered?.(element);\n },\n [onRendered]\n );\n\n return (\n <div className=\"line-label text\" ref={refCallback} style={text.style}>\n {text.content}\n </div>\n );\n}\n\ninterface LineLabelUseBrickComponentProps {\n edge: EdgeCell;\n label: LineLabelConf;\n onRendered?: (element: HTMLElement | null) => void;\n}\n\n// istanbul ignore next\nfunction LineLabelUseBrickComponent({\n edge,\n label,\n onRendered,\n}: LineLabelUseBrickComponentProps): JSX.Element | null {\n const useBrick = useMemo(\n () => (checkIfOfComputed(label) ? label.useBrick : null),\n [label]\n );\n\n const memoizedData = useMemo(() => ({ edge }), [edge]);\n\n useEffect(() => {\n if (!useBrick) {\n // Keep the same time delay for reporting rendered.\n setTimeout(() => {\n onRendered?.(null);\n });\n }\n }, [onRendered, useBrick]);\n\n useEffect(\n () => {\n return () => {\n onRendered?.(null);\n };\n },\n // Only unmount once\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const refCallback = useCallback(\n (element: HTMLElement | null) => {\n if (element) {\n // Todo: correctly wait for `useBrick` in v3 to be rendered (after layout)\n // Wait a macro task to let `useBrick` to be rendered.\n setTimeout(() => {\n // await Promise.resolve();\n onRendered?.(element.parentElement);\n });\n }\n },\n [onRendered]\n );\n\n const ignoredCallback = useCallback(() => {\n setTimeout(() => {\n onRendered?.(null);\n });\n }, [onRendered]);\n\n if (!useBrick) {\n return null;\n }\n\n return (\n <ReactUseBrick\n refCallback={refCallback}\n ignoredCallback={ignoredCallback}\n useBrick={useBrick}\n data={memoizedData}\n />\n );\n}\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport classNames from \"classnames\";\nimport { uniqueId } from \"lodash\";\nimport ResizeObserver from \"resize-observer-polyfill\";\nimport type {\n ActiveTarget,\n ComputedEdgeLineConf,\n Direction,\n EdgeCell,\n EdgeLineMotion,\n EditableLine,\n EditableLineCell,\n PositionAndAngle,\n} from \"./interfaces\";\nimport {\n DEFAULT_LINE_INTERACT_ANIMATE_DURATION,\n DEFAULT_MOTION_SPEED,\n} from \"./constants\";\nimport { curveLine } from \"../diagram/lines/curveLine\";\nimport { getMarkers } from \"../shared/canvas/useLineMarkers\";\nimport type {\n LineMarkerConf,\n NodePosition,\n SizeTuple,\n} from \"../diagram/interfaces\";\nimport { LineLabelComponent } from \"./LineLabelComponent\";\nimport { cellToTarget } from \"./processors/cellToTarget\";\nimport { getLabelMaskAndOffset } from \"./processors/getLabelMaskAndOffset\";\n\nexport interface EdgeComponentProps {\n edge: EdgeCell;\n lineConfMap: WeakMap<EditableLineCell, ComputedEdgeLineConf>;\n editableLineMap: WeakMap<EditableLineCell, EditableLine>;\n readOnly?: boolean;\n active?: boolean;\n activeRelated?: boolean;\n onSwitchActiveTarget?(activeTarget: ActiveTarget | null): void;\n}\n\nexport function EdgeComponent({\n edge,\n lineConfMap,\n editableLineMap,\n readOnly,\n active,\n activeRelated,\n onSwitchActiveTarget,\n}: EdgeComponentProps): JSX.Element | null {\n const pathRef = useRef<SVGPathElement | null>(null);\n const lineConf = lineConfMap.get(edge)!;\n const { points: linePoints, jumpsMap } = editableLineMap.get(edge) ?? {};\n\n const line = useMemo(() => {\n return curveLine(\n linePoints,\n lineConf.type === \"curve\" ? lineConf.curveType : \"curveLinear\",\n 0,\n 1,\n jumpsMap\n );\n }, [lineConf, linePoints, jumpsMap]);\n\n const lineClipPathPrefix = useMemo(() => uniqueId(\"line-mask-\"), []);\n\n const [labelPosition, setLabelPosition] = useState<PositionAndAngle | null>(\n null\n );\n const [labelSize, setLabelSize] = useState<SizeTuple | null>(null);\n const [lineRect, setLineRect] = useState<Pick<\n SVGRect,\n \"x\" | \"y\" | \"width\" | \"height\"\n > | null>(null);\n\n const updateLabelPosition = useCallback(() => {\n const path = pathRef.current;\n const { label, text } = lineConf;\n // istanbul ignore next\n if (path && linePoints && (label || text)) {\n if (process.env.NODE_ENV === \"test\") {\n setLabelPosition([30, 40, \"center\", 0, 0]);\n setLineRect({ x: 10, y: 20, width: 300, height: 400 });\n return;\n }\n const placement = (label ? label.placement : text.placement) ?? \"center\";\n const offset = (label ? label.offset : text.offset) ?? 0;\n const pathLength = path.getTotalLength();\n const halfPathLength = pathLength / 2;\n const pathPoint = path.getPointAtLength(\n placement === \"start\"\n ? 0\n : placement === \"end\"\n ? pathLength\n : halfPathLength + offset\n );\n\n let direction: Direction | \"center\" = \"center\";\n let angle = 0;\n if (placement === \"start\" || placement === \"end\") {\n let p0: NodePosition;\n let p1: NodePosition;\n if (placement === \"start\") {\n p0 = linePoints[0];\n p1 = linePoints[1];\n } else {\n p0 = linePoints[linePoints.length - 1];\n p1 = linePoints[linePoints.length - 2];\n }\n angle = Math.atan2(p1.y - p0.y, p1.x - p0.x);\n direction =\n Math.abs(p0.x - p1.x) > Math.abs(p0.y - p1.y)\n ? p0.x > p1.x\n ? \"left\"\n : \"right\"\n : p0.y > p1.y\n ? \"top\"\n : \"bottom\";\n }\n\n setLabelPosition([pathPoint.x, pathPoint.y, direction, angle, offset]);\n const rect = path.getBBox();\n setLineRect({\n x: rect.x - 1000,\n y: rect.y - 1000,\n width: rect.width + 2000,\n height: rect.height + 2000,\n });\n }\n }, [lineConf, linePoints]);\n\n const [pathLength, setPathLength] = useState<number | null>(null);\n\n const pathRefCallback = useCallback(\n (element: SVGPathElement | null) => {\n pathRef.current = element;\n if (element) {\n // Jest does not support `SVGPathElement::getTotalLength`\n setPathLength(element.getTotalLength?.() ?? 100);\n const rect = element.getBBox?.();\n edge.view = {\n ...edge.view,\n x: rect?.x,\n y: rect?.y,\n width: rect?.width,\n height: rect?.height,\n };\n }\n updateLabelPosition();\n },\n [updateLabelPosition, edge]\n );\n\n const [labelElement, setLabelElement] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!labelElement) {\n setLabelSize(null);\n return;\n }\n const observerCallback = () => {\n const { offsetWidth, offsetHeight } = labelElement;\n // Do not mask out when the label takes no space.\n // istanbul ignore next\n if (\n process.env.NODE_ENV !== \"test\" &&\n (offsetWidth === 0 || offsetHeight === 0)\n ) {\n setLabelSize(null);\n return;\n }\n setLabelSize([offsetWidth, offsetHeight]);\n };\n const resizeObserver = new ResizeObserver(observerCallback);\n resizeObserver.observe(labelElement);\n\n // `ResizeObserver` will not call the callback in test environment.\n // istanbul ignore next\n if (process.env.NODE_ENV === \"test\") {\n observerCallback();\n }\n return () => {\n resizeObserver.disconnect();\n };\n }, [labelElement]);\n\n const handleLabelRendered = useCallback((element: HTMLElement | null) => {\n setLabelElement(element);\n }, []);\n\n useEffect(\n () => {\n updateLabelPosition();\n },\n // Update label position when line points changed\n [updateLabelPosition, linePoints]\n );\n\n const onLabelClick = useCallback(() => {\n onSwitchActiveTarget?.(cellToTarget(edge));\n }, [edge, onSwitchActiveTarget]);\n\n const onDoubleClick = useCallback(\n (e: React.MouseEvent) => {\n if (readOnly || !lineConf.callLabelOnDoubleClick) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n (\n labelElement?.firstElementChild as unknown as Record<string, () => void>\n )?.[lineConf.callLabelOnDoubleClick]?.();\n },\n [labelElement, lineConf, readOnly]\n );\n\n const [mask, labelOffset] = useMemo(\n () => getLabelMaskAndOffset(labelPosition, labelSize),\n [labelPosition, labelSize]\n );\n\n const clipPathPoints = useMemo(() => {\n if (!mask || !lineRect) {\n return null;\n }\n const right = lineRect.x + lineRect.width;\n const bottom = lineRect.y + lineRect.height;\n const maskRight = mask.left + mask.width;\n const maskBottom = mask.top + mask.height;\n return [\n [mask.left, maskBottom],\n [maskRight, maskBottom],\n [maskRight, mask.top],\n [mask.left, mask.top],\n [mask.left, lineRect.y],\n [right, lineRect.y],\n [right, bottom],\n [lineRect.x, bottom],\n [lineRect.x, lineRect.y],\n [mask.left, lineRect.y],\n ]\n .map((points) => points.join(\",\"))\n .join(\" \");\n }, [lineRect, mask]);\n\n if (!line) {\n // This happens when source or target is not found,\n // or when source or target has not been positioned yet.\n return null;\n }\n\n let markerStart: string | undefined;\n let markerEnd: string | undefined;\n let strokeColor: string | undefined;\n let strokeWidth: number | undefined;\n let motion: EdgeLineMotion | undefined;\n const lineMarkers: LineMarkerConf[] = getMarkers(lineConf);\n if (active) {\n const overrides = lineConf.overrides?.active;\n strokeColor = overrides?.strokeColor ?? lineConf.strokeColor;\n strokeWidth = overrides?.strokeWidth ?? lineConf.strokeWidth;\n motion = overrides?.motion;\n for (const marker of lineMarkers) {\n if (marker.placement === \"start\") {\n markerStart =\n lineConf.$activeMarkerStartUrl ?? lineConf.$markerStartUrl;\n } else {\n markerEnd = lineConf.$activeMarkerEndUrl ?? lineConf.$markerEndUrl;\n }\n }\n } else if (activeRelated) {\n const overrides = lineConf.overrides?.activeRelated;\n strokeColor = overrides?.strokeColor ?? lineConf.strokeColor;\n strokeWidth = overrides?.strokeWidth ?? lineConf.strokeWidth;\n motion = overrides?.motion;\n for (const marker of lineMarkers) {\n if (marker.placement === \"start\") {\n markerStart =\n lineConf.$activeRelatedMarkerStartUrl ?? lineConf.$markerStartUrl;\n } else {\n markerEnd =\n lineConf.$activeRelatedMarkerEndUrl ?? lineConf.$markerEndUrl;\n }\n }\n } else {\n strokeColor = lineConf.strokeColor;\n strokeWidth = lineConf.strokeWidth;\n for (const marker of lineMarkers) {\n if (marker.placement === \"start\") {\n markerStart = lineConf.$markerStartUrl;\n } else {\n markerEnd = lineConf.$markerEndUrl;\n }\n }\n }\n\n let motionPath: string | undefined;\n if (motion?.shape === \"dot\") {\n const radius = motion.size == null ? strokeWidth * 2 : motion.size / 2;\n motionPath = `M 0,${-radius} A ${radius},${radius} 0,1,1 0,${radius} A ${radius},${radius} 0,1,1 0,${-radius} z`;\n } else if (motion?.shape === \"triangle\") {\n const radius = motion.size == null ? strokeWidth * 2 : motion.size / 2;\n const offset = radius / Math.sqrt(3);\n motionPath = `M ${-offset},${radius} v ${-radius * 2} L ${offset * 2},0 z`;\n }\n let motionDuration: string | undefined;\n if (pathLength) {\n motionDuration = `${pathLength / (motion?.speed ?? DEFAULT_MOTION_SPEED)}s`;\n }\n\n const hasMotion = [\n lineConf.overrides?.active?.motion?.shape,\n lineConf.overrides?.activeRelated?.motion?.shape,\n ].some((item) => item === \"dot\" || item === \"triangle\");\n\n const clipPathUrl = clipPathPoints\n ? `url(#${lineClipPathPrefix})`\n : undefined;\n\n return (\n <>\n {clipPathPoints && (\n <defs>\n <clipPath id={lineClipPathPrefix}>\n <polygon points={clipPathPoints} />\n </clipPath>\n </defs>\n )}\n <g className=\"line-group\" onDoubleClick={onDoubleClick}>\n <path\n // This `path` is made for expanding interaction area of graph lines.\n d={line}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={lineConf.interactStrokeWidth}\n clipPath={clipPathUrl}\n />\n <path\n ref={pathRefCallback}\n className={classNames(\"line\", {\n dashed: lineConf.dashed,\n dotted: lineConf.dotted,\n [`${lineConf.dashed ? \"dashed\" : lineConf.dotted ? \"dotted\" : \"solid\"}-animation`]:\n lineConf.animate.useAnimate,\n })}\n clipPath={clipPathUrl}\n style={\n {\n \"--time\": `${lineConf.animate.duration ?? DEFAULT_LINE_INTERACT_ANIMATE_DURATION}s`,\n \"--solid-length\": pathLength,\n } as React.CSSProperties\n }\n d={line}\n fill=\"none\"\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n markerStart={markerStart}\n markerEnd={markerEnd}\n />\n {!lineConf.overrides?.active && (\n <path\n className=\"line-active-bg\"\n d={line}\n fill=\"none\"\n clipPath={clipPathUrl}\n />\n )}\n {\n // No dur in old browsers will cause animation not working.\n // So always set a dur.\n hasMotion && motionDuration && (\n <path\n className={classNames(\"motion\", { visible: !!motionPath })}\n d={motionPath}\n fill={strokeColor}\n >\n <animateMotion\n dur={motionDuration}\n repeatCount={\"indefinite\"}\n rotate={\"auto\"}\n path={line}\n />\n </path>\n )\n }\n </g>\n <LineLabelComponent\n edge={edge}\n position={labelPosition}\n offset={labelOffset}\n label={lineConf.label}\n text={lineConf.text}\n onClick={onLabelClick}\n onRendered={handleLabelRendered}\n />\n </>\n );\n}\n","import type {\n PositionTuple,\n SimpleRect,\n SizeTuple,\n} from \"../../diagram/interfaces\";\nimport type { PositionAndAngle } from \"../interfaces\";\n\nexport function getLabelMaskAndOffset(\n labelPosition: PositionAndAngle | null,\n labelSize: SizeTuple | null\n): [labelMask: SimpleRect | null, labelOffset: PositionTuple | null] {\n if (!labelPosition || !labelSize) {\n return [null, null];\n }\n const padding = 3;\n const [x, y, direction, angle, offset] = labelPosition;\n const [width, height] = labelSize;\n\n const left = x - width / 2 - padding;\n const top = y - height / 2 - padding;\n let offsetX = 0;\n let offsetY = 0;\n const halfWidth = width / 2 + padding;\n const halfHeight = height / 2 + padding;\n switch (direction) {\n case \"top\":\n offsetX = offset * Math.cos(angle) - halfHeight / Math.tan(angle);\n offsetY = offset * Math.sin(angle) - halfHeight;\n break;\n case \"bottom\":\n offsetX = offset * Math.cos(angle) + halfHeight / Math.tan(angle);\n offsetY = offset * Math.sin(angle) + halfHeight;\n break;\n case \"left\":\n offsetX = offset * Math.cos(angle) - halfWidth;\n offsetY = offset * Math.sin(angle) - halfWidth * Math.tan(angle);\n break;\n case \"right\":\n offsetX = offset * Math.cos(angle) + halfWidth;\n offsetY = offset * Math.sin(angle) + halfWidth * Math.tan(angle);\n break;\n }\n\n return [\n {\n left: left + offsetX,\n top: top + offsetY,\n width: width + padding * 2,\n height: height + padding * 2,\n },\n [offsetX, offsetY],\n ];\n}\n","import React from \"react\";\n\nexport interface LockIconProps {\n x: number;\n y: number;\n}\n\nexport function LockIcon({ x, y }: LockIconProps) {\n // 12 / 512 = 0.0234375\n return (\n <g\n transform={`translate(${x}, ${y}) scale(0.0234375)`}\n className=\"lock-icon\"\n >\n <path\n d=\"M144 144l0 48 160 0 0-48c0-44.2-35.8-80-80-80s-80 35.8-80 80zM80 192l0-48C80 64.5 144.5 0 224 0s144 64.5 144 144l0 48 16 0c35.3 0 64 28.7 64 64l0 192c0 35.3-28.7 64-64 64L64 512c-35.3 0-64-28.7-64-64L0 256c0-35.3 28.7-64 64-64l16 0z\"\n fill=\"var(--color-secondary-text)\"\n stroke=\"none\"\n />\n </g>\n );\n}\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { ReactUseBrick } from \"@next-core/react-runtime\";\nimport { __secret_internals, checkIfByTransform } from \"@next-core/runtime\";\nimport { isEqual } from \"lodash\";\nimport ResizeObserver from \"resize-observer-polyfill\";\nimport type {\n NodeBrickCell,\n NodeBrickConf,\n NodeCell,\n NodeComponentCell,\n} from \"./interfaces\";\nimport type { SizeTuple } from \"../diagram/interfaces\";\nimport { LockIcon } from \"./LockIcon\";\n\nexport interface NodeComponentProps {\n node: NodeCell;\n x?: number;\n y?: number;\n degraded: boolean;\n degradedNodeLabel?: string;\n defaultNodeBricks?: NodeBrickConf[];\n locked?: boolean;\n containerLocked?: boolean;\n onResize(id: string, size: SizeTuple | null): void;\n}\n\nexport function NodeComponent({\n node,\n x,\n y,\n degraded,\n degradedNodeLabel,\n defaultNodeBricks,\n locked,\n containerLocked,\n onResize,\n}: NodeComponentProps): JSX.Element | null {\n const memoizedData = useDeepMemo({\n node: { id: node.id, data: node.data, locked: !!locked },\n });\n const specifiedUseBrick = (node as NodeBrickCell).useBrick;\n const specifiedComponent = (node as NodeComponentCell).component;\n const observerRef = useRef<ResizeObserver | null>(null);\n\n const { useBrick, component: Component } =\n useMemo<\n Pick<NodeBrickConf, \"useBrick\" | \"component\"> | null | undefined\n >(() => {\n return degraded\n ? null\n : specifiedUseBrick\n ? {\n useBrick: specifiedUseBrick,\n }\n : specifiedComponent\n ? {\n component: specifiedComponent,\n }\n : defaultNodeBricks?.find((item) =>\n checkIfByTransform(item, memoizedData)\n );\n }, [\n defaultNodeBricks,\n degraded,\n memoizedData,\n specifiedComponent,\n specifiedUseBrick,\n ]) ?? {};\n\n const label = useMemo<string>(\n () =>\n degraded\n ? String(\n __secret_internals.legacyDoTransform(\n memoizedData,\n degradedNodeLabel ?? \"<% DATA.node.id %>\"\n )\n )\n : \"\",\n [degraded, degradedNodeLabel, memoizedData]\n );\n\n const brickRef = useRef<HTMLElement | null>(null);\n const xRef = useRef<number | undefined>(x);\n const yRef = useRef<number | undefined>(y);\n\n const refCallback = useCallback(\n (element: HTMLElement | null) => {\n brickRef.current = element;\n const prevObserver = observerRef.current;\n if (prevObserver) {\n prevObserver.disconnect();\n observerRef.current = null;\n }\n if (element) {\n if (xRef.current != null && yRef.current != null) {\n element.style.left = `${xRef.current}px`;\n element.style.top = `${yRef.current}px`;\n }\n // Todo: correctly wait for `useBrick` in v3 to be rendered (after layout)\n // Wait a macro task to let `useBrick` to be rendered.\n setTimeout(() => {\n const observer = new ResizeObserver(() => {\n onResize(node.id, [element.offsetWidth, element.offsetHeight]);\n });\n observer.observe(element);\n observerRef.current = observer;\n });\n } else {\n onResize(node.id, null);\n }\n },\n [node.id, onResize]\n );\n\n // Use position instead of transform, for clients\n // that hardware acceleration (GPU) is not available.\n useEffect(() => {\n xRef.current = x;\n yRef.current = y;\n const element = brickRef.current;\n if (element && x != null && y != null) {\n element.style.top = `${y}px`;\n element.style.left = `${x}px`;\n }\n }, [x, y]);\n\n const degradedRefCallBack = useCallback(\n (g: SVGGElement | null) => {\n if (g) {\n // istanbul ignore next\n const size =\n process.env.NODE_ENV === \"test\"\n ? { width: 60, height: 60 }\n : g.getBBox();\n onResize(node.id, [size.width, size.height]);\n } else {\n onResize(node.id, null);\n }\n },\n [node.id, onResize]\n );\n\n const foreignObjectRef = useRef<SVGForeignObjectElement | null>(null);\n\n // Workaround for Firefox bug:\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1644680\n // istanbul ignore next\n useEffect(() => {\n const fo = foreignObjectRef.current;\n if (!fo || !/firefox/i.test(navigator.userAgent)) {\n return;\n }\n fo.style.overflow = \"hidden\";\n // 延时 500ms 是经验值,实际测试如果机器性能较差,可能需要更长的时间。\n // MacBook Air M1 >= 100ms 可以工作,<= 50ms 则不行。\n const timeoutId = setTimeout(() => {\n fo.style.overflow = \"visible\";\n }, 500);\n return () => clearTimeout(timeoutId);\n }, []);\n\n return (\n <>\n {useBrick || Component ? (\n <foreignObject\n // Make a large size to avoid the brick inside to be clipped by the foreignObject.\n width={9999}\n height={9999}\n className=\"node\"\n ref={foreignObjectRef}\n >\n {Component ? (\n <Component {...memoizedData} refCallback={refCallback} />\n ) : (\n <ReactUseBrick\n useBrick={useBrick!}\n data={memoizedData}\n refCallback={refCallback}\n />\n )}\n </foreignObject>\n ) : degraded ? (\n <g className=\"degraded\" ref={degradedRefCallBack}>\n <circle cx={8} cy={8} r={8} />\n <text x={8} y={32}>\n {label}\n </text>\n </g>\n ) : null}\n {locked && !containerLocked && x != null && y != null && (\n <LockIcon x={x + node.view.width + 4} y={y + node.view.height - 12} />\n )}\n </>\n );\n}\n\nfunction useDeepMemo<T>(value: T): T {\n const [memoizedValue, setMemoizedValue] = useState(value);\n\n useEffect(() => {\n setMemoizedValue((prev) => (isEqual(prev, value) ? prev : value));\n }, [value]);\n\n return memoizedValue;\n}\n","import type { PositionTuple } from \"../../diagram/interfaces\";\nimport type { NodeView, SnapToObjectPosition } from \"../interfaces\";\n\nconst DEFAULT_ALL_POSITIONS = [\"center\", \"top\", \"bottom\", \"left\", \"right\"];\n\nexport type SnapPositions = Partial<\n Record<SnapToObjectPosition, PositionTuple>\n>;\n\nexport function getSnapPositions(\n view: NodeView,\n positions: string | undefined\n) {\n const snapPositions: SnapPositions = {};\n for (const position of positions\n ?.split(/\\s+/g)\n ?.flatMap((pos) => (pos === \"all\" ? DEFAULT_ALL_POSITIONS : pos)) ?? []) {\n let tuple: PositionTuple;\n const cx = view.x + view.width / 2;\n const cy = view.y + view.height / 2;\n switch (position) {\n case \"center\":\n tuple = [cx, cy];\n break;\n case \"top\":\n tuple = [cx, view.y];\n break;\n case \"right\":\n tuple = [view.x + view.width, cy];\n break;\n case \"bottom\":\n tuple = [cx, view.y + view.height];\n break;\n case \"left\":\n tuple = [view.x, cy];\n break;\n default:\n throw new Error(`Unknown snap position: \"${position}\"`);\n }\n snapPositions[position] = tuple;\n }\n return snapPositions;\n}\n","import type { PositionTuple } from \"../../diagram/interfaces\";\nimport type {\n ActiveTarget,\n Cell,\n LayoutOptions,\n DecoratorCell,\n LayoutType,\n NodeCell,\n SnapToObjectPosition,\n ActiveTargetOfSingular,\n EditableLineCell,\n} from \"../interfaces\";\nimport type {\n MoveCellPayload,\n ResizeCellPayload,\n} from \"../reducers/interfaces\";\nimport {\n isContainerDecoratorCell,\n isDecoratorCell,\n isEdgeCell,\n isLineDecoratorCell,\n isNodeCell,\n} from \"./asserts\";\nimport { cellToTarget } from \"./cellToTarget\";\nimport { getSnapPositions, type SnapPositions } from \"./getSnapPositions\";\nimport { getLockedContainerIds, isLocked } from \"./isLocked\";\nimport { normalizeSnapOptions } from \"./normalizeSnapOptions\";\nimport { sameTarget } from \"./sameTarget\";\nimport { targetIsActive } from \"./targetIsActive\";\n\nconst HORIZONTAL_POSITIONS = [\"left\", \"center\", \"right\"];\nconst VERTICAL_POSITIONS = [\"top\", \"center\", \"bottom\"];\n\nexport function handleMouseDown(\n event: MouseEvent,\n {\n action,\n cell,\n scale,\n layout,\n layoutOptions,\n activeTarget,\n cells,\n onCellsMoving,\n onCellsMoved,\n onCellResizing,\n onCellResized,\n onSwitchActiveTarget,\n updateCurActiveEditableLine,\n }: {\n action: \"move\" | \"resize\";\n cell: Cell;\n scale: number;\n layout?: LayoutType;\n layoutOptions?: LayoutOptions;\n activeTarget: ActiveTarget | null | undefined;\n cells: Cell[];\n onCellsMoving?(info: MoveCellPayload[]): void;\n onCellsMoved?(info: MoveCellPayload[]): void;\n onCellResizing?(info: ResizeCellPayload): void;\n onCellResized?(info: ResizeCellPayload): void;\n onSwitchActiveTarget?(activeTarget: ActiveTarget | null): void;\n updateCurActiveEditableLine?: (\n activeEditableLine: EditableLineCell | null\n ) => void;\n }\n) {\n event.stopPropagation();\n\n // Ignore contextmenu click\n if (event.button === 2 || (event.button === 0 && event.ctrlKey)) {\n return;\n }\n\n // Drag node\n const preActive = targetIsActive(cell, activeTarget);\n const lockedContainerIds = getLockedContainerIds(cells);\n let canUpdateActiveEditableLine = false;\n if (event.shiftKey) {\n const activeTargets = activeTarget\n ? activeTarget?.type === \"multi\"\n ? activeTarget.targets\n : [activeTarget]\n : [];\n let targets: ActiveTargetOfSingular[] = [];\n if (preActive) {\n targets = activeTargets.filter((target) => !sameTarget(target, cell));\n } else {\n targets = [...activeTargets, cell];\n canUpdateActiveEditableLine = true;\n }\n onSwitchActiveTarget?.(\n targets.length > 0 ? { type: \"multi\", targets } : null\n );\n } else {\n if (action === \"resize\" || !preActive) {\n onSwitchActiveTarget?.(cellToTarget(cell));\n canUpdateActiveEditableLine = true;\n }\n }\n\n if (isLocked(cell, lockedContainerIds)) {\n return;\n }\n\n if (\n canUpdateActiveEditableLine &&\n (isEdgeCell(cell) || isLineDecoratorCell(cell))\n ) {\n updateCurActiveEditableLine?.(cell);\n }\n\n if (isEdgeCell(cell)) {\n return;\n }\n\n const activeCells: Cell[] = [];\n const actives =\n activeTarget?.type === \"multi\" && action === \"move\"\n ? cells.filter((c) => targetIsActive(c, activeTarget))\n : [cell];\n actives.forEach((a) => {\n activeCells.push(a);\n if (action === \"move\" && isContainerDecoratorCell(a)) {\n activeCells.push(\n ...cells.filter(\n (c) => isNodeCell(c) && c.containerId === a.id && !actives.includes(c)\n )\n );\n }\n });\n const isAutoLayout = layout === \"force\" || layout === \"dagre\";\n const movableActiveCells = activeCells.filter(\n (c) =>\n !isLocked(c, lockedContainerIds) &&\n ((isNodeCell(c) && !isAutoLayout) || isDecoratorCell(c))\n ) as (NodeCell | DecoratorCell)[];\n\n if (movableActiveCells.length === 0) {\n return;\n }\n\n const snap = normalizeSnapOptions(layoutOptions?.snap);\n const snapToObjectPositions = snap.object?.positions;\n\n const from: PositionTuple = [event.clientX, event.clientY];\n const originals = movableActiveCells.map<{\n cell: NodeCell | DecoratorCell;\n position: PositionTuple;\n snapPositions: SnapPositions | null;\n }>((c) => ({\n cell: c,\n position:\n action === \"move\" ? [c.view.x, c.view.y] : [c.view.width, c.view.height],\n snapPositions:\n action === \"move\" && !isEdgeCell(c)\n ? getSnapPositions(c.view, snapToObjectPositions)\n : null,\n }));\n const firstOriginalPosition = originals[0].position;\n // let previousPositions = originals.map(({ position }) => position);\n\n // Get the positions of the objects (cells that are not active) to snap to\n let snapToObjectTargets: {\n cell: NodeCell | DecoratorCell;\n snapPositions: SnapPositions;\n }[] = [];\n if (action === \"move\" && snap.object) {\n const objectCells = cells.filter(\n // Edge and line cells are not snap targets\n (c) =>\n !isEdgeCell(c) && !isLineDecoratorCell(c) && !activeCells.includes(c)\n ) as (NodeCell | DecoratorCell)[];\n snapToObjectTargets = objectCells.map((c) => ({\n cell: c,\n snapPositions: getSnapPositions(c.view, snapToObjectPositions),\n }));\n }\n\n function getMovement(e: MouseEvent): PositionTuple {\n return [(e.clientX - from[0]) / scale, (e.clientY - from[1]) / scale];\n }\n let moved = false;\n\n const handleMove = (e: MouseEvent, finished?: boolean) => {\n // Respect the scale\n const movement = getMovement(e);\n const snapMovement: PositionTuple = [...movement];\n let newPositions: PositionTuple[];\n let xAlign: [PositionTuple, PositionTuple] | undefined;\n let yAlign: [PositionTuple, PositionTuple] | undefined;\n let xAlignCell: Cell | undefined;\n let yAlignCell: Cell | undefined;\n\n if (!moved) {\n moved = movement[0] ** 2 + movement[1] ** 2 >= 9;\n }\n\n // Use alt key (or option key ⌥ on Mac) to disable snap\n if ((!snap.grid && !snap.object) || e.altKey) {\n // No snap\n newPositions = originals.map(({ position }) => [\n position[0] + movement[0],\n position[1] + movement[1],\n ]);\n } else {\n // Snap\n let diffX = Infinity;\n let diffY = Infinity;\n\n if (snap.object) {\n const snapToObjectDistance = snap.object.distance;\n let xAlignFrom: PositionTuple | undefined;\n let yAlignFrom: PositionTuple | undefined;\n let xAlignTarget: NodeCell | DecoratorCell | undefined;\n let yAlignTarget: NodeCell | DecoratorCell | undefined;\n let xAlignToY = 0;\n let yAlignToX = 0;\n for (const {\n cell: target,\n snapPositions: targetPositions,\n // center: [x, y],\n } of snapToObjectTargets) {\n for (const {\n cell: c,\n snapPositions: originalPositions,\n } of originals) {\n for (const [position, originalPoint] of Object.entries(\n originalPositions!\n )) {\n const horizontal = HORIZONTAL_POSITIONS.includes(position);\n const vertical = VERTICAL_POSITIONS.includes(position);\n const [x, y] = targetPositions[position as SnapToObjectPosition]!;\n const [cx, cy] = originalPoint!;\n if (horizontal) {\n const dX = Math.abs(cx + movement[0] - x);\n const xSnapped = dX < snapToObjectDistance && dX < diffX;\n if (xSnapped) {\n diffX = dX;\n snapMovement[0] = x - cx;\n xAlignCell = c;\n xAlignTarget = target;\n xAlignFrom = [x, y];\n xAlignToY = cy;\n }\n }\n if (vertical) {\n const dY = Math.abs(cy + movement[1] - y);\n const ySnapped = dY < snapToObjectDistance && dY < diffY;\n if (ySnapped) {\n diffY = dY;\n snapMovement[1] = y - cy;\n yAlignCell = c;\n yAlignTarget = target;\n yAlignFrom = [x, y];\n yAlignToX = cx;\n }\n }\n }\n }\n }\n\n if (xAlignTarget && xAlignTarget === yAlignTarget) {\n // Handle special case when both x and y are snapped to the same target.\n const halfHeight = xAlignTarget.view.height / 2;\n const halfWidth = xAlignTarget.view.width / 2;\n xAlign = [\n [xAlignFrom![0], xAlignFrom![1] - halfHeight],\n [xAlignFrom![0], xAlignFrom![1] + halfHeight],\n ];\n yAlign = [\n [yAlignFrom![0] - halfWidth, yAlignFrom![1]],\n [yAlignFrom![0] + halfWidth, yAlignFrom![1]],\n ];\n } else {\n if (xAlignFrom) {\n xAlign = [xAlignFrom, [xAlignFrom[0], xAlignToY + snapMovement[1]]];\n }\n if (yAlignFrom) {\n yAlign = [yAlignFrom, [yAlignToX + snapMovement[0], yAlignFrom[1]]];\n }\n }\n }\n\n if (snap.grid) {\n const snapToGridSize = snap.grid.size;\n // Use the first cell to decide the snap to grid position\n const firstNewPosition: PositionTuple = [\n Math.round(\n (firstOriginalPosition[0] + movement[0]) / snapToGridSize\n ) * snapToGridSize,\n Math.round(\n (firstOriginalPosition[1] + movement[1]) / snapToGridSize\n ) * snapToGridSize,\n ];\n const snapToGridMovement: PositionTuple = [\n firstNewPosition[0] - firstOriginalPosition[0],\n firstNewPosition[1] - firstOriginalPosition[1],\n ];\n const snapToGridDiffX = Math.abs(snapToGridMovement[0] - movement[0]);\n const snapToGridDiffY = Math.abs(snapToGridMovement[1] - movement[1]);\n if (snapToGridDiffX < diffX) {\n diffX = snapToGridDiffX;\n snapMovement[0] = snapToGridMovement[0];\n xAlign = undefined;\n xAlignCell = undefined;\n }\n if (snapToGridDiffY < diffY) {\n diffY = snapToGridDiffY;\n snapMovement[1] = snapToGridMovement[1];\n yAlign = undefined;\n yAlignCell = undefined;\n }\n }\n\n newPositions = originals.map(({ position }) => [\n position[0] + snapMovement[0],\n position[1] + snapMovement[1],\n ]);\n }\n\n if (moved) {\n if (action === \"move\") {\n const payloads = originals.map(({ cell: c }, index) => ({\n type: c.type,\n id: c.id,\n x: newPositions[index][0],\n y: newPositions[index][1],\n width: c.view.width,\n height: c.view.height,\n decorator: isDecoratorCell(c) ? c.decorator : undefined,\n guideLines: finished\n ? undefined\n : [\n ...(xAlignCell === c ? [xAlign!] : []),\n ...(yAlignCell === c ? [yAlign!] : []),\n ],\n ...(isLineDecoratorCell(c)\n ? {\n source: {\n x: c.view.source.x + snapMovement[0],\n y: c.view.source.y + snapMovement[1],\n },\n target: {\n x: c.view.target.x + snapMovement[0],\n y: c.view.target.y + snapMovement[1],\n },\n vertices: c.view.vertices?.map((v) => ({\n x: v.x + snapMovement[0],\n y: v.y + snapMovement[1],\n })),\n }\n : null),\n }));\n (finished ? onCellsMoved : onCellsMoving)?.(payloads);\n } else {\n (finished ? onCellResized : onCellResizing)?.({\n type: cell.type,\n id: cell.id,\n width: newPositions[0][0],\n height: newPositions[0][1],\n });\n }\n }\n };\n\n const onMouseMove = (e: MouseEvent) => {\n handleMove(e);\n };\n const onMouseUp = (e: MouseEvent) => {\n handleMove(e, true);\n moved = false;\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n}\n","import {\n DEFAULT_SNAP_GRID_SIZE,\n DEFAULT_SNAP_OBJECT_DISTANCE,\n DEFAULT_SNAP_OBJECT_POSITIONS,\n} from \"../constants\";\nimport type {\n SnapOptions,\n SnapToGridOptions,\n SnapToObjectOptions,\n} from \"../interfaces\";\n\nexport interface NormalizedSnapOptions {\n grid: Required<SnapToGridOptions> | null;\n object: Required<SnapToObjectOptions> | null;\n}\n\nexport function normalizeSnapOptions(\n snap: boolean | SnapOptions | undefined\n): NormalizedSnapOptions {\n const intermediateSnap = snap\n ? snap === true\n ? { grid: true, object: true }\n : snap\n : null;\n const snapToGrid = intermediateSnap?.grid\n ? intermediateSnap.grid === true\n ? {}\n : intermediateSnap.grid\n : null;\n const snapToObject = intermediateSnap?.object\n ? intermediateSnap.object === true\n ? {}\n : intermediateSnap.object\n : null;\n return {\n grid: snapToGrid\n ? { size: snapToGrid.size ?? DEFAULT_SNAP_GRID_SIZE }\n : null,\n object: snapToObject\n ? {\n distance: snapToObject.distance ?? DEFAULT_SNAP_OBJECT_DISTANCE,\n positions: snapToObject.positions ?? DEFAULT_SNAP_OBJECT_POSITIONS,\n }\n : null,\n };\n}\n","// istanbul ignore file: compatibility workaround\nimport type { HTMLAttributes } from \"react\";\n\nlet _supports: boolean | undefined;\n\nfunction supportsContentEditablePlaintextOnly(): boolean {\n if (typeof _supports !== \"boolean\") {\n const div = document.createElement(\"div\");\n div.setAttribute(\"contenteditable\", \"PLAINTEXT-ONLY\");\n _supports = div.contentEditable === \"plaintext-only\";\n }\n return _supports;\n}\n\nexport function getContentEditable(\n editable: boolean\n): HTMLAttributes<HTMLDivElement>[\"contentEditable\"] {\n return editable\n ? supportsContentEditablePlaintextOnly()\n ? \"plaintext-only\"\n : \"true\"\n : \"false\";\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { BasicDecoratorProps } from \"../interfaces\";\nimport classNames from \"classnames\";\nimport { LockIcon } from \"../LockIcon\";\nimport { getContentEditable } from \"../processors/getContentEditable\";\n\nexport type DecoratorTextProps = Pick<\n BasicDecoratorProps,\n | \"cell\"\n | \"readOnly\"\n | \"locked\"\n | \"onDecoratorTextEditing\"\n | \"onDecoratorTextChange\"\n>;\n\nexport function DecoratorText({\n cell,\n readOnly,\n locked,\n onDecoratorTextEditing,\n onDecoratorTextChange,\n}: DecoratorTextProps): JSX.Element {\n const label = cell.view.text ?? \"\";\n const [currentLabel, setCurrentLabel] = useState<string>(label);\n const [editingLabel, setEditingLabel] = useState(false);\n const editingLabelInitialized = useRef(false);\n const [shouldEmitLabelChange, setShouldEmitLabelChange] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n const handleEnableEdit = useCallback(\n (e: React.MouseEvent) => {\n if (readOnly || locked) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n setEditingLabel(true);\n },\n [readOnly, locked]\n );\n\n useEffect(() => {\n const element = ref.current;\n if (element && element.textContent !== currentLabel) {\n element.textContent = currentLabel;\n }\n }, [currentLabel]);\n useEffect(() => {\n const parentElement = ref.current?.parentElement;\n if (parentElement) {\n cell.view.width = parentElement.clientWidth;\n cell.view.height = parentElement.clientHeight;\n }\n }, [currentLabel, cell.id]);\n\n useEffect(() => {\n if (editingLabel && ref.current) {\n ref.current.focus();\n selectAllText(ref.current);\n }\n onDecoratorTextEditing?.({ id: cell.id, editing: editingLabel });\n }, [cell.id, editingLabel, onDecoratorTextEditing]);\n\n useEffect(() => {\n if (editingLabelInitialized.current) {\n onDecoratorTextEditing?.({ id: cell.id, editing: editingLabel });\n } else {\n editingLabelInitialized.current = true;\n }\n }, [cell.id, editingLabel, onDecoratorTextEditing]);\n\n const handleInput = useCallback(\n (event: React.FormEvent<HTMLDivElement>) => {\n if (readOnly) {\n return;\n }\n setCurrentLabel((event.target as HTMLDivElement).textContent!);\n },\n [readOnly]\n );\n\n const handleBlur = useCallback(() => {\n if (readOnly) {\n return;\n }\n setEditingLabel(false);\n setShouldEmitLabelChange(true);\n }, [readOnly]);\n\n useEffect(() => {\n if (shouldEmitLabelChange) {\n onDecoratorTextChange?.({\n id: cell.id,\n view: { ...cell.view, text: currentLabel },\n });\n setShouldEmitLabelChange(false);\n }\n }, [cell, currentLabel, onDecoratorTextChange, shouldEmitLabelChange]);\n\n return (\n <>\n <foreignObject className=\"decorator-text\" width=\"9999\" height=\"9999\">\n <div\n className={classNames(\"text-container\", { editing: editingLabel })}\n onDoubleClick={handleEnableEdit}\n style={cell.view.style}\n >\n <div\n className=\"text\"\n contentEditable={getContentEditable(editingLabel)}\n ref={ref}\n onInput={handleInput}\n onBlur={handleBlur}\n />\n </div>\n </foreignObject>\n {locked && (\n <LockIcon x={cell.view.width} y={(cell.view.height - 12) / 2} />\n )}\n </>\n );\n}\n\nexport function selectAllText(element: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(element);\n const selection = window.getSelection()!;\n selection.removeAllRanges();\n selection.addRange(range);\n}\n","import React from \"react\";\nimport type { BasicDecoratorProps, DecoratorType } from \"../interfaces\";\nimport { DecoratorArea } from \"./DecoratorArea\";\nimport { DecoratorText } from \"./DecoratorText\";\nimport { DecoratorContainer } from \"./DecoratorContainer\";\nimport { DecoratorRect } from \"./DecoratorRect\";\nimport { DecoratorLine } from \"./DecoratorLine\";\n\nconst decoratorComponents = new Map<\n DecoratorType,\n React.ComponentType<BasicDecoratorProps>\n>([\n [\"container\", DecoratorContainer],\n [\"area\", DecoratorArea],\n [\"text\", DecoratorText],\n [\"rect\", DecoratorRect],\n [\"line\", DecoratorLine],\n]);\n\nexport function DecoratorComponent({\n cell,\n view,\n transform,\n readOnly,\n layout,\n layoutOptions,\n active,\n activeTarget,\n cells,\n lineConfMap,\n editableLineMap,\n locked,\n onCellResizing,\n onCellResized,\n onSwitchActiveTarget,\n onDecoratorTextEditing,\n onDecoratorTextChange,\n}: BasicDecoratorProps): JSX.Element | null {\n const SpecifiedComponent = decoratorComponents.get(cell.decorator);\n\n if (!SpecifiedComponent) {\n // eslint-disable-next-line no-console\n console.error(`Unknown decorator: ${cell.decorator}`);\n return null;\n }\n\n return (\n <SpecifiedComponent\n cell={cell}\n view={view}\n transform={transform}\n readOnly={readOnly}\n layout={layout}\n layoutOptions={layoutOptions}\n active={active}\n activeTarget={activeTarget}\n cells={cells}\n lineConfMap={lineConfMap}\n editableLineMap={editableLineMap}\n locked={locked}\n onCellResizing={onCellResizing}\n onCellResized={onCellResized}\n onSwitchActiveTarget={onSwitchActiveTarget}\n onDecoratorTextEditing={onDecoratorTextEditing}\n onDecoratorTextChange={onDecoratorTextChange}\n />\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { BasicDecoratorProps } from \"../interfaces\";\nimport { handleMouseDown } from \"../processors/handleMouseDown\";\nimport classNames from \"classnames\";\nimport { get } from \"lodash\";\nimport { selectAllText } from \"./DecoratorText\";\nimport { isNoManualLayout } from \"../processors/asserts\";\nimport { uuidV4 } from \"..\";\nimport { LockIcon } from \"../LockIcon\";\nimport { getContentEditable } from \"../processors/getContentEditable\";\n\nexport function DecoratorContainer({\n cell,\n transform,\n readOnly,\n layout,\n view,\n activeTarget,\n cells,\n locked,\n onCellResizing,\n onCellResized,\n onSwitchActiveTarget,\n onDecoratorTextEditing,\n onDecoratorTextChange,\n}: BasicDecoratorProps): JSX.Element {\n const label = get(cell.view, \"text\", \"\");\n const direction = get(cell.view, \"direction\", \"top\");\n const textRef = useRef<HTMLDivElement>(null);\n const resizeHandleRef = React.useRef<SVGGElement>(null);\n const [editingLabel, setEditingLabel] = useState(false);\n const [currentLabel, setCurrentLabel] = useState<string>(label);\n const [shouldEmitLabelChange, setShouldEmitLabelChange] = useState(false);\n const [recomputation, setRecomputation] = useState<string>();\n const [titleForeignRect, setTitleForeignRect] = useState({\n x: 0,\n y: 0,\n width: cell.view.width,\n height: cell.view.height,\n });\n const handleEnableEdit = useCallback(\n (e: React.MouseEvent) => {\n if (readOnly || locked) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n setEditingLabel(true);\n },\n [readOnly, locked]\n );\n const handleInput = useCallback(\n (event: React.FormEvent<HTMLDivElement>) => {\n if (readOnly) {\n return;\n }\n setCurrentLabel((event.target as HTMLDivElement).textContent!);\n },\n [readOnly]\n );\n\n const handleBlur = useCallback(() => {\n if (readOnly) {\n return;\n }\n setEditingLabel(false);\n setShouldEmitLabelChange(true);\n setRecomputation(uuidV4());\n }, [readOnly]);\n\n useEffect(() => {\n setCurrentLabel(label);\n }, [label]);\n useEffect(() => {\n const element = textRef.current;\n if (element && element.textContent !== currentLabel) {\n element.textContent = currentLabel;\n }\n }, [currentLabel]);\n\n useEffect(() => {\n const textParentEle = textRef.current?.parentElement;\n if (textParentEle) {\n const { clientWidth, clientHeight } = textParentEle;\n if ([\"left\", \"right\"].includes(direction)) {\n const rect = {\n width: clientWidth,\n height: view.height,\n x: direction === \"left\" ? -clientWidth : view.width,\n y: 0,\n };\n setTitleForeignRect(rect);\n } else {\n const rect = {\n width: view.width,\n height: clientHeight,\n x: 0,\n y: direction === \"top\" ? -clientHeight : view.height,\n };\n setTitleForeignRect(rect);\n }\n }\n }, [view, currentLabel, direction, recomputation]);\n\n useEffect(() => {\n if (editingLabel && textRef.current) {\n textRef.current.focus();\n selectAllText(textRef.current);\n }\n onDecoratorTextEditing?.({ id: cell.id, editing: editingLabel });\n }, [cell.id, editingLabel, onDecoratorTextEditing]);\n\n useEffect(() => {\n if (shouldEmitLabelChange) {\n onDecoratorTextChange?.({\n id: cell.id,\n view: { ...view, text: currentLabel },\n });\n setShouldEmitLabelChange(false);\n }\n }, [cell, view, currentLabel, onDecoratorTextChange, shouldEmitLabelChange]);\n\n useEffect(() => {\n const resizeHandle = resizeHandleRef.current;\n if (!resizeHandle || readOnly) {\n return;\n }\n const onMouseDown = (event: MouseEvent) => {\n handleMouseDown(event, {\n action: \"resize\",\n cell,\n scale: transform.k,\n activeTarget,\n cells,\n onCellResizing,\n onCellResized,\n onSwitchActiveTarget,\n });\n };\n resizeHandle.addEventListener(\"mousedown\", onMouseDown);\n return () => {\n resizeHandle.removeEventListener(\"mousedown\", onMouseDown);\n };\n }, [\n activeTarget,\n cell,\n cells,\n onCellResized,\n onCellResizing,\n onSwitchActiveTarget,\n readOnly,\n transform.k,\n ]);\n\n return (\n <g className=\"decorator-container\">\n <foreignObject {...titleForeignRect}>\n <div\n className={classNames(\"text-container\", {\n editing: editingLabel,\n [[\"left\", \"right\"].includes(direction) ? \"vertical\" : \"horizontal\"]:\n true,\n })}\n onDoubleClick={handleEnableEdit}\n style={cell.view.titleStyle}\n >\n <div\n className=\"text\"\n contentEditable={getContentEditable(editingLabel)}\n ref={textRef}\n onInput={handleInput}\n onBlur={handleBlur}\n />\n </div>\n </foreignObject>\n <foreignObject className=\"container-wrapper\">\n <div\n className=\"container\"\n style={{\n ...cell.view.style,\n width: view.width,\n height: view.height,\n }}\n />\n </foreignObject>\n {!readOnly && !locked && !isNoManualLayout(layout) && (\n <g\n ref={resizeHandleRef}\n className=\"resize-handle\"\n transform={`translate(${view.width - 20} ${view.height - 20})`}\n >\n <rect width={20} height={20} />\n <path d=\"M10 18L18 10 M15 18L18 15\" />\n </g>\n )}\n {locked && (\n <LockIcon x={cell.view.width - 16} y={cell.view.height - 16} />\n )}\n </g>\n );\n}\n","import React, { useEffect } from \"react\";\nimport type { BasicDecoratorProps } from \"../interfaces\";\nimport { handleMouseDown } from \"../processors/handleMouseDown\";\nimport { LockIcon } from \"../LockIcon\";\n\nexport function DecoratorArea({\n cell,\n transform,\n readOnly,\n layoutOptions,\n activeTarget,\n cells,\n locked,\n onCellResizing,\n onCellResized,\n onSwitchActiveTarget,\n}: BasicDecoratorProps): JSX.Element {\n const resizeHandleRef = React.useRef<SVGGElement>(null);\n\n useEffect(() => {\n const resizeHandle = resizeHandleRef.current;\n if (!resizeHandle || readOnly) {\n return;\n }\n const onMouseDown = (event: MouseEvent) => {\n handleMouseDown(event, {\n action: \"resize\",\n cell,\n scale: transform.k,\n layoutOptions,\n activeTarget,\n cells,\n onCellResizing,\n onCellResized,\n onSwitchActiveTarget,\n });\n };\n resizeHandle.addEventListener(\"mousedown\", onMouseDown);\n return () => {\n resizeHandle.removeEventListener(\"mousedown\", onMouseDown);\n };\n }, [\n activeTarget,\n cell,\n cells,\n layoutOptions,\n onCellResized,\n onCellResizing,\n onSwitchActiveTarget,\n readOnly,\n transform.k,\n ]);\n\n return (\n <g className=\"decorator-area-container\">\n <foreignObject className=\"decorator-area\" width=\"9999\" height=\"9999\">\n <div\n className=\"area\"\n style={{\n ...cell.view.style,\n width: cell.view.width,\n height: cell.view.height,\n }}\n />\n </foreignObject>\n {!readOnly && !locked && (\n <g\n ref={resizeHandleRef}\n className=\"resize-handle\"\n transform={`translate(${cell.view.width - 20} ${cell.view.height - 20})`}\n >\n <rect width={20} height={20} />\n <path d=\"M10 18L18 10 M15 18L18 15\" />\n </g>\n )}\n {locked && (\n <LockIcon x={cell.view.width - 16} y={cell.view.height - 16} />\n )}\n </g>\n );\n}\n","import React, { useEffect } from \"react\";\nimport type { BasicDecoratorProps } from \"../interfaces\";\nimport { handleMouseDown } from \"../processors/handleMouseDown\";\nimport { isNoManualLayout } from \"../processors/asserts\";\nimport { LockIcon } from \"../LockIcon\";\n\nexport type DecoratorRectProps = Omit<\n BasicDecoratorProps,\n \"lineConfMap\" | \"editableLineMap\"\n>;\n\nexport function DecoratorRect({\n cell,\n transform,\n readOnly,\n layout,\n view,\n activeTarget,\n cells,\n locked,\n onCellResizing,\n onCellResized,\n onSwitchActiveTarget,\n}: DecoratorRectProps): JSX.Element {\n const resizeHandleRef = React.useRef<SVGGElement>(null);\n\n useEffect(() => {\n const resizeHandle = resizeHandleRef.current;\n if (!resizeHandle || readOnly) {\n return;\n }\n const onMouseDown = (event: MouseEvent) => {\n handleMouseDown(event, {\n action: \"resize\",\n cell,\n scale: transform.k,\n layout,\n activeTarget,\n cells,\n onCellResizing,\n onCellResized,\n onSwitchActiveTarget,\n });\n };\n resizeHandle.addEventListener(\"mousedown\", onMouseDown);\n return () => {\n resizeHandle.removeEventListener(\"mousedown\", onMouseDown);\n };\n }, [\n activeTarget,\n cell,\n cells,\n onCellResized,\n onCellResizing,\n onSwitchActiveTarget,\n readOnly,\n transform.k,\n layout,\n ]);\n\n return (\n <g className=\"decorator-rect-container\">\n <foreignObject className=\"decorator-rect\" width=\"9999\" height=\"9999\">\n <div\n className=\"rect-container\"\n style={{\n ...cell.view.style,\n width: view.width,\n height: view.height,\n }}\n />\n </foreignObject>\n {!readOnly && !locked && !isNoManualLayout(layout) && (\n <g\n ref={resizeHandleRef}\n className=\"resize-handle\"\n transform={`translate(${view.width - 20} ${view.height - 20})`}\n >\n <rect width={20} height={20} />\n <path d=\"M10 18L18 10 M15 18L18 15\" />\n </g>\n )}\n {locked && (\n <LockIcon x={cell.view.width - 16} y={cell.view.height - 16} />\n )}\n </g>\n );\n}\n","import React, { useCallback, useMemo, useRef } from \"react\";\nimport classNames from \"classnames\";\nimport type { BasicDecoratorProps } from \"../interfaces\";\nimport { getMarkers } from \"../../shared/canvas/useLineMarkers\";\nimport type { LineMarkerConf } from \"../../diagram/interfaces\";\nimport { curveLine } from \"../../diagram/lines/curveLine\";\nimport { LockIcon } from \"../LockIcon\";\nimport { getLineLockIconPosition } from \"../processors/getLineLockIconPosition\";\n\nexport type DecoratorLineProps = Pick<\n BasicDecoratorProps,\n \"cell\" | \"active\" | \"locked\" | \"lineConfMap\" | \"editableLineMap\"\n>;\n\nexport function DecoratorLine({\n cell,\n active,\n lineConfMap,\n editableLineMap,\n locked,\n}: DecoratorLineProps): JSX.Element | null {\n const lineConf = lineConfMap.get(cell);\n const { points: linePoints, jumpsMap } = editableLineMap.get(cell) ?? {};\n\n const line = useMemo(() => {\n // istanbul ignore next: defensive check\n if (!lineConf) {\n return null;\n }\n return curveLine(\n linePoints,\n lineConf.type === \"curve\" ? lineConf.curveType : \"curveLinear\",\n 0,\n 1,\n jumpsMap\n );\n }, [lineConf, linePoints, jumpsMap]);\n\n const pathRef = useRef<SVGPathElement | null>(null);\n const pathRefCallback = useCallback(\n (element: SVGPathElement | null) => {\n pathRef.current = element;\n // istanbul ignore next: Jest does not support `SVGPathElement::getBBox`\n if (element && process.env.NODE_ENV !== \"test\") {\n const rect = element.getBBox();\n cell.view = {\n ...cell.view,\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n };\n }\n },\n [cell]\n );\n\n const lockedPosition = useMemo(\n () => (locked && linePoints ? getLineLockIconPosition(linePoints) : null),\n [locked, linePoints]\n );\n\n if (!line || !lineConf) {\n return null;\n }\n\n let markerStart: string | undefined;\n let markerEnd: string | undefined;\n let strokeColor: string | undefined;\n let strokeWidth: number | undefined;\n const lineMarkers: LineMarkerConf[] = getMarkers(lineConf);\n if (active) {\n const overrides = lineConf.overrides?.active;\n strokeColor = overrides?.strokeColor ?? lineConf.strokeColor;\n strokeWidth = overrides?.strokeWidth ?? lineConf.strokeWidth;\n // motion = overrides?.motion;\n for (const marker of lineMarkers) {\n if (marker.placement === \"start\") {\n markerStart =\n lineConf.$activeMarkerStartUrl ?? lineConf.$markerStartUrl;\n } else {\n markerEnd = lineConf.$activeMarkerEndUrl ?? lineConf.$markerEndUrl;\n }\n }\n } else {\n strokeColor = lineConf.strokeColor;\n strokeWidth = lineConf.strokeWidth;\n for (const marker of lineMarkers) {\n if (marker.placement === \"start\") {\n markerStart = lineConf.$markerStartUrl;\n } else {\n markerEnd = lineConf.$markerEndUrl;\n }\n }\n }\n\n return (\n <g className=\"decorator-line\">\n <path\n // This `path` is made for expanding interaction area of graph lines.\n d={line}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={lineConf.interactStrokeWidth}\n />\n <path\n className={classNames(\"line\", {\n dashed: lineConf.dashed,\n dotted: lineConf.dotted,\n })}\n ref={pathRefCallback}\n d={line}\n fill=\"none\"\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n markerStart={markerStart}\n markerEnd={markerEnd}\n />\n {locked && <LockIcon x={lockedPosition!.x} y={lockedPosition!.y} />}\n </g>\n );\n}\n","import type { NodePosition } from \"../../diagram/interfaces\";\n\nexport function getLineLockIconPosition(\n linePoints: NodePosition[]\n): NodePosition {\n const lastPoint = linePoints[linePoints.length - 1];\n if (linePoints.length < 2) {\n return {\n x: lastPoint.x + 16,\n y: lastPoint.y - 6,\n };\n }\n\n const firstPoint = linePoints[0];\n const dy = lastPoint.y - firstPoint.y;\n const dx = lastPoint.x - firstPoint.x;\n\n let useEndPoint: boolean;\n if (Math.abs(dy) > Math.abs(dx)) {\n useEndPoint = dy > 0;\n } else {\n useEndPoint = dx > 0;\n }\n\n const point1 = useEndPoint\n ? linePoints[linePoints.length - 2]\n : linePoints[1];\n const point2 = useEndPoint ? lastPoint : firstPoint;\n\n const angle = Math.atan2(point2.y - point1.y, point2.x - point1.x);\n const twistedAngle = angle - (Math.PI * 3) / 4;\n const distance = 16;\n return {\n x: point2.x + Math.cos(twistedAngle) * distance - 6,\n y: point2.y + Math.sin(twistedAngle) * distance - 6,\n };\n}\n","import { BaseNodeCell } from \"../interfaces\";\n\nexport function computeContainerRect(cells: BaseNodeCell[]) {\n let minX = Infinity,\n minY = Infinity;\n let maxX = -Infinity,\n maxY = -Infinity;\n cells.forEach((cell) => {\n const { x, y, width, height } = cell.view;\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x + width > maxX) maxX = x + width;\n if (y + height > maxY) maxY = y + height;\n });\n if (![minX, maxX, minY, maxY].some((n) => isFinite(n))) return {};\n const padding = 20;\n const width = maxX - minX + padding * 2;\n const height = maxY - minY + padding * 2;\n return {\n x: minX - padding,\n y: minY - padding,\n width: width,\n height: height,\n };\n}\n","import React, { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport classNames from \"classnames\";\nimport type {\n ActiveTarget,\n Cell,\n CellContextMenuDetail,\n ComputedEdgeLineConf,\n DecoratorTextChangeDetail,\n DecoratorView,\n LayoutOptions,\n LayoutType,\n NodeBrickConf,\n NodeCell,\n EditableLine,\n EditableLineCell,\n EditableEdgeLine,\n CellClickDetail,\n} from \"./interfaces\";\nimport {\n isContainerDecoratorCell,\n isDecoratorCell,\n isEdgeCell,\n isEdgeSide,\n isLineDecoratorCell,\n isNoManualLayout,\n isNodeCell,\n} from \"./processors/asserts\";\nimport { EdgeComponent } from \"./EdgeComponent\";\nimport { NodeComponent } from \"./NodeComponent\";\nimport { handleMouseDown } from \"./processors/handleMouseDown\";\nimport type { MoveCellPayload, ResizeCellPayload } from \"./reducers/interfaces\";\nimport { DecoratorComponent } from \"./decorators\";\nimport { cellToTarget } from \"./processors/cellToTarget\";\nimport type { SizeTuple, TransformLiteral } from \"../diagram/interfaces\";\nimport { sameTarget } from \"./processors/sameTarget\";\nimport { targetIsActive } from \"./processors/targetIsActive\";\nimport { computeContainerRect } from \"./processors/computeContainerRect\";\nimport { get } from \"lodash\";\nimport { useHoverStateContext } from \"./HoverStateContext\";\nexport interface CellComponentProps {\n layout: LayoutType;\n layoutOptions?: LayoutOptions;\n cell: Cell;\n cells: Cell[];\n degraded: boolean;\n degradedNodeLabel?: string;\n defaultNodeBricks?: NodeBrickConf[];\n transform: TransformLiteral;\n lineConfMap: WeakMap<EditableLineCell, ComputedEdgeLineConf>;\n editableLineMap: WeakMap<EditableLineCell, EditableLine>;\n activeTarget: ActiveTarget | null | undefined;\n readOnly?: boolean;\n hoverCell?: Cell | null | undefined;\n unrelatedCells: Cell[];\n dragoverContainer?: boolean;\n allowEdgeToArea?: boolean;\n curActiveEditableLine?: EditableLineCell | null;\n locked?: boolean;\n containerLocked?: boolean;\n updateCurActiveEditableLine?: (\n activeEditableLine: EditableLineCell | null\n ) => void;\n onCellsMoving?(info: MoveCellPayload[]): void;\n onCellsMoved?(info: MoveCellPayload[]): void;\n onCellResizing?(info: ResizeCellPayload): void;\n onCellResized?(info: ResizeCellPayload): void;\n onSwitchActiveTarget(target: ActiveTarget | null): void;\n onCellContextMenu(detail: CellContextMenuDetail): void;\n onCellClick?(detail: CellClickDetail): void;\n onDecoratorTextEditing?(detail: { id: string; editing: boolean }): void;\n onDecoratorTextChange?(detail: DecoratorTextChangeDetail): void;\n onNodeBrickResize(id: string, size: SizeTuple | null): void;\n onCellMouseEnter?(cell: Cell): void;\n onCellMouseLeave?(cell: Cell): void;\n}\n\nexport function CellComponent({\n layout,\n layoutOptions,\n cell,\n cells,\n degraded,\n degradedNodeLabel,\n defaultNodeBricks,\n lineConfMap,\n editableLineMap,\n activeTarget,\n dragoverContainer,\n readOnly,\n transform,\n hoverCell,\n unrelatedCells,\n allowEdgeToArea,\n curActiveEditableLine,\n locked,\n containerLocked,\n updateCurActiveEditableLine,\n onCellsMoving,\n onCellsMoved,\n onCellResizing,\n onCellResized,\n onSwitchActiveTarget,\n onCellContextMenu,\n onCellClick,\n onDecoratorTextEditing,\n onDecoratorTextChange,\n onNodeBrickResize,\n onCellMouseEnter,\n onCellMouseLeave,\n}: CellComponentProps): JSX.Element | null {\n const {\n lineEditorState,\n smartConnectLineState,\n setSmartConnectLineState,\n onConnect,\n setLineEditorState,\n onChangeEdgeView,\n } = useHoverStateContext();\n const gRef = useRef<SVGGElement>(null);\n const unrelated = useMemo(\n () => unrelatedCells.some((item) => sameTarget(item, cell)),\n [cell, unrelatedCells]\n );\n\n const containerRect = useMemo((): DecoratorView | undefined => {\n if (isContainerDecoratorCell(cell) && isNoManualLayout(layout)) {\n const containCells = cells.filter(\n (c): c is NodeCell => isNodeCell(c) && c.containerId === cell.id\n );\n const view = {\n ...cell.view,\n ...computeContainerRect(containCells),\n };\n cell.view = view; //Update the rect container to make sure Lasso gets the correct size\n return view;\n }\n return isEdgeCell(cell) || isLineDecoratorCell(cell)\n ? undefined\n : get(cell, \"view\", { x: 0, y: 0, width: 0, height: 0 });\n }, [layout, cell, cells]);\n\n useEffect(() => {\n const g = gRef.current;\n if (!g) {\n return;\n }\n const onMouseDown = (event: MouseEvent) => {\n if (\n readOnly ||\n (isContainerDecoratorCell(cell) && isNoManualLayout(layout))\n ) {\n event.stopPropagation();\n } else {\n handleMouseDown(event, {\n layout,\n layoutOptions,\n action: \"move\",\n cell,\n scale: transform.k,\n activeTarget,\n cells,\n onCellsMoving,\n onCellsMoved,\n onSwitchActiveTarget,\n updateCurActiveEditableLine,\n });\n }\n };\n g.addEventListener(\"mousedown\", onMouseDown);\n return () => {\n g.removeEventListener(\"mousedown\", onMouseDown);\n };\n }, [\n layout,\n layoutOptions,\n cell,\n activeTarget,\n cells,\n onCellsMoved,\n onCellsMoving,\n onSwitchActiveTarget,\n updateCurActiveEditableLine,\n readOnly,\n transform.k,\n ]);\n\n // istanbul ignore next: experimental\n useEffect(() => {\n const g = gRef.current;\n if (\n !g ||\n !isEdgeSide(cell, allowEdgeToArea) ||\n !(\n smartConnectLineState ||\n (lineEditorState && lineEditorState.type !== \"control\")\n )\n ) {\n return;\n }\n const onMouseUp = (e: MouseEvent) => {\n if (\n curActiveEditableLine &&\n lineEditorState &&\n curActiveEditableLine.type === \"decorator\"\n ) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n if (smartConnectLineState) {\n if (smartConnectLineState.source !== cell) {\n onConnect?.(\n smartConnectLineState.source,\n cell,\n smartConnectLineState.exitPosition,\n undefined\n );\n }\n setSmartConnectLineState(null);\n } else if (curActiveEditableLine && lineEditorState) {\n const { type } = lineEditorState;\n const { source, target } = editableLineMap.get(\n curActiveEditableLine\n ) as EditableEdgeLine;\n const { view } = curActiveEditableLine;\n\n const isEntry = type === \"entry\";\n if ((isEntry ? target : source) === cell) {\n if (isEntry) {\n onChangeEdgeView?.(source!, target!, {\n ...view,\n entryPosition: null,\n // ...(!view?.exitPosition ? { vertices: null } : {}),\n });\n } else {\n onChangeEdgeView?.(source!, target!, {\n ...view,\n exitPosition: null,\n // ...(!view?.entryPosition ? { vertices: null } : {}),\n });\n }\n }\n setLineEditorState(null);\n }\n };\n g.addEventListener(\"mouseup\", onMouseUp);\n return () => {\n g.removeEventListener(\"mouseup\", onMouseUp);\n };\n }, [\n curActiveEditableLine,\n editableLineMap,\n allowEdgeToArea,\n cell,\n lineEditorState,\n onChangeEdgeView,\n onConnect,\n setLineEditorState,\n setSmartConnectLineState,\n smartConnectLineState,\n updateCurActiveEditableLine,\n ]);\n\n const handleContextMenu = useCallback(\n (event: React.MouseEvent<SVGGElement>) => {\n if (readOnly && cell.type === \"decorator\") {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n let target = activeTarget;\n // When right-click a cell,\n // - if it's already active, use previous active target (including multiple targets)\n // - if it's inactive, use the cell as the new only target (excluding previous active target)\n if (!targetIsActive(cell, activeTarget)) {\n target = cellToTarget(cell);\n onSwitchActiveTarget(target);\n }\n onCellContextMenu({\n cell,\n clientX: event.clientX,\n clientY: event.clientY,\n locked,\n target: target!,\n });\n },\n [\n readOnly,\n cell,\n activeTarget,\n onCellContextMenu,\n locked,\n onSwitchActiveTarget,\n ]\n );\n\n const handleCellClick = useCallback(\n (event: React.MouseEvent<SVGGElement>) => {\n if (!onCellClick || cell.type === \"decorator\") {\n return;\n }\n onCellClick({\n cell,\n clientX: event.clientX,\n clientY: event.clientY,\n locked,\n });\n },\n [cell, onCellClick, locked]\n );\n\n const handleMouseEnter = useCallback(() => {\n onCellMouseEnter?.(cell);\n }, [cell, onCellMouseEnter]);\n\n const handleMouseLeave = useCallback(() => {\n onCellMouseLeave?.(cell);\n }, [cell, onCellMouseLeave]);\n\n const active = targetIsActive(cell, activeTarget);\n return (\n <g\n className={classNames(\"cell\", {\n active,\n faded: unrelated,\n \"read-only\": readOnly,\n \"container-dragover\": dragoverContainer,\n })}\n ref={gRef}\n transform={\n (isNodeCell(cell) && !degraded) ||\n isEdgeCell(cell) ||\n isLineDecoratorCell(cell) ||\n cell.view.x == null ||\n cell.view.y == null\n ? undefined\n : `translate(${containerRect!.x},${containerRect!.y})`\n }\n onContextMenu={handleContextMenu}\n onClick={handleCellClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {isNodeCell(cell) ? (\n <NodeComponent\n node={cell}\n x={containerRect?.x}\n y={containerRect?.y}\n degraded={degraded}\n degradedNodeLabel={degradedNodeLabel}\n defaultNodeBricks={defaultNodeBricks}\n locked={locked}\n containerLocked={containerLocked}\n onResize={onNodeBrickResize}\n />\n ) : isEdgeCell(cell) ? (\n <EdgeComponent\n edge={cell}\n active={readOnly ? hoverCell === cell : active}\n activeRelated={!!(readOnly ? hoverCell : activeTarget) && !unrelated}\n lineConfMap={lineConfMap}\n editableLineMap={editableLineMap}\n readOnly={readOnly}\n onSwitchActiveTarget={onSwitchActiveTarget}\n />\n ) : isDecoratorCell(cell) ? (\n <DecoratorComponent\n cell={cell}\n view={containerRect!}\n transform={transform}\n readOnly={readOnly}\n layout={layout}\n layoutOptions={layoutOptions}\n active={active}\n activeTarget={activeTarget}\n cells={cells}\n lineConfMap={lineConfMap}\n editableLineMap={editableLineMap}\n locked={locked}\n onCellResizing={onCellResizing}\n onCellResized={onCellResized}\n onSwitchActiveTarget={onSwitchActiveTarget}\n onDecoratorTextEditing={onDecoratorTextEditing}\n onDecoratorTextChange={onDecoratorTextChange}\n />\n ) : null}\n </g>\n );\n}\n","import type { Cell, NodeCell, DecoratorCell, NodeId } from \"../interfaces\";\nimport { isNodeOrAreaDecoratorCell } from \"./asserts\";\n\nexport function findNodeOrAreaDecorator(\n cells: Cell[],\n id: NodeId\n): NodeCell | DecoratorCell | undefined {\n return cells.find(\n (cell) => isNodeOrAreaDecoratorCell(cell) && cell.id === id\n ) as NodeCell | DecoratorCell | undefined;\n}\n","import { sortBy } from \"lodash\";\nimport type {\n ComputedEdgeLineConf,\n LineSegmentJumps,\n} from \"../../draw-canvas/interfaces\";\nimport type { NodePosition } from \"../../diagram/interfaces\";\nimport { intersect } from \"../../diagram/lines/intersect\";\n\ninterface LineSegment {\n start: NodePosition;\n end: NodePosition;\n}\n\nconst LINE_JUMP_BASE_SIZE = 6;\n\nexport function collectLineJumpsFactory() {\n const allJumps: LineSegmentJumps[] = [];\n const allLineSegments: LineSegment[] = [];\n\n return function collectLineJumps(\n points: NodePosition[],\n lineConf: ComputedEdgeLineConf\n ): Map<number, LineSegmentJumps> | null {\n const lineJumps: LineSegmentJumps[] = [];\n const lineSegments: LineSegment[] = [];\n\n // Line jumps for curved lines are not supported.\n if (lineConf.type !== \"curve\" || lineConf.curveType === \"curveLinear\") {\n for (let i = 0; i < points.length - 1; i++) {\n const start = points[i];\n const end = points[i + 1];\n const jumpPoints: NodePosition[] = [];\n const radius = LINE_JUMP_BASE_SIZE / 2 + lineConf.strokeWidth - 1;\n if (lineConf.jumps) {\n jumpLoop: for (const item of allLineSegments) {\n const point = lineJumpIntersect(\n start,\n end,\n item.start,\n item.end,\n radius\n );\n if (point) {\n for (const jump of allJumps) {\n for (const p of jump.jumpPoints) {\n const distance = Math.sqrt(\n Math.pow(point.x - p.x, 2) + Math.pow(point.y - p.y, 2)\n );\n if (distance < radius + jump.radius) {\n // Ignore this jump point if it's too close to an existing one\n continue jumpLoop;\n }\n }\n }\n\n jumpPoints.push(point);\n }\n }\n }\n\n if (jumpPoints.length > 0) {\n // 将交叉点按其在连线上的顺序排列\n const sortedJumpPoints = sortBy(\n jumpPoints,\n (p) => (p.x - points[0].x) ** 2 + (p.y - points[0].y) ** 2\n );\n\n const segJumps: LineSegmentJumps = {\n jumpPoints: sortedJumpPoints,\n index: i,\n radius,\n };\n allJumps.push(segJumps);\n lineJumps.push(segJumps);\n }\n\n lineSegments.push({ start, end });\n }\n\n // 同一连线上的不同线段交叉时,不产生跨线\n allLineSegments.push(...lineSegments);\n }\n\n return lineJumps.length > 0\n ? new Map(lineJumps.map((j) => [j.index, j]))\n : null;\n };\n}\n\nfunction lineJumpIntersect(\n p1: NodePosition,\n p2: NodePosition,\n p3: NodePosition,\n p4: NodePosition,\n radius: number\n): NodePosition | null {\n const point = intersect(\n [p1.x, p1.y],\n [p2.x, p2.y],\n [p3.x, p3.y],\n [p4.x, p4.y]\n );\n if (point) {\n // Check if the intersection point is too close to the line ends\n const r2 = radius * radius;\n for (const p of [p1, p2, p3, p4]) {\n const dx = point[0] - p.x;\n const dy = point[1] - p.y;\n if (dx * dx + dy * dy < r2) {\n return null;\n }\n }\n return { x: point[0], y: point[1] };\n }\n return null;\n}\n","import { useMemo } from \"react\";\nimport type {\n Cell,\n ComputedEdgeLineConf,\n DecoratorCell,\n DecoratorLineView,\n EdgeCell,\n EditableLine,\n} from \"../../draw-canvas/interfaces\";\nimport {\n isEdgeCell,\n isLineDecoratorCell,\n isStraightType,\n} from \"../../draw-canvas/processors/asserts\";\nimport { findNodeOrAreaDecorator } from \"../../draw-canvas/processors/findNodeOrAreaDecorator\";\nimport { getSmartLinePoints } from \"./processors/getSmartLinePoints\";\nimport { collectLineJumpsFactory } from \"./collectLineJumpsFactory\";\n\nexport function useEditableLineMap({\n cells,\n lineConfMap,\n}: {\n cells: Cell[];\n lineConfMap: WeakMap<EdgeCell | DecoratorCell, ComputedEdgeLineConf>;\n}): WeakMap<EdgeCell | DecoratorCell, EditableLine> {\n return useMemo(() => {\n const map = new WeakMap<EdgeCell | DecoratorCell, EditableLine>();\n\n const collectLineJumps = collectLineJumpsFactory();\n\n for (const cell of cells) {\n if (isEdgeCell(cell)) {\n const lineConf = lineConfMap.get(cell);\n // istanbul ignore next: defensive check\n if (!lineConf) {\n continue;\n }\n\n const sourceNode = findNodeOrAreaDecorator(cells, cell.source);\n const targetNode = findNodeOrAreaDecorator(cells, cell.target);\n\n const hasOppositeEdge =\n isStraightType(cell.view?.type) &&\n cells.some(\n (c) =>\n isEdgeCell(c) &&\n cell.source === c.target &&\n cell.target === c.source &&\n isStraightType(c.view?.type)\n );\n const parallelGap = hasOppositeEdge ? lineConf.parallelGap : 0;\n\n const points =\n sourceNode &&\n targetNode &&\n sourceNode.view.x != null &&\n targetNode.view.x != null\n ? getSmartLinePoints(\n sourceNode.view,\n targetNode.view,\n cell.view,\n parallelGap,\n cell.type\n )\n : null;\n\n if (points) {\n const jumpsMap = collectLineJumps(points, lineConf);\n\n map.set(cell, {\n edge: cell,\n points,\n source: sourceNode!,\n target: targetNode!,\n parallelGap,\n jumpsMap,\n });\n }\n } else if (isLineDecoratorCell(cell)) {\n const lineConf = lineConfMap.get(cell);\n // istanbul ignore next: defensive check\n if (!lineConf) {\n continue;\n }\n\n const { source, target } = cell.view as DecoratorLineView;\n\n const points =\n source && target\n ? getSmartLinePoints(\n { ...source, width: 0, height: 0 },\n { ...target, width: 0, height: 0 },\n cell.view,\n 0,\n cell.type\n )\n : null;\n\n if (points) {\n const jumpsMap = collectLineJumps(points, lineConf);\n\n map.set(cell, {\n decorator: cell,\n points,\n parallelGap: 0,\n jumpsMap,\n });\n }\n }\n }\n return map;\n }, [cells, lineConfMap]);\n}\n","import type { ActiveTarget, ActiveTargetOfSingular } from \"../interfaces\";\nimport { sameTarget } from \"./sameTarget\";\n\nexport function targetIsActive(\n target: ActiveTargetOfSingular,\n activeTarget: ActiveTarget | null | undefined\n): boolean {\n return (\n !!activeTarget &&\n (activeTarget.type === \"multi\"\n ? activeTarget.targets\n : [activeTarget]\n ).some((active) => sameTarget(active, target))\n );\n}\n","import type { Reducer } from \"react\";\nimport { pick } from \"lodash\";\nimport type { DrawCanvasAction } from \"./interfaces\";\nimport type {\n Cell,\n DecoratorCell,\n DecoratorType,\n EdgeCell,\n NodeCell,\n} from \"../interfaces\";\nimport { isNodeCell } from \"../processors/asserts\";\nimport { SYMBOL_FOR_SIZE_INITIALIZED } from \"../constants\";\n\ntype CellOrder = CellOrderOfDecorator | CellOrderOfOthers;\n\ninterface CellOrderOfDecorator {\n type: \"decorator\";\n decorators: DecoratorType[];\n}\n\ninterface CellOrderOfOthers {\n type: \"node\" | \"edge\";\n}\n\n// NOTE: keep the cells in the following order by default, when adding new cells:\n// 1. decorators other than text\n// 2. edges\n// 3. nodes\n// 4. decorators of text\nconst DEFAULT_CELL_ORDERS: CellOrder[] = [\n {\n type: \"decorator\",\n decorators: [\"line\", \"area\", \"container\", \"rect\"],\n },\n { type: \"edge\" },\n { type: \"node\" },\n { type: \"decorator\", decorators: [\"text\"] },\n];\n\nexport const cells: Reducer<Cell[], DrawCanvasAction> = (state, action) => {\n switch (action.type) {\n case \"drop-node\":\n case \"drop-decorator\":\n return insertCell(state, action.payload);\n case \"add-nodes\":\n return insertCells(state, action.payload);\n case \"add-edge\": {\n // If the new edge between the source and target already exists, override the old one.\n const existedEdgeIndex = state.findIndex(\n (cell) =>\n cell.type === \"edge\" &&\n cell.source === action.payload.source &&\n cell.target === action.payload.target\n );\n if (existedEdgeIndex === -1) {\n // Add the edge to just next to the previous last edge or area decorator.\n // If not found, append to the start.\n return insertCell(state, action.payload);\n }\n return [\n ...state.slice(0, existedEdgeIndex),\n action.payload,\n ...state.slice(existedEdgeIndex + 1),\n ];\n }\n case \"change-edge-view\": {\n const existedEdgeIndex = state.findIndex(\n (cell) =>\n cell.type === \"edge\" &&\n cell.source === action.payload.source &&\n cell.target === action.payload.target\n );\n return existedEdgeIndex === -1\n ? state\n : [\n ...state.slice(0, existedEdgeIndex),\n {\n ...(state[existedEdgeIndex] as EdgeCell),\n view: action.payload.view,\n },\n ...state.slice(existedEdgeIndex + 1),\n ];\n }\n case \"change-decorator-view\": {\n const existedDecoratorIndex = state.findIndex(\n (cell) => cell.type === \"decorator\" && cell.id === action.payload.id\n );\n return existedDecoratorIndex === -1\n ? state\n : [\n ...state.slice(0, existedDecoratorIndex),\n {\n ...(state[existedDecoratorIndex] as EdgeCell),\n view: action.payload.view,\n },\n ...state.slice(existedDecoratorIndex + 1),\n ];\n }\n case \"move-cells\": {\n let matched = false;\n const newState = state.map((cell) => {\n const newCell = action.payload.find(\n (move) => cell.type === move.type && cell.id === move.id\n );\n if (newCell) {\n matched = true;\n return {\n ...(cell as NodeCell),\n view: {\n ...(cell as NodeCell).view,\n x: newCell.x,\n y: newCell.y,\n ...pick(newCell, \"source\", \"target\", \"vertices\"),\n },\n };\n }\n return cell;\n });\n return matched ? newState : state;\n }\n case \"resize-cell\": {\n const { type, id, width, height } = action.payload;\n const index = state.findIndex(\n (cell) => cell.type === type && cell.id === id\n );\n if (index !== -1) {\n const node = state[index] as NodeCell;\n return [\n ...state.slice(0, index),\n { ...node, view: { ...node.view, width, height } },\n ...state.slice(index + 1),\n ];\n }\n return state;\n }\n case \"update-cells\":\n return action.payload;\n case \"update-node-size\":\n return state.map((cell) =>\n isNodeCell(cell) && cell.id === action.payload.id\n ? {\n ...cell,\n [SYMBOL_FOR_SIZE_INITIALIZED]: true,\n view: action.payload.size\n ? {\n ...cell.view,\n width: action.payload.size[0],\n height: action.payload.size[1],\n }\n : cell.view,\n }\n : cell\n );\n }\n return state;\n};\n\nfunction insertCell(cells: Cell[], newCell: Cell): Cell[] {\n return insertCells(cells, [newCell]);\n}\n\n/**\n * Insert new cells (with same types and some decorators) to the cells.\n */\nfunction insertCells(cells: Cell[], newCells: Cell[]): Cell[] {\n if (newCells.length === 0) {\n return cells;\n }\n const index = DEFAULT_CELL_ORDERS.findIndex((order) =>\n matchCellOrder(newCells[0], order)\n );\n\n // istanbul ignore next\n if (index === -1) {\n // eslint-disable-next-line no-console\n console.warn(\n \"Default order index unhandled for the cell: %o.\\n%s\",\n newCells[0],\n \"This is a bug of diagram-NB, please report it.\"\n );\n }\n\n const lastIndex = cells.findLastIndex(\n (cell) =>\n DEFAULT_CELL_ORDERS.findIndex((order) => matchCellOrder(cell, order)) <=\n index\n );\n const targetIndex = lastIndex + 1;\n return [\n ...cells.slice(0, targetIndex),\n ...newCells,\n ...cells.slice(targetIndex),\n ];\n}\n\nfunction matchCellOrder(cell: Cell, order: CellOrder) {\n return (\n cell.type === order.type &&\n (order.type !== \"decorator\" ||\n order.decorators.includes((cell as DecoratorCell).decorator))\n );\n}\n","import { Reducer } from \"react\";\nimport type { DrawCanvasAction, DrawCanvasState } from \"./interfaces\";\nimport { cells } from \"./cells\";\nimport { layoutKey } from \"./layoutKey\";\n\ntype ReducersMapObject<S, A> = {\n [K in keyof S]: Reducer<S[K], A>;\n};\n\nfunction combineReducers<S, A>(\n reducers: ReducersMapObject<S, A>\n): Reducer<S, A> {\n return ((state, action) =>\n Object.fromEntries(\n Object.entries<Reducer<any, A>>(reducers).map(([key, value]) => [\n key,\n value(state[key as keyof S], action),\n ])\n )) as Reducer<S, A>;\n}\n\nexport const rootReducer = combineReducers<DrawCanvasState, DrawCanvasAction>({\n cells,\n layoutKey,\n});\n","import type { Reducer } from \"react\";\nimport type { DrawCanvasAction } from \"./interfaces\";\n\nexport const layoutKey: Reducer<number, DrawCanvasAction> = (state, action) => {\n switch (action.type) {\n case \"update-node-size\":\n return action.layoutKey;\n default:\n return state;\n }\n};\n","import { pick } from \"lodash\";\nimport {\n forceCollide,\n forceLink,\n forceManyBody,\n forceSimulation,\n forceX,\n forceY,\n type Simulation,\n} from \"d3-force\";\nimport type {\n Cell,\n ForceCollideOptions,\n ForceLink,\n ForceNode,\n LayoutOptionsForce,\n NodeId,\n NodeView,\n} from \"../../draw-canvas/interfaces\";\nimport {\n isEdgeCell,\n isNodeCell,\n isNodeOrAreaDecoratorCell,\n} from \"../../draw-canvas/processors/asserts\";\nimport { extractPartialRectTuple } from \"../../diagram/processors/extractPartialRectTuple\";\nimport type { FullRectTuple, PositionTuple } from \"../../diagram/interfaces\";\n\nexport interface ForceLayoutOptions {\n cells: Cell[];\n layoutOptions?: LayoutOptionsForce;\n center?: PositionTuple;\n fixedPosition?: boolean;\n allowEdgeToArea?: boolean;\n}\n\nexport function forceLayout({\n cells,\n layoutOptions,\n center,\n fixedPosition,\n allowEdgeToArea,\n}: ForceLayoutOptions): {\n getNodeView: (id: NodeId) => NodeView;\n nodePaddings: FullRectTuple;\n} {\n const { nodePadding, collide } = {\n nodePadding: 0,\n ...pick(layoutOptions, [\"nodePadding\"]),\n collide:\n layoutOptions?.collide !== false\n ? ({\n radiusDiff: 18,\n strength: 1,\n iterations: 1,\n ...(layoutOptions?.collide === true\n ? null\n : (layoutOptions?.collide as ForceCollideOptions)),\n } as Required<ForceCollideOptions>)\n : (false as const),\n };\n const nodePaddings = extractPartialRectTuple(nodePadding);\n const forceNodes: ForceNode[] = [];\n const forceLinks: ForceLink[] = [];\n const nodesMap = new Map<NodeId, ForceNode>();\n for (const cell of cells) {\n if (\n (allowEdgeToArea && isNodeOrAreaDecoratorCell(cell)) ||\n isNodeCell(cell)\n ) {\n const node: ForceNode = {\n id: cell.id,\n width: cell.view.width + nodePaddings[1] + nodePaddings[3],\n height: cell.view.height + nodePaddings[0] + nodePaddings[2],\n ...(fixedPosition ? { fx: cell.view.x, fy: cell.view.y } : null),\n };\n forceNodes.push(node);\n nodesMap.set(node.id, node);\n } else if (isEdgeCell(cell)) {\n forceLinks.push({ source: cell.source, target: cell.target });\n }\n }\n\n const linkSimulation = forceLink<ForceNode, ForceLink>(forceLinks).id(\n (d) => d.id\n );\n const simulation = forceSimulation<ForceNode, ForceLink>(forceNodes)\n .force(\"link\", linkSimulation)\n .force(\"x\", forceX(center?.[0]))\n .force(\"y\", forceY(center?.[1]))\n .force(\"charge\", forceManyBody());\n\n if (collide) {\n simulation.force(\n \"collide\",\n forceCollide<ForceNode>()\n .radius(\n (d) =>\n Math.sqrt(d.width ** 2 + d.height ** 2) / 2 + collide.radiusDiff\n )\n .strength(collide.strength)\n .iterations(collide.iterations)\n );\n }\n\n simulation.stop();\n manuallyTickToTheEnd(simulation);\n\n return {\n getNodeView: (id: NodeId) => nodesMap.get(id) as NodeView,\n nodePaddings,\n };\n}\n\nfunction manuallyTickToTheEnd(\n simulation: Simulation<ForceNode, ForceLink>\n): void {\n // Manually tick to the end.\n simulation.tick(\n Math.ceil(\n Math.log(simulation.alphaMin()) / Math.log(1 - simulation.alphaDecay())\n )\n );\n}\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.zoom-bar{position:absolute;bottom:20px;right:20px;width:40px;scale:0.8}.zoom-slider,\n.center-button{width:100%;display:flex;align-items:center;border:1px solid var(--antd-background-color-base);border-radius:var(--larger-border-radius);box-shadow:var(--connected-overlay-shadow);background-color:var(--color-fill-bg-container-4)}.zoom-slider{height:140px;padding:8px 0;flex-direction:column}[role=\"button\"]{cursor:pointer}.center-button{justify-content:center;margin-bottom:8px;height:40px}.center-button:hover{border-color:var(--antd-btn-default-hover-border-color)}.center-button path{fill:var(--antd-link-hover-color)}.center-button:hover path{fill:var(--palette-blue-7)}.zoom-button{font-size:16px;line-height:0}.zoom-button svg{width:1em;height:1em;fill:var(--antd-link-hover-color)}.zoom-slider .ant-slider-vertical{padding-left:5px;padding-right:5px}.zoom-slider .ant-slider-vertical .ant-slider-rail{width:2px}.zoom-slider .ant-slider-vertical .ant-slider-handle{width:6px;height:6px;left:3px}.zoom-slider .ant-slider .ant-slider-handle:hover::before,\n.zoom-slider .ant-slider .ant-slider-handle:focus::before,\n.zoom-slider .ant-slider .ant-slider-handle::before{width:10px;height:10px;left:-2px}.zoom-slider .ant-slider .ant-slider-handle:hover::after,\n.zoom-slider .ant-slider .ant-slider-handle:focus::after,\n.zoom-slider .ant-slider .ant-slider-handle::after{width:6px;height:6px;top:0;left:0}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n","import { without } from \"lodash\";\nimport type {\n RangeTuple,\n SizeTuple,\n TransformLiteral,\n} from \"../../diagram/interfaces\";\nimport {\n DEFAULT_NODE_GAP_H,\n DEFAULT_NODE_GAP_V,\n SYMBOL_FOR_SIZE_INITIALIZED,\n} from \"../constants\";\nimport type {\n Cell,\n InitialCell,\n LayoutType,\n NodeCell,\n NodeId,\n NodeView,\n} from \"../interfaces\";\nimport { isDecoratorCell, isEdgeCell, isNodeCell } from \"./asserts\";\nimport { initializeCells } from \"./initializeCells\";\nimport { transformToCenter } from \"./transformToCenter\";\nimport { forceLayout } from \"../../shared/canvas/forceLayout\";\nimport { dagreLayout } from \"../../shared/canvas/dagreLayout\";\nimport { sameTarget } from \"./sameTarget\";\n\nexport function updateCells({\n cells,\n layout,\n previousCells,\n defaultNodeSize,\n canvasWidth,\n canvasHeight,\n scaleRange,\n transform,\n reason,\n parent,\n allowEdgeToArea,\n}: {\n cells: InitialCell[] | undefined;\n layout?: LayoutType;\n previousCells: Cell[];\n defaultNodeSize: SizeTuple;\n canvasWidth: number;\n canvasHeight: number;\n scaleRange: RangeTuple;\n transform: TransformLiteral;\n reason?: \"add-related-nodes\";\n parent?: NodeId;\n allowEdgeToArea?: boolean;\n}): {\n cells: Cell[];\n updated: Cell[];\n shouldReCenter: boolean;\n} {\n const isManualLayout = layout !== \"force\" && layout !== \"dagre\";\n const newCells = initializeCells(cells, { defaultNodeSize });\n const updateCandidates: NodeCell[] = [];\n let shouldReCenter = false;\n\n const previousSizeInitializedNodes = new Map<string, NodeCell>();\n let previousShouldCentered = false;\n for (const cell of previousCells) {\n if (isDecoratorCell(cell)) {\n previousShouldCentered = true;\n } else if (isNodeCell(cell)) {\n previousShouldCentered = true;\n if (cell[SYMBOL_FOR_SIZE_INITIALIZED]) {\n previousSizeInitializedNodes.set(cell.id, cell);\n }\n }\n }\n\n const nodesMap = new Map<string, NodeCell>();\n for (const cell of newCells) {\n if (isNodeCell(cell)) {\n nodesMap.set(cell.id, cell);\n const previousNode = previousSizeInitializedNodes.get(cell.id);\n if (previousNode) {\n cell.view.width = previousNode.view.width;\n cell.view.height = previousNode.view.height;\n cell[SYMBOL_FOR_SIZE_INITIALIZED] = true;\n }\n }\n }\n\n let handled = false;\n\n if (reason === \"add-related-nodes\" && parent) {\n // Place these unpositioned downstream nodes below the parent node, and\n // on the right side of the positioned siblings.\n const downstreamNodeIds = new Set<string>();\n for (const cell of newCells) {\n if (\n isEdgeCell(cell) &&\n cell.source === parent &&\n cell.target !== parent\n ) {\n downstreamNodeIds.add(cell.target);\n }\n }\n const parentNode = nodesMap.get(parent);\n if (parentNode?.view.x !== undefined && parentNode.view.y !== undefined) {\n handled = true;\n /**\n * 临时解决一次性添加多层的节点手工布局报错\n */\n if (isManualLayout) {\n for (const cell of newCells) {\n if (\n (isNodeCell(cell) && cell.view.x === undefined) ||\n (isNodeCell(cell) && cell.view.y === undefined)\n ) {\n downstreamNodeIds.add(cell.id);\n }\n }\n }\n const downstreamNodes = [...downstreamNodeIds]\n .map((id) => nodesMap.get(id))\n .filter(Boolean) as NodeCell[];\n let rightMostNode: NodeCell | undefined = undefined;\n for (const node of downstreamNodes) {\n if (node.view.x !== undefined && node.view.y !== undefined) {\n // Find the rightmost node that is below the parent node.\n if (\n (!rightMostNode || node.view.x > rightMostNode.view.x) &&\n node.view.y > parentNode.view.y\n ) {\n rightMostNode = node;\n }\n } else {\n // Unpositioned nodes\n updateCandidates.push(node);\n }\n }\n if (updateCandidates.length > 0 && isManualLayout) {\n let nextX: number;\n let nextY: number;\n if (rightMostNode) {\n // Place unpositioned nodes on the right side of the rightmost positioned siblings.\n nextX =\n rightMostNode.view.x +\n rightMostNode.view.width +\n DEFAULT_NODE_GAP_H;\n nextY = rightMostNode.view.y;\n } else {\n // If there are no positioned siblings, just place them below the parent.\n const totalWidth = updateCandidates.reduce(\n (acc, node) => acc + node.view.width + DEFAULT_NODE_GAP_H,\n -DEFAULT_NODE_GAP_H\n );\n nextX =\n parentNode.view.x - totalWidth / 2 + parentNode.view.width / 2;\n nextY =\n parentNode.view.y + parentNode.view.height + DEFAULT_NODE_GAP_V;\n }\n for (const node of updateCandidates) {\n node.view.x = nextX;\n node.view.y = nextY;\n nextX += node.view.width + DEFAULT_NODE_GAP_H;\n }\n }\n }\n }\n\n if (!handled) {\n // By default, place unpositioned nodes in a grid.\n const positionedNodes: NodeCell[] = [];\n let hasDecorators = false;\n for (const cell of newCells) {\n if (isNodeCell(cell)) {\n if (cell.view.x === undefined || cell.view.y === undefined) {\n updateCandidates.push(cell);\n } else {\n positionedNodes.push(cell);\n }\n } else if (isDecoratorCell(cell)) {\n hasDecorators = true;\n }\n }\n\n if (isManualLayout) {\n if (!previousShouldCentered) {\n // If the previous cells are not centered, use the centered transform instead.\n transform = transformToCenter(without(newCells, ...updateCandidates), {\n canvasWidth,\n canvasHeight,\n scaleRange,\n });\n }\n\n let getNodeView: (id: NodeId) => NodeView;\n\n // If there is no positioned nodes, or only one while without decorators and unpositioned nodes exist,\n // then there is no relative positions, we can place the nodes with dagre layout.\n // Otherwise, use the force layout.\n if (\n positionedNodes.length === 0 ||\n (positionedNodes.length === 1 &&\n !hasDecorators &&\n updateCandidates.length > 0)\n ) {\n // The positioned node (if exists) will be updated.\n updateCandidates.push(...positionedNodes);\n ({ getNodeView } = dagreLayout({ cells: newCells, allowEdgeToArea }));\n // Only re-center when there is no cells previous,\n // or the cell ids are not changed (this happens when updateCells called by backend right after dropNode).\n shouldReCenter =\n previousCells.length === 0 ||\n (previousCells.length === newCells.length &&\n previousCells.every((cell, index) =>\n sameTarget(cell, newCells[index])\n ));\n } else {\n ({ getNodeView } = forceLayout({\n cells: newCells,\n fixedPosition: true,\n allowEdgeToArea,\n center: [\n (canvasWidth / 2 - transform.x) / transform.k,\n (canvasHeight / 2 - transform.y) / transform.k,\n ],\n }));\n }\n\n for (const cell of newCells) {\n if (isNodeCell(cell)) {\n const view = getNodeView(cell.id);\n cell.view.x = view.x;\n cell.view.y = view.y;\n }\n }\n }\n }\n\n return { cells: newCells, updated: updateCandidates, shouldReCenter };\n}\n","import type { TransformLiteral } from \"../../diagram/interfaces\";\nimport { getCellsRect } from \"../../shared/canvas/processors/getCellsRect\";\nimport {\n getTransformToCenter,\n type TransformToCenterOptions,\n} from \"../../shared/canvas/processors/getTransformToCenter\";\nimport type { Cell } from \"../interfaces\";\n\nexport function transformToCenter(\n cells: Cell[],\n options: TransformToCenterOptions\n): TransformLiteral {\n const rect = getCellsRect(cells);\n return getTransformToCenter(rect, options);\n}\n","import * as React from \"react\";\nconst SvgCenter = props => <svg xmlns=\"http://www.w3.org/2000/svg\" width={24} height={24} viewBox=\"0 0 24 24\" {...props}><path d=\"M12 0a.5.5 0 0 1 .5.5v2.013a9.5 9.5 0 0 1 8.987 8.988L23.5 11.5a.5.5 0 0 1 0 1h-2.013a9.5 9.5 0 0 1-8.987 8.987V23.5a.5.5 0 0 1-1 0v-2.013A9.5 9.5 0 0 1 2.514 12.5H.5a.5.5 0 0 1 0-1h2.013A9.5 9.5 0 0 1 11.5 2.514V.5A.5.5 0 0 1 12 0M3.514 11.5H7.5a.5.5 0 0 1 0 1H3.514a8.5 8.5 0 0 0 7.987 7.986L11.5 16.5a.5.5 0 0 1 1 0v3.986a8.5 8.5 0 0 0 7.986-7.986H16.5a.5.5 0 0 1 0-1h3.986A8.5 8.5 0 0 0 12.5 3.515V7.5a.5.5 0 0 1-1 0V3.514a8.5 8.5 0 0 0-7.986 7.987zm8.486-1a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3\" /></svg>;\nexport default SvgCenter;","import * as React from \"react\";\nconst SvgZoomIn = props => <svg xmlns=\"http://www.w3.org/2000/svg\" width={128} height={128} className=\"icon\" viewBox=\"0 0 1024 1024\" {...props}><path d=\"M512 76.8A435.2 435.2 0 1 0 947.2 512 435.71 435.71 0 0 0 512 76.8m0 819.2a384 384 0 1 1 384-384 384 384 0 0 1-384 384\" /><path d=\"M744.448 486.4h-204.8V281.6a25.6 25.6 0 1 0-51.2 0v204.8h-204.8a25.6 25.6 0 0 0 0 51.2h204.8v204.8a25.6 25.6 0 0 0 51.2 0V537.6h204.8a25.6 25.6 0 0 0 0-51.2\" /></svg>;\nexport default SvgZoomIn;","import * as React from \"react\";\nconst SvgZoomOut = props => <svg xmlns=\"http://www.w3.org/2000/svg\" width={128} height={128} className=\"icon\" viewBox=\"0 0 1024 1024\" {...props}><path d=\"M512 76.8A435.2 435.2 0 1 0 947.2 512 435.71 435.71 0 0 0 512 76.8m0 819.2a384 384 0 1 1 384-384 384 384 0 0 1-384 384\" /><path d=\"M744.448 486.4H280.064a25.6 25.6 0 1 0 0 51.2h464.384a25.6 25.6 0 0 0 0-51.2\" /></svg>;\nexport default SvgZoomOut;","import React, { useCallback, useMemo, useRef } from \"react\";\nimport { ConfigProvider, Slider, theme } from \"antd\";\nimport { StyleProvider, createCache } from \"@ant-design/cssinjs\";\nimport { useCurrentTheme } from \"@next-core/react-runtime\";\nimport type { RangeTuple } from \"../../diagram/interfaces\";\nimport CenterSVG from \"./icons/center.svg\";\nimport ZoomInSVG from \"./icons/zoom-in.svg\";\nimport ZoomOutSVG from \"./icons/zoom-out.svg\";\n\nexport interface ZoomBarComponentProps {\n shadowRoot: ShadowRoot;\n scale: number;\n scaleRange: RangeTuple;\n onZoomChange(value: number): void;\n onReCenter(): void;\n}\n\nexport function ZoomBarComponent({\n shadowRoot,\n scale,\n scaleRange,\n onZoomChange,\n onReCenter,\n}: ZoomBarComponentProps): JSX.Element | null {\n const currentTheme = useCurrentTheme();\n const cache = useMemo(() => createCache(), []);\n const zoomBarRef = useRef<HTMLDivElement | null>(null);\n const min = scaleRange[0] * 100;\n const max = scaleRange[1] * 100;\n const value = scale * 100;\n const step = 5;\n\n const tooltip = useMemo(() => {\n return {\n formatter: (value: number | undefined) => `${value}%`,\n placement: \"left\" as const,\n getPopupContainer: () => zoomBarRef.current!,\n };\n }, []);\n\n const onZoomIn = useCallback(() => {\n onZoomChange(Math.min(value + step, max));\n }, [max, onZoomChange, value]);\n\n const onZoomOut = useCallback(() => {\n onZoomChange(Math.max(value - step, min));\n }, [min, onZoomChange, value]);\n\n return (\n <ConfigProvider\n theme={{\n algorithm:\n currentTheme === \"dark-v2\"\n ? theme.darkAlgorithm\n : theme.defaultAlgorithm,\n }}\n >\n <StyleProvider\n container={shadowRoot}\n // Auto clear injected styles after unmount\n autoClear\n cache={cache}\n // Set hashPriority to \"high\" to disable `:where()` usage for compatibility\n hashPriority=\"high\"\n >\n <div className=\"zoom-bar\" ref={zoomBarRef}>\n <div className=\"center-button\" onClick={onReCenter} role=\"button\">\n <CenterSVG />\n </div>\n <div className=\"zoom-slider\">\n <div className=\"zoom-button\" role=\"button\" onClick={onZoomIn}>\n <ZoomInSVG />\n </div>\n <Slider\n min={min}\n max={max}\n value={value}\n step={step}\n vertical\n included={false}\n tooltip={tooltip}\n onChange={onZoomChange}\n />\n <div className=\"zoom-button\" role=\"button\" onClick={onZoomOut}>\n <ZoomOutSVG />\n </div>\n </div>\n </div>\n </StyleProvider>\n </ConfigProvider>\n );\n}\n","import { useMemo, useRef } from \"react\";\nimport {\n __secret_internals,\n checkIfByTransform,\n checkIfOfComputed,\n} from \"@next-core/runtime\";\nimport { findIndex, isUndefined, omitBy } from \"lodash\";\nimport type {\n Cell,\n ComputedEdgeLineConf,\n ComputedLineConnecterConf,\n EdgeCell,\n EdgeLineConf,\n EditableLineCell,\n LineConnecterConf,\n LineMarker,\n} from \"../../draw-canvas/interfaces\";\nimport {\n isEdgeCell,\n isLineDecoratorCell,\n} from \"../../draw-canvas/processors/asserts\";\nimport {\n DEFAULT_LINE_STROKE_COLOR,\n DEFAULT_LINE_STROKE_WIDTH,\n DEFAULT_LINE_INTERACT_STROKE_WIDTH,\n DEFAULT_LINE_INTERACT_SHOW_START_ARROW,\n DEFAULT_LINE_INTERACT_SHOW_END_ARROW,\n DEFAULT_LINE_INTERACT_ANIMATE_DURATION,\n DEFAULT_DECORATOR_LINE_STROKE_COLOR,\n} from \"../../draw-canvas/constants\";\nimport { LineMarkerConf } from \"../../diagram/interfaces\";\n\nexport interface UseLineMarkersOptions {\n cells: Cell[];\n defaultEdgeLines: EdgeLineConf[] | undefined;\n markerPrefix: string;\n lineConnector?: LineConnecterConf | boolean;\n /** Use memoized result when moving and resizing cells */\n useMemoizedResult?: boolean;\n}\n\nexport interface UseLineMarkersResult {\n lineConfMap: WeakMap<EditableLineCell, ComputedEdgeLineConf>;\n lineConnectorConf: ComputedLineConnecterConf | null;\n markers: LineMarker[];\n}\n\nexport function useLineMarkers({\n cells,\n defaultEdgeLines,\n markerPrefix,\n lineConnector,\n useMemoizedResult,\n}: UseLineMarkersOptions): UseLineMarkersResult {\n const memoizedResult = useRef<UseLineMarkersResult | null>(null);\n\n return useMemo<UseLineMarkersResult>(() => {\n if (useMemoizedResult && memoizedResult.current) {\n // If cells are moving or resizing, we can use the previous memoized result.\n return memoizedResult.current;\n }\n\n // Always put the default stroke marker at the first position,\n // since the connecting line will use it.\n const markers: LineMarker[] = [\n {\n strokeColor: DEFAULT_LINE_STROKE_COLOR,\n markerType: \"arrow\",\n },\n ];\n\n let lineConnectorConf: ComputedLineConnecterConf | null = null;\n if (lineConnector) {\n lineConnectorConf = {\n ...getDefaultLineConf(),\n editingStrokeColor: \"var(--palette-blue-5)\",\n ...omitBy(lineConnector === true ? {} : lineConnector, isUndefined),\n } as ComputedLineConnecterConf;\n const lineMarkers: LineMarkerConf[] = getMarkers(lineConnectorConf);\n for (const marker of lineMarkers) {\n const { placement, type: _type } = marker;\n const type = _type ?? \"arrow\";\n const markerIndex = addMarker(\n {\n strokeColor: lineConnectorConf.strokeColor,\n markerType: type,\n },\n markers\n );\n const editingMarkerIndex = addMarker(\n {\n strokeColor: lineConnectorConf.editingStrokeColor,\n markerType: type,\n },\n markers\n );\n if (placement === \"start\") {\n lineConnectorConf.$markerStartUrl = `url(#${markerPrefix}${markerIndex})`;\n lineConnectorConf.$editingStartMarkerUrl = `url(#${markerPrefix}${editingMarkerIndex})`;\n } else {\n lineConnectorConf.$markerEndUrl = `url(#${markerPrefix}${markerIndex})`;\n lineConnectorConf.$editingEndMarkerUrl = `url(#${markerPrefix}${editingMarkerIndex})`;\n }\n }\n }\n\n const map = new WeakMap<EditableLineCell, ComputedEdgeLineConf>();\n for (const cell of cells) {\n const isEdge = isEdgeCell(cell);\n const isLineDecorator = isLineDecoratorCell(cell);\n\n let lineConf: ComputedEdgeLineConf;\n if (isEdge) {\n const computedLineConf =\n (Array.isArray(defaultEdgeLines)\n ? transformLineConf(\n defaultEdgeLines.find((item) =>\n checkIfByTransform(item, { edge: cell })\n ),\n cell\n )\n : (\n __secret_internals.legacyDoTransform(\n { edge: cell },\n defaultEdgeLines\n ) as EdgeLineConf[]\n )?.find((item) => checkIfOfComputed(item))) ?? {};\n lineConf = {\n ...getDefaultLineConf(),\n ...omitBy(computedLineConf, isUndefined),\n ...omitBy(cell.view, isUndefined),\n } as ComputedEdgeLineConf;\n if (lineConf.parallelGap === undefined) {\n lineConf.parallelGap = lineConf.interactStrokeWidth;\n }\n } else {\n lineConf = {\n ...getDefaultLineConf(),\n showEndArrow: false,\n strokeColor: DEFAULT_DECORATOR_LINE_STROKE_COLOR,\n ...omitBy(cell.view, isUndefined),\n } as ComputedEdgeLineConf;\n }\n\n if (isEdge || isLineDecorator) {\n const lineMarkers: LineMarkerConf[] = getMarkers(lineConf);\n\n for (const marker of lineMarkers) {\n const { placement, type: _type } = marker;\n const type = _type ?? \"arrow\";\n const markerIndex = addMarker(\n {\n strokeColor: lineConf.strokeColor,\n markerType: type,\n },\n markers\n );\n if (placement === \"start\") {\n lineConf.$markerStartUrl = `url(#${markerPrefix}${markerIndex})`;\n } else {\n lineConf.$markerEndUrl = `url(#${markerPrefix}${markerIndex})`;\n }\n\n const activeStrokeColor = lineConf.overrides?.active?.strokeColor;\n if (activeStrokeColor && activeStrokeColor !== lineConf.strokeColor) {\n const activeMarkerIndex = addMarker(\n {\n strokeColor: activeStrokeColor,\n markerType: type,\n },\n markers\n );\n if (placement === \"start\") {\n lineConf.$activeMarkerStartUrl = `url(#${markerPrefix}${activeMarkerIndex})`;\n } else {\n lineConf.$activeMarkerEndUrl = `url(#${markerPrefix}${activeMarkerIndex})`;\n }\n }\n\n if (isEdge) {\n const activeRelatedStrokeColor =\n lineConf.overrides?.activeRelated?.strokeColor;\n if (\n activeRelatedStrokeColor &&\n activeRelatedStrokeColor !== lineConf.strokeColor\n ) {\n const activeRelatedMarkerIndex = addMarker(\n {\n strokeColor: activeRelatedStrokeColor,\n markerType: type,\n },\n markers\n );\n if (placement === \"start\") {\n lineConf.$activeRelatedMarkerStartUrl = `url(#${markerPrefix}${activeRelatedMarkerIndex})`;\n } else {\n lineConf.$activeRelatedMarkerEndUrl = `url(#${markerPrefix}${activeRelatedMarkerIndex})`;\n }\n }\n }\n }\n map.set(cell, lineConf);\n }\n }\n return (memoizedResult.current = {\n lineConfMap: map,\n lineConnectorConf,\n markers,\n });\n }, [cells, defaultEdgeLines, lineConnector, markerPrefix, useMemoizedResult]);\n}\n\nfunction transformLineConf(\n lineConf: EdgeLineConf | undefined,\n edge: EdgeCell\n): EdgeLineConf {\n // Do not transform useBrick\n if (lineConf?.label?.useBrick) {\n const {\n label: { useBrick, ...restLabel },\n ...restConf\n } = lineConf;\n const computedRestConf = __secret_internals.legacyDoTransform(\n { edge },\n {\n ...restConf,\n label: restLabel,\n }\n ) as EdgeLineConf;\n return {\n ...computedRestConf,\n label: {\n ...computedRestConf.label,\n useBrick,\n },\n } as EdgeLineConf;\n }\n return __secret_internals.legacyDoTransform(\n { edge },\n lineConf\n ) as EdgeLineConf;\n}\n\nexport function getMarkers(lineConf: ComputedEdgeLineConf): LineMarkerConf[] {\n let lineMarkers: LineMarkerConf[] = [];\n if (lineConf.markers) {\n lineMarkers = lineConf.markers;\n } else {\n if (lineConf.showStartArrow) {\n lineMarkers.push({\n type: \"arrow\",\n placement: \"start\",\n });\n }\n if (lineConf.showEndArrow) {\n lineMarkers.push({\n type: \"arrow\",\n placement: \"end\",\n });\n }\n }\n return lineMarkers;\n}\nfunction addMarker(marker: LineMarker, markers: LineMarker[]): number {\n let markerIndex = findIndex(markers, marker);\n if (markerIndex === -1) {\n markerIndex = markers.push(marker) - 1;\n }\n return markerIndex;\n}\n\nfunction getDefaultLineConf(): EdgeLineConf {\n return {\n type: \"straight\",\n dashed: false,\n strokeColor: DEFAULT_LINE_STROKE_COLOR,\n strokeWidth: DEFAULT_LINE_STROKE_WIDTH,\n interactStrokeWidth: DEFAULT_LINE_INTERACT_STROKE_WIDTH,\n showStartArrow: DEFAULT_LINE_INTERACT_SHOW_START_ARROW,\n showEndArrow: DEFAULT_LINE_INTERACT_SHOW_END_ARROW,\n animate: {\n useAnimate: false,\n duration: DEFAULT_LINE_INTERACT_ANIMATE_DURATION,\n },\n jumps: false,\n };\n}\n","import React, { useEffect, useMemo, useState } from \"react\";\nimport { select } from \"d3-selection\";\nimport { zoom, type ZoomBehavior } from \"d3-zoom\";\nimport type { RangeTuple, TransformLiteral } from \"../../diagram/interfaces\";\nimport {\n DEFAULT_SCALE_RANGE_MIN,\n DEFAULT_SCALE_RANGE_MAX,\n} from \"../../draw-canvas/constants\";\nimport type { ActiveTarget } from \"../../draw-canvas/interfaces\";\n\nexport interface UseZoomOptions {\n rootRef: React.RefObject<SVGSVGElement>;\n zoomable?: boolean;\n scrollable?: boolean;\n pannable?: boolean;\n draggable?: boolean;\n ctrlDraggable?: boolean;\n scaleRange?: RangeTuple;\n onSwitchActiveTarget?(target: ActiveTarget | null): void;\n}\n\nexport interface UseZoomResult {\n grabbing: boolean;\n transform: TransformLiteral;\n scaleRange: RangeTuple;\n zoomer: ZoomBehavior<SVGSVGElement, unknown>;\n}\n\n// istanbul ignore next\nconst isMac = /mac/i.test(\n (\n navigator as Navigator & {\n userAgentData?: {\n platform: string;\n };\n }\n ).userAgentData?.platform ??\n navigator.platform ??\n navigator.userAgent\n);\n\n// istanbul ignore next\nfunction wheelData(event: WheelEvent) {\n // On Windows with normal mouse, deltaY is too big when scroll with ctrlKey pressed,\n // which cause the zooming too fast.\n // While on mac OS, we need to keep default behavior of d3-zoom.\n return (\n -event.deltaY *\n (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) *\n (event.ctrlKey && isMac ? 10 : 1)\n );\n}\n\nexport function useZoom({\n rootRef,\n zoomable,\n scrollable,\n pannable,\n draggable,\n ctrlDraggable,\n scaleRange: _scaleRange,\n onSwitchActiveTarget,\n}: UseZoomOptions): UseZoomResult {\n const [grabbing, setGrabbing] = useState(false);\n const [transform, setTransform] = useState<TransformLiteral>({\n k: 1,\n x: 0,\n y: 0,\n });\n\n const scaleRange = useMemo(\n () =>\n _scaleRange ??\n ([DEFAULT_SCALE_RANGE_MIN, DEFAULT_SCALE_RANGE_MAX] as RangeTuple),\n [_scaleRange]\n );\n\n const zoomer = useMemo(\n () => zoom<SVGSVGElement, unknown>().wheelDelta(wheelData),\n []\n );\n\n // istanbul ignore next: d3-zoom currently hard to test\n useEffect(() => {\n let moved = false;\n zoomer\n .scaleExtent(zoomable ? scaleRange : [1, 1])\n .on(\"start\", () => {\n moved = false;\n setGrabbing(true);\n })\n .on(\"zoom\", (e: { transform: TransformLiteral }) => {\n moved = true;\n setTransform(e.transform);\n })\n .on(\"end\", () => {\n setGrabbing(false);\n if (!moved) {\n onSwitchActiveTarget?.(null);\n }\n })\n .filter(\n (event) =>\n // For wheel event, ignore d3 default behavior, because we control it manually.\n // Except for the trackpad pinch event on Mac OS (with ctrlKey).\n (event.type === \"wheel\"\n ? event.ctrlKey\n : ctrlDraggable\n ? draggable || event.ctrlKey\n : !event.ctrlKey) && !event.button\n );\n }, [\n onSwitchActiveTarget,\n scaleRange,\n zoomable,\n zoomer,\n ctrlDraggable,\n draggable,\n ]);\n\n useEffect(() => {\n if (ctrlDraggable) {\n const onContextMenu = (e: MouseEvent) => {\n if (e.ctrlKey) {\n e.preventDefault();\n }\n };\n document.addEventListener(\"contextmenu\", onContextMenu, true);\n return () => {\n document.removeEventListener(\"contextmenu\", onContextMenu, true);\n };\n }\n }, [ctrlDraggable]);\n\n // istanbul ignore next: d3-zoom currently hard to test\n useEffect(() => {\n const root = rootRef.current;\n if (!root) {\n return;\n }\n\n const rootSelection = select(root);\n\n const unsetZoom = () => {\n rootSelection\n .on(\".zoom\", null)\n .on(\".zoom.custom\", null)\n .on(\"wheel\", null);\n };\n\n if (!(zoomable || scrollable || pannable)) {\n unsetZoom();\n return;\n }\n\n if (zoomable || scrollable) {\n // Do not override default d3 zoom handler.\n // Only handles *panning*\n rootSelection.on(\n \"wheel.zoom.custom\",\n (e: WheelEvent & { wheelDeltaX: number; wheelDeltaY: number }) => {\n // Mac OS trackpad pinch event is emitted as a wheel.zoom and d3.event.ctrlKey set to true\n if (!e.ctrlKey && scrollable) {\n e.preventDefault();\n zoomer.translateBy(\n rootSelection,\n e.wheelDeltaX / 5,\n e.wheelDeltaY / 5\n );\n }\n // zoomer.scaleBy(rootSelection, Math.pow(2, defaultWheelDelta(e)))\n }\n );\n }\n\n rootSelection\n .call(zoomer)\n .on(\"wheel\", (e: WheelEvent) => {\n if (scrollable || (zoomable && e.ctrlKey)) {\n e.preventDefault();\n }\n })\n .on(\"dblclick.zoom\", null);\n\n if ((!draggable && !ctrlDraggable) || !pannable) {\n rootSelection.on(\"mousedown.zoom\", null);\n }\n\n if (!pannable) {\n rootSelection\n .on(\"touchstart.zoom\", null)\n .on(\"touchmove.zoom\", null)\n .on(\"touchend.zoom\", null);\n }\n\n return unsetZoom;\n }, [\n ctrlDraggable,\n draggable,\n pannable,\n rootRef,\n scrollable,\n zoomable,\n zoomer,\n ]);\n\n return { grabbing, transform, zoomer, scaleRange };\n}\n","import type {\n ActiveTarget,\n ActiveTargetOfEdge,\n ActiveTargetOfMulti,\n ActiveTargetOfNode,\n} from \"../interfaces\";\n\nexport function sameTarget(\n a: ActiveTarget | null | undefined,\n b: ActiveTarget | null | undefined\n): boolean {\n return a\n ? !!b &&\n a.type === b.type &&\n (a.type === \"multi\"\n ? a.targets.length === (b as ActiveTargetOfMulti).targets.length &&\n a.targets.every((targetA) =>\n (b as ActiveTargetOfMulti).targets.some((targetB) =>\n sameTarget(targetA, targetB)\n )\n )\n : a.type === \"node\" || a.type === \"decorator\"\n ? a.id === (b as ActiveTargetOfNode).id\n : a.source === (b as ActiveTargetOfEdge).source &&\n a.target === (b as ActiveTargetOfEdge).target)\n : !b;\n}\n","import { useMemo } from \"react\";\nimport type { Cell, LayoutType } from \"../../draw-canvas/interfaces\";\nimport { isNodeCell } from \"../../draw-canvas/processors/asserts\";\nimport {\n SYMBOL_FOR_LAYOUT_INITIALIZED,\n SYMBOL_FOR_SIZE_INITIALIZED,\n} from \"../../draw-canvas/constants\";\n\nexport interface UseReadyOptions {\n cells: Cell[];\n layout: LayoutType;\n centered: boolean;\n}\n\nexport function useReady({ cells, layout, centered }: UseReadyOptions) {\n const ready = useMemo(\n () =>\n centered &&\n cells.every(\n (cell) =>\n !isNodeCell(cell) ||\n (cell[SYMBOL_FOR_SIZE_INITIALIZED] &&\n ((layout !== \"force\" && layout !== \"dagre\") ||\n cell[SYMBOL_FOR_LAYOUT_INITIALIZED]))\n ),\n [cells, centered, layout]\n );\n return ready;\n}\n","import type { NodePosition } from \"../../../diagram/interfaces\";\nimport type { NodeConnectPoint } from \"../../../draw-canvas/interfaces\";\n\n// *--*--*--*--*\n// | |\n// * *\n// | |\n// * Rect *\n// | |\n// * *\n// | |\n// *--*--*--*--*\nconst RectangleRelativeConnectPointsWithDirection: ReadonlyArray<NodeConnectPoint> =\n [\n {\n x: 0,\n y: 0,\n d: [\"top\", \"left\"],\n },\n { x: 0.5, y: 0, d: [\"top\"] },\n {\n x: 1,\n y: 0,\n d: [\"top\", \"right\"],\n },\n { x: 0, y: 0.5, d: [\"left\"] },\n { x: 1, y: 0.5, d: [\"right\"] },\n {\n x: 0,\n y: 1,\n d: [\"bottom\", \"left\"],\n },\n { x: 0.5, y: 1, d: [\"bottom\"] },\n {\n x: 1,\n y: 1,\n d: [\"bottom\", \"right\"],\n },\n ];\n\nconst RectangleRelativeConnectPoints: ReadonlyArray<NodePosition> =\n RectangleRelativeConnectPointsWithDirection.map((p) => ({ x: p.x, y: p.y }));\n\nexport function getConnectPointsOfRectangleWithDirection() {\n return RectangleRelativeConnectPointsWithDirection;\n}\n\nexport function getConnectPointsOfRectangle() {\n return RectangleRelativeConnectPoints;\n}\n","import type { Cell, DecoratorCell } from \"../interfaces\";\nimport { isContainerDecoratorCell, isNodeCell } from \"./asserts\";\n\nexport function getLockedContainerIds(cells: Cell[]): string[] {\n const lockedContainers = cells.filter(\n (cell) => cell.view?.locked && isContainerDecoratorCell(cell)\n ) as DecoratorCell[];\n return lockedContainers.map((cell) => cell.id);\n}\n\nexport function isLocked(\n cell: Cell,\n lockedContainerIds: string[] | undefined\n): boolean {\n return (\n cell.view?.locked ||\n !!(\n isNodeCell(cell) &&\n cell.containerId &&\n lockedContainerIds?.includes(cell.containerId)\n )\n );\n}\n","import { pick } from \"lodash\";\nimport dagre from \"@dagrejs/dagre\";\nimport { extractPartialRectTuple } from \"../../diagram/processors/extractPartialRectTuple\";\nimport type {\n Cell,\n ForceNode,\n LayoutOptionsDagre,\n NodeId,\n NodeView,\n} from \"../../draw-canvas/interfaces\";\nimport {\n isEdgeCell,\n isNodeCell,\n isNodeOrAreaDecoratorCell,\n} from \"../../draw-canvas/processors/asserts\";\nimport type { FullRectTuple } from \"../../diagram/interfaces\";\n\nexport interface DagreLayoutOptions {\n cells: Cell[];\n layoutOptions?: LayoutOptionsDagre;\n allowEdgeToArea?: boolean;\n}\n\nexport function dagreLayout({\n cells,\n layoutOptions,\n allowEdgeToArea,\n}: DagreLayoutOptions): {\n getNodeView: (id: NodeId) => NodeView;\n nodePaddings: FullRectTuple;\n} {\n const { nodePadding, ...dagreGraphOptions } = {\n nodePadding: 0,\n rankdir: \"TB\",\n ranksep: 50,\n edgesep: 10,\n nodesep: 50,\n // align: undefined,\n ...pick(layoutOptions, [\n \"nodePadding\",\n \"rankdir\",\n \"ranksep\",\n \"edgesep\",\n \"nodesep\",\n \"align\",\n ]),\n };\n const nodePaddings = extractPartialRectTuple(nodePadding);\n\n if (!cells.some(isNodeCell)) {\n // Dagre cannot render empty nodes\n return {\n getNodeView: () => null!,\n nodePaddings,\n };\n }\n\n const graph = new dagre.graphlib.Graph<ForceNode>();\n graph.setGraph(dagreGraphOptions);\n // Default to assigning a new object as a label for each new edge.\n graph.setDefaultEdgeLabel(function () {\n return {};\n });\n for (const cell of cells) {\n if (\n (allowEdgeToArea && isNodeOrAreaDecoratorCell(cell)) ||\n isNodeCell(cell)\n ) {\n graph.setNode(cell.id, {\n id: cell.id,\n width: cell.view.width + nodePaddings[1] + nodePaddings[3],\n height: cell.view.height + nodePaddings[0] + nodePaddings[2],\n });\n } else if (isEdgeCell(cell)) {\n graph.setEdge(cell.source, cell.target);\n }\n }\n dagre.layout(graph);\n\n return {\n getNodeView: (id: NodeId) => graph.node(id),\n nodePaddings,\n };\n}\n","import type { Cell, CellsRect } from \"../../../draw-canvas/interfaces\";\nimport { isEdgeCell } from \"../../../draw-canvas/processors/asserts\";\n\nexport function getCellsRect(cells: Cell[]): CellsRect {\n let left = Infinity;\n let top = Infinity;\n let right = -Infinity;\n let bottom = -Infinity;\n let empty = true;\n for (const cell of cells) {\n if (!isEdgeCell(cell)) {\n empty = false;\n const { view } = cell;\n const r = view.x + view.width;\n const b = view.y + view.height;\n if (view.x < left) {\n left = view.x;\n }\n if (r > right) {\n right = r;\n }\n if (view.y < top) {\n top = view.y;\n }\n if (b > bottom) {\n bottom = b;\n }\n }\n }\n\n const width = right - left;\n const height = bottom - top;\n\n return { left, top, width, height, empty };\n}\n","import { pick } from \"lodash\";\nimport type { ActiveTargetOfSingular, Cell } from \"../interfaces\";\n\nexport function cellToTarget(cell: Cell): ActiveTargetOfSingular {\n return cell.type === \"edge\"\n ? pick(cell, [\"type\", \"source\", \"target\", \"data\"])\n : pick(cell, [\"type\", \"id\", \"data\"]);\n}\n","// istanbul ignore file: nothing logical to test\nimport React from \"react\";\nimport type {\n DecoratorCell,\n DecoratorLineView,\n DecoratorView,\n EdgeView,\n EditableLineCell,\n LineEditorState,\n NodeCell,\n SmartConnectLineState,\n} from \"./interfaces\";\nimport type { NodePosition } from \"../diagram/interfaces\";\n\nexport interface HoverState {\n // Currently only support node cell\n cell: NodeCell | DecoratorCell;\n relativePoints: ReadonlyArray<NodePosition>;\n points: ReadonlyArray<NodePosition>;\n activePointIndex?: number;\n}\n\nexport const HoverStateContext = React.createContext<{\n rootRef: React.RefObject<SVGSVGElement>;\n smartConnectLineState: SmartConnectLineState | null;\n unsetHoverStateTimeoutRef: React.MutableRefObject<number | null>;\n hoverState: HoverState | null;\n activeEditableLines: EditableLineCell[];\n lineEditorState: LineEditorState | null;\n movingCells?: boolean;\n setLineEditorState: React.Dispatch<\n React.SetStateAction<LineEditorState | null>\n >;\n setHoverState: React.Dispatch<React.SetStateAction<HoverState | null>>;\n setSmartConnectLineState: React.Dispatch<\n React.SetStateAction<SmartConnectLineState | null>\n >;\n onConnect?: (\n source: NodeCell | DecoratorCell,\n target: NodeCell | DecoratorCell,\n exitPosition: NodePosition,\n entryPosition: NodePosition | undefined\n ) => void;\n onChangeEdgeView?: (\n source: NodeCell | DecoratorCell,\n target: NodeCell | DecoratorCell,\n view: EdgeView\n ) => void;\n onChangeDecoratorView?: (\n cell: DecoratorCell,\n view: DecoratorView | DecoratorLineView\n ) => void;\n}>({\n rootRef: { current: null },\n smartConnectLineState: null,\n unsetHoverStateTimeoutRef: { current: null },\n hoverState: null,\n activeEditableLines: [],\n lineEditorState: null,\n setLineEditorState: () => {},\n setHoverState: () => {},\n setSmartConnectLineState: () => {},\n});\n\nexport function useHoverStateContext() {\n return React.useContext(HoverStateContext);\n}\n"],"names":["getUnrelatedCells","cells","connectLineState","activeTarget","allowEdgeToArea","unrelated","existedTargets","Set","cell","type","source","id","add","target","has","push","decorator","nodesMap","Map","activeNodeIds","relatedNodeIds","active","targets","set","targetIsActive","isNodeCell","isDecoratorCell","isInitialNodeCell","isEdgeCell","isNodeOrEdgeCell","isNodeOrAreaDecoratorCell","isEdgeSide","isContainerDecoratorCell","isLineDecoratorCell","isNoManualLayout","layout","undefined","includes","isStraightType","isEditableEdgeLine","line","edge","nodeViewToNodeRect","view","padding","x","width","y","height","DEFAULT_DIRECTIONS","getSmartLinePoints","sourceView","targetView","lineView","parallelGap","cellType","_connectPoints$find$d","_connectPoints$find","_connectPoints$find$d2","_connectPoints$find2","_sourceDirections$","_targetDirections$","vertices","exitPosition","originalExit","entryPosition","originalEntry","getDirectLinePoints","DEFAULT_NODE_PADDING_FOR_SMART_LINES","DEFAULT_NODE_PADDING_FOR_LINES","length","firstVertex","lastVertex","exitPoint","entryPoint","exitDirection","entryDirection","getAbsolutePosition","possibleFirstNextPoint","getDefaultAbsolutePosition","prefer","point","direction","fitEndpointAndDirection","possibleLastPreviousPoint","slice","reverse","sourceX","sourceY","targetX","targetY","newLinePoints","newVertices","unshift","simplifyVertices","getDefaultPosition","connectPoints","getConnectPointsOfRectangleWithDirection","originalSourceDirections","find","p","d","originalTargetDirections","sourceDirections","targetDirections","pull","sourceDirection","targetDirection","sourcePosition","targetPosition","getPolyLinePoints","simplifiedVertices","prevDirection","prev","index","vertex","isHorizontal","isVertical","next","isHorizontalNext","isVerticalNext","position","halfPadding","flip","xAxis","yAxis","xSize","ySize","xPosition","oppositeView","nsDirection","ewDirection","_vertices$","nextVertex","SmartConnectLineComponent","_ref","transform","lineSettings","options","connectLineTo","setConnectLineTo","useState","hoverState","smartConnectLineState","setSmartConnectLineState","useHoverStateContext","useEffect","document","addEventListener","onMouseMove","onMouseUp","reset","e","clientX","offset","k","clientY","preventDefault","removeEventListener","useMemo","points","activePointIndex","relativePoints","x1","y1","getConnectLinePoints","curveLine","curveType","markerStart","markerEnd","lineMarkers","getMarkers","marker","placement","$markerStartUrl","$markerEndUrl","React","className","classNames","connecting","fill","stroke","strokeColor","strokeWidth","KeywordMap","normalizeAlignAxis","value","axis","newX","get","matches","match","Number","console","error","useLayout","layoutOptions","autoSize","rootRef","zoomable","zoomer","scaleRange","layoutKey","autoCenterWhenCellsChange","dispatch","layoutInitialized","setLayoutInitialized","layoutKeyRef","useRef","getNextLayoutKey","useCallback","current","centered","setCentered","some","root","SYMBOL_FOR_SIZE_INITIALIZED","rect","getCellsRect","clientWidth","clientHeight","fitWidth","fitHeight","fullPadding","extractPartialRectTuple","DEFAULT_CANVAS_PADDING","_autoSize$minWidth","_autoSize$maxWidth","_autoSize$minHeight","_autoSize$maxHeight","Math","min","max","minWidth","maxWidth","Infinity","style","minHeight","maxHeight","getTransformToCenter","canvasWidth","canvasHeight","canvasPadding","select","ZoomTransform","useAutoCenter","previousLayoutRef","a","b","filter","every","v","i","getNodeView","nodePaddings","forceLayout","dagreLayout","alignOrigin","origin","normalizeAlignOrigin","newCells","map","nodeView","SYMBOL_FOR_LAYOUT_INITIALIZED","payload","left","top","empty","paddingTop","paddingRight","paddingBottom","paddingLeft","availableWidth","availableHeight","scale","useActiveTarget","_activeTarget","doNotResetActiveTargetForSelector","doNotResetActiveTargetOutsideCanvas","onActiveTargetChange","newActiveTarget","setActiveTarget","previous","sameTarget","activeTargetChangeInitialized","resetActiveTarget","path","composedPath","rootIndex","indexOf","el","Element","getNewLineVertices","activeEditableLine","lineEditorState","editableLineMap","control","linePoints","LOOSE_CONTROL_TYPES","EditingLineComponent","setLineEditorState","onChangeEdgeView","onChangeDecoratorView","movedRef","setTimeout","from","getConnectTo","diff","otherPoints","axises","getFinalPosition","movementX","movementY","altKey","_","endpoint","editableLine","newDiff","abs","newConnectTo","isEdge","_view$vertices","splice","handleBodyClick","stopPropagation","body","pick","getEditingLinePoints","$editingStartMarkerUrl","$editingEndMarkerUrl","editing","editingStrokeColor","handleNodeContainedChange","payloads","onContainerContainerChange","nodeCells","c","containerIds","nodePayloads","nodeCell","includeNodeFlag","containerId","forEach","right","bottom","containerDecoratorCells","_cell$view","locked","containerCell","containerLeft","containerRight","containerTop","containerBottom","containedChanges","_payload$containerCel","POINT_HELPER_IMAGE","END_POINT_HELPER_IMAGE","ANCHORED_POINT_HELPER_IMAGE","VERTEX_HELPER_IMAGE","POINT_HELPER_BG_SIZE","LineEditorComponent","updateCurActiveEditableLine","movingCells","exitRef","entryRef","controlPointsRef","isLineDecorator","exit","entry","handleMouseDownFactory","getBoundingClientRect","handleStartMouseDown","handleEndMouseDown","controlPoints","_activeEditableLine$v","cursor","getStraightControlPoints","ns","ew","getControlPoints","controlElements","handlers","gRef","g","onClick","commonProps","preserveAspectRatio","pointerEvents","ref","_extends","xlinkHref","key","opacity","handleLasso","event","onLassoing","onLassoed","ctrlKey","button","x0","y0","moved","handleMove","finished","movement","getMovement","HELPER_IMAGE","HELPER_RADIUS","HELPER_BG_RADIUS","HALF_HELPER_RADIUS","LineConnectorComponent","disabled","unsetHoverStateTimeoutRef","setHoverState","unsetTimeout","clearTimeout","unsetActivePointIndex","unsetHoverState","available","hasActiveEdge","onMouseEnter","onMouseLeave","cx","cy","r","fillOpacity","ConnectPointComponent","_ref2","onConnect","handleMouseEnter","handleMouseDown","originalPoint","handleMouseUp","handleKeyboard","lockedContainerIds","activeCells","isLocked","keyCode","which","action","toggleLock","previousLocked","previousUnlocked","updates","update","___CSS_LOADER_EXPORT___","module","toString","Symbol","for","DEFAULT_NODE_SIZE","DEFAULT_NODE_GAP_H","DEFAULT_NODE_GAP_V","DEFAULT_AREA_WIDTH","DEFAULT_AREA_HEIGHT","DEFAULT_SCALE_RANGE_MIN","DEFAULT_SCALE_RANGE_MAX","DEFAULT_LINE_STROKE_COLOR","DEFAULT_LINE_STROKE_WIDTH","DEFAULT_DECORATOR_LINE_STROKE_COLOR","DEFAULT_LINE_INTERACT_STROKE_WIDTH","DEFAULT_LINE_INTERACT_SHOW_START_ARROW","DEFAULT_LINE_INTERACT_SHOW_END_ARROW","DEFAULT_LINE_INTERACT_ANIMATE_DURATION","DEFAULT_DEGRADED_THRESHOLD","DEFAULT_SNAP_GRID_SIZE","DEFAULT_SNAP_OBJECT_DISTANCE","DEFAULT_SNAP_OBJECT_POSITIONS","DEFAULT_MOTION_SPEED","ConnectLineComponent","onMouseDown","capture","join","initializeCells","initialCells","defaultNodeSize","_cell$view2","LineLabelComponent","label","text","onRendered","ready","LineLabelUseBrickComponent","LineLabelTextComponent","refCallback","element","content","_ref3","useBrick","checkIfOfComputed","memoizedData","parentElement","ignoredCallback","ReactUseBrick","data","EdgeComponent","_editableLineMap$get","_motion","_motion2","_lineConf$overrides3","_lineConf$overrides4","_lineConf$animate$dur","_lineConf$overrides5","lineConfMap","readOnly","activeRelated","onSwitchActiveTarget","pathRef","lineConf","jumpsMap","lineClipPathPrefix","uniqueId","labelPosition","setLabelPosition","labelSize","setLabelSize","lineRect","setLineRect","updateLabelPosition","pathLength","getTotalLength","halfPathLength","pathPoint","getPointAtLength","angle","p0","p1","atan2","getBBox","setPathLength","pathRefCallback","_element$getTotalLeng","_element$getTotalLeng2","_element$getBBox","call","labelElement","setLabelElement","resizeObserver","ResizeObserver","observerCallback","offsetWidth","offsetHeight","observe","disconnect","handleLabelRendered","onLabelClick","cellToTarget","onDoubleClick","_labelElement$firstEl","_labelElement$firstEl2","callLabelOnDoubleClick","firstElementChild","mask","labelOffset","offsetX","offsetY","halfWidth","halfHeight","cos","tan","sin","getLabelMaskAndOffset","clipPathPoints","maskRight","maskBottom","motion","_lineConf$overrides","_overrides$strokeColo","_overrides$strokeWidt","overrides","_lineConf$$activeMark","_lineConf$$activeMark2","$activeMarkerStartUrl","$activeMarkerEndUrl","_lineConf$overrides2","_overrides$strokeColo2","_overrides$strokeWidt2","_lineConf$$activeRela","_lineConf$$activeRela2","$activeRelatedMarkerStartUrl","$activeRelatedMarkerEndUrl","motionPath","motionDuration","shape","radius","size","sqrt","_motion$speed","_motion3","speed","hasMotion","item","clipPathUrl","interactStrokeWidth","clipPath","dashed","dotted","animate","useAnimate","duration","visible","dur","repeatCount","rotate","LockIcon","NodeComponent","_useMemo","node","degraded","degradedNodeLabel","defaultNodeBricks","containerLocked","onResize","memoizedValue","setMemoizedValue","isEqual","useDeepMemo","specifiedUseBrick","specifiedComponent","component","observerRef","Component","checkIfByTransform","String","__secret_internals","legacyDoTransform","brickRef","xRef","yRef","prevObserver","observer","degradedRefCallBack","foreignObjectRef","fo","test","navigator","userAgent","overflow","timeoutId","DEFAULT_ALL_POSITIONS","getSnapPositions","positions","snapPositions","_positions$split$flat","_positions$split","split","flatMap","pos","tuple","Error","HORIZONTAL_POSITIONS","VERTICAL_POSITIONS","_snap$object","onCellsMoving","onCellsMoved","onCellResizing","onCellResized","preActive","getLockedContainerIds","canUpdateActiveEditableLine","shiftKey","activeTargets","actives","isAutoLayout","movableActiveCells","snap","_snapToGrid$size","_snapToObject$distanc","_snapToObject$positio","intermediateSnap","grid","object","snapToGrid","snapToObject","distance","normalizeSnapOptions","snapToObjectPositions","originals","firstOriginalPosition","snapToObjectTargets","objectCells","snapMovement","newPositions","xAlign","yAlign","xAlignCell","yAlignCell","diffX","diffY","snapToObjectDistance","xAlignFrom","yAlignFrom","xAlignTarget","yAlignTarget","xAlignToY","yAlignToX","targetPositions","originalPositions","Object","entries","horizontal","vertical","dX","dY","snapToGridSize","firstNewPosition","round","snapToGridMovement","snapToGridDiffX","snapToGridDiffY","_ref5","_ref4","_c$view$vertices","guideLines","_ref6","_supports","getContentEditable","editable","div","createElement","setAttribute","contentEditable","supportsContentEditablePlaintextOnly","selectAllText","range","createRange","selectNodeContents","selection","window","getSelection","removeAllRanges","addRange","decoratorComponents","onDecoratorTextEditing","onDecoratorTextChange","textRef","resizeHandleRef","editingLabel","setEditingLabel","currentLabel","setCurrentLabel","shouldEmitLabelChange","setShouldEmitLabelChange","recomputation","setRecomputation","titleForeignRect","setTitleForeignRect","handleEnableEdit","handleInput","textContent","handleBlur","uuidV4","_textRef$current","textParentEle","focus","resizeHandle","titleStyle","onInput","onBlur","_cell$view$text","editingLabelInitialized","_ref$current","lockedPosition","lastPoint","firstPoint","dy","dx","useEndPoint","point1","point2","twistedAngle","PI","getLineLockIconPosition","DecoratorComponent","SpecifiedComponent","computeContainerRect","minX","minY","maxX","maxY","n","isFinite","CellComponent","dragoverContainer","hoverCell","unrelatedCells","curActiveEditableLine","onCellContextMenu","onCellClick","onNodeBrickResize","onCellMouseEnter","onCellMouseLeave","containerRect","containCells","isEntry","handleContextMenu","handleCellClick","handleMouseLeave","faded","onContextMenu","findNodeOrAreaDecorator","LINE_JUMP_BASE_SIZE","lineJumpIntersect","p2","p3","p4","intersect","r2","useEditableLineMap","WeakMap","collectLineJumps","allJumps","allLineSegments","lineJumps","lineSegments","start","end","jumpPoints","jumps","jumpLoop","jump","pow","segJumps","sortBy","j","collectLineJumpsFactory","sourceNode","targetNode","_c$view","DEFAULT_CELL_ORDERS","decorators","insertCell","newCell","insertCells","findIndex","order","matchCellOrder","warn","targetIndex","findLastIndex","rootReducer","reducers","state","existedEdgeIndex","existedDecoratorIndex","matched","newState","move","fromEntries","center","fixedPosition","nodePadding","collide","radiusDiff","strength","iterations","forceNodes","forceLinks","fx","fy","linkSimulation","forceLink","simulation","forceSimulation","force","forceX","forceY","forceManyBody","forceCollide","stop","tick","ceil","log","alphaMin","alphaDecay","manuallyTickToTheEnd","updateCells","previousCells","reason","parent","isManualLayout","updateCandidates","shouldReCenter","previousSizeInitializedNodes","previousShouldCentered","previousNode","handled","downstreamNodeIds","parentNode","downstreamNodes","Boolean","rightMostNode","nextX","nextY","totalWidth","reduce","acc","positionedNodes","hasDecorators","transformToCenter","without","updated","props","xmlns","viewBox","ZoomBarComponent","shadowRoot","onZoomChange","onReCenter","currentTheme","useCurrentTheme","cache","createCache","zoomBarRef","tooltip","formatter","getPopupContainer","onZoomIn","onZoomOut","ConfigProvider","theme","algorithm","darkAlgorithm","defaultAlgorithm","StyleProvider","container","autoClear","hashPriority","role","CenterSVG","ZoomInSVG","Slider","step","included","onChange","ZoomOutSVG","useLineMarkers","defaultEdgeLines","markerPrefix","lineConnector","useMemoizedResult","memoizedResult","markers","markerType","lineConnectorConf","getDefaultLineConf","omitBy","isUndefined","_type","markerIndex","addMarker","editingMarkerIndex","_secret_internals$le","computedLineConf","Array","isArray","transformLineConf","showEndArrow","activeStrokeColor","activeMarkerIndex","activeRelatedStrokeColor","activeRelatedMarkerIndex","_lineConf$label","restLabel","restConf","computedRestConf","showStartArrow","isMac","_userAgentData$platfo","_userAgentData","userAgentData","platform","wheelData","deltaY","deltaMode","useZoom","scrollable","pannable","draggable","ctrlDraggable","_scaleRange","grabbing","setGrabbing","setTransform","zoom","wheelDelta","scaleExtent","on","rootSelection","unsetZoom","translateBy","wheelDeltaX","wheelDeltaY","targetA","targetB","useReady","RectangleRelativeConnectPointsWithDirection","RectangleRelativeConnectPoints","getConnectPointsOfRectangle","dagreGraphOptions","rankdir","ranksep","edgesep","nodesep","graph","dagre","Graph","setGraph","setDefaultEdgeLabel","setNode","setEdge","HoverStateContext","activeEditableLines"],"sourceRoot":""}
|