@next-bricks/diagram 0.28.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/bricks.json +3 -3
  2. package/dist/chunks/1728.1dbc9d53.js +2 -0
  3. package/dist/chunks/1728.1dbc9d53.js.map +1 -0
  4. package/dist/chunks/1860.4fd60630.js +2 -0
  5. package/dist/chunks/1860.4fd60630.js.map +1 -0
  6. package/dist/chunks/{1972.8418a5c0.js → 1972.d6fea46c.js} +2 -2
  7. package/dist/chunks/{1972.8418a5c0.js.map → 1972.d6fea46c.js.map} +1 -1
  8. package/dist/chunks/2311.1877f3a0.js +2 -0
  9. package/dist/chunks/2311.1877f3a0.js.map +1 -0
  10. package/dist/chunks/5481.d6977dfc.js +3 -0
  11. package/dist/chunks/5481.d6977dfc.js.map +1 -0
  12. package/dist/chunks/7034.286dd8ae.js +3 -0
  13. package/dist/chunks/7034.286dd8ae.js.map +1 -0
  14. package/dist/chunks/{9591.d3a952ac.js → 9591.c5101110.js} +2 -2
  15. package/dist/chunks/{9591.d3a952ac.js.map → 9591.c5101110.js.map} +1 -1
  16. package/dist/chunks/{eo-diagram.40f64d0f.js → eo-diagram.5f32fd41.js} +2 -2
  17. package/dist/chunks/eo-diagram.5f32fd41.js.map +1 -0
  18. package/dist/chunks/eo-display-canvas.577f0b51.js +2 -0
  19. package/dist/chunks/eo-display-canvas.577f0b51.js.map +1 -0
  20. package/dist/chunks/eo-draw-canvas.cdb7565f.js +2 -0
  21. package/dist/chunks/eo-draw-canvas.cdb7565f.js.map +1 -0
  22. package/dist/chunks/main.08edb90f.js +2 -0
  23. package/dist/chunks/main.08edb90f.js.map +1 -0
  24. package/dist/examples.json +4 -4
  25. package/dist/index.6f17b5d2.js +2 -0
  26. package/dist/index.6f17b5d2.js.map +1 -0
  27. package/dist/manifest.json +90 -72
  28. package/dist/types.json +3228 -2624
  29. package/dist-types/display-canvas/index.d.ts +5 -1
  30. package/dist-types/draw-canvas/CellComponent.d.ts +3 -2
  31. package/dist-types/draw-canvas/constants.d.ts +1 -0
  32. package/dist-types/draw-canvas/index.d.ts +7 -1
  33. package/dist-types/draw-canvas/interfaces.d.ts +30 -2
  34. package/dist-types/draw-canvas/processors/asserts.d.ts +1 -0
  35. package/dist-types/draw-canvas/processors/handleMouseDown.d.ts +3 -2
  36. package/dist-types/draw-canvas/processors/updateCells.d.ts +6 -3
  37. package/dist-types/shared/canvas/useAutoCenter.d.ts +2 -1
  38. package/dist-types/shared/canvas/useLayout.d.ts +19 -0
  39. package/dist-types/shared/canvas/useReady.d.ts +7 -0
  40. package/docs/eo-display-canvas.md +276 -0
  41. package/docs/eo-draw-canvas.md +770 -0
  42. package/package.json +2 -2
  43. package/dist/chunks/1728.5cff5747.js +0 -2
  44. package/dist/chunks/1728.5cff5747.js.map +0 -1
  45. package/dist/chunks/4054.a7e7e379.js +0 -2
  46. package/dist/chunks/4054.a7e7e379.js.map +0 -1
  47. package/dist/chunks/4456.3fd8ee7c.js +0 -2
  48. package/dist/chunks/4456.3fd8ee7c.js.map +0 -1
  49. package/dist/chunks/5816.f6e1a89e.js +0 -3
  50. package/dist/chunks/5816.f6e1a89e.js.map +0 -1
  51. package/dist/chunks/730.3f786ebf.js +0 -3
  52. package/dist/chunks/730.3f786ebf.js.map +0 -1
  53. package/dist/chunks/9061.cbb65689.js +0 -2
  54. package/dist/chunks/9061.cbb65689.js.map +0 -1
  55. package/dist/chunks/eo-diagram.40f64d0f.js.map +0 -1
  56. package/dist/chunks/eo-display-canvas.d8b6ac59.js +0 -2
  57. package/dist/chunks/eo-display-canvas.d8b6ac59.js.map +0 -1
  58. package/dist/chunks/eo-draw-canvas.4963b54f.js +0 -2
  59. package/dist/chunks/eo-draw-canvas.4963b54f.js.map +0 -1
  60. package/dist/chunks/main.2025fb50.js +0 -2
  61. package/dist/chunks/main.2025fb50.js.map +0 -1
  62. package/dist/index.0e3710fb.js +0 -2
  63. package/dist/index.0e3710fb.js.map +0 -1
  64. /package/dist/chunks/{5816.f6e1a89e.js.LICENSE.txt → 5481.d6977dfc.js.LICENSE.txt} +0 -0
  65. /package/dist/chunks/{730.3f786ebf.js.LICENSE.txt → 7034.286dd8ae.js.LICENSE.txt} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"chunks/4054.a7e7e379.js","mappings":"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","sources":["webpack:///./src/diagram/MarkerComponent.tsx","webpack:///./src/diagram/lines/getDirectLinePoints.ts","webpack:///./src/diagram/processors/doTwoNodesOverlap.ts","webpack:///./src/draw-canvas/processors/findNode.ts","webpack:///./src/draw-canvas/EdgeComponent.tsx","webpack:///./src/draw-canvas/NodeComponent.tsx","webpack:///./src/draw-canvas/processors/cellToTarget.ts","webpack:///./src/draw-canvas/processors/handleMouseDown.ts","webpack:///./src/draw-canvas/decorators/DecoratorArea.tsx","webpack:///./src/draw-canvas/decorators/DecoratorText.tsx","webpack:///./src/draw-canvas/decorators/index.tsx","webpack:///./src/draw-canvas/CellComponent.tsx","webpack:///./src/draw-canvas/constants.ts","webpack:///./src/draw-canvas/processors/asserts.ts","webpack:///./src/draw-canvas/processors/getUnrelatedCells.ts","webpack:///./src/draw-canvas/processors/initializeCells.ts","webpack:///./src/draw-canvas/processors/sameTarget.ts","webpack:///./src/draw-canvas/reducers/cells.ts","webpack:///./src/draw-canvas/reducers/index.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/useActiveTarget.ts","webpack:///./src/shared/canvas/useAutoCenter.ts","webpack:///./src/draw-canvas/processors/transformToCenter.ts","webpack:///./src/shared/canvas/useZoom.ts","webpack:///./src/shared/canvas/ZoomBarComponent.shadow.css","webpack:///./src/shared/canvas/styles.shadow.css"],"sourcesContent":["import React from \"react\";\nimport type { LineMarkerType } from \"./interfaces\";\n\nexport interface MarkerComponentProps extends BaseMarkerComponentProps {\n type: LineMarkerType;\n}\n\nexport interface BaseMarkerComponentProps {\n id: string;\n strokeColor?: string;\n}\n\nexport function MarkerComponent({\n id,\n type,\n strokeColor,\n}: MarkerComponentProps): JSX.Element {\n let Component: (props: BaseMarkerComponentProps) => JSX.Element;\n\n switch (type) {\n case \"0..1\":\n Component = EntityRelationZeroOrOneMarker;\n break;\n case \"0..N\":\n Component = EntityRelationZeroOrManyMarker;\n break;\n default:\n Component = ArrowMarker;\n }\n\n return <Component id={id} strokeColor={strokeColor} />;\n}\n\nfunction ArrowMarker({\n id,\n strokeColor,\n}: BaseMarkerComponentProps): JSX.Element {\n return (\n <marker\n id={id}\n viewBox=\"0 0 6 6\"\n refX={5}\n refY={3}\n markerWidth={6}\n markerHeight={6}\n orient=\"auto-start-reverse\"\n strokeLinejoin=\"round\"\n >\n <path\n d=\"M 0.5 0.5 L 5.5 3 L 0.5 5.5 z\"\n stroke={strokeColor}\n strokeWidth={1}\n fill={strokeColor}\n />\n </marker>\n );\n}\n\nfunction EntityRelationZeroOrOneMarker({\n id,\n strokeColor,\n}: BaseMarkerComponentProps): JSX.Element {\n return (\n <marker\n id={id}\n viewBox=\"0 0 21 11\"\n refX={0.5}\n refY={5.5}\n markerWidth={21}\n markerHeight={11}\n orient=\"auto-start-reverse\"\n >\n <path\n d=\"M 5.5 5.5 m 5 0 a 5 5 0 1 0 -10 0 a 5 5 0 1 0 10 0 M 15.5 0.5 V 10.5 M 10.5 5.5 H 20.5\"\n stroke={strokeColor}\n strokeWidth={1}\n fill=\"none\"\n />\n </marker>\n );\n}\n\nfunction EntityRelationZeroOrManyMarker({\n id,\n strokeColor,\n}: BaseMarkerComponentProps): JSX.Element {\n return (\n <marker\n id={id}\n viewBox=\"0 0 21 11\"\n refX={0.5}\n refY={5.5}\n markerWidth={21}\n markerHeight={11}\n orient=\"auto-start-reverse\"\n >\n <path\n d=\"M 5.5 5.5 m 5 0 a 5 5 0 1 0 -10 0 a 5 5 0 1 0 10 0 M 20.5 0.5 L 10.5 5.5 L 20.5 10.5 M 10.5 5.5 H 20.5\"\n stroke={strokeColor}\n strokeWidth={1}\n fill=\"none\"\n />\n </marker>\n );\n}\n","import type { NodePosition, NodeRect } from \"../interfaces\";\nimport { doTwoNodesOverlap } from \"../processors/doTwoNodesOverlap\";\n\nexport function getDirectLinePoints(\n source: NodeRect,\n target: NodeRect\n): NodePosition[] | null {\n // Ignore if two nodes are the same.\n // Ignore if two nodes overlap.\n if (source === target || doTwoNodesOverlap(source, target, 0, 0)) {\n return null;\n }\n\n const dx = target.x - source.x;\n const dy = target.y - source.y;\n\n let x0: number, y0: number, x1: number, y1: number;\n const directionX = dx > 0 ? 1 : -1;\n if (dy !== 0) {\n const deltaRadio = Math.abs(dx / dy);\n const directionY = dy > 0 ? 1 : -1;\n const sourceRadio = source.width / source.height;\n if (deltaRadio < sourceRadio) {\n x0 = source.x + ((deltaRadio * source.height) / 2) * directionX;\n y0 = source.y + (source.height / 2) * directionY;\n } else {\n x0 = source.x + (source.width / 2) * directionX;\n y0 = source.y + (source.width / 2 / deltaRadio) * directionY;\n }\n const targetRadio = target.width / target.height;\n if (deltaRadio < targetRadio) {\n x1 = target.x - ((deltaRadio * target.height) / 2) * directionX;\n y1 = target.y - (target.height / 2) * directionY;\n } else {\n x1 = target.x - (target.width / 2) * directionX;\n y1 = target.y - (target.width / 2 / deltaRadio) * directionY;\n }\n } else {\n x0 = source.x + (source.width / 2) * directionX;\n x1 = target.x - (target.width / 2) * directionX;\n y0 = y1 = source.y;\n }\n\n return [\n { x: x0, y: y0 },\n { x: x1, y: y1 },\n ];\n}\n","import type { NodeRect } from \"../interfaces\";\n\nexport function doTwoNodesOverlap(\n a: NodeRect,\n b: NodeRect,\n paddingA: number,\n paddingB: number\n): boolean {\n const A = paddingA ? getNodesWithPadding(a, paddingA) : a;\n const B = paddingB ? getNodesWithPadding(b, paddingB) : b;\n const left = Math.min(A.x - A.width / 2, B.x - B.width / 2);\n const right = Math.max(A.x + A.width / 2, B.x + B.width / 2);\n const top = Math.min(A.y - A.height / 2, B.y - B.height / 2);\n const bottom = Math.max(A.y + A.height / 2, B.y + B.height / 2);\n return right - left < A.width + B.width && bottom - top < A.height + B.height;\n}\n\nfunction getNodesWithPadding(node: NodeRect, padding: number) {\n return {\n x: node.x - node.width / 2 - padding,\n y: node.y - node.height / 2 - padding,\n width: node.width + padding * 2,\n height: node.height + padding * 2,\n };\n}\n","import type { Cell, NodeCell, NodeId } from \"../interfaces\";\nimport { isNodeCell } from \"./asserts\";\n\nexport function findNode(cells: Cell[], id: NodeId): NodeCell | undefined {\n return cells.find((cell) => isNodeCell(cell) && cell.id === id) as\n | NodeCell\n | undefined;\n}\n","import React, { useMemo } from \"react\";\nimport { checkIfByTransform } from \"@next-core/runtime\";\nimport classNames from \"classnames\";\nimport type { Cell, EdgeCell, EdgeLineConf, NodeView } from \"./interfaces\";\nimport { getDirectLinePoints } from \"../diagram/lines/getDirectLinePoints\";\nimport type { NodeRect } from \"../diagram/interfaces\";\nimport { findNode } from \"./processors/findNode\";\n\nexport interface EdgeComponentProps {\n edge: EdgeCell;\n cells: Cell[];\n markerEnd: string;\n defaultEdgeLines?: EdgeLineConf[];\n}\n\nexport function EdgeComponent({\n edge,\n cells,\n markerEnd,\n defaultEdgeLines,\n}: EdgeComponentProps): JSX.Element | null {\n const sourceNode = useMemo(\n () => findNode(cells, edge.source),\n [cells, edge.source]\n );\n const targetNode = useMemo(\n () => findNode(cells, edge.target),\n [cells, edge.target]\n );\n const lineConf = useMemo(\n () => defaultEdgeLines?.find((item) => checkIfByTransform(item, { edge })),\n [defaultEdgeLines, edge]\n );\n\n const padding = 5;\n\n const line = useMemo(\n () =>\n sourceNode && targetNode\n ? getDirectLinePoints(\n nodeViewToNodeRect(sourceNode.view, padding),\n nodeViewToNodeRect(targetNode.view, padding)\n )\n : null,\n [sourceNode, targetNode]\n );\n\n if (!line) {\n // This happens when source or target is not found\n return null;\n }\n\n const d = `M${line[0].x} ${line[0].y}L${line[1].x} ${line[1].y}`;\n\n return (\n <>\n <path\n // This `path` is made for expanding interaction area of graph lines.\n d={d}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={16}\n />\n <path\n className={classNames(\"line\", { dashed: lineConf?.dashed })}\n d={d}\n fill=\"none\"\n stroke=\"gray\"\n markerEnd={`url(#${markerEnd})`}\n />\n <path className=\"line-active-bg\" d={d} fill=\"none\" />\n </>\n );\n}\n\nfunction 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 React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { ReactUseBrick } from \"@next-core/react-runtime\";\nimport { 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 defaultNodeBricks?: NodeBrickConf[];\n onResize(id: string, size: SizeTuple | null): void;\n}\n\nexport function NodeComponent({\n node,\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 (\n specifiedUseBrick ??\n defaultNodeBricks?.find((item) => checkIfByTransform(item, memoizedData))\n ?.useBrick\n );\n }, [defaultNodeBricks, specifiedUseBrick, memoizedData]);\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.clientWidth, element.clientHeight]);\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 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 ) : 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 { pick } from \"lodash\";\nimport type { ActiveTarget, Cell } from \"../interfaces\";\n\nexport function cellToTarget(cell: Cell): ActiveTarget {\n return cell.type === \"edge\"\n ? pick(cell, [\"type\", \"source\", \"target\", \"data\"])\n : pick(cell, [\"type\", \"id\", \"data\"]);\n}\n","import type { PositionTuple } from \"../../diagram/interfaces\";\nimport type { ActiveTarget, Cell } from \"../interfaces\";\nimport type {\n MoveCellPayload,\n ResizeCellPayload,\n} from \"../reducers/interfaces\";\nimport { cellToTarget } from \"./cellToTarget\";\n\nexport function handleMouseDown(\n event: MouseEvent,\n {\n action,\n cell,\n scale,\n onCellMoving,\n onCellMoved,\n onCellResizing,\n onCellResized,\n onSwitchActiveTarget,\n }: {\n action: \"move\" | \"resize\";\n cell: Cell;\n scale: number;\n onCellMoving?(info: MoveCellPayload): void;\n onCellMoved?(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 onSwitchActiveTarget?.(cellToTarget(cell));\n\n if (cell.type === \"edge\") {\n return;\n }\n\n const from: PositionTuple = [event.clientX, event.clientY];\n const original =\n action === \"move\"\n ? [cell.view.x, cell.view.y]\n : [cell.view.width, cell.view.height];\n\n function getMovement(e: MouseEvent): PositionTuple {\n return [(e.clientX - from[0]) / scale, (e.clientY - from[1]) / scale];\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 // const [x, y] = getNewPosition(movement);\n // adjustCellPosition(x, y);\n if (moved) {\n if (action === \"move\") {\n (finished ? onCellMoved : onCellMoving)?.({\n type: cell.type,\n id: cell.id,\n x: original[0] + movement[0],\n y: original[1] + movement[1],\n });\n } else {\n (finished ? onCellResized : onCellResizing)?.({\n type: cell.type,\n id: cell.id,\n width: original[0] + movement[0],\n height: original[1] + movement[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 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 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 onCellResizing,\n onCellResized,\n onSwitchActiveTarget,\n });\n };\n resizeHandle.addEventListener(\"mousedown\", onMouseDown);\n return () => {\n resizeHandle.removeEventListener(\"mousedown\", onMouseDown);\n };\n }, [\n cell,\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\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\nfunction selectAllText(element: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(element);\n const selection = window.getSelection()!;\n selection.removeAllRanges();\n selection.addRange(range);\n}\n","import React from \"react\";\nimport type { BasicDecoratorProps } from \"../interfaces\";\nimport { DecoratorArea } from \"./DecoratorArea\";\nimport { DecoratorText } from \"./DecoratorText\";\n\nexport function DecoratorComponent({\n cell,\n transform,\n readOnly,\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 \"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 transform={transform}\n readOnly={readOnly}\n onCellResizing={onCellResizing}\n onCellResized={onCellResized}\n onSwitchActiveTarget={onSwitchActiveTarget}\n onDecoratorTextEditing={onDecoratorTextEditing}\n onDecoratorTextChange={onDecoratorTextChange}\n />\n );\n}\n","import React, { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport classNames from \"classnames\";\nimport type {\n ActiveTarget,\n Cell,\n CellContextMenuDetail,\n DecoratorTextChangeDetail,\n EdgeLineConf,\n NodeBrickConf,\n} from \"./interfaces\";\nimport { isDecoratorCell, isEdgeCell, isNodeCell } 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\";\n\nexport interface CellComponentProps {\n cell: Cell;\n cells: Cell[];\n defaultNodeBricks?: NodeBrickConf[];\n defaultEdgeLines?: EdgeLineConf[];\n transform: TransformLiteral;\n markerEnd: string;\n active: boolean;\n readOnly?: boolean;\n unrelatedCells: Cell[];\n onCellMoving?(info: MoveCellPayload): void;\n onCellMoved?(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 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 cell,\n cells,\n defaultNodeBricks,\n defaultEdgeLines,\n markerEnd,\n active,\n readOnly,\n transform,\n unrelatedCells,\n onCellMoving,\n onCellMoved,\n onCellResizing,\n onCellResized,\n onSwitchActiveTarget,\n onCellContextMenu,\n onDecoratorTextEditing,\n onDecoratorTextChange,\n onNodeBrickResize,\n onCellMouseEnter,\n onCellMouseLeave,\n}: CellComponentProps): JSX.Element | null {\n const gRef = useRef<SVGGElement>(null);\n\n const unrelated = useMemo(\n () => unrelatedCells.some((item) => sameTarget(item, cell)),\n [cell, unrelatedCells]\n );\n\n useEffect(() => {\n const g = gRef.current;\n if (!g || readOnly) {\n return;\n }\n const onMouseDown = (event: MouseEvent) => {\n handleMouseDown(event, {\n action: \"move\",\n cell,\n scale: transform.k,\n onCellMoving,\n onCellMoved,\n onSwitchActiveTarget,\n });\n };\n g.addEventListener(\"mousedown\", onMouseDown);\n return () => {\n g.removeEventListener(\"mousedown\", onMouseDown);\n };\n }, [\n cell,\n onCellMoved,\n onCellMoving,\n onSwitchActiveTarget,\n readOnly,\n transform.k,\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 handleMouseEnter = useCallback(() => {\n onCellMouseEnter?.(cell);\n }, [cell, onCellMouseEnter]);\n\n const handleMouseLeave = useCallback(() => {\n onCellMouseLeave?.(cell);\n }, [cell, onCellMouseLeave]);\n\n return (\n <g\n className={classNames(\"cell\", {\n active,\n faded: unrelated,\n \"read-only\": readOnly,\n })}\n ref={gRef}\n transform={\n cell.type === \"edge\"\n ? undefined\n : `translate(${cell.view.x} ${cell.view.y})`\n }\n onContextMenu={handleContextMenu}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {isNodeCell(cell) ? (\n <NodeComponent\n node={cell}\n defaultNodeBricks={defaultNodeBricks}\n onResize={onNodeBrickResize}\n />\n ) : isEdgeCell(cell) ? (\n <EdgeComponent\n edge={cell}\n defaultEdgeLines={defaultEdgeLines}\n cells={cells}\n markerEnd={markerEnd}\n />\n ) : isDecoratorCell(cell) ? (\n <DecoratorComponent\n cell={cell}\n transform={transform}\n readOnly={readOnly}\n onCellResizing={onCellResizing}\n onCellResized={onCellResized}\n onSwitchActiveTarget={onSwitchActiveTarget}\n onDecoratorTextEditing={onDecoratorTextEditing}\n onDecoratorTextChange={onDecoratorTextChange}\n />\n ) : null}\n </g>\n );\n}\n","export const SYMBOL_FOR_SIZE_INITIALIZED = Symbol.for(\"size-initialized\");\nexport const DEFAULT_NODE_SIZE = 20;\nexport const DEFAULT_NODE_GAP = 36;\nexport const DEFAULT_AREA_WIDTH = 100;\nexport const DEFAULT_AREA_HEIGHT = 60;\nexport const DEFAULT_SCALE_RANGE_MIN = 0.5;\nexport const DEFAULT_SCALE_RANGE_MAX = 2;\n","import type {\n Cell,\n DecoratorCell,\n EdgeCell,\n InitialCell,\n InitialNodeCell,\n NodeCell,\n} from \"../interfaces\";\n\nexport function isNodeCell(cell: Cell): 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","import type { ActiveTarget, Cell, ConnectLineState } from \"../interfaces\";\nimport { sameTarget } from \"./sameTarget\";\n\nexport function getUnrelatedCells(\n cells: Cell[],\n connectLineState: ConnectLineState | null,\n activeTarget: ActiveTarget | null\n): Cell[] {\n const unrelated: Cell[] = [];\n\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 default:\n unrelated.push(cell);\n }\n }\n } else {\n switch (activeTarget?.type) {\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 ? sameTarget(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 case \"decorator\":\n for (const cell of cells) {\n if (cell.type !== \"decorator\" || cell.id !== activeTarget.id) {\n unrelated.push(cell);\n }\n }\n break;\n }\n }\n\n return unrelated;\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 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 === \"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 { Reducer } from \"react\";\nimport type { DrawCanvasAction } from \"./interfaces\";\nimport type { Cell, 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 // 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 case \"move-cell\": {\n const { type, id, x, y } = 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, x, y } },\n ...state.slice(index + 1),\n ];\n }\n return 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\";\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});\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 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 cellsRef: React.RefObject<SVGGElement>;\n activeTarget?: ActiveTarget | null;\n onActiveTargetChange(target: ActiveTarget | null): void;\n}\n\nexport type UseActiveTargetResult = ActiveTarget | null;\n\nexport function useActiveTarget({\n cellsRef,\n activeTarget: _activeTarget,\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 cellsContainerIndex = path.indexOf(cellsRef.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 (cellsContainerIndex <= 0) {\n setActiveTarget(null);\n }\n };\n document.addEventListener(\"click\", resetActiveTarget);\n return () => {\n document.removeEventListener(\"click\", resetActiveTarget);\n };\n }, [activeTarget, cellsRef]);\n\n return activeTarget;\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 zoomable?: boolean;\n zoomer: ZoomBehavior<SVGSVGElement, unknown>;\n scaleRange: RangeTuple;\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 zoomable,\n zoomer,\n scaleRange,\n}: UseAutoCenterOptions): UseAutoCenterResult {\n const [centered, setCentered] = useState(false);\n\n useEffect(() => {\n const root = rootRef.current;\n if (\n !root ||\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 }, [cells, centered, rootRef, scaleRange, zoomable, zoomer]);\n\n useEffect(() => {\n // Reset auto centering when nodes and decorators are all removed.\n if (!cells.some((cell) => isNodeCell(cell) || isDecoratorCell(cell))) {\n setCentered(false);\n }\n }, [cells]);\n\n return [centered, setCentered];\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 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 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\nexport function useZoom({\n rootRef,\n zoomable,\n scrollable,\n pannable,\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(() => zoom<SVGSVGElement, unknown>(), []);\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 }, [onSwitchActiveTarget, scaleRange, zoomable, zoomer]);\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) => e.preventDefault())\n .on(\"dblclick.zoom\", null)\n .on(\"mousedown.zoom\", null);\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 }, [pannable, rootRef, scrollable, zoomable, zoomer]);\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}.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-inline:5px}.zoom-slider .ant-slider-vertical .ant-slider-rail{width:2px}.zoom-slider .ant-slider-vertical .ant-slider-handle{width:6px;height:6px;inset-inline-start: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;inset-inline-start:-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;inset-block-start:0;inset-inline-start: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}:host,\n.root{width:100%;height:100%}:host([hidden]){display:none}.root{opacity:0}.root.ready{opacity:1}.root:focus{outline:none}.decorator-area .area{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 .line-active-bg{stroke:var(--palette-blue-5);stroke-dasharray:4;stroke-width:1}.cell:not(.read-only){-webkit-user-select:none;-moz-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{opacity:1}.connect-line{pointer-events:none}.connect-line:not(.connecting){display:none}.line.dashed{stroke-dasharray:4}.cell.active .decorator-text .text-container{outline:1px dashed var(--palette-blue-5)}.decorator-text .text-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;padding:0.5em}.decorator-text .text:focus{outline:none}.cell.faded{opacity:0.3}.cell .node{pointer-events:none}.cell .node > *{pointer-events:auto}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n"],"names":["MarkerComponent","_ref","Component","id","type","strokeColor","EntityRelationZeroOrOneMarker","EntityRelationZeroOrManyMarker","ArrowMarker","React","_ref2","viewBox","refX","refY","markerWidth","markerHeight","orient","strokeLinejoin","d","stroke","strokeWidth","fill","_ref3","_ref4","getDirectLinePoints","source","target","doTwoNodesOverlap","x0","y0","x1","y1","dx","x","dy","y","directionX","deltaRadio","Math","abs","directionY","width","height","a","b","paddingA","paddingB","A","getNodesWithPadding","B","left","min","right","max","top","bottom","node","padding","findNode","cells","find","cell","isNodeCell","EdgeComponent","edge","markerEnd","defaultEdgeLines","sourceNode","useMemo","targetNode","lineConf","item","checkIfByTransform","line","nodeViewToNodeRect","view","concat","className","classNames","dashed","NodeComponent","defaultNodeBricks","onResize","memoizedData","value","memoizedValue","setMemoizedValue","useState","useEffect","prev","isEqual","useDeepMemo","data","specifiedUseBrick","useBrick","observerRef","useRef","_defaultNodeBricks$fi","refCallback","useCallback","element","prevObserver","current","disconnect","setTimeout","observer","ResizeObserver","clientWidth","clientHeight","observe","ReactUseBrick","cellToTarget","pick","handleMouseDown","event","action","scale","onCellMoving","onCellMoved","onCellResizing","onCellResized","onSwitchActiveTarget","stopPropagation","from","clientX","clientY","original","moved","handleMove","e","finished","movement","getMovement","onMouseMove","onMouseUp","document","removeEventListener","addEventListener","DecoratorArea","transform","readOnly","resizeHandleRef","resizeHandle","onMouseDown","k","ref","DecoratorText","_cell$view$text","onDecoratorTextEditing","onDecoratorTextChange","label","text","currentLabel","setCurrentLabel","editingLabel","setEditingLabel","editingLabelInitialized","shouldEmitLabelChange","setShouldEmitLabelChange","handleEnableEdit","preventDefault","textContent","focus","range","createRange","selectNodeContents","selection","window","getSelection","removeAllRanges","addRange","selectAllText","editing","handleInput","handleBlur","_objectSpread","onDoubleClick","contentEditable","onInput","onBlur","DecoratorComponent","SpecifiedComponent","decorator","console","error","CellComponent","active","unrelatedCells","onCellContextMenu","onNodeBrickResize","onCellMouseEnter","onCellMouseLeave","gRef","unrelated","some","sameTarget","g","handleContextMenu","handleMouseEnter","handleMouseLeave","faded","undefined","onContextMenu","onMouseEnter","onMouseLeave","isEdgeCell","isDecoratorCell","SYMBOL_FOR_SIZE_INITIALIZED","Symbol","for","DEFAULT_NODE_SIZE","DEFAULT_NODE_GAP","DEFAULT_AREA_WIDTH","DEFAULT_AREA_HEIGHT","DEFAULT_SCALE_RANGE_MIN","DEFAULT_SCALE_RANGE_MAX","isInitialNodeCell","getUnrelatedCells","connectLineState","activeTarget","existedTargets","Set","add","has","push","nodesMap","Map","relatedNodeIds","set","initializeCells","initialCells","defaultNodeSize","map","_cell$view","_cell$view2","insertCellAfter","newCell","after","index","findLastIndex","slice","reducers","rootReducer","state","payload","findIndex","size","Object","fromEntries","entries","key","props","_extends","xmlns","ZoomBarComponent","shadowRoot","scaleRange","onZoomChange","onReCenter","currentTheme","useCurrentTheme","cache","createCache","zoomBarRef","tooltip","formatter","placement","getPopupContainer","onZoomIn","onZoomOut","ConfigProvider","theme","algorithm","darkAlgorithm","defaultAlgorithm","StyleProvider","container","autoClear","hashPriority","onClick","role","CenterSVG","ZoomInSVG","Slider","step","vertical","included","onChange","ZoomOutSVG","useActiveTarget","cellsRef","_activeTarget","onActiveTargetChange","newActiveTarget","setActiveTarget","previous","activeTargetChangeInitialized","resetActiveTarget","composedPath","indexOf","useAutoCenter","rootRef","zoomable","zoomer","centered","setCentered","root","canvasWidth","canvasHeight","Infinity","empty","r","transformToCenter","select","ZoomTransform","useZoom","scrollable","pannable","_scaleRange","grabbing","setGrabbing","setTransform","zoom","scaleExtent","on","rootSelection","unsetZoom","ctrlKey","stopImmediatePropagation","translateBy","wheelDeltaX","wheelDeltaY","call","___CSS_LOADER_EXPORT___","module","toString"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_next_bricks_diagram=self.webpackChunk_next_bricks_diagram||[]).push([[4456],{6671:(e,t,n)=>{n.d(t,{w:()=>d});var a=n(8769),r=n.n(a),o=n(3373),i=n.n(o),l=n(3739);function d(e){var{connectLineState:t,connectLineTo:n,markerPrefix:a}=e;return r().createElement("svg",{width:"100%",height:"100%",className:i()("connect-line",{connecting:!!t&&(n[0]-t.from[0])**2+(n[1]-t.from[1])**2>25})},r().createElement("defs",null,r().createElement(l.c,{type:"arrow",id:"".concat(a,"connect-line"),strokeColor:null==t?void 0:t.options.strokeColor})),r().createElement("path",{d:t?"M".concat(t.from.join(" "),"L").concat(n.join(" ")):"",fill:"none",stroke:null==t?void 0:t.options.strokeColor,strokeWidth:null==t?void 0:t.options.strokeWidth,markerEnd:null!=t&&t.options.arrow?"url(#".concat(a,"connect-line)"):void 0}))}},1803:(e,t,n)=>{n.d(t,{m:()=>d});var a=n(9740),r=n(8769),o=n.n(r),i=n(3373),l=n.n(i);function d(e){var t,n,r,i,{line:{line:d,edge:s,d:c,markers:u},linePaths:f,lineMaskRects:v,maskPrefix:p,markerPrefix:h,activeLineMarkerPrefix:m,active:g,activeRelated:y,onLineClick:k,onLineDoubleClick:b}=e,x=v.has(d.$id)?"url(#".concat(p).concat(d.$id,")"):void 0,{strokeColor:w,strokeWidth:M,interactStrokeWidth:R}=(0,a.A)((0,a.A)({},d),g?null===(t=d.overrides)||void 0===t?void 0:t.active:y?null===(n=d.overrides)||void 0===n?void 0:n.activeRelated:null),E=g?"active":y?"active-related":"default";for(var L of u)L.variant===E&&("start"===L.placement?r="url(#".concat(h).concat(L.index,")"):i="url(#".concat(h).concat(L.index,")"));return o().createElement("g",{className:l()("line",{interactable:d.interactable,active:g,"active-related":y}),onClick:d.interactable?()=>{null==k||k({id:d.$id,edge:s})}:void 0,onDoubleClick:d.interactable?e=>{e.preventDefault(),e.stopPropagation(),null==b||b({id:d.$id,edge:s})}:void 0,style:{cursor:d.cursor}},d.interactable&&o().createElement("path",{d:c,fill:"none",stroke:"transparent",strokeWidth:R}),o().createElement("path",{ref:e=>f.set(d.$id,e),stroke:w,strokeWidth:M,d:c,fill:"none",markerStart:r,markerEnd:i,mask:x}),o().createElement("path",{stroke:"var(--palette-blue-3)",strokeWidth:M,d:c,fill:"none",className:"active-bg",markerStart:"url(#".concat(m,"start)"),markerEnd:"url(#".concat(m,"end)"),mask:x}))}},2547:(e,t,n)=>{n.d(t,{d2:()=>l});var a=n(8769),r=n.n(a),o=n(1983),i=n(4146);function l(e){var{labels:t,onRendered:n}=e,[o,i]=(0,a.useState)(!1),[l,c]=(0,a.useState)([]),u=(0,a.useMemo)((()=>new Map),[]),f=(0,a.useCallback)(((e,t)=>{t&&u.set(e,t),c((t=>t.includes(e)?t:t.concat(e)))}),[u]),v=(0,a.useCallback)((e=>{c((t=>{var n=t.indexOf(e);return-1===n?t:t.slice(0,n).concat(t.slice(n+1))})),u.delete(e)}),[u]);return(0,a.useEffect)((()=>{i(!(null!=t&&t.some((e=>!l.includes(e.id)))))}),[t,l]),(0,a.useEffect)((()=>{null==n||n(o?u:null)}),[u,o]),r().createElement(r().Fragment,null,null==t?void 0:t.map((e=>{var{text:t,label:n,id:a,edge:o}=e;return n?r().createElement("div",{key:a,className:"line-label"},r().createElement(s,{id:a,edge:o,label:n,onRendered:f,onUnmount:v})):r().createElement(d,{key:a,id:a,text:t,onRendered:f})})))}function d(e){var{id:t,text:n,onRendered:o}=e,i=(0,a.useCallback)((e=>{null==o||o(t,e)}),[t,o]);return r().createElement("div",{className:"line-label",ref:i,style:n.style},n.content)}function s(e){var{id:t,edge:n,label:l,onRendered:d,onUnmount:s}=e,c=(0,a.useMemo)((()=>(0,i.checkIfByTransform)(l,{edge:n})?l.useBrick:null),[n,l]),u=(0,a.useMemo)((()=>({edge:n})),[n]);(0,a.useEffect)((()=>{c||setTimeout((()=>{null==d||d(t,null)}))}),[t,d,c]),(0,a.useEffect)((()=>()=>{null==s||s(t)}),[]);var f=(0,a.useCallback)((e=>{e&&setTimeout((()=>{null==d||d(t,e.parentElement)}))}),[t,d]),v=(0,a.useCallback)((()=>{setTimeout((()=>{null==d||d(t,null)}))}),[t,d]);return c?r().createElement(o.ReactUseBrick,{refCallback:f,ignoredCallback:v,useBrick:c,data:u}):null}},9191:(e,t,n)=>{n.d(t,{y:()=>o});var a=n(8769),r=n.n(a);function o(e){var{lineId:t,rects:n,maskPrefix:a,renderedLineLabels:o}=e,i=o.find((e=>e.lineId===t&&"center"===e.placement));if(!i)return null;var l,d,{lineRect:s}=i,c=(d=1e3,{left:(l=s).left-d,top:l.top-d,width:l.width+2e3,height:l.height+2e3});return r().createElement("mask",{id:"".concat(a).concat(t),x:c.left,y:c.top,width:c.width,height:c.height},r().createElement("rect",{x:c.left,y:c.top,width:c.width,height:c.height,fill:"white"}),n.map(((e,t)=>r().createElement("rect",{key:t,x:e.left,y:e.top,width:e.width,height:e.height,fill:"black"}))))}},8892:(e,t,n)=>{n.d(t,{p:()=>l});var a=n(8769),r=n.n(a),o=n(1983),i=n(4146);function l(e){var{nodes:t,nodeBricks:n,onRendered:o}=e,[i,l]=(0,a.useState)(!1),[s,c]=(0,a.useState)([]),u=(0,a.useMemo)((()=>new Map),[]),f=(0,a.useCallback)(((e,t)=>{t&&u.set(e,t),c((t=>t.includes(e)?t:t.concat(e)))}),[u]),v=(0,a.useCallback)((e=>{c((t=>{var n=t.indexOf(e);return-1===n?t:t.slice(0,n).concat(t.slice(n+1))})),u.delete(e)}),[u]);return(0,a.useEffect)((()=>{l(!(null!=t&&t.some((e=>!s.includes(e.id)))))}),[t,s]),(0,a.useEffect)((()=>{null==o||o(i?u:null)}),[u,i]),r().createElement(r().Fragment,null,null==t?void 0:t.map((e=>r().createElement("div",{key:e.id,className:"node"},r().createElement(d,{nodeBricks:n,node:e,onRendered:f,onUnmount:v})))))}function d(e){var{node:t,nodeBricks:n,onRendered:l,onUnmount:d}=e,s=(0,a.useMemo)((()=>{var e;return null===(e=function(e,t){return null==t?void 0:t.find((t=>t.nodeType?[].concat(t.nodeType).includes(e.type):(0,i.checkIfByTransform)(t,{node:e})))}(t,n))||void 0===e?void 0:e.useBrick}),[t,n]),c=(0,a.useMemo)((()=>({node:t})),[t]);(0,a.useEffect)((()=>{s||setTimeout((()=>{null==l||l(t.id,null)}))}),[t.id,l,s]),(0,a.useEffect)((()=>()=>{null==d||d(t.id)}),[]);var u=(0,a.useCallback)((e=>{e&&setTimeout((()=>{null==l||l(t.id,e)}))}),[t.id,l]),f=(0,a.useCallback)((()=>{setTimeout((()=>{null==l||l(t.id,null)}))}),[t.id,l]);return s?r().createElement(o.ReactUseBrick,{refCallback:u,ignoredCallback:f,useBrick:s,data:c}):null}},8657:(e,t,n)=>{n.d(t,{Ie:()=>i,KP:()=>o,VO:()=>r,Yt:()=>d,mF:()=>a,sS:()=>l});var a="var(--palette-gray-5)",r=1,o="curveBasis",i=20,l=.5,d=2},6449:(e,t,n)=>{n.d(t,{o:()=>w});var a=n(8769),r=n(9740),o=n(4223),i=n(7586),l=n.n(i),d=n(1030);function s(e,t,n){for(var a of e){var r,o,i=t.get(a.id);a.width=Math.max(null!==(r=null==i?void 0:i.offsetWidth)&&void 0!==r?r:0,10)+n[1]+n[3],a.height=Math.max(null!==(o=null==i?void 0:i.offsetHeight)&&void 0!==o?o:0,10)+n[0]+n[2]}}function c(e,t,n){for(var a of e){var r,o=a.x-a.width/2+n[3],i=a.y-a.height/2+n[0],l=null===(r=t.get(a.id))||void 0===r?void 0:r.parentElement;l&&(l.style.left="".concat(o,"px"),l.style.top="".concat(i,"px"),l.style.visibility="visible")}}function u(e){if(Array.isArray(e)){var t=e[0],n=e.length>1?e[1]:t;return[t,n,e.length>2?e[2]:t,e.length>3?e[3]:n]}return new Array(4).fill(e)}var f=["nodePadding"],v=n(6149),p=n(4842),h=n(1945),m=n(9418),g=n(3854),y=n(7931);function k(e,t){var n,{normalizedLinesMap:a,lineLabelsRefRepository:r}=t;return null!==(n=null==e?void 0:e.map((e=>{var t=a.get(e),n={};if(t)for(var o of["start","end"]){var i=r.get("".concat(t,"-").concat(o));i&&(n[o]=[i.offsetWidth,i.offsetHeight])}return{data:e,labelSize:n}})))&&void 0!==n?n:[]}function b(e,t){return new Array(t).fill(null).map(((t,n)=>({dummy:!0,id:"$dummy-".concat(e.source,"-").concat(e.target,"-").concat(n)})))}function x(e,t){return new Array(t+1).fill(null).map(((n,a)=>({dummy:!0,source:0===a?e.source:"$dummy-".concat(e.source,"-").concat(e.target,"-").concat(a-1),target:a===t?e.target:"$dummy-".concat(e.source,"-").concat(e.target,"-").concat(a)})))}function w(e){var{layout:t,nodes:n,edges:i,manualLayoutStatus:w,userViewReady:M,userViewNodesMap:R,nodeMovement:E,nodesRefRepository:L,lineLabelsRefRepository:A,normalizedLinesMap:C,nodesRenderId:P,lineLabelsRenderId:S,layoutOptions:I}=e,N="initial"===w?t:"manual",[T,B]=(0,a.useState)(null),[z,W]=(0,a.useState)({nodes:[],edges:[]});return(0,a.useEffect)((()=>{M&&B((e=>"dagre"===N?function(e,t,n,a){var i=(0,r.A)({nodePadding:0,rankdir:"TB",ranksep:50,edgesep:10,nodesep:50},(0,d.pick)(a,["nodePadding","rankdir","ranksep","edgesep","nodesep","align"])),{nodePadding:v}=i,p=(0,o.A)(i,f),h=u(v),m=new(l().graphlib.Graph);for(var g of(m.setGraph(p),m.setDefaultEdgeLabel((function(){return{}})),null!=t?t:[])){var y=null==e?void 0:e.getNode(g.id);m.setNode(g.id,(null==y?void 0:y.data)===g?y:{id:g.id,data:g})}for(var k of null!=n?n:[])m.setEdge(k.source,k.target,{data:k});return{layout:"dagre",getNode:e=>m.node(e),applyLayout(e){var{nodesRefRepository:t,lineLabelsRefRepository:n,normalizedLinesMap:a}=e,r=[];for(var o of m.nodes()){var i=m.node(o);i?r.push(i):console.error("Diagram node not found: %s",o)}if(0===r.length)return null;s(r,t,h);var d=m.edges().map((e=>m.edge(e)));for(var u of d){var f=a.get(u.data);if(f)for(var v of["center","start","end"]){var p=n.get("".concat(f,"-").concat(v));if(p){var g,{offsetWidth:y,offsetHeight:k}=p;"center"===v&&(u.labelpos="c",u.width=y,u.height=k),null!==(g=u.labelSize)&&void 0!==g||(u.labelSize={}),u.labelSize[v]=[y,k]}}}return l().layout(m),c(r,t,h),{nodes:r,edges:d}}}}(e,n,i,I):"force"===N?function(e,t,n,a,o){var{nodePadding:i,dummyNodesOnEdges:l,collide:f}=(0,r.A)((0,r.A)({nodePadding:0,dummyNodesOnEdges:0},(0,d.pick)(o,["nodePadding","dummyNodesOnEdges"])),{},{collide:!1!==(null==o?void 0:o.collide)&&(0,r.A)({dummyRadius:1,radiusDiff:5,strength:1,iterations:1},!0===(null==o?void 0:o.collide)?null:null==o?void 0:o.collide)}),w=u(i),M=[];for(var R of null!=t?t:[]){var E=null==e?void 0:e.getNode(R.id);if((null==E?void 0:E.data)===R)M.push(E);else{var L={id:R.id,data:R},A=null==a?void 0:a.get(R.id);A&&(L.fx=A.x,L.fy=A.y),M.push(L)}}return{layout:"force",getNode:function(e){return M.find((t=>t.data.id===e))},applyLayout(e){var{nodesRefRepository:t,lineLabelsRefRepository:a,normalizedLinesMap:o}=e;if(0===M.length)return null;s(M,t,w);var i=M.slice(),d=[];for(var u of null!=n?n:[])d.push((0,r.A)({},u)),l>0&&(i.push(...b(u,l)),d.push(...x(u,l)));var R=(0,v.A)(d).id((e=>e.id));l>0&&R.distance((e=>e.dummy?30/(l+1):30)).strength((e=>e.dummy?.5:1));var E=(0,p.A)(i).force("link",R).force("x",(0,h.A)()).force("y",(0,m.A)()).force("charge",(0,g.A)());f&&E.force("collide",(0,y.A)().radius((e=>e.dummy?f.dummyRadius:Math.sqrt(e.width**2+e.height**2)/2+f.radiusDiff)).strength(f.strength).iterations(f.iterations)),E.stop(),function(e){e.tick(Math.ceil(Math.log(e.alphaMin())/Math.log(1-e.alphaDecay())))}(E),c(M,t,w);var L=k(n,{normalizedLinesMap:o,lineLabelsRefRepository:a});return{nodes:M,edges:L}}}}(e,n,i,R,I):"manual"===N?function(e,t,n,a){var o,{nodePadding:i}=(0,r.A)({nodePadding:0},(0,d.pick)(a,["nodePadding"])),l=u(i),f=[];for(var v of null!=t?t:[]){var p=null==e?void 0:e.getNode(v.id);(null==p?void 0:p.data)===v?(f.push(p),p.x0=p.x,p.y0=p.y):f.push({id:v.id,data:v})}return{layout:"manual",getNode:function(e){return f.find((t=>t.data.id===e))},applyLayout(e){var t,a,{manualLayoutStatus:r,nodesRefRepository:i,lineLabelsRefRepository:d,normalizedLinesMap:u,nodeMovement:v}=e;if(0===f.length)return null;s(f,i,l),v&&(o=f.find((e=>e.id===v.id)),o&&(o.x=(null!==(t=o.x0)&&void 0!==t?t:0)+v.move[0],o.y=(null!==(a=o.y0)&&void 0!==a?a:0)+v.move[1])),"finished"===r&&o&&(o.x0=o.x,o.y0=o.y),c(f,i,l);var p=k(n,{normalizedLinesMap:u,lineLabelsRefRepository:d});return{nodes:f,edges:p}}}}(e,n,i,I):null))}),[i,n,N,I,M,R]),(0,a.useEffect)((()=>{if(L&&A&&N===(null==T?void 0:T.layout)){var e=null==T?void 0:T.applyLayout({manualLayoutStatus:w,nodesRefRepository:L,lineLabelsRefRepository:A,normalizedLinesMap:C,nodeMovement:E});e&&W(e)}}),[N,w,T,E,L,A,P,S,C]),z}},9741:(e,t,n)=>{n.d(t,{_:()=>c});var a=n(6330),r=n(8769),o=n(4146),i=n(8406),l=n(6841),d=n(780),s="GRAPH_USER_VIEW@EASYOPS";function c(e){var[t,n]=(0,r.useState)(!e),c=(0,r.useRef)(),[u,f]=(0,r.useState)(null),v=(0,r.useMemo)((()=>{return e=!1,t=[],function(){var n=(0,a.A)((function*(n){if(t.push(n),!e){var a;for(e=!0;a=t.shift();)try{yield a()}catch(e){console.error(e)}e=!1}}));return function(e){return n.apply(this,arguments)}}();var e,t}),[]);return(0,r.useEffect)((()=>{function t(){return(t=(0,a.A)((function*(){if(e){var{namespace:t,key:a}=e;if(!t||!a)return console.error("Namespace and key are required to save graph user view"),void n(!0);try{var r=(yield(0,i.y)(s,{fields:["nodes"],query:{namespace:{$eq:t},key:{$eq:a}},page:1,page_size:30})).list;if(r.length>0){var l,d=r[0],u=new Map(null===(l=d.nodes)||void 0===l?void 0:l.map((e=>[e.id,e])));c.current=d.instanceId,f(u)}else f(null)}catch(e){(0,o.handleHttpError)(e)}finally{n(!0)}}else n(!0)}))).apply(this,arguments)}!function(){t.apply(this,arguments)}()}),[e]),{userViewReady:t,userViewNodesMap:u,saveUserView:(0,r.useCallback)((t=>{var{namespace:n,key:r}=null!=e?e:{};n&&r&&v((0,a.A)((function*(){var e={namespace:n,key:r,nodes:t};try{if(c.current)yield(0,l.x)(s,c.current,e,{interceptorParams:{ignoreLoadingBar:!0}});else{var a=yield(0,d._)(s,e,{interceptorParams:{ignoreLoadingBar:!0}});c.current=a.instanceId}}catch(e){(0,o.handleHttpError)(e)}})))}),[e,v])}}},1324:(e,t,n)=>{function a(e,t){for(var{id:n,position:a,placement:r,angle:o,size:i}of e){var l=t.get(n);if(l&&(l.style.left="".concat(a[0],"px"),l.style.top="".concat(a[1],"px"),l.style.visibility="visible","center"!==r&&void 0!==o)){var[d,s]=null!=i?i:[0,0],c=Math.floor((o<0?2*Math.PI+o:o)/Math.PI*4),u="start"===r?c:(c+4)%8,f=Math.tan(o),v=o+("start"===r?1:-1)*Math.PI/2,p=2*Math.sin(v),h=2*Math.cos(v),m=void 0;switch(u){case 0:m="translate(0,".concat(d*f+p,"px)");break;case 1:m="translate(".concat(s/f-h,"px,0)");break;case 2:m="translate(calc(".concat(s/f+h,"px - 100%),0)");break;case 3:m="translate(-100%,".concat(-d*f-p,"px)");break;case 4:m="translate(-100%,calc(".concat(-d*f+p,"px - 100%))");break;case 5:m="translate(calc(".concat(-s/f-h,"px - 100%),-100%)");break;case 6:m="translate(".concat(-s/f+h,"px,-100%)");break;default:m="translate(0,calc(".concat(d*f-p,"px - 100%))")}l.style.transform=m}}}n.d(t,{F:()=>a})},5987:(e,t,n)=>{function a(e,t){var n=new Map;for(var{id:a,lineId:r,placement:o}of e)if(t&&"center"===o){var i=t.get(a);if(i){var{offsetWidth:l,offsetHeight:d}=i;0!==l&&0!==d&&n.set(r,[{left:i.offsetLeft-l/2-3,top:i.offsetTop-d/2-3,width:l+6,height:d+6}])}}return n}n.d(t,{G:()=>a})},8060:(e,t,n)=>{function a(e,t,n){return 0===e.length&&0===t.length?e:t.flatMap((e=>{var t,a,{line:{text:r,label:o,$id:i},edge:l,labelSize:d,angle:s}=e,c=n.get(i);if(!r&&!o||!c||!c.getAttribute("d"))return[];o?(t="label",a=[].concat(o)):(t="text",a=[].concat(r));var{x:u,y:f,width:v,height:p}=c.getBBox(),h=c.getTotalLength();return a.map((e=>{var n,a=null!==(n=e.placement)&&void 0!==n?n:"center",r=c.getPointAtLength("start"===a?Math.min(0,h/2):"end"===a?Math.max(h-0,h/2):h/2);return{[t]:e,edge:l,position:[r.x,r.y],lineRect:{left:u,top:f,width:v,height:p},id:"".concat(i,"-").concat(a),lineId:i,placement:a,angle:s,size:null==d?void 0:d[a]}}))}))}n.d(t,{z:()=>a})},9576:(e,t,n)=>{n.d(t,{R:()=>g});var a=n(9740),r=n(4223),o=n(482),i=n(4643),l=n(3488),d=n(6066),s=n(4993),c=n(3269);function u(e,t,n,a){if(!Array.isArray(e))return"";var r;switch(t){case"curveLinear":r=o.A;break;case"curveBumpX":r=i.dJ;break;case"curveBumpY":r=i.kl;break;case"curveMonotoneX":r=l.G;break;case"curveMonotoneY":r=l.N;break;case"curveNatural":r=d.A;break;default:r=s.Ay}var u=f(e[1],e[0],n),v=f(e[e.length-2],e[e.length-1],a);return(0,c.A)().x(((t,n)=>t.x-(0===n?u.x:n===e.length-1?v.x:0))).y(((t,n)=>t.y-(0===n?u.y:n===e.length-1?v.y:0))).curve(r)(e)}function f(e,t,n){if(!n)return{x:0,y:0};var{x:a,y:r}=e,{x:o,y:i}=t,l=n/Math.sqrt(Math.pow(o-a,2)+Math.pow(i-r,2));return{x:(o-a)*l,y:(i-r)*l}}var v=n(3188);function p(e,t,n){var{x:a,y:r,width:o,height:i}=e;switch(t){case"top":return{x:a-o/2+o*n,y:r-i/2};case"bottom":return{x:a-o/2+o*n,y:r+i/2};case"left":return{x:a-o/2,y:r-i/2+i*n};case"right":return{x:a+o/2,y:r-i/2+i*n}}}var h=n(733),m=["line","edge","markers"];function g(e,t,n){var o=new WeakMap,i=new Map,l=new Map;for(var d of t)i.set(d.id,d);for(var s of e){var{data:c}=s;o.set(c,s)}var f=!1;return n.map((t=>{var n,d,s,c,{line:g,edge:b,markers:x}=t,w=(0,r.A)(t,m),M=o.get(b);if(M){var R,E=null!==(n=null===(d=x.find((e=>"default"===e.variant&&"start"===e.placement)))||void 0===d?void 0:d.offset)&&void 0!==n?n:0,L=null!==(s=null===(c=x.find((e=>"default"===e.variant&&"end"===e.placement)))||void 0===c?void 0:c.offset)&&void 0!==s?s:0,{points:A}=M;if(!A){var C=i.get(b.source),P=i.get(b.target);if(C&&P&&C!==P){if("polyline"===g.type){if(!(0,h.w)(C,P,E,L)){var S,I;(()=>{if(!f){f=!0;var t=(e,t)=>{var n=l.get(e);n||l.set(e,n=new Set);var a=i.get(t);a&&n.add(a)};for(var{data:{source:n,target:a}}of e)n!==a&&(t(n,a),t(a,n))}})();var N=y(C,P,E),T=y(P,C,L),B=k(null!==(S=l.get(b.source))&&void 0!==S?S:[],C,N,E),z=k(null!==(I=l.get(b.target))&&void 0!==I?I:[],P,T,L);A=function(e,t,n,a,r,o){var i,l,d=p(e,n,r),s=p(t,a,o);switch(n){case"top":case"bottom":i={x:d.x,y:(d.y+s.y)/2},l={x:s.x,y:i.y};break;default:l={x:(i={x:(d.x+s.x)/2,y:d.y}).x,y:s.y}}return[d,i,l,s]}(C,P,N,T,(B.indexOf(P)+1)/(B.length+1),(z.indexOf(C)+1)/(z.length+1))}}else A=(0,v.h)(C,P);if(A){var W=A[0],_=A[A.length-1];R=Math.atan2(_.y-W.y,_.x-W.x)}}}var D=u(A,g.curveType,E,L);return(0,a.A)((0,a.A)({},w),{},{markers:x,line:g,edge:b,d:D,angle:R,labelSize:M.labelSize})}})).filter(Boolean)}function y(e,t,n){var a=Math.atan2(e.height+2*n,e.width+2*n),{x:r,y:o}=e,{x:i,y:l}=t,d=Math.atan2(l-o,i-r),s=d<0?2*Math.PI+d:d;switch(Math.floor(s/Math.PI*2)){case 0:return s<a?"right":"bottom";case 1:return s<Math.PI-a?"bottom":"left";case 2:return s<Math.PI+a?"left":"top";default:return s<2*Math.PI-a?"top":"right"}}function k(e,t,n,a){return[...e].filter((e=>y(t,e,a)===n)).sort(((e,t)=>{var{x:a,y:r}=e,{x:o,y:i}=t;return"top"===n||"bottom"===n?a-o:r-i}))}},5157:(e,t,n)=>{n.d(t,{a:()=>r});var a=n(1030);function r(e,t){var{renderedNodes:n,activeTarget:a}=t,r="node"===(null==a?void 0:a.type)?n.find((e=>e.id===a.nodeId)):void 0,i="edge"===(null==a?void 0:a.type)?a.edge:void 0;if(r||i){var l,d,s,c,u=e.key||e.keyCode||e.which;switch(u){case"Backspace":case 8:case"Delete":case 46:r?(l="delete-node",d=r):(l="delete-edge",s=i);break;default:if(!r)return;switch(u){case"ArrowLeft":case 37:d=o("x",n,r,-1),l="switch-active-node";break;case"ArrowUp":case 38:d=o("y",n,r,-1),l="switch-active-node";break;case"ArrowRight":case 39:d=o("x",n,r,1),l="switch-active-node";break;case"ArrowDown":case 40:d=o("y",n,r,1),l="switch-active-node"}}if(l)return e.preventDefault(),e.stopPropagation(),{action:l,node:null===(c=d)||void 0===c?void 0:c.data,edge:s}}}function o(e,t,n,r){var o,i="x"===e?"y":"x",l=t.filter((t=>t!==n&&(o=(t[e]-n[e])*r)>0&&o>Math.abs(n[i]-t[i])));return(0,a.minBy)(l,(t=>(n[i]-t[i])**2+(n[e]-t[e])**2))}},2448:(e,t,n)=>{n.d(t,{P:()=>i});var a=n(9740),r=n(4146),o=n(8657);function i(e,t){var{nodes:n,nodesRefRepository:i,connectNodes:l,dragNodes:d,scale:s,setConnectLineState:c,setConnectLineTo:u,setManualLayoutStatus:f,setNodeMovement:v,onSwitchActiveTarget:p,onNodesConnect:h}=t;function m(e){if(i){var t,a=function(t){if(e(o))return{v:null==n?void 0:n.find((e=>e.id===t))}};for(var[r,o]of i)if(t=a(r))return t.v}}if(l||d){var g=m((t=>t.contains(e.target)));if(g&&function(e,t){return e.sourceType?[].concat(e.sourceType).includes(t.type):(0,r.checkIfByTransform)(e,{source:t})}(l||d,g)){e.stopPropagation();var y=[e.clientX,e.clientY];if(l){c({from:y,options:(0,a.A)({strokeColor:o.mF,strokeWidth:o.VO},r.__secret_internals.legacyDoTransform({source:g},l))}),u(y),null==p||p({type:"node",nodeId:g.id});var k=e=>{u([e.clientX,e.clientY])},b=e=>{document.removeEventListener("mousemove",k),document.removeEventListener("mouseup",b),c(null);var t=e.composedPath(),n=m((e=>t.includes(e)));n&&g!==n&&(null==h||h({source:g,target:n}))};return document.addEventListener("mousemove",k),void document.addEventListener("mouseup",b)}null==p||p({type:"node",nodeId:g.id});var x=!1,w=e=>{var t=[(e.clientX-y[0])/s,(e.clientY-y[1])/s];x||(x=t[0]**2+t[1]**2>=9)&&f("started"),x&&v({id:g.id,move:t})},M=()=>{x=!1,document.removeEventListener("mousemove",w),document.removeEventListener("mouseup",M),v(null),f("finished")};document.addEventListener("mousemove",w),document.addEventListener("mouseup",M)}}}},9137:(e,t,n)=>{n.d(t,{t:()=>s});var a=n(9740),r=n(4223),o=n(1030),i=n(4146),l=n(8657),d=["label"];function s(e,t){var n=[],s=new WeakMap,u=[],f=function(e){var f,v,p=null!==(f=null==t?void 0:t.find((t=>function(e,t){return!!t&&(t.edgeType?[].concat(t.edgeType).includes(e.type):(0,i.checkIfByTransform)(t,{edge:e}))}(e,t))))&&void 0!==f?f:{},{label:h}=p,m=(0,r.A)(p,d),g=i.__secret_internals.legacyDoTransform({edge:e},m);if(!1===(null==g?void 0:g.draw))return 1;var y=(0,o.uniqueId)("line-"),k=(0,a.A)((0,a.A)({strokeColor:l.mF,strokeWidth:l.VO,curveType:"polyline"===(null==g?void 0:g.type)?"curveLinear":l.KP,interactStrokeWidth:l.Ie,type:"auto"},g),{},{label:h,$id:y});s.set(e,y);var b=[],x=null!==(v=k.markers)&&void 0!==v?v:k.arrow?[{placement:"end",type:"arrow"}]:[];for(var w of x){var M,R,E,L,{placement:A,type:C}=w,P=null!=A?A:"end",S=void 0,I=void 0;switch(C){case"0..1":case"0..N":I=21,S=C;break;default:I=1,S="arrow"}var N=I*k.strokeWidth,T=c({type:S,strokeColor:k.strokeColor},u);b.push({index:T,placement:P,type:S,variant:"default",offset:N});var B=c({type:S,strokeColor:null!==(M=null===(R=k.overrides)||void 0===R||null===(R=R.active)||void 0===R?void 0:R.strokeColor)&&void 0!==M?M:k.strokeColor},u);b.push({index:B,placement:P,type:S,variant:"active",offset:N});var z=c({type:S,strokeColor:null!==(E=null===(L=k.overrides)||void 0===L||null===(L=L.activeRelated)||void 0===L?void 0:L.strokeColor)&&void 0!==E?E:k.strokeColor},u);b.push({index:z,placement:P,type:S,variant:"active-related",offset:N})}n.push({line:k,markers:b,edge:e})};for(var v of null!=e?e:[])f(v);return{normalizedLines:n,normalizedLinesMap:s,markers:u}}function c(e,t){var n=(0,o.findIndex)(t,e);return-1===n&&(n=t.push(e)-1),n}},2673:(e,t,n)=>{function a(e,t){return e?!!t&&e.type===t.type&&("node"===e.type?e.nodeId===t.nodeId:e.edge.source===t.edge.source&&e.edge.target===t.edge.target):!t}n.d(t,{c:()=>a})},8308:(e,t,n)=>{function a(e,t){var{canvasWidth:n,canvasHeight:a,scaleRange:r}=t,o=1/0,i=1/0,l=-1/0,d=-1/0;for(var s of e){var c=s.width/2,u=s.height/2,f=s.x-c,v=s.x+c,p=s.y-u,h=s.y+u;f<o&&(o=f),v>l&&(l=v),p<i&&(i=p),h>d&&(d=h)}var m=l-o,g=d-i,y=r&&(m>n||g>a)?Math.max(Math.min(n/m,a/g,r[1]),r[0]):1;return{x:(n-m*y)/2-o*y,y:(a-g*y)/2-i*y,k:y}}n.d(t,{r:()=>a})},821:(e,t,n)=>{n.d(t,{A:()=>l});var a=n(6758),r=n.n(a),o=n(935),i=n.n(o)()(r());i.push([e.id,":host{display:block;width:100%;height:100%;overflow:hidden}:host([hidden]){display:none}*{box-sizing:border-box}.diagram{width:100%;height:100%;position:relative;opacity:0}.diagram:focus{outline:none}.lines,\n.line-labels,\n.nodes{position:absolute;top:0;left:0}.line-labels{opacity:0}.ready{opacity:1}.diagram.ready.pannable{cursor:-webkit-grab;cursor:grab}.diagram.pannable.grabbing{cursor:-webkit-grabbing;cursor:grabbing}.nodes,\n.lines{transform-origin:0 0}.node,\n.line-label{position:absolute;visibility:hidden}.line-label{transform:translate(-50%,-50%);white-space:pre-line;width:-webkit-max-content;width:-moz-max-content;width:max-content;text-align:center;line-height:1}.lines{pointer-events:none}.line.interactable{pointer-events:auto;cursor:default}.connect-line{position:fixed;top:0;left:0;right:0;bottom:0;pointer-events:none}.connect-line:not(.connecting){display:none}.line:not(.active) .active-bg{display:none}",""]);const l=i.toString()}}]);
2
- //# sourceMappingURL=4456.3fd8ee7c.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chunks/4456.3fd8ee7c.js","mappings":"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","sources":["webpack:///./src/diagram/ConnectLineComponent.tsx","webpack:///./src/diagram/LineComponent.tsx","webpack:///./src/diagram/LineLabelComponent.tsx","webpack:///./src/diagram/LineMaskComponent.tsx","webpack:///./src/diagram/NodeComponent.tsx","webpack:///./src/diagram/processors/findNodeBrick.ts","webpack:///./src/diagram/constants.ts","webpack:///./src/diagram/processors/adjustNodesSize.ts","webpack:///./src/diagram/processors/adjustNodesPosition.ts","webpack:///./src/diagram/processors/extractPartialRectTuple.ts","webpack:///./src/diagram/processors/getRenderedEdges.ts","webpack:///./src/diagram/processors/getForceGraph.ts","webpack:///./src/diagram/hooks/useRenderedDiagram.ts","webpack:///./src/diagram/processors/getDagreGraph.ts","webpack:///./src/diagram/processors/getManualGraph.ts","webpack:///./src/diagram/hooks/useUserView.ts","webpack:///./src/diagram/processors/createAsyncQueue.ts","webpack:///./src/diagram/processors/adjustLineLabels.ts","webpack:///./src/diagram/processors/getLineMaskRects.ts","webpack:///./src/diagram/processors/getRenderedLineLabels.ts","webpack:///./src/diagram/lines/curveLine.ts","webpack:///./src/diagram/lines/getPolyLinePoints.ts","webpack:///./src/diagram/processors/getRenderedLines.ts","webpack:///./src/diagram/processors/handleKeyboard.ts","webpack:///./src/diagram/processors/handleNodesMouseDown.ts","webpack:///./src/diagram/processors/normalizeLinesAndMarkers.ts","webpack:///./src/diagram/processors/matchEdgeByFilter.ts","webpack:///./src/diagram/processors/sameTarget.ts","webpack:///./src/diagram/processors/transformToCenter.ts","webpack:///./src/diagram/styles.shadow.css"],"sourcesContent":["import React from \"react\";\nimport classNames from \"classnames\";\nimport type { ConnectLineState, PositionTuple } from \"./interfaces\";\nimport { MarkerComponent } from \"./MarkerComponent\";\n\nexport interface ConnectLineComponentProps {\n connectLineState: ConnectLineState | null;\n connectLineTo: PositionTuple;\n markerPrefix: string;\n}\n\nexport function ConnectLineComponent({\n connectLineState,\n connectLineTo,\n markerPrefix,\n}: ConnectLineComponentProps): JSX.Element {\n return (\n <svg\n width=\"100%\"\n height=\"100%\"\n className={classNames(\"connect-line\", {\n connecting:\n !!connectLineState &&\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 >\n <defs>\n <MarkerComponent\n type=\"arrow\"\n id={`${markerPrefix}connect-line`}\n strokeColor={connectLineState?.options.strokeColor}\n />\n </defs>\n <path\n d={\n connectLineState\n ? `M${connectLineState.from.join(\" \")}L${connectLineTo.join(\" \")}`\n : \"\"\n }\n fill=\"none\"\n stroke={connectLineState?.options.strokeColor}\n strokeWidth={connectLineState?.options.strokeWidth}\n markerEnd={\n connectLineState?.options.arrow\n ? `url(#${markerPrefix}connect-line)`\n : undefined\n }\n />\n </svg>\n );\n}\n","import React from \"react\";\nimport classNames from \"classnames\";\nimport type { LineTarget, RenderedLine, LineMaskRects } from \"./interfaces\";\n\nexport interface LineComponentProps {\n line: RenderedLine;\n linePaths: Map<string, SVGPathElement | null>;\n lineMaskRects: LineMaskRects;\n maskPrefix: string;\n markerPrefix: string;\n activeLineMarkerPrefix: string;\n active?: boolean;\n activeRelated?: boolean;\n onLineClick?(line: LineTarget): void;\n onLineDoubleClick?(line: LineTarget): void;\n}\n\nexport function LineComponent({\n line: { line, edge, d, markers },\n linePaths,\n lineMaskRects,\n maskPrefix,\n markerPrefix,\n activeLineMarkerPrefix,\n active,\n activeRelated,\n onLineClick,\n onLineDoubleClick,\n}: LineComponentProps): JSX.Element {\n const mask = lineMaskRects.has(line.$id)\n ? `url(#${maskPrefix}${line.$id})`\n : undefined;\n\n const { strokeColor, strokeWidth, interactStrokeWidth } = {\n ...line,\n ...(active\n ? line.overrides?.active\n : activeRelated\n ? line.overrides?.activeRelated\n : null),\n };\n\n const expectVariant = active\n ? \"active\"\n : activeRelated\n ? \"active-related\"\n : \"default\";\n\n let markerStart: string | undefined;\n let markerEnd: string | undefined;\n\n for (const marker of markers) {\n if (marker.variant === expectVariant) {\n if (marker.placement === \"start\") {\n markerStart = `url(#${markerPrefix}${marker.index})`;\n } else {\n markerEnd = `url(#${markerPrefix}${marker.index})`;\n }\n }\n }\n\n return (\n <g\n className={classNames(\"line\", {\n interactable: line.interactable,\n active,\n \"active-related\": activeRelated,\n })}\n onClick={\n line.interactable\n ? () => {\n onLineClick?.({ id: line.$id, edge });\n }\n : undefined\n }\n onDoubleClick={\n line.interactable\n ? (e) => {\n e.preventDefault();\n e.stopPropagation();\n onLineDoubleClick?.({ id: line.$id, edge });\n }\n : undefined\n }\n style={{ cursor: line.cursor }}\n >\n {line.interactable && (\n <path\n // This `path` is made for expanding interaction area of graph lines.\n d={d}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={interactStrokeWidth}\n />\n )}\n <path\n ref={(element) => linePaths.set(line.$id, element)}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n d={d}\n fill=\"none\"\n markerStart={markerStart}\n markerEnd={markerEnd}\n mask={mask}\n />\n <path\n stroke=\"var(--palette-blue-3)\"\n strokeWidth={strokeWidth}\n d={d}\n fill=\"none\"\n className=\"active-bg\"\n markerStart={`url(#${activeLineMarkerPrefix}start)`}\n markerEnd={`url(#${activeLineMarkerPrefix}end)`}\n mask={mask}\n />\n </g>\n );\n}\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { ReactUseBrick } from \"@next-core/react-runtime\";\nimport { checkIfByTransform } from \"@next-core/runtime\";\nimport type {\n DiagramEdge,\n LineLabelConf,\n // PositionTuple,\n RefRepository,\n LineLabel,\n TextOptions,\n} from \"./interfaces\";\n\nexport interface LineLabelComponentGroupProps {\n labels?: LineLabel[];\n onRendered?: (refRepository: RefRepository | null) => void;\n}\n\nexport function LineLabelComponentGroup({\n labels,\n onRendered,\n}: LineLabelComponentGroupProps): JSX.Element {\n const [rendered, setRendered] = useState(false);\n const [renderedIds, setRenderedIds] = useState<string[]>([]);\n const refRepository = useMemo<RefRepository>(() => new Map(), []);\n\n const handleRenderer = useCallback(\n (id: string, element: HTMLElement | null) => {\n if (element) {\n refRepository.set(id, element);\n }\n setRenderedIds((previous) =>\n previous.includes(id) ? previous : previous.concat(id)\n );\n },\n [refRepository]\n );\n\n const handleUnmount = useCallback(\n (id: string) => {\n setRenderedIds((previous) => {\n const index = previous.indexOf(id);\n return index === -1\n ? previous\n : previous.slice(0, index).concat(previous.slice(index + 1));\n });\n refRepository.delete(id);\n },\n [refRepository]\n );\n\n useEffect(() => {\n // All nodes have been rendered.\n setRendered(!labels?.some((label) => !renderedIds.includes(label.id)));\n }, [labels, renderedIds]);\n\n useEffect(\n () => {\n onRendered?.(rendered ? refRepository : null);\n },\n // Dot not re-run effect when `onRendered` changed.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [/* onRendered, */ refRepository, rendered]\n );\n\n return (\n <React.Fragment>\n {labels?.map(({ text, label, /* position, */ id, edge }) =>\n label ? (\n <div\n key={id}\n className=\"line-label\"\n // style={{\n // left: position[0],\n // top: position[1],\n // }}\n >\n <LineLabelComponent\n id={id}\n edge={edge}\n label={label}\n onRendered={handleRenderer}\n onUnmount={handleUnmount}\n />\n </div>\n ) : (\n <LineTextComponent\n key={id}\n id={id}\n text={text!}\n // position={position}\n onRendered={handleRenderer}\n />\n )\n )}\n </React.Fragment>\n );\n}\n\nexport interface LineTextComponentProps {\n id: string;\n text: TextOptions;\n // position: PositionTuple;\n onRendered?: (id: string, element: HTMLElement | null) => void;\n // onUnmount?: (id: string) => void;\n}\n\nexport function LineTextComponent({\n id,\n text,\n // position,\n onRendered /* , onUnmount */,\n}: LineTextComponentProps): JSX.Element {\n const refCallback = useCallback(\n (element: HTMLDivElement) => {\n onRendered?.(id, element);\n },\n [id, onRendered]\n );\n\n return (\n <div\n className=\"line-label\"\n ref={refCallback}\n // style={{\n // left: position[0],\n // top: position[1],\n // ...text!.style,\n // }}\n style={text.style}\n >\n {text!.content}\n </div>\n );\n}\n\n// export const LineLabelComponentGroup = React.memo(LegacyLineLabelComponentGroup);\n\nexport interface LineLabelComponentProps {\n id: string;\n edge: DiagramEdge;\n label: LineLabelConf;\n onRendered?: (id: string, element: HTMLElement | null) => void;\n onUnmount?: (id: string) => void;\n}\n\nexport function LineLabelComponent({\n id,\n edge,\n label,\n onRendered,\n onUnmount,\n}: LineLabelComponentProps): JSX.Element | null {\n const useBrick = useMemo(\n () => (checkIfByTransform(label, { edge }) ? label.useBrick : null),\n [edge, 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?.(id, null);\n });\n }\n }, [id, onRendered, useBrick]);\n\n useEffect(\n () => {\n return () => {\n onUnmount?.(id);\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 onRendered?.(id, element.parentElement);\n });\n }\n },\n [id, onRendered]\n );\n\n const ignoredCallback = useCallback(() => {\n setTimeout(() => {\n onRendered?.(id, null);\n });\n }, [id, onRendered]);\n\n if (!useBrick) {\n return null;\n }\n\n return (\n <ReactUseBrick\n refCallback={refCallback}\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore For v3 only\n ignoredCallback={ignoredCallback}\n useBrick={useBrick}\n data={memoizedData}\n />\n );\n}\n","import React from \"react\";\nimport type { RenderedLineLabel, SimpleRect } from \"./interfaces\";\n\nexport interface LineMaskComponentProps {\n maskPrefix: string;\n lineId: string;\n rects: SimpleRect[];\n renderedLineLabels: RenderedLineLabel[];\n}\n\nexport function LineMaskComponent({\n lineId,\n rects,\n maskPrefix,\n renderedLineLabels,\n}: LineMaskComponentProps): JSX.Element | null {\n const lineText = renderedLineLabels.find(\n (item) => item.lineId === lineId && item.placement === \"center\"\n );\n // istanbul ignore next\n if (!lineText) {\n return null;\n }\n const { lineRect } = lineText;\n const bgRect = getRectWithPadding(lineRect, 1000);\n return (\n <mask\n id={`${maskPrefix}${lineId}`}\n x={bgRect.left}\n y={bgRect.top}\n width={bgRect.width}\n height={bgRect.height}\n >\n <rect\n x={bgRect.left}\n y={bgRect.top}\n width={bgRect.width}\n height={bgRect.height}\n // Everything under a white pixel will be visible\n fill=\"white\"\n />\n {rects.map((rect, index) => (\n <rect\n key={index}\n x={rect.left}\n y={rect.top}\n width={rect.width}\n height={rect.height}\n // Everything under a black pixel will be invisible\n fill=\"black\"\n />\n ))}\n </mask>\n );\n}\n\nfunction getRectWithPadding(rect: SimpleRect, padding: number): SimpleRect {\n return {\n left: rect.left - padding,\n top: rect.top - padding,\n width: rect.width + padding * 2,\n height: rect.height + padding * 2,\n };\n}\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { ReactUseBrick } from \"@next-core/react-runtime\";\nimport type {\n DiagramNode,\n DiagramNodeId,\n NodeBrickConf,\n RefRepository,\n} from \"./interfaces\";\nimport { findNodeBrick } from \"./processors/findNodeBrick\";\n\nexport interface NodeComponentGroupProps {\n nodes?: DiagramNode[];\n nodeBricks?: NodeBrickConf[];\n onRendered?: (refRepository: RefRepository | null) => void;\n}\n\nexport function NodeComponentGroup({\n nodes,\n nodeBricks,\n onRendered,\n}: NodeComponentGroupProps): JSX.Element {\n const [rendered, setRendered] = useState(false);\n const [renderedIds, setRenderedIds] = useState<DiagramNodeId[]>([]);\n const refRepository = useMemo<RefRepository>(() => new Map(), []);\n\n const handleRenderer = useCallback(\n (id: DiagramNodeId, element: HTMLElement | null) => {\n if (element) {\n refRepository.set(id, element);\n }\n setRenderedIds((previous) =>\n previous.includes(id) ? previous : previous.concat(id)\n );\n },\n [refRepository]\n );\n\n const handleUnmount = useCallback(\n (id: DiagramNodeId) => {\n setRenderedIds((previous) => {\n const index = previous.indexOf(id);\n return index === -1\n ? previous\n : previous.slice(0, index).concat(previous.slice(index + 1));\n });\n refRepository.delete(id);\n },\n [refRepository]\n );\n\n useEffect(() => {\n // All nodes have been rendered.\n setRendered(!nodes?.some((node) => !renderedIds.includes(node.id)));\n }, [nodes, renderedIds]);\n\n useEffect(\n () => {\n onRendered?.(rendered ? refRepository : null);\n },\n // Dot not re-run effect when `onRendered` changed.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [/* onRendered, */ refRepository, rendered]\n );\n\n return (\n <React.Fragment>\n {nodes?.map((node) => (\n <div key={node.id} className=\"node\">\n <NodeComponent\n nodeBricks={nodeBricks}\n node={node}\n onRendered={handleRenderer}\n onUnmount={handleUnmount}\n />\n </div>\n ))}\n </React.Fragment>\n );\n}\n\nexport interface NodeComponentProps {\n node: DiagramNode;\n nodeBricks?: NodeBrickConf[];\n onRendered?: (id: DiagramNodeId, element: HTMLElement | null) => void;\n onUnmount?: (id: DiagramNodeId) => void;\n}\n\nexport function NodeComponent({\n node,\n nodeBricks,\n onRendered,\n onUnmount,\n}: NodeComponentProps): JSX.Element | null {\n const useBrick = useMemo(\n () => findNodeBrick(node, nodeBricks)?.useBrick,\n [node, nodeBricks]\n );\n const memoizedData = useMemo(() => ({ node }), [node]);\n\n useEffect(() => {\n if (!useBrick) {\n // Keep the same time delay for reporting rendered.\n setTimeout(() => {\n onRendered?.(node.id, null);\n });\n }\n }, [node.id, onRendered, useBrick]);\n\n useEffect(\n () => {\n return () => {\n onUnmount?.(node.id);\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 onRendered?.(node.id, element);\n });\n }\n },\n [node.id, onRendered]\n );\n\n const ignoredCallback = useCallback(() => {\n setTimeout(() => {\n onRendered?.(node.id, null);\n });\n }, [node.id, onRendered]);\n\n if (!useBrick) {\n return null;\n }\n\n return (\n <ReactUseBrick\n refCallback={refCallback}\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore For v3 only\n ignoredCallback={ignoredCallback}\n useBrick={useBrick}\n data={memoizedData}\n />\n );\n}\n","import { checkIfByTransform } from \"@next-core/runtime\";\nimport { NodeBrickConf, DiagramNode } from \"../interfaces\";\n\nexport function findNodeBrick(\n node: DiagramNode,\n nodeBricks: NodeBrickConf[] | undefined\n): NodeBrickConf | undefined {\n return nodeBricks?.find((item) => {\n if (item.nodeType) {\n return ([] as unknown[]).concat(item.nodeType).includes(node.type);\n }\n return checkIfByTransform(item, { node });\n });\n}\n","export const DEFAULT_LINE_STROKE_COLOR = \"var(--palette-gray-5)\";\nexport const DEFAULT_LINE_STROKE_WIDTH = 1;\nexport const DEFAULT_LINE_CURVE_TYPE = \"curveBasis\";\nexport const DEFAULT_LINE_INTERACT_STROKE_WIDTH = 20;\nexport const DEFAULT_SCALE_RANGE_MIN = 0.5;\nexport const DEFAULT_SCALE_RANGE_MAX = 2;\n","import type { FullRectTuple, RefRepository, RenderedNode } from \"../interfaces\";\n\nexport function adjustNodesSize(\n nodes: RenderedNode[],\n nodesRefRepository: RefRepository,\n nodePaddings: FullRectTuple\n) {\n for (const node of nodes) {\n const element = nodesRefRepository.get(node.id);\n node.width =\n Math.max(element?.offsetWidth ?? 0, 10) +\n nodePaddings[1] +\n nodePaddings[3];\n node.height =\n Math.max(element?.offsetHeight ?? 0, 10) +\n nodePaddings[0] +\n nodePaddings[2];\n }\n}\n","import type { FullRectTuple, RefRepository, RenderedNode } from \"../interfaces\";\n\nexport function adjustNodesPosition(\n nodes: RenderedNode[],\n nodesRefRepository: RefRepository,\n nodePaddings: FullRectTuple\n) {\n for (const node of nodes) {\n const x = node.x - node.width / 2 + nodePaddings[3];\n const y = node.y - node.height / 2 + nodePaddings[0];\n\n const nodeContainer = nodesRefRepository.get(node.id)?.parentElement;\n if (nodeContainer) {\n nodeContainer.style.left = `${x}px`;\n nodeContainer.style.top = `${y}px`;\n nodeContainer.style.visibility = \"visible\";\n }\n }\n}\n","import type { FullRectTuple, PartialRectTuple } from \"../interfaces\";\n\nexport function extractPartialRectTuple(\n value: PartialRectTuple\n): FullRectTuple {\n if (Array.isArray(value)) {\n const v0 = value[0];\n const v1 = value.length > 1 ? value[1]! : v0;\n const v2 = value.length > 2 ? value[2]! : v0;\n const v3 = value.length > 3 ? value[3]! : v1;\n return [v0, v1, v2, v3];\n }\n return new Array(4).fill(value) as FullRectTuple;\n}\n","// istanbul ignore file: experimental\nimport type {\n DiagramEdge,\n LabelSize,\n RefRepository,\n RenderedEdge,\n} from \"../interfaces\";\n\nexport function getRenderedEdges(\n edges: DiagramEdge[] | undefined,\n {\n normalizedLinesMap,\n lineLabelsRefRepository,\n }: {\n normalizedLinesMap: WeakMap<DiagramEdge, string>;\n lineLabelsRefRepository: RefRepository;\n }\n) {\n return (\n edges?.map<RenderedEdge>((edge) => {\n const lineId = normalizedLinesMap.get(edge);\n const labelSize: LabelSize = {};\n if (lineId) {\n for (const placement of [/* \"center\", */ \"start\", \"end\"] as const) {\n const element = lineLabelsRefRepository.get(`${lineId}-${placement}`);\n if (element) {\n labelSize[placement] = [element.offsetWidth, element.offsetHeight];\n }\n }\n }\n\n return {\n data: edge,\n labelSize,\n };\n }) ?? []\n );\n}\n","// istanbul ignore file: experimental\nimport {\n forceSimulation,\n forceLink,\n forceCollide,\n forceManyBody,\n forceX,\n forceY,\n type Simulation,\n type SimulationNodeDatum,\n type SimulationLinkDatum,\n} from \"d3-force\";\nimport { pick } from \"lodash\";\nimport type {\n DiagramEdge,\n DiagramNode,\n ForceCollideOptions,\n LayoutOptionsForce,\n RenderedNode,\n UnifiedGraph,\n UserViewNodesMap,\n} from \"../interfaces\";\nimport { adjustNodesSize } from \"./adjustNodesSize\";\nimport { adjustNodesPosition } from \"./adjustNodesPosition\";\nimport { extractPartialRectTuple } from \"./extractPartialRectTuple\";\nimport { getRenderedEdges } from \"./getRenderedEdges\";\n\ninterface NormalNode extends SimulationNodeDatum {\n dummy?: false;\n id: string;\n data: DiagramNode;\n width: number;\n height: number;\n}\n\ninterface DummyNode extends SimulationNodeDatum {\n dummy: true;\n id: string;\n}\n\ntype ForceNode = NormalNode | DummyNode;\n\ntype ForceLink = SimulationLinkDatum<ForceNode> & {\n dummy?: boolean;\n};\n\nexport function getForceGraph(\n previousGraph: UnifiedGraph | null,\n nodes: DiagramNode[] | undefined,\n edges: DiagramEdge[] | undefined,\n userViewNodesMap: UserViewNodesMap | null,\n forceLayoutOptions: LayoutOptionsForce | undefined\n): UnifiedGraph {\n const { nodePadding, dummyNodesOnEdges, collide } = {\n nodePadding: 0,\n dummyNodesOnEdges: 0,\n ...pick(forceLayoutOptions, [\"nodePadding\", \"dummyNodesOnEdges\"]),\n collide:\n forceLayoutOptions?.collide !== false\n ? ({\n dummyRadius: 1,\n radiusDiff: 5,\n strength: 1,\n iterations: 1,\n ...(forceLayoutOptions?.collide === true\n ? null\n : (forceLayoutOptions?.collide as ForceCollideOptions)),\n } as Required<ForceCollideOptions>)\n : (false as const),\n };\n const nodePaddings = extractPartialRectTuple(nodePadding);\n\n const renderedNodes: RenderedNode[] = [];\n for (const node of nodes ?? []) {\n const previousNode = previousGraph?.getNode(node.id);\n if (previousNode?.data === node) {\n renderedNodes.push(previousNode);\n } else {\n const renderedNode = {\n id: node.id,\n data: node,\n } as RenderedNode & { fx?: number; fy?: number };\n const userViewNode = userViewNodesMap?.get(node.id);\n if (userViewNode) {\n renderedNode.fx = userViewNode.x;\n renderedNode.fy = userViewNode.y;\n }\n renderedNodes.push(renderedNode);\n }\n }\n\n function getNode(id: string) {\n return renderedNodes.find((node) => node.data.id === id);\n }\n\n return {\n layout: \"force\",\n getNode,\n applyLayout({\n nodesRefRepository,\n lineLabelsRefRepository,\n normalizedLinesMap,\n }) {\n if (renderedNodes.length === 0) {\n return null;\n }\n\n adjustNodesSize(renderedNodes, nodesRefRepository, nodePaddings);\n\n const forceNodes = renderedNodes.slice();\n const forceLinks: ForceLink[] = [];\n\n for (const edge of edges ?? []) {\n forceLinks.push({ ...edge });\n if (dummyNodesOnEdges > 0) {\n forceNodes.push(\n ...(getDummyNodes(\n edge,\n dummyNodesOnEdges\n ) as Partial<RenderedNode>[] as RenderedNode[])\n );\n forceLinks.push(...getDummyEdges(edge, dummyNodesOnEdges));\n }\n }\n\n const linkSimulation = forceLink<ForceNode, ForceLink>(forceLinks).id(\n (d) => d.id\n );\n\n if (dummyNodesOnEdges > 0) {\n linkSimulation\n .distance((l) => (l.dummy ? 30 / (dummyNodesOnEdges + 1) : 30))\n .strength((l) => (l.dummy ? 0.5 : 1));\n }\n\n const simulation = forceSimulation<ForceNode>(forceNodes)\n .force(\"link\", linkSimulation)\n .force(\"x\", forceX())\n .force(\"y\", forceY())\n .force(\"charge\", forceManyBody());\n\n if (collide) {\n simulation.force(\n \"collide\",\n forceCollide<ForceNode>()\n .radius((d) =>\n d.dummy\n ? collide.dummyRadius\n : Math.sqrt(d.width ** 2 + d.height ** 2) / 2 +\n collide.radiusDiff\n )\n .strength(collide.strength)\n .iterations(collide.iterations)\n );\n }\n\n simulation.stop();\n manuallyTickToTheEnd(simulation);\n\n adjustNodesPosition(renderedNodes, nodesRefRepository, nodePaddings);\n\n const renderedEdges = getRenderedEdges(edges, {\n normalizedLinesMap,\n lineLabelsRefRepository,\n });\n\n return { nodes: renderedNodes, edges: renderedEdges };\n },\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\nfunction getDummyNodes(edge: DiagramEdge, count: number): DummyNode[] {\n return new Array(count).fill(null).map<DummyNode>((v, i) => ({\n dummy: true,\n id: `$dummy-${edge.source}-${edge.target}-${i}`,\n }));\n}\n\nfunction getDummyEdges(edge: DiagramEdge, count: number): ForceLink[] {\n return new Array(count + 1).fill(null).map<ForceLink>((v, i) => ({\n dummy: true,\n source:\n i === 0 ? edge.source : `$dummy-${edge.source}-${edge.target}-${i - 1}`,\n target:\n i === count ? edge.target : `$dummy-${edge.source}-${edge.target}-${i}`,\n }));\n}\n","import { useEffect, useState } from \"react\";\nimport type {\n DiagramEdge,\n DiagramNode,\n LayoutOptions,\n LayoutOptionsDagre,\n LayoutOptionsForce,\n ManualLayoutStatus,\n NodeMovement,\n RefRepository,\n RenderedDiagram,\n UnifiedGraph,\n UserViewNodesMap,\n} from \"../interfaces\";\nimport { getDagreGraph } from \"../processors/getDagreGraph\";\nimport { getForceGraph } from \"../processors/getForceGraph\";\nimport { getManualGraph } from \"../processors/getManualGraph\";\n\nexport function useRenderedDiagram({\n layout: originalLayout,\n nodes,\n edges,\n manualLayoutStatus,\n userViewReady,\n userViewNodesMap,\n nodeMovement,\n nodesRefRepository,\n lineLabelsRefRepository,\n normalizedLinesMap,\n nodesRenderId,\n lineLabelsRenderId,\n layoutOptions,\n}: {\n layout: \"dagre\" | \"force\" | undefined;\n nodes: DiagramNode[] | undefined;\n edges: DiagramEdge[] | undefined;\n manualLayoutStatus: ManualLayoutStatus;\n userViewReady: boolean;\n userViewNodesMap: UserViewNodesMap | null;\n nodeMovement: NodeMovement | null;\n nodesRefRepository: RefRepository | null;\n lineLabelsRefRepository: RefRepository | null;\n normalizedLinesMap: WeakMap<DiagramEdge, string>;\n nodesRenderId: number;\n lineLabelsRenderId: number;\n layoutOptions?: LayoutOptions;\n}) {\n const layout = manualLayoutStatus === \"initial\" ? originalLayout : \"manual\";\n const [graph, setGraph] = useState<UnifiedGraph | null>(null);\n\n const [renderedDiagram, setRenderedDiagram] = useState<RenderedDiagram>({\n nodes: [],\n edges: [],\n });\n\n useEffect(() => {\n if (!userViewReady) {\n return;\n }\n setGraph((previousGraph) =>\n layout === \"dagre\"\n ? getDagreGraph(\n previousGraph,\n nodes,\n edges,\n layoutOptions as LayoutOptionsDagre\n )\n : layout === \"force\"\n ? getForceGraph(\n previousGraph,\n nodes,\n edges,\n userViewNodesMap,\n layoutOptions as LayoutOptionsForce\n )\n : layout === \"manual\"\n ? getManualGraph(previousGraph, nodes, edges, layoutOptions)\n : null\n );\n }, [edges, nodes, layout, layoutOptions, userViewReady, userViewNodesMap]);\n\n useEffect(() => {\n if (\n !nodesRefRepository ||\n !lineLabelsRefRepository ||\n layout !== graph?.layout\n ) {\n return;\n }\n const renderedDiagram = graph?.applyLayout({\n manualLayoutStatus,\n nodesRefRepository,\n lineLabelsRefRepository,\n normalizedLinesMap,\n nodeMovement,\n });\n if (renderedDiagram) {\n setRenderedDiagram(renderedDiagram);\n }\n }, [\n layout,\n manualLayoutStatus,\n graph,\n nodeMovement,\n nodesRefRepository,\n lineLabelsRefRepository,\n nodesRenderId,\n lineLabelsRenderId,\n normalizedLinesMap,\n ]);\n\n return renderedDiagram;\n}\n","import dagre from \"@dagrejs/dagre\";\nimport { pick } from \"lodash\";\nimport type {\n DiagramEdge,\n DiagramNode,\n LayoutOptionsDagre,\n RenderedEdge,\n RenderedNode,\n UnifiedGraph,\n} from \"../interfaces\";\nimport { adjustNodesSize } from \"./adjustNodesSize\";\nimport { adjustNodesPosition } from \"./adjustNodesPosition\";\nimport { extractPartialRectTuple } from \"./extractPartialRectTuple\";\n\nexport function getDagreGraph(\n previousGraph: UnifiedGraph | null,\n nodes: DiagramNode[] | undefined,\n edges: DiagramEdge[] | undefined,\n dagreLayoutOptions: LayoutOptionsDagre | undefined\n): UnifiedGraph {\n const { nodePadding, ...dagreGraphOptions } = {\n nodePadding: 0,\n rankdir: \"TB\",\n ranksep: 50,\n edgesep: 10,\n nodesep: 50,\n // align: undefined,\n ...pick(dagreLayoutOptions, [\n \"nodePadding\",\n \"rankdir\",\n \"ranksep\",\n \"edgesep\",\n \"nodesep\",\n \"align\",\n ]),\n };\n const nodePaddings = extractPartialRectTuple(nodePadding);\n\n // Create a new directed graph\n const graph = new dagre.graphlib.Graph<RenderedNode>();\n\n // Set an object for the graph label\n graph.setGraph(dagreGraphOptions);\n\n // Default to assigning a new object as a label for each new edge.\n graph.setDefaultEdgeLabel(function () {\n return {};\n });\n\n for (const node of nodes ?? []) {\n const previousNode = previousGraph?.getNode(node.id);\n graph.setNode(\n node.id,\n previousNode?.data === node\n ? previousNode\n : {\n id: node.id,\n data: node,\n }\n );\n }\n\n for (const edge of edges ?? []) {\n graph.setEdge(edge.source, edge.target, { data: edge });\n }\n\n return {\n layout: \"dagre\",\n getNode(id) {\n return graph.node(id);\n },\n applyLayout({\n nodesRefRepository,\n lineLabelsRefRepository,\n normalizedLinesMap,\n }) {\n const renderedNodes: RenderedNode[] = [];\n for (const id of graph.nodes()) {\n const node = graph.node(id);\n if (node) {\n renderedNodes.push(node);\n } else {\n // eslint-disable-next-line no-console\n console.error(\"Diagram node not found: %s\", id);\n }\n }\n\n if (renderedNodes.length === 0) {\n return null;\n }\n\n adjustNodesSize(renderedNodes, nodesRefRepository, nodePaddings);\n\n const renderedEdges = graph\n .edges()\n .map((e) => graph.edge(e) as RenderedEdge);\n for (const edge of renderedEdges) {\n const lineId = normalizedLinesMap.get(edge.data);\n if (lineId) {\n for (const placement of [\"center\", \"start\", \"end\"] as const) {\n const element = lineLabelsRefRepository.get(\n `${lineId}-${placement}`\n );\n if (element) {\n const { offsetWidth, offsetHeight } = element;\n if (placement === \"center\") {\n edge.labelpos = \"c\";\n edge.width = offsetWidth;\n edge.height = offsetHeight;\n }\n edge.labelSize ??= {};\n edge.labelSize[placement] = [offsetWidth, offsetHeight];\n }\n }\n }\n }\n dagre.layout(graph);\n\n adjustNodesPosition(renderedNodes, nodesRefRepository, nodePaddings);\n\n return {\n nodes: renderedNodes,\n edges: renderedEdges,\n };\n },\n };\n}\n","// istanbul ignore file: experimental\nimport { pick } from \"lodash\";\nimport type {\n DiagramEdge,\n DiagramNode,\n BaseLayoutOptions,\n RenderedNode,\n UnifiedGraph,\n} from \"../interfaces\";\nimport { extractPartialRectTuple } from \"./extractPartialRectTuple\";\nimport { adjustNodesSize } from \"./adjustNodesSize\";\nimport { adjustNodesPosition } from \"./adjustNodesPosition\";\nimport { getRenderedEdges } from \"./getRenderedEdges\";\n\nexport function getManualGraph(\n previousGraph: UnifiedGraph | null,\n nodes: DiagramNode[] | undefined,\n edges: DiagramEdge[] | undefined,\n layoutOptions: BaseLayoutOptions | undefined\n): UnifiedGraph {\n const { nodePadding } = {\n nodePadding: 0,\n ...pick(layoutOptions, [\"nodePadding\"]),\n };\n const nodePaddings = extractPartialRectTuple(nodePadding);\n\n const renderedNodes: RenderedNode[] = [];\n for (const node of nodes ?? []) {\n const previousNode = previousGraph?.getNode(node.id);\n if (previousNode?.data === node) {\n renderedNodes.push(previousNode);\n previousNode.x0 = previousNode.x;\n previousNode.y0 = previousNode.y;\n } else {\n renderedNodes.push({\n id: node.id,\n data: node,\n } as RenderedNode);\n }\n }\n\n function getNode(id: string) {\n return renderedNodes.find((node) => node.data.id === id);\n }\n\n let movedNode: RenderedNode | undefined;\n\n return {\n layout: \"manual\",\n getNode,\n applyLayout({\n manualLayoutStatus,\n nodesRefRepository,\n lineLabelsRefRepository,\n normalizedLinesMap,\n nodeMovement,\n }) {\n if (renderedNodes.length === 0) {\n return null;\n }\n\n adjustNodesSize(renderedNodes, nodesRefRepository, nodePaddings);\n\n if (nodeMovement) {\n movedNode = renderedNodes.find((node) => node.id === nodeMovement.id);\n if (movedNode) {\n movedNode.x = (movedNode.x0 ?? 0) + nodeMovement.move[0];\n movedNode.y = (movedNode.y0 ?? 0) + nodeMovement.move[1];\n }\n }\n\n if (manualLayoutStatus === \"finished\" && movedNode) {\n // Set x0/y0 after finished manual layout\n movedNode.x0 = movedNode.x;\n movedNode.y0 = movedNode.y;\n }\n\n adjustNodesPosition(renderedNodes, nodesRefRepository, nodePaddings);\n\n const renderedEdges = getRenderedEdges(edges, {\n normalizedLinesMap,\n lineLabelsRefRepository,\n });\n\n return { nodes: renderedNodes, edges: renderedEdges };\n },\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { handleHttpError } from \"@next-core/runtime\";\nimport {\n InstanceApi_postSearchV3,\n InstanceApi_updateInstanceV2,\n InstanceApi_createInstance,\n} from \"@next-api-sdk/cmdb-sdk\";\nimport { createAsyncQueue } from \"../processors/createAsyncQueue\";\nimport {\n NodeUserView,\n UserView,\n UserViewNodesMap,\n UserViewQuery,\n} from \"../interfaces\";\n\nconst USER_VIEW_MODEL_ID = \"GRAPH_USER_VIEW@EASYOPS\";\n\nexport interface UserViewHook {\n userViewReady: boolean;\n userViewNodesMap: UserViewNodesMap | null;\n saveUserView: (nodes: NodeUserView[]) => void;\n}\n\nexport function useUserView(query: UserViewQuery | undefined): UserViewHook {\n const [userViewReady, setUserViewReady] = useState(!query);\n const userViewIdRef = useRef<string>();\n const [userViewNodesMap, setUserViewNodesMap] =\n useState<UserViewNodesMap | null>(null);\n const queue = useMemo(() => createAsyncQueue(), []);\n\n useEffect(() => {\n async function getUserView(): Promise<void> {\n if (!query) {\n setUserViewReady(true);\n return;\n }\n const { namespace, key } = query;\n if (!(namespace && key)) {\n // eslint-disable-next-line no-console\n console.error(\"Namespace and key are required to save graph user view\");\n setUserViewReady(true);\n return;\n }\n try {\n const list = (\n await InstanceApi_postSearchV3(USER_VIEW_MODEL_ID, {\n fields: [\"nodes\"],\n query: {\n namespace: {\n $eq: namespace,\n },\n key: {\n $eq: key,\n },\n },\n page: 1,\n page_size: 30,\n })\n ).list as UserView[];\n if (list.length > 0) {\n const userView = list[0];\n const userViewNodesMap = new Map(\n userView.nodes?.map((node) => [node.id, node])\n );\n userViewIdRef.current = userView.instanceId;\n setUserViewNodesMap(userViewNodesMap);\n } else {\n setUserViewNodesMap(null);\n }\n } catch (error) {\n handleHttpError(error as Error);\n } finally {\n setUserViewReady(true);\n }\n }\n getUserView();\n }, [query]);\n\n const saveUserView = useCallback(\n (nodes: NodeUserView[]) => {\n const { namespace, key } = query ?? {};\n if (!(namespace && key)) {\n return;\n }\n queue(async () => {\n const userViewData = {\n namespace,\n key,\n nodes,\n };\n try {\n if (userViewIdRef.current) {\n await InstanceApi_updateInstanceV2(\n USER_VIEW_MODEL_ID,\n userViewIdRef.current,\n userViewData,\n {\n interceptorParams: {\n ignoreLoadingBar: true,\n },\n }\n );\n } else {\n const userView = await InstanceApi_createInstance(\n USER_VIEW_MODEL_ID,\n userViewData,\n {\n interceptorParams: {\n ignoreLoadingBar: true,\n },\n }\n );\n userViewIdRef.current = userView.instanceId;\n }\n } catch (error) {\n handleHttpError(error);\n }\n });\n },\n [query, queue]\n );\n\n return {\n userViewReady,\n userViewNodesMap,\n saveUserView,\n };\n}\n","type Task = (...args: unknown[]) => unknown;\ntype Queue = (task: Task) => Promise<void>;\n\nexport function createAsyncQueue(): Queue {\n let working = false;\n const waitingTasks: Task[] = [];\n return async function queue(task: Task) {\n waitingTasks.push(task);\n if (!working) {\n working = true;\n let nextTask: Task | undefined;\n while ((nextTask = waitingTasks.shift())) {\n try {\n await nextTask();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n }\n working = false;\n }\n };\n}\n","import type { RefRepository, RenderedLineLabel } from \"../interfaces\";\n\nexport function adjustLineLabels(\n renderedLineLabels: RenderedLineLabel[],\n lineLabelsRefRepository: RefRepository\n) {\n for (const {\n id,\n position,\n placement,\n angle,\n size: _size,\n } of renderedLineLabels) {\n const label = lineLabelsRefRepository.get(id);\n if (label) {\n label.style.left = `${position[0]}px`;\n label.style.top = `${position[1]}px`;\n label.style.visibility = \"visible\";\n // label.classList.add(placement);\n if (placement !== \"center\" && angle !== undefined) {\n const [width, height] = _size ?? [0, 0];\n // Get the numbered direction of the line\n //\n // \\ | /\n // \\ 5 | 6 /\n // 4 \\ | / 7\n // -----x-----\n // 3 / | \\ 0\n // / 2 | 1 \\\n // / | \\\n const tempDirection = Math.floor(\n ((angle < 0 ? Math.PI * 2 + angle : angle) / Math.PI) * 4\n );\n // Swap direction for end labels.\n const direction =\n placement === \"start\" ? tempDirection : (tempDirection + 4) % 8;\n const tangent = Math.tan(angle);\n const offsetAngle =\n angle + ((placement === \"start\" ? 1 : -1) * Math.PI) / 2;\n const offset = 2;\n const offsetSin = Math.sin(offsetAngle) * offset;\n const offsetCos = Math.cos(offsetAngle) * offset;\n let transform: string;\n switch (direction) {\n case 0:\n transform = `translate(0,${width * tangent + offsetSin}px)`;\n break;\n case 1:\n transform = `translate(${height / tangent - offsetCos}px,0)`;\n break;\n case 2:\n transform = `translate(calc(${\n height / tangent + offsetCos\n }px - 100%),0)`;\n break;\n case 3:\n transform = `translate(-100%,${-width * tangent - offsetSin}px)`;\n break;\n case 4:\n transform = `translate(-100%,calc(${\n -width * tangent + offsetSin\n }px - 100%))`;\n break;\n case 5:\n transform = `translate(calc(${\n -height / tangent - offsetCos\n }px - 100%),-100%)`;\n break;\n case 6:\n transform = `translate(${-height / tangent + offsetCos}px,-100%)`;\n break;\n default:\n transform = `translate(0,calc(${\n width * tangent - offsetSin\n }px - 100%))`;\n }\n label.style.transform = transform;\n }\n }\n }\n}\n","import type {\n LineMaskRects,\n RefRepository,\n RenderedLineLabel,\n} from \"../interfaces\";\n\nexport function getLineMaskRects(\n renderedLineLabels: RenderedLineLabel[],\n lineLabelsRefRepository: RefRepository\n) {\n const map: LineMaskRects = new Map();\n\n for (const { id, lineId, placement } of renderedLineLabels) {\n if (!lineLabelsRefRepository || placement !== \"center\") {\n continue;\n }\n const element = lineLabelsRefRepository.get(id);\n if (!element) {\n continue;\n }\n const { offsetWidth, offsetHeight } = element;\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 continue;\n }\n const padding = 3;\n // Currently no other rects\n map.set(lineId, [\n {\n left: element.offsetLeft - offsetWidth / 2 - padding,\n top: element.offsetTop - offsetHeight / 2 - padding,\n width: offsetWidth + padding * 2,\n height: offsetHeight + padding * 2,\n },\n ]);\n }\n\n return map;\n}\n","import type {\n LineLabelConf,\n RenderedLine,\n RenderedLineLabel,\n TextOptions,\n} from \"../interfaces\";\n\nexport function getRenderedLineLabels(\n previous: RenderedLineLabel[],\n renderedLines: RenderedLine[],\n linePaths: Map<string, SVGPathElement | null>\n) {\n if (previous.length === 0 && renderedLines.length === 0) {\n return previous;\n }\n return renderedLines.flatMap(\n ({ line: { text, label, $id }, edge, labelSize, angle }) => {\n const path = linePaths.get($id);\n if ((!text && !label) || !path || !path.getAttribute(\"d\")) {\n return [] as RenderedLineLabel[];\n }\n\n let key: \"label\" | \"text\";\n let list: LineLabelConf[] | TextOptions[];\n if (label) {\n key = \"label\";\n list = ([] as LineLabelConf[]).concat(label);\n } else {\n key = \"text\";\n list = ([] as TextOptions[]).concat(text!);\n }\n\n // istanbul ignore next\n const {\n x: left,\n y: top,\n width,\n height,\n } = process.env.NODE_ENV === \"test\"\n ? { x: 10, y: 20, width: 300, height: 400 }\n : path.getBBox();\n\n // istanbul ignore next\n const pathLength =\n process.env.NODE_ENV === \"test\" ? 50 : path.getTotalLength();\n\n return list.map<RenderedLineLabel>((item) => {\n const placement = item.placement ?? \"center\";\n const offset = 0;\n // istanbul ignore next\n const point =\n process.env.NODE_ENV === \"test\"\n ? { x: 50, y: 50 }\n : path.getPointAtLength(\n placement === \"start\"\n ? Math.min(offset, pathLength / 2)\n : placement === \"end\"\n ? Math.max(pathLength - offset, pathLength / 2)\n : pathLength / 2\n );\n\n return {\n [key as \"label\"]: item as LineLabelConf,\n edge,\n position: [point.x, point.y],\n lineRect: { left, top, width, height },\n id: `${$id}-${placement}`,\n lineId: $id,\n placement,\n angle,\n size: labelSize?.[placement],\n };\n });\n }\n );\n}\n","import {\n curveLinear,\n line,\n curveBasis,\n curveBumpX,\n curveBumpY,\n type CurveFactory,\n curveMonotoneX,\n curveNatural,\n curveMonotoneY,\n} from \"d3-shape\";\nimport type { CurveType, NodePosition } from \"../interfaces\";\n\n/**\n * Generate Line from points\n */\nexport function curveLine(\n points: Array<NodePosition> | null | undefined,\n curveType: CurveType | undefined,\n startOffset: number,\n endOffset: number\n): string {\n if (!Array.isArray(points)) {\n return \"\";\n }\n let curveFactory: CurveFactory;\n switch (curveType) {\n case \"curveLinear\":\n curveFactory = curveLinear;\n break;\n case \"curveBumpX\":\n curveFactory = curveBumpX;\n break;\n case \"curveBumpY\":\n curveFactory = curveBumpY;\n break;\n case \"curveMonotoneX\":\n curveFactory = curveMonotoneX;\n break;\n case \"curveMonotoneY\":\n curveFactory = curveMonotoneY;\n break;\n case \"curveNatural\":\n curveFactory = curveNatural;\n break;\n default:\n curveFactory = curveBasis;\n }\n const startOffsets = getOffsets(points[1], points[0], startOffset);\n const endOffsets = getOffsets(\n points[points.length - 2],\n points[points.length - 1],\n endOffset\n );\n const lineFunction = line()\n .x(\n (d, index) =>\n (d as unknown as { x: number }).x -\n (index === 0\n ? startOffsets.x\n : index === points.length - 1\n ? endOffsets.x\n : 0)\n )\n .y(\n (d, index) =>\n (d as unknown as { y: number }).y -\n (index === 0\n ? startOffsets.y\n : index === points.length - 1\n ? endOffsets.y\n : 0)\n )\n .curve(curveFactory);\n return lineFunction(points as unknown as Array<[number, number]>)!;\n}\n\nfunction getOffsets(\n start: NodePosition,\n end: NodePosition,\n offset: number\n): NodePosition {\n if (!offset) {\n return { x: 0, y: 0 };\n }\n const { x: x0, y: y0 } = start;\n const { x: x1, y: y1 } = end;\n const distance = Math.sqrt(Math.pow(x1 - x0, 2) + Math.pow(y1 - y0, 2));\n const ratio = offset / distance;\n return {\n x: (x1 - x0) * ratio,\n y: (y1 - y0) * ratio,\n };\n}\n","import type { Direction, NodePosition, RenderedNode } from \"../interfaces\";\n\nexport function getPolyLinePoints(\n source: RenderedNode,\n target: RenderedNode,\n sourceDirection: Direction,\n targetDirection: Direction,\n sourcePosition: number,\n targetPosition: number\n): NodePosition[] | null {\n const p0 = getCoordinates(source, sourceDirection, sourcePosition);\n const p1 = getCoordinates(target, targetDirection, targetPosition);\n\n let c1: NodePosition;\n let c2: NodePosition;\n switch (sourceDirection) {\n case \"top\":\n case \"bottom\":\n switch (targetDirection) {\n default:\n c1 = { x: p0.x, y: (p0.y + p1.y) / 2 };\n c2 = { x: p1.x, y: c1.y };\n break;\n }\n break;\n default:\n switch (targetDirection) {\n default:\n c1 = { x: (p0.x + p1.x) / 2, y: p0.y };\n c2 = { x: c1.x, y: p1.y };\n break;\n }\n }\n\n return [p0, c1, c2, p1];\n}\n\nfunction getCoordinates(\n node: RenderedNode,\n direction: Direction,\n position: number\n): NodePosition {\n const { x, y, width, height } = node;\n switch (direction) {\n case \"top\":\n return {\n x: x - width / 2 + width * position,\n y: y - height / 2,\n };\n case \"bottom\":\n return {\n x: x - width / 2 + width * position,\n y: y + height / 2,\n };\n case \"left\":\n return {\n x: x - width / 2,\n y: y - height / 2 + height * position,\n };\n case \"right\":\n return {\n x: x + width / 2,\n y: y - height / 2 + height * position,\n };\n }\n}\n","// istanbul ignore file: experimental\nimport type {\n DiagramEdge,\n Direction,\n NormalizedLine,\n RenderedEdge,\n RenderedLine,\n RenderedNode,\n} from \"../interfaces\";\nimport { curveLine } from \"../lines/curveLine\";\nimport { getDirectLinePoints } from \"../lines/getDirectLinePoints\";\nimport { getPolyLinePoints } from \"../lines/getPolyLinePoints\";\nimport { doTwoNodesOverlap } from \"./doTwoNodesOverlap\";\n\nexport function getRenderedLines(\n renderedEdges: RenderedEdge[],\n renderedNodes: RenderedNode[],\n normalizedLines: NormalizedLine[]\n): RenderedLine[] {\n const renderedEdgeMap = new WeakMap<DiagramEdge, RenderedEdge>();\n const renderedNodeMap = new Map<string, RenderedNode>();\n const relatedNodes = new Map<string, Set<RenderedNode>>();\n\n for (const renderedNode of renderedNodes) {\n renderedNodeMap.set(renderedNode.id, renderedNode);\n }\n\n for (const renderedEdge of renderedEdges) {\n const { data: edge } = renderedEdge;\n renderedEdgeMap.set(edge, renderedEdge);\n }\n\n let prepared = false;\n const prepareRelatedNodes = () => {\n if (prepared) {\n return;\n }\n prepared = true;\n\n const addRelatedNodes = (from: string, to: string) => {\n let relates = relatedNodes.get(from);\n if (!relates) {\n relatedNodes.set(from, (relates = new Set()));\n }\n const toNode = renderedNodeMap.get(to);\n if (toNode) {\n relates.add(toNode);\n }\n };\n\n for (const {\n data: { source, target },\n } of renderedEdges) {\n if (source !== target) {\n addRelatedNodes(source, target);\n addRelatedNodes(target, source);\n }\n }\n };\n\n return normalizedLines\n .map<RenderedLine | undefined>(({ line, edge, markers, ...rest }) => {\n const renderedEdge = renderedEdgeMap.get(edge);\n if (!renderedEdge) {\n return;\n }\n const startMarkerOffset =\n markers.find(\n (marker) =>\n marker.variant === \"default\" && marker.placement === \"start\"\n )?.offset ?? 0;\n const endMarkerOffset =\n markers.find(\n (marker) => marker.variant === \"default\" && marker.placement === \"end\"\n )?.offset ?? 0;\n let angle: number | undefined;\n\n let { points } = renderedEdge;\n // Only dagre graph will have pre-calculated line points\n if (!points) {\n const source = renderedNodeMap.get(edge.source);\n const target = renderedNodeMap.get(edge.target);\n\n if (source && target && source !== target) {\n if (line.type === \"polyline\") {\n if (\n !doTwoNodesOverlap(\n source,\n target,\n startMarkerOffset,\n endMarkerOffset\n )\n ) {\n prepareRelatedNodes();\n const sourceDirection = getDirection(\n source,\n target,\n startMarkerOffset\n );\n const targetDirection = getDirection(\n target,\n source,\n endMarkerOffset\n );\n const sourceRelates = getOrderedRelates(\n relatedNodes.get(edge.source) ?? [],\n source,\n sourceDirection,\n startMarkerOffset\n );\n const targetRelates = getOrderedRelates(\n relatedNodes.get(edge.target) ?? [],\n target,\n targetDirection,\n endMarkerOffset\n );\n\n const sourcePosition =\n (sourceRelates.indexOf(target) + 1) /\n (sourceRelates.length + 1);\n const targetPosition =\n (targetRelates.indexOf(source) + 1) /\n (targetRelates.length + 1);\n\n points = getPolyLinePoints(\n source,\n target,\n sourceDirection,\n targetDirection,\n sourcePosition,\n targetPosition\n );\n }\n } else {\n points = getDirectLinePoints(source, target);\n }\n\n if (points) {\n const start = points[0];\n const end = points[points.length - 1];\n angle = Math.atan2(end.y - start.y, end.x - start.x);\n }\n }\n }\n\n const d = curveLine(\n points,\n line.curveType,\n startMarkerOffset,\n endMarkerOffset\n );\n return {\n ...rest,\n markers,\n line,\n edge,\n d,\n angle,\n labelSize: renderedEdge.labelSize,\n };\n })\n .filter(Boolean) as RenderedLine[];\n}\n\nfunction getDirection(\n source: RenderedNode,\n target: RenderedNode,\n padding: number\n): Direction {\n // Add a padding to the source node to avoid the markers being warped.\n const sourceAngle = Math.atan2(\n source.height + padding * 2,\n source.width + padding * 2\n );\n const { x: sx, y: sy } = source;\n const { x: tx, y: ty } = target;\n const angle = Math.atan2(ty - sy, tx - sx);\n const fixedAngle = angle < 0 ? Math.PI * 2 + angle : angle;\n const direction = Math.floor((fixedAngle / Math.PI) * 2);\n switch (direction) {\n case 0:\n return fixedAngle < sourceAngle ? \"right\" : \"bottom\";\n case 1:\n return fixedAngle < Math.PI - sourceAngle ? \"bottom\" : \"left\";\n case 2:\n return fixedAngle < Math.PI + sourceAngle ? \"left\" : \"top\";\n default:\n return fixedAngle < Math.PI * 2 - sourceAngle ? \"top\" : \"right\";\n }\n}\n\nfunction getOrderedRelates(\n relates: Iterable<RenderedNode>,\n from: RenderedNode,\n direction: Direction,\n padding: number\n): RenderedNode[] {\n return [...relates]\n .filter((node) => getDirection(from, node, padding) === direction)\n .sort((a, b) => {\n const { x: ax, y: ay } = a;\n const { x: bx, y: by } = b;\n return direction === \"top\" || direction === \"bottom\" ? ax - bx : ay - by;\n });\n}\n","import { minBy } from \"lodash\";\nimport type {\n ActiveTarget,\n DiagramEdge,\n DiagramNode,\n RenderedNode,\n} from \"../interfaces\";\n\nexport type KeyboardAction =\n | KeyboardActionSwitchActiveNode\n | KeyboardActionDeleteNode\n | KeyboardActionDeleteEdge;\n\nexport interface KeyboardActionSwitchActiveNode {\n action: \"switch-active-node\";\n node?: DiagramNode;\n}\n\nexport interface KeyboardActionDeleteNode {\n action: \"delete-node\";\n node: DiagramNode;\n}\n\nexport interface KeyboardActionDeleteEdge {\n action: \"delete-edge\";\n edge: DiagramEdge;\n}\n\nexport function handleKeyboard(\n event: KeyboardEvent,\n {\n renderedNodes,\n activeTarget,\n }: {\n renderedNodes: RenderedNode[];\n activeTarget: ActiveTarget | null | undefined;\n }\n): KeyboardAction | undefined {\n const activeNode =\n activeTarget?.type === \"node\"\n ? renderedNodes.find((node) => node.id === activeTarget.nodeId)\n : undefined;\n const activeEdge =\n activeTarget?.type === \"edge\" ? activeTarget.edge : undefined;\n\n if (!activeNode && !activeEdge) {\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 let action: KeyboardAction[\"action\"] | undefined;\n let node: RenderedNode | undefined;\n let edge: DiagramEdge | undefined;\n\n switch (key) {\n case \"Backspace\":\n case 8:\n case \"Delete\":\n case 46: {\n if (activeNode) {\n action = \"delete-node\";\n node = activeNode;\n } else {\n action = \"delete-edge\";\n edge = activeEdge;\n }\n break;\n }\n default:\n if (!activeNode) {\n return;\n }\n switch (key) {\n case \"ArrowLeft\":\n case 37: {\n node = moveOnAxis(\"x\", renderedNodes, activeNode, -1);\n action = \"switch-active-node\";\n break;\n }\n case \"ArrowUp\":\n case 38: {\n node = moveOnAxis(\"y\", renderedNodes, activeNode, -1);\n action = \"switch-active-node\";\n break;\n }\n case \"ArrowRight\":\n case 39: {\n node = moveOnAxis(\"x\", renderedNodes, activeNode, 1);\n action = \"switch-active-node\";\n break;\n }\n case \"ArrowDown\":\n case 40: {\n node = moveOnAxis(\"y\", renderedNodes, activeNode, 1);\n action = \"switch-active-node\";\n break;\n }\n }\n }\n if (action) {\n event.preventDefault();\n event.stopPropagation();\n return { action, node: node?.data, edge } as KeyboardAction;\n }\n}\n\nfunction moveOnAxis(\n axis: \"x\" | \"y\",\n renderedNodes: RenderedNode[],\n activeNode: RenderedNode,\n direction: 1 | -1\n) {\n const oppositeAxis = axis === \"x\" ? \"y\" : \"x\";\n let diff: number;\n const candidates = renderedNodes.filter(\n (node) =>\n node !== activeNode &&\n ((diff = (node[axis] - activeNode[axis]) * direction), diff > 0) &&\n diff > Math.abs(activeNode[oppositeAxis] - node[oppositeAxis])\n );\n return minBy(\n candidates,\n (node) =>\n (activeNode[oppositeAxis] - node[oppositeAxis]) ** 2 +\n (activeNode[axis] - node[axis]) ** 2\n );\n}\n","import { checkIfByTransform, __secret_internals } from \"@next-core/runtime\";\nimport type React from \"react\";\nimport {\n DEFAULT_LINE_STROKE_COLOR,\n DEFAULT_LINE_STROKE_WIDTH,\n} from \"../constants\";\nimport type {\n ConnectLineState,\n DiagramNode,\n ConnectLineDetail,\n ConnectNodesOptions,\n PositionTuple,\n RefRepository,\n ActiveTarget,\n DragNodesOptions,\n NodesFilterOptions,\n NodeMovement,\n ManualLayoutStatus,\n} from \"../interfaces\";\n\nexport function handleNodesMouseDown(\n event: MouseEvent,\n {\n nodes,\n nodesRefRepository,\n connectNodes,\n dragNodes,\n scale,\n setConnectLineState,\n setConnectLineTo,\n setManualLayoutStatus,\n setNodeMovement,\n onSwitchActiveTarget,\n onNodesConnect,\n }: {\n nodes: DiagramNode[] | undefined;\n connectNodes: ConnectNodesOptions | undefined;\n dragNodes: DragNodesOptions | undefined;\n nodesRefRepository: RefRepository | null;\n scale: number;\n setConnectLineState: (\n value: React.SetStateAction<ConnectLineState | null>\n ) => void;\n setConnectLineTo: (value: React.SetStateAction<PositionTuple>) => void;\n setManualLayoutStatus: (\n value: React.SetStateAction<ManualLayoutStatus>\n ) => void;\n setNodeMovement: (value: React.SetStateAction<NodeMovement | null>) => void;\n onSwitchActiveTarget?(target: ActiveTarget | null): void;\n onNodesConnect?(detail: ConnectLineDetail): void;\n }\n) {\n function findNode(match: (element: HTMLElement) => boolean) {\n if (nodesRefRepository) {\n for (const [id, element] of nodesRefRepository) {\n if (match(element)) {\n return nodes?.find((node) => node.id === id);\n }\n }\n }\n }\n\n if (!connectNodes && !dragNodes) {\n return;\n }\n\n const source = findNode((element) =>\n element.contains(event.target as Node | null)\n );\n\n if (!source) {\n return;\n }\n\n if (!nodeMatched(connectNodes || dragNodes!, source)) {\n return;\n }\n\n event.stopPropagation();\n const from: PositionTuple = [event.clientX, event.clientY];\n\n if (connectNodes) {\n setConnectLineState({\n from,\n options: {\n strokeColor: DEFAULT_LINE_STROKE_COLOR,\n strokeWidth: DEFAULT_LINE_STROKE_WIDTH,\n ...(__secret_internals.legacyDoTransform(\n { source },\n connectNodes\n ) as ConnectNodesOptions),\n },\n });\n setConnectLineTo(from);\n\n onSwitchActiveTarget?.({ type: \"node\", nodeId: source.id });\n\n const onMouseMove = (e: MouseEvent) => {\n setConnectLineTo([e.clientX, e.clientY]);\n };\n const onMouseUp = (e: MouseEvent) => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n setConnectLineState(null);\n const eventTargets = e.composedPath();\n const target = findNode((element) => eventTargets.includes(element));\n if (target && source !== target) {\n onNodesConnect?.({ source, target });\n }\n };\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n return;\n }\n\n // Drag node\n onSwitchActiveTarget?.({ type: \"node\", nodeId: source.id });\n\n let moved = false;\n const onMouseMove = (e: MouseEvent) => {\n // Respect the scale\n const movement: PositionTuple = [\n (e.clientX - from[0]) / scale,\n (e.clientY - from[1]) / scale,\n ];\n if (!moved) {\n moved = movement[0] ** 2 + movement[1] ** 2 >= 9;\n if (moved) {\n setManualLayoutStatus(\"started\");\n }\n }\n if (moved) {\n setNodeMovement({ id: source.id, move: movement });\n }\n };\n const onMouseUp = () => {\n moved = false;\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n setNodeMovement(null);\n setManualLayoutStatus(\"finished\");\n };\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n}\n\nfunction nodeMatched(\n options: NodesFilterOptions,\n source: DiagramNode\n): boolean {\n return options.sourceType\n ? ([] as unknown[]).concat(options.sourceType).includes(source.type)\n : checkIfByTransform(options, { source });\n}\n","import { findIndex, uniqueId } from \"lodash\";\nimport { __secret_internals } from \"@next-core/runtime\";\nimport type {\n DiagramEdge,\n LineConf,\n LineMarker,\n LineMarkerConf,\n LineMarkerType,\n NormalizedLine,\n NormalizedLineMarker,\n} from \"../interfaces\";\nimport { matchEdgeByFilter } from \"./matchEdgeByFilter\";\nimport {\n DEFAULT_LINE_CURVE_TYPE,\n DEFAULT_LINE_INTERACT_STROKE_WIDTH,\n DEFAULT_LINE_STROKE_COLOR,\n DEFAULT_LINE_STROKE_WIDTH,\n} from \"../constants\";\n\nexport function normalizeLinesAndMarkers(\n edges: DiagramEdge[] | undefined,\n lines: LineConf[] | undefined\n) {\n const normalizedLines: NormalizedLine[] = [];\n const normalizedLinesMap = new WeakMap<DiagramEdge, string>();\n const markers: LineMarker[] = [];\n for (const edge of edges ?? []) {\n const { label, ...restLineConf } =\n lines?.find((line) => matchEdgeByFilter(edge, line)) ?? {};\n\n const computedLineConf = __secret_internals.legacyDoTransform(\n { edge },\n restLineConf\n ) as LineConf | undefined;\n if (computedLineConf?.draw === false) {\n continue;\n }\n const id = uniqueId(\"line-\");\n const line: NormalizedLine[\"line\"] = {\n strokeColor: DEFAULT_LINE_STROKE_COLOR,\n strokeWidth: DEFAULT_LINE_STROKE_WIDTH,\n curveType:\n computedLineConf?.type === \"polyline\"\n ? \"curveLinear\"\n : DEFAULT_LINE_CURVE_TYPE,\n interactStrokeWidth: DEFAULT_LINE_INTERACT_STROKE_WIDTH,\n type: \"auto\",\n ...computedLineConf,\n label,\n $id: id,\n };\n normalizedLinesMap.set(edge, id);\n\n const normalizedMarkers: NormalizedLineMarker[] = [];\n\n const lineMarkers: LineMarkerConf[] =\n line.markers ?? (line.arrow ? [{ placement: \"end\", type: \"arrow\" }] : []);\n for (const marker of lineMarkers) {\n const { placement: _placement, type: _type } = marker;\n const placement = _placement ?? \"end\";\n\n let type: LineMarkerType;\n let offsetUnit: number;\n\n switch (_type) {\n case \"0..1\":\n case \"0..N\":\n offsetUnit = 21;\n type = _type;\n break;\n default:\n offsetUnit = 1;\n type = \"arrow\";\n }\n const offset = offsetUnit * line.strokeWidth;\n\n const index = addMarker({ type, strokeColor: line.strokeColor }, markers);\n normalizedMarkers.push({\n index,\n placement,\n type,\n variant: \"default\",\n offset,\n });\n\n const activeStrokeColor =\n line.overrides?.active?.strokeColor ?? line.strokeColor;\n const activeMarkerIndex = addMarker(\n { type, strokeColor: activeStrokeColor },\n markers\n );\n normalizedMarkers.push({\n index: activeMarkerIndex,\n placement,\n type,\n variant: \"active\",\n offset,\n });\n const activeRelatedStrokeColor =\n line.overrides?.activeRelated?.strokeColor ?? line.strokeColor;\n const activeRelatedMarkerIndex = addMarker(\n { type, strokeColor: activeRelatedStrokeColor },\n markers\n );\n normalizedMarkers.push({\n index: activeRelatedMarkerIndex,\n placement,\n type,\n variant: \"active-related\",\n offset,\n });\n }\n\n normalizedLines.push({\n line,\n markers: normalizedMarkers,\n edge,\n });\n }\n return {\n normalizedLines,\n normalizedLinesMap,\n markers,\n };\n}\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","import { checkIfByTransform } from \"@next-core/runtime\";\nimport type { DiagramEdge, LineConf } from \"../interfaces\";\n\nexport function matchEdgeByFilter(\n edge: DiagramEdge,\n filter: LineConf\n): boolean {\n if (!filter) {\n return false;\n }\n if (filter.edgeType) {\n return ([] as string[]).concat(filter.edgeType).includes(edge.type!);\n }\n return checkIfByTransform(filter, { edge });\n}\n","import type {\n ActiveTarget,\n ActiveTargetOfEdge,\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 === \"node\"\n ? a.nodeId === (b as ActiveTargetOfNode).nodeId\n : a.edge.source === (b as ActiveTargetOfEdge).edge.source &&\n a.edge.target === (b as ActiveTargetOfEdge).edge.target)\n : !b;\n}\n","import type { RenderedNode, TransformLiteral } from \"../interfaces\";\n\nexport interface TransformToCenterOptions {\n canvasWidth: number;\n canvasHeight: number;\n scaleRange?: [min: number, max: number];\n}\n\nexport function transformToCenter(\n renderedNodes: RenderedNode[],\n { canvasWidth, canvasHeight, scaleRange }: TransformToCenterOptions\n): TransformLiteral {\n let left = Infinity;\n let top = Infinity;\n let right = -Infinity;\n let bottom = -Infinity;\n for (const node of renderedNodes) {\n const hw = node.width / 2;\n const hh = node.height / 2;\n const l = node.x - hw;\n const r = node.x + hw;\n const t = node.y - hh;\n const b = node.y + hh;\n if (l < left) {\n left = l;\n }\n if (r > right) {\n right = r;\n }\n if (t < top) {\n top = t;\n }\n if (b > bottom) {\n bottom = b;\n }\n }\n\n const width = right - left;\n const height = bottom - top;\n\n const scale =\n scaleRange && (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 = (canvasWidth - width * scale) / 2 - left * scale;\n const y = (canvasHeight - height * scale) / 2 - top * scale;\n\n return { x, y, k: scale };\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, `:host{display:block;width:100%;height:100%;overflow:hidden}:host([hidden]){display:none}*{box-sizing:border-box}.diagram{width:100%;height:100%;position:relative;opacity:0}.diagram:focus{outline:none}.lines,\n.line-labels,\n.nodes{position:absolute;top:0;left:0}.line-labels{opacity:0}.ready{opacity:1}.diagram.ready.pannable{cursor:-webkit-grab;cursor:grab}.diagram.pannable.grabbing{cursor:-webkit-grabbing;cursor:grabbing}.nodes,\n.lines{transform-origin:0 0}.node,\n.line-label{position:absolute;visibility:hidden}.line-label{transform:translate(-50%,-50%);white-space:pre-line;width:-webkit-max-content;width:-moz-max-content;width:max-content;text-align:center;line-height:1}.lines{pointer-events:none}.line.interactable{pointer-events:auto;cursor:default}.connect-line{position:fixed;top:0;left:0;right:0;bottom:0;pointer-events:none}.connect-line:not(.connecting){display:none}.line:not(.active) .active-bg{display:none}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n"],"names":["ConnectLineComponent","_ref","connectLineState","connectLineTo","markerPrefix","React","width","height","className","classNames","connecting","from","MarkerComponent","type","id","concat","strokeColor","options","d","join","fill","stroke","strokeWidth","markerEnd","arrow","undefined","LineComponent","_line$overrides","_line$overrides2","markerStart","line","edge","markers","linePaths","lineMaskRects","maskPrefix","activeLineMarkerPrefix","active","activeRelated","onLineClick","onLineDoubleClick","mask","has","$id","interactStrokeWidth","_objectSpread","overrides","expectVariant","marker","variant","placement","index","interactable","onClick","onDoubleClick","e","preventDefault","stopPropagation","style","cursor","ref","element","set","LineLabelComponentGroup","labels","onRendered","rendered","setRendered","useState","renderedIds","setRenderedIds","refRepository","useMemo","Map","handleRenderer","useCallback","previous","includes","handleUnmount","indexOf","slice","delete","useEffect","some","label","map","_ref2","text","key","LineLabelComponent","onUnmount","LineTextComponent","_ref3","refCallback","content","_ref4","useBrick","checkIfByTransform","memoizedData","setTimeout","parentElement","ignoredCallback","ReactUseBrick","data","LineMaskComponent","lineId","rects","renderedLineLabels","lineText","find","item","rect","padding","lineRect","bgRect","left","top","x","y","NodeComponentGroup","nodes","nodeBricks","node","NodeComponent","_findNodeBrick","nodeType","findNodeBrick","DEFAULT_LINE_STROKE_COLOR","DEFAULT_LINE_STROKE_WIDTH","DEFAULT_LINE_CURVE_TYPE","DEFAULT_LINE_INTERACT_STROKE_WIDTH","DEFAULT_SCALE_RANGE_MIN","DEFAULT_SCALE_RANGE_MAX","adjustNodesSize","nodesRefRepository","nodePaddings","_element$offsetWidth","_element$offsetHeight","get","Math","max","offsetWidth","offsetHeight","adjustNodesPosition","_nodesRefRepository$g","nodeContainer","visibility","extractPartialRectTuple","value","Array","isArray","v0","v1","length","getRenderedEdges","edges","_edges$map","normalizedLinesMap","lineLabelsRefRepository","labelSize","getDummyNodes","count","v","i","dummy","source","target","getDummyEdges","useRenderedDiagram","layout","originalLayout","manualLayoutStatus","userViewReady","userViewNodesMap","nodeMovement","nodesRenderId","lineLabelsRenderId","layoutOptions","graph","setGraph","renderedDiagram","setRenderedDiagram","previousGraph","dagreLayoutOptions","_nodePadding$rankdir$","nodePadding","rankdir","ranksep","edgesep","nodesep","pick","dagreGraphOptions","_objectWithoutProperties","_excluded","dagre","Graph","setDefaultEdgeLabel","previousNode","getNode","setNode","setEdge","applyLayout","renderedNodes","push","console","error","renderedEdges","_edge$labelSize","labelpos","getDagreGraph","forceLayoutOptions","dummyNodesOnEdges","collide","dummyRadius","radiusDiff","strength","iterations","renderedNode","userViewNode","fx","fy","forceNodes","forceLinks","linkSimulation","forceLink","distance","l","simulation","forceSimulation","force","forceX","forceY","forceManyBody","forceCollide","radius","sqrt","stop","tick","ceil","log","alphaMin","alphaDecay","manuallyTickToTheEnd","getForceGraph","movedNode","x0","y0","_movedNode$x","_movedNode$y","move","getManualGraph","USER_VIEW_MODEL_ID","useUserView","query","setUserViewReady","userViewIdRef","useRef","setUserViewNodesMap","queue","createAsyncQueue","working","waitingTasks","_queue","_asyncToGenerator","task","nextTask","shift","_x","apply","arguments","_getUserView","namespace","list","InstanceApi_postSearchV3","fields","$eq","page","page_size","_userView$nodes","userView","current","instanceId","handleHttpError","getUserView","saveUserView","userViewData","InstanceApi_updateInstanceV2","interceptorParams","ignoreLoadingBar","InstanceApi_createInstance","adjustLineLabels","position","angle","size","_size","tempDirection","floor","PI","direction","tangent","tan","offsetAngle","offsetSin","sin","offsetCos","cos","transform","getLineMaskRects","offsetLeft","offsetTop","getRenderedLineLabels","renderedLines","flatMap","path","getAttribute","getBBox","pathLength","getTotalLength","_item$placement","point","getPointAtLength","min","curveLine","points","curveType","startOffset","endOffset","curveFactory","curveLinear","curveBumpX","curveBumpY","curveMonotoneX","curveMonotoneY","curveNatural","curveBasis","startOffsets","getOffsets","endOffsets","curve","lineFunction","start","end","offset","x1","y1","ratio","pow","getCoordinates","getRenderedLines","normalizedLines","renderedEdgeMap","WeakMap","renderedNodeMap","relatedNodes","renderedEdge","prepared","_markers$find$offset","_markers$find","_markers$find$offset2","_markers$find2","rest","startMarkerOffset","endMarkerOffset","doTwoNodesOverlap","_relatedNodes$get","_relatedNodes$get2","prepareRelatedNodes","addRelatedNodes","to","relates","Set","toNode","add","sourceDirection","getDirection","targetDirection","sourceRelates","getOrderedRelates","targetRelates","sourcePosition","targetPosition","c1","c2","p0","p1","getPolyLinePoints","getDirectLinePoints","atan2","filter","Boolean","sourceAngle","sx","sy","tx","ty","fixedAngle","sort","a","b","ax","ay","bx","by","handleKeyboard","event","activeTarget","activeNode","nodeId","activeEdge","action","_node","keyCode","which","moveOnAxis","axis","diff","oppositeAxis","candidates","abs","minBy","handleNodesMouseDown","connectNodes","dragNodes","scale","setConnectLineState","setConnectLineTo","setManualLayoutStatus","setNodeMovement","onSwitchActiveTarget","onNodesConnect","findNode","match","_ret","_loop","contains","sourceType","nodeMatched","clientX","clientY","__secret_internals","legacyDoTransform","onMouseMove","onMouseUp","document","removeEventListener","eventTargets","composedPath","addEventListener","moved","movement","normalizeLinesAndMarkers","lines","_lines$find","_line$markers","edgeType","matchEdgeByFilter","restLineConf","computedLineConf","draw","uniqueId","normalizedMarkers","lineMarkers","_line$overrides$activ","_line$overrides$activ2","_placement","_type","offsetUnit","addMarker","activeMarkerIndex","activeRelatedMarkerIndex","markerIndex","findIndex","sameTarget","transformToCenter","canvasWidth","canvasHeight","scaleRange","Infinity","right","bottom","hw","hh","r","t","k","___CSS_LOADER_EXPORT___","module","toString"],"sourceRoot":""}