@next-bricks/diagram 0.52.2 → 0.52.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/bricks.json +1 -1
  2. package/dist/chunks/{2867.81669469.js → 2867.5eea22a8.js} +2 -2
  3. package/dist/chunks/2867.5eea22a8.js.map +1 -0
  4. package/dist/chunks/3119.ae803df5.js +2 -0
  5. package/dist/chunks/3119.ae803df5.js.map +1 -0
  6. package/dist/chunks/{3233.58b913fb.js → 3233.27ce919d.js} +3 -3
  7. package/dist/chunks/{3233.58b913fb.js.map → 3233.27ce919d.js.map} +1 -1
  8. package/dist/chunks/{4411.9226d910.js → 4411.bb9af195.js} +3 -3
  9. package/dist/chunks/4411.bb9af195.js.map +1 -0
  10. package/dist/chunks/{4837.989fa370.js → 4837.631af414.js} +2 -2
  11. package/dist/chunks/{4837.989fa370.js.map → 4837.631af414.js.map} +1 -1
  12. package/dist/chunks/{7218.4837fbe7.js → 7218.93522183.js} +2 -2
  13. package/dist/chunks/{7218.4837fbe7.js.map → 7218.93522183.js.map} +1 -1
  14. package/dist/chunks/main.e2b08130.js +2 -0
  15. package/dist/chunks/{main.9b5c4ad2.js.map → main.e2b08130.js.map} +1 -1
  16. package/dist/examples.json +3 -3
  17. package/dist/index.26c829f6.js +2 -0
  18. package/dist/{index.fe4c1ded.js.map → index.26c829f6.js.map} +1 -1
  19. package/dist/manifest.json +81 -81
  20. package/package.json +3 -3
  21. package/dist/chunks/2867.81669469.js.map +0 -1
  22. package/dist/chunks/4411.9226d910.js.map +0 -1
  23. package/dist/chunks/822.71a0bdf1.js +0 -2
  24. package/dist/chunks/822.71a0bdf1.js.map +0 -1
  25. package/dist/chunks/main.9b5c4ad2.js +0 -2
  26. package/dist/index.fe4c1ded.js +0 -2
  27. /package/dist/chunks/{3233.58b913fb.js.LICENSE.txt → 3233.27ce919d.js.LICENSE.txt} +0 -0
  28. /package/dist/chunks/{4411.9226d910.js.LICENSE.txt → 4411.bb9af195.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunks/2867.5eea22a8.js","mappings":"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","sources":["webpack:///./src/draw-canvas/processors/findNodeOrAreaDecorator.ts","webpack:///./src/draw-canvas/LineLabelComponent.tsx","webpack:///./src/draw-canvas/EdgeComponent.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/decorators/DecoratorArea.tsx","webpack:///./src/draw-canvas/decorators/DecoratorText.tsx","webpack:///./src/draw-canvas/decorators/DecoratorContainer.tsx","webpack:///./src/draw-canvas/decorators/index.tsx","webpack:///./src/draw-canvas/processors/computeContainerRect.ts","webpack:///./src/draw-canvas/CellComponent.tsx","webpack:///./src/draw-canvas/ConnectLineComponent.tsx","webpack:///./src/shared/canvas/processors/getEditingLinePoints.ts","webpack:///./src/draw-canvas/EditingLineComponent.tsx","webpack:///./src/draw-canvas/HoverStateContext.ts","webpack:///./src/draw-canvas/LineConnectorComponent.tsx","webpack:///./src/draw-canvas/LineEditorComponent.tsx","webpack:///./src/draw-canvas/SmartConnectLineComponent.tsx","webpack:///./src/shared/canvas/processors/getConnectLinePoints.ts","webpack:///./src/draw-canvas/constants.ts","webpack:///./src/draw-canvas/processors/asserts.ts","webpack:///./src/draw-canvas/processors/cellToTarget.ts","webpack:///./src/draw-canvas/processors/getUnrelatedCells.ts","webpack:///./src/draw-canvas/processors/handleKeyboard.ts","webpack:///./src/draw-canvas/processors/handleLasso.ts","webpack:///./src/draw-canvas/processors/handleNodeContainedChange.ts","webpack:///./src/draw-canvas/processors/initializeCells.ts","webpack:///./src/draw-canvas/processors/sameTarget.ts","webpack:///./src/draw-canvas/processors/targetIsActive.ts","webpack:///./src/draw-canvas/processors/transformToCenter.ts","webpack:///./src/draw-canvas/processors/updateCells.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/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/dagreLayout.ts","webpack:///./src/shared/canvas/forceLayout.ts","webpack:///./src/shared/canvas/processors/nodeViewToNodeRect.ts","webpack:///./src/shared/canvas/processors/getSmartLinePoints.ts","webpack:///./src/shared/canvas/shapes/Rectangle.ts","webpack:///./src/shared/canvas/useActiveTarget.ts","webpack:///./src/draw-canvas/processors/normalizeAlignOrigin.ts","webpack:///./src/shared/canvas/useLayout.ts","webpack:///./src/shared/canvas/useAutoCenter.ts","webpack:///./src/shared/canvas/useLineMarkers.ts","webpack:///./src/shared/canvas/useReady.ts","webpack:///./src/shared/canvas/useZoom.ts","webpack:///./src/shared/canvas/ZoomBarComponent.shadow.css","webpack:///./src/shared/canvas/styles.shadow.css"],"sourcesContent":["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 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 } from \"./interfaces\";\n\nexport interface LineLabelComponentProps {\n edge: EdgeCell;\n position?: 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 label,\n text,\n onRendered,\n onClick,\n}: LineLabelComponentProps): JSX.Element | null {\n if (!label && !text) {\n return null;\n }\n return (\n <foreignObject\n className={classNames(\"line-label-container\", { ready: !!position })}\n x={position?.[0]}\n y={position?.[1]}\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 Cell,\n ComputedEdgeLineConf,\n EdgeCell,\n} from \"./interfaces\";\nimport { isEdgeCell, isStraightType } from \"./processors/asserts\";\nimport { DEFAULT_LINE_INTERACT_ANIMATE_DURATION } from \"./constants\";\nimport { curveLine } from \"../diagram/lines/curveLine\";\nimport { getSmartLinePoints } from \"../shared/canvas/processors/getSmartLinePoints\";\nimport { findNodeOrAreaDecorator } from \"./processors/findNodeOrAreaDecorator\";\nimport { useHoverStateContext } from \"./HoverStateContext\";\nimport { getMarkers } from \"../shared/canvas/useLineMarkers\";\nimport type {\n LineMarkerConf,\n PositionTuple,\n SimpleRect,\n SizeTuple,\n} from \"../diagram/interfaces\";\nimport { LineLabelComponent } from \"./LineLabelComponent\";\nimport { cellToTarget } from \"./processors/cellToTarget\";\n\nexport interface EdgeComponentProps {\n edge: EdgeCell;\n cells: Cell[];\n lineConfMap: WeakMap<EdgeCell, ComputedEdgeLineConf>;\n active?: boolean;\n readOnly?: boolean;\n onSwitchActiveTarget?(activeTarget: ActiveTarget | null): void;\n}\n\nexport function EdgeComponent({\n edge,\n cells,\n lineConfMap,\n active,\n readOnly,\n onSwitchActiveTarget,\n}: EdgeComponentProps): JSX.Element | null {\n const { setActiveEditableLine } = useHoverStateContext();\n const pathRef = useRef<SVGPathElement | null>(null);\n const sourceNode = useMemo(\n () => findNodeOrAreaDecorator(cells, edge.source),\n [cells, edge.source]\n );\n const targetNode = useMemo(\n () => findNodeOrAreaDecorator(cells, edge.target),\n [cells, edge.target]\n );\n const lineConf = useMemo(() => lineConfMap.get(edge)!, [edge, lineConfMap]);\n\n const parallelGap = useMemo(() => {\n const hasOppositeEdge =\n isStraightType(edge.view?.type) &&\n cells.some(\n (cell) =>\n isEdgeCell(cell) &&\n cell.source === edge.target &&\n cell.target === edge.source &&\n isStraightType(cell.view?.type)\n );\n return hasOppositeEdge ? lineConf.parallelGap : 0;\n }, [cells, edge.source, edge.target, edge.view, lineConf.parallelGap]);\n\n const linePoints = useMemo(() => {\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 edge.view,\n parallelGap\n )\n : null;\n return points;\n }, [edge.view, parallelGap, sourceNode, targetNode]);\n\n const line = useMemo(() => {\n const fixedLineType = lineConf.type;\n return curveLine(\n linePoints,\n fixedLineType === \"curve\" ? lineConf.curveType : \"curveLinear\",\n 0,\n 1\n );\n }, [lineConf, linePoints]);\n\n useEffect(() => {\n setActiveEditableLine((prev) =>\n active\n ? linePoints && sourceNode && targetNode\n ? {\n edge,\n source: sourceNode,\n target: targetNode,\n linePoints,\n lineType: lineConf.type,\n lineCurveType: lineConf.curveType,\n parallelGap,\n }\n : null\n : prev?.edge &&\n prev.edge.source === edge.source &&\n prev.edge.target === edge.target\n ? null\n : prev\n );\n }, [\n active,\n edge,\n lineConf.curveType,\n lineConf.type,\n linePoints,\n setActiveEditableLine,\n sourceNode,\n targetNode,\n parallelGap,\n ]);\n\n const lineMaskPrefix = useMemo(() => uniqueId(\"line-mask-\"), []);\n\n const [labelPosition, setLabelPosition] = useState<PositionTuple | 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 // istanbul ignore next\n if (path && (lineConf.label || lineConf.text)) {\n if (process.env.NODE_ENV === \"test\") {\n setLabelPosition([30, 40]);\n setLineRect({ x: 10, y: 20, width: 300, height: 400 });\n return;\n }\n const pathLength = path.getTotalLength();\n const pathPoint = path.getPointAtLength(pathLength / 2);\n setLabelPosition([pathPoint.x, pathPoint.y]);\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]);\n\n const pathRefCallback = useCallback(\n (element: SVGPathElement | null) => {\n pathRef.current = element;\n // istanbul ignore next\n if (element?.getTotalLength) {\n element.style.setProperty(\n \"--solid-length\",\n `${element.getTotalLength()}`\n );\n }\n updateLabelPosition();\n },\n [updateLabelPosition]\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 = useMemo<SimpleRect | null>(() => {\n if (!labelPosition || !labelSize) {\n return null;\n }\n const padding = 3;\n return {\n left: labelPosition[0] - labelSize[0] / 2 - padding,\n top: labelPosition[1] - labelSize[1] / 2 - padding,\n width: labelSize[0] + padding * 2,\n height: labelSize[1] + padding * 2,\n };\n }, [labelPosition, labelSize]);\n\n if (!line || !linePoints) {\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 const lineMarkers: LineMarkerConf[] = getMarkers(lineConf);\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 const maskUrl = mask ? `url(#${lineMaskPrefix})` : undefined;\n\n return (\n <>\n {mask && lineRect && (\n <defs>\n <mask\n id={lineMaskPrefix}\n maskUnits=\"userSpaceOnUse\"\n x={lineRect.x}\n y={lineRect.y}\n width={lineRect.width}\n height={lineRect.height}\n >\n <rect\n x={lineRect.x}\n y={lineRect.y}\n width={lineRect.width}\n height={lineRect.height}\n // Everything under a white pixel will be visible\n fill=\"white\"\n />\n <rect\n x={mask.left}\n y={mask.top}\n width={mask.width}\n height={mask.height}\n // Everything under a black pixel will be invisible\n fill=\"black\"\n />\n </mask>\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 mask={maskUrl}\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 mask={maskUrl}\n style={\n {\n \"--time\": `${lineConf.animate.duration ?? DEFAULT_LINE_INTERACT_ANIMATE_DURATION}s`,\n } as React.CSSProperties\n }\n d={line}\n fill=\"none\"\n stroke={lineConf.strokeColor}\n strokeWidth={lineConf.strokeWidth}\n markerStart={markerStart}\n markerEnd={markerEnd}\n />\n <path className=\"line-active-bg\" d={line} fill=\"none\" mask={maskUrl} />\n </g>\n <LineLabelComponent\n edge={edge}\n position={labelPosition}\n label={lineConf.label}\n text={lineConf.text}\n onClick={onLabelClick}\n onRendered={handleLabelRendered}\n />\n </>\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 { NodeBrickCell, NodeBrickConf, NodeCell } from \"./interfaces\";\nimport type { SizeTuple } from \"../diagram/interfaces\";\n\nexport interface NodeComponentProps {\n node: NodeCell;\n degraded: boolean;\n degradedNodeLabel?: string;\n defaultNodeBricks?: NodeBrickConf[];\n onResize(id: string, size: SizeTuple | null): void;\n}\n\nexport function NodeComponent({\n node,\n degraded,\n degradedNodeLabel,\n defaultNodeBricks,\n onResize,\n}: NodeComponentProps): JSX.Element | null {\n const memoizedData = useDeepMemo({ node: { id: node.id, data: node.data } });\n const specifiedUseBrick = (node as NodeBrickCell).useBrick;\n const observerRef = useRef<ResizeObserver | null>(null);\n\n const useBrick = useMemo(() => {\n return degraded\n ? null\n : specifiedUseBrick ??\n defaultNodeBricks?.find((item) =>\n checkIfByTransform(item, memoizedData)\n )?.useBrick;\n }, [degraded, specifiedUseBrick, defaultNodeBricks, memoizedData]);\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 refCallback = useCallback(\n (element: HTMLElement | null) => {\n const prevObserver = observerRef.current;\n if (prevObserver) {\n prevObserver.disconnect();\n observerRef.current = null;\n }\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 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 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 return useBrick ? (\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 >\n {useBrick && (\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}\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} from \"../interfaces\";\nimport type {\n MoveCellPayload,\n ResizeCellPayload,\n} from \"../reducers/interfaces\";\nimport {\n isContainerDecoratorCell,\n isDecoratorCell,\n isEdgeCell,\n isNodeCell,\n} from \"./asserts\";\nimport { cellToTarget } from \"./cellToTarget\";\nimport { getSnapPositions, type SnapPositions } from \"./getSnapPositions\";\nimport { normalizeSnapOptions } from \"./normalizeSnapOptions\";\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 }: {\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 }\n) {\n event.stopPropagation();\n // Drag node\n if (action === \"resize\" || !targetIsActive(cell, activeTarget)) {\n onSwitchActiveTarget?.(cellToTarget(cell));\n }\n if (isEdgeCell(cell)) {\n return;\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) => (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 (c) => !isEdgeCell(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 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 // 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 if (!moved) {\n moved = movement[0] ** 2 + movement[1] ** 2 >= 9;\n }\n } else {\n // Snap\n let diffX = Infinity;\n let diffY = Infinity;\n const snapMovement: PositionTuple = [...movement];\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 Math.round(position[0] + snapMovement[0]),\n Math.round(position[1] + snapMovement[1]),\n ]);\n const changed =\n newPositions[0][0] !== previousPositions[0][0] ||\n newPositions[0][1] !== previousPositions[0][1];\n if (changed) {\n previousPositions = newPositions;\n moved = true;\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 }));\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","import React, { useEffect } from \"react\";\nimport type { BasicDecoratorProps } from \"../interfaces\";\nimport { handleMouseDown } from \"../processors/handleMouseDown\";\n\nexport function DecoratorArea({\n cell,\n transform,\n readOnly,\n layoutOptions,\n activeTarget,\n cells,\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\">\n <rect\n width={cell.view.width}\n height={cell.view.height}\n className=\"area\"\n />\n {!readOnly && (\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 </g>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { BasicDecoratorProps } from \"../interfaces\";\nimport classNames from \"classnames\";\n\nexport type DecoratorTextProps = Pick<\n BasicDecoratorProps,\n \"cell\" | \"readOnly\" | \"onDecoratorTextEditing\" | \"onDecoratorTextChange\"\n>;\n\nexport function DecoratorText({\n cell,\n readOnly,\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) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n setEditingLabel(true);\n },\n [readOnly]\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 <foreignObject className=\"decorator-text\">\n <div\n className={classNames(\"text-container\", { editing: editingLabel })}\n onDoubleClick={handleEnableEdit}\n >\n <div\n className=\"text\"\n contentEditable={editingLabel}\n ref={ref}\n onInput={handleInput}\n onBlur={handleBlur}\n />\n </div>\n </foreignObject>\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, { 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 \"..\";\n\nexport function DecoratorContainer({\n cell,\n transform,\n readOnly,\n layout,\n view,\n activeTarget,\n cells,\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) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n setEditingLabel(true);\n },\n [readOnly]\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 >\n <div\n className=\"text\"\n contentEditable={editingLabel}\n ref={textRef}\n onInput={handleInput}\n onBlur={handleBlur}\n />\n </div>\n </foreignObject>\n <rect width={view.width} height={view.height} className=\"container\" />\n {!readOnly && !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 </g>\n );\n}\n","import React from \"react\";\nimport type { BasicDecoratorProps } from \"../interfaces\";\nimport { DecoratorArea } from \"./DecoratorArea\";\nimport { DecoratorText } from \"./DecoratorText\";\nimport { DecoratorContainer } from \"./DecoratorContainer\";\n\nexport function DecoratorComponent({\n cell,\n view,\n transform,\n readOnly,\n layout,\n layoutOptions,\n activeTarget,\n cells,\n onCellResizing,\n onCellResized,\n onSwitchActiveTarget,\n onDecoratorTextEditing,\n onDecoratorTextChange,\n}: BasicDecoratorProps): JSX.Element | null {\n let SpecifiedComponent: (props: BasicDecoratorProps) => JSX.Element | null;\n\n switch (cell.decorator) {\n case \"container\":\n SpecifiedComponent = DecoratorContainer;\n break;\n case \"area\":\n SpecifiedComponent = DecoratorArea;\n break;\n case \"text\":\n SpecifiedComponent = DecoratorText;\n break;\n // istanbul ignore next\n default:\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 activeTarget={activeTarget}\n cells={cells}\n onCellResizing={onCellResizing}\n onCellResized={onCellResized}\n onSwitchActiveTarget={onSwitchActiveTarget}\n onDecoratorTextEditing={onDecoratorTextEditing}\n onDecoratorTextChange={onDecoratorTextChange}\n />\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 EdgeCell,\n LayoutOptions,\n LayoutType,\n NodeBrickConf,\n NodeCell,\n} from \"./interfaces\";\nimport {\n isContainerDecoratorCell,\n isDecoratorCell,\n isEdgeCell,\n isEdgeSide,\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<EdgeCell, ComputedEdgeLineConf>;\n activeTarget: ActiveTarget | null | undefined;\n readOnly?: boolean;\n unrelatedCells: Cell[];\n dragNodeToContainerActive?: boolean;\n allowEdgeToArea?: boolean;\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: CellContextMenuDetail): 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 activeTarget,\n dragNodeToContainerActive,\n readOnly,\n transform,\n unrelatedCells,\n allowEdgeToArea,\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 // `containerRect` is undefined when it's an edge cell.\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)\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 });\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 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 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 (lineEditorState) {\n const {\n type,\n source,\n target,\n edge: { view },\n } = lineEditorState;\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 allowEdgeToArea,\n cell,\n lineEditorState,\n onChangeEdgeView,\n onConnect,\n setLineEditorState,\n setSmartConnectLineState,\n smartConnectLineState,\n ]);\n\n const handleContextMenu = useCallback(\n (event: React.MouseEvent<SVGGElement>) => {\n if (readOnly && cell.type === \"decorator\") {\n return;\n }\n event.preventDefault();\n onSwitchActiveTarget(cellToTarget(cell));\n onCellContextMenu({\n cell,\n clientX: event.clientX,\n clientY: event.clientY,\n });\n },\n [cell, onCellContextMenu, onSwitchActiveTarget, readOnly]\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 });\n },\n [cell, onCellClick]\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\n return (\n <g\n className={classNames(\"cell\", {\n active,\n faded: unrelated,\n \"read-only\": readOnly,\n \"container-active\": dragNodeToContainerActive,\n })}\n ref={gRef}\n transform={\n cell.type === \"edge\" || cell.view.x == 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 degraded={degraded}\n degradedNodeLabel={degradedNodeLabel}\n defaultNodeBricks={defaultNodeBricks}\n onResize={onNodeBrickResize}\n />\n ) : isEdgeCell(cell) ? (\n <EdgeComponent\n edge={cell}\n cells={cells}\n lineConfMap={lineConfMap}\n active={active}\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 activeTarget={activeTarget}\n cells={cells}\n onCellResizing={onCellResizing}\n onCellResized={onCellResized}\n onSwitchActiveTarget={onSwitchActiveTarget}\n onDecoratorTextEditing={onDecoratorTextEditing}\n onDecoratorTextChange={onDecoratorTextChange}\n />\n ) : null}\n </g>\n );\n}\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 { pick } from \"lodash\";\nimport type { NodePosition, PositionTuple } from \"../../../diagram/interfaces\";\nimport type { HoverState } from \"../../../draw-canvas/HoverStateContext\";\nimport type {\n LineEditorState,\n LineEditorStateOfControl,\n} from \"../../../draw-canvas/interfaces\";\nimport { getSmartLinePoints, simplifyVertices } from \"./getSmartLinePoints\";\n\nexport function getEditingLinePoints(\n lineEditorState: LineEditorState | null,\n connectLineTo: PositionTuple | null,\n hoverState: HoverState | null\n): NodePosition[] | null {\n if (\n !lineEditorState ||\n !(\n connectLineTo ||\n (lineEditorState.type !== \"control\" &&\n hoverState?.activePointIndex !== undefined)\n )\n ) {\n return null;\n }\n\n const {\n type,\n source,\n target,\n edge: { view },\n } = lineEditorState;\n const { exitPosition, entryPosition, vertices } = view ?? {};\n\n const lineSettings = pick(view, [\"type\", \"curveType\"]);\n\n if (type === \"control\") {\n const newVertices = getNewLineVertices(lineEditorState, connectLineTo!);\n\n return getSmartLinePoints(source.view, target.view, {\n ...lineSettings,\n exitPosition,\n entryPosition,\n vertices: newVertices,\n });\n }\n\n if (hoverState?.activePointIndex !== undefined) {\n const position = hoverState.relativePoints[hoverState.activePointIndex];\n // Assert `hoverState.cell` is `target`\n return getSmartLinePoints(source.view, target.view, {\n ...lineSettings,\n ...(type === \"entry\"\n ? {\n exitPosition,\n entryPosition: position,\n }\n : {\n exitPosition: position,\n entryPosition,\n }),\n vertices,\n });\n }\n\n const [x1, y1] = connectLineTo!;\n\n if (type === \"entry\") {\n return getSmartLinePoints(\n source.view,\n { x: x1, y: y1, width: 0, height: 0 },\n { ...lineSettings, exitPosition, vertices }\n );\n }\n\n return getSmartLinePoints(\n { x: x1, y: y1, width: 0, height: 0 },\n target.view,\n { ...lineSettings, entryPosition, vertices }\n );\n}\n\nexport function getNewLineVertices(\n lineEditorState: LineEditorStateOfControl,\n connectLineTo: PositionTuple\n) {\n const { control, linePoints } = lineEditorState;\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 { ComputedLineConnecterConf } 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\";\n\nexport interface EditingLineComponentProps {\n transform: TransformLiteral;\n options: ComputedLineConnecterConf;\n}\n\nexport function EditingLineComponent({\n transform,\n options,\n}: EditingLineComponentProps): JSX.Element {\n const [connectLineTo, setConnectLineTo] = useState<PositionTuple | null>(\n null\n );\n const {\n activeEditableLine,\n hoverState,\n lineEditorState,\n setLineEditorState,\n onChangeEdgeView,\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 (!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 let diff = Infinity;\n if (type === \"control\" && !e.altKey) {\n // Snap to other points\n const { linePoints, control } = lineEditorState;\n const axis = control.direction === \"ns\" ? \"y\" : \"x\";\n const original = control[axis];\n const otherPoints = linePoints.filter(\n (_, i) =>\n i === 0 ||\n i === linePoints.length - 1 ||\n (i !== control.index && i !== control.index + 1)\n );\n const snapDistance = 5;\n for (const point of otherPoints) {\n const newDiff = Math.abs(point[axis] - position[axis]);\n if (newDiff <= snapDistance && newDiff < diff) {\n position[axis] = point[axis];\n diff = newDiff;\n if (!movedRef.current && original !== position[axis]) {\n movedRef.current = true;\n }\n }\n }\n }\n if (diff === Infinity && !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 return [position.x, position.y];\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 if (lineEditorState?.type === \"control\") {\n const newConnectTo = getConnectTo(e);\n if (movedRef.current) {\n const {\n source,\n target,\n edge: { view },\n } = lineEditorState;\n onChangeEdgeView?.(source, target, {\n ...view,\n vertices: getNewLineVertices(lineEditorState, newConnectTo),\n });\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 }, [lineEditorState, transform, setLineEditorState, onChangeEdgeView]);\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 lineEditorState,\n connectLineTo,\n hoverState\n );\n return curveLine(\n points,\n lineEditorState?.edge.view?.type === \"curve\"\n ? lineEditorState.edge.view.curveType\n : \"curveLinear\",\n 0,\n 1\n );\n }, [connectLineTo, hoverState, lineEditorState]);\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","// istanbul ignore file: nothing logical to test\nimport React from \"react\";\nimport type {\n DecoratorCell,\n EdgeView,\n EditableLineInfo,\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 activeEditableLine: EditableLineInfo | null;\n activeEditableLineIsAvailable: boolean;\n lineEditorState: LineEditorState | null;\n setLineEditorState: React.Dispatch<\n React.SetStateAction<LineEditorState | null>\n >;\n setActiveEditableLine: React.Dispatch<\n React.SetStateAction<EditableLineInfo | 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}>({\n rootRef: { current: null },\n smartConnectLineState: null,\n unsetHoverStateTimeoutRef: { current: null },\n hoverState: null,\n activeEditableLine: null,\n activeEditableLineIsAvailable: false,\n lineEditorState: null,\n setLineEditorState: () => {},\n setActiveEditableLine: () => {},\n setHoverState: () => {},\n setSmartConnectLineState: () => {},\n});\n\nexport function useHoverStateContext() {\n return React.useContext(HoverStateContext);\n}\n","// istanbul ignore file: experimental\nimport React, { useCallback, useEffect, useRef } from \"react\";\nimport { useHoverStateContext } from \"./HoverStateContext\";\nimport type { ActiveTarget, NodeCell } from \"./interfaces\";\nimport { targetIsActive } from \"./processors/targetIsActive\";\nimport type { NodePosition } from \"../diagram/interfaces\";\nimport { DEFAULT_NODE_PADDING_FOR_SMART_LINES } from \"./constants\";\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 scale: number;\n disabled?: boolean;\n}\n\nexport function LineConnectorComponent({\n activeTarget,\n scale,\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 const available =\n !disabled &&\n hoverState &&\n (!!smartConnectLineState ||\n (lineEditorState\n ? lineEditorState.type === \"entry\"\n ? hoverState.cell === lineEditorState.target\n : lineEditorState.type === \"exit\" &&\n hoverState.cell === lineEditorState.source\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 index={index}\n point={point}\n scale={scale}\n unsetActivePointIndex={unsetActivePointIndex}\n unsetTimeout={unsetTimeout}\n />\n ))}\n </>\n )}\n </g>\n );\n}\n\ninterface ConnectPointComponentProps {\n index: number;\n point: NodePosition;\n scale: number;\n unsetTimeout: () => void;\n unsetActivePointIndex: () => void;\n}\n\nfunction ConnectPointComponent({\n index,\n point,\n scale,\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 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 (lineEditorState) {\n const position =\n hoverState!.relativePoints[hoverState!.activePointIndex!];\n const {\n type,\n source,\n target,\n edge: { view },\n } = lineEditorState;\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 lineEditorState,\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","// istanbul ignore file: experimental\nimport React, { useEffect, useMemo, useRef } from \"react\";\nimport type { NodePosition } from \"../diagram/interfaces\";\nimport { useHoverStateContext } from \"./HoverStateContext\";\nimport type { ControlPoint } from \"./interfaces\";\nimport { isStraightType } from \"./processors/asserts\";\n\nconst POINT_HELPER_IMAGE =\n \"data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIyMnB4IiBoZWlnaHQ9IjIycHgiIHZlcnNpb249IjEuMSI+PGNpcmNsZSBjeD0iMTEiIGN5PSIxMSIgcj0iNyIgc3Ryb2tlPSIjZmZmIiBmaWxsPSIjMjliNmYyIi8+PGNpcmNsZSBjeD0iMTEiIGN5PSIxMSIgcj0iMyIgc3Ryb2tlPSIjZmZmIiBmaWxsPSJ0cmFuc3BhcmVudCIvPjwvc3ZnPg==\";\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}\n\nexport function LineEditorComponent({\n scale,\n}: LineEditorComponentProps): JSX.Element | null {\n const {\n rootRef,\n activeEditableLine,\n activeEditableLineIsAvailable,\n setLineEditorState,\n } = useHoverStateContext();\n const exitRef = useRef<SVGImageElement>(null);\n const entryRef = useRef<SVGImageElement>(null);\n const controlPointsRef = useRef<(SVGImageElement | null)[]>([]);\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 ...activeEditableLine,\n offset: [rect.left, rect.top],\n from: [e.clientX, e.clientY],\n type,\n });\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 }, [activeEditableLine, rootRef, setLineEditorState]);\n\n const controlPoints = useMemo(() => {\n return activeEditableLine &&\n !isStraightType(activeEditableLine.edge.view?.type)\n ? getControlPoints(activeEditableLine!.linePoints)\n : [];\n }, [activeEditableLine]);\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 const rect = rootRef.current!.getBoundingClientRect();\n setLineEditorState({\n ...activeEditableLine!,\n offset: [rect.left, rect.top],\n from: [e.clientX, e.clientY],\n type: \"control\",\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 }, [activeEditableLine, controlPoints, rootRef, setLineEditorState]);\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 (!activeEditableLine || !activeEditableLineIsAvailable) {\n return null;\n }\n const {\n linePoints,\n edge: { view },\n } = activeEditableLine;\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 exitPosition ? ANCHORED_POINT_HELPER_IMAGE : 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 xlinkHref={VERTEX_HELPER_IMAGE}\n cursor={point.direction === \"ns\" ? \"row-resize\" : \"col-resize\"}\n />\n ))}\n <image\n ref={entryRef}\n {...commonProps}\n x={entryPoint.x - offset}\n y={entryPoint.y - offset}\n xlinkHref={\n entryPosition ? ANCHORED_POINT_HELPER_IMAGE : 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 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","// 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 options.type === \"curve\" ? options.curveType : \"curveLinear\",\n 0,\n 1\n );\n }, [connectLineTo, hoverState, smartConnectLineState, options, 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","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_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;\n\nexport const POINT_HELPER_RADIUS = 5;\n","import type {\n Cell,\n DecoratorCell,\n EdgeCell,\n InitialCell,\n InitialNodeCell,\n LayoutType,\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 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","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","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 { ActiveTarget, Cell } from \"../interfaces\";\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 }: {\n cells: Cell[];\n activeTarget: ActiveTarget | null | undefined;\n }\n): KeyboardAction | undefined {\n const activeCells = cells.filter((cell) =>\n targetIsActive(cell, activeTarget)\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 { 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","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 => isContainerDecoratorCell(cell)\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","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 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 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 { TransformLiteral } from \"../../diagram/interfaces\";\nimport type { Cell } from \"../interfaces\";\nimport { isEdgeCell } from \"./asserts\";\n\nexport interface TransformToCenterOptions {\n canvasWidth: number;\n canvasHeight: number;\n scaleRange?: [min: number, max: number];\n}\n\nexport function transformToCenter(\n cells: Cell[],\n { canvasWidth, canvasHeight, scaleRange }: TransformToCenterOptions\n): TransformLiteral {\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 const scale =\n scaleRange && !empty && (width > canvasWidth || height > canvasHeight)\n ? Math.max(\n Math.min(canvasWidth / width, canvasHeight / height, scaleRange[1]),\n scaleRange[0]\n )\n : 1;\n\n const x = empty ? 0 : (canvasWidth - width * scale) / 2 - left * scale;\n const y = empty ? 0 : (canvasHeight - height * scale) / 2 - top * scale;\n\n return { x, y, k: scale };\n}\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 { Reducer } from \"react\";\nimport type { DrawCanvasAction } from \"./interfaces\";\nimport type { Cell, EdgeCell, NodeCell } from \"../interfaces\";\nimport { isNodeCell } from \"../processors/asserts\";\nimport { SYMBOL_FOR_SIZE_INITIALIZED } from \"../constants\";\n\nexport const cells: Reducer<Cell[], DrawCanvasAction> = (state, action) => {\n switch (action.type) {\n case \"drop-node\":\n return insertCellAfter(\n state,\n action.payload,\n (cell) => !(cell.type === \"decorator\" && cell.decorator === \"text\")\n );\n case \"drop-decorator\": {\n if (action.payload.decorator === \"text\") {\n return [...state, action.payload];\n }\n return insertCellAfter(\n state,\n action.payload,\n (cell) => cell.type === \"decorator\" && cell.decorator === \"area\"\n );\n }\n case \"add-nodes\": {\n const index =\n state.findLastIndex(\n (cell) => !(cell.type === \"decorator\" && cell.decorator === \"text\")\n ) + 1;\n return [\n ...state.slice(0, index),\n ...action.payload,\n ...state.slice(index),\n ];\n }\n case \"add-edge\": {\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 insertCellAfter(\n state,\n action.payload,\n (cell) =>\n cell.type === \"edge\" ||\n (cell.type === \"decorator\" && cell.decorator === \"area\")\n );\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: {\n ...(state[existedEdgeIndex] as EdgeCell).view,\n ...action.payload.view,\n },\n },\n ...state.slice(existedEdgeIndex + 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: { ...(cell as NodeCell).view, x: newCell.x, y: newCell.y },\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 insertCellAfter(\n cells: Cell[],\n newCell: Cell,\n after: (cell: Cell) => boolean\n) {\n const index = cells.findLastIndex(after) + 1;\n return [...cells.slice(0, index), newCell, ...cells.slice(index)];\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 * 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 { 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 { 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","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 EdgeView,\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 edgeView: EdgeView | undefined,\n parallelGap?: number\n): NodePosition[] | null {\n const {\n type,\n vertices,\n exitPosition: originalExit,\n entryPosition: originalEntry,\n } = edgeView ?? {};\n\n if (isStraightType(type)) {\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 edgeView\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","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 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 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} 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 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 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 });\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 }, [cells, dispatch, layout, layoutKey, layoutOptions /* , setCentered */]);\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 { RangeTuple } from \"../../diagram/interfaces\";\nimport { SYMBOL_FOR_SIZE_INITIALIZED } from \"../../draw-canvas/constants\";\nimport type { Cell } from \"../../draw-canvas/interfaces\";\nimport {\n isDecoratorCell,\n isNodeCell,\n} from \"../../draw-canvas/processors/asserts\";\nimport { transformToCenter } from \"../../draw-canvas/processors/transformToCenter\";\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}\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}: 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 const { k, x, y } = transformToCenter(cells, {\n canvasWidth: root.clientWidth,\n canvasHeight: root.clientHeight,\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 ]);\n\n return [centered, setCentered];\n}\n","import { useMemo } 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 LineConnecterConf,\n LineMarker,\n} from \"../../draw-canvas/interfaces\";\nimport { isEdgeCell } 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} 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}\n\nexport function useLineMarkers({\n cells,\n defaultEdgeLines,\n markerPrefix,\n lineConnector,\n}: UseLineMarkersOptions): {\n lineConfMap: WeakMap<EdgeCell, ComputedEdgeLineConf>;\n lineConnectorConf: ComputedLineConnecterConf | null;\n markers: LineMarker[];\n} {\n return useMemo(() => {\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<EdgeCell, ComputedEdgeLineConf>();\n for (const cell of cells) {\n if (isEdgeCell(cell)) {\n const computedLineConf =\n (Array.isArray(defaultEdgeLines)\n ? __secret_internals.legacyDoTransform(\n { edge: cell },\n defaultEdgeLines.find((item) =>\n checkIfByTransform(item, { edge: cell })\n )\n )\n : (\n __secret_internals.legacyDoTransform(\n { edge: cell },\n defaultEdgeLines\n ) as EdgeLineConf[]\n )?.find((item) => checkIfOfComputed(item))) ?? {};\n const 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\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 map.set(cell, lineConf);\n }\n }\n return { lineConfMap: map, lineConnectorConf, markers };\n }, [cells, defaultEdgeLines, lineConnector, markerPrefix]);\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 };\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 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 (event.type === \"wheel\" ||\n (ctrlDraggable ? draggable || event.ctrlKey : !event.ctrlKey)) &&\n !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) {\n // Stop immediate propagation for default d3 zoom handler\n e.stopImmediatePropagation();\n if (scrollable) {\n e.preventDefault();\n zoomer.translateBy(\n rootSelection,\n e.wheelDeltaX / 5,\n e.wheelDeltaY / 5\n );\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 e.preventDefault();\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","// 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","// 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}: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.decorator-container .container{fill:rgba(119,141,195,0.1);stroke:none;stroke-width:0}.node,\n.decorator-text{overflow:visible}.cell.active .decorator-area .area,\n.cell.active .decorator-container .container,\n.cell:not(.read-only) .decorator-container .container:hover,\n.allowEdgeToArea .decorator-area .area:hover,\n.cell.active .line-active-bg{stroke:var(--palette-blue-5);stroke-dasharray:var(--dasharray);stroke-width:1}.container-active .decorator-container .container{stroke:var(--palette-blue-5);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}.cell.active .decorator-area .resize-handle,\n.decorator-area: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)}.cell.active .decorator-text .text-container{outline:1px dashed var(--palette-blue-5)}.decorator-text .text-container{width:max-content;padding:0.5em}.decorator-text .text:focus{outline:none}.cell.faded{opacity:0.3}.cell.container-active{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;background-color:rgba(119,141,195,0.6);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}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n"],"names":["findNodeOrAreaDecorator","cells","id","find","cell","isNodeOrAreaDecoratorCell","LineLabelComponent","_ref","edge","position","label","text","onRendered","onClick","React","className","classNames","ready","x","y","LineLabelUseBrickComponent","LineLabelTextComponent","_ref2","refCallback","useCallback","element","ref","style","content","_ref3","useBrick","useMemo","checkIfOfComputed","memoizedData","useEffect","setTimeout","parentElement","ignoredCallback","ReactUseBrick","data","EdgeComponent","_lineConf$animate$dur","lineConfMap","active","readOnly","onSwitchActiveTarget","setActiveEditableLine","useHoverStateContext","pathRef","useRef","sourceNode","source","targetNode","target","lineConf","get","parallelGap","_edge$view","isStraightType","view","type","some","_cell$view","isEdgeCell","linePoints","getSmartLinePoints","line","fixedLineType","curveLine","curveType","prev","lineType","lineCurveType","lineMaskPrefix","uniqueId","labelPosition","setLabelPosition","useState","labelSize","setLabelSize","lineRect","setLineRect","updateLabelPosition","path","current","pathLength","getTotalLength","pathPoint","getPointAtLength","rect","getBBox","width","height","pathRefCallback","setProperty","labelElement","setLabelElement","resizeObserver","ResizeObserver","observerCallback","offsetWidth","offsetHeight","observe","disconnect","handleLabelRendered","onLabelClick","cellToTarget","onDoubleClick","e","_labelElement$firstEl","_labelElement$firstEl2","callLabelOnDoubleClick","preventDefault","stopPropagation","firstElementChild","call","mask","left","top","padding","markerStart","markerEnd","lineMarkers","getMarkers","marker","placement","$markerStartUrl","$markerEndUrl","maskUrl","undefined","maskUnits","fill","d","stroke","strokeWidth","interactStrokeWidth","dashed","dotted","animate","useAnimate","duration","DEFAULT_LINE_INTERACT_ANIMATE_DURATION","strokeColor","NodeComponent","node","degraded","degradedNodeLabel","defaultNodeBricks","onResize","value","memoizedValue","setMemoizedValue","isEqual","useDeepMemo","specifiedUseBrick","observerRef","_defaultNodeBricks$fi","item","checkIfByTransform","String","__secret_internals","legacyDoTransform","prevObserver","observer","degradedRefCallBack","g","size","cx","cy","r","DEFAULT_ALL_POSITIONS","getSnapPositions","positions","snapPositions","_positions$split$flat","_positions$split","split","flatMap","pos","tuple","Error","HORIZONTAL_POSITIONS","VERTICAL_POSITIONS","handleMouseDown","event","_snap$object","action","scale","layout","layoutOptions","activeTarget","onCellsMoving","onCellsMoved","onCellResizing","onCellResized","targetIsActive","activeCells","actives","filter","c","forEach","a","push","isContainerDecoratorCell","isNodeCell","containerId","includes","isAutoLayout","movableActiveCells","isDecoratorCell","length","snap","_snapToGrid$size","_snapToObject$distanc","_snapToObject$positio","intermediateSnap","grid","object","snapToGrid","snapToObject","DEFAULT_SNAP_GRID_SIZE","distance","DEFAULT_SNAP_OBJECT_DISTANCE","DEFAULT_SNAP_OBJECT_POSITIONS","normalizeSnapOptions","snapToObjectPositions","from","clientX","clientY","originals","map","firstOriginalPosition","previousPositions","snapToObjectTargets","objectCells","moved","handleMove","finished","movement","getMovement","newPositions","xAlign","yAlign","xAlignCell","yAlignCell","altKey","diffX","Infinity","diffY","snapMovement","snapToObjectDistance","xAlignFrom","yAlignFrom","xAlignTarget","yAlignTarget","xAlignToY","yAlignToX","targetPositions","originalPositions","originalPoint","Object","entries","horizontal","vertical","dX","Math","abs","dY","halfHeight","halfWidth","snapToGridSize","firstNewPosition","round","snapToGridMovement","snapToGridDiffX","snapToGridDiffY","_ref4","_ref6","payloads","_ref5","index","decorator","guideLines","_ref7","onMouseMove","onMouseUp","document","removeEventListener","addEventListener","DecoratorArea","transform","resizeHandleRef","resizeHandle","onMouseDown","k","DecoratorText","_cell$view$text","onDecoratorTextEditing","onDecoratorTextChange","currentLabel","setCurrentLabel","editingLabel","setEditingLabel","editingLabelInitialized","shouldEmitLabelChange","setShouldEmitLabelChange","handleEnableEdit","textContent","_ref$current","clientWidth","clientHeight","focus","selectAllText","editing","handleInput","handleBlur","contentEditable","onInput","onBlur","range","createRange","selectNodeContents","selection","window","getSelection","removeAllRanges","addRange","DecoratorContainer","direction","textRef","recomputation","setRecomputation","titleForeignRect","setTitleForeignRect","uuidV4","_textRef$current","textParentEle","isNoManualLayout","DecoratorComponent","SpecifiedComponent","console","error","computeContainerRect","minX","minY","maxX","maxY","n","isFinite","CellComponent","dragNodeToContainerActive","unrelatedCells","allowEdgeToArea","onCellContextMenu","onCellClick","onNodeBrickResize","onCellMouseEnter","onCellMouseLeave","lineEditorState","smartConnectLineState","setSmartConnectLineState","onConnect","setLineEditorState","onChangeEdgeView","gRef","unrelated","sameTarget","containerRect","containCells","isEdgeSide","exitPosition","isEntry","entryPosition","handleContextMenu","handleCellClick","handleMouseEnter","handleMouseLeave","faded","onContextMenu","onMouseEnter","onMouseLeave","ConnectLineComponent","connectLineState","connectLineTo","setConnectLineTo","getConnectTo","offset","reset","capture","connecting","join","getNewLineVertices","control","newVertices","x1","y1","exitPoint","entryPoint","i","vertex","simplifyVertices","EditingLineComponent","options","activeEditableLine","hoverState","movedRef","diff","axis","original","otherPoints","_","snapDistance","point","newDiff","movementX","movementY","newConnectTo","vertices","handleBodyClick","body","_lineEditorState$edge","points","activePointIndex","lineSettings","pick","relativePoints","getEditingLinePoints","$editingStartMarkerUrl","$editingEndMarkerUrl","editingStrokeColor","HoverStateContext","rootRef","unsetHoverStateTimeoutRef","activeEditableLineIsAvailable","setHoverState","HELPER_IMAGE","HELPER_RADIUS","HELPER_BG_RADIUS","HALF_HELPER_RADIUS","LineConnectorComponent","disabled","unsetTimeout","clearTimeout","unsetActivePointIndex","unsetHoverState","available","targets","hasActiveEdge","DEFAULT_NODE_PADDING_FOR_SMART_LINES","halfPadding","pointerEvents","fillOpacity","ConnectPointComponent","key","getBoundingClientRect","handleMouseUp","xlinkHref","preserveAspectRatio","POINT_HELPER_IMAGE","ANCHORED_POINT_HELPER_IMAGE","VERTEX_HELPER_IMAGE","POINT_HELPER_BG_SIZE","LineEditorComponent","exitRef","entryRef","controlPointsRef","exit","entry","handleMouseDownFactory","handleStartMouseDown","handleEndMouseDown","controlPoints","_activeEditableLine$e","cursor","next","ns","ew","getControlPoints","controlElements","handlers","el","commonProps","_extends","SmartConnectLineComponent","sourceView","getConnectLinePoints","SYMBOL_FOR_SIZE_INITIALIZED","Symbol","for","SYMBOL_FOR_LAYOUT_INITIALIZED","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_LINE_INTERACT_STROKE_WIDTH","DEFAULT_LINE_INTERACT_SHOW_START_ARROW","DEFAULT_LINE_INTERACT_SHOW_END_ARROW","DEFAULT_DEGRADED_THRESHOLD","DEFAULT_NODE_PADDING_FOR_LINES","isInitialNodeCell","isNodeOrEdgeCell","isTextDecoratorCell","getUnrelatedCells","existedTargets","Set","add","has","nodesMap","Map","activeNodeIds","relatedNodeIds","set","handleKeyboard","keyCode","which","handleLasso","onLassoing","onLassoed","ctrlKey","button","x0","y0","handleNodeContainedChange","onContainerContainerChange","nodeCells","containerIds","p","v","nodePayloads","nodeCell","includeNodeFlag","payload","right","bottom","containerDecoratorCells","containerCell","containerLeft","containerRight","containerTop","containerBottom","containedChanges","_payload$containerCel","initializeCells","initialCells","defaultNodeSize","_cell$view2","b","every","targetA","targetB","transformToCenter","canvasWidth","canvasHeight","scaleRange","empty","max","min","updateCells","previousCells","reason","parent","isManualLayout","newCells","updateCandidates","shouldReCenter","previousSizeInitializedNodes","previousShouldCentered","previousNode","handled","downstreamNodeIds","parentNode","downstreamNodes","Boolean","rightMostNode","nextX","nextY","totalWidth","reduce","acc","positionedNodes","hasDecorators","getNodeView","without","dagreLayout","forceLayout","fixedPosition","center","updated","insertCellAfter","newCell","after","findLastIndex","slice","rootReducer","reducers","state","existedEdgeIndex","findIndex","matched","newState","move","layoutKey","fromEntries","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","nodePadding","dagreGraphOptions","rankdir","ranksep","edgesep","nodesep","nodePaddings","extractPartialRectTuple","graph","dagre","Graph","setGraph","setDefaultEdgeLabel","setNode","setEdge","collide","radiusDiff","strength","iterations","forceNodes","forceLinks","fx","fy","linkSimulation","forceLink","simulation","forceSimulation","force","forceX","forceY","forceManyBody","forceCollide","radius","sqrt","stop","tick","ceil","log","alphaMin","alphaDecay","manuallyTickToTheEnd","nodeViewToNodeRect","DEFAULT_DIRECTIONS","targetView","edgeView","_connectPoints$find$d","_connectPoints$find","_connectPoints$find$d2","_connectPoints$find2","_sourceDirections$","_targetDirections$","originalExit","originalEntry","getDirectLinePoints","firstVertex","lastVertex","exitDirection","entryDirection","getAbsolutePosition","possibleFirstNextPoint","getDefaultAbsolutePosition","prefer","fitEndpointAndDirection","possibleLastPreviousPoint","reverse","sourceX","sourceY","targetX","targetY","newLinePoints","unshift","getDefaultPosition","connectPoints","getConnectPointsOfRectangleWithDirection","originalSourceDirections","originalTargetDirections","sourceDirections","targetDirections","pull","sourceDirection","targetDirection","sourcePosition","targetPosition","getPolyLinePoints","simplifiedVertices","prevDirection","isHorizontal","isVertical","isHorizontalNext","isVerticalNext","flip","xAxis","yAxis","xSize","ySize","xPosition","oppositeView","nsDirection","ewDirection","_vertices$","nextVertex","RectangleRelativeConnectPointsWithDirection","RectangleRelativeConnectPoints","getConnectPointsOfRectangle","useActiveTarget","_activeTarget","doNotResetActiveTargetForSelector","doNotResetActiveTargetOutsideCanvas","onActiveTargetChange","newActiveTarget","setActiveTarget","previous","activeTargetChangeInitialized","resetActiveTarget","composedPath","rootIndex","indexOf","Element","matches","KeywordMap","normalizeAlignAxis","newX","match","Number","useLayout","zoomable","zoomer","autoCenterWhenCellsChange","dispatch","layoutInitialized","setLayoutInitialized","layoutKeyRef","getNextLayoutKey","centered","setCentered","root","select","ZoomTransform","useAutoCenter","previousLayoutRef","alignOrigin","origin","normalizeAlignOrigin","nodeView","useLineMarkers","defaultEdgeLines","markerPrefix","lineConnector","markers","markerType","lineConnectorConf","getDefaultLineConf","omitBy","isUndefined","_type","markerIndex","addMarker","editingMarkerIndex","WeakMap","_secret_internals$le","computedLineConf","Array","isArray","showStartArrow","showEndArrow","useReady","isMac","test","_userAgentData$platfo","_userAgentData","navigator","userAgentData","platform","userAgent","wheelData","deltaY","deltaMode","useZoom","scrollable","pannable","draggable","ctrlDraggable","_scaleRange","grabbing","setGrabbing","setTransform","zoom","wheelDelta","scaleExtent","on","rootSelection","unsetZoom","stopImmediatePropagation","translateBy","wheelDeltaX","wheelDeltaY","___CSS_LOADER_EXPORT___","module","toString"],"sourceRoot":""}