@flowgram.ai/renderer 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/entities/flow-drag-entity.tsx","../src/components/utils.tsx","../src/hooks/use-base-color.ts","../src/entities/flow-select-config-entity.tsx","../src/utils/find-selected-nodes.ts","../src/entities/selector-box-config-entity.ts","../src/layers/flow-nodes-transform-layer.tsx","../src/flow-renderer-resize-observer.ts","../src/utils/element.ts","../src/layers/flow-nodes-content-layer.tsx","../src/flow-renderer-registry.ts","../src/flow-renderer-contribution.ts","../src/layers/flow-lines-layer.tsx","../src/components/LinesRenderer.tsx","../src/components/StraightLine.tsx","../src/components/RoundedTurningLine.tsx","../src/components/MarkerArrow.tsx","../src/components/MarkerActivatedArrow.tsx","../src/components/CustomLine.tsx","../src/layers/flow-labels-layer.tsx","../src/components/LabelsRenderer.tsx","../src/components/CollapseAdder.tsx","../src/components/Collapse.tsx","../src/components/Adder.tsx","../src/components/BranchDraggableRenderer.tsx","../src/layers/flow-debug-layer.tsx","../src/utils/scroll-limit.ts","../src/utils/scroll-bar-events.tsx","../src/layers/flow-scroll-bar-layer.tsx","../src/layers/flow-drag-layer.tsx","../src/layers/flow-selector-box-layer.tsx","../src/layers/flow-selector-bounds-layer.tsx","../src/layers/flow-context-menu-layer.tsx","../src/layers/flow-scroll-limit-layer.tsx","../src/flow-renderer-container-module.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport * from './entities';\nexport * from './layers';\nexport * from './flow-renderer-contribution';\nexport * from './flow-renderer-registry';\nexport * from './flow-renderer-container-module';\n\nexport { ScrollBarEvents } from './utils';\nexport { MARK_ARROW_ID } from './components/MarkerArrow';\nexport { MARK_ACTIVATED_ARROW_ID } from './components/MarkerActivatedArrow';\nexport { useBaseColor } from './hooks/use-base-color';\nexport { createLines } from './components/LinesRenderer';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Rectangle } from '@flowgram.ai/utils';\nimport {\n type FlowNodeTransitionData,\n FlowTransitionLabelEnum,\n LABEL_SIDE_TYPE,\n} from '@flowgram.ai/document';\nimport { ConfigEntity, type EntityOpts, PlaygroundConfigEntity } from '@flowgram.ai/core';\n\nimport { DEFAULT_LABEL_ACTIVATE_HEIGHT } from '../components/utils';\n\nconst BRANCH_HOVER_HEIGHT = 64;\n\ninterface FlowDragEntityConfig extends EntityOpts {}\n\nenum ScrollDirection {\n TOP,\n BOTTOM,\n LEFT,\n RIGHT,\n}\n\nconst SCROLL_DELTA = 4;\n\nconst SCROLL_INTERVAL = 20;\n\nconst SCROLL_BOUNDING = 20;\n\nconst EDITOR_LEFT_BAR_WIDTH = 60;\n\nexport interface CollisionRetType {\n hasCollision: boolean;\n labelOffsetType?: LABEL_SIDE_TYPE;\n}\n\nexport class FlowDragEntity extends ConfigEntity<FlowDragEntityConfig> {\n private playgroundConfigEntity: PlaygroundConfigEntity;\n\n static type = 'FlowDragEntity';\n\n private containerX = 0;\n\n private containerY = 0;\n\n private _scrollXInterval: { interval: number; origin: number } | undefined;\n\n private _scrollYInterval: { interval: number; origin: number } | undefined;\n\n get hasScroll(): boolean {\n return Boolean(this._scrollXInterval || this._scrollYInterval);\n }\n\n constructor(conf: any) {\n super(conf);\n this.playgroundConfigEntity = this.entityManager.getEntity<PlaygroundConfigEntity>(\n PlaygroundConfigEntity,\n true\n )!;\n }\n\n isCollision(\n transition: FlowNodeTransitionData,\n rect: Rectangle,\n isBranch: boolean\n ): CollisionRetType {\n const scale = this.playgroundConfigEntity.finalScale || 0;\n if (isBranch) {\n return this.isBranchCollision(transition, rect, scale);\n }\n return this.isNodeCollision(transition, rect, scale);\n }\n\n // 检测节点维度碰撞方法\n isNodeCollision(\n transition: FlowNodeTransitionData,\n rect: Rectangle,\n scale: number\n ): CollisionRetType {\n const { labels } = transition;\n const { isVertical } = transition.entity;\n\n const hasCollision = labels.some((label) => {\n if (\n !label ||\n ![\n FlowTransitionLabelEnum.ADDER_LABEL,\n FlowTransitionLabelEnum.COLLAPSE_ADDER_LABEL,\n ].includes(label.type)\n ) {\n return false;\n }\n\n const hoverWidth = isVertical\n ? transition.transform.bounds.width\n : DEFAULT_LABEL_ACTIVATE_HEIGHT;\n const hoverHeight = isVertical\n ? DEFAULT_LABEL_ACTIVATE_HEIGHT\n : transition.transform.bounds.height;\n\n const labelRect = new Rectangle(\n (label.offset.x - hoverWidth / 2) * scale,\n (label.offset.y - hoverHeight / 2) * scale,\n hoverWidth * scale,\n hoverHeight * scale\n );\n // 检测两个正方形是否相互碰撞\n return Rectangle.intersects(labelRect, rect);\n });\n\n return {\n hasCollision,\n // 节点不关心 offsetType\n labelOffsetType: undefined,\n };\n }\n\n // 检测分支维度碰撞\n isBranchCollision(\n transition: FlowNodeTransitionData,\n rect: Rectangle,\n scale: number\n ): CollisionRetType {\n const { labels } = transition;\n const { isVertical } = transition.entity;\n\n let labelOffsetType: LABEL_SIDE_TYPE = LABEL_SIDE_TYPE.NORMAL_BRANCH;\n const hasCollision = labels.some((label) => {\n if (!label || label.type !== FlowTransitionLabelEnum.BRANCH_DRAGGING_LABEL) {\n return false;\n }\n const hoverHeight = isVertical ? BRANCH_HOVER_HEIGHT : label.width || 0;\n // BRANCH_DRAGGING_LABEL 类型的 label 一定存在 width 属性\n const hoverWidth = isVertical ? label.width || 0 : BRANCH_HOVER_HEIGHT;\n\n const labelRect = new Rectangle(\n (label.offset.x - hoverWidth / 2) * scale,\n (label.offset.y - hoverHeight / 2) * scale,\n hoverWidth * scale,\n hoverHeight * scale\n );\n // 检测两个正方形是否相互碰撞\n const collision = Rectangle.intersects(labelRect, rect);\n if (collision) {\n labelOffsetType = label.props!.side;\n }\n return collision;\n });\n\n return {\n hasCollision,\n labelOffsetType,\n };\n }\n\n private _startScrollX(origin: number, added: boolean): void {\n if (this._scrollXInterval) {\n return;\n }\n const interval = window.setInterval(() => {\n const current = this._scrollXInterval;\n if (!current) return;\n // eslint-disable-next-line no-multi-assign\n const scrollX = (current.origin = added\n ? current.origin + SCROLL_DELTA\n : current.origin - SCROLL_DELTA);\n this.playgroundConfigEntity.updateConfig({\n scrollX,\n });\n const playgroundConfig = this.playgroundConfigEntity.config;\n if (playgroundConfig?.scrollX === scrollX) {\n if (added) {\n this.containerX += SCROLL_DELTA;\n } else {\n this.containerX -= SCROLL_DELTA;\n }\n }\n }, SCROLL_INTERVAL);\n this._scrollXInterval = { interval, origin };\n }\n\n private _stopScrollX(): void {\n if (this._scrollXInterval) {\n clearInterval(this._scrollXInterval.interval);\n this._scrollXInterval = undefined;\n }\n }\n\n private _startScrollY(origin: number, added: boolean): void {\n if (this._scrollYInterval) {\n return;\n }\n const interval = window.setInterval(() => {\n const current = this._scrollYInterval;\n if (!current) return;\n // eslint-disable-next-line no-multi-assign\n const scrollY = (current.origin = added\n ? current.origin + SCROLL_DELTA\n : current.origin - SCROLL_DELTA);\n this.playgroundConfigEntity.updateConfig({\n scrollY,\n });\n const playgroundConfig = this.playgroundConfigEntity.config;\n if (playgroundConfig?.scrollY === scrollY) {\n if (added) {\n this.containerY += SCROLL_DELTA;\n } else {\n this.containerY -= SCROLL_DELTA;\n }\n }\n }, SCROLL_INTERVAL);\n this._scrollYInterval = { interval, origin };\n }\n\n private _stopScrollY(): void {\n if (this._scrollYInterval) {\n clearInterval(this._scrollYInterval.interval);\n this._scrollYInterval = undefined;\n }\n }\n\n stopAllScroll(): void {\n this._stopScrollX();\n this._stopScrollY();\n }\n\n scrollDirection(e: MouseEvent, x: number, y: number): ScrollDirection | undefined {\n const playgroundConfig = this.playgroundConfigEntity.config;\n const currentScrollX = playgroundConfig.scrollX;\n const currentScrollY = playgroundConfig.scrollY;\n this.containerX = x;\n this.containerY = y;\n const clientRect = this.playgroundConfigEntity.playgroundDomNode.getBoundingClientRect();\n\n const mouseToBottom = playgroundConfig.height + clientRect.y - e.clientY;\n if (mouseToBottom < SCROLL_BOUNDING) {\n this._startScrollY(currentScrollY, true);\n return ScrollDirection.BOTTOM;\n }\n const mouseToTop = e.clientY - clientRect.y;\n if (mouseToTop < SCROLL_BOUNDING) {\n this._startScrollY(currentScrollY, false);\n return ScrollDirection.TOP;\n }\n this._stopScrollY();\n const mouseToRight = playgroundConfig.width + clientRect.x - e.clientX;\n if (mouseToRight < SCROLL_BOUNDING) {\n this._startScrollX(currentScrollX, true);\n return ScrollDirection.RIGHT;\n }\n const mouseToLeft = e.clientX - clientRect.x;\n if (mouseToLeft < SCROLL_BOUNDING + EDITOR_LEFT_BAR_WIDTH) {\n this._startScrollX(currentScrollX, false);\n return ScrollDirection.LEFT;\n }\n this._stopScrollX();\n\n return undefined;\n }\n\n dispose(): void {\n this.toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport type React from 'react';\n\nimport {\n FlowNodeTransformData,\n type FlowNodeTransitionData,\n type FlowTransitionLine,\n FlowTransitionLineEnum,\n type Vertex,\n DefaultSpacingKey,\n DEFAULT_SPACING,\n} from '@flowgram.ai/document';\n\nimport { BASE_DEFAULT_COLOR } from '../hooks/use-base-color';\n\nexport const DEFAULT_LINE_ATTRS: React.SVGProps<SVGPathElement> = {\n stroke: BASE_DEFAULT_COLOR,\n fill: 'transparent',\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n\n// 默认的圆角半径\nexport const DEFAULT_RADIUS = 16;\n\n// 小圆角\nexport const MINI_RADIUS = 10;\n\n// 默认 label 激活高度\nexport const DEFAULT_LABEL_ACTIVATE_HEIGHT = 32;\n\n/**\n * 根据椭圆方程计算 y 坐标\n *\n * x^2 / rx^2 + y^2 / ry^2 = 1\n */\nexport const calcEllipseY = (x: number, rx: number, ry: number) =>\n Math.sqrt(ry ** 2 * (1 - x ** 2 / rx ** 2));\n\n/**\n * 获取转弯线的转折点 (水平布局)\n */\nexport function getHorizontalVertices(\n line: FlowTransitionLine,\n xRadius = 16,\n yRadius = 20\n): Vertex[] {\n const { from, to, type } = line || {};\n\n // 空间可以容纳的圆角数\n const deltaY = Math.abs(to.y - from.y);\n const deltaX = Math.abs(to.x - from.x);\n\n const radiusXCount = deltaX / xRadius;\n const radiusYCount = deltaY / yRadius;\n\n let res: Vertex[] = [];\n\n // 容纳不下一个圆角,直接连线\n if (radiusXCount < 1) {\n return [];\n }\n\n switch (type) {\n case FlowTransitionLineEnum.DIVERGE_LINE:\n case FlowTransitionLineEnum.DRAGGING_LINE:\n if (radiusXCount <= 1) {\n return [\n {\n x: to.x,\n y: from.y,\n radiusX: deltaX,\n },\n ];\n }\n res = [\n {\n x: from.x + yRadius,\n y: from.y,\n },\n {\n x: from.x + yRadius,\n y: to.y,\n },\n ];\n if (radiusXCount < 2) {\n const firstRadius = deltaX - yRadius;\n res = [\n {\n x: from.x + firstRadius,\n y: from.y,\n // 第一个圆角收缩 y 半径\n radiusX: firstRadius,\n },\n {\n x: from.x + firstRadius,\n y: to.y,\n },\n ];\n }\n\n // y 轴空间不足处理\n if (radiusYCount < 2) {\n res[0].moveY = deltaY / 2;\n res[1].moveY = deltaY / 2;\n }\n\n return res;\n\n case FlowTransitionLineEnum.MERGE_LINE:\n // 聚合线 y 轴空间不足时直接连上\n if (radiusXCount < 2) {\n return [\n {\n x: to.x,\n y: from.y,\n },\n ];\n }\n\n res = [\n {\n x: to.x - yRadius,\n y: from.y,\n },\n {\n x: to.x - yRadius,\n y: to.y,\n },\n ];\n\n // y 轴空间不足处理\n if (radiusYCount < 2) {\n res[0].moveY = deltaY / 2;\n res[1].moveY = deltaY / 2;\n }\n\n return res;\n\n default:\n break;\n }\n\n return [];\n}\n/**\n * 获取转弯线的转折点 (垂直布局)\n */\nexport function getVertices(line: FlowTransitionLine, xRadius = 16, yRadius = 20): Vertex[] {\n const { from, to, type } = line || {};\n\n // 空间可以容纳的圆角数\n const deltaY = Math.abs(to.y - from.y);\n const deltaX = Math.abs(to.x - from.x);\n\n const radiusYCount = deltaY / yRadius;\n const radiusXCount = deltaX / xRadius;\n\n let res: Vertex[] = [];\n\n // 容纳不下一个圆角,直接连线\n if (radiusYCount < 1) {\n return [];\n }\n\n switch (type) {\n case FlowTransitionLineEnum.DIVERGE_LINE:\n case FlowTransitionLineEnum.DRAGGING_LINE:\n if (radiusYCount <= 1) {\n return [\n {\n x: to.x,\n y: from.y,\n radiusY: deltaY,\n },\n ];\n }\n res = [\n {\n x: from.x,\n y: from.y + yRadius,\n },\n {\n x: to.x,\n y: from.y + yRadius,\n },\n ];\n if (radiusYCount < 2) {\n const firstRadius = deltaY - yRadius;\n res = [\n {\n x: from.x,\n y: from.y + firstRadius,\n // 第一个圆角收缩 y 半径\n radiusY: firstRadius,\n },\n {\n x: to.x,\n y: from.y + firstRadius,\n },\n ];\n }\n\n // x 轴空间不足处理\n if (radiusXCount < 2) {\n res[0].moveX = deltaX / 2;\n res[1].moveX = deltaX / 2;\n }\n\n return res;\n\n case FlowTransitionLineEnum.MERGE_LINE:\n // 聚合线 y 轴空间不足时直接连上\n if (radiusYCount < 2) {\n return [\n {\n x: from.x,\n y: to.y,\n },\n ];\n }\n\n res = [\n {\n x: from.x,\n y: to.y - yRadius,\n },\n {\n x: to.x,\n y: to.y - yRadius,\n },\n ];\n\n // x 轴空间不足处理\n if (radiusXCount < 2) {\n res[0].moveX = deltaX / 2;\n res[1].moveX = deltaX / 2;\n }\n\n return res;\n\n default:\n break;\n }\n\n return [];\n}\n\n// 获取上一个节点和下一个节点中较宽的宽度作为 hover 热区\nexport function getTransitionLabelHoverWidth(data: FlowNodeTransitionData) {\n const { isVertical } = data.entity;\n if (isVertical) {\n const nextWidth =\n data.entity.next?.firstChild && !data.entity.next.isInlineBlocks\n ? data.entity.next.firstChild!.getData(FlowNodeTransformData)!.size.width\n : data.entity.next?.getData(FlowNodeTransformData)!.size.width;\n\n // 获取上一个节点和下一个节点中较宽的宽度作为 hover 热区\n const maxWidth = Math.max(\n data.entity.getData(FlowNodeTransformData)?.size.width ??\n DEFAULT_SPACING[DefaultSpacingKey.HOVER_AREA_WIDTH],\n nextWidth || 0\n );\n\n return maxWidth;\n }\n if (data.transform.next) {\n return data.transform.next.inputPoint.x - data.transform.outputPoint.x;\n }\n return DEFAULT_LABEL_ACTIVATE_HEIGHT;\n}\n\nexport function getTransitionLabelHoverHeight(data: FlowNodeTransitionData) {\n const { isVertical } = data.entity;\n if (isVertical) {\n if (data.transform.next) {\n return data.transform.next.inputPoint.y - data.transform.outputPoint.y;\n }\n return DEFAULT_LABEL_ACTIVATE_HEIGHT;\n }\n const nextHeight =\n data.entity.next?.firstChild && !data.entity.next.isInlineBlocks\n ? data.entity.next.firstChild!.getData(FlowNodeTransformData)!.size.height\n : data.entity.next?.getData(FlowNodeTransformData)!.size.height;\n\n // 获取上一个节点和下一个节点中较宽的宽度作为 hover 热区\n const maxHeight = Math.max(\n data.entity.getData(FlowNodeTransformData)?.size.height || 280,\n nextHeight || 0\n );\n\n return maxHeight;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ConstantKeys, FlowDocumentOptions } from '@flowgram.ai/document';\nimport { useService } from '@flowgram.ai/core';\n\nexport const BASE_DEFAULT_COLOR = '#BBBFC4';\nexport const BASE_DEFAULT_ACTIVATED_COLOR = '#82A7FC';\n\nexport function useBaseColor(): { baseColor: string; baseActivatedColor: string } {\n const options = useService<FlowDocumentOptions>(FlowDocumentOptions);\n return {\n baseColor: options.constants?.[ConstantKeys.BASE_COLOR] || BASE_DEFAULT_COLOR,\n baseActivatedColor:\n options.constants?.[ConstantKeys.BASE_ACTIVATED_COLOR] || BASE_DEFAULT_ACTIVATED_COLOR,\n };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\n type FlowNodeEntity,\n FlowNodeRenderData,\n FlowNodeTransformData,\n} from '@flowgram.ai/document';\nimport { ConfigEntity } from '@flowgram.ai/core';\nimport { Compare, Rectangle } from '@flowgram.ai/utils';\n\nimport { findSelectedNodes } from '../utils/find-selected-nodes';\n\ninterface FlowSelectConfigEntityData {\n selectedNodes: FlowNodeEntity[];\n}\n\nconst BOUNDS_PADDING_DEFAULT = 10;\n\n/**\n * 圈选节点相关数据存储\n */\nexport class FlowSelectConfigEntity extends ConfigEntity<FlowSelectConfigEntityData> {\n static type = 'FlowSelectConfigEntity';\n\n boundsPadding = BOUNDS_PADDING_DEFAULT;\n\n getDefaultConfig(): FlowSelectConfigEntityData {\n return {\n selectedNodes: [],\n };\n }\n\n get selectedNodes(): FlowNodeEntity[] {\n return this.config.selectedNodes;\n }\n\n /**\n * 选中节点\n * @param nodes\n */\n set selectedNodes(nodes: FlowNodeEntity[]) {\n nodes = findSelectedNodes(nodes);\n // if (nodes.length === 1 && nodes[0].flowNodeType === FlowNodeBaseType.END) {\n // nodes = [];\n // }\n if (\n nodes.length !== this.config.selectedNodes.length ||\n nodes.some(n => !this.config.selectedNodes.includes(n))\n ) {\n this.config.selectedNodes.forEach(oldNode => {\n if (!nodes.includes(oldNode)) {\n oldNode.getData(FlowNodeRenderData)!.activated = false;\n }\n });\n // 高亮选中的节点\n nodes.forEach(node => {\n node.getData(FlowNodeRenderData)!.activated = true;\n });\n if (Compare.isArrayShallowChanged(this.config.selectedNodes, nodes)) {\n this.updateConfig({\n selectedNodes: nodes,\n });\n }\n }\n }\n\n /**\n * 清除选中节点\n */\n clearSelectedNodes() {\n if (this.config.selectedNodes.length === 0) return;\n this.config.selectedNodes.forEach(node => {\n node.getData(FlowNodeRenderData)!.activated = false;\n });\n this.updateConfig({\n selectedNodes: [],\n });\n }\n\n /**\n * 通过选择框选中节点\n * @param rect\n * @param transforms\n */\n selectFromBounds(rect: Rectangle, transforms: FlowNodeTransformData[]): void {\n const selectedNodes: FlowNodeEntity[] = [];\n transforms.forEach(transform => {\n if (Rectangle.intersects(rect, transform.bounds)) {\n if (transform.entity.originParent) {\n selectedNodes.push(transform.entity.originParent);\n } else {\n selectedNodes.push(transform.entity);\n }\n }\n });\n this.selectedNodes = selectedNodes;\n }\n\n /**\n * 获取选中节点外围的最大边框\n */\n getSelectedBounds(): Rectangle {\n const nodes = this.selectedNodes;\n if (nodes.length === 0) {\n return Rectangle.EMPTY;\n }\n return Rectangle.enlarge(nodes.map(n => n.getData(FlowNodeTransformData)!.bounds)).pad(\n this.boundsPadding,\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { uniq } from 'lodash-es';\nimport { type FlowNodeEntity } from '@flowgram.ai/document';\n\nfunction getNodePath(node: FlowNodeEntity): FlowNodeEntity[] {\n const path: FlowNodeEntity[] = [node];\n node = node.parent as FlowNodeEntity;\n while (node) {\n path.push(node);\n node = node.parent as FlowNodeEntity;\n }\n return path.reverse();\n}\n\n/**\n * 过滤掉画布节点, 有 originParent,都是非独立节点\n * @param entity\n */\nfunction findRealEntity(entity: FlowNodeEntity): FlowNodeEntity {\n while (entity.originParent) {\n entity = entity.originParent;\n }\n return entity;\n}\n/**\n * 生成选中节点的路径\n * 如\n * [\n * 'root',\n * 'exclusiveSplit_30baf8b1da0',\n * 'exclusiveSplit_d0070ce5d04',\n * 'createRecord_47e8fe1dfc3'\n * ],\n * [\n * 'root',\n * 'exclusiveSplit_30baf8b1da0',\n * 'exclusiveSplit_d0070ce5d04',\n * 'createRecord_32dcdd10274'\n * ],\n * [\n * 'root',\n * 'exclusiveSplit_30baf8b1da0',\n * 'exclusiveSplit_d0070ce5d04',\n * 'exclusiveSplit_a5579b3997d', // 这里产生分叉\n * 'createRecord_b57b00eee94' // 父亲节点分叉了,这里就忽略了\n * ]\n * ]\n * 1. 相同分支的节点,选择每个节点\n * 2. 跨分支的节点选择共同的父节点\n */\nexport function findSelectedNodes(nodes: FlowNodeEntity[]): FlowNodeEntity[] {\n if (nodes.length === 0) return [];\n /**\n * 生成节点的路径\n */\n const nodePathList: FlowNodeEntity[][] = nodes.map((n) => getNodePath(n));\n /**\n * 只需要比较最小的路径\n */\n const minLength = Math.min(...nodePathList.map((n) => n.length));\n let index = 0;\n let selectedItems: FlowNodeEntity[] = [];\n /**\n * 从二维数组的每一层打平去看,看看有没有分叉,如果有分叉就在当前层停止并作为选中的节点\n */\n while (index < minLength) {\n // eslint-disable-next-line no-loop-func\n selectedItems = uniq(nodePathList.map((p) => p[index]));\n // 存在分叉\n if (selectedItems.length > 1) {\n break;\n }\n index += 1;\n }\n return uniq(selectedItems.map((item) => findRealEntity(item)));\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\n PositionSchema,\n SizeSchema,\n ConfigEntity,\n PlaygroundDragEvent,\n} from '@flowgram.ai/core';\nimport { Rectangle } from '@flowgram.ai/utils';\n\nexport interface SelectorBoxConfigData extends PlaygroundDragEvent {\n disabled?: boolean; // 是否禁用选择框\n}\n\n/**\n * 选择框配置\n */\nexport class SelectorBoxConfigEntity extends ConfigEntity<SelectorBoxConfigData> {\n static type = 'SelectorBoxConfigEntity';\n\n get dragInfo(): PlaygroundDragEvent {\n return this.config;\n }\n\n setDragInfo(info: PlaygroundDragEvent): void {\n this.updateConfig(info);\n }\n\n get disabled(): boolean {\n return this.config && !!this.config.disabled;\n }\n\n set disabled(disabled: boolean) {\n this.updateConfig({\n disabled,\n });\n }\n\n get isStart(): boolean {\n return this.dragInfo.isStart;\n }\n\n get isMoving(): boolean {\n return this.dragInfo.isMoving;\n }\n\n get position(): PositionSchema {\n const { dragInfo } = this;\n return {\n x: dragInfo.startPos.x < dragInfo.endPos.x ? dragInfo.startPos.x : dragInfo.endPos.x,\n y: dragInfo.startPos.y < dragInfo.endPos.y ? dragInfo.startPos.y : dragInfo.endPos.y,\n };\n }\n\n get size(): SizeSchema {\n const { dragInfo } = this;\n return {\n width: Math.abs(dragInfo.startPos.x - dragInfo.endPos.x),\n height: Math.abs(dragInfo.startPos.y - dragInfo.endPos.y),\n };\n }\n\n get collapsed(): boolean {\n const { size } = this;\n return size.width === 0 && size.height === 0;\n }\n\n collapse(): void {\n this.setDragInfo({\n ...this.dragInfo,\n isMoving: false,\n isStart: false,\n });\n }\n\n toRectangle(scale: number): Rectangle {\n const { position, size } = this;\n return new Rectangle(\n position.x / scale,\n position.y / scale,\n size.width / scale,\n size.height / scale,\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { Cache, type Disposable, domUtils } from '@flowgram.ai/utils';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowNodeEntity,\n FlowNodeTransformData,\n} from '@flowgram.ai/document';\nimport { Layer, observeEntity, observeEntityDatas } from '@flowgram.ai/core';\n// import { throttle } from 'lodash-es'\n\nimport { FlowRendererResizeObserver } from '../flow-renderer-resize-observer';\n\ninterface TransformRenderCache {\n updateBounds(): void;\n}\n\nexport interface FlowNodesTransformLayerOptions {\n renderElement?: HTMLElement | (() => HTMLElement | undefined);\n}\n\n/**\n * 渲染节点位置\n */\n@injectable()\nexport class FlowNodesTransformLayer extends Layer<FlowNodesTransformLayerOptions> {\n @inject(FlowDocument) readonly document: FlowDocument;\n\n @inject(FlowRendererResizeObserver)\n readonly resizeObserver: FlowRendererResizeObserver;\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransformData)\n _transforms: FlowNodeTransformData[];\n\n node = domUtils.createDivWithClass('gedit-flow-nodes-layer');\n\n get transformVisibles(): FlowNodeTransformData[] {\n return this.document.getRenderDatas<FlowNodeTransformData>(FlowNodeTransformData, false);\n }\n\n /**\n * 监听缩放,目前采用整体缩放\n * @param scale\n */\n onZoom(scale: number) {\n this.node!.style.transform = `scale(${scale})`;\n }\n\n dispose(): void {\n this.renderCache.dispose();\n super.dispose();\n }\n\n // onViewportChange() {\n // this.throttleUpdate()\n // }\n\n // throttleUpdate = throttle(() => {\n // this.renderCache.getFromCache().forEach((cache) => cache.updateBounds())\n // }, 100)\n\n protected renderCache = Cache.create<TransformRenderCache, FlowNodeTransformData>(\n (transform?: FlowNodeTransformData) => {\n const { renderState } = transform!;\n const { node } = renderState;\n const { entity } = transform!;\n node.id = entity.id;\n let resizeDispose: Disposable | undefined;\n const append = () => {\n if (resizeDispose) return;\n // 监听 dom 节点的大小变化\n this.renderElement.appendChild(node);\n if (!entity.getNodeMeta().autoResizeDisable) {\n resizeDispose = this.resizeObserver.observe(node, transform!);\n }\n };\n const dispose = () => {\n if (!resizeDispose) return;\n // 脱离文档流,但是 react 组件会保留\n if (node.parentElement) {\n this.renderElement.removeChild(node);\n }\n resizeDispose.dispose();\n resizeDispose = undefined;\n };\n append();\n return {\n dispose,\n updateBounds: () => {\n const { bounds } = transform!;\n // 保留2位小数\n const rawX: number = parseFloat(node.style.left);\n const rawY: number = parseFloat(node.style.top);\n if (!this.isCoordEqual(rawX, bounds.x) || !this.isCoordEqual(rawY, bounds.y)) {\n node.style.left = `${bounds.x}px`;\n node.style.top = `${bounds.y}px`;\n }\n },\n };\n }\n );\n\n private isCoordEqual(a: number, b: number) {\n const browserCoordEpsilon = 0.05; // 浏览器处理坐标的精度误差: 两位小数四舍五入\n return Math.abs(a - b) < browserCoordEpsilon;\n }\n\n onReady() {\n this.node!.style.zIndex = '10';\n }\n\n get visibeBounds() {\n return this.transformVisibles.map((transform) => transform.bounds);\n }\n\n /**\n * 更新节点的 bounds 数据\n */\n updateNodesBounds() {\n this.renderCache\n .getMoreByItems(this.transformVisibles)\n .forEach((render) => render.updateBounds());\n }\n\n autorun() {\n // 更新节点偏移数据 O(n) TODO 这个更新会从 render 里移除改成自动触发\n if (this.documentTransformer.loading) return;\n this.documentTransformer.refresh();\n this.updateNodesBounds();\n }\n\n private get renderElement(): HTMLElement {\n if (typeof this.options.renderElement === 'function') {\n const element = this.options.renderElement();\n if (element) {\n return element;\n }\n } else if (typeof this.options.renderElement !== 'undefined') {\n return this.options.renderElement as HTMLElement;\n }\n return this.node;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\nimport { type FlowNodeTransformData } from '@flowgram.ai/document';\nimport { Disposable } from '@flowgram.ai/utils';\n\nimport { isHidden, isRectInit } from './utils/element';\n\n/**\n * 监听 dom 元素的 size 变化,用于画布节点的大小变化重新计算\n */\n@injectable()\nexport class FlowRendererResizeObserver {\n /**\n * 监听元素 size,并同步到 transform\n * @param el\n * @param transform\n */\n observe(el: HTMLElement, transform: FlowNodeTransformData): Disposable {\n const observer = new ResizeObserver(entries => {\n /**\n * NOTICE: 不加 window.requestAnimationFrame\n * 会导致 \"ResizeObserver loop completed with undelivered notifications.\" 报错\n * 这个报错在 chrome 和 firefox 是默认被忽略的,但本地调试会被编译工具弹窗打断\n */\n window.requestAnimationFrame(() => {\n if (!Array.isArray(entries) || !entries.length) {\n return;\n }\n const entry = entries[0];\n const { contentRect, target } = entry;\n // 元素宽高未计算时,不更新节点 size\n const isContentRectInit = isRectInit(contentRect);\n // 目标节点脱离 DOM 树,忽略本次变更\n const isLeaveDOMTree = !target.parentNode;\n // IDE 环境下画布元素可能 display none,这时候会监听到元素宽高 0 导致闪屏\n // 此情况下不作 resize 重渲染\n const isHiddenElement = isHidden(target.parentNode as HTMLElement);\n if (isContentRectInit && !isLeaveDOMTree && !isHiddenElement) {\n // 更新节点 size 数据\n transform.size = {\n width: Math.round(contentRect.width * 10) / 10,\n height: Math.round(contentRect.height * 10) / 10,\n };\n }\n });\n });\n observer.observe(el);\n return Disposable.create(() => {\n observer.unobserve(el);\n });\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { isNil } from 'lodash-es';\nexport const isHidden = (dom?: HTMLElement) => {\n if (!dom || isNil(dom?.offsetParent)) {\n return true;\n }\n const style = window.getComputedStyle(dom);\n if (style?.display === 'none') {\n return true;\n }\n return false;\n};\n\nexport const isRectInit = (rect?: DOMRect): boolean => {\n if (!rect) {\n return false;\n }\n // 检查所有属性是否都为0,表示DOMRect未初始化\n if (\n rect.bottom === 0 &&\n rect.height === 0 &&\n rect.left === 0 &&\n rect.right === 0 &&\n rect.top === 0 &&\n rect.width === 0 &&\n rect.x === 0 &&\n rect.y === 0\n ) {\n return false;\n }\n return true;\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport ReactDOM from 'react-dom';\nimport React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { Cache, type CacheOriginItem, domUtils } from '@flowgram.ai/utils';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowNodeEntity,\n FlowNodeRenderData,\n FlowNodeTransformData,\n} from '@flowgram.ai/document';\nimport {\n Layer,\n observeEntity,\n observeEntityDatas,\n PlaygroundEntityContext,\n} from '@flowgram.ai/core';\n\nimport { FlowRendererKey, FlowRendererRegistry } from '../flow-renderer-registry';\n\ninterface NodePortal extends CacheOriginItem {\n id: string;\n Portal: () => JSX.Element;\n}\n\n/**\n * 渲染节点内容\n */\n@injectable()\nexport class FlowNodesContentLayer extends Layer {\n @inject(FlowDocument) readonly document: FlowDocument;\n\n @inject(FlowRendererRegistry) readonly rendererRegistry: FlowRendererRegistry;\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeRenderData)\n _renderStates: FlowNodeRenderData[];\n\n get renderStatesVisible(): FlowNodeRenderData[] {\n return this.document.getRenderDatas<FlowNodeRenderData>(FlowNodeRenderData, false);\n }\n\n private renderMemoCache = new WeakMap<any, any>();\n\n node = domUtils.createDivWithClass('gedit-flow-nodes-layer');\n\n getPortalRenderer(data: FlowNodeRenderData): (props: any) => JSX.Element {\n const meta = data.entity.getNodeMeta();\n const renderer = this.rendererRegistry.getRendererComponent(\n (meta.renderKey as FlowRendererKey) || FlowRendererKey.NODE_RENDER\n );\n const reactRenderer = renderer.renderer as any;\n let memoCache = this.renderMemoCache.get(reactRenderer);\n if (!memoCache) {\n memoCache = React.memo(reactRenderer);\n this.renderMemoCache.set(reactRenderer, memoCache);\n }\n return memoCache;\n }\n\n /**\n * 监听缩放,目前采用整体缩放\n * @param scale\n */\n onZoom(scale: number) {\n this.node!.style.transform = `scale(${scale})`;\n }\n\n dispose(): void {\n this.reactPortals.dispose();\n super.dispose();\n }\n\n protected reactPortals = Cache.create<NodePortal, FlowNodeRenderData>(\n (data?: FlowNodeRenderData) => {\n const { node, entity } = data!;\n const { config } = this;\n const PortalRenderer = this.getPortalRenderer(data!);\n\n function Portal(): JSX.Element {\n React.useEffect(() => {\n // 第一次加载需要把宽高通知\n if (!entity.getNodeMeta().autoResizeDisable && node.clientWidth && node.clientHeight) {\n const transform = entity.getData<FlowNodeTransformData>(FlowNodeTransformData);\n if (transform)\n transform.size = {\n width: node.clientWidth,\n height: node.clientHeight,\n };\n }\n }, [entity, node]);\n // 这里使用 portal,改 dom 样式不会引起 react 重新渲染\n return ReactDOM.createPortal(\n <PlaygroundEntityContext.Provider value={entity}>\n <PortalRenderer\n node={entity}\n version={data?.version}\n activated={data?.activated}\n readonly={config.readonly}\n disabled={config.disabled}\n />\n </PlaygroundEntityContext.Provider>,\n node\n );\n }\n\n return {\n id: node.id || entity.id,\n dispose: () => {\n // TODO, 删除逻辑由 node 去控制了\n },\n Portal,\n } as NodePortal;\n }\n );\n\n onReady() {\n this.node!.style.zIndex = '10';\n }\n\n /**\n * 监听readonly和 disabled 状态 并刷新layer, 并刷新节点\n */\n onReadonlyOrDisabledChange() {\n this.render();\n }\n\n getPortals(): NodePortal[] {\n return this.reactPortals.getMoreByItems(this.renderStatesVisible);\n }\n\n render() {\n if (this.documentTransformer.loading) return <></>;\n this.documentTransformer.refresh();\n\n // 从缓存获取节点\n return (\n <>\n {this.getPortals().map((portal) => (\n <portal.Portal key={portal.id} />\n ))}\n </>\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable, multiInject, optional } from 'inversify';\nimport { I18n } from '@flowgram.ai/i18n';\nimport { type Layer, type LayerRegistry, PipelineRegistry } from '@flowgram.ai/core';\n\nimport { FlowRendererContribution } from './flow-renderer-contribution';\n\nexport enum FlowRendererComponentType {\n REACT, // react 组件\n DOM, // dom 组件\n TEXT, // 文案\n}\n\nexport enum FlowRendererKey {\n NODE_RENDER = 'node-render', // 节点渲染\n ADDER = 'adder', // 添加按钮渲染\n COLLAPSE = 'collapse', // 节点展开收起标签(包含展开态和收起态)\n BRANCH_ADDER = 'branch-adder', // 分支添加按钮\n TRY_CATCH_COLLAPSE = 'try-catch-collapse', // 错误处理分支整体收起\n DRAG_NODE = 'drag-node', // 拖拽节点\n DRAGGABLE_ADDER = 'draggable-adder', // 拖拽可被拖入\n DRAG_HIGHLIGHT_ADDER = 'drag-highlight-adder', // 拖拽高亮\n DRAG_BRANCH_HIGHLIGHT_ADDER = 'drag-branch-highlight-adder', // 分支拖拽添加高亮\n SELECTOR_BOX_POPOVER = 'selector-box-popover', // 选择框右上角菜单\n /**\n * @deprecated\n */\n CONTEXT_MENU_POPOVER = 'context-menu-popover', // 右键菜单\n SUB_CANVAS = 'sub-canvas', // 子画布渲染\n\n SLOT_ADDER = 'slot-adder', // 插槽添加按钮\n SLOT_LABEL = 'slot-label', // 插槽标签\n SLOT_COLLAPSE = 'slot-collapse', // 插槽收起按钮渲染\n\n // 工作流线条箭头自定义渲染\n ARROW_RENDERER = 'arrow-renderer', // 工作流线条箭头渲染器\n\n // 下边两个不一定存在\n MARKER_ARROW = 'marker-arrow', // loop 的默认箭头\n MARKER_ACTIVATE_ARROW = 'marker-active-arrow', // loop 的激活态箭头\n}\n\nexport enum FlowTextKey {\n // 循环节点相关\n LOOP_END_TEXT = 'loop-end-text', // 文案:循环结束\n LOOP_TRAVERSE_TEXT = 'loop-traverse-text', // 文案:循环遍历\n LOOP_WHILE_TEXT = 'loop-while-text', // 文案:满足条件时\n // TryCatch 相关\n TRY_START_TEXT = 'try-start-text', // 文案:监控开始\n TRY_END_TEXT = 'try-end-text', // 文案:监控结束\n CATCH_TEXT = 'catch-text', // 发生错误\n}\n\nexport interface FlowRendererComponent {\n type: FlowRendererComponentType;\n renderer: (props?: any) => any;\n}\n\n/**\n * 命令分类\n */\nexport enum FlowRendererCommandCategory {\n SELECTOR_BOX = 'SELECTOR_BOX', // 选择框\n}\n\n@injectable()\nexport class FlowRendererRegistry {\n private componentsMap = new Map<string, FlowRendererComponent>();\n\n private textMap = new Map<string, string>();\n\n @multiInject(FlowRendererContribution)\n @optional()\n private contribs: FlowRendererContribution[] = [];\n\n @inject(PipelineRegistry) readonly pipeline: PipelineRegistry;\n\n init() {\n this.contribs.forEach((contrib) => contrib.registerRenderer?.(this));\n }\n\n /**\n * 注册 组件数据\n */\n registerRendererComponents(\n renderKey: FlowRendererKey | string,\n comp: FlowRendererComponent\n ): void {\n this.componentsMap.set(renderKey, comp);\n }\n\n registerReactComponent(renderKey: FlowRendererKey | string, renderer: (props: any) => any): void {\n this.componentsMap.set(renderKey, {\n type: FlowRendererComponentType.REACT,\n renderer,\n });\n }\n\n /**\n * 注册文案\n */\n registerText(configs: Record<FlowTextKey | string, string>): void {\n Object.entries(configs).forEach(([key, value]) => {\n this.textMap.set(key, value);\n });\n }\n\n getText(textKey: string) {\n return I18n.t(textKey, { defaultValue: '' }) || this.textMap.get(textKey);\n }\n\n /**\n * TODO: support memo\n */\n public getRendererComponent(renderKey: FlowRendererKey | string): FlowRendererComponent {\n const comp = this.componentsMap.get(renderKey);\n if (!comp) {\n throw new Error(`Unknown render key ${renderKey}`);\n }\n return comp;\n }\n\n tryToGetRendererComponent(\n renderKey: FlowRendererKey | string\n ): FlowRendererComponent | undefined {\n return this.componentsMap.get(renderKey);\n }\n\n /**\n * 注册画布层\n */\n registerLayers(...layerRegistries: LayerRegistry[]): void {\n layerRegistries.forEach((layer) => this.pipeline.registerLayer(layer));\n }\n\n /**\n * 根据配置注册画布\n * @param layerRegistry\n * @param options\n */\n registerLayer<P extends Layer = Layer>(\n layerRegistry: LayerRegistry<Layer>,\n options?: P['options']\n ): void {\n this.pipeline.registerLayer(layerRegistry, options);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport type { FlowRendererRegistry } from './flow-renderer-registry';\n\nexport const FlowRendererContribution = Symbol('FlowRendererContribution');\n\nexport interface FlowRendererContribution {\n registerRenderer?(registry: FlowRendererRegistry): void;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { groupBy, throttle } from 'lodash-es';\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowNodeEntity,\n FlowNodeTransitionData,\n FlowRendererStateEntity,\n FlowDragService,\n} from '@flowgram.ai/document';\nimport { Layer, observeEntity, observeEntityDatas } from '@flowgram.ai/core';\n\nimport { FlowRendererRegistry } from '../flow-renderer-registry';\nimport { createLines } from '../components/LinesRenderer';\n\n@injectable()\nexport class FlowLinesLayer extends Layer {\n @inject(FlowDocument) readonly document: FlowDocument;\n\n @inject(FlowDragService)\n protected readonly dragService: FlowDragService;\n\n @inject(FlowRendererRegistry) readonly rendererRegistry: FlowRendererRegistry;\n\n node = domUtils.createDivWithClass('gedit-flow-lines-layer');\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntity(FlowRendererStateEntity)\n readonly flowRenderState: FlowRendererStateEntity;\n\n /**\n * 监听 transition 变化\n */\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransitionData)\n _transitions: FlowNodeTransitionData[];\n\n get transitions(): FlowNodeTransitionData[] {\n return this.document.getRenderDatas<FlowNodeTransitionData>(FlowNodeTransitionData);\n }\n\n /**\n * 可视区域变化\n */\n onViewportChange: ReturnType<typeof throttle> = throttle(() => {\n this.render();\n }, 100);\n\n onZoom() {\n const svgContainer = this.node!.querySelector('svg.flow-lines-container')!;\n svgContainer?.setAttribute?.('viewBox', this.viewBox);\n }\n\n onReady() {\n this.node.style.zIndex = '1';\n }\n\n get viewBox(): string {\n const ratio = 1000 / this.config.finalScale;\n return `0 0 ${ratio} ${ratio}`;\n }\n\n render(): JSX.Element {\n const allLines: JSX.Element[] = [];\n const isViewportVisible = this.config.isViewportVisible.bind(this.config);\n // 还没初始化\n if (this.documentTransformer.loading) return <></>;\n this.documentTransformer.refresh();\n\n this.transitions.forEach((transition) => {\n createLines({\n data: transition,\n rendererRegistry: this.rendererRegistry,\n isViewportVisible,\n linesSave: allLines,\n dragService: this.dragService,\n });\n });\n\n // svg 没有 z-index,只能通过顺序来设置前后层级\n // 通过将 activated 的项排到最后,防止 hover 层级覆盖\n const { activateLines = [], normalLines = [] } = groupBy(allLines, (line) =>\n line.props.activated ? 'activateLines' : 'normalLines'\n );\n const resultLines = [...normalLines, ...activateLines];\n\n return (\n <svg\n className=\"flow-lines-container\"\n width=\"1000\"\n height=\"1000\"\n overflow=\"visible\"\n viewBox={this.viewBox}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {resultLines}\n </svg>\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { Rectangle } from '@flowgram.ai/utils';\nimport {\n FlowDragService,\n type FlowNodeTransitionData,\n type FlowTransitionLine,\n FlowTransitionLineEnum,\n DefaultSpacingKey,\n} from '@flowgram.ai/document';\nimport { getDefaultSpacing } from '@flowgram.ai/document';\n\nimport { type FlowRendererRegistry } from '../flow-renderer-registry';\nimport StraightLine from './StraightLine';\nimport RoundedTurningLine from './RoundedTurningLine';\nimport CustomLine from './CustomLine';\n\nexport interface PropsType {\n data: FlowNodeTransitionData;\n rendererRegistry: FlowRendererRegistry;\n isViewportVisible: (bounds: Rectangle) => boolean;\n linesSave: JSX.Element[];\n dragService: FlowDragService;\n}\n\nexport function createLines(props: PropsType): void {\n const { data, rendererRegistry, linesSave, dragService } = props;\n const { lines, entity } = data || {};\n\n const xRadius = getDefaultSpacing(entity, DefaultSpacingKey.ROUNDED_LINE_X_RADIUS);\n const yRadius = getDefaultSpacing(entity, DefaultSpacingKey.ROUNDED_LINE_Y_RADIUS);\n\n // 线条绘制逻辑\n const renderLine = (line: FlowTransitionLine, index: number) => {\n const { renderData } = data;\n const { isVertical } = data.entity;\n const { lineActivated } = renderData || {};\n\n const draggingLineHide =\n (line.type === FlowTransitionLineEnum.DRAGGING_LINE || line.isDraggingLine) &&\n !dragService.isDroppableBranch(data.entity, line.side);\n\n const draggingLineActivated =\n (line.type === FlowTransitionLineEnum.DRAGGING_LINE || line.isDraggingLine) &&\n data.entity?.id === dragService.dropNodeId &&\n line.side === dragService.labelSide;\n\n switch (line.type) {\n case FlowTransitionLineEnum.STRAIGHT_LINE:\n return (\n <StraightLine\n key={`${data.entity.id}_${index}`}\n lineId={data.entity.id}\n activated={lineActivated}\n {...line}\n />\n );\n\n case FlowTransitionLineEnum.DIVERGE_LINE:\n case FlowTransitionLineEnum.DRAGGING_LINE:\n case FlowTransitionLineEnum.MERGE_LINE:\n case FlowTransitionLineEnum.ROUNDED_LINE:\n return (\n <RoundedTurningLine\n key={`${data.entity.id}_${index}`}\n lineId={data.entity.id}\n isHorizontal={!isVertical}\n activated={lineActivated || draggingLineActivated}\n {...line}\n xRadius={xRadius}\n yRadius={yRadius}\n hide={draggingLineHide}\n />\n );\n\n case FlowTransitionLineEnum.CUSTOM_LINE:\n return (\n <CustomLine\n key={`${data.entity.id}_${index}`}\n lineId={data.entity.id}\n {...line}\n rendererRegistry={rendererRegistry}\n />\n );\n\n default:\n break;\n }\n\n return undefined;\n };\n lines.forEach((line, index) => {\n const bounds = Rectangle.createRectangleWithTwoPoints(line.from, line.to).pad(10);\n if (props.isViewportVisible(bounds)) {\n const jsxEl = renderLine(line, index) as JSX.Element;\n if (jsxEl) linesSave.push(jsxEl);\n }\n });\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport type { FlowTransitionLine } from '@flowgram.ai/document';\n\nimport { useBaseColor } from '../hooks/use-base-color';\nimport { DEFAULT_LINE_ATTRS } from './utils';\n\nfunction StraightLine(props: FlowTransitionLine): JSX.Element {\n const { from, to, activated, style } = props;\n const { baseColor, baseActivatedColor } = useBaseColor();\n\n return (\n <path\n data-line-id={props.lineId}\n d={`M ${from.x} ${from.y} L ${to.x} ${to.y}`}\n {...DEFAULT_LINE_ATTRS}\n stroke={activated ? baseActivatedColor : baseColor}\n style={style}\n />\n );\n}\n\n// version 变化才触发组件更新\nexport default StraightLine;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { useMemo } from 'react';\n\nimport { isNil } from 'lodash-es';\nimport { Point } from '@flowgram.ai/utils';\nimport { type FlowTransitionLine } from '@flowgram.ai/document';\nimport { useService } from '@flowgram.ai/core';\n\nimport { useBaseColor } from '../hooks/use-base-color';\nimport { DEFAULT_LINE_ATTRS, DEFAULT_RADIUS, getHorizontalVertices, getVertices } from './utils';\nimport MarkerArrow, { MARK_ARROW_ID } from './MarkerArrow';\nimport MarkerActivatedArrow, { MARK_ACTIVATED_ARROW_ID } from './MarkerActivatedArrow';\nimport { FlowRendererKey, FlowRendererRegistry } from '../flow-renderer-registry';\n\ninterface PropsType extends FlowTransitionLine {\n radius?: number;\n hide?: boolean;\n xRadius?: number;\n yRadius?: number;\n}\n\nfunction MarkerDefs(props: { id: string; activated?: boolean }): JSX.Element {\n const renderRegistry = useService(FlowRendererRegistry);\n const ArrowRenderer = renderRegistry?.tryToGetRendererComponent(\n props.activated ? FlowRendererKey.MARKER_ACTIVATE_ARROW : FlowRendererKey.MARKER_ARROW\n );\n if (ArrowRenderer) {\n return <ArrowRenderer.renderer {...props} />;\n }\n if (props.activated) {\n return (\n <defs>\n <MarkerActivatedArrow id={props.id} />\n </defs>\n );\n }\n return (\n <defs>\n <MarkerArrow id={props.id} />\n </defs>\n );\n}\n/**\n * 圆角转弯线\n */\nfunction RoundedTurningLine(props: PropsType): JSX.Element | null {\n const { vertices, radius = DEFAULT_RADIUS, hide, xRadius, yRadius, ...line } = props;\n const { from, to, arrow, activated, style } = line || {};\n const { baseActivatedColor, baseColor } = useBaseColor();\n\n // 如果没有 vertices,根据线条类型计算转折点\n const realVertices =\n vertices ||\n (props.isHorizontal\n ? getHorizontalVertices(line, xRadius, yRadius)\n : getVertices(line, xRadius, yRadius));\n const middleStr: string = useMemo(\n () =>\n realVertices\n .map((point, idx) => {\n const prev = realVertices[idx - 1] || from;\n const next = realVertices[idx + 1] || to;\n\n // 前后 delta 变化\n const prevDelta = { x: Math.abs(prev.x - point.x), y: Math.abs(prev.y - point.y) };\n const nextDelta = { x: Math.abs(next.x - point.x), y: Math.abs(next.y - point.y) };\n\n // 不是垂直直角的拐弯线报错\n const isRightAngleX = prevDelta.x === 0 && nextDelta.y === 0;\n const isRightAngleY = prevDelta.y === 0 && nextDelta.x === 0;\n const isRightAngle = isRightAngleX || isRightAngleY;\n\n if (!isRightAngle) {\n console.error(`vertex ${point.x},${point.y} is not right angle`);\n }\n\n // 圆角入点和出点为 control 往两个方向移动一段距离,距离不够 radius 为短距离\n const inPoint = new Point().copyFrom(point);\n const outPoint = new Point().copyFrom(point);\n const radiusX = isNil(point.radiusX) ? radius : point.radiusX;\n const radiusY = isNil(point.radiusY) ? radius : point.radiusY;\n let rx = radiusX;\n let ry = radiusY;\n\n if (isRightAngleX) {\n ry = Math.min(prevDelta.y, radiusY);\n const moveY = isNil(point.moveY) ? ry : point.moveY;\n inPoint.y += from.y < point.y ? -moveY : +moveY;\n\n rx = Math.min(nextDelta.x, radiusX);\n const moveX = isNil(point.moveX) ? rx : point.moveX;\n outPoint.x += to.x < point.x ? -moveX : +moveX;\n }\n\n if (isRightAngleY) {\n rx = Math.min(prevDelta.x, radiusX);\n const moveX = isNil(point.moveX) ? rx : point.moveX;\n inPoint.x += from.x < point.x ? -moveX : +moveX;\n\n ry = Math.min(nextDelta.y, radiusY);\n const moveY = isNil(point.moveY) ? ry : point.moveY;\n outPoint.y += to.y < point.y ? -moveY : +moveY;\n }\n\n // radius overflow 策略为截断,则回复 rx, ry 为原始 radius\n if (point.radiusOverflow === 'truncate') {\n rx = radiusX;\n ry = radiusY;\n }\n\n // 是否是顺时针?\n // - 基于 AB 和 AC 的向量叉积\n // - A 点:inPoint, B 点:point, C 点:outPoint\n const crossProduct =\n (point.x - inPoint.x) * (outPoint.y - inPoint.y) -\n (point.y - inPoint.y) * (outPoint.x - inPoint.x);\n const isClockWise = crossProduct > 0;\n\n // 控制点为当前节点\n return `L ${inPoint.x} ${inPoint.y} A ${rx} ${ry} 0 0 ${isClockWise ? 1 : 0} ${\n outPoint.x\n } ${outPoint.y}`;\n })\n .join(' '),\n [realVertices]\n );\n\n if (hide) {\n return null;\n }\n\n const pathStr = `M ${from.x} ${from.y} ${middleStr} L ${to.x} ${to.y}`;\n const markerId = activated\n ? `${MARK_ACTIVATED_ARROW_ID}${props.lineId}`\n : `${MARK_ARROW_ID}${props.lineId}`;\n\n return (\n <>\n {arrow ? <MarkerDefs id={markerId} activated={activated} /> : null}\n <path\n data-line-id={props.lineId}\n d={pathStr}\n {...DEFAULT_LINE_ATTRS}\n stroke={activated ? baseActivatedColor : baseColor}\n {...(arrow\n ? {\n markerEnd: `url(#${markerId})`,\n }\n : {})}\n style={style}\n ></path>\n </>\n );\n}\n\n// version 变化才触发组件更新\nexport default RoundedTurningLine;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { useBaseColor } from '../hooks/use-base-color';\n\nexport const MARK_ARROW_ID = '$marker_arrow$';\n// export const MARK_ARROW_URL = `url(#${MARK_ARROW_ID})`;\n\nfunction MarkerArrow(props: { id: string }): JSX.Element {\n const { baseColor } = useBaseColor();\n return (\n <marker\n data-line-id={props.id}\n id={props.id || MARK_ARROW_ID}\n markerWidth=\"11\"\n markerHeight=\"14\"\n refX=\"10\"\n refY=\"7\"\n orient=\"auto\"\n >\n <path\n d=\"M9.6 5.2C10.8 6.1 10.8 7.9 9.6 8.8L3.6 13.3C2.11672 14.4125 0 13.3541 0 11.5L0 2.5C0 0.645898 2.11672 -0.412461 3.6 0.7L9.6 5.2Z\"\n fill={baseColor}\n />\n </marker>\n );\n}\n\n// version变化才触发组件更新\nexport default MarkerArrow;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { useBaseColor } from '../hooks/use-base-color';\n\nexport const MARK_ACTIVATED_ARROW_ID = '$marker_arrow_activated$';\n// export const MARK_ACTIVATED_ARROW_URL = `url(#${MARK_ACTIVATED_ARROW_ID})`;\n\nfunction MarkerActivatedArrow(props: { id?: string }): JSX.Element {\n const { baseActivatedColor } = useBaseColor();\n return (\n <marker\n data-line-id={props.id}\n id={props.id || MARK_ACTIVATED_ARROW_ID}\n markerWidth=\"11\"\n markerHeight=\"14\"\n refX=\"10\"\n refY=\"7\"\n orient=\"auto\"\n >\n <path\n d=\"M9.6 5.2C10.8 6.1 10.8 7.9 9.6 8.8L3.6 13.3C2.11672 14.4125 0 13.3541 0 11.5L0 2.5C0 0.645898 2.11672 -0.412461 3.6 0.7L9.6 5.2Z\"\n fill={baseActivatedColor}\n />\n </marker>\n );\n}\n\n// version 变化才触发组件更新\nexport default MarkerActivatedArrow;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport type { FlowTransitionLine } from '@flowgram.ai/document';\n\nimport { type FlowRendererRegistry } from '../flow-renderer-registry';\n\ninterface PropsType extends FlowTransitionLine {\n rendererRegistry: FlowRendererRegistry;\n}\n\nfunction CustomLine(props: PropsType): JSX.Element {\n const { renderKey, rendererRegistry, ...line } = props;\n\n if (!renderKey) {\n return <></>;\n }\n\n const renderer = rendererRegistry.getRendererComponent(renderKey);\n\n if (!renderer) {\n return <></>;\n }\n\n const Component = renderer.renderer as (props: FlowTransitionLine) => JSX.Element;\n\n return <Component lineId={props.lineId} {...line} />;\n}\n\nexport default CustomLine;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { throttle } from 'lodash-es';\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowNodeEntity,\n FlowNodeTransitionData,\n FlowRendererStateEntity,\n} from '@flowgram.ai/document';\nimport { Layer, observeEntity, observeEntityDatas } from '@flowgram.ai/core';\n\nimport { useBaseColor } from '../hooks/use-base-color';\nimport { FlowRendererRegistry } from '../flow-renderer-registry';\nimport { createLabels } from '../components/LabelsRenderer';\n\n@injectable()\nexport class FlowLabelsLayer extends Layer {\n @inject(FlowDocument) readonly document: FlowDocument;\n\n @inject(FlowRendererRegistry) readonly rendererRegistry: FlowRendererRegistry;\n\n node = domUtils.createDivWithClass('gedit-flow-labels-layer');\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntity(FlowRendererStateEntity)\n readonly flowRenderState: FlowRendererStateEntity;\n\n /**\n * 监听 transition 变化\n */\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransitionData)\n _transitions: FlowNodeTransitionData[];\n\n get transitions(): FlowNodeTransitionData[] {\n return this.document.getRenderDatas<FlowNodeTransitionData>(FlowNodeTransitionData);\n }\n\n /**\n * 监听缩放,目前采用整体缩放\n * @param scale\n */\n onZoom(scale: number) {\n this.node!.style.transform = `scale(${scale})`;\n }\n\n /**\n * 可视区域变化\n */\n onViewportChange: ReturnType<typeof throttle> = throttle(() => {\n this.render();\n }, 100);\n\n onReady() {\n // 图层顺序调整:节点 > label > 线条\n // 节点 z-index: 10\n this.node.style.zIndex = '9';\n }\n\n /**\n * 监听readonly和 disabled 状态 并刷新layer, 并刷新\n */\n onReadonlyOrDisabledChange() {\n this.render();\n }\n\n render() {\n const labels: JSX.Element[] = [];\n if (this.documentTransformer?.loading) return <></>;\n this.documentTransformer?.refresh?.();\n const { baseActivatedColor, baseColor } = useBaseColor();\n const isViewportVisible = this.config.isViewportVisible.bind(this.config);\n this.transitions.forEach((transition) => {\n createLabels({\n data: transition,\n rendererRegistry: this.rendererRegistry,\n isViewportVisible,\n labelsSave: labels,\n getLabelColor: (activated) => (activated ? baseActivatedColor : baseColor),\n });\n });\n // 这里采用扁平化的 react 结构性能更高\n return <>{labels}</>;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { type IPoint, Rectangle } from '@flowgram.ai/utils';\nimport {\n type CustomLabelProps,\n type FlowNodeTransitionData,\n type FlowTransitionLabel,\n FlowTransitionLabelEnum,\n} from '@flowgram.ai/document';\n\nimport { type FlowRendererRegistry } from '../flow-renderer-registry';\nimport CollapseAdder from './CollapseAdder';\nimport Collapse from './Collapse';\nimport BranchDraggableRenderer from './BranchDraggableRenderer';\nimport Adder from './Adder';\n\nexport interface LabelOpts {\n // eslint-disable-next-line react/no-unused-prop-types\n data: FlowNodeTransitionData;\n rendererRegistry: FlowRendererRegistry;\n isViewportVisible: (bounds: Rectangle) => boolean;\n labelsSave: JSX.Element[];\n getLabelColor: (activated?: boolean) => string;\n}\n\nconst TEXT_LABEL_STYLE: React.CSSProperties = {\n fontSize: 12,\n color: '#8F959E',\n textAlign: 'center',\n whiteSpace: 'nowrap',\n backgroundColor: 'var(--g-editor-background)',\n lineHeight: '20px',\n};\n\nconst LABEL_MAX_WIDTH = 150;\nconst LABEL_MAX_HEIGHT = 60;\n\nfunction getLabelBounds(offset: IPoint) {\n return new Rectangle(\n offset.x - LABEL_MAX_WIDTH / 2,\n offset.y - LABEL_MAX_HEIGHT / 2,\n LABEL_MAX_WIDTH,\n LABEL_MAX_HEIGHT\n );\n}\n\nexport function createLabels(labelProps: LabelOpts): void {\n const { data, rendererRegistry, labelsSave, getLabelColor } = labelProps;\n const { labels, renderData } = data || {};\n const { activated } = renderData || {};\n\n // 标签绘制逻辑\n const renderLabel = (label: FlowTransitionLabel, index: number) => {\n const { offset, renderKey, props, rotate, origin, type } = label || {};\n const offsetX = offset.x;\n const offsetY = offset.y;\n\n let child = null;\n switch (type) {\n case FlowTransitionLabelEnum.BRANCH_DRAGGING_LABEL:\n child = (\n <BranchDraggableRenderer\n labelId={label.labelId || labelProps.data.entity.id}\n rendererRegistry={rendererRegistry}\n data={data}\n {...props}\n />\n );\n break;\n case FlowTransitionLabelEnum.ADDER_LABEL:\n child = (\n <Adder\n labelId={label.labelId || labelProps.data.entity.id}\n rendererRegistry={rendererRegistry}\n data={data}\n {...props}\n />\n );\n break;\n\n case FlowTransitionLabelEnum.COLLAPSE_LABEL:\n child = (\n <Collapse\n labelId={label.labelId || labelProps.data.entity.id}\n rendererRegistry={rendererRegistry}\n data={data}\n {...props}\n />\n );\n break;\n\n case FlowTransitionLabelEnum.COLLAPSE_ADDER_LABEL:\n child = (\n <CollapseAdder\n labelId={label.labelId || labelProps.data.entity.id}\n rendererRegistry={rendererRegistry}\n data={data}\n {...props}\n />\n );\n break;\n\n case FlowTransitionLabelEnum.TEXT_LABEL:\n if (!renderKey) {\n return null;\n }\n const text = rendererRegistry.getText(renderKey) || renderKey;\n child = (\n <div\n data-label-id={label.labelId || labelProps.data.entity.id}\n style={{\n ...TEXT_LABEL_STYLE,\n ...props?.style,\n color: getLabelColor(activated),\n transform: rotate ? `rotate(${rotate})` : undefined,\n }}\n >\n {text}\n </div>\n );\n break;\n\n case FlowTransitionLabelEnum.CUSTOM_LABEL:\n if (!renderKey) {\n return null;\n }\n try {\n const renderer = rendererRegistry.getRendererComponent(renderKey);\n child = React.createElement(\n renderer.renderer as (props: any) => JSX.Element,\n {\n node: data.entity,\n labelId: label.labelId || labelProps.data.entity.id,\n ...props,\n } as CustomLabelProps\n );\n } catch (err) {\n console.error(err);\n child = renderKey;\n }\n break;\n default:\n break;\n }\n\n const originX = typeof origin?.[0] === 'number' ? origin?.[0] : 0.5;\n const originY = typeof origin?.[1] === 'number' ? origin?.[1] : 0.5;\n\n return (\n <div\n key={`${data.entity.id}${index}`}\n data-label-id={label.labelId || labelProps.data.entity.id}\n style={{\n position: 'absolute',\n left: offsetX,\n top: offsetY,\n transform: `translate(-${originX * 100}%, -${originY * 100}%)`,\n }}\n >\n {child}\n </div>\n );\n };\n\n labels.forEach((label, index) => {\n if (labelProps.isViewportVisible(getLabelBounds(label.offset))) {\n labelsSave.push(renderLabel(label, index) as JSX.Element);\n }\n });\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { useState, useCallback } from 'react';\n\nimport {\n type CollapseAdderProps,\n FlowNodeRenderData,\n type FlowNodeTransitionData,\n} from '@flowgram.ai/document';\n\nimport { type FlowRendererRegistry } from '../flow-renderer-registry';\nimport Collapse from './Collapse';\nimport Adder from './Adder';\n\ninterface PropsType extends Partial<CollapseAdderProps> {\n data: FlowNodeTransitionData;\n rendererRegistry: FlowRendererRegistry;\n // 业务自定义 props\n [key: string]: unknown;\n}\n\n/**\n * 加号和收起复合 Label\n * @param props\n * @returns\n */\nexport default function CollapseAdder(props: PropsType) {\n const { data, rendererRegistry, ...restProps } = props;\n const { activateNode } = restProps;\n\n // 收起展开按钮是否可见\n const [hoverActivated, setHoverActivated] = useState(false);\n\n const activateData = activateNode?.getData(FlowNodeRenderData);\n\n const handleMouseEnter = useCallback(() => {\n setHoverActivated(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setHoverActivated(false);\n }, []);\n\n const isVertical = activateNode?.isVertical;\n const activated = activateData?.hovered || hoverActivated;\n if (isVertical) {\n return (\n <div\n className=\"flow-canvas-collapse-adder\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {(activated || data.collapsed) && (\n <Collapse\n forceVisible\n {...props}\n wrapperStyle={{\n alignItems: 'flex-end',\n }}\n hoverHeight={20}\n />\n )}\n {!data.collapsed && (\n <Adder {...props} hoverHeight={activated ? 20 : 40} hoverActivated={activated} />\n )}\n </div>\n );\n }\n\n return (\n <div\n className=\"flow-canvas-collapse-adder\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n style={{\n display: data.collapsed ? 'block' : 'flex',\n }}\n >\n {(activated || data.collapsed) && (\n <Collapse\n forceVisible\n {...props}\n wrapperStyle={{\n justifyContent: 'flex-end',\n }}\n hoverWidth={20}\n />\n )}\n {!data.collapsed && (\n <Adder {...props} hoverWidth={activated ? 20 : 40} hoverActivated={activated} />\n )}\n </div>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { useState, useCallback } from 'react';\n\nimport {\n type CollapseProps,\n FlowNodeRenderData,\n type FlowNodeTransitionData,\n} from '@flowgram.ai/document';\n\nimport { FlowRendererKey, type FlowRendererRegistry } from '../flow-renderer-registry';\nimport { getTransitionLabelHoverHeight, getTransitionLabelHoverWidth } from './utils';\n\ninterface PropsType extends Partial<CollapseProps> {\n data: FlowNodeTransitionData;\n rendererRegistry: FlowRendererRegistry;\n hoverHeight?: number;\n hoverWidth?: number;\n wrapperStyle?: React.CSSProperties;\n // 业务自定义 props\n [key: string]: unknown;\n}\n\nexport default function Collapse(props: PropsType) {\n const {\n data,\n rendererRegistry,\n forceVisible,\n hoverHeight = getTransitionLabelHoverHeight(data),\n hoverWidth = getTransitionLabelHoverWidth(data),\n wrapperStyle,\n ...restProps\n } = props;\n const { activateNode } = restProps;\n\n const [hoverActivated, setHoverActivated] = useState(false);\n const activateData = activateNode?.getData(FlowNodeRenderData);\n\n const handleMouseEnter = useCallback(() => {\n setHoverActivated(true);\n activateData?.toggleMouseEnter();\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setHoverActivated(false);\n activateData?.toggleMouseLeave();\n }, []);\n\n const collapseOpener = rendererRegistry.getRendererComponent(FlowRendererKey.COLLAPSE);\n const node = data.entity;\n\n const child = React.createElement(\n collapseOpener.renderer as (props: CollapseProps) => JSX.Element,\n {\n node,\n collapseNode: node,\n ...restProps,\n hoverActivated,\n } as CollapseProps,\n );\n\n const isChildVisible = data.collapsed || activateData?.hovered || hoverActivated || forceVisible;\n\n return (\n <div\n className=\"flow-canvas-collapse\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n style={{\n width: hoverWidth,\n height: hoverHeight,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n ...wrapperStyle,\n }}\n >\n {isChildVisible ? child : null}\n </div>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { useCallback, useState } from 'react';\n\nimport {\n type AdderProps,\n type FlowNodeTransitionData,\n type FlowNodeEntity,\n FlowDragService,\n} from '@flowgram.ai/document';\nimport { useService } from '@flowgram.ai/core';\n\nimport { FlowRendererKey, type FlowRendererRegistry } from '../flow-renderer-registry';\nimport { getTransitionLabelHoverHeight, getTransitionLabelHoverWidth } from './utils';\n\ninterface PropsType {\n data: FlowNodeTransitionData;\n rendererRegistry: FlowRendererRegistry;\n hoverWidth?: number;\n hoverHeight?: number;\n // 业务自定义 props\n [key: string]: unknown;\n}\n\n// export only for tests\nexport const getFlowRenderKey = (\n node: FlowNodeEntity,\n { dragService }: { dragService?: FlowDragService },\n) => {\n if (dragService && dragService.dragging && dragService.isDroppableNode(node)) {\n if (dragService.dropNodeId === node.id) {\n return FlowRendererKey.DRAG_HIGHLIGHT_ADDER;\n }\n return FlowRendererKey.DRAGGABLE_ADDER;\n }\n\n return FlowRendererKey.ADDER;\n};\n\n/**\n * Adder 高亮热区扩散目的:\n * ux 调研的时候不少用户反馈点看的不是很清楚(初始点较小)\n * 因此给的解决办法是加深加大 icon 再加扩大 hover 热区\n *\n * Adder 模块高亮规则:\n * 取前后节点宽度的最大值为高亮区域宽度\n * 高度固定为 32px\n */\nexport default function Adder(props: PropsType) {\n const {\n data,\n rendererRegistry,\n hoverHeight = getTransitionLabelHoverHeight(data),\n hoverWidth = getTransitionLabelHoverWidth(data),\n ...restProps\n } = props;\n\n const [hoverActivated, setHoverActivated] = useState(false);\n\n const handleMouseEnter = useCallback(() => setHoverActivated(true), []);\n const handleMouseLeave = useCallback(() => setHoverActivated(false), []);\n\n const node = data.entity;\n\n const dragService = useService<FlowDragService>(FlowDragService);\n\n // 根据拖拽条件转换状态\n const flowRenderKey = getFlowRenderKey(node, { dragService });\n\n const adder = rendererRegistry.getRendererComponent(flowRenderKey);\n const from = node;\n // 获取 originTree 的 to 节点\n const to = data.entity.document.renderTree.getOriginInfo(node).next;\n // 实际渲染的 to 节点\n const renderTo = node.next;\n\n const child = React.createElement(\n adder.renderer as (props: AdderProps) => JSX.Element,\n {\n node,\n from,\n to,\n renderTo,\n hoverActivated,\n setHoverActivated,\n hoverWidth,\n hoverHeight,\n ...restProps,\n } as AdderProps,\n );\n\n return (\n // eslint-disable-next-line react/jsx-filename-extension\n <div\n className=\"flow-canvas-adder\"\n data-testid=\"sdk.flowcanvas.line.adder\"\n data-from={from.id}\n data-to={to?.id ?? ''}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n style={{\n width: hoverWidth,\n height: hoverHeight,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n {child}\n </div>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport {\n type AdderProps,\n type FlowNodeTransitionData,\n type LABEL_SIDE_TYPE,\n FlowDragService,\n} from '@flowgram.ai/document';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { useService } from '@flowgram.ai/core';\n\nimport { FlowRendererKey, type FlowRendererRegistry } from '../flow-renderer-registry';\n\ninterface PropsType {\n data: FlowNodeTransitionData;\n rendererRegistry: FlowRendererRegistry;\n hoverHeight?: number;\n side?: LABEL_SIDE_TYPE;\n // 业务自定义 props\n [key: string]: unknown;\n}\n\nconst getFlowRenderKey = (\n node: FlowNodeEntity,\n { dragService, side }: { dragService: FlowDragService; side?: LABEL_SIDE_TYPE },\n) => {\n if (\n dragService.isDragBranch &&\n side &&\n dragService.labelSide === side &&\n dragService.isDroppableBranch(node, side)\n ) {\n if (dragService.dropNodeId === node.id) {\n // 元素拖拽区域激活\n return FlowRendererKey.DRAG_BRANCH_HIGHLIGHT_ADDER;\n }\n // 节点元素拖拽,展示可被拖入区域为添加节点位置\n return FlowRendererKey.DRAGGABLE_ADDER;\n }\n\n // 默认不展示\n return '';\n};\n\n/**\n * 分支可被拖拽进入区域样式渲染\n */\nexport default function BranchDraggableRenderer(props: PropsType) {\n const { data, rendererRegistry, side, ...restProps } = props;\n\n const node = data.entity;\n\n const dragService = useService<FlowDragService>(FlowDragService);\n\n const flowRenderKey = getFlowRenderKey(node, { side, dragService });\n\n if (!flowRenderKey) {\n return null;\n }\n const adder = rendererRegistry.getRendererComponent(flowRenderKey);\n const from = node;\n // 获取 originTree 的 to 节点\n const to = data.entity.document.renderTree.getOriginInfo(node).next;\n // 实际渲染的 to 节点\n const renderTo = node.next;\n\n const child = React.createElement(\n adder.renderer as (props: AdderProps) => JSX.Element,\n {\n node,\n from,\n to,\n renderTo,\n ...restProps,\n } as AdderProps,\n );\n\n return <div className=\"flow-canvas-branch-draggable-adder\">{child}</div>;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowNodeEntity,\n FlowNodeTransformData,\n} from '@flowgram.ai/document';\nimport { Layer, observeEntity, observeEntityDatas } from '@flowgram.ai/core';\n\nimport { getScrollViewport } from '../utils';\n\nlet rgbTimes = 0;\n\nfunction randomColor(percent: number): string {\n const max = Math.min((percent / 10) * 255, 255);\n rgbTimes += 1;\n // rgb 轮询就可以错开颜色\n const rgb = rgbTimes % 3;\n const random = () => Math.floor(Math.random() * max);\n return `rgb(${rgb === 0 ? random() : 0}, ${rgb === 1 ? random() : 0}, ${\n rgb === 2 ? random() : 0\n })`;\n}\n\n/**\n * 调试用,会绘出所有节点的边界\n */\n@injectable()\nexport class FlowDebugLayer extends Layer {\n @inject(FlowDocument) readonly document: FlowDocument;\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransformData) _transforms: FlowNodeTransformData[];\n\n get transforms(): FlowNodeTransformData[] {\n return this.document.getRenderDatas<FlowNodeTransformData>(FlowNodeTransformData);\n }\n\n node = document.createElement('div') as HTMLElement;\n\n viewport = domUtils.createDivWithClass('gedit-flow-debug-bounds');\n\n boundsNodes = domUtils.createDivWithClass('gedit-flow-debug-bounds');\n\n pointsNodes = domUtils.createDivWithClass('gedit-flow-debug-points');\n\n versionNodes = domUtils.createDivWithClass('gedit-flow-debug-versions gedit-hidden');\n\n /**\n * ?debug=xxxx, 则返回 xxxx\n */\n filterKey = window.location.search.match(/debug=([^&]+)/)?.[1] || '';\n\n protected originLine = document.createElement('div') as HTMLDivElement;\n\n domCache = new WeakMap<\n FlowNodeTransformData,\n {\n color: string;\n bbox: HTMLDivElement;\n version: HTMLDivElement;\n input: HTMLDivElement;\n output: HTMLDivElement;\n }\n >();\n\n onReady() {\n this.node!.style.zIndex = '20';\n domUtils.setStyle(this.originLine, {\n position: 'absolute',\n width: 1,\n height: '100%',\n left: this.pipelineNode.style.left,\n top: 0,\n borderLeft: '1px dashed rgba(255, 0, 0, 0.5)',\n });\n this.pipelineNode.parentElement!.appendChild(this.originLine);\n this.node.appendChild(this.viewport);\n this.node.appendChild(this.versionNodes);\n this.node.appendChild(this.boundsNodes);\n this.node.appendChild(this.pointsNodes);\n this.renderScrollViewportBounds();\n }\n\n onScroll() {\n this.originLine.style.left = this.pipelineNode.style.left;\n this.renderScrollViewportBounds();\n }\n\n onResize() {\n this.renderScrollViewportBounds();\n }\n\n onZoom(scale: number) {\n this.node!.style.transform = `scale(${scale})`;\n this.renderScrollViewportBounds();\n }\n\n createBounds(transform: FlowNodeTransformData, color: string, depth: number): void {\n // 根据 debug=xxxx 进行匹配过滤\n if (this.filterKey && transform.key.indexOf(this.filterKey) === -1) return;\n let cache = this.domCache.get(transform)!;\n const { bounds, inputPoint, outputPoint } = transform;\n if (!cache) {\n const bbox = domUtils.createDivWithClass('') as HTMLDivElement;\n const input = domUtils.createDivWithClass('') as HTMLDivElement;\n const output = domUtils.createDivWithClass('') as HTMLDivElement;\n const version = domUtils.createDivWithClass('') as HTMLDivElement;\n bbox.title = transform.key;\n input.title = transform.key + '(input)';\n output.title = transform.key + '(output)';\n version.title = transform.key;\n this.boundsNodes.appendChild(bbox);\n this.pointsNodes.appendChild(input);\n this.pointsNodes.appendChild(output);\n this.versionNodes.appendChild(version);\n transform.onDispose(() => {\n bbox.remove();\n input.remove();\n output.remove();\n });\n cache = { bbox, input, output, version, color };\n this.domCache.set(transform, cache);\n }\n domUtils.setStyle(cache.version, {\n position: 'absolute',\n marginLeft: '-9px',\n marginTop: '-10px',\n borderRadius: 12,\n background: '#f54a45',\n padding: 4,\n color: 'navajowhite',\n display: transform.renderState.hidden ? 'none' : 'block',\n zIndex: depth + 1000,\n left: bounds.center.x,\n top: bounds.center.y,\n });\n cache.version.innerHTML = transform.version.toString();\n domUtils.setStyle(cache.input, {\n position: 'absolute',\n width: 10,\n height: 10,\n marginLeft: -5,\n marginTop: -5,\n borderRadius: 5,\n left: inputPoint.x,\n top: inputPoint.y,\n opacity: 0.4,\n zIndex: depth,\n backgroundColor: cache.color,\n whiteSpace: 'nowrap',\n overflow: 'visible',\n });\n cache.input.innerHTML = `${inputPoint.x},${inputPoint.y}`;\n domUtils.setStyle(cache.output, {\n position: 'absolute',\n width: 10,\n height: 10,\n marginLeft: -5,\n marginTop: -5,\n borderRadius: 5,\n left: outputPoint.x,\n top: outputPoint.y,\n opacity: 0.4,\n zIndex: depth,\n backgroundColor: cache.color,\n whiteSpace: 'nowrap',\n overflow: 'visible',\n });\n cache.output.innerHTML = `${outputPoint.x},${outputPoint.y}`;\n domUtils.setStyle(cache.bbox, {\n position: 'absolute',\n width: bounds.width,\n height: bounds.height,\n left: bounds.left,\n top: bounds.top,\n opacity: `${depth / 30}`,\n backgroundColor: cache.color,\n });\n }\n\n /**\n * 显示 viewport 可滚动区域\n */\n renderScrollViewportBounds() {\n const viewportBounds = getScrollViewport(\n {\n scrollX: this.config.config.scrollX,\n scrollY: this.config.config.scrollY,\n },\n this.config\n );\n domUtils.setStyle(this.viewport, {\n position: 'absolute',\n width: viewportBounds.width - 2,\n height: viewportBounds.height - 2,\n left: viewportBounds.left + 1,\n top: viewportBounds.top + 1,\n border: '1px solid rgba(200, 200, 255, 0.5)',\n });\n }\n\n autorun() {\n if (this.documentTransformer.loading) return;\n this.documentTransformer.refresh();\n // let lastDepth = 0\n let color = randomColor(0);\n this.document.traverse((entity, depth) => {\n const transform = entity.getData<FlowNodeTransformData>(FlowNodeTransformData)!;\n // if (lastDepth !== depth) {\n // // 层级变化则更新颜色\n // }\n color = randomColor(depth);\n this.createBounds(transform, color, depth);\n // lastDepth = depth\n });\n this.renderScrollViewportBounds();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Rectangle } from '@flowgram.ai/utils';\nimport { type PlaygroundConfigEntity } from '@flowgram.ai/core';\n\nexport interface ScrollData {\n scrollX: number;\n scrollY: number;\n}\n\n// viewport 缩小 30 像素\nconst SCROLL_LIMIT_PADDING = -120;\n\nexport function getScrollViewport(\n scrollData: ScrollData,\n config: PlaygroundConfigEntity\n): Rectangle {\n const scale = config.finalScale;\n return new Rectangle(\n scrollData.scrollX / scale,\n scrollData.scrollY / scale,\n config.config.width / scale,\n config.config.height / scale\n ).pad(SCROLL_LIMIT_PADDING / scale, SCROLL_LIMIT_PADDING / scale);\n}\n\n/**\n * 限制滚动\n */\nexport function scrollLimit(\n scroll: ScrollData,\n boundsList: Rectangle[],\n config: PlaygroundConfigEntity,\n initScroll: () => ScrollData\n): ScrollData {\n scroll = { ...scroll };\n const configData = config.config;\n const oldScroll = { scrollX: configData.scrollX, scrollY: configData.scrollY };\n // 画布 size 还没初始化滚动不限制\n if (boundsList.length === 0 || configData.width === 0 || configData.height === 0) return scroll;\n const viewport = getScrollViewport(scroll, config);\n const isVisible = boundsList.find((bounds) => Rectangle.isViewportVisible(bounds, viewport));\n if (!isVisible) {\n const oldViewport = getScrollViewport(oldScroll, config);\n const isOldVisible = boundsList.find((bounds) =>\n Rectangle.isViewportVisible(bounds, oldViewport)\n );\n // 如果之前也是不可见就不阻止\n if (!isOldVisible) {\n return initScroll();\n }\n return oldScroll;\n }\n return scroll;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/**\n * 滚动条点击事件监听\n */\nexport const ScrollBarEvents = Symbol('ScrollBarEvents');\n\nexport interface ScrollBarEvents {\n dragStart: () => void;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable, optional } from 'inversify';\nimport { FlowDocument, FlowNodeTransformData } from '@flowgram.ai/document';\nimport {\n Layer,\n observeEntity,\n PlaygroundConfigEntity,\n PlaygroundDrag,\n} from '@flowgram.ai/core';\nimport { domUtils, Rectangle } from '@flowgram.ai/utils';\n// import {\n// FlowDocument,\n// FlowDocumentTransformerEntity,\n// FlowNodeTransformData,\n// } from '@flowgram.ai/document'\n\nimport { ScrollBarEvents } from '../utils/scroll-bar-events';\nimport { getScrollViewport } from '../utils';\n\n// 中间区域边框宽度\nconst BORDER_WIDTH = 2;\n\n// 右下角预留的 offset\nconst BLOCK_OFFSET = 11;\n\n// 滚动条样式宽\nconst SCROLL_BAR_WIDTH = '7px';\n\n// 滚动条显示状态\nenum ScrollBarVisibility {\n Show = 'show',\n Hidden = 'hidden',\n}\n\nexport interface ScrollBarOptions {\n /**\n * 显示滚动条的时机,可选常驻或滚动时显示\n */\n showScrollBars: 'whenScrolling' | 'always';\n getBounds(): Rectangle;\n}\n\n/**\n * 渲染滚动条 layer\n */\n@injectable()\nexport class FlowScrollBarLayer extends Layer<ScrollBarOptions> {\n @optional()\n @inject(ScrollBarEvents)\n readonly events?: ScrollBarEvents;\n\n @inject(FlowDocument) @optional() flowDocument?: FlowDocument;\n\n @observeEntity(PlaygroundConfigEntity)\n protected playgroundConfigEntity: PlaygroundConfigEntity;\n\n // @observeEntity(FlowDocumentTransformerEntity) readonly documentTransformer: FlowDocumentTransformerEntity\n\n // 右滚动区域\n readonly rightScrollBar = domUtils.createDivWithClass('gedit-playground-scroll-right');\n\n // 右滚动条\n readonly rightScrollBarBlock = domUtils.createDivWithClass('gedit-playground-scroll-right-block');\n\n // 底滚动区域\n readonly bottomScrollBar = domUtils.createDivWithClass('gedit-playground-scroll-bottom');\n\n // 底滚动条\n readonly bottomScrollBarBlock = domUtils.createDivWithClass(\n 'gedit-playground-scroll-bottom-block',\n );\n\n // 最左边的位置\n private mostLeft: number;\n\n // 最右边的位置\n private mostRight: number;\n\n // 最上面的位置\n private mostTop: number;\n\n // 最下面的位置\n private mostBottom: number;\n\n // 视区宽度\n private viewportWidth: number;\n\n // 视区高度\n private viewportHeight: number;\n\n // 元素宽高\n private width: number;\n\n private height: number;\n\n // 底部滚动条宽度\n private scrollBottomWidth: number;\n\n // 右侧滚动条高度\n private scrollRightHeight: number;\n\n // 缩放比\n private scale: number;\n\n // 总滚动距离\n private sum = 0;\n\n // 初始 x 轴滚动距离\n private initialScrollX = 0;\n\n // 初始 y 轴滚动距离\n private initialScrollY = 0;\n\n // 隐藏滚动条的时延\n private hideTimeout: number | undefined;\n\n // 浏览器视图宽度\n get clientViewportWidth(): number {\n return this.viewportWidth * this.scale - BLOCK_OFFSET;\n }\n\n // 浏览器视图高度\n get clientViewportHeight(): number {\n return this.viewportHeight * this.scale - BLOCK_OFFSET;\n }\n\n // 视图的完整宽度\n get viewportFullWidth(): number {\n return this.mostLeft - this.mostRight;\n }\n\n // 视图的完整高度\n get viewportFullHeight(): number {\n return this.mostTop - this.mostBottom;\n }\n\n // 视图的可移动宽度\n get viewportMoveWidth(): number {\n return this.mostLeft - this.mostRight + this.width;\n }\n\n // 视图的可移动高度\n get viewportMoveHeight(): number {\n return this.mostTop - this.mostBottom + this.height;\n }\n\n getToLeft(scrollX: number): number {\n return ((scrollX - this.mostRight) / this.viewportMoveWidth) * this.clientViewportWidth;\n }\n\n getToTop(scrollY: number): number {\n return ((scrollY - this.mostBottom) / this.viewportMoveHeight) * this.clientViewportHeight;\n }\n\n clickRightScrollBar(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n const ratio = 1 - (e?.y || 0) / this.clientViewportHeight;\n const scrollY = (this.mostTop - this.viewportFullHeight * ratio) * this.scale;\n\n // 滚动到指定位置\n this.playgroundConfigEntity.scroll(\n {\n scrollY,\n },\n false,\n );\n }\n\n clickBottomScrollBar(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n const ratio = 1 - (e?.x || 0) / this.clientViewportWidth;\n const scrollX = (this.mostLeft - this.viewportFullWidth * ratio) * this.scale;\n\n // 滚动到指定位置\n this.playgroundConfigEntity.scroll(\n {\n scrollX,\n },\n false,\n );\n }\n\n onBoardingToast() {\n // onBoarding 逻辑,滚动条指示优化,弹出 toast\n this.events?.dragStart();\n }\n\n protected bottomGrabDragger = new PlaygroundDrag({\n onDragStart: e => {\n this.config.updateCursor('grabbing');\n this.sum = 0;\n this.initialScrollX = this.config.getViewport().x;\n this.onBoardingToast();\n },\n onDrag: e => {\n this.sum += e.movingDelta.x;\n this.playgroundConfigEntity.scroll(\n {\n scrollX:\n (this.initialScrollX +\n (this.sum * this.viewportFullWidth) /\n (this.clientViewportWidth - this.scrollBottomWidth)) *\n this.scale,\n },\n false,\n );\n },\n onDragEnd: e => {\n this.config.updateCursor('default');\n },\n });\n\n protected rightGrabDragger = new PlaygroundDrag({\n onDragStart: e => {\n this.config.updateCursor('grabbing');\n this.sum = 0;\n this.initialScrollY = this.config.getViewport().y;\n this.onBoardingToast();\n },\n onDrag: e => {\n this.sum += e.movingDelta.y;\n this.playgroundConfigEntity.scroll(\n {\n scrollY:\n (this.initialScrollY +\n (this.sum * this.viewportFullHeight) /\n (this.clientViewportHeight - this.scrollRightHeight)) *\n this.scale,\n },\n false,\n );\n },\n onDragEnd: e => {\n this.config.updateCursor('default');\n },\n });\n\n protected changeScrollBarVisibility(scrollBar: HTMLDivElement, status: ScrollBarVisibility) {\n const addClassName =\n status === ScrollBarVisibility.Show\n ? 'gedit-playground-scroll-show'\n : 'gedit-playground-scroll-hidden';\n const delClassName =\n status === ScrollBarVisibility.Show\n ? 'gedit-playground-scroll-hidden'\n : 'gedit-playground-scroll-show';\n domUtils.addClass(scrollBar, addClassName);\n domUtils.delClass(scrollBar, delClassName);\n }\n\n onReady() {\n if (!this.options.getBounds) {\n this.options = {\n getBounds: () => {\n const document = this.flowDocument;\n if (!document) return Rectangle.EMPTY;\n document.transformer.refresh();\n return document.root.getData(FlowNodeTransformData)!.bounds;\n },\n showScrollBars: 'whenScrolling',\n };\n }\n this.pipelineNode.parentNode!.appendChild(this.rightScrollBar);\n this.pipelineNode.parentNode!.appendChild(this.rightScrollBarBlock);\n this.pipelineNode.parentNode!.appendChild(this.bottomScrollBar);\n this.pipelineNode.parentNode!.appendChild(this.bottomScrollBarBlock);\n // 模拟滚动条点击时的滚动\n this.rightScrollBar.onclick = this.clickRightScrollBar.bind(this);\n this.bottomScrollBar.onclick = this.clickBottomScrollBar.bind(this);\n\n // 滚动时才显示滚动条 则要监听鼠标事件 hover 的时候也要显示\n if (this.options.showScrollBars === 'whenScrolling') {\n this.rightScrollBar.addEventListener('mouseenter', (e: MouseEvent) => {\n this.changeScrollBarVisibility(this.rightScrollBarBlock, ScrollBarVisibility.Show);\n });\n this.rightScrollBar.addEventListener('mouseleave', (e: MouseEvent) => {\n this.changeScrollBarVisibility(this.rightScrollBarBlock, ScrollBarVisibility.Hidden);\n });\n this.bottomScrollBar.addEventListener('mouseenter', (e: MouseEvent) => {\n this.changeScrollBarVisibility(this.bottomScrollBarBlock, ScrollBarVisibility.Show);\n });\n this.bottomScrollBar.addEventListener('mouseleave', (e: MouseEvent) => {\n this.changeScrollBarVisibility(this.bottomScrollBarBlock, ScrollBarVisibility.Hidden);\n });\n }\n\n // 监听拖拽滚动\n this.bottomScrollBarBlock.addEventListener('mousedown', (e: MouseEvent) => {\n this.bottomGrabDragger.start(e.clientX, e.clientY);\n e.stopPropagation();\n });\n this.rightScrollBarBlock.addEventListener('mousedown', (e: MouseEvent) => {\n this.rightGrabDragger.start(e.clientX, e.clientY);\n e.stopPropagation();\n });\n }\n\n autorun() {\n // if (this.documentTransformer.loading) return null\n // this.documentTransformer.refresh()\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n }\n\n // 中间活动区域宽高\n const viewportBounds = getScrollViewport(\n {\n scrollX: this.config.config.scrollX,\n scrollY: this.config.config.scrollY,\n },\n this.config,\n );\n\n // 画布视区宽高\n const viewport = this.config.getViewport();\n // 计算视区的时候预留 11px,防止右下角滚动条重叠\n this.viewportWidth = viewport.width;\n this.viewportHeight = viewport.height;\n // 中间部分元素的宽高\n const rootBounds = this.options.getBounds(); // this.document.root.getData(FlowNodeTransformData)!.bounds\n this.width = rootBounds?.width || 0;\n this.height = rootBounds?.height || 0;\n // 中间部分元素的左右间距\n const paddingLeftRight = (this.viewportWidth - viewportBounds.width) / 2 - BORDER_WIDTH;\n // 中间部分元素的上下间距\n const paddingTopBottom = (this.viewportHeight - viewportBounds.height) / 2 - BORDER_WIDTH;\n\n // 画布可滚动总长度\n const canvasTotalWidth = this.width + viewportBounds.width;\n const canvasTotalHeight = this.height + viewportBounds.height;\n // 根据当前滚动距离计算 滚动条距离边界间距\n // 中间元素初始的偏移位置:\n const initialOffsetX = rootBounds.x;\n const initialOffsetY = rootBounds.y;\n // 最左边的位置\n this.mostLeft = this.width + initialOffsetX - paddingLeftRight;\n // 最右边的位置\n this.mostRight = this.mostLeft - canvasTotalWidth;\n // 最上面的位置\n this.mostTop = this.height + initialOffsetY - paddingTopBottom;\n // 最下面的位置\n this.mostBottom = this.mostTop - canvasTotalHeight;\n\n this.scale = this.config.finalScale;\n\n const calcViewportWidth = this.clientViewportWidth;\n const calcViewportHeight = this.clientViewportHeight;\n // 计算公式:\n // 可视区域 - 滚动条的长度 / 可视区域 = 可视区域 / 画布可滚动距离\n // 底部滚动条宽度\n this.scrollBottomWidth =\n calcViewportWidth -\n (calcViewportWidth * (this.mostLeft - this.mostRight)) / this.viewportMoveWidth;\n // 右侧滚动条高度\n this.scrollRightHeight =\n calcViewportHeight -\n (calcViewportHeight * (this.mostTop - this.mostBottom)) / this.viewportMoveHeight;\n\n // 计算滚动条滚动位移的距离\n // 可滚动区域:canvasTotalWidth - scrollBottomWidth\n const bottomBarToLeft = this.getToLeft(viewport.x);\n const rightBarToTop = this.getToTop(viewport.y);\n\n // 设置右侧的滚动条内的 block 样式\n domUtils.setStyle(this.rightScrollBarBlock, {\n right: 2,\n top: rightBarToTop,\n background: '#1F2329',\n zIndex: 10,\n height: this.scrollRightHeight,\n width: SCROLL_BAR_WIDTH,\n });\n // 设置底部的滚动条内的 block 样式\n domUtils.setStyle(this.bottomScrollBarBlock, {\n left: bottomBarToLeft,\n bottom: 2,\n background: '#1F2329',\n zIndex: 10,\n height: SCROLL_BAR_WIDTH,\n width: this.scrollBottomWidth,\n });\n this.changeScrollBarVisibility(this.rightScrollBarBlock, ScrollBarVisibility.Show);\n this.changeScrollBarVisibility(this.bottomScrollBarBlock, ScrollBarVisibility.Show);\n\n // 滚动时才显示滚动条\n // 定时器在 1s 后隐藏滚动条\n if (this.options.showScrollBars === 'whenScrolling') {\n this.hideTimeout = window.setTimeout(() => {\n this.changeScrollBarVisibility(this.rightScrollBarBlock, ScrollBarVisibility.Hidden);\n this.changeScrollBarVisibility(this.bottomScrollBarBlock, ScrollBarVisibility.Hidden);\n this.hideTimeout = undefined;\n }, 1000);\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport ReactDOM from 'react-dom';\nimport React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { Rectangle, Xor } from '@flowgram.ai/utils';\nimport {\n FlowDocument,\n FlowNodeBaseType,\n FlowNodeEntity,\n FlowNodeRenderData,\n FlowNodeTransformData,\n FlowNodeTransitionData,\n FlowRendererStateEntity,\n type LABEL_SIDE_TYPE,\n FlowDragService,\n FlowNodeJSON,\n} from '@flowgram.ai/document';\nimport {\n EditorState,\n EditorStateConfigEntity,\n Layer,\n observeEntity,\n observeEntityDatas,\n PlaygroundConfigEntity,\n} from '@flowgram.ai/core';\nimport { PlaygroundDrag } from '@flowgram.ai/core';\n\nimport {\n type FlowRendererComponent,\n FlowRendererKey,\n FlowRendererRegistry,\n} from '../flow-renderer-registry';\nimport { type CollisionRetType, FlowDragEntity } from '../entities/flow-drag-entity';\nimport { FlowSelectConfigEntity } from '../entities';\n\n// 移动超过一定距离后触发拖拽生效\nconst DRAG_OFFSET = 10;\n\nconst DEFAULT_DRAG_OFFSET_X = 8;\nconst DEFAULT_DRAG_OFFSET_Y = 8;\n\ninterface Position {\n x: number;\n y: number;\n}\n\ntype StartDragProps = {\n dragEntities?: FlowNodeEntity[];\n} & Xor<\n {\n dragStartEntity: FlowNodeEntity;\n },\n {\n dragJSON: FlowNodeJSON;\n isBranch?: boolean;\n onCreateNode: (json: FlowNodeJSON, dropEntity: FlowNodeEntity) => Promise<FlowNodeEntity>;\n }\n>;\n\nexport interface FlowDragOptions {\n onDrop?: (opts: { dragNodes: FlowNodeEntity[]; dropNode: FlowNodeEntity }) => void;\n canDrop?: (\n opts: {\n dropNode: FlowNodeEntity;\n isBranch?: boolean;\n } & Xor<\n {\n dragNodes: FlowNodeEntity[];\n },\n {\n dragJSON: FlowNodeJSON;\n }\n >\n ) => boolean;\n}\n/**\n * 监听节点的激活状态\n */\n@injectable()\nexport class FlowDragLayer extends Layer<FlowDragOptions> {\n @inject(FlowDocument) readonly document: FlowDocument;\n\n @inject(FlowDragService) readonly flowDragService: FlowDragService;\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransformData) transforms: FlowNodeTransformData[];\n\n @observeEntity(EditorStateConfigEntity)\n protected editorStateConfig: EditorStateConfigEntity;\n\n @observeEntity(PlaygroundConfigEntity)\n protected playgroundConfigEntity: PlaygroundConfigEntity;\n\n @observeEntity(FlowDragEntity)\n protected flowDragConfigEntity: FlowDragEntity;\n\n @observeEntity(FlowRendererStateEntity)\n protected flowRenderStateEntity: FlowRendererStateEntity;\n\n @observeEntity(FlowSelectConfigEntity)\n protected selectConfigEntity: FlowSelectConfigEntity;\n\n private initialPosition: Position;\n\n private disableDragScroll: Boolean = false;\n\n private dragJSON?: FlowNodeJSON;\n\n private onCreateNode?: (\n json: FlowNodeJSON,\n dropEntity: FlowNodeEntity\n ) => Promise<FlowNodeEntity>;\n\n dragOffset = {\n x: DEFAULT_DRAG_OFFSET_X,\n y: DEFAULT_DRAG_OFFSET_Y,\n };\n\n get transitions(): FlowNodeTransitionData[] {\n const result: FlowNodeTransitionData[] = [];\n this.document.traverse((entity) => {\n result.push(entity.getData<FlowNodeTransitionData>(FlowNodeTransitionData)!);\n });\n return result;\n }\n\n @inject(FlowRendererRegistry) readonly rendererRegistry: FlowRendererRegistry;\n\n get dragStartEntity() {\n return this.flowRenderStateEntity.getDragStartEntity()!;\n }\n\n set dragStartEntity(entity: FlowNodeEntity | undefined) {\n this.flowRenderStateEntity.setDragStartEntity(entity);\n }\n\n get dragEntities() {\n return this.flowRenderStateEntity.getDragEntities()!;\n }\n\n set dragEntities(entities: FlowNodeEntity[]) {\n this.flowRenderStateEntity.setDragEntities(entities);\n }\n\n private dragNodeComp: FlowRendererComponent;\n\n containerRef = React.createRef<HTMLDivElement>();\n\n draggingNodeMask = document.createElement('div');\n\n protected isGrab(): boolean {\n const currentState = this.editorStateConfig.getCurrentState();\n return currentState === EditorState.STATE_GRAB;\n }\n\n setDraggingStatus(status: boolean): void {\n if (this.flowDragService.nodeDragIdsWithChildren.length) {\n this.flowDragService.nodeDragIdsWithChildren.forEach((_id) => {\n const node = this.entityManager.getEntityById(_id);\n const data = node?.getData<FlowNodeRenderData>(FlowNodeRenderData)!;\n data.dragging = status;\n });\n }\n this.flowRenderStateEntity.setDragging(status);\n }\n\n dragEnable(e: MouseEvent) {\n return (\n Math.abs(e.clientX - this.initialPosition.x) > DRAG_OFFSET ||\n Math.abs(e.clientY - this.initialPosition.y) > DRAG_OFFSET\n );\n }\n\n handleMouseMove(event: MouseEvent) {\n if ((this.dragJSON || this.dragStartEntity) && this.dragEnable(event)) {\n // 变更拖拽节点的位置\n this.setDraggingStatus(true);\n const scale = this.playgroundConfigEntity.finalScale;\n\n if (this.containerRef.current) {\n const dragNode = this.containerRef.current.children?.[0];\n const clientBounds = this.playgroundConfigEntity.getClientBounds();\n const dragBlockX =\n event.clientX -\n (this.pipelineNode.offsetLeft || 0) -\n clientBounds.x -\n (dragNode.clientWidth - this.dragOffset.x) * scale;\n const dragBlockY =\n event.clientY -\n (this.pipelineNode.offsetTop || 0) -\n clientBounds.y -\n (dragNode.clientHeight - this.dragOffset.y) * scale;\n\n // 获取节点状态是节点类型还是分支类型\n const isBranch = this.flowDragService.isDragBranch;\n\n // 节点类型拖拽碰撞检测\n const draggingRect = new Rectangle(\n dragBlockX,\n dragBlockY,\n dragNode.clientWidth * scale,\n dragNode.clientHeight * scale\n );\n let side: LABEL_SIDE_TYPE | undefined;\n const collisionTransition = this.transitions.find((transition) => {\n // 过滤已被折叠 label\n if (transition?.entity?.parent?.collapsed) {\n return false;\n }\n const { hasCollision, labelOffsetType } = this.flowDragConfigEntity.isCollision(\n transition,\n draggingRect,\n isBranch\n ) as CollisionRetType;\n side = labelOffsetType;\n return hasCollision;\n });\n if (\n collisionTransition &&\n (isBranch\n ? this.flowDragService.isDroppableBranch(collisionTransition.entity, side)\n : this.flowDragService.isDroppableNode(collisionTransition.entity)) &&\n (!this.options.canDrop ||\n this.options.canDrop({\n dragNodes: this.dragEntities,\n dropNode: collisionTransition.entity,\n isBranch,\n }))\n ) {\n // 设置碰撞的 label id\n this.flowRenderStateEntity.setNodeDroppingId(collisionTransition.entity.id);\n } else {\n // 没有碰撞清空 highlight\n this.flowRenderStateEntity.setNodeDroppingId('');\n }\n\n // 判断拖拽种类是节点类型还是分支类型\n this.flowRenderStateEntity.setDragLabelSide(side);\n\n this.containerRef.current.style.visibility = 'visible';\n this.pipelineNode.parentElement!.appendChild(this.draggingNodeMask);\n\n this.containerRef.current.style.left = `${\n dragBlockX + this.pipelineNode.offsetLeft + clientBounds.x + window.scrollX\n }px`;\n this.containerRef.current.style.top = `${\n dragBlockY + this.pipelineNode.offsetTop + clientBounds.y + window.scrollY\n }px`;\n this.containerRef.current.style.transformOrigin = 'top left';\n this.containerRef.current.style.transform = `scale(${scale})`;\n\n if (!this.disableDragScroll) {\n this.flowDragConfigEntity.scrollDirection(event, dragBlockX, dragBlockY);\n }\n }\n }\n }\n\n async handleMouseUp() {\n this.setDraggingStatus(false);\n if (this.dragStartEntity || this.dragJSON) {\n const activatedNodeId = this.flowDragService.dropNodeId;\n\n if (activatedNodeId) {\n if (this.flowDragService.isDragBranch) {\n if (this.dragJSON) {\n await this.flowDragService.dropCreateNode(this.dragJSON, this.onCreateNode);\n } else {\n this.flowDragService.dropBranch();\n }\n } else {\n if (this.dragJSON) {\n await this.flowDragService.dropCreateNode(this.dragJSON, this.onCreateNode);\n } else {\n this.flowDragService.dropNode();\n }\n this.selectConfigEntity.clearSelectedNodes();\n }\n }\n\n // 清空碰撞 id\n this.flowRenderStateEntity.setNodeDroppingId('');\n this.flowRenderStateEntity.setDragLabelSide();\n this.flowRenderStateEntity.setIsBranch(false);\n this.dragStartEntity = undefined;\n this.dragEntities = [];\n\n // 滚动停止\n this.flowDragConfigEntity.stopAllScroll();\n }\n\n this.disableDragScroll = false;\n this.dragJSON = undefined;\n if (this.containerRef.current) {\n this.containerRef.current.style.visibility = 'hidden';\n if (this.pipelineNode.parentElement!.contains(this.draggingNodeMask)) {\n this.pipelineNode.parentElement!.removeChild(this.draggingNodeMask);\n }\n }\n }\n\n protected _dragger = new PlaygroundDrag({\n onDrag: (e) => {\n this.handleMouseMove(e);\n },\n onDragEnd: () => {\n this.handleMouseUp();\n },\n stopGlobalEventNames: ['contextmenu'],\n });\n\n /**\n * 开始拖拽事件\n * @param e\n */\n async startDrag(\n e: { clientX: number; clientY: number },\n {\n dragStartEntity: startEntityFromProps,\n dragEntities,\n dragJSON,\n isBranch,\n onCreateNode,\n }: StartDragProps,\n options?: {\n dragOffsetX?: number;\n dragOffsetY?: number;\n disableDragScroll?: boolean;\n }\n ) {\n // 1. 避免按住空格拖动滚动场景覆盖,context disabled 会出现在画布编辑被抢锁时候触发\n if (this.isGrab() || this.config.disabled || this.config.readonly) {\n return;\n }\n\n this.disableDragScroll = Boolean(options?.disableDragScroll);\n this.dragJSON = dragJSON;\n this.onCreateNode = onCreateNode;\n this.flowRenderStateEntity.setIsBranch(Boolean(isBranch));\n\n this.dragOffset.x = options?.dragOffsetX || DEFAULT_DRAG_OFFSET_X;\n this.dragOffset.y = options?.dragOffsetY || DEFAULT_DRAG_OFFSET_Y;\n\n const type = startEntityFromProps?.flowNodeType || dragJSON?.type;\n\n const isIcon = type === FlowNodeBaseType.BLOCK_ICON;\n const isOrderIcon = type === FlowNodeBaseType.BLOCK_ORDER_ICON;\n\n const dragStartEntity =\n isIcon || isOrderIcon ? startEntityFromProps!.parent! : startEntityFromProps;\n\n // 部分节点不支持拖拽\n if (dragStartEntity && !dragStartEntity!.getData(FlowNodeRenderData).draggable) {\n return;\n }\n\n this.initialPosition = {\n x: e.clientX,\n y: e.clientY,\n };\n\n this.dragStartEntity = dragStartEntity;\n this.dragEntities = dragEntities || (this.dragStartEntity ? [this.dragStartEntity!] : []);\n\n return this._dragger.start(e.clientX, e.clientY);\n }\n\n onReady() {\n this.draggingNodeMask.style.width = '100%';\n this.draggingNodeMask.style.height = '100%';\n this.draggingNodeMask.style.position = 'absolute';\n this.draggingNodeMask.classList.add('dragging-node');\n this.draggingNodeMask.style.zIndex = '99';\n this.draggingNodeMask.style.cursor = 'pointer';\n\n this.dragNodeComp = this.rendererRegistry.getRendererComponent(FlowRendererKey.DRAG_NODE);\n // 监听拖入事件\n if (this.options.onDrop) {\n this.toDispose.push(this.flowDragService.onDrop(this.options.onDrop));\n }\n }\n\n dispose(): void {\n this._dragger.dispose();\n super.dispose();\n }\n\n render() {\n // styled-component component type 为 any\n const DragComp: any = this.dragNodeComp.renderer;\n\n return ReactDOM.createPortal(\n <div\n ref={this.containerRef}\n style={{ position: 'absolute', zIndex: 99999, visibility: 'hidden' }}\n onMouseEnter={(e) => e.stopPropagation()}\n >\n <DragComp\n dragJSON={this.dragJSON}\n dragStart={this.dragStartEntity}\n dragNodes={this.dragEntities}\n />\n </div>,\n document.body\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { domUtils, PositionSchema } from '@flowgram.ai/utils';\nimport { FlowDocument, FlowNodeEntity, FlowNodeTransformData } from '@flowgram.ai/document';\nimport {\n ContextMenuService,\n EditorState,\n EditorStateConfigEntity,\n Layer,\n LayerOptions,\n observeEntity,\n PipelineLayerPriority,\n PlaygroundConfigEntity,\n PlaygroundDrag,\n SelectionService,\n} from '@flowgram.ai/core';\n\nimport { FlowSelectConfigEntity, SelectorBoxConfigEntity } from '../entities';\n\nexport interface FlowSelectorBoxOptions extends LayerOptions {\n /**\n * 默认不提供则为点击空白地方可以框选\n * @param e\n * @param entity\n */\n canSelect?: (e: MouseEvent, entity: SelectorBoxConfigEntity) => boolean;\n}\n/**\n * 流程选择框\n */\n@injectable()\nexport class FlowSelectorBoxLayer extends Layer<FlowSelectorBoxOptions> {\n @inject(FlowDocument)\n protected flowDocument: FlowDocument;\n\n @inject(ContextMenuService)\n readonly contextMenuService: ContextMenuService;\n\n @observeEntity(PlaygroundConfigEntity)\n protected playgroundConfigEntity: PlaygroundConfigEntity;\n\n @inject(SelectionService) readonly selectionService: SelectionService;\n\n @observeEntity(SelectorBoxConfigEntity)\n protected selectorBoxConfigEntity: SelectorBoxConfigEntity;\n\n @observeEntity(FlowSelectConfigEntity)\n protected selectConfigEntity: FlowSelectConfigEntity;\n\n @observeEntity(EditorStateConfigEntity)\n protected editorStateConfig: EditorStateConfigEntity;\n\n readonly node = domUtils.createDivWithClass('gedit-selector-box-layer');\n\n /**\n * 选择框\n */\n protected selectorBox = this.createDOMCache('gedit-selector-box');\n\n /**\n * 用于遮挡鼠标,避免触发 hover\n */\n protected selectorBoxBlock = this.createDOMCache('gedit-selector-box-block');\n\n protected transformVisibles: FlowNodeTransformData[];\n\n /**\n * 拖动选择框\n */\n protected selectboxDragger = new PlaygroundDrag({\n onDragStart: (e) => {\n this.selectConfigEntity.clearSelectedNodes();\n const mousePos = this.playgroundConfigEntity.getPosFromMouseEvent(e);\n this.transformVisibles = this.flowDocument\n .getRenderDatas(FlowNodeTransformData, false)\n .filter((transform) => {\n const { entity } = transform;\n if (entity.originParent) {\n return (\n this.nodeSelectable(entity, mousePos) &&\n this.nodeSelectable(entity.originParent, mousePos)\n );\n }\n return this.nodeSelectable(entity, mousePos);\n });\n this.selectorBoxConfigEntity.setDragInfo(e);\n this.updateSelectorBox(this.selectorBoxConfigEntity);\n },\n onDrag: (e) => {\n this.selectorBoxConfigEntity.setDragInfo(e);\n // 更新选择框\n this.selectConfigEntity.selectFromBounds(\n this.selectorBoxConfigEntity.toRectangle(this.playgroundConfigEntity.finalScale),\n this.transformVisibles\n );\n this.updateSelectorBox(this.selectorBoxConfigEntity);\n },\n onDragEnd: (e) => {\n this.selectorBoxConfigEntity.setDragInfo(e);\n this.transformVisibles.length = 0;\n this.updateSelectorBox(this.selectorBoxConfigEntity);\n },\n });\n\n onReady(): void {\n if (!this.options.canSelect) {\n this.options.canSelect = (e: MouseEvent) => {\n const target = e.target as HTMLElement | undefined;\n // 默认点击空白地方可以框选\n return target === this.pipelineNode || target === this.playgroundNode;\n };\n }\n // 将选中的节点同步到全局\n // TODO 后续要统一到 selection service\n this.toDispose.pushAll([\n this.selectConfigEntity.onConfigChanged(() => {\n this.selectionService.selection = this.selectConfigEntity.selectedNodes;\n }),\n this.selectionService.onSelectionChanged(() => {\n const selectedNodes = this.selectionService.selection.filter(\n (entity) => entity instanceof FlowNodeEntity\n );\n\n this.selectConfigEntity.selectedNodes = selectedNodes as FlowNodeEntity[];\n }),\n ]);\n this.listenPlaygroundEvent(\n 'mousedown',\n (e: MouseEvent): boolean | undefined => {\n if (!this.isEnabled()) return;\n // 自定义拦截选择框事件\n if (this.options.canSelect && !this.options.canSelect(e, this.selectorBoxConfigEntity)) {\n return;\n }\n\n const currentState = this.editorStateConfig.getCurrentState();\n\n // 鼠标友好模式,框选后,再次点击其他地方或者框选其他地方,需要清空已有选择的节点\n if (currentState === EditorState.STATE_MOUSE_FRIENDLY_SELECT) {\n this.selectConfigEntity.clearSelectedNodes();\n }\n\n // const target = e.target as HTMLElement | undefined;\n // TODO 下边这些特化逻辑迁移到固定布局逻辑\n // const linesLayer = document.querySelector('.gedit-flow-lines-layer');\n // const toolsTarget = document.querySelector('.flow-canvas-selector-box-tools');\n // const isInTools = toolsTarget && (toolsTarget === target || toolsTarget.contains(target!));\n // 保证 service 更新后进行是否清除的计算\n // setTimeout(() => {\n // // 如果点击到选中区域的菜单栏\n // if (!isInTools && !this.contextMenuService.rightPanelVisible) {\n // // 取消之前的选择状态\n // this.selectConfigEntity.clearSelectedNodes();\n // }\n // }, 0);\n // if (\n // target === this.pipelineNode ||\n // target === this.playgroundNode // 点击空白区域\n // linesLayer?.contains(target!) // 点击 svg 线条\n // target?.classList.contains('flow-canvas-adder') || // 点击添加按钮的留白区域\n // target?.classList.contains('flow-canvas-block-icon') // 点击添加按钮的留白区域\n // ) {\n // return true;\n // }\n this.selectboxDragger.start(e.clientX, e.clientY, this.config);\n return true;\n },\n PipelineLayerPriority.BASE_LAYER\n );\n }\n\n isEnabled(): boolean {\n const currentState = this.editorStateConfig.getCurrentState();\n const isMouseFriendly = currentState === EditorState.STATE_MOUSE_FRIENDLY_SELECT;\n\n return (\n !this.config.disabled &&\n !this.config.readonly &&\n // 鼠标友好模式下,需要按下 shift 启动框选\n ((isMouseFriendly && this.editorStateConfig.isPressingShift) ||\n currentState === EditorState.STATE_SELECT) &&\n !this.selectorBoxConfigEntity.disabled\n );\n }\n\n /**\n * Destroy\n */\n dispose(): void {\n this.selectorBox.dispose();\n this.selectorBoxBlock.dispose();\n super.dispose();\n }\n\n protected updateSelectorBox(selector: SelectorBoxConfigEntity): void {\n const node = this.selectorBox.get();\n const block = this.selectorBoxBlock.get();\n // 非可用状态且在 moving 则关闭选择框\n if (!this.isEnabled() && selector.isMoving) {\n this.selectorBoxConfigEntity.collapse();\n }\n if (!this.isEnabled() || !selector.isMoving) {\n node.setStyle({\n display: 'none',\n });\n block.setStyle({\n display: 'none',\n });\n } else {\n node.setStyle({\n display: 'block',\n left: selector.position.x,\n top: selector.position.y,\n width: selector.size.width,\n height: selector.size.height,\n });\n // 这是遮挡滑块,防止触发节点 hover\n block.setStyle({\n display: 'block',\n left: selector.position.x - 10,\n top: selector.position.y - 10,\n width: selector.size.width + 20,\n height: selector.size.height + 20,\n });\n }\n }\n\n private nodeSelectable(node: FlowNodeEntity, mousePos: PositionSchema) {\n const selectable = node.getNodeMeta().selectable;\n if (typeof selectable === 'function') {\n return selectable(node, mousePos);\n } else {\n return selectable;\n }\n }\n\n // autorun(): void {\n // this.updateSelectorBox(this.selectorBoxConfigEntity);\n // }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport { Rectangle } from '@flowgram.ai/utils';\nimport { FlowNodeEntity, FlowNodeRenderData, FlowNodeTransformData } from '@flowgram.ai/document';\nimport {\n CommandRegistry,\n EditorState,\n EditorStateConfigEntity,\n Layer,\n LayerOptions,\n PlaygroundConfig,\n observeEntity,\n observeEntityDatas,\n} from '@flowgram.ai/core';\n\nimport { FlowRendererKey, FlowRendererRegistry } from '../flow-renderer-registry';\nimport { FlowSelectConfigEntity, SelectorBoxConfigEntity } from '../entities';\n\nexport interface SelectorBoxPopoverProps {\n bounds: Rectangle;\n config: PlaygroundConfig;\n flowSelectConfig: FlowSelectConfigEntity;\n commandRegistry: CommandRegistry;\n children?: React.ReactNode;\n}\n\nexport interface FlowSelectorBoundsLayerOptions extends LayerOptions {\n ignoreOneSelect?: boolean;\n ignoreChildrenLength?: boolean;\n boundsPadding?: number; // 边框留白,默认 10\n disableBackground?: boolean; // 禁用背景框\n backgroundClassName?: string; // 节点下边\n foregroundClassName?: string; // 节点上边\n SelectorBoxPopover?: React.FC<SelectorBoxPopoverProps>; // 选择框工具层\n CustomBoundsRenderer?: React.FC<SelectorBoxPopoverProps>; // 自定义渲染\n}\n\n/**\n * 流程节点被框选后的边界区域渲染\n */\n@injectable()\nexport class FlowSelectorBoundsLayer extends Layer<FlowSelectorBoundsLayerOptions> {\n @inject(FlowRendererRegistry) readonly rendererRegistry: FlowRendererRegistry;\n\n @inject(CommandRegistry) readonly commandRegistry: CommandRegistry;\n\n @observeEntity(FlowSelectConfigEntity)\n protected flowSelectConfigEntity: FlowSelectConfigEntity;\n\n @observeEntity(EditorStateConfigEntity)\n protected editorStateConfig: EditorStateConfigEntity;\n\n @observeEntity(SelectorBoxConfigEntity)\n protected selectorBoxConfigEntity: SelectorBoxConfigEntity;\n\n /**\n * 需要监听节点的展开和收起状态,重新绘制边框\n */\n @observeEntityDatas(FlowNodeEntity, FlowNodeRenderData)\n renderStates: FlowNodeRenderData[];\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransformData)\n _transforms: FlowNodeTransformData[];\n\n readonly node = domUtils.createDivWithClass('gedit-selector-bounds-layer');\n\n readonly selectBoundsBackground = domUtils.createDivWithClass('gedit-selector-bounds-background');\n\n onReady(): void {\n // 这个是覆盖到节点上边的,所以要比 flow-nodes-content-layer 大\n this.node!.style.zIndex = '20';\n const { firstChild } = this.pipelineNode;\n if (this.options.boundsPadding !== undefined) {\n this.flowSelectConfigEntity.boundsPadding = this.options.boundsPadding;\n }\n if (this.options.backgroundClassName) {\n this.selectBoundsBackground.classList.add(this.options.backgroundClassName);\n }\n // 这里创建一个空 layer 用于放背景\n const selectorBoundsLayer = domUtils.createDivWithClass('gedit-playground-layer');\n selectorBoundsLayer.appendChild(this.selectBoundsBackground);\n // 背景框需要在节点的下边\n this.pipelineNode.insertBefore(selectorBoundsLayer, firstChild);\n }\n\n onZoom(scale: number) {\n this.node!.style.transform = `scale(${scale})`;\n this.selectBoundsBackground.parentElement!.style.transform = `scale(${scale})`;\n }\n\n onViewportChange() {\n // 需要调整 bounds 菜单的位置\n this.render();\n }\n\n isEnabled(): boolean {\n const currentState = this.editorStateConfig.getCurrentState();\n return currentState === EditorState.STATE_SELECT;\n }\n\n // /**\n // * 渲染工具栏\n // */\n // renderCommandMenus(): JSX.Element[] {\n // return this.commandRegistry.commands\n // .filter(cmd => cmd.category === FlowRendererCommandCategory.SELECTOR_BOX)\n // .map(cmd => {\n // const CommandRenderer = this.rendererRegistry.getRendererComponent(\n // (cmd.icon as string) || cmd.id,\n // )?.renderer;\n //\n // return (\n // // eslint-disable-next-line react/jsx-filename-extension\n // <CommandRenderer\n // key={cmd.id}\n // disabled={!this.commandRegistry.isEnabled(cmd.id)}\n // command={cmd}\n // onClick={(e: any) => this.commandRegistry.executeCommand(cmd.id, e)}\n // />\n // );\n // })\n // .filter(c => c);\n // }\n\n render(): JSX.Element {\n const {\n ignoreOneSelect,\n ignoreChildrenLength,\n SelectorBoxPopover: SelectorBoxPopoverFromOpts,\n disableBackground,\n CustomBoundsRenderer,\n } = this.options;\n\n const bounds = this.flowSelectConfigEntity.getSelectedBounds();\n const selectedNodes = this.flowSelectConfigEntity.selectedNodes;\n\n const bg = this.selectBoundsBackground;\n const isDragging = !this.selectorBoxConfigEntity.isStart;\n\n if (\n bounds.width === 0 ||\n bounds.height === 0 ||\n // 选中单个的时候不显示\n (ignoreOneSelect &&\n selectedNodes.length === 1 &&\n // 选中的节点不包含多个子节点\n (ignoreChildrenLength || (selectedNodes[0] as FlowNodeEntity).childrenLength <= 1))\n ) {\n domUtils.setStyle(bg, {\n display: 'none',\n });\n return <></>;\n }\n if (CustomBoundsRenderer) {\n return (\n <CustomBoundsRenderer\n bounds={bounds}\n config={this.config}\n flowSelectConfig={this.flowSelectConfigEntity}\n commandRegistry={this.commandRegistry}\n />\n );\n }\n const style = {\n display: 'block',\n left: bounds.left,\n top: bounds.top,\n width: bounds.width,\n height: bounds.height,\n };\n if (!disableBackground) {\n domUtils.setStyle(bg, style);\n }\n let foregroundClassName = 'gedit-selector-bounds-foreground';\n if (this.options.foregroundClassName) {\n foregroundClassName += ' ' + this.options.foregroundClassName;\n }\n const SelectorBoxPopover =\n SelectorBoxPopoverFromOpts ||\n this.rendererRegistry.tryToGetRendererComponent(FlowRendererKey.SELECTOR_BOX_POPOVER)\n ?.renderer;\n if (!isDragging || !SelectorBoxPopover)\n return <div className={foregroundClassName} style={style} />;\n return (\n <SelectorBoxPopover\n bounds={bounds}\n config={this.config}\n flowSelectConfig={this.flowSelectConfigEntity}\n commandRegistry={this.commandRegistry}\n >\n <div className={foregroundClassName} style={style} />\n </SelectorBoxPopover>\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport {\n CommandRegistry,\n ContextMenuService,\n EditorState,\n EditorStateConfigEntity,\n Layer,\n observeEntity,\n PipelineLayerPriority,\n PlaygroundConfigEntity,\n SelectionService,\n} from '@flowgram.ai/core';\n\nimport {\n FlowRendererCommandCategory,\n FlowRendererKey,\n FlowRendererRegistry,\n} from '../flow-renderer-registry';\nimport { SelectorBoxConfigEntity } from '../entities/selector-box-config-entity';\nimport { FlowSelectConfigEntity } from '../entities/flow-select-config-entity';\n\n/**\n * 流程右键菜单\n */\n@injectable()\nexport class FlowContextMenuLayer extends Layer {\n @inject(CommandRegistry) readonly commandRegistry: CommandRegistry;\n\n @inject(FlowRendererRegistry) readonly rendererRegistry: FlowRendererRegistry;\n\n @inject(ContextMenuService) readonly contextMenuService: ContextMenuService;\n\n @observeEntity(FlowSelectConfigEntity) protected flowSelectConfigEntity: FlowSelectConfigEntity;\n\n @inject(SelectionService) readonly selectionService: SelectionService;\n\n @observeEntity(PlaygroundConfigEntity)\n protected playgroundConfigEntity: PlaygroundConfigEntity;\n\n @observeEntity(EditorStateConfigEntity)\n protected editorStateConfig: EditorStateConfigEntity;\n\n @observeEntity(SelectorBoxConfigEntity)\n protected selectorBoxConfigEntity: SelectorBoxConfigEntity;\n\n readonly node = domUtils.createDivWithClass('gedit-context-menu-layer');\n\n readonly nodeRef = React.createRef<{\n setVisible: (v: boolean) => void;\n }>();\n\n isEnabled(): boolean {\n const currentState = this.editorStateConfig.getCurrentState();\n return (\n !this.config.disabled &&\n !this.config.readonly &&\n currentState === EditorState.STATE_SELECT &&\n !this.selectorBoxConfigEntity.disabled\n );\n }\n\n onReady(): void {\n // 这个是覆盖到节点上边的,所以要比 flow-nodes-content-layer 大\n this.node!.style.zIndex = '30';\n this.node!.style.display = 'block';\n // 监听鼠标右键\n this.toDispose.pushAll([\n this.listenPlaygroundEvent(\n 'contextmenu',\n (e: MouseEvent): boolean | undefined => {\n if (!this.isEnabled()) return;\n this.contextMenuService.rightPanelVisible = true;\n const bounds = this.flowSelectConfigEntity.getSelectedBounds();\n if (bounds.width === 0 || bounds.height === 0) {\n return;\n }\n e.stopPropagation();\n e.preventDefault();\n\n this.nodeRef.current?.setVisible(true);\n const clientBounds = this.playgroundConfigEntity.getClientBounds();\n const dragBlockX = e.clientX - (this.pipelineNode.offsetLeft || 0) - clientBounds.x;\n const dragBlockY = e.clientY - (this.pipelineNode.offsetTop || 0) - clientBounds.y;\n this.node.style.left = `${dragBlockX}px`;\n this.node.style.top = `${dragBlockY}px`;\n },\n PipelineLayerPriority.BASE_LAYER\n ),\n this.listenPlaygroundEvent('mousedown', () => {\n this.nodeRef.current?.setVisible(false);\n this.contextMenuService.rightPanelVisible = false;\n }),\n ]);\n }\n\n onScroll() {\n this.nodeRef.current?.setVisible(false);\n }\n\n onZoom() {\n this.nodeRef.current?.setVisible(false);\n }\n\n /**\n * Destroy\n */\n dispose(): void {\n super.dispose();\n }\n\n /**\n * 渲染工具栏\n */\n renderCommandMenus(): JSX.Element[] {\n return this.commandRegistry.commands\n .filter((cmd) => cmd.category === FlowRendererCommandCategory.SELECTOR_BOX)\n .map((cmd) => {\n const CommandRenderer = this.rendererRegistry.getRendererComponent(\n (cmd.icon as string) || cmd.id\n )?.renderer;\n return (\n <CommandRenderer\n key={cmd.id}\n command={cmd}\n isContextMenu\n disabled={!this.commandRegistry.isEnabled(cmd.id)}\n onClick={(e: any) => this.commandRegistry.executeCommand(cmd.id, e)}\n />\n );\n })\n .filter((c) => c);\n }\n\n render(): JSX.Element {\n const SelectorBoxPopover = this.rendererRegistry.getRendererComponent(\n FlowRendererKey.CONTEXT_MENU_POPOVER\n ).renderer;\n return <SelectorBoxPopover ref={this.nodeRef} content={this.renderCommandMenus()} />;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { FlowDocument, FlowNodeTransformData } from '@flowgram.ai/document';\nimport { Layer } from '@flowgram.ai/core';\nimport { ScrollSchema } from '@flowgram.ai/utils';\n\nimport { scrollLimit } from '../utils';\n\n/**\n * 控制滚动边界\n */\n@injectable()\nexport class FlowScrollLimitLayer extends Layer {\n @inject(FlowDocument) readonly document: FlowDocument;\n\n getInitScroll(): ScrollSchema {\n return this.document.layout.getInitScroll(this.pipelineNode.getBoundingClientRect());\n }\n\n onReady(): void {\n const initScroll = () => this.getInitScroll();\n this.config.updateConfig(initScroll());\n this.config.addScrollLimit(scroll =>\n scrollLimit(\n scroll,\n [this.document.root.getData(FlowNodeTransformData)!.bounds],\n this.config,\n initScroll,\n ),\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ContainerModule } from 'inversify';\n\nimport { FlowRendererResizeObserver } from './flow-renderer-resize-observer';\nimport { FlowRendererRegistry } from './flow-renderer-registry';\n\nexport const FlowRendererContainerModule = new ContainerModule(bind => {\n bind(FlowRendererRegistry).toSelf().inSingletonScope();\n bind(FlowRendererResizeObserver).toSelf().inSingletonScope();\n});\n"],"mappings":"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","names":["import_document","import_core","import_document","import_document","import_core","import_utils","import_core","import_utils","import_inversify","import_utils","import_document","import_core","import_utils","import_lodash_es","import_inversify","import_utils","import_document","import_core","import_inversify","import_core","FlowRendererComponentType","FlowRendererKey","FlowTextKey","FlowRendererCommandCategory","React","ReactDOM","import_react","import_lodash_es","import_inversify","import_utils","import_document","import_core","import_react","import_utils","import_document","import_react","React","import_react","import_lodash_es","import_utils","import_core","import_react","React","import_react","React","React","import_react","React","React","React","import_react","import_lodash_es","import_inversify","import_utils","import_document","import_core","import_react","import_utils","import_document","import_react","import_document","import_react","import_document","React","import_react","import_document","import_core","React","React","import_react","import_document","import_core","getFlowRenderKey","React","React","React","import_inversify","import_utils","import_document","import_core","import_utils","import_inversify","import_document","import_core","import_utils","document","import_react_dom","import_react","import_inversify","import_utils","import_document","import_core","React","ReactDOM","import_inversify","import_utils","import_document","import_core","import_react","import_inversify","import_utils","import_document","import_core","React","import_react","import_inversify","import_utils","import_core","React","import_inversify","import_document","import_core","import_inversify"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/entities/flow-drag-entity.tsx","../src/components/utils.tsx","../src/hooks/use-base-color.ts","../src/entities/flow-select-config-entity.tsx","../src/utils/find-selected-nodes.ts","../src/entities/selector-box-config-entity.ts","../src/layers/flow-nodes-transform-layer.tsx","../src/flow-renderer-resize-observer.ts","../src/utils/element.ts","../src/layers/flow-nodes-content-layer.tsx","../src/flow-renderer-registry.ts","../src/flow-renderer-contribution.ts","../src/layers/flow-lines-layer.tsx","../src/components/LinesRenderer.tsx","../src/components/StraightLine.tsx","../src/components/RoundedTurningLine.tsx","../src/components/MarkerArrow.tsx","../src/components/MarkerActivatedArrow.tsx","../src/components/CustomLine.tsx","../src/layers/flow-labels-layer.tsx","../src/components/LabelsRenderer.tsx","../src/components/CollapseAdder.tsx","../src/components/Collapse.tsx","../src/components/Adder.tsx","../src/components/BranchDraggableRenderer.tsx","../src/layers/flow-debug-layer.tsx","../src/utils/scroll-limit.ts","../src/utils/scroll-bar-events.tsx","../src/layers/flow-scroll-bar-layer.tsx","../src/layers/flow-drag-layer.tsx","../src/layers/flow-selector-box-layer.tsx","../src/layers/flow-selector-bounds-layer.tsx","../src/layers/flow-context-menu-layer.tsx","../src/layers/flow-scroll-limit-layer.tsx","../src/flow-renderer-container-module.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport * from './entities';\nexport * from './layers';\nexport * from './flow-renderer-contribution';\nexport * from './flow-renderer-registry';\nexport * from './flow-renderer-container-module';\n\nexport { ScrollBarEvents } from './utils';\nexport { MARK_ARROW_ID } from './components/MarkerArrow';\nexport { MARK_ACTIVATED_ARROW_ID } from './components/MarkerActivatedArrow';\nexport { useBaseColor } from './hooks/use-base-color';\nexport { createLines } from './components/LinesRenderer';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Rectangle } from '@flowgram.ai/utils';\nimport {\n type FlowNodeTransitionData,\n FlowTransitionLabelEnum,\n LABEL_SIDE_TYPE,\n} from '@flowgram.ai/document';\nimport { ConfigEntity, type EntityOpts, PlaygroundConfigEntity } from '@flowgram.ai/core';\n\nimport { DEFAULT_LABEL_ACTIVATE_HEIGHT } from '../components/utils';\n\nconst BRANCH_HOVER_HEIGHT = 64;\n\ninterface FlowDragEntityConfig extends EntityOpts {}\n\nenum ScrollDirection {\n TOP,\n BOTTOM,\n LEFT,\n RIGHT,\n}\n\nconst SCROLL_DELTA = 4;\n\nconst SCROLL_INTERVAL = 20;\n\nconst SCROLL_BOUNDING = 20;\n\nconst EDITOR_LEFT_BAR_WIDTH = 60;\n\nexport interface CollisionRetType {\n hasCollision: boolean;\n labelOffsetType?: LABEL_SIDE_TYPE;\n}\n\nexport class FlowDragEntity extends ConfigEntity<FlowDragEntityConfig> {\n private playgroundConfigEntity: PlaygroundConfigEntity;\n\n static type = 'FlowDragEntity';\n\n private containerX = 0;\n\n private containerY = 0;\n\n private _scrollXInterval: { interval: number; origin: number } | undefined;\n\n private _scrollYInterval: { interval: number; origin: number } | undefined;\n\n get hasScroll(): boolean {\n return Boolean(this._scrollXInterval || this._scrollYInterval);\n }\n\n constructor(conf: any) {\n super(conf);\n this.playgroundConfigEntity = this.entityManager.getEntity<PlaygroundConfigEntity>(\n PlaygroundConfigEntity,\n true\n )!;\n }\n\n isCollision(\n transition: FlowNodeTransitionData,\n rect: Rectangle,\n isBranch: boolean\n ): CollisionRetType {\n const scale = this.playgroundConfigEntity.finalScale || 0;\n if (isBranch) {\n return this.isBranchCollision(transition, rect, scale);\n }\n return this.isNodeCollision(transition, rect, scale);\n }\n\n // 检测节点维度碰撞方法\n isNodeCollision(\n transition: FlowNodeTransitionData,\n rect: Rectangle,\n scale: number\n ): CollisionRetType {\n const { labels } = transition;\n const { isVertical } = transition.entity;\n\n const hasCollision = labels.some((label) => {\n if (\n !label ||\n ![\n FlowTransitionLabelEnum.ADDER_LABEL,\n FlowTransitionLabelEnum.COLLAPSE_ADDER_LABEL,\n ].includes(label.type)\n ) {\n return false;\n }\n\n const hoverWidth = isVertical\n ? transition.transform.bounds.width\n : DEFAULT_LABEL_ACTIVATE_HEIGHT;\n const hoverHeight = isVertical\n ? DEFAULT_LABEL_ACTIVATE_HEIGHT\n : transition.transform.bounds.height;\n\n const labelRect = new Rectangle(\n (label.offset.x - hoverWidth / 2) * scale,\n (label.offset.y - hoverHeight / 2) * scale,\n hoverWidth * scale,\n hoverHeight * scale\n );\n // 检测两个正方形是否相互碰撞\n return Rectangle.intersects(labelRect, rect);\n });\n\n return {\n hasCollision,\n // 节点不关心 offsetType\n labelOffsetType: undefined,\n };\n }\n\n // 检测分支维度碰撞\n isBranchCollision(\n transition: FlowNodeTransitionData,\n rect: Rectangle,\n scale: number\n ): CollisionRetType {\n const { labels } = transition;\n const { isVertical } = transition.entity;\n\n let labelOffsetType: LABEL_SIDE_TYPE = LABEL_SIDE_TYPE.NORMAL_BRANCH;\n const hasCollision = labels.some((label) => {\n if (!label || label.type !== FlowTransitionLabelEnum.BRANCH_DRAGGING_LABEL) {\n return false;\n }\n const hoverHeight = isVertical ? BRANCH_HOVER_HEIGHT : label.width || 0;\n // BRANCH_DRAGGING_LABEL 类型的 label 一定存在 width 属性\n const hoverWidth = isVertical ? label.width || 0 : BRANCH_HOVER_HEIGHT;\n\n const labelRect = new Rectangle(\n (label.offset.x - hoverWidth / 2) * scale,\n (label.offset.y - hoverHeight / 2) * scale,\n hoverWidth * scale,\n hoverHeight * scale\n );\n // 检测两个正方形是否相互碰撞\n const collision = Rectangle.intersects(labelRect, rect);\n if (collision) {\n labelOffsetType = label.props!.side;\n }\n return collision;\n });\n\n return {\n hasCollision,\n labelOffsetType,\n };\n }\n\n private _startScrollX(origin: number, added: boolean): void {\n if (this._scrollXInterval) {\n return;\n }\n const interval = window.setInterval(() => {\n const current = this._scrollXInterval;\n if (!current) return;\n // eslint-disable-next-line no-multi-assign\n const scrollX = (current.origin = added\n ? current.origin + SCROLL_DELTA\n : current.origin - SCROLL_DELTA);\n this.playgroundConfigEntity.updateConfig({\n scrollX,\n });\n const playgroundConfig = this.playgroundConfigEntity.config;\n if (playgroundConfig?.scrollX === scrollX) {\n if (added) {\n this.containerX += SCROLL_DELTA;\n } else {\n this.containerX -= SCROLL_DELTA;\n }\n }\n }, SCROLL_INTERVAL);\n this._scrollXInterval = { interval, origin };\n }\n\n private _stopScrollX(): void {\n if (this._scrollXInterval) {\n clearInterval(this._scrollXInterval.interval);\n this._scrollXInterval = undefined;\n }\n }\n\n private _startScrollY(origin: number, added: boolean): void {\n if (this._scrollYInterval) {\n return;\n }\n const interval = window.setInterval(() => {\n const current = this._scrollYInterval;\n if (!current) return;\n // eslint-disable-next-line no-multi-assign\n const scrollY = (current.origin = added\n ? current.origin + SCROLL_DELTA\n : current.origin - SCROLL_DELTA);\n this.playgroundConfigEntity.updateConfig({\n scrollY,\n });\n const playgroundConfig = this.playgroundConfigEntity.config;\n if (playgroundConfig?.scrollY === scrollY) {\n if (added) {\n this.containerY += SCROLL_DELTA;\n } else {\n this.containerY -= SCROLL_DELTA;\n }\n }\n }, SCROLL_INTERVAL);\n this._scrollYInterval = { interval, origin };\n }\n\n private _stopScrollY(): void {\n if (this._scrollYInterval) {\n clearInterval(this._scrollYInterval.interval);\n this._scrollYInterval = undefined;\n }\n }\n\n stopAllScroll(): void {\n this._stopScrollX();\n this._stopScrollY();\n }\n\n scrollDirection(e: MouseEvent, x: number, y: number): ScrollDirection | undefined {\n const playgroundConfig = this.playgroundConfigEntity.config;\n const currentScrollX = playgroundConfig.scrollX;\n const currentScrollY = playgroundConfig.scrollY;\n this.containerX = x;\n this.containerY = y;\n const clientRect = this.playgroundConfigEntity.playgroundDomNode.getBoundingClientRect();\n\n const mouseToBottom = playgroundConfig.height + clientRect.y - e.clientY;\n if (mouseToBottom < SCROLL_BOUNDING) {\n this._startScrollY(currentScrollY, true);\n return ScrollDirection.BOTTOM;\n }\n const mouseToTop = e.clientY - clientRect.y;\n if (mouseToTop < SCROLL_BOUNDING) {\n this._startScrollY(currentScrollY, false);\n return ScrollDirection.TOP;\n }\n this._stopScrollY();\n const mouseToRight = playgroundConfig.width + clientRect.x - e.clientX;\n if (mouseToRight < SCROLL_BOUNDING) {\n this._startScrollX(currentScrollX, true);\n return ScrollDirection.RIGHT;\n }\n const mouseToLeft = e.clientX - clientRect.x;\n if (mouseToLeft < SCROLL_BOUNDING + EDITOR_LEFT_BAR_WIDTH) {\n this._startScrollX(currentScrollX, false);\n return ScrollDirection.LEFT;\n }\n this._stopScrollX();\n\n return undefined;\n }\n\n dispose(): void {\n this.toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport type React from 'react';\n\nimport {\n FlowNodeTransformData,\n type FlowNodeTransitionData,\n type FlowTransitionLine,\n FlowTransitionLineEnum,\n type Vertex,\n DefaultSpacingKey,\n DEFAULT_SPACING,\n} from '@flowgram.ai/document';\n\nimport { BASE_DEFAULT_COLOR } from '../hooks/use-base-color';\n\nexport const DEFAULT_LINE_ATTRS: React.SVGProps<SVGPathElement> = {\n stroke: BASE_DEFAULT_COLOR,\n fill: 'transparent',\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n\n// 默认的圆角半径\nexport const DEFAULT_RADIUS = DEFAULT_SPACING[DefaultSpacingKey.ROUNDED_LINE_RADIUS];\n\n// 小圆角\nexport const MINI_RADIUS = 10;\n\n// 默认 label 激活高度\nexport const DEFAULT_LABEL_ACTIVATE_HEIGHT = 32;\n\n/**\n * 根据椭圆方程计算 y 坐标\n *\n * x^2 / rx^2 + y^2 / ry^2 = 1\n */\nexport const calcEllipseY = (x: number, rx: number, ry: number) =>\n Math.sqrt(ry ** 2 * (1 - x ** 2 / rx ** 2));\n\n/**\n * 获取转弯线的转折点 (水平布局)\n */\nexport function getHorizontalVertices(\n line: FlowTransitionLine,\n xRadius = 16,\n yRadius = 20\n): Vertex[] {\n const { from, to, type } = line || {};\n\n // 空间可以容纳的圆角数\n const deltaY = Math.abs(to.y - from.y);\n const deltaX = Math.abs(to.x - from.x);\n\n const radiusXCount = deltaX / xRadius;\n const radiusYCount = deltaY / yRadius;\n\n let res: Vertex[] = [];\n\n // 容纳不下一个圆角,直接连线\n if (radiusXCount < 1) {\n return [];\n }\n\n switch (type) {\n case FlowTransitionLineEnum.DIVERGE_LINE:\n case FlowTransitionLineEnum.DRAGGING_LINE:\n if (radiusXCount <= 1) {\n return [\n {\n x: to.x,\n y: from.y,\n radiusX: deltaX,\n },\n ];\n }\n res = [\n {\n x: from.x + yRadius,\n y: from.y,\n },\n {\n x: from.x + yRadius,\n y: to.y,\n },\n ];\n if (radiusXCount < 2) {\n const firstRadius = deltaX - yRadius;\n res = [\n {\n x: from.x + firstRadius,\n y: from.y,\n // 第一个圆角收缩 y 半径\n radiusX: firstRadius,\n },\n {\n x: from.x + firstRadius,\n y: to.y,\n },\n ];\n }\n\n // y 轴空间不足处理\n if (radiusYCount < 2) {\n res[0].moveY = deltaY / 2;\n res[1].moveY = deltaY / 2;\n }\n\n return res;\n\n case FlowTransitionLineEnum.MERGE_LINE:\n // 聚合线 y 轴空间不足时直接连上\n if (radiusXCount < 2) {\n return [\n {\n x: to.x,\n y: from.y,\n },\n ];\n }\n\n res = [\n {\n x: to.x - yRadius,\n y: from.y,\n },\n {\n x: to.x - yRadius,\n y: to.y,\n },\n ];\n\n // y 轴空间不足处理\n if (radiusYCount < 2) {\n res[0].moveY = deltaY / 2;\n res[1].moveY = deltaY / 2;\n }\n\n return res;\n\n default:\n break;\n }\n\n return [];\n}\n/**\n * 获取转弯线的转折点 (垂直布局)\n */\nexport function getVertices(line: FlowTransitionLine, xRadius = 16, yRadius = 20): Vertex[] {\n const { from, to, type } = line || {};\n\n // 空间可以容纳的圆角数\n const deltaY = Math.abs(to.y - from.y);\n const deltaX = Math.abs(to.x - from.x);\n\n const radiusYCount = deltaY / yRadius;\n const radiusXCount = deltaX / xRadius;\n\n let res: Vertex[] = [];\n\n // 容纳不下一个圆角,直接连线\n if (radiusYCount < 1) {\n return [];\n }\n\n switch (type) {\n case FlowTransitionLineEnum.DIVERGE_LINE:\n case FlowTransitionLineEnum.DRAGGING_LINE:\n if (radiusYCount <= 1) {\n return [\n {\n x: to.x,\n y: from.y,\n radiusY: deltaY,\n },\n ];\n }\n res = [\n {\n x: from.x,\n y: from.y + yRadius,\n },\n {\n x: to.x,\n y: from.y + yRadius,\n },\n ];\n if (radiusYCount < 2) {\n const firstRadius = deltaY - yRadius;\n res = [\n {\n x: from.x,\n y: from.y + firstRadius,\n // 第一个圆角收缩 y 半径\n radiusY: firstRadius,\n },\n {\n x: to.x,\n y: from.y + firstRadius,\n },\n ];\n }\n\n // x 轴空间不足处理\n if (radiusXCount < 2) {\n res[0].moveX = deltaX / 2;\n res[1].moveX = deltaX / 2;\n }\n\n return res;\n\n case FlowTransitionLineEnum.MERGE_LINE:\n // 聚合线 y 轴空间不足时直接连上\n if (radiusYCount < 2) {\n return [\n {\n x: from.x,\n y: to.y,\n },\n ];\n }\n\n res = [\n {\n x: from.x,\n y: to.y - yRadius,\n },\n {\n x: to.x,\n y: to.y - yRadius,\n },\n ];\n\n // x 轴空间不足处理\n if (radiusXCount < 2) {\n res[0].moveX = deltaX / 2;\n res[1].moveX = deltaX / 2;\n }\n\n return res;\n\n default:\n break;\n }\n\n return [];\n}\n\n// 获取上一个节点和下一个节点中较宽的宽度作为 hover 热区\nexport function getTransitionLabelHoverWidth(data: FlowNodeTransitionData) {\n const { isVertical } = data.entity;\n if (isVertical) {\n const nextWidth =\n data.entity.next?.firstChild && !data.entity.next.isInlineBlocks\n ? data.entity.next.firstChild!.getData(FlowNodeTransformData)!.size.width\n : data.entity.next?.getData(FlowNodeTransformData)!.size.width;\n\n // 获取上一个节点和下一个节点中较宽的宽度作为 hover 热区\n const maxWidth = Math.max(\n data.entity.getData(FlowNodeTransformData)?.size.width ??\n DEFAULT_SPACING[DefaultSpacingKey.HOVER_AREA_WIDTH],\n nextWidth || 0\n );\n\n return maxWidth;\n }\n if (data.transform.next) {\n return data.transform.next.inputPoint.x - data.transform.outputPoint.x;\n }\n return DEFAULT_LABEL_ACTIVATE_HEIGHT;\n}\n\nexport function getTransitionLabelHoverHeight(data: FlowNodeTransitionData) {\n const { isVertical } = data.entity;\n if (isVertical) {\n if (data.transform.next) {\n return data.transform.next.inputPoint.y - data.transform.outputPoint.y;\n }\n return DEFAULT_LABEL_ACTIVATE_HEIGHT;\n }\n const nextHeight =\n data.entity.next?.firstChild && !data.entity.next.isInlineBlocks\n ? data.entity.next.firstChild!.getData(FlowNodeTransformData)!.size.height\n : data.entity.next?.getData(FlowNodeTransformData)!.size.height;\n\n // 获取上一个节点和下一个节点中较宽的宽度作为 hover 热区\n const maxHeight = Math.max(\n data.entity.getData(FlowNodeTransformData)?.size.height || 280,\n nextHeight || 0\n );\n\n return maxHeight;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ConstantKeys, FlowDocumentOptions } from '@flowgram.ai/document';\nimport { useService } from '@flowgram.ai/core';\n\nexport const BASE_DEFAULT_COLOR = '#BBBFC4';\nexport const BASE_DEFAULT_ACTIVATED_COLOR = '#82A7FC';\n\nexport function useBaseColor(): { baseColor: string; baseActivatedColor: string } {\n const options = useService<FlowDocumentOptions>(FlowDocumentOptions);\n return {\n baseColor: options.constants?.[ConstantKeys.BASE_COLOR] || BASE_DEFAULT_COLOR,\n baseActivatedColor:\n options.constants?.[ConstantKeys.BASE_ACTIVATED_COLOR] || BASE_DEFAULT_ACTIVATED_COLOR,\n };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\n type FlowNodeEntity,\n FlowNodeRenderData,\n FlowNodeTransformData,\n} from '@flowgram.ai/document';\nimport { ConfigEntity } from '@flowgram.ai/core';\nimport { Compare, Rectangle } from '@flowgram.ai/utils';\n\nimport { findSelectedNodes } from '../utils/find-selected-nodes';\n\ninterface FlowSelectConfigEntityData {\n selectedNodes: FlowNodeEntity[];\n}\n\nconst BOUNDS_PADDING_DEFAULT = 10;\n\n/**\n * 圈选节点相关数据存储\n */\nexport class FlowSelectConfigEntity extends ConfigEntity<FlowSelectConfigEntityData> {\n static type = 'FlowSelectConfigEntity';\n\n boundsPadding = BOUNDS_PADDING_DEFAULT;\n\n getDefaultConfig(): FlowSelectConfigEntityData {\n return {\n selectedNodes: [],\n };\n }\n\n get selectedNodes(): FlowNodeEntity[] {\n return this.config.selectedNodes;\n }\n\n /**\n * 选中节点\n * @param nodes\n */\n set selectedNodes(nodes: FlowNodeEntity[]) {\n nodes = findSelectedNodes(nodes);\n // if (nodes.length === 1 && nodes[0].flowNodeType === FlowNodeBaseType.END) {\n // nodes = [];\n // }\n if (\n nodes.length !== this.config.selectedNodes.length ||\n nodes.some(n => !this.config.selectedNodes.includes(n))\n ) {\n this.config.selectedNodes.forEach(oldNode => {\n if (!nodes.includes(oldNode)) {\n oldNode.getData(FlowNodeRenderData)!.activated = false;\n }\n });\n // 高亮选中的节点\n nodes.forEach(node => {\n node.getData(FlowNodeRenderData)!.activated = true;\n });\n if (Compare.isArrayShallowChanged(this.config.selectedNodes, nodes)) {\n this.updateConfig({\n selectedNodes: nodes,\n });\n }\n }\n }\n\n /**\n * 清除选中节点\n */\n clearSelectedNodes() {\n if (this.config.selectedNodes.length === 0) return;\n this.config.selectedNodes.forEach(node => {\n node.getData(FlowNodeRenderData)!.activated = false;\n });\n this.updateConfig({\n selectedNodes: [],\n });\n }\n\n /**\n * 通过选择框选中节点\n * @param rect\n * @param transforms\n */\n selectFromBounds(rect: Rectangle, transforms: FlowNodeTransformData[]): void {\n const selectedNodes: FlowNodeEntity[] = [];\n transforms.forEach(transform => {\n if (Rectangle.intersects(rect, transform.bounds)) {\n if (transform.entity.originParent) {\n selectedNodes.push(transform.entity.originParent);\n } else {\n selectedNodes.push(transform.entity);\n }\n }\n });\n this.selectedNodes = selectedNodes;\n }\n\n /**\n * 获取选中节点外围的最大边框\n */\n getSelectedBounds(): Rectangle {\n const nodes = this.selectedNodes;\n if (nodes.length === 0) {\n return Rectangle.EMPTY;\n }\n return Rectangle.enlarge(nodes.map(n => n.getData(FlowNodeTransformData)!.bounds)).pad(\n this.boundsPadding,\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { uniq } from 'lodash-es';\nimport { type FlowNodeEntity } from '@flowgram.ai/document';\n\nfunction getNodePath(node: FlowNodeEntity): FlowNodeEntity[] {\n const path: FlowNodeEntity[] = [node];\n node = node.parent as FlowNodeEntity;\n while (node) {\n path.push(node);\n node = node.parent as FlowNodeEntity;\n }\n return path.reverse();\n}\n\n/**\n * 过滤掉画布节点, 有 originParent,都是非独立节点\n * @param entity\n */\nfunction findRealEntity(entity: FlowNodeEntity): FlowNodeEntity {\n while (entity.originParent) {\n entity = entity.originParent;\n }\n return entity;\n}\n/**\n * 生成选中节点的路径\n * 如\n * [\n * 'root',\n * 'exclusiveSplit_30baf8b1da0',\n * 'exclusiveSplit_d0070ce5d04',\n * 'createRecord_47e8fe1dfc3'\n * ],\n * [\n * 'root',\n * 'exclusiveSplit_30baf8b1da0',\n * 'exclusiveSplit_d0070ce5d04',\n * 'createRecord_32dcdd10274'\n * ],\n * [\n * 'root',\n * 'exclusiveSplit_30baf8b1da0',\n * 'exclusiveSplit_d0070ce5d04',\n * 'exclusiveSplit_a5579b3997d', // 这里产生分叉\n * 'createRecord_b57b00eee94' // 父亲节点分叉了,这里就忽略了\n * ]\n * ]\n * 1. 相同分支的节点,选择每个节点\n * 2. 跨分支的节点选择共同的父节点\n */\nexport function findSelectedNodes(nodes: FlowNodeEntity[]): FlowNodeEntity[] {\n if (nodes.length === 0) return [];\n /**\n * 生成节点的路径\n */\n const nodePathList: FlowNodeEntity[][] = nodes.map((n) => getNodePath(n));\n /**\n * 只需要比较最小的路径\n */\n const minLength = Math.min(...nodePathList.map((n) => n.length));\n let index = 0;\n let selectedItems: FlowNodeEntity[] = [];\n /**\n * 从二维数组的每一层打平去看,看看有没有分叉,如果有分叉就在当前层停止并作为选中的节点\n */\n while (index < minLength) {\n // eslint-disable-next-line no-loop-func\n selectedItems = uniq(nodePathList.map((p) => p[index]));\n // 存在分叉\n if (selectedItems.length > 1) {\n break;\n }\n index += 1;\n }\n return uniq(selectedItems.map((item) => findRealEntity(item)));\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\n PositionSchema,\n SizeSchema,\n ConfigEntity,\n PlaygroundDragEvent,\n} from '@flowgram.ai/core';\nimport { Rectangle } from '@flowgram.ai/utils';\n\nexport interface SelectorBoxConfigData extends PlaygroundDragEvent {\n disabled?: boolean; // 是否禁用选择框\n}\n\n/**\n * 选择框配置\n */\nexport class SelectorBoxConfigEntity extends ConfigEntity<SelectorBoxConfigData> {\n static type = 'SelectorBoxConfigEntity';\n\n get dragInfo(): PlaygroundDragEvent {\n return this.config;\n }\n\n setDragInfo(info: PlaygroundDragEvent): void {\n this.updateConfig(info);\n }\n\n get disabled(): boolean {\n return this.config && !!this.config.disabled;\n }\n\n set disabled(disabled: boolean) {\n this.updateConfig({\n disabled,\n });\n }\n\n get isStart(): boolean {\n return this.dragInfo.isStart;\n }\n\n get isMoving(): boolean {\n return this.dragInfo.isMoving;\n }\n\n get position(): PositionSchema {\n const { dragInfo } = this;\n return {\n x: dragInfo.startPos.x < dragInfo.endPos.x ? dragInfo.startPos.x : dragInfo.endPos.x,\n y: dragInfo.startPos.y < dragInfo.endPos.y ? dragInfo.startPos.y : dragInfo.endPos.y,\n };\n }\n\n get size(): SizeSchema {\n const { dragInfo } = this;\n return {\n width: Math.abs(dragInfo.startPos.x - dragInfo.endPos.x),\n height: Math.abs(dragInfo.startPos.y - dragInfo.endPos.y),\n };\n }\n\n get collapsed(): boolean {\n const { size } = this;\n return size.width === 0 && size.height === 0;\n }\n\n collapse(): void {\n this.setDragInfo({\n ...this.dragInfo,\n isMoving: false,\n isStart: false,\n });\n }\n\n toRectangle(scale: number): Rectangle {\n const { position, size } = this;\n return new Rectangle(\n position.x / scale,\n position.y / scale,\n size.width / scale,\n size.height / scale,\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { Cache, type Disposable, domUtils } from '@flowgram.ai/utils';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowNodeEntity,\n FlowNodeTransformData,\n} from '@flowgram.ai/document';\nimport { Layer, observeEntity, observeEntityDatas } from '@flowgram.ai/core';\n// import { throttle } from 'lodash-es'\n\nimport { FlowRendererResizeObserver } from '../flow-renderer-resize-observer';\n\ninterface TransformRenderCache {\n updateBounds(): void;\n}\n\nexport interface FlowNodesTransformLayerOptions {\n renderElement?: HTMLElement | (() => HTMLElement | undefined);\n}\n\n/**\n * 渲染节点位置\n */\n@injectable()\nexport class FlowNodesTransformLayer extends Layer<FlowNodesTransformLayerOptions> {\n @inject(FlowDocument) readonly document: FlowDocument;\n\n @inject(FlowRendererResizeObserver)\n readonly resizeObserver: FlowRendererResizeObserver;\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransformData)\n _transforms: FlowNodeTransformData[];\n\n node = domUtils.createDivWithClass('gedit-flow-nodes-layer');\n\n get transformVisibles(): FlowNodeTransformData[] {\n return this.document.getRenderDatas<FlowNodeTransformData>(FlowNodeTransformData, false);\n }\n\n /**\n * 监听缩放,目前采用整体缩放\n * @param scale\n */\n onZoom(scale: number) {\n this.node!.style.transform = `scale(${scale})`;\n }\n\n dispose(): void {\n this.renderCache.dispose();\n super.dispose();\n }\n\n // onViewportChange() {\n // this.throttleUpdate()\n // }\n\n // throttleUpdate = throttle(() => {\n // this.renderCache.getFromCache().forEach((cache) => cache.updateBounds())\n // }, 100)\n\n protected renderCache = Cache.create<TransformRenderCache, FlowNodeTransformData>(\n (transform?: FlowNodeTransformData) => {\n const { renderState } = transform!;\n const { node } = renderState;\n const { entity } = transform!;\n node.id = entity.id;\n let resizeDispose: Disposable | undefined;\n const append = () => {\n if (resizeDispose) return;\n // 监听 dom 节点的大小变化\n this.renderElement.appendChild(node);\n if (!entity.getNodeMeta().autoResizeDisable) {\n resizeDispose = this.resizeObserver.observe(node, transform!);\n }\n };\n const dispose = () => {\n if (!resizeDispose) return;\n // 脱离文档流,但是 react 组件会保留\n if (node.parentElement) {\n this.renderElement.removeChild(node);\n }\n resizeDispose.dispose();\n resizeDispose = undefined;\n };\n append();\n return {\n dispose,\n updateBounds: () => {\n const { bounds } = transform!;\n // 保留2位小数\n const rawX: number = parseFloat(node.style.left);\n const rawY: number = parseFloat(node.style.top);\n if (!this.isCoordEqual(rawX, bounds.x) || !this.isCoordEqual(rawY, bounds.y)) {\n node.style.left = `${bounds.x}px`;\n node.style.top = `${bounds.y}px`;\n }\n },\n };\n }\n );\n\n private isCoordEqual(a: number, b: number) {\n const browserCoordEpsilon = 0.05; // 浏览器处理坐标的精度误差: 两位小数四舍五入\n return Math.abs(a - b) < browserCoordEpsilon;\n }\n\n onReady() {\n this.node!.style.zIndex = '10';\n }\n\n get visibeBounds() {\n return this.transformVisibles.map((transform) => transform.bounds);\n }\n\n /**\n * 更新节点的 bounds 数据\n */\n updateNodesBounds() {\n this.renderCache\n .getMoreByItems(this.transformVisibles)\n .forEach((render) => render.updateBounds());\n }\n\n autorun() {\n // 更新节点偏移数据 O(n) TODO 这个更新会从 render 里移除改成自动触发\n if (this.documentTransformer.loading) return;\n this.documentTransformer.refresh();\n this.updateNodesBounds();\n }\n\n private get renderElement(): HTMLElement {\n if (typeof this.options.renderElement === 'function') {\n const element = this.options.renderElement();\n if (element) {\n return element;\n }\n } else if (typeof this.options.renderElement !== 'undefined') {\n return this.options.renderElement as HTMLElement;\n }\n return this.node;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\nimport { type FlowNodeTransformData } from '@flowgram.ai/document';\nimport { Disposable } from '@flowgram.ai/utils';\n\nimport { isHidden, isRectInit } from './utils/element';\n\n/**\n * 监听 dom 元素的 size 变化,用于画布节点的大小变化重新计算\n */\n@injectable()\nexport class FlowRendererResizeObserver {\n /**\n * 监听元素 size,并同步到 transform\n * @param el\n * @param transform\n */\n observe(el: HTMLElement, transform: FlowNodeTransformData): Disposable {\n const observer = new ResizeObserver(entries => {\n /**\n * NOTICE: 不加 window.requestAnimationFrame\n * 会导致 \"ResizeObserver loop completed with undelivered notifications.\" 报错\n * 这个报错在 chrome 和 firefox 是默认被忽略的,但本地调试会被编译工具弹窗打断\n */\n window.requestAnimationFrame(() => {\n if (!Array.isArray(entries) || !entries.length) {\n return;\n }\n const entry = entries[0];\n const { contentRect, target } = entry;\n // 元素宽高未计算时,不更新节点 size\n const isContentRectInit = isRectInit(contentRect);\n // 目标节点脱离 DOM 树,忽略本次变更\n const isLeaveDOMTree = !target.parentNode;\n // IDE 环境下画布元素可能 display none,这时候会监听到元素宽高 0 导致闪屏\n // 此情况下不作 resize 重渲染\n const isHiddenElement = isHidden(target.parentNode as HTMLElement);\n if (isContentRectInit && !isLeaveDOMTree && !isHiddenElement) {\n // 更新节点 size 数据\n transform.size = {\n width: Math.round(contentRect.width * 10) / 10,\n height: Math.round(contentRect.height * 10) / 10,\n };\n }\n });\n });\n observer.observe(el);\n return Disposable.create(() => {\n observer.unobserve(el);\n });\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { isNil } from 'lodash-es';\nexport const isHidden = (dom?: HTMLElement) => {\n if (!dom || isNil(dom?.offsetParent)) {\n return true;\n }\n const style = window.getComputedStyle(dom);\n if (style?.display === 'none') {\n return true;\n }\n return false;\n};\n\nexport const isRectInit = (rect?: DOMRect): boolean => {\n if (!rect) {\n return false;\n }\n // 检查所有属性是否都为0,表示DOMRect未初始化\n if (\n rect.bottom === 0 &&\n rect.height === 0 &&\n rect.left === 0 &&\n rect.right === 0 &&\n rect.top === 0 &&\n rect.width === 0 &&\n rect.x === 0 &&\n rect.y === 0\n ) {\n return false;\n }\n return true;\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport ReactDOM from 'react-dom';\nimport React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { Cache, type CacheOriginItem, domUtils } from '@flowgram.ai/utils';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowNodeEntity,\n FlowNodeRenderData,\n FlowNodeTransformData,\n} from '@flowgram.ai/document';\nimport {\n Layer,\n observeEntity,\n observeEntityDatas,\n PlaygroundEntityContext,\n} from '@flowgram.ai/core';\n\nimport { FlowRendererKey, FlowRendererRegistry } from '../flow-renderer-registry';\n\ninterface NodePortal extends CacheOriginItem {\n id: string;\n Portal: () => JSX.Element;\n}\n\n/**\n * 渲染节点内容\n */\n@injectable()\nexport class FlowNodesContentLayer extends Layer {\n @inject(FlowDocument) readonly document: FlowDocument;\n\n @inject(FlowRendererRegistry) readonly rendererRegistry: FlowRendererRegistry;\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeRenderData)\n _renderStates: FlowNodeRenderData[];\n\n get renderStatesVisible(): FlowNodeRenderData[] {\n return this.document.getRenderDatas<FlowNodeRenderData>(FlowNodeRenderData, false);\n }\n\n private renderMemoCache = new WeakMap<any, any>();\n\n node = domUtils.createDivWithClass('gedit-flow-nodes-layer');\n\n getPortalRenderer(data: FlowNodeRenderData): (props: any) => JSX.Element {\n const meta = data.entity.getNodeMeta();\n const renderer = this.rendererRegistry.getRendererComponent(\n (meta.renderKey as FlowRendererKey) || FlowRendererKey.NODE_RENDER\n );\n const reactRenderer = renderer.renderer as any;\n let memoCache = this.renderMemoCache.get(reactRenderer);\n if (!memoCache) {\n memoCache = React.memo(reactRenderer);\n this.renderMemoCache.set(reactRenderer, memoCache);\n }\n return memoCache;\n }\n\n /**\n * 监听缩放,目前采用整体缩放\n * @param scale\n */\n onZoom(scale: number) {\n this.node!.style.transform = `scale(${scale})`;\n }\n\n dispose(): void {\n this.reactPortals.dispose();\n super.dispose();\n }\n\n protected reactPortals = Cache.create<NodePortal, FlowNodeRenderData>(\n (data?: FlowNodeRenderData) => {\n const { node, entity } = data!;\n const { config } = this;\n const PortalRenderer = this.getPortalRenderer(data!);\n\n function Portal(): JSX.Element {\n React.useEffect(() => {\n // 第一次加载需要把宽高通知\n if (!entity.getNodeMeta().autoResizeDisable && node.clientWidth && node.clientHeight) {\n const transform = entity.getData<FlowNodeTransformData>(FlowNodeTransformData);\n if (transform)\n transform.size = {\n width: node.clientWidth,\n height: node.clientHeight,\n };\n }\n }, [entity, node]);\n // 这里使用 portal,改 dom 样式不会引起 react 重新渲染\n return ReactDOM.createPortal(\n <PlaygroundEntityContext.Provider value={entity}>\n <PortalRenderer\n node={entity}\n version={data?.version}\n activated={data?.activated}\n readonly={config.readonly}\n disabled={config.disabled}\n />\n </PlaygroundEntityContext.Provider>,\n node\n );\n }\n\n return {\n id: node.id || entity.id,\n dispose: () => {\n // TODO, 删除逻辑由 node 去控制了\n },\n Portal,\n } as NodePortal;\n }\n );\n\n onReady() {\n this.node!.style.zIndex = '10';\n }\n\n /**\n * 监听readonly和 disabled 状态 并刷新layer, 并刷新节点\n */\n onReadonlyOrDisabledChange() {\n this.render();\n }\n\n getPortals(): NodePortal[] {\n return this.reactPortals.getMoreByItems(this.renderStatesVisible);\n }\n\n render() {\n if (this.documentTransformer.loading) return <></>;\n this.documentTransformer.refresh();\n\n // 从缓存获取节点\n return (\n <>\n {this.getPortals().map((portal) => (\n <portal.Portal key={portal.id} />\n ))}\n </>\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable, multiInject, optional } from 'inversify';\nimport { I18n } from '@flowgram.ai/i18n';\nimport { type Layer, type LayerRegistry, PipelineRegistry } from '@flowgram.ai/core';\n\nimport { FlowRendererContribution } from './flow-renderer-contribution';\n\nexport enum FlowRendererComponentType {\n REACT, // react 组件\n DOM, // dom 组件\n TEXT, // 文案\n}\n\nexport enum FlowRendererKey {\n NODE_RENDER = 'node-render', // 节点渲染\n ADDER = 'adder', // 添加按钮渲染\n COLLAPSE = 'collapse', // 节点展开收起标签(包含展开态和收起态)\n BRANCH_ADDER = 'branch-adder', // 分支添加按钮\n TRY_CATCH_COLLAPSE = 'try-catch-collapse', // 错误处理分支整体收起\n DRAG_NODE = 'drag-node', // 拖拽节点\n DRAGGABLE_ADDER = 'draggable-adder', // 拖拽可被拖入\n DRAG_HIGHLIGHT_ADDER = 'drag-highlight-adder', // 拖拽高亮\n DRAG_BRANCH_HIGHLIGHT_ADDER = 'drag-branch-highlight-adder', // 分支拖拽添加高亮\n SELECTOR_BOX_POPOVER = 'selector-box-popover', // 选择框右上角菜单\n /**\n * @deprecated\n */\n CONTEXT_MENU_POPOVER = 'context-menu-popover', // 右键菜单\n SUB_CANVAS = 'sub-canvas', // 子画布渲染\n\n SLOT_ADDER = 'slot-adder', // 插槽添加按钮\n SLOT_LABEL = 'slot-label', // 插槽标签\n SLOT_COLLAPSE = 'slot-collapse', // 插槽收起按钮渲染\n\n // 工作流线条箭头自定义渲染\n ARROW_RENDERER = 'arrow-renderer', // 工作流线条箭头渲染器\n\n // 下边两个不一定存在\n MARKER_ARROW = 'marker-arrow', // loop 的默认箭头\n MARKER_ACTIVATE_ARROW = 'marker-active-arrow', // loop 的激活态箭头\n}\n\nexport enum FlowTextKey {\n // 循环节点相关\n LOOP_END_TEXT = 'loop-end-text', // 文案:循环结束\n LOOP_TRAVERSE_TEXT = 'loop-traverse-text', // 文案:循环遍历\n LOOP_WHILE_TEXT = 'loop-while-text', // 文案:满足条件时\n // TryCatch 相关\n TRY_START_TEXT = 'try-start-text', // 文案:监控开始\n TRY_END_TEXT = 'try-end-text', // 文案:监控结束\n CATCH_TEXT = 'catch-text', // 发生错误\n}\n\nexport interface FlowRendererComponent {\n type: FlowRendererComponentType;\n renderer: (props?: any) => any;\n}\n\n/**\n * 命令分类\n */\nexport enum FlowRendererCommandCategory {\n SELECTOR_BOX = 'SELECTOR_BOX', // 选择框\n}\n\n@injectable()\nexport class FlowRendererRegistry {\n private componentsMap = new Map<string, FlowRendererComponent>();\n\n private textMap = new Map<string, string>();\n\n @multiInject(FlowRendererContribution)\n @optional()\n private contribs: FlowRendererContribution[] = [];\n\n @inject(PipelineRegistry) readonly pipeline: PipelineRegistry;\n\n init() {\n this.contribs.forEach((contrib) => contrib.registerRenderer?.(this));\n }\n\n /**\n * 注册 组件数据\n */\n registerRendererComponents(\n renderKey: FlowRendererKey | string,\n comp: FlowRendererComponent\n ): void {\n this.componentsMap.set(renderKey, comp);\n }\n\n registerReactComponent(renderKey: FlowRendererKey | string, renderer: (props: any) => any): void {\n this.componentsMap.set(renderKey, {\n type: FlowRendererComponentType.REACT,\n renderer,\n });\n }\n\n /**\n * 注册文案\n */\n registerText(configs: Record<FlowTextKey | string, string>): void {\n Object.entries(configs).forEach(([key, value]) => {\n this.textMap.set(key, value);\n });\n }\n\n getText(textKey: string) {\n return I18n.t(textKey, { defaultValue: '' }) || this.textMap.get(textKey);\n }\n\n /**\n * TODO: support memo\n */\n public getRendererComponent(renderKey: FlowRendererKey | string): FlowRendererComponent {\n const comp = this.componentsMap.get(renderKey);\n if (!comp) {\n throw new Error(`Unknown render key ${renderKey}`);\n }\n return comp;\n }\n\n tryToGetRendererComponent(\n renderKey: FlowRendererKey | string\n ): FlowRendererComponent | undefined {\n return this.componentsMap.get(renderKey);\n }\n\n /**\n * 注册画布层\n */\n registerLayers(...layerRegistries: LayerRegistry[]): void {\n layerRegistries.forEach((layer) => this.pipeline.registerLayer(layer));\n }\n\n /**\n * 根据配置注册画布\n * @param layerRegistry\n * @param options\n */\n registerLayer<P extends Layer = Layer>(\n layerRegistry: LayerRegistry<Layer>,\n options?: P['options']\n ): void {\n this.pipeline.registerLayer(layerRegistry, options);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport type { FlowRendererRegistry } from './flow-renderer-registry';\n\nexport const FlowRendererContribution = Symbol('FlowRendererContribution');\n\nexport interface FlowRendererContribution {\n registerRenderer?(registry: FlowRendererRegistry): void;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { groupBy, throttle } from 'lodash-es';\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowNodeEntity,\n FlowNodeTransitionData,\n FlowRendererStateEntity,\n FlowDragService,\n} from '@flowgram.ai/document';\nimport { Layer, observeEntity, observeEntityDatas } from '@flowgram.ai/core';\n\nimport { FlowRendererRegistry } from '../flow-renderer-registry';\nimport { createLines } from '../components/LinesRenderer';\n\n@injectable()\nexport class FlowLinesLayer extends Layer {\n @inject(FlowDocument) readonly document: FlowDocument;\n\n @inject(FlowDragService)\n protected readonly dragService: FlowDragService;\n\n @inject(FlowRendererRegistry) readonly rendererRegistry: FlowRendererRegistry;\n\n node = domUtils.createDivWithClass('gedit-flow-lines-layer');\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntity(FlowRendererStateEntity)\n readonly flowRenderState: FlowRendererStateEntity;\n\n /**\n * 监听 transition 变化\n */\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransitionData)\n _transitions: FlowNodeTransitionData[];\n\n get transitions(): FlowNodeTransitionData[] {\n return this.document.getRenderDatas<FlowNodeTransitionData>(FlowNodeTransitionData);\n }\n\n /**\n * 可视区域变化\n */\n onViewportChange: ReturnType<typeof throttle> = throttle(() => {\n this.render();\n }, 100);\n\n onZoom() {\n const svgContainer = this.node!.querySelector('svg.flow-lines-container')!;\n svgContainer?.setAttribute?.('viewBox', this.viewBox);\n }\n\n onReady() {\n this.node.style.zIndex = '1';\n }\n\n get viewBox(): string {\n const ratio = 1000 / this.config.finalScale;\n return `0 0 ${ratio} ${ratio}`;\n }\n\n render(): JSX.Element {\n const allLines: JSX.Element[] = [];\n const isViewportVisible = this.config.isViewportVisible.bind(this.config);\n // 还没初始化\n if (this.documentTransformer.loading) return <></>;\n this.documentTransformer.refresh();\n\n this.transitions.forEach((transition) => {\n createLines({\n data: transition,\n rendererRegistry: this.rendererRegistry,\n isViewportVisible,\n linesSave: allLines,\n dragService: this.dragService,\n });\n });\n\n // svg 没有 z-index,只能通过顺序来设置前后层级\n // 通过将 activated 的项排到最后,防止 hover 层级覆盖\n const { activateLines = [], normalLines = [] } = groupBy(allLines, (line) =>\n line.props.activated ? 'activateLines' : 'normalLines'\n );\n const resultLines = [...normalLines, ...activateLines];\n\n return (\n <svg\n className=\"flow-lines-container\"\n width=\"1000\"\n height=\"1000\"\n overflow=\"visible\"\n viewBox={this.viewBox}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {resultLines}\n </svg>\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { Rectangle } from '@flowgram.ai/utils';\nimport {\n FlowDragService,\n type FlowNodeTransitionData,\n type FlowTransitionLine,\n FlowTransitionLineEnum,\n DefaultSpacingKey,\n} from '@flowgram.ai/document';\nimport { getDefaultSpacing } from '@flowgram.ai/document';\n\nimport { type FlowRendererRegistry } from '../flow-renderer-registry';\nimport StraightLine from './StraightLine';\nimport RoundedTurningLine from './RoundedTurningLine';\nimport CustomLine from './CustomLine';\n\nexport interface PropsType {\n data: FlowNodeTransitionData;\n rendererRegistry: FlowRendererRegistry;\n isViewportVisible: (bounds: Rectangle) => boolean;\n linesSave: JSX.Element[];\n dragService: FlowDragService;\n}\n\nexport function createLines(props: PropsType): void {\n const { data, rendererRegistry, linesSave, dragService } = props;\n const { lines, entity } = data || {};\n\n const radius = getDefaultSpacing(entity, DefaultSpacingKey.ROUNDED_LINE_RADIUS);\n const xRadius = getDefaultSpacing(entity, DefaultSpacingKey.ROUNDED_LINE_X_RADIUS);\n const yRadius = getDefaultSpacing(entity, DefaultSpacingKey.ROUNDED_LINE_Y_RADIUS);\n\n // 线条绘制逻辑\n const renderLine = (line: FlowTransitionLine, index: number) => {\n const { renderData } = data;\n const { isVertical } = data.entity;\n const { lineActivated } = renderData || {};\n\n const draggingLineHide =\n (line.type === FlowTransitionLineEnum.DRAGGING_LINE || line.isDraggingLine) &&\n !dragService.isDroppableBranch(data.entity, line.side);\n\n const draggingLineActivated =\n (line.type === FlowTransitionLineEnum.DRAGGING_LINE || line.isDraggingLine) &&\n data.entity?.id === dragService.dropNodeId &&\n line.side === dragService.labelSide;\n\n switch (line.type) {\n case FlowTransitionLineEnum.STRAIGHT_LINE:\n return (\n <StraightLine\n key={`${data.entity.id}_${index}`}\n lineId={data.entity.id}\n activated={lineActivated}\n {...line}\n />\n );\n\n case FlowTransitionLineEnum.DIVERGE_LINE:\n case FlowTransitionLineEnum.DRAGGING_LINE:\n case FlowTransitionLineEnum.MERGE_LINE:\n case FlowTransitionLineEnum.ROUNDED_LINE:\n return (\n <RoundedTurningLine\n key={`${data.entity.id}_${index}`}\n lineId={data.entity.id}\n isHorizontal={!isVertical}\n activated={lineActivated || draggingLineActivated}\n radius={radius}\n {...line}\n xRadius={xRadius}\n yRadius={yRadius}\n hide={draggingLineHide}\n />\n );\n\n case FlowTransitionLineEnum.CUSTOM_LINE:\n return (\n <CustomLine\n key={`${data.entity.id}_${index}`}\n lineId={data.entity.id}\n {...line}\n rendererRegistry={rendererRegistry}\n />\n );\n\n default:\n break;\n }\n\n return undefined;\n };\n lines.forEach((line, index) => {\n const bounds = Rectangle.createRectangleWithTwoPoints(line.from, line.to).pad(10);\n if (props.isViewportVisible(bounds)) {\n const jsxEl = renderLine(line, index) as JSX.Element;\n if (jsxEl) linesSave.push(jsxEl);\n }\n });\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport type { FlowTransitionLine } from '@flowgram.ai/document';\n\nimport { useBaseColor } from '../hooks/use-base-color';\nimport { DEFAULT_LINE_ATTRS } from './utils';\n\nfunction StraightLine(props: FlowTransitionLine): JSX.Element {\n const { from, to, activated, style } = props;\n const { baseColor, baseActivatedColor } = useBaseColor();\n\n return (\n <path\n data-line-id={props.lineId}\n d={`M ${from.x} ${from.y} L ${to.x} ${to.y}`}\n {...DEFAULT_LINE_ATTRS}\n stroke={activated ? baseActivatedColor : baseColor}\n style={style}\n />\n );\n}\n\n// version 变化才触发组件更新\nexport default StraightLine;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { useMemo } from 'react';\n\nimport { isNil } from 'lodash-es';\nimport { Point } from '@flowgram.ai/utils';\nimport { type FlowTransitionLine } from '@flowgram.ai/document';\nimport { useService } from '@flowgram.ai/core';\n\nimport { useBaseColor } from '../hooks/use-base-color';\nimport { DEFAULT_LINE_ATTRS, DEFAULT_RADIUS, getHorizontalVertices, getVertices } from './utils';\nimport MarkerArrow, { MARK_ARROW_ID } from './MarkerArrow';\nimport MarkerActivatedArrow, { MARK_ACTIVATED_ARROW_ID } from './MarkerActivatedArrow';\nimport { FlowRendererKey, FlowRendererRegistry } from '../flow-renderer-registry';\n\ninterface PropsType extends FlowTransitionLine {\n radius?: number;\n hide?: boolean;\n xRadius?: number;\n yRadius?: number;\n}\n\nfunction MarkerDefs(props: { id: string; activated?: boolean }): JSX.Element {\n const renderRegistry = useService(FlowRendererRegistry);\n const ArrowRenderer = renderRegistry?.tryToGetRendererComponent(\n props.activated ? FlowRendererKey.MARKER_ACTIVATE_ARROW : FlowRendererKey.MARKER_ARROW\n );\n if (ArrowRenderer) {\n return <ArrowRenderer.renderer {...props} />;\n }\n if (props.activated) {\n return (\n <defs>\n <MarkerActivatedArrow id={props.id} />\n </defs>\n );\n }\n return (\n <defs>\n <MarkerArrow id={props.id} />\n </defs>\n );\n}\n/**\n * 圆角转弯线\n */\nfunction RoundedTurningLine(props: PropsType): JSX.Element | null {\n const { vertices, radius = DEFAULT_RADIUS, hide, xRadius, yRadius, ...line } = props;\n const { from, to, arrow, activated, style } = line || {};\n const { baseActivatedColor, baseColor } = useBaseColor();\n\n // 如果没有 vertices,根据线条类型计算转折点\n const realVertices =\n vertices ||\n (props.isHorizontal\n ? getHorizontalVertices(line, xRadius, yRadius)\n : getVertices(line, xRadius, yRadius));\n const middleStr: string = useMemo(\n () =>\n realVertices\n .map((point, idx) => {\n const prev = realVertices[idx - 1] || from;\n const next = realVertices[idx + 1] || to;\n\n // 前后 delta 变化\n const prevDelta = { x: Math.abs(prev.x - point.x), y: Math.abs(prev.y - point.y) };\n const nextDelta = { x: Math.abs(next.x - point.x), y: Math.abs(next.y - point.y) };\n\n // 不是垂直直角的拐弯线报错\n const isRightAngleX = prevDelta.x === 0 && nextDelta.y === 0;\n const isRightAngleY = prevDelta.y === 0 && nextDelta.x === 0;\n const isRightAngle = isRightAngleX || isRightAngleY;\n\n if (!isRightAngle) {\n console.error(`vertex ${point.x},${point.y} is not right angle`);\n }\n\n // 圆角入点和出点为 control 往两个方向移动一段距离,距离不够 radius 为短距离\n const inPoint = new Point().copyFrom(point);\n const outPoint = new Point().copyFrom(point);\n const radiusX = isNil(point.radiusX) ? radius : point.radiusX;\n const radiusY = isNil(point.radiusY) ? radius : point.radiusY;\n let rx = radiusX;\n let ry = radiusY;\n\n if (isRightAngleX) {\n ry = Math.min(prevDelta.y, radiusY);\n const moveY = isNil(point.moveY) ? ry : point.moveY;\n inPoint.y += from.y < point.y ? -moveY : +moveY;\n\n rx = Math.min(nextDelta.x, radiusX);\n const moveX = isNil(point.moveX) ? rx : point.moveX;\n outPoint.x += to.x < point.x ? -moveX : +moveX;\n }\n\n if (isRightAngleY) {\n rx = Math.min(prevDelta.x, radiusX);\n const moveX = isNil(point.moveX) ? rx : point.moveX;\n inPoint.x += from.x < point.x ? -moveX : +moveX;\n\n ry = Math.min(nextDelta.y, radiusY);\n const moveY = isNil(point.moveY) ? ry : point.moveY;\n outPoint.y += to.y < point.y ? -moveY : +moveY;\n }\n\n // radius overflow 策略为截断,则回复 rx, ry 为原始 radius\n if (point.radiusOverflow === 'truncate') {\n rx = radiusX;\n ry = radiusY;\n }\n\n // 是否是顺时针?\n // - 基于 AB 和 AC 的向量叉积\n // - A 点:inPoint, B 点:point, C 点:outPoint\n const crossProduct =\n (point.x - inPoint.x) * (outPoint.y - inPoint.y) -\n (point.y - inPoint.y) * (outPoint.x - inPoint.x);\n const isClockWise = crossProduct > 0;\n\n // 控制点为当前节点\n return `L ${inPoint.x} ${inPoint.y} A ${rx} ${ry} 0 0 ${isClockWise ? 1 : 0} ${\n outPoint.x\n } ${outPoint.y}`;\n })\n .join(' '),\n [realVertices]\n );\n\n if (hide) {\n return null;\n }\n\n const pathStr = `M ${from.x} ${from.y} ${middleStr} L ${to.x} ${to.y}`;\n const markerId = activated\n ? `${MARK_ACTIVATED_ARROW_ID}${props.lineId}`\n : `${MARK_ARROW_ID}${props.lineId}`;\n\n return (\n <>\n {arrow ? <MarkerDefs id={markerId} activated={activated} /> : null}\n <path\n data-line-id={props.lineId}\n d={pathStr}\n {...DEFAULT_LINE_ATTRS}\n stroke={activated ? baseActivatedColor : baseColor}\n {...(arrow\n ? {\n markerEnd: `url(#${markerId})`,\n }\n : {})}\n style={style}\n ></path>\n </>\n );\n}\n\n// version 变化才触发组件更新\nexport default RoundedTurningLine;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { useBaseColor } from '../hooks/use-base-color';\n\nexport const MARK_ARROW_ID = '$marker_arrow$';\n// export const MARK_ARROW_URL = `url(#${MARK_ARROW_ID})`;\n\nfunction MarkerArrow(props: { id: string }): JSX.Element {\n const { baseColor } = useBaseColor();\n return (\n <marker\n data-line-id={props.id}\n id={props.id || MARK_ARROW_ID}\n markerWidth=\"11\"\n markerHeight=\"14\"\n refX=\"10\"\n refY=\"7\"\n orient=\"auto\"\n >\n <path\n d=\"M9.6 5.2C10.8 6.1 10.8 7.9 9.6 8.8L3.6 13.3C2.11672 14.4125 0 13.3541 0 11.5L0 2.5C0 0.645898 2.11672 -0.412461 3.6 0.7L9.6 5.2Z\"\n fill={baseColor}\n />\n </marker>\n );\n}\n\n// version变化才触发组件更新\nexport default MarkerArrow;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { useBaseColor } from '../hooks/use-base-color';\n\nexport const MARK_ACTIVATED_ARROW_ID = '$marker_arrow_activated$';\n// export const MARK_ACTIVATED_ARROW_URL = `url(#${MARK_ACTIVATED_ARROW_ID})`;\n\nfunction MarkerActivatedArrow(props: { id?: string }): JSX.Element {\n const { baseActivatedColor } = useBaseColor();\n return (\n <marker\n data-line-id={props.id}\n id={props.id || MARK_ACTIVATED_ARROW_ID}\n markerWidth=\"11\"\n markerHeight=\"14\"\n refX=\"10\"\n refY=\"7\"\n orient=\"auto\"\n >\n <path\n d=\"M9.6 5.2C10.8 6.1 10.8 7.9 9.6 8.8L3.6 13.3C2.11672 14.4125 0 13.3541 0 11.5L0 2.5C0 0.645898 2.11672 -0.412461 3.6 0.7L9.6 5.2Z\"\n fill={baseActivatedColor}\n />\n </marker>\n );\n}\n\n// version 变化才触发组件更新\nexport default MarkerActivatedArrow;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport type { FlowTransitionLine } from '@flowgram.ai/document';\n\nimport { type FlowRendererRegistry } from '../flow-renderer-registry';\n\ninterface PropsType extends FlowTransitionLine {\n rendererRegistry: FlowRendererRegistry;\n}\n\nfunction CustomLine(props: PropsType): JSX.Element {\n const { renderKey, rendererRegistry, ...line } = props;\n\n if (!renderKey) {\n return <></>;\n }\n\n const renderer = rendererRegistry.getRendererComponent(renderKey);\n\n if (!renderer) {\n return <></>;\n }\n\n const Component = renderer.renderer as (props: FlowTransitionLine) => JSX.Element;\n\n return <Component lineId={props.lineId} {...line} />;\n}\n\nexport default CustomLine;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { throttle } from 'lodash-es';\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowNodeEntity,\n FlowNodeTransitionData,\n FlowRendererStateEntity,\n} from '@flowgram.ai/document';\nimport { Layer, observeEntity, observeEntityDatas } from '@flowgram.ai/core';\n\nimport { useBaseColor } from '../hooks/use-base-color';\nimport { FlowRendererRegistry } from '../flow-renderer-registry';\nimport { createLabels } from '../components/LabelsRenderer';\n\n@injectable()\nexport class FlowLabelsLayer extends Layer {\n @inject(FlowDocument) readonly document: FlowDocument;\n\n @inject(FlowRendererRegistry) readonly rendererRegistry: FlowRendererRegistry;\n\n node = domUtils.createDivWithClass('gedit-flow-labels-layer');\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntity(FlowRendererStateEntity)\n readonly flowRenderState: FlowRendererStateEntity;\n\n /**\n * 监听 transition 变化\n */\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransitionData)\n _transitions: FlowNodeTransitionData[];\n\n get transitions(): FlowNodeTransitionData[] {\n return this.document.getRenderDatas<FlowNodeTransitionData>(FlowNodeTransitionData);\n }\n\n /**\n * 监听缩放,目前采用整体缩放\n * @param scale\n */\n onZoom(scale: number) {\n this.node!.style.transform = `scale(${scale})`;\n }\n\n /**\n * 可视区域变化\n */\n onViewportChange: ReturnType<typeof throttle> = throttle(() => {\n this.render();\n }, 100);\n\n onReady() {\n // 图层顺序调整:节点 > label > 线条\n // 节点 z-index: 10\n this.node.style.zIndex = '9';\n }\n\n /**\n * 监听readonly和 disabled 状态 并刷新layer, 并刷新\n */\n onReadonlyOrDisabledChange() {\n this.render();\n }\n\n render() {\n const labels: JSX.Element[] = [];\n if (this.documentTransformer?.loading) return <></>;\n this.documentTransformer?.refresh?.();\n const { baseActivatedColor, baseColor } = useBaseColor();\n const isViewportVisible = this.config.isViewportVisible.bind(this.config);\n this.transitions.forEach((transition) => {\n createLabels({\n data: transition,\n rendererRegistry: this.rendererRegistry,\n isViewportVisible,\n labelsSave: labels,\n getLabelColor: (activated) => (activated ? baseActivatedColor : baseColor),\n });\n });\n // 这里采用扁平化的 react 结构性能更高\n return <>{labels}</>;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { type IPoint, Rectangle } from '@flowgram.ai/utils';\nimport {\n type CustomLabelProps,\n type FlowNodeTransitionData,\n type FlowTransitionLabel,\n FlowTransitionLabelEnum,\n} from '@flowgram.ai/document';\n\nimport { type FlowRendererRegistry } from '../flow-renderer-registry';\nimport CollapseAdder from './CollapseAdder';\nimport Collapse from './Collapse';\nimport BranchDraggableRenderer from './BranchDraggableRenderer';\nimport Adder from './Adder';\n\nexport interface LabelOpts {\n // eslint-disable-next-line react/no-unused-prop-types\n data: FlowNodeTransitionData;\n rendererRegistry: FlowRendererRegistry;\n isViewportVisible: (bounds: Rectangle) => boolean;\n labelsSave: JSX.Element[];\n getLabelColor: (activated?: boolean) => string;\n}\n\nconst TEXT_LABEL_STYLE: React.CSSProperties = {\n fontSize: 12,\n color: '#8F959E',\n textAlign: 'center',\n whiteSpace: 'nowrap',\n backgroundColor: 'var(--g-editor-background)',\n lineHeight: '20px',\n};\n\nconst LABEL_MAX_WIDTH = 150;\nconst LABEL_MAX_HEIGHT = 60;\n\nfunction getLabelBounds(offset: IPoint) {\n return new Rectangle(\n offset.x - LABEL_MAX_WIDTH / 2,\n offset.y - LABEL_MAX_HEIGHT / 2,\n LABEL_MAX_WIDTH,\n LABEL_MAX_HEIGHT\n );\n}\n\nexport function createLabels(labelProps: LabelOpts): void {\n const { data, rendererRegistry, labelsSave, getLabelColor } = labelProps;\n const { labels, renderData } = data || {};\n const { activated } = renderData || {};\n\n // 标签绘制逻辑\n const renderLabel = (label: FlowTransitionLabel, index: number) => {\n const { offset, renderKey, props, rotate, origin, type } = label || {};\n const offsetX = offset.x;\n const offsetY = offset.y;\n\n let child = null;\n switch (type) {\n case FlowTransitionLabelEnum.BRANCH_DRAGGING_LABEL:\n child = (\n <BranchDraggableRenderer\n labelId={label.labelId || labelProps.data.entity.id}\n rendererRegistry={rendererRegistry}\n data={data}\n {...props}\n />\n );\n break;\n case FlowTransitionLabelEnum.ADDER_LABEL:\n child = (\n <Adder\n labelId={label.labelId || labelProps.data.entity.id}\n rendererRegistry={rendererRegistry}\n data={data}\n {...props}\n />\n );\n break;\n\n case FlowTransitionLabelEnum.COLLAPSE_LABEL:\n child = (\n <Collapse\n labelId={label.labelId || labelProps.data.entity.id}\n rendererRegistry={rendererRegistry}\n data={data}\n {...props}\n />\n );\n break;\n\n case FlowTransitionLabelEnum.COLLAPSE_ADDER_LABEL:\n child = (\n <CollapseAdder\n labelId={label.labelId || labelProps.data.entity.id}\n rendererRegistry={rendererRegistry}\n data={data}\n {...props}\n />\n );\n break;\n\n case FlowTransitionLabelEnum.TEXT_LABEL:\n if (!renderKey) {\n return null;\n }\n const text = rendererRegistry.getText(renderKey) || renderKey;\n child = (\n <div\n data-label-id={label.labelId || labelProps.data.entity.id}\n style={{\n ...TEXT_LABEL_STYLE,\n ...props?.style,\n color: getLabelColor(activated),\n transform: rotate ? `rotate(${rotate})` : undefined,\n }}\n >\n {text}\n </div>\n );\n break;\n\n case FlowTransitionLabelEnum.CUSTOM_LABEL:\n if (!renderKey) {\n return null;\n }\n try {\n const renderer = rendererRegistry.getRendererComponent(renderKey);\n child = React.createElement(\n renderer.renderer as (props: any) => JSX.Element,\n {\n node: data.entity,\n labelId: label.labelId || labelProps.data.entity.id,\n ...props,\n } as CustomLabelProps\n );\n } catch (err) {\n console.error(err);\n child = renderKey;\n }\n break;\n default:\n break;\n }\n\n const originX = typeof origin?.[0] === 'number' ? origin?.[0] : 0.5;\n const originY = typeof origin?.[1] === 'number' ? origin?.[1] : 0.5;\n\n return (\n <div\n key={`${data.entity.id}${index}`}\n data-label-id={label.labelId || labelProps.data.entity.id}\n style={{\n position: 'absolute',\n left: offsetX,\n top: offsetY,\n transform: `translate(-${originX * 100}%, -${originY * 100}%)`,\n }}\n >\n {child}\n </div>\n );\n };\n\n labels.forEach((label, index) => {\n if (labelProps.isViewportVisible(getLabelBounds(label.offset))) {\n labelsSave.push(renderLabel(label, index) as JSX.Element);\n }\n });\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { useState, useCallback } from 'react';\n\nimport {\n type CollapseAdderProps,\n FlowNodeRenderData,\n type FlowNodeTransitionData,\n} from '@flowgram.ai/document';\n\nimport { type FlowRendererRegistry } from '../flow-renderer-registry';\nimport Collapse from './Collapse';\nimport Adder from './Adder';\n\ninterface PropsType extends Partial<CollapseAdderProps> {\n data: FlowNodeTransitionData;\n rendererRegistry: FlowRendererRegistry;\n // 业务自定义 props\n [key: string]: unknown;\n}\n\n/**\n * 加号和收起复合 Label\n * @param props\n * @returns\n */\nexport default function CollapseAdder(props: PropsType) {\n const { data, rendererRegistry, ...restProps } = props;\n const { activateNode } = restProps;\n\n // 收起展开按钮是否可见\n const [hoverActivated, setHoverActivated] = useState(false);\n\n const activateData = activateNode?.getData(FlowNodeRenderData);\n\n const handleMouseEnter = useCallback(() => {\n setHoverActivated(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setHoverActivated(false);\n }, []);\n\n const isVertical = activateNode?.isVertical;\n const activated = activateData?.hovered || hoverActivated;\n if (isVertical) {\n return (\n <div\n className=\"flow-canvas-collapse-adder\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {(activated || data.collapsed) && (\n <Collapse\n forceVisible\n {...props}\n wrapperStyle={{\n alignItems: 'flex-end',\n }}\n hoverHeight={20}\n />\n )}\n {!data.collapsed && (\n <Adder {...props} hoverHeight={activated ? 20 : 40} hoverActivated={activated} />\n )}\n </div>\n );\n }\n\n return (\n <div\n className=\"flow-canvas-collapse-adder\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n style={{\n display: data.collapsed ? 'block' : 'flex',\n }}\n >\n {(activated || data.collapsed) && (\n <Collapse\n forceVisible\n {...props}\n wrapperStyle={{\n justifyContent: 'flex-end',\n }}\n hoverWidth={20}\n />\n )}\n {!data.collapsed && (\n <Adder {...props} hoverWidth={activated ? 20 : 40} hoverActivated={activated} />\n )}\n </div>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { useState, useCallback } from 'react';\n\nimport {\n type CollapseProps,\n FlowNodeRenderData,\n type FlowNodeTransitionData,\n} from '@flowgram.ai/document';\n\nimport { FlowRendererKey, type FlowRendererRegistry } from '../flow-renderer-registry';\nimport { getTransitionLabelHoverHeight, getTransitionLabelHoverWidth } from './utils';\n\ninterface PropsType extends Partial<CollapseProps> {\n data: FlowNodeTransitionData;\n rendererRegistry: FlowRendererRegistry;\n hoverHeight?: number;\n hoverWidth?: number;\n wrapperStyle?: React.CSSProperties;\n // 业务自定义 props\n [key: string]: unknown;\n}\n\nexport default function Collapse(props: PropsType) {\n const {\n data,\n rendererRegistry,\n forceVisible,\n hoverHeight = getTransitionLabelHoverHeight(data),\n hoverWidth = getTransitionLabelHoverWidth(data),\n wrapperStyle,\n ...restProps\n } = props;\n const { activateNode } = restProps;\n\n const [hoverActivated, setHoverActivated] = useState(false);\n const activateData = activateNode?.getData(FlowNodeRenderData);\n\n const handleMouseEnter = useCallback(() => {\n setHoverActivated(true);\n activateData?.toggleMouseEnter();\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setHoverActivated(false);\n activateData?.toggleMouseLeave();\n }, []);\n\n const collapseOpener = rendererRegistry.getRendererComponent(FlowRendererKey.COLLAPSE);\n const node = data.entity;\n\n const child = React.createElement(\n collapseOpener.renderer as (props: CollapseProps) => JSX.Element,\n {\n node,\n collapseNode: node,\n ...restProps,\n hoverActivated,\n } as CollapseProps,\n );\n\n const isChildVisible = data.collapsed || activateData?.hovered || hoverActivated || forceVisible;\n\n return (\n <div\n className=\"flow-canvas-collapse\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n style={{\n width: hoverWidth,\n height: hoverHeight,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n ...wrapperStyle,\n }}\n >\n {isChildVisible ? child : null}\n </div>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { useCallback, useState } from 'react';\n\nimport {\n type AdderProps,\n type FlowNodeTransitionData,\n type FlowNodeEntity,\n FlowDragService,\n} from '@flowgram.ai/document';\nimport { useService } from '@flowgram.ai/core';\n\nimport { FlowRendererKey, type FlowRendererRegistry } from '../flow-renderer-registry';\nimport { getTransitionLabelHoverHeight, getTransitionLabelHoverWidth } from './utils';\n\ninterface PropsType {\n data: FlowNodeTransitionData;\n rendererRegistry: FlowRendererRegistry;\n hoverWidth?: number;\n hoverHeight?: number;\n // 业务自定义 props\n [key: string]: unknown;\n}\n\n// export only for tests\nexport const getFlowRenderKey = (\n node: FlowNodeEntity,\n { dragService }: { dragService?: FlowDragService },\n) => {\n if (dragService && dragService.dragging && dragService.isDroppableNode(node)) {\n if (dragService.dropNodeId === node.id) {\n return FlowRendererKey.DRAG_HIGHLIGHT_ADDER;\n }\n return FlowRendererKey.DRAGGABLE_ADDER;\n }\n\n return FlowRendererKey.ADDER;\n};\n\n/**\n * Adder 高亮热区扩散目的:\n * ux 调研的时候不少用户反馈点看的不是很清楚(初始点较小)\n * 因此给的解决办法是加深加大 icon 再加扩大 hover 热区\n *\n * Adder 模块高亮规则:\n * 取前后节点宽度的最大值为高亮区域宽度\n * 高度固定为 32px\n */\nexport default function Adder(props: PropsType) {\n const {\n data,\n rendererRegistry,\n hoverHeight = getTransitionLabelHoverHeight(data),\n hoverWidth = getTransitionLabelHoverWidth(data),\n ...restProps\n } = props;\n\n const [hoverActivated, setHoverActivated] = useState(false);\n\n const handleMouseEnter = useCallback(() => setHoverActivated(true), []);\n const handleMouseLeave = useCallback(() => setHoverActivated(false), []);\n\n const node = data.entity;\n\n const dragService = useService<FlowDragService>(FlowDragService);\n\n // 根据拖拽条件转换状态\n const flowRenderKey = getFlowRenderKey(node, { dragService });\n\n const adder = rendererRegistry.getRendererComponent(flowRenderKey);\n const from = node;\n // 获取 originTree 的 to 节点\n const to = data.entity.document.renderTree.getOriginInfo(node).next;\n // 实际渲染的 to 节点\n const renderTo = node.next;\n\n const child = React.createElement(\n adder.renderer as (props: AdderProps) => JSX.Element,\n {\n node,\n from,\n to,\n renderTo,\n hoverActivated,\n setHoverActivated,\n hoverWidth,\n hoverHeight,\n ...restProps,\n } as AdderProps,\n );\n\n return (\n // eslint-disable-next-line react/jsx-filename-extension\n <div\n className=\"flow-canvas-adder\"\n data-testid=\"sdk.flowcanvas.line.adder\"\n data-from={from.id}\n data-to={to?.id ?? ''}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n style={{\n width: hoverWidth,\n height: hoverHeight,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n {child}\n </div>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport {\n type AdderProps,\n type FlowNodeTransitionData,\n type LABEL_SIDE_TYPE,\n FlowDragService,\n} from '@flowgram.ai/document';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { useService } from '@flowgram.ai/core';\n\nimport { FlowRendererKey, type FlowRendererRegistry } from '../flow-renderer-registry';\n\ninterface PropsType {\n data: FlowNodeTransitionData;\n rendererRegistry: FlowRendererRegistry;\n hoverHeight?: number;\n side?: LABEL_SIDE_TYPE;\n // 业务自定义 props\n [key: string]: unknown;\n}\n\nconst getFlowRenderKey = (\n node: FlowNodeEntity,\n { dragService, side }: { dragService: FlowDragService; side?: LABEL_SIDE_TYPE },\n) => {\n if (\n dragService.isDragBranch &&\n side &&\n dragService.labelSide === side &&\n dragService.isDroppableBranch(node, side)\n ) {\n if (dragService.dropNodeId === node.id) {\n // 元素拖拽区域激活\n return FlowRendererKey.DRAG_BRANCH_HIGHLIGHT_ADDER;\n }\n // 节点元素拖拽,展示可被拖入区域为添加节点位置\n return FlowRendererKey.DRAGGABLE_ADDER;\n }\n\n // 默认不展示\n return '';\n};\n\n/**\n * 分支可被拖拽进入区域样式渲染\n */\nexport default function BranchDraggableRenderer(props: PropsType) {\n const { data, rendererRegistry, side, ...restProps } = props;\n\n const node = data.entity;\n\n const dragService = useService<FlowDragService>(FlowDragService);\n\n const flowRenderKey = getFlowRenderKey(node, { side, dragService });\n\n if (!flowRenderKey) {\n return null;\n }\n const adder = rendererRegistry.getRendererComponent(flowRenderKey);\n const from = node;\n // 获取 originTree 的 to 节点\n const to = data.entity.document.renderTree.getOriginInfo(node).next;\n // 实际渲染的 to 节点\n const renderTo = node.next;\n\n const child = React.createElement(\n adder.renderer as (props: AdderProps) => JSX.Element,\n {\n node,\n from,\n to,\n renderTo,\n ...restProps,\n } as AdderProps,\n );\n\n return <div className=\"flow-canvas-branch-draggable-adder\">{child}</div>;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowNodeEntity,\n FlowNodeTransformData,\n} from '@flowgram.ai/document';\nimport { Layer, observeEntity, observeEntityDatas } from '@flowgram.ai/core';\n\nimport { getScrollViewport } from '../utils';\n\nlet rgbTimes = 0;\n\nfunction randomColor(percent: number): string {\n const max = Math.min((percent / 10) * 255, 255);\n rgbTimes += 1;\n // rgb 轮询就可以错开颜色\n const rgb = rgbTimes % 3;\n const random = () => Math.floor(Math.random() * max);\n return `rgb(${rgb === 0 ? random() : 0}, ${rgb === 1 ? random() : 0}, ${\n rgb === 2 ? random() : 0\n })`;\n}\n\n/**\n * 调试用,会绘出所有节点的边界\n */\n@injectable()\nexport class FlowDebugLayer extends Layer {\n @inject(FlowDocument) readonly document: FlowDocument;\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransformData) _transforms: FlowNodeTransformData[];\n\n get transforms(): FlowNodeTransformData[] {\n return this.document.getRenderDatas<FlowNodeTransformData>(FlowNodeTransformData);\n }\n\n node = document.createElement('div') as HTMLElement;\n\n viewport = domUtils.createDivWithClass('gedit-flow-debug-bounds');\n\n boundsNodes = domUtils.createDivWithClass('gedit-flow-debug-bounds');\n\n pointsNodes = domUtils.createDivWithClass('gedit-flow-debug-points');\n\n versionNodes = domUtils.createDivWithClass('gedit-flow-debug-versions gedit-hidden');\n\n /**\n * ?debug=xxxx, 则返回 xxxx\n */\n filterKey = window.location.search.match(/debug=([^&]+)/)?.[1] || '';\n\n protected originLine = document.createElement('div') as HTMLDivElement;\n\n domCache = new WeakMap<\n FlowNodeTransformData,\n {\n color: string;\n bbox: HTMLDivElement;\n version: HTMLDivElement;\n input: HTMLDivElement;\n output: HTMLDivElement;\n }\n >();\n\n onReady() {\n this.node!.style.zIndex = '20';\n domUtils.setStyle(this.originLine, {\n position: 'absolute',\n width: 1,\n height: '100%',\n left: this.pipelineNode.style.left,\n top: 0,\n borderLeft: '1px dashed rgba(255, 0, 0, 0.5)',\n });\n this.pipelineNode.parentElement!.appendChild(this.originLine);\n this.node.appendChild(this.viewport);\n this.node.appendChild(this.versionNodes);\n this.node.appendChild(this.boundsNodes);\n this.node.appendChild(this.pointsNodes);\n this.renderScrollViewportBounds();\n }\n\n onScroll() {\n this.originLine.style.left = this.pipelineNode.style.left;\n this.renderScrollViewportBounds();\n }\n\n onResize() {\n this.renderScrollViewportBounds();\n }\n\n onZoom(scale: number) {\n this.node!.style.transform = `scale(${scale})`;\n this.renderScrollViewportBounds();\n }\n\n createBounds(transform: FlowNodeTransformData, color: string, depth: number): void {\n // 根据 debug=xxxx 进行匹配过滤\n if (this.filterKey && transform.key.indexOf(this.filterKey) === -1) return;\n let cache = this.domCache.get(transform)!;\n const { bounds, inputPoint, outputPoint } = transform;\n if (!cache) {\n const bbox = domUtils.createDivWithClass('') as HTMLDivElement;\n const input = domUtils.createDivWithClass('') as HTMLDivElement;\n const output = domUtils.createDivWithClass('') as HTMLDivElement;\n const version = domUtils.createDivWithClass('') as HTMLDivElement;\n bbox.title = transform.key;\n input.title = transform.key + '(input)';\n output.title = transform.key + '(output)';\n version.title = transform.key;\n this.boundsNodes.appendChild(bbox);\n this.pointsNodes.appendChild(input);\n this.pointsNodes.appendChild(output);\n this.versionNodes.appendChild(version);\n transform.onDispose(() => {\n bbox.remove();\n input.remove();\n output.remove();\n });\n cache = { bbox, input, output, version, color };\n this.domCache.set(transform, cache);\n }\n domUtils.setStyle(cache.version, {\n position: 'absolute',\n marginLeft: '-9px',\n marginTop: '-10px',\n borderRadius: 12,\n background: '#f54a45',\n padding: 4,\n color: 'navajowhite',\n display: transform.renderState.hidden ? 'none' : 'block',\n zIndex: depth + 1000,\n left: bounds.center.x,\n top: bounds.center.y,\n });\n cache.version.innerHTML = transform.version.toString();\n domUtils.setStyle(cache.input, {\n position: 'absolute',\n width: 10,\n height: 10,\n marginLeft: -5,\n marginTop: -5,\n borderRadius: 5,\n left: inputPoint.x,\n top: inputPoint.y,\n opacity: 0.4,\n zIndex: depth,\n backgroundColor: cache.color,\n whiteSpace: 'nowrap',\n overflow: 'visible',\n });\n cache.input.innerHTML = `${inputPoint.x},${inputPoint.y}`;\n domUtils.setStyle(cache.output, {\n position: 'absolute',\n width: 10,\n height: 10,\n marginLeft: -5,\n marginTop: -5,\n borderRadius: 5,\n left: outputPoint.x,\n top: outputPoint.y,\n opacity: 0.4,\n zIndex: depth,\n backgroundColor: cache.color,\n whiteSpace: 'nowrap',\n overflow: 'visible',\n });\n cache.output.innerHTML = `${outputPoint.x},${outputPoint.y}`;\n domUtils.setStyle(cache.bbox, {\n position: 'absolute',\n width: bounds.width,\n height: bounds.height,\n left: bounds.left,\n top: bounds.top,\n opacity: `${depth / 30}`,\n backgroundColor: cache.color,\n });\n }\n\n /**\n * 显示 viewport 可滚动区域\n */\n renderScrollViewportBounds() {\n const viewportBounds = getScrollViewport(\n {\n scrollX: this.config.config.scrollX,\n scrollY: this.config.config.scrollY,\n },\n this.config\n );\n domUtils.setStyle(this.viewport, {\n position: 'absolute',\n width: viewportBounds.width - 2,\n height: viewportBounds.height - 2,\n left: viewportBounds.left + 1,\n top: viewportBounds.top + 1,\n border: '1px solid rgba(200, 200, 255, 0.5)',\n });\n }\n\n autorun() {\n if (this.documentTransformer.loading) return;\n this.documentTransformer.refresh();\n // let lastDepth = 0\n let color = randomColor(0);\n this.document.traverse((entity, depth) => {\n const transform = entity.getData<FlowNodeTransformData>(FlowNodeTransformData)!;\n // if (lastDepth !== depth) {\n // // 层级变化则更新颜色\n // }\n color = randomColor(depth);\n this.createBounds(transform, color, depth);\n // lastDepth = depth\n });\n this.renderScrollViewportBounds();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Rectangle } from '@flowgram.ai/utils';\nimport { type PlaygroundConfigEntity } from '@flowgram.ai/core';\n\nexport interface ScrollData {\n scrollX: number;\n scrollY: number;\n}\n\n// viewport 缩小 30 像素\nconst SCROLL_LIMIT_PADDING = -120;\n\nexport function getScrollViewport(\n scrollData: ScrollData,\n config: PlaygroundConfigEntity\n): Rectangle {\n const scale = config.finalScale;\n return new Rectangle(\n scrollData.scrollX / scale,\n scrollData.scrollY / scale,\n config.config.width / scale,\n config.config.height / scale\n ).pad(SCROLL_LIMIT_PADDING / scale, SCROLL_LIMIT_PADDING / scale);\n}\n\n/**\n * 限制滚动\n */\nexport function scrollLimit(\n scroll: ScrollData,\n boundsList: Rectangle[],\n config: PlaygroundConfigEntity,\n initScroll: () => ScrollData\n): ScrollData {\n scroll = { ...scroll };\n const configData = config.config;\n const oldScroll = { scrollX: configData.scrollX, scrollY: configData.scrollY };\n // 画布 size 还没初始化滚动不限制\n if (boundsList.length === 0 || configData.width === 0 || configData.height === 0) return scroll;\n const viewport = getScrollViewport(scroll, config);\n const isVisible = boundsList.find((bounds) => Rectangle.isViewportVisible(bounds, viewport));\n if (!isVisible) {\n const oldViewport = getScrollViewport(oldScroll, config);\n const isOldVisible = boundsList.find((bounds) =>\n Rectangle.isViewportVisible(bounds, oldViewport)\n );\n // 如果之前也是不可见就不阻止\n if (!isOldVisible) {\n return initScroll();\n }\n return oldScroll;\n }\n return scroll;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/**\n * 滚动条点击事件监听\n */\nexport const ScrollBarEvents = Symbol('ScrollBarEvents');\n\nexport interface ScrollBarEvents {\n dragStart: () => void;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable, optional } from 'inversify';\nimport { FlowDocument, FlowNodeTransformData } from '@flowgram.ai/document';\nimport {\n Layer,\n observeEntity,\n PlaygroundConfigEntity,\n PlaygroundDrag,\n} from '@flowgram.ai/core';\nimport { domUtils, Rectangle } from '@flowgram.ai/utils';\n// import {\n// FlowDocument,\n// FlowDocumentTransformerEntity,\n// FlowNodeTransformData,\n// } from '@flowgram.ai/document'\n\nimport { ScrollBarEvents } from '../utils/scroll-bar-events';\nimport { getScrollViewport } from '../utils';\n\n// 中间区域边框宽度\nconst BORDER_WIDTH = 2;\n\n// 右下角预留的 offset\nconst BLOCK_OFFSET = 11;\n\n// 滚动条样式宽\nconst SCROLL_BAR_WIDTH = '7px';\n\n// 滚动条显示状态\nenum ScrollBarVisibility {\n Show = 'show',\n Hidden = 'hidden',\n}\n\nexport interface ScrollBarOptions {\n /**\n * 显示滚动条的时机,可选常驻或滚动时显示\n */\n showScrollBars: 'whenScrolling' | 'always';\n getBounds(): Rectangle;\n}\n\n/**\n * 渲染滚动条 layer\n */\n@injectable()\nexport class FlowScrollBarLayer extends Layer<ScrollBarOptions> {\n @optional()\n @inject(ScrollBarEvents)\n readonly events?: ScrollBarEvents;\n\n @inject(FlowDocument) @optional() flowDocument?: FlowDocument;\n\n @observeEntity(PlaygroundConfigEntity)\n protected playgroundConfigEntity: PlaygroundConfigEntity;\n\n // @observeEntity(FlowDocumentTransformerEntity) readonly documentTransformer: FlowDocumentTransformerEntity\n\n // 右滚动区域\n readonly rightScrollBar = domUtils.createDivWithClass('gedit-playground-scroll-right');\n\n // 右滚动条\n readonly rightScrollBarBlock = domUtils.createDivWithClass('gedit-playground-scroll-right-block');\n\n // 底滚动区域\n readonly bottomScrollBar = domUtils.createDivWithClass('gedit-playground-scroll-bottom');\n\n // 底滚动条\n readonly bottomScrollBarBlock = domUtils.createDivWithClass(\n 'gedit-playground-scroll-bottom-block',\n );\n\n // 最左边的位置\n private mostLeft: number;\n\n // 最右边的位置\n private mostRight: number;\n\n // 最上面的位置\n private mostTop: number;\n\n // 最下面的位置\n private mostBottom: number;\n\n // 视区宽度\n private viewportWidth: number;\n\n // 视区高度\n private viewportHeight: number;\n\n // 元素宽高\n private width: number;\n\n private height: number;\n\n // 底部滚动条宽度\n private scrollBottomWidth: number;\n\n // 右侧滚动条高度\n private scrollRightHeight: number;\n\n // 缩放比\n private scale: number;\n\n // 总滚动距离\n private sum = 0;\n\n // 初始 x 轴滚动距离\n private initialScrollX = 0;\n\n // 初始 y 轴滚动距离\n private initialScrollY = 0;\n\n // 隐藏滚动条的时延\n private hideTimeout: number | undefined;\n\n // 浏览器视图宽度\n get clientViewportWidth(): number {\n return this.viewportWidth * this.scale - BLOCK_OFFSET;\n }\n\n // 浏览器视图高度\n get clientViewportHeight(): number {\n return this.viewportHeight * this.scale - BLOCK_OFFSET;\n }\n\n // 视图的完整宽度\n get viewportFullWidth(): number {\n return this.mostLeft - this.mostRight;\n }\n\n // 视图的完整高度\n get viewportFullHeight(): number {\n return this.mostTop - this.mostBottom;\n }\n\n // 视图的可移动宽度\n get viewportMoveWidth(): number {\n return this.mostLeft - this.mostRight + this.width;\n }\n\n // 视图的可移动高度\n get viewportMoveHeight(): number {\n return this.mostTop - this.mostBottom + this.height;\n }\n\n getToLeft(scrollX: number): number {\n return ((scrollX - this.mostRight) / this.viewportMoveWidth) * this.clientViewportWidth;\n }\n\n getToTop(scrollY: number): number {\n return ((scrollY - this.mostBottom) / this.viewportMoveHeight) * this.clientViewportHeight;\n }\n\n clickRightScrollBar(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n const ratio = 1 - (e?.y || 0) / this.clientViewportHeight;\n const scrollY = (this.mostTop - this.viewportFullHeight * ratio) * this.scale;\n\n // 滚动到指定位置\n this.playgroundConfigEntity.scroll(\n {\n scrollY,\n },\n false,\n );\n }\n\n clickBottomScrollBar(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n const ratio = 1 - (e?.x || 0) / this.clientViewportWidth;\n const scrollX = (this.mostLeft - this.viewportFullWidth * ratio) * this.scale;\n\n // 滚动到指定位置\n this.playgroundConfigEntity.scroll(\n {\n scrollX,\n },\n false,\n );\n }\n\n onBoardingToast() {\n // onBoarding 逻辑,滚动条指示优化,弹出 toast\n this.events?.dragStart();\n }\n\n protected bottomGrabDragger = new PlaygroundDrag({\n onDragStart: e => {\n this.config.updateCursor('grabbing');\n this.sum = 0;\n this.initialScrollX = this.config.getViewport().x;\n this.onBoardingToast();\n },\n onDrag: e => {\n this.sum += e.movingDelta.x;\n this.playgroundConfigEntity.scroll(\n {\n scrollX:\n (this.initialScrollX +\n (this.sum * this.viewportFullWidth) /\n (this.clientViewportWidth - this.scrollBottomWidth)) *\n this.scale,\n },\n false,\n );\n },\n onDragEnd: e => {\n this.config.updateCursor('default');\n },\n });\n\n protected rightGrabDragger = new PlaygroundDrag({\n onDragStart: e => {\n this.config.updateCursor('grabbing');\n this.sum = 0;\n this.initialScrollY = this.config.getViewport().y;\n this.onBoardingToast();\n },\n onDrag: e => {\n this.sum += e.movingDelta.y;\n this.playgroundConfigEntity.scroll(\n {\n scrollY:\n (this.initialScrollY +\n (this.sum * this.viewportFullHeight) /\n (this.clientViewportHeight - this.scrollRightHeight)) *\n this.scale,\n },\n false,\n );\n },\n onDragEnd: e => {\n this.config.updateCursor('default');\n },\n });\n\n protected changeScrollBarVisibility(scrollBar: HTMLDivElement, status: ScrollBarVisibility) {\n const addClassName =\n status === ScrollBarVisibility.Show\n ? 'gedit-playground-scroll-show'\n : 'gedit-playground-scroll-hidden';\n const delClassName =\n status === ScrollBarVisibility.Show\n ? 'gedit-playground-scroll-hidden'\n : 'gedit-playground-scroll-show';\n domUtils.addClass(scrollBar, addClassName);\n domUtils.delClass(scrollBar, delClassName);\n }\n\n onReady() {\n if (!this.options.getBounds) {\n this.options = {\n getBounds: () => {\n const document = this.flowDocument;\n if (!document) return Rectangle.EMPTY;\n document.transformer.refresh();\n return document.root.getData(FlowNodeTransformData)!.bounds;\n },\n showScrollBars: 'whenScrolling',\n };\n }\n this.pipelineNode.parentNode!.appendChild(this.rightScrollBar);\n this.pipelineNode.parentNode!.appendChild(this.rightScrollBarBlock);\n this.pipelineNode.parentNode!.appendChild(this.bottomScrollBar);\n this.pipelineNode.parentNode!.appendChild(this.bottomScrollBarBlock);\n // 模拟滚动条点击时的滚动\n this.rightScrollBar.onclick = this.clickRightScrollBar.bind(this);\n this.bottomScrollBar.onclick = this.clickBottomScrollBar.bind(this);\n\n // 滚动时才显示滚动条 则要监听鼠标事件 hover 的时候也要显示\n if (this.options.showScrollBars === 'whenScrolling') {\n this.rightScrollBar.addEventListener('mouseenter', (e: MouseEvent) => {\n this.changeScrollBarVisibility(this.rightScrollBarBlock, ScrollBarVisibility.Show);\n });\n this.rightScrollBar.addEventListener('mouseleave', (e: MouseEvent) => {\n this.changeScrollBarVisibility(this.rightScrollBarBlock, ScrollBarVisibility.Hidden);\n });\n this.bottomScrollBar.addEventListener('mouseenter', (e: MouseEvent) => {\n this.changeScrollBarVisibility(this.bottomScrollBarBlock, ScrollBarVisibility.Show);\n });\n this.bottomScrollBar.addEventListener('mouseleave', (e: MouseEvent) => {\n this.changeScrollBarVisibility(this.bottomScrollBarBlock, ScrollBarVisibility.Hidden);\n });\n }\n\n // 监听拖拽滚动\n this.bottomScrollBarBlock.addEventListener('mousedown', (e: MouseEvent) => {\n this.bottomGrabDragger.start(e.clientX, e.clientY);\n e.stopPropagation();\n });\n this.rightScrollBarBlock.addEventListener('mousedown', (e: MouseEvent) => {\n this.rightGrabDragger.start(e.clientX, e.clientY);\n e.stopPropagation();\n });\n }\n\n autorun() {\n // if (this.documentTransformer.loading) return null\n // this.documentTransformer.refresh()\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n }\n\n // 中间活动区域宽高\n const viewportBounds = getScrollViewport(\n {\n scrollX: this.config.config.scrollX,\n scrollY: this.config.config.scrollY,\n },\n this.config,\n );\n\n // 画布视区宽高\n const viewport = this.config.getViewport();\n // 计算视区的时候预留 11px,防止右下角滚动条重叠\n this.viewportWidth = viewport.width;\n this.viewportHeight = viewport.height;\n // 中间部分元素的宽高\n const rootBounds = this.options.getBounds(); // this.document.root.getData(FlowNodeTransformData)!.bounds\n this.width = rootBounds?.width || 0;\n this.height = rootBounds?.height || 0;\n // 中间部分元素的左右间距\n const paddingLeftRight = (this.viewportWidth - viewportBounds.width) / 2 - BORDER_WIDTH;\n // 中间部分元素的上下间距\n const paddingTopBottom = (this.viewportHeight - viewportBounds.height) / 2 - BORDER_WIDTH;\n\n // 画布可滚动总长度\n const canvasTotalWidth = this.width + viewportBounds.width;\n const canvasTotalHeight = this.height + viewportBounds.height;\n // 根据当前滚动距离计算 滚动条距离边界间距\n // 中间元素初始的偏移位置:\n const initialOffsetX = rootBounds.x;\n const initialOffsetY = rootBounds.y;\n // 最左边的位置\n this.mostLeft = this.width + initialOffsetX - paddingLeftRight;\n // 最右边的位置\n this.mostRight = this.mostLeft - canvasTotalWidth;\n // 最上面的位置\n this.mostTop = this.height + initialOffsetY - paddingTopBottom;\n // 最下面的位置\n this.mostBottom = this.mostTop - canvasTotalHeight;\n\n this.scale = this.config.finalScale;\n\n const calcViewportWidth = this.clientViewportWidth;\n const calcViewportHeight = this.clientViewportHeight;\n // 计算公式:\n // 可视区域 - 滚动条的长度 / 可视区域 = 可视区域 / 画布可滚动距离\n // 底部滚动条宽度\n this.scrollBottomWidth =\n calcViewportWidth -\n (calcViewportWidth * (this.mostLeft - this.mostRight)) / this.viewportMoveWidth;\n // 右侧滚动条高度\n this.scrollRightHeight =\n calcViewportHeight -\n (calcViewportHeight * (this.mostTop - this.mostBottom)) / this.viewportMoveHeight;\n\n // 计算滚动条滚动位移的距离\n // 可滚动区域:canvasTotalWidth - scrollBottomWidth\n const bottomBarToLeft = this.getToLeft(viewport.x);\n const rightBarToTop = this.getToTop(viewport.y);\n\n // 设置右侧的滚动条内的 block 样式\n domUtils.setStyle(this.rightScrollBarBlock, {\n right: 2,\n top: rightBarToTop,\n background: '#1F2329',\n zIndex: 10,\n height: this.scrollRightHeight,\n width: SCROLL_BAR_WIDTH,\n });\n // 设置底部的滚动条内的 block 样式\n domUtils.setStyle(this.bottomScrollBarBlock, {\n left: bottomBarToLeft,\n bottom: 2,\n background: '#1F2329',\n zIndex: 10,\n height: SCROLL_BAR_WIDTH,\n width: this.scrollBottomWidth,\n });\n this.changeScrollBarVisibility(this.rightScrollBarBlock, ScrollBarVisibility.Show);\n this.changeScrollBarVisibility(this.bottomScrollBarBlock, ScrollBarVisibility.Show);\n\n // 滚动时才显示滚动条\n // 定时器在 1s 后隐藏滚动条\n if (this.options.showScrollBars === 'whenScrolling') {\n this.hideTimeout = window.setTimeout(() => {\n this.changeScrollBarVisibility(this.rightScrollBarBlock, ScrollBarVisibility.Hidden);\n this.changeScrollBarVisibility(this.bottomScrollBarBlock, ScrollBarVisibility.Hidden);\n this.hideTimeout = undefined;\n }, 1000);\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport ReactDOM from 'react-dom';\nimport React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { Rectangle, Xor } from '@flowgram.ai/utils';\nimport {\n FlowDocument,\n FlowNodeBaseType,\n FlowNodeEntity,\n FlowNodeRenderData,\n FlowNodeTransformData,\n FlowNodeTransitionData,\n FlowRendererStateEntity,\n type LABEL_SIDE_TYPE,\n FlowDragService,\n FlowNodeJSON,\n} from '@flowgram.ai/document';\nimport {\n EditorState,\n EditorStateConfigEntity,\n Layer,\n observeEntity,\n observeEntityDatas,\n PlaygroundConfigEntity,\n} from '@flowgram.ai/core';\nimport { PlaygroundDrag } from '@flowgram.ai/core';\n\nimport {\n type FlowRendererComponent,\n FlowRendererKey,\n FlowRendererRegistry,\n} from '../flow-renderer-registry';\nimport { type CollisionRetType, FlowDragEntity } from '../entities/flow-drag-entity';\nimport { FlowSelectConfigEntity } from '../entities';\n\n// 移动超过一定距离后触发拖拽生效\nconst DRAG_OFFSET = 10;\n\nconst DEFAULT_DRAG_OFFSET_X = 8;\nconst DEFAULT_DRAG_OFFSET_Y = 8;\n\ninterface Position {\n x: number;\n y: number;\n}\n\ntype StartDragProps = {\n dragEntities?: FlowNodeEntity[];\n} & Xor<\n {\n dragStartEntity: FlowNodeEntity;\n },\n {\n dragJSON: FlowNodeJSON;\n isBranch?: boolean;\n onCreateNode: (json: FlowNodeJSON, dropEntity: FlowNodeEntity) => Promise<FlowNodeEntity>;\n }\n>;\n\nexport interface FlowDragOptions {\n onDrop?: (opts: { dragNodes: FlowNodeEntity[]; dropNode: FlowNodeEntity }) => void;\n canDrop?: (\n opts: {\n dropNode: FlowNodeEntity;\n isBranch?: boolean;\n } & Xor<\n {\n dragNodes: FlowNodeEntity[];\n },\n {\n dragJSON: FlowNodeJSON;\n }\n >\n ) => boolean;\n}\n/**\n * 监听节点的激活状态\n */\n@injectable()\nexport class FlowDragLayer extends Layer<FlowDragOptions> {\n @inject(FlowDocument) readonly document: FlowDocument;\n\n @inject(FlowDragService) readonly flowDragService: FlowDragService;\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransformData) transforms: FlowNodeTransformData[];\n\n @observeEntity(EditorStateConfigEntity)\n protected editorStateConfig: EditorStateConfigEntity;\n\n @observeEntity(PlaygroundConfigEntity)\n protected playgroundConfigEntity: PlaygroundConfigEntity;\n\n @observeEntity(FlowDragEntity)\n protected flowDragConfigEntity: FlowDragEntity;\n\n @observeEntity(FlowRendererStateEntity)\n protected flowRenderStateEntity: FlowRendererStateEntity;\n\n @observeEntity(FlowSelectConfigEntity)\n protected selectConfigEntity: FlowSelectConfigEntity;\n\n private initialPosition: Position;\n\n private disableDragScroll: Boolean = false;\n\n private dragJSON?: FlowNodeJSON;\n\n private onCreateNode?: (\n json: FlowNodeJSON,\n dropEntity: FlowNodeEntity\n ) => Promise<FlowNodeEntity>;\n\n dragOffset = {\n x: DEFAULT_DRAG_OFFSET_X,\n y: DEFAULT_DRAG_OFFSET_Y,\n };\n\n get transitions(): FlowNodeTransitionData[] {\n const result: FlowNodeTransitionData[] = [];\n this.document.traverse((entity) => {\n result.push(entity.getData<FlowNodeTransitionData>(FlowNodeTransitionData)!);\n });\n return result;\n }\n\n @inject(FlowRendererRegistry) readonly rendererRegistry: FlowRendererRegistry;\n\n get dragStartEntity() {\n return this.flowRenderStateEntity.getDragStartEntity()!;\n }\n\n set dragStartEntity(entity: FlowNodeEntity | undefined) {\n this.flowRenderStateEntity.setDragStartEntity(entity);\n }\n\n get dragEntities() {\n return this.flowRenderStateEntity.getDragEntities()!;\n }\n\n set dragEntities(entities: FlowNodeEntity[]) {\n this.flowRenderStateEntity.setDragEntities(entities);\n }\n\n private dragNodeComp: FlowRendererComponent;\n\n containerRef = React.createRef<HTMLDivElement>();\n\n draggingNodeMask = document.createElement('div');\n\n protected isGrab(): boolean {\n const currentState = this.editorStateConfig.getCurrentState();\n return currentState === EditorState.STATE_GRAB;\n }\n\n setDraggingStatus(status: boolean): void {\n if (this.flowDragService.nodeDragIdsWithChildren.length) {\n this.flowDragService.nodeDragIdsWithChildren.forEach((_id) => {\n const node = this.entityManager.getEntityById(_id);\n const data = node?.getData<FlowNodeRenderData>(FlowNodeRenderData)!;\n data.dragging = status;\n });\n }\n this.flowRenderStateEntity.setDragging(status);\n }\n\n dragEnable(e: MouseEvent) {\n return (\n Math.abs(e.clientX - this.initialPosition.x) > DRAG_OFFSET ||\n Math.abs(e.clientY - this.initialPosition.y) > DRAG_OFFSET\n );\n }\n\n handleMouseMove(event: MouseEvent) {\n if ((this.dragJSON || this.dragStartEntity) && this.dragEnable(event)) {\n // 变更拖拽节点的位置\n this.setDraggingStatus(true);\n const scale = this.playgroundConfigEntity.finalScale;\n\n if (this.containerRef.current) {\n const dragNode = this.containerRef.current.children?.[0];\n const clientBounds = this.playgroundConfigEntity.getClientBounds();\n const dragBlockX =\n event.clientX -\n (this.pipelineNode.offsetLeft || 0) -\n clientBounds.x -\n (dragNode.clientWidth - this.dragOffset.x) * scale;\n const dragBlockY =\n event.clientY -\n (this.pipelineNode.offsetTop || 0) -\n clientBounds.y -\n (dragNode.clientHeight - this.dragOffset.y) * scale;\n\n // 获取节点状态是节点类型还是分支类型\n const isBranch = this.flowDragService.isDragBranch;\n\n // 节点类型拖拽碰撞检测\n const draggingRect = new Rectangle(\n dragBlockX,\n dragBlockY,\n dragNode.clientWidth * scale,\n dragNode.clientHeight * scale\n );\n let side: LABEL_SIDE_TYPE | undefined;\n const collisionTransition = this.transitions.find((transition) => {\n // 过滤已被折叠 label\n if (transition?.entity?.parent?.collapsed) {\n return false;\n }\n const { hasCollision, labelOffsetType } = this.flowDragConfigEntity.isCollision(\n transition,\n draggingRect,\n isBranch\n ) as CollisionRetType;\n side = labelOffsetType;\n return hasCollision;\n });\n if (\n collisionTransition &&\n (isBranch\n ? this.flowDragService.isDroppableBranch(collisionTransition.entity, side)\n : this.flowDragService.isDroppableNode(collisionTransition.entity)) &&\n (!this.options.canDrop ||\n this.options.canDrop({\n dragNodes: this.dragEntities,\n dropNode: collisionTransition.entity,\n isBranch,\n }))\n ) {\n // 设置碰撞的 label id\n this.flowRenderStateEntity.setNodeDroppingId(collisionTransition.entity.id);\n } else {\n // 没有碰撞清空 highlight\n this.flowRenderStateEntity.setNodeDroppingId('');\n }\n\n // 判断拖拽种类是节点类型还是分支类型\n this.flowRenderStateEntity.setDragLabelSide(side);\n\n this.containerRef.current.style.visibility = 'visible';\n this.pipelineNode.parentElement!.appendChild(this.draggingNodeMask);\n\n this.containerRef.current.style.left = `${\n dragBlockX + this.pipelineNode.offsetLeft + clientBounds.x + window.scrollX\n }px`;\n this.containerRef.current.style.top = `${\n dragBlockY + this.pipelineNode.offsetTop + clientBounds.y + window.scrollY\n }px`;\n this.containerRef.current.style.transformOrigin = 'top left';\n this.containerRef.current.style.transform = `scale(${scale})`;\n\n if (!this.disableDragScroll) {\n this.flowDragConfigEntity.scrollDirection(event, dragBlockX, dragBlockY);\n }\n }\n }\n }\n\n async handleMouseUp() {\n this.setDraggingStatus(false);\n if (this.dragStartEntity || this.dragJSON) {\n const activatedNodeId = this.flowDragService.dropNodeId;\n\n if (activatedNodeId) {\n if (this.flowDragService.isDragBranch) {\n if (this.dragJSON) {\n await this.flowDragService.dropCreateNode(this.dragJSON, this.onCreateNode);\n } else {\n this.flowDragService.dropBranch();\n }\n } else {\n if (this.dragJSON) {\n await this.flowDragService.dropCreateNode(this.dragJSON, this.onCreateNode);\n } else {\n this.flowDragService.dropNode();\n }\n this.selectConfigEntity.clearSelectedNodes();\n }\n }\n\n // 清空碰撞 id\n this.flowRenderStateEntity.setNodeDroppingId('');\n this.flowRenderStateEntity.setDragLabelSide();\n this.flowRenderStateEntity.setIsBranch(false);\n this.dragStartEntity = undefined;\n this.dragEntities = [];\n\n // 滚动停止\n this.flowDragConfigEntity.stopAllScroll();\n }\n\n this.disableDragScroll = false;\n this.dragJSON = undefined;\n if (this.containerRef.current) {\n this.containerRef.current.style.visibility = 'hidden';\n if (this.pipelineNode.parentElement!.contains(this.draggingNodeMask)) {\n this.pipelineNode.parentElement!.removeChild(this.draggingNodeMask);\n }\n }\n }\n\n protected _dragger = new PlaygroundDrag({\n onDrag: (e) => {\n this.handleMouseMove(e);\n },\n onDragEnd: () => {\n this.handleMouseUp();\n },\n stopGlobalEventNames: ['contextmenu'],\n });\n\n /**\n * 开始拖拽事件\n * @param e\n */\n async startDrag(\n e: { clientX: number; clientY: number },\n {\n dragStartEntity: startEntityFromProps,\n dragEntities,\n dragJSON,\n isBranch,\n onCreateNode,\n }: StartDragProps,\n options?: {\n dragOffsetX?: number;\n dragOffsetY?: number;\n disableDragScroll?: boolean;\n }\n ) {\n // 1. 避免按住空格拖动滚动场景覆盖,context disabled 会出现在画布编辑被抢锁时候触发\n if (this.isGrab() || this.config.disabled || this.config.readonly) {\n return;\n }\n\n this.disableDragScroll = Boolean(options?.disableDragScroll);\n this.dragJSON = dragJSON;\n this.onCreateNode = onCreateNode;\n this.flowRenderStateEntity.setIsBranch(Boolean(isBranch));\n\n this.dragOffset.x = options?.dragOffsetX || DEFAULT_DRAG_OFFSET_X;\n this.dragOffset.y = options?.dragOffsetY || DEFAULT_DRAG_OFFSET_Y;\n\n const type = startEntityFromProps?.flowNodeType || dragJSON?.type;\n\n const isIcon = type === FlowNodeBaseType.BLOCK_ICON;\n const isOrderIcon = type === FlowNodeBaseType.BLOCK_ORDER_ICON;\n\n const dragStartEntity =\n isIcon || isOrderIcon ? startEntityFromProps!.parent! : startEntityFromProps;\n\n // 部分节点不支持拖拽\n if (dragStartEntity && !dragStartEntity!.getData(FlowNodeRenderData).draggable) {\n return;\n }\n\n this.initialPosition = {\n x: e.clientX,\n y: e.clientY,\n };\n\n this.dragStartEntity = dragStartEntity;\n this.dragEntities = dragEntities || (this.dragStartEntity ? [this.dragStartEntity!] : []);\n\n return this._dragger.start(e.clientX, e.clientY);\n }\n\n onReady() {\n this.draggingNodeMask.style.width = '100%';\n this.draggingNodeMask.style.height = '100%';\n this.draggingNodeMask.style.position = 'absolute';\n this.draggingNodeMask.classList.add('dragging-node');\n this.draggingNodeMask.style.zIndex = '99';\n this.draggingNodeMask.style.cursor = 'pointer';\n\n this.dragNodeComp = this.rendererRegistry.getRendererComponent(FlowRendererKey.DRAG_NODE);\n // 监听拖入事件\n if (this.options.onDrop) {\n this.toDispose.push(this.flowDragService.onDrop(this.options.onDrop));\n }\n }\n\n dispose(): void {\n this._dragger.dispose();\n super.dispose();\n }\n\n render() {\n // styled-component component type 为 any\n const DragComp: any = this.dragNodeComp.renderer;\n\n return ReactDOM.createPortal(\n <div\n ref={this.containerRef}\n style={{ position: 'absolute', zIndex: 99999, visibility: 'hidden' }}\n onMouseEnter={(e) => e.stopPropagation()}\n >\n <DragComp\n dragJSON={this.dragJSON}\n dragStart={this.dragStartEntity}\n dragNodes={this.dragEntities}\n />\n </div>,\n document.body\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { domUtils, PositionSchema } from '@flowgram.ai/utils';\nimport { FlowDocument, FlowNodeEntity, FlowNodeTransformData } from '@flowgram.ai/document';\nimport {\n ContextMenuService,\n EditorState,\n EditorStateConfigEntity,\n Layer,\n LayerOptions,\n observeEntity,\n PipelineLayerPriority,\n PlaygroundConfigEntity,\n PlaygroundDrag,\n SelectionService,\n} from '@flowgram.ai/core';\n\nimport { FlowSelectConfigEntity, SelectorBoxConfigEntity } from '../entities';\n\nexport interface FlowSelectorBoxOptions extends LayerOptions {\n /**\n * 默认不提供则为点击空白地方可以框选\n * @param e\n * @param entity\n */\n canSelect?: (e: MouseEvent, entity: SelectorBoxConfigEntity) => boolean;\n}\n/**\n * 流程选择框\n */\n@injectable()\nexport class FlowSelectorBoxLayer extends Layer<FlowSelectorBoxOptions> {\n @inject(FlowDocument)\n protected flowDocument: FlowDocument;\n\n @inject(ContextMenuService)\n readonly contextMenuService: ContextMenuService;\n\n @observeEntity(PlaygroundConfigEntity)\n protected playgroundConfigEntity: PlaygroundConfigEntity;\n\n @inject(SelectionService) readonly selectionService: SelectionService;\n\n @observeEntity(SelectorBoxConfigEntity)\n protected selectorBoxConfigEntity: SelectorBoxConfigEntity;\n\n @observeEntity(FlowSelectConfigEntity)\n protected selectConfigEntity: FlowSelectConfigEntity;\n\n @observeEntity(EditorStateConfigEntity)\n protected editorStateConfig: EditorStateConfigEntity;\n\n readonly node = domUtils.createDivWithClass('gedit-selector-box-layer');\n\n /**\n * 选择框\n */\n protected selectorBox = this.createDOMCache('gedit-selector-box');\n\n /**\n * 用于遮挡鼠标,避免触发 hover\n */\n protected selectorBoxBlock = this.createDOMCache('gedit-selector-box-block');\n\n protected transformVisibles: FlowNodeTransformData[];\n\n /**\n * 拖动选择框\n */\n protected selectboxDragger = new PlaygroundDrag({\n onDragStart: (e) => {\n this.selectConfigEntity.clearSelectedNodes();\n const mousePos = this.playgroundConfigEntity.getPosFromMouseEvent(e);\n this.transformVisibles = this.flowDocument\n .getRenderDatas(FlowNodeTransformData, false)\n .filter((transform) => {\n const { entity } = transform;\n if (entity.originParent) {\n return (\n this.nodeSelectable(entity, mousePos) &&\n this.nodeSelectable(entity.originParent, mousePos)\n );\n }\n return this.nodeSelectable(entity, mousePos);\n });\n this.selectorBoxConfigEntity.setDragInfo(e);\n this.updateSelectorBox(this.selectorBoxConfigEntity);\n },\n onDrag: (e) => {\n this.selectorBoxConfigEntity.setDragInfo(e);\n // 更新选择框\n this.selectConfigEntity.selectFromBounds(\n this.selectorBoxConfigEntity.toRectangle(this.playgroundConfigEntity.finalScale),\n this.transformVisibles\n );\n this.updateSelectorBox(this.selectorBoxConfigEntity);\n },\n onDragEnd: (e) => {\n this.selectorBoxConfigEntity.setDragInfo(e);\n this.transformVisibles.length = 0;\n this.updateSelectorBox(this.selectorBoxConfigEntity);\n },\n });\n\n onReady(): void {\n if (!this.options.canSelect) {\n this.options.canSelect = (e: MouseEvent) => {\n const target = e.target as HTMLElement | undefined;\n // 默认点击空白地方可以框选\n return target === this.pipelineNode || target === this.playgroundNode;\n };\n }\n // 将选中的节点同步到全局\n // TODO 后续要统一到 selection service\n this.toDispose.pushAll([\n this.selectConfigEntity.onConfigChanged(() => {\n this.selectionService.selection = this.selectConfigEntity.selectedNodes;\n }),\n this.selectionService.onSelectionChanged(() => {\n const selectedNodes = this.selectionService.selection.filter(\n (entity) => entity instanceof FlowNodeEntity\n );\n\n this.selectConfigEntity.selectedNodes = selectedNodes as FlowNodeEntity[];\n }),\n ]);\n this.listenPlaygroundEvent(\n 'mousedown',\n (e: MouseEvent): boolean | undefined => {\n if (!this.isEnabled()) return;\n // 自定义拦截选择框事件\n if (this.options.canSelect && !this.options.canSelect(e, this.selectorBoxConfigEntity)) {\n return;\n }\n\n const currentState = this.editorStateConfig.getCurrentState();\n\n // 鼠标友好模式,框选后,再次点击其他地方或者框选其他地方,需要清空已有选择的节点\n if (currentState === EditorState.STATE_MOUSE_FRIENDLY_SELECT) {\n this.selectConfigEntity.clearSelectedNodes();\n }\n\n // const target = e.target as HTMLElement | undefined;\n // TODO 下边这些特化逻辑迁移到固定布局逻辑\n // const linesLayer = document.querySelector('.gedit-flow-lines-layer');\n // const toolsTarget = document.querySelector('.flow-canvas-selector-box-tools');\n // const isInTools = toolsTarget && (toolsTarget === target || toolsTarget.contains(target!));\n // 保证 service 更新后进行是否清除的计算\n // setTimeout(() => {\n // // 如果点击到选中区域的菜单栏\n // if (!isInTools && !this.contextMenuService.rightPanelVisible) {\n // // 取消之前的选择状态\n // this.selectConfigEntity.clearSelectedNodes();\n // }\n // }, 0);\n // if (\n // target === this.pipelineNode ||\n // target === this.playgroundNode // 点击空白区域\n // linesLayer?.contains(target!) // 点击 svg 线条\n // target?.classList.contains('flow-canvas-adder') || // 点击添加按钮的留白区域\n // target?.classList.contains('flow-canvas-block-icon') // 点击添加按钮的留白区域\n // ) {\n // return true;\n // }\n this.selectboxDragger.start(e.clientX, e.clientY, this.config);\n return true;\n },\n PipelineLayerPriority.BASE_LAYER\n );\n }\n\n isEnabled(): boolean {\n const currentState = this.editorStateConfig.getCurrentState();\n const isMouseFriendly = currentState === EditorState.STATE_MOUSE_FRIENDLY_SELECT;\n\n return (\n !this.config.disabled &&\n !this.config.readonly &&\n // 鼠标友好模式下,需要按下 shift 启动框选\n ((isMouseFriendly && this.editorStateConfig.isPressingShift) ||\n currentState === EditorState.STATE_SELECT) &&\n !this.selectorBoxConfigEntity.disabled\n );\n }\n\n /**\n * Destroy\n */\n dispose(): void {\n this.selectorBox.dispose();\n this.selectorBoxBlock.dispose();\n super.dispose();\n }\n\n protected updateSelectorBox(selector: SelectorBoxConfigEntity): void {\n const node = this.selectorBox.get();\n const block = this.selectorBoxBlock.get();\n // 非可用状态且在 moving 则关闭选择框\n if (!this.isEnabled() && selector.isMoving) {\n this.selectorBoxConfigEntity.collapse();\n }\n if (!this.isEnabled() || !selector.isMoving) {\n node.setStyle({\n display: 'none',\n });\n block.setStyle({\n display: 'none',\n });\n } else {\n node.setStyle({\n display: 'block',\n left: selector.position.x,\n top: selector.position.y,\n width: selector.size.width,\n height: selector.size.height,\n });\n // 这是遮挡滑块,防止触发节点 hover\n block.setStyle({\n display: 'block',\n left: selector.position.x - 10,\n top: selector.position.y - 10,\n width: selector.size.width + 20,\n height: selector.size.height + 20,\n });\n }\n }\n\n private nodeSelectable(node: FlowNodeEntity, mousePos: PositionSchema) {\n const selectable = node.getNodeMeta().selectable;\n if (typeof selectable === 'function') {\n return selectable(node, mousePos);\n } else {\n return selectable;\n }\n }\n\n // autorun(): void {\n // this.updateSelectorBox(this.selectorBoxConfigEntity);\n // }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport { Rectangle } from '@flowgram.ai/utils';\nimport { FlowNodeEntity, FlowNodeRenderData, FlowNodeTransformData } from '@flowgram.ai/document';\nimport {\n CommandRegistry,\n EditorState,\n EditorStateConfigEntity,\n Layer,\n LayerOptions,\n PlaygroundConfig,\n observeEntity,\n observeEntityDatas,\n} from '@flowgram.ai/core';\n\nimport { FlowRendererKey, FlowRendererRegistry } from '../flow-renderer-registry';\nimport { FlowSelectConfigEntity, SelectorBoxConfigEntity } from '../entities';\n\nexport interface SelectorBoxPopoverProps {\n bounds: Rectangle;\n config: PlaygroundConfig;\n flowSelectConfig: FlowSelectConfigEntity;\n commandRegistry: CommandRegistry;\n children?: React.ReactNode;\n}\n\nexport interface FlowSelectorBoundsLayerOptions extends LayerOptions {\n ignoreOneSelect?: boolean;\n ignoreChildrenLength?: boolean;\n boundsPadding?: number; // 边框留白,默认 10\n disableBackground?: boolean; // 禁用背景框\n backgroundClassName?: string; // 节点下边\n foregroundClassName?: string; // 节点上边\n SelectorBoxPopover?: React.FC<SelectorBoxPopoverProps>; // 选择框工具层\n CustomBoundsRenderer?: React.FC<SelectorBoxPopoverProps>; // 自定义渲染\n}\n\n/**\n * 流程节点被框选后的边界区域渲染\n */\n@injectable()\nexport class FlowSelectorBoundsLayer extends Layer<FlowSelectorBoundsLayerOptions> {\n @inject(FlowRendererRegistry) readonly rendererRegistry: FlowRendererRegistry;\n\n @inject(CommandRegistry) readonly commandRegistry: CommandRegistry;\n\n @observeEntity(FlowSelectConfigEntity)\n protected flowSelectConfigEntity: FlowSelectConfigEntity;\n\n @observeEntity(EditorStateConfigEntity)\n protected editorStateConfig: EditorStateConfigEntity;\n\n @observeEntity(SelectorBoxConfigEntity)\n protected selectorBoxConfigEntity: SelectorBoxConfigEntity;\n\n /**\n * 需要监听节点的展开和收起状态,重新绘制边框\n */\n @observeEntityDatas(FlowNodeEntity, FlowNodeRenderData)\n renderStates: FlowNodeRenderData[];\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransformData)\n _transforms: FlowNodeTransformData[];\n\n readonly node = domUtils.createDivWithClass('gedit-selector-bounds-layer');\n\n readonly selectBoundsBackground = domUtils.createDivWithClass('gedit-selector-bounds-background');\n\n onReady(): void {\n // 这个是覆盖到节点上边的,所以要比 flow-nodes-content-layer 大\n this.node!.style.zIndex = '20';\n const { firstChild } = this.pipelineNode;\n if (this.options.boundsPadding !== undefined) {\n this.flowSelectConfigEntity.boundsPadding = this.options.boundsPadding;\n }\n if (this.options.backgroundClassName) {\n this.selectBoundsBackground.classList.add(this.options.backgroundClassName);\n }\n // 这里创建一个空 layer 用于放背景\n const selectorBoundsLayer = domUtils.createDivWithClass(\n 'gedit-selector-bounds-background-layer gedit-playground-layer'\n );\n selectorBoundsLayer.appendChild(this.selectBoundsBackground);\n // 背景框需要在节点的下边\n this.pipelineNode.insertBefore(selectorBoundsLayer, firstChild);\n }\n\n onZoom(scale: number) {\n this.node!.style.transform = `scale(${scale})`;\n this.selectBoundsBackground.parentElement!.style.transform = `scale(${scale})`;\n }\n\n onViewportChange() {\n // 需要调整 bounds 菜单的位置\n this.render();\n }\n\n isEnabled(): boolean {\n const currentState = this.editorStateConfig.getCurrentState();\n return currentState === EditorState.STATE_SELECT;\n }\n\n // /**\n // * 渲染工具栏\n // */\n // renderCommandMenus(): JSX.Element[] {\n // return this.commandRegistry.commands\n // .filter(cmd => cmd.category === FlowRendererCommandCategory.SELECTOR_BOX)\n // .map(cmd => {\n // const CommandRenderer = this.rendererRegistry.getRendererComponent(\n // (cmd.icon as string) || cmd.id,\n // )?.renderer;\n //\n // return (\n // // eslint-disable-next-line react/jsx-filename-extension\n // <CommandRenderer\n // key={cmd.id}\n // disabled={!this.commandRegistry.isEnabled(cmd.id)}\n // command={cmd}\n // onClick={(e: any) => this.commandRegistry.executeCommand(cmd.id, e)}\n // />\n // );\n // })\n // .filter(c => c);\n // }\n\n render(): JSX.Element {\n const {\n ignoreOneSelect,\n ignoreChildrenLength,\n SelectorBoxPopover: SelectorBoxPopoverFromOpts,\n disableBackground,\n CustomBoundsRenderer,\n } = this.options;\n\n const bounds = this.flowSelectConfigEntity.getSelectedBounds();\n const selectedNodes = this.flowSelectConfigEntity.selectedNodes;\n\n const bg = this.selectBoundsBackground;\n const isDragging = !this.selectorBoxConfigEntity.isStart;\n\n if (\n bounds.width === 0 ||\n bounds.height === 0 ||\n // 选中单个的时候不显示\n (ignoreOneSelect &&\n selectedNodes.length === 1 &&\n // 选中的节点不包含多个子节点\n (ignoreChildrenLength || (selectedNodes[0] as FlowNodeEntity).childrenLength <= 1))\n ) {\n domUtils.setStyle(bg, {\n display: 'none',\n });\n return <></>;\n }\n if (CustomBoundsRenderer) {\n return (\n <CustomBoundsRenderer\n bounds={bounds}\n config={this.config}\n flowSelectConfig={this.flowSelectConfigEntity}\n commandRegistry={this.commandRegistry}\n />\n );\n }\n const style = {\n display: 'block',\n left: bounds.left,\n top: bounds.top,\n width: bounds.width,\n height: bounds.height,\n };\n if (!disableBackground) {\n domUtils.setStyle(bg, style);\n }\n let foregroundClassName = 'gedit-selector-bounds-foreground';\n if (this.options.foregroundClassName) {\n foregroundClassName += ' ' + this.options.foregroundClassName;\n }\n const SelectorBoxPopover =\n SelectorBoxPopoverFromOpts ||\n this.rendererRegistry.tryToGetRendererComponent(FlowRendererKey.SELECTOR_BOX_POPOVER)\n ?.renderer;\n if (!isDragging || !SelectorBoxPopover)\n return <div className={foregroundClassName} style={style} />;\n return (\n <SelectorBoxPopover\n bounds={bounds}\n config={this.config}\n flowSelectConfig={this.flowSelectConfigEntity}\n commandRegistry={this.commandRegistry}\n >\n <div className={foregroundClassName} style={style} />\n </SelectorBoxPopover>\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport {\n CommandRegistry,\n ContextMenuService,\n EditorState,\n EditorStateConfigEntity,\n Layer,\n observeEntity,\n PipelineLayerPriority,\n PlaygroundConfigEntity,\n SelectionService,\n} from '@flowgram.ai/core';\n\nimport {\n FlowRendererCommandCategory,\n FlowRendererKey,\n FlowRendererRegistry,\n} from '../flow-renderer-registry';\nimport { SelectorBoxConfigEntity } from '../entities/selector-box-config-entity';\nimport { FlowSelectConfigEntity } from '../entities/flow-select-config-entity';\n\n/**\n * 流程右键菜单\n */\n@injectable()\nexport class FlowContextMenuLayer extends Layer {\n @inject(CommandRegistry) readonly commandRegistry: CommandRegistry;\n\n @inject(FlowRendererRegistry) readonly rendererRegistry: FlowRendererRegistry;\n\n @inject(ContextMenuService) readonly contextMenuService: ContextMenuService;\n\n @observeEntity(FlowSelectConfigEntity) protected flowSelectConfigEntity: FlowSelectConfigEntity;\n\n @inject(SelectionService) readonly selectionService: SelectionService;\n\n @observeEntity(PlaygroundConfigEntity)\n protected playgroundConfigEntity: PlaygroundConfigEntity;\n\n @observeEntity(EditorStateConfigEntity)\n protected editorStateConfig: EditorStateConfigEntity;\n\n @observeEntity(SelectorBoxConfigEntity)\n protected selectorBoxConfigEntity: SelectorBoxConfigEntity;\n\n readonly node = domUtils.createDivWithClass('gedit-context-menu-layer');\n\n readonly nodeRef = React.createRef<{\n setVisible: (v: boolean) => void;\n }>();\n\n isEnabled(): boolean {\n const currentState = this.editorStateConfig.getCurrentState();\n return (\n !this.config.disabled &&\n !this.config.readonly &&\n currentState === EditorState.STATE_SELECT &&\n !this.selectorBoxConfigEntity.disabled\n );\n }\n\n onReady(): void {\n // 这个是覆盖到节点上边的,所以要比 flow-nodes-content-layer 大\n this.node!.style.zIndex = '30';\n this.node!.style.display = 'block';\n // 监听鼠标右键\n this.toDispose.pushAll([\n this.listenPlaygroundEvent(\n 'contextmenu',\n (e: MouseEvent): boolean | undefined => {\n if (!this.isEnabled()) return;\n this.contextMenuService.rightPanelVisible = true;\n const bounds = this.flowSelectConfigEntity.getSelectedBounds();\n if (bounds.width === 0 || bounds.height === 0) {\n return;\n }\n e.stopPropagation();\n e.preventDefault();\n\n this.nodeRef.current?.setVisible(true);\n const clientBounds = this.playgroundConfigEntity.getClientBounds();\n const dragBlockX = e.clientX - (this.pipelineNode.offsetLeft || 0) - clientBounds.x;\n const dragBlockY = e.clientY - (this.pipelineNode.offsetTop || 0) - clientBounds.y;\n this.node.style.left = `${dragBlockX}px`;\n this.node.style.top = `${dragBlockY}px`;\n },\n PipelineLayerPriority.BASE_LAYER\n ),\n this.listenPlaygroundEvent('mousedown', () => {\n this.nodeRef.current?.setVisible(false);\n this.contextMenuService.rightPanelVisible = false;\n }),\n ]);\n }\n\n onScroll() {\n this.nodeRef.current?.setVisible(false);\n }\n\n onZoom() {\n this.nodeRef.current?.setVisible(false);\n }\n\n /**\n * Destroy\n */\n dispose(): void {\n super.dispose();\n }\n\n /**\n * 渲染工具栏\n */\n renderCommandMenus(): JSX.Element[] {\n return this.commandRegistry.commands\n .filter((cmd) => cmd.category === FlowRendererCommandCategory.SELECTOR_BOX)\n .map((cmd) => {\n const CommandRenderer = this.rendererRegistry.getRendererComponent(\n (cmd.icon as string) || cmd.id\n )?.renderer;\n return (\n <CommandRenderer\n key={cmd.id}\n command={cmd}\n isContextMenu\n disabled={!this.commandRegistry.isEnabled(cmd.id)}\n onClick={(e: any) => this.commandRegistry.executeCommand(cmd.id, e)}\n />\n );\n })\n .filter((c) => c);\n }\n\n render(): JSX.Element {\n const SelectorBoxPopover = this.rendererRegistry.getRendererComponent(\n FlowRendererKey.CONTEXT_MENU_POPOVER\n ).renderer;\n return <SelectorBoxPopover ref={this.nodeRef} content={this.renderCommandMenus()} />;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { FlowDocument, FlowNodeTransformData } from '@flowgram.ai/document';\nimport { Layer } from '@flowgram.ai/core';\nimport { ScrollSchema } from '@flowgram.ai/utils';\n\nimport { scrollLimit } from '../utils';\n\n/**\n * 控制滚动边界\n */\n@injectable()\nexport class FlowScrollLimitLayer extends Layer {\n @inject(FlowDocument) readonly document: FlowDocument;\n\n getInitScroll(): ScrollSchema {\n return this.document.layout.getInitScroll(this.pipelineNode.getBoundingClientRect());\n }\n\n onReady(): void {\n const initScroll = () => this.getInitScroll();\n this.config.updateConfig(initScroll());\n this.config.addScrollLimit(scroll =>\n scrollLimit(\n scroll,\n [this.document.root.getData(FlowNodeTransformData)!.bounds],\n this.config,\n initScroll,\n ),\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ContainerModule } from 'inversify';\n\nimport { FlowRendererResizeObserver } from './flow-renderer-resize-observer';\nimport { FlowRendererRegistry } from './flow-renderer-registry';\n\nexport const FlowRendererContainerModule = new ContainerModule(bind => {\n bind(FlowRendererRegistry).toSelf().inSingletonScope();\n bind(FlowRendererResizeObserver).toSelf().inSingletonScope();\n});\n"],"mappings":"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","names":["import_document","import_core","import_document","import_document","import_core","import_utils","import_core","import_utils","import_inversify","import_utils","import_document","import_core","import_utils","import_lodash_es","import_inversify","import_utils","import_document","import_core","import_inversify","import_core","FlowRendererComponentType","FlowRendererKey","FlowTextKey","FlowRendererCommandCategory","React","ReactDOM","import_react","import_lodash_es","import_inversify","import_utils","import_document","import_core","import_react","import_utils","import_document","import_react","React","import_react","import_lodash_es","import_utils","import_core","import_react","React","import_react","React","React","import_react","React","React","React","import_react","import_lodash_es","import_inversify","import_utils","import_document","import_core","import_react","import_utils","import_document","import_react","import_document","import_react","import_document","React","import_react","import_document","import_core","React","React","import_react","import_document","import_core","getFlowRenderKey","React","React","React","import_inversify","import_utils","import_document","import_core","import_utils","import_inversify","import_document","import_core","import_utils","document","import_react_dom","import_react","import_inversify","import_utils","import_document","import_core","React","ReactDOM","import_inversify","import_utils","import_document","import_core","import_react","import_inversify","import_utils","import_document","import_core","React","import_react","import_inversify","import_utils","import_core","React","import_inversify","import_document","import_core","import_inversify"]}