@flowgram-vue/free-snap-plugin 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/dist/index.cjs +1036 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +112 -0
- package/dist/index.js +1034 -0
- package/dist/index.js.map +1 -0
- package/package.json +57 -0
- package/src/constant.ts +22 -0
- package/src/create-plugin.ts +34 -0
- package/src/env.d.ts +10 -0
- package/src/index.ts +7 -0
- package/src/layer.ts +518 -0
- package/src/service.ts +703 -0
- package/src/type.ts +98 -0
- package/src/utils.ts +44 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constant.ts","../src/utils.ts","../src/service.ts","../src/layer.ts","../src/create-plugin.ts"],"names":["WorkflowSnapService","Emitter","Rectangle","FlowNodeBaseType","FlowNodeTransformData","WorkflowNodeEntity","TransformData","inject","WorkflowDocument","EntityManager","WorkflowDragService","PlaygroundConfigEntity","injectable","Layer","domUtils","h","Fragment","definePluginCreator"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport type { WorkflowSnapLayerOptions, WorkflowSnapServiceOptions } from './type';\n\nexport const SnapDefaultOptions: WorkflowSnapServiceOptions & WorkflowSnapLayerOptions = {\n enableEdgeSnapping: true,\n edgeThreshold: 7,\n enableGridSnapping: false,\n gridSize: 20,\n enableMultiSnapping: true,\n enableOnlyViewportSnapping: true,\n edgeColor: '#4E40E5',\n alignColor: '#4E40E5',\n edgeLineWidth: 2,\n alignLineWidth: 2,\n alignCrossWidth: 16,\n};\n\nexport const Epsilon = 0.00001;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Epsilon } from './constant';\n\n/** 检查浮点数 a 是否等于 b */\nexport const isEqual = (a: number | undefined, b: number | undefined): boolean => {\n if (a === undefined || b === undefined) {\n return false;\n }\n // 检查 a 和 b 的差的绝对值是否小于 Epsilon\n return Math.abs(a - b) < Epsilon;\n};\n\n/** 检查浮点数 a 是否小于 b */\nexport const isLessThan = (a: number | undefined, b: number | undefined): boolean => {\n if (a === undefined || b === undefined) {\n return false;\n }\n // 检查 a 是否显著小于 b\n return b - a > Epsilon;\n};\n\n/** 检查浮点数 a 是否大于 b */\nexport const isGreaterThan = (a: number | undefined, b: number | undefined): boolean => {\n if (a === undefined || b === undefined) {\n return false;\n }\n return a - b > Epsilon;\n};\n\n/** 检查浮点数 a 是否小于等于 b */\nexport const isLessThanOrEqual = (a: number | undefined, b: number | undefined): boolean =>\n isEqual(a, b) || isLessThan(a, b);\n\n/** 检查浮点数 a 是否大于等于 b */\nexport const isGreaterThanOrEqual = (a: number | undefined, b: number | undefined): boolean =>\n isEqual(a, b) || isGreaterThan(a, b);\n\n/** 检查值是否是数字类型 */\nexport const isNumber = (value: unknown): value is number =>\n typeof value === 'number' && !isNaN(value);\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { Disposable, Emitter, Rectangle } from '@flowgram-vue/utils';\nimport { IPoint } from '@flowgram-vue/utils';\nimport { WorkflowNodeEntity, WorkflowDocument } from '@flowgram-vue/free-layout-core';\nimport { WorkflowDragService } from '@flowgram-vue/free-layout-core';\nimport { FlowNodeTransformData } from '@flowgram-vue/document';\nimport { FlowNodeBaseType } from '@flowgram-vue/document';\nimport { EntityManager, PlaygroundConfigEntity, TransformData } from '@flowgram-vue/core';\n\nimport { isEqual, isGreaterThan, isLessThan, isLessThanOrEqual, isNumber } from './utils';\nimport type {\n SnapEvent,\n SnapHorizontalLine,\n SnapLines,\n SnapMidHorizontalLine,\n SnapMidVerticalLine,\n SnapVerticalLine,\n WorkflowSnapServiceOptions,\n AlignRects,\n AlignRect,\n AlignSpacing,\n SnapNodeRect,\n SnapEdgeLines,\n} from './type';\nimport { SnapDefaultOptions } from './constant';\n\n@injectable()\nexport class WorkflowSnapService {\n @inject(WorkflowDocument) private readonly document: WorkflowDocument;\n\n @inject(EntityManager) private readonly entityManager: EntityManager;\n\n @inject(WorkflowDragService)\n private readonly dragService: WorkflowDragService;\n\n @inject(PlaygroundConfigEntity)\n private readonly playgroundConfig: PlaygroundConfigEntity;\n\n private disposers: Disposable[] = [];\n\n private options: WorkflowSnapServiceOptions;\n\n private snapEmitter = new Emitter<SnapEvent>();\n\n public readonly onSnap = this.snapEmitter.event;\n\n private _disabled = false;\n\n public init(params: Partial<WorkflowSnapServiceOptions> = {}): void {\n this.options = {\n ...SnapDefaultOptions,\n ...params,\n };\n this.mountListener();\n }\n\n public dispose(): void {\n this.disposers.forEach((disposer) => disposer.dispose());\n }\n\n public get disabled(): boolean {\n return this._disabled;\n }\n\n public disable(): void {\n if (this._disabled) {\n return;\n }\n this._disabled = true;\n this.clear();\n }\n\n public enable(): void {\n if (!this._disabled) {\n return;\n }\n this._disabled = false;\n this.clear();\n }\n\n private mountListener(): void {\n const dragAdjusterDisposer = this.dragService.registerPosAdjuster((params) => {\n const { selectedNodes: targetNodes, position } = params;\n const isMultiSnapping = this.options.enableMultiSnapping ? false : targetNodes.length !== 1;\n if (this._disabled || !this.options.enableEdgeSnapping || isMultiSnapping) {\n return {\n x: 0,\n y: 0,\n };\n }\n return this.snapping({\n targetNodes,\n position,\n });\n });\n const dragEndDisposer = this.dragService.onNodesDrag((event) => {\n if (event.type !== 'onDragEnd' || this._disabled) {\n return;\n }\n if (this.options.enableGridSnapping) {\n this.gridSnapping({\n targetNodes: event.nodes,\n gridSize: this.options.gridSize,\n });\n }\n if (this.options.enableEdgeSnapping) {\n this.clear();\n }\n });\n this.disposers.push(dragAdjusterDisposer, dragEndDisposer);\n }\n\n private snapping(params: { targetNodes: WorkflowNodeEntity[]; position: IPoint }): IPoint {\n const { targetNodes, position } = params;\n\n const targetBounds = this.getBounds(targetNodes);\n\n const targetRect = new Rectangle(\n position.x,\n position.y,\n targetBounds.width,\n targetBounds.height\n );\n\n const snapNodeRects = this.getSnapNodeRects({\n targetNodes,\n targetRect,\n });\n\n const { alignOffset, alignRects, alignSpacing } = this.calcAlignOffset({\n targetRect,\n alignThreshold: this.options.edgeThreshold,\n snapNodeRects,\n });\n\n const { snapOffset, snapEdgeLines } = this.calcSnapOffset({\n targetRect,\n edgeThreshold: this.options.edgeThreshold,\n snapNodeRects,\n });\n\n const offset: IPoint = {\n x: snapOffset.x || alignOffset.x,\n y: snapOffset.y || alignOffset.y,\n };\n\n const snapRect = new Rectangle(\n position.x + offset.x,\n position.y + offset.y,\n targetRect.width,\n targetRect.height\n );\n\n this.snapEmitter.fire({\n snapRect,\n snapEdgeLines,\n alignRects,\n alignSpacing,\n });\n\n return offset;\n }\n\n private calcSnapOffset(params: {\n snapNodeRects: SnapNodeRect[];\n targetRect: Rectangle;\n edgeThreshold: number;\n }): {\n snapOffset: IPoint;\n snapEdgeLines: SnapEdgeLines;\n } {\n const { snapNodeRects, edgeThreshold, targetRect } = params;\n\n const snapLines = this.getSnapLines({\n snapNodeRects,\n });\n\n // 找到最近的线条\n const topYClosestLine = snapLines.horizontal.find((line) =>\n isLessThanOrEqual(Math.abs(line.y - targetRect.top), edgeThreshold)\n );\n const bottomYClosestLine = snapLines.horizontal.find((line) =>\n isLessThanOrEqual(Math.abs(line.y - targetRect.bottom), edgeThreshold)\n );\n const leftXClosestLine = snapLines.vertical.find((line) =>\n isLessThanOrEqual(Math.abs(line.x - targetRect.left), edgeThreshold)\n );\n const rightXClosestLine = snapLines.vertical.find((line) =>\n isLessThanOrEqual(Math.abs(line.x - targetRect.right), edgeThreshold)\n );\n const midYClosestLine = snapLines.midHorizontal.find((line) =>\n isLessThanOrEqual(Math.abs(line.y - targetRect.center.y), edgeThreshold)\n );\n const midXClosestLine = snapLines.midVertical.find((line) =>\n isLessThanOrEqual(Math.abs(line.x - targetRect.center.x), edgeThreshold)\n );\n\n // 计算最近坐标\n const topYClosest = topYClosestLine?.y;\n const bottomYClosest = isNumber(bottomYClosestLine?.y)\n ? bottomYClosestLine!.y - targetRect.height\n : undefined;\n const leftXClosest = leftXClosestLine?.x;\n const rightXClosest = isNumber(rightXClosestLine?.x)\n ? rightXClosestLine!.x - targetRect.width\n : undefined;\n const midYClosest = isNumber(midYClosestLine?.y)\n ? midYClosestLine!.y - targetRect.height / 2\n : undefined;\n const midXClosest = isNumber(midXClosestLine?.x)\n ? midXClosestLine!.x - targetRect.width / 2\n : undefined;\n\n // 吸附后坐标,按优先级取值\n const snappingPosition = {\n x: midXClosest ?? leftXClosest ?? rightXClosest ?? targetRect.x,\n y: midYClosest ?? topYClosest ?? bottomYClosest ?? targetRect.y,\n };\n\n // 吸附修正偏移量\n const snapOffset: IPoint = {\n x: snappingPosition.x - targetRect.x,\n y: snappingPosition.y - targetRect.y,\n };\n\n // 生效的吸附线条\n const snapEdgeLines: SnapEdgeLines = {\n top: isEqual(topYClosest, snappingPosition.y) ? topYClosestLine : undefined,\n bottom: isEqual(bottomYClosest, snappingPosition.y) ? bottomYClosestLine : undefined,\n left: isEqual(leftXClosest, snappingPosition.x) ? leftXClosestLine : undefined,\n right: isEqual(rightXClosest, snappingPosition.x) ? rightXClosestLine : undefined,\n midVertical: isEqual(midXClosest, snappingPosition.x) ? midXClosestLine : undefined,\n midHorizontal: isEqual(midYClosest, snappingPosition.y) ? midYClosestLine : undefined,\n };\n\n return { snapOffset, snapEdgeLines };\n }\n\n private gridSnapping(params: { gridSize: number; targetNodes: WorkflowNodeEntity[] }): void {\n const { gridSize, targetNodes } = params;\n const rect = this.getBounds(targetNodes);\n const snap = (value: number) => Math.round(value / gridSize) * gridSize;\n const snappedPosition: IPoint = {\n x: snap(rect.x),\n y: snap(rect.y),\n };\n const offset: IPoint = {\n x: snappedPosition.x - rect.x,\n y: snappedPosition.y - rect.y,\n };\n targetNodes.forEach((node) =>\n this.updateNodePositionWithOffset({\n node,\n offset,\n })\n );\n }\n\n private clear() {\n this.snapEmitter.fire({\n snapEdgeLines: {},\n snapRect: Rectangle.EMPTY,\n alignRects: {\n top: [],\n bottom: [],\n left: [],\n right: [],\n },\n alignSpacing: {},\n });\n }\n\n private getSnapLines(params: { snapNodeRects: SnapNodeRect[] }): SnapLines {\n const { snapNodeRects } = params;\n const horizontalLines: SnapHorizontalLine[] = [];\n const verticalLines: SnapVerticalLine[] = [];\n const midHorizontalLines: SnapMidHorizontalLine[] = [];\n const midVerticalLines: SnapMidVerticalLine[] = [];\n\n snapNodeRects.forEach((snapNodeRect) => {\n const nodeBounds = snapNodeRect.rect;\n const nodeCenter = nodeBounds.center;\n // 边缘横线\n const top: SnapHorizontalLine = {\n y: nodeBounds.top,\n sourceNodeId: snapNodeRect.id,\n };\n const bottom: SnapHorizontalLine = {\n y: nodeBounds.bottom,\n sourceNodeId: snapNodeRect.id,\n };\n // 边缘竖线\n const left: SnapVerticalLine = {\n x: nodeBounds.left,\n sourceNodeId: snapNodeRect.id,\n };\n const right: SnapVerticalLine = {\n x: nodeBounds.right,\n sourceNodeId: snapNodeRect.id,\n };\n // 中间横线\n const midHorizontal: SnapMidHorizontalLine = {\n y: nodeCenter.y,\n sourceNodeId: snapNodeRect.id,\n };\n // 中间竖线\n const midVertical: SnapMidVerticalLine = {\n x: nodeCenter.x,\n sourceNodeId: snapNodeRect.id,\n };\n horizontalLines.push(top, bottom);\n verticalLines.push(left, right);\n midHorizontalLines.push(midHorizontal);\n midVerticalLines.push(midVertical);\n });\n\n return {\n horizontal: horizontalLines,\n vertical: verticalLines,\n midHorizontal: midHorizontalLines,\n midVertical: midVerticalLines,\n };\n }\n\n private getAvailableNodes(params: {\n targetNodes: WorkflowNodeEntity[];\n targetRect: Rectangle;\n }): WorkflowNodeEntity[] {\n const { targetNodes, targetRect } = params;\n\n const targetCenter = targetRect.center;\n const targetContainerId = targetNodes[0].parent?.id ?? this.document.root.id;\n\n const disabledNodeIds = targetNodes.map((n) => n.id);\n disabledNodeIds.push(FlowNodeBaseType.ROOT);\n const availableNodes = this.nodes\n .filter((n) => n.parent?.id === targetContainerId)\n .filter((n) => !disabledNodeIds.includes(n.id))\n .sort((nodeA, nodeB) => {\n const nodeCenterA = nodeA.getData(FlowNodeTransformData)!.bounds.center;\n const nodeCenterB = nodeB.getData(FlowNodeTransformData)!.bounds.center;\n // 距离越近优先级越高\n const distanceA =\n Math.abs(nodeCenterA.x - targetCenter.x) + Math.abs(nodeCenterA.y - targetCenter.y);\n const distanceB =\n Math.abs(nodeCenterB.x - targetCenter.x) + Math.abs(nodeCenterB.y - targetCenter.y);\n return distanceA - distanceB;\n });\n return availableNodes;\n }\n\n private viewRect(): Rectangle {\n const { width, height, scrollX, scrollY, zoom } = this.playgroundConfig.config;\n return new Rectangle(scrollX / zoom, scrollY / zoom, width / zoom, height / zoom);\n }\n\n private getSnapNodeRects(params: {\n targetNodes: WorkflowNodeEntity[];\n targetRect: Rectangle;\n }): SnapNodeRect[] {\n const availableNodes = this.getAvailableNodes(params);\n const viewRect = this.viewRect();\n return availableNodes\n .map((node) => {\n const snapNodeRect: SnapNodeRect = {\n id: node.id,\n rect: node.getData(FlowNodeTransformData).bounds,\n entity: node,\n };\n if (\n this.options.enableOnlyViewportSnapping &&\n node.parent?.flowNodeType === FlowNodeBaseType.ROOT &&\n !Rectangle.intersects(viewRect, snapNodeRect.rect)\n ) {\n // 最外层节点仅包含当前可见节点\n return;\n }\n return snapNodeRect;\n })\n .filter(Boolean) as SnapNodeRect[];\n }\n\n private get nodes(): WorkflowNodeEntity[] {\n return this.entityManager.getEntities<WorkflowNodeEntity>(WorkflowNodeEntity);\n }\n\n private getBounds(nodes: WorkflowNodeEntity[]): Rectangle {\n if (nodes.length === 0) {\n return Rectangle.EMPTY;\n }\n return Rectangle.enlarge(nodes.map((n) => n.getData(FlowNodeTransformData)!.bounds));\n }\n\n private updateNodePositionWithOffset(params: { node: WorkflowNodeEntity; offset: IPoint }): void {\n const { node, offset } = params;\n const transform = node.getData(TransformData);\n const positionWithOffset: IPoint = {\n x: transform.position.x + offset.x,\n y: transform.position.y + offset.y,\n };\n transform.update({\n position: positionWithOffset,\n });\n this.document.layout.updateAffectedTransform(node);\n }\n\n private calcAlignOffset(params: {\n snapNodeRects: SnapNodeRect[];\n targetRect: Rectangle;\n alignThreshold: number;\n }): {\n alignOffset: IPoint;\n alignRects: AlignRects;\n alignSpacing: AlignSpacing;\n } {\n const { snapNodeRects, targetRect, alignThreshold } = params;\n\n const alignRects = this.getAlignRects({\n targetRect,\n snapNodeRects,\n });\n\n const alignSpacing = this.calcAlignSpacing({\n targetRect,\n alignRects,\n });\n\n let topY: number | undefined;\n let bottomY: number | undefined;\n let leftX: number | undefined;\n let rightX: number | undefined;\n let midY: number | undefined;\n let midX: number | undefined;\n\n if (alignSpacing.top) {\n const topAlignY = alignRects.top[0].rect.bottom + alignSpacing.top;\n const isAlignTop = isLessThanOrEqual(Math.abs(targetRect.top - topAlignY), alignThreshold);\n if (isAlignTop) {\n // 生效\n topY = topAlignY;\n } else {\n // 失效\n alignSpacing.top = undefined;\n }\n }\n if (alignSpacing.bottom) {\n const bottomAlignY = alignRects.bottom[0].rect.top - alignSpacing.bottom;\n const isAlignBottom = isLessThan(Math.abs(targetRect.bottom - bottomAlignY), alignThreshold);\n if (isAlignBottom) {\n bottomY = bottomAlignY - targetRect.height;\n } else {\n alignSpacing.bottom = undefined;\n }\n }\n if (alignSpacing.left) {\n const leftAlignX = alignRects.left[0].rect.right + alignSpacing.left;\n const isAlignLeft = isLessThanOrEqual(Math.abs(targetRect.left - leftAlignX), alignThreshold);\n if (isAlignLeft) {\n leftX = leftAlignX;\n } else {\n alignSpacing.left = undefined;\n }\n }\n if (alignSpacing.right) {\n const rightAlignX = alignRects.right[0].rect.left - alignSpacing.right;\n const isAlignRight = isLessThanOrEqual(\n Math.abs(targetRect.right - rightAlignX),\n alignThreshold\n );\n if (isAlignRight) {\n rightX = rightAlignX - targetRect.width;\n } else {\n alignSpacing.right = undefined;\n }\n }\n if (alignSpacing.midHorizontal) {\n const leftAlignX = alignRects.left[0].rect.right + alignSpacing.midHorizontal;\n const isAlignMidHorizontal = isLessThanOrEqual(\n Math.abs(targetRect.left - leftAlignX),\n alignThreshold\n );\n if (isAlignMidHorizontal) {\n midX = leftAlignX;\n } else {\n alignSpacing.midHorizontal = undefined;\n }\n }\n if (alignSpacing.midVertical) {\n const topAlignY = alignRects.top[0].rect.bottom + alignSpacing.midVertical;\n const isAlignMidVertical = isLessThanOrEqual(\n Math.abs(targetRect.top - topAlignY),\n alignThreshold\n );\n if (isAlignMidVertical) {\n midY = topAlignY;\n } else {\n alignSpacing.midVertical = undefined;\n }\n }\n\n const alignPosition: IPoint = {\n x: midX ?? leftX ?? rightX ?? targetRect.x,\n y: midY ?? topY ?? bottomY ?? targetRect.y,\n };\n\n const alignOffset: IPoint = {\n x: alignPosition.x - targetRect.x,\n y: alignPosition.y - targetRect.y,\n };\n\n return { alignOffset, alignRects, alignSpacing };\n }\n\n private calcAlignSpacing(params: {\n targetRect: Rectangle;\n alignRects: AlignRects;\n }): AlignSpacing {\n const { targetRect, alignRects } = params;\n\n const topSpacing = this.getDirectionAlignSpacing({\n rects: alignRects.top,\n isHorizontal: false,\n });\n const bottomSpacing = this.getDirectionAlignSpacing({\n rects: alignRects.bottom,\n isHorizontal: false,\n });\n const leftSpacing = this.getDirectionAlignSpacing({\n rects: alignRects.left,\n isHorizontal: true,\n });\n const rightSpacing = this.getDirectionAlignSpacing({\n rects: alignRects.right,\n isHorizontal: true,\n });\n const midHorizontalSpacing = this.getMidAlignSpacing({\n rectA: alignRects.left[0]?.rect,\n rectB: alignRects.right[0]?.rect,\n targetRect,\n isHorizontal: true,\n });\n const midVerticalSpacing = this.getMidAlignSpacing({\n rectA: alignRects.top[0]?.rect,\n rectB: alignRects.bottom[0]?.rect,\n targetRect,\n isHorizontal: false,\n });\n return {\n top: topSpacing,\n bottom: bottomSpacing,\n left: leftSpacing,\n right: rightSpacing,\n midHorizontal: midHorizontalSpacing,\n midVertical: midVerticalSpacing,\n };\n }\n\n private getAlignRects(params: {\n targetRect: Rectangle;\n snapNodeRects: SnapNodeRect[];\n }): AlignRects {\n const { targetRect, snapNodeRects } = params;\n\n const topVerticalRects: AlignRect[] = [];\n const bottomVerticalRects: AlignRect[] = [];\n const leftHorizontalRects: AlignRect[] = [];\n const rightHorizontalRects: AlignRect[] = [];\n\n snapNodeRects.forEach((snapNodeRect) => {\n const nodeRect = snapNodeRect.rect;\n const { isVerticalIntersection, isHorizontalIntersection, isIntersection } =\n this.intersection(nodeRect, targetRect);\n if (isIntersection) {\n // 忽略重叠的节点\n return;\n } else if (isVerticalIntersection) {\n // 垂直重合\n if (isGreaterThan(nodeRect.center.y, targetRect.center.y)) {\n // 下方\n bottomVerticalRects.push({\n rect: nodeRect,\n sourceNodeId: snapNodeRect.id,\n });\n } else {\n // 上方\n topVerticalRects.push({\n rect: nodeRect,\n sourceNodeId: snapNodeRect.id,\n });\n }\n } else if (isHorizontalIntersection) {\n // 水平重合\n if (isGreaterThan(nodeRect.center.x, targetRect.center.x)) {\n // 右方\n rightHorizontalRects.push({\n rect: nodeRect,\n sourceNodeId: snapNodeRect.id,\n });\n } else {\n // 左方\n leftHorizontalRects.push({\n rect: nodeRect,\n sourceNodeId: snapNodeRect.id,\n });\n }\n }\n });\n\n return {\n top: topVerticalRects,\n bottom: bottomVerticalRects,\n left: leftHorizontalRects,\n right: rightHorizontalRects,\n };\n }\n\n private getMidAlignSpacing(params: {\n rectA?: Rectangle;\n rectB?: Rectangle;\n targetRect: Rectangle;\n isHorizontal: boolean;\n }): number | undefined {\n const { rectA, rectB, targetRect, isHorizontal } = params;\n if (!rectA || !rectB) {\n return;\n }\n const { isVerticalIntersection, isHorizontalIntersection, isIntersection } = this.intersection(\n rectA,\n rectB\n );\n if (isIntersection) {\n return;\n }\n if (isHorizontal && isHorizontalIntersection && !isVerticalIntersection) {\n const betweenSpacing = Math.min(\n Math.abs(rectA.left - rectB.right),\n Math.abs(rectA.right - rectB.left)\n );\n return (betweenSpacing - targetRect.width) / 2;\n } else if (!isHorizontal && isVerticalIntersection && !isHorizontalIntersection) {\n const betweenSpacing = Math.min(\n Math.abs(rectA.top - rectB.bottom),\n Math.abs(rectA.bottom - rectB.top)\n );\n return (betweenSpacing - targetRect.height) / 2;\n }\n }\n\n private getDirectionAlignSpacing(params: {\n rects: AlignRect[];\n isHorizontal: boolean;\n }): number | undefined {\n const { rects, isHorizontal } = params;\n if (rects.length < 2) {\n // 非法情况\n return;\n }\n const rectA = rects[0].rect;\n const rectB = rects[1].rect;\n\n const { isVerticalIntersection, isHorizontalIntersection, isIntersection } = this.intersection(\n rectA,\n rectB\n );\n\n if (isIntersection) {\n // 非法情况:重叠\n return;\n }\n if (isHorizontal && isHorizontalIntersection && !isVerticalIntersection) {\n return Math.min(Math.abs(rectA.left - rectB.right), Math.abs(rectA.right - rectB.left));\n } else if (!isHorizontal && isVerticalIntersection && !isHorizontalIntersection) {\n return Math.min(Math.abs(rectA.top - rectB.bottom), Math.abs(rectA.bottom - rectB.top));\n }\n return;\n }\n\n private intersection(\n rectA: Rectangle,\n rectB: Rectangle\n ): {\n isHorizontalIntersection: boolean;\n isVerticalIntersection: boolean;\n isIntersection: boolean;\n } {\n const isVerticalIntersection =\n isLessThan(rectA.left, rectB.right) && isGreaterThan(rectA.right, rectB.left);\n const isHorizontalIntersection =\n isLessThan(rectA.top, rectB.bottom) && isGreaterThan(rectA.bottom, rectB.top);\n const isIntersection = isHorizontalIntersection && isVerticalIntersection;\n\n return {\n isHorizontalIntersection,\n isVerticalIntersection,\n isIntersection,\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Fragment, h, type VNode } from 'vue';\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram-vue/utils';\nimport { Rectangle } from '@flowgram-vue/utils';\nimport { WorkflowDocument } from '@flowgram-vue/free-layout-core';\nimport { FlowNodeTransformData } from '@flowgram-vue/document';\nimport { Layer } from '@flowgram-vue/core';\n\nimport { isEqual, isGreaterThan, isNumber } from './utils';\nimport { AlignRect, SnapEvent, WorkflowSnapLayerOptions } from './type';\nimport { WorkflowSnapService } from './service';\n\ninterface SnapRenderLine {\n className: string;\n sourceNode: string;\n top: number;\n left: number;\n width: number;\n height: number;\n dashed?: boolean;\n}\n\n@injectable()\nexport class WorkflowSnapLayer extends Layer<WorkflowSnapLayerOptions> {\n public static type = 'WorkflowSnapLayer';\n\n @inject(WorkflowDocument) private readonly document: WorkflowDocument;\n\n @inject(WorkflowSnapService) private readonly service: WorkflowSnapService;\n\n public readonly node = domUtils.createDivWithClass(\n 'gedit-playground-layer gedit-flow-snap-layer'\n );\n\n private edgeLines: SnapRenderLine[] = [];\n\n private alignLines: SnapRenderLine[] = [];\n\n public onReady(): void {\n this.node.style.zIndex = '9999';\n this.toDispose.pushAll([\n this.service.onSnap((event: SnapEvent) => {\n this.edgeLines = this.calcEdgeLines(event);\n this.alignLines = this.calcAlignLines(event);\n this.render();\n }),\n ]);\n }\n\n public render(): VNode {\n const children: VNode[] = [];\n if (this.alignLines.length > 0) {\n children.push(\n h('div', { class: 'workflow-snap-align-lines' }, this.renderAlignLines())\n );\n }\n if (this.edgeLines.length > 0) {\n children.push(h('div', { class: 'workflow-snap-edge-lines' }, this.renderEdgeLines()));\n }\n return h(Fragment, null, children);\n }\n\n public onZoom(scale: number): void {\n this.node.style.transform = `scale(${scale})`;\n }\n\n private renderEdgeLines(): VNode[] {\n return this.edgeLines.map((renderLine: SnapRenderLine) => {\n const { className, sourceNode, top, left, width, height, dashed } = renderLine;\n const id = `${className}-${sourceNode}-${top}-${left}-${width}-${height}`;\n const isHorizontal = width < height;\n const border = `${this.options.edgeLineWidth}px ${dashed ? 'dashed' : 'solid'} ${\n this.options.edgeColor\n }`;\n return h('div', {\n class: `workflow-snap-edge-line ${className}`,\n 'data-testid': 'sdk.workflow.canvas.snap.edgeLine',\n 'data-snap-line-id': id,\n 'data-snap-line-source-node': sourceNode,\n key: id,\n style: {\n top: `${top}px`,\n left: `${left}px`,\n width: `${width}px`,\n height: `${height}px`,\n position: 'absolute',\n borderLeft: isHorizontal ? border : 'none',\n borderTop: !isHorizontal ? border : 'none',\n },\n });\n });\n }\n\n private renderAlignLines(): VNode[] {\n return this.alignLines.map((renderLine: SnapRenderLine) => {\n const id = `${renderLine.className}-${renderLine.sourceNode}-${renderLine.top}-${renderLine.left}-${renderLine.width}-${renderLine.height}`;\n const isHorizontal = isGreaterThan(renderLine.width, renderLine.height);\n const alignLineWidth = this.options.alignLineWidth; // 整体线条粗细\n const alignCrossWidth = this.options.alignCrossWidth; // 工字形横线的长度\n\n // 调整渲染位置以保持居中\n const adjustedTop = isHorizontal ? renderLine.top - alignLineWidth / 2 : renderLine.top;\n const adjustedLeft = isHorizontal ? renderLine.left : renderLine.left - alignLineWidth / 2;\n\n return h(\n 'div',\n {\n class: `workflow-snap-align-line ${renderLine.className}`,\n 'data-testid': 'sdk.workflow.canvas.snap.alignLine',\n 'data-snap-line-id': id,\n 'data-snap-line-source-node': renderLine.sourceNode,\n key: id,\n style: {\n position: 'absolute',\n },\n },\n [\n h('div', {\n style: {\n position: 'absolute',\n top: `${adjustedTop}px`,\n left: `${adjustedLeft}px`,\n width: `${isHorizontal ? renderLine.width : alignLineWidth}px`,\n height: `${isHorizontal ? alignLineWidth : renderLine.height}px`,\n backgroundColor: this.options.alignColor,\n },\n }),\n h('div', {\n style: {\n position: 'absolute',\n top: `${\n isHorizontal\n ? adjustedTop - (alignCrossWidth - alignLineWidth) / 2\n : adjustedTop\n }px`,\n left: `${\n isHorizontal\n ? adjustedLeft\n : adjustedLeft - (alignCrossWidth - alignLineWidth) / 2\n }px`,\n width: `${isHorizontal ? alignLineWidth : alignCrossWidth}px`,\n height: `${isHorizontal ? alignCrossWidth : alignLineWidth}px`,\n backgroundColor: this.options.alignColor,\n },\n }),\n h('div', {\n style: {\n position: 'absolute',\n top: `${\n isHorizontal\n ? adjustedTop - (alignCrossWidth - alignLineWidth) / 2\n : adjustedTop + renderLine.height - alignLineWidth\n }px`,\n left: `${\n isHorizontal\n ? adjustedLeft + renderLine.width - alignLineWidth\n : adjustedLeft - (alignCrossWidth - alignLineWidth) / 2\n }px`,\n width: `${isHorizontal ? alignLineWidth : alignCrossWidth}px`,\n height: `${isHorizontal ? alignCrossWidth : alignLineWidth}px`,\n backgroundColor: this.options.alignColor,\n },\n }),\n ]\n );\n });\n }\n\n private calcEdgeLines(event: SnapEvent): SnapRenderLine[] {\n const { alignRects, snapRect, snapEdgeLines } = event;\n const edgeLines: SnapRenderLine[] = [];\n\n const topFullAlign = this.directionFullAlign({\n alignRects: alignRects.top,\n targetRect: snapRect,\n isVertical: true,\n });\n const bottomFullAlign = this.directionFullAlign({\n alignRects: alignRects.bottom,\n targetRect: snapRect,\n isVertical: true,\n });\n const leftFullAlign = this.directionFullAlign({\n alignRects: alignRects.left,\n targetRect: snapRect,\n isVertical: false,\n });\n const rightFullAlign = this.directionFullAlign({\n alignRects: alignRects.right,\n targetRect: snapRect,\n isVertical: false,\n });\n\n // 处理顶部对齐\n if (topFullAlign) {\n const top = topFullAlign.rect.top;\n const height = bottomFullAlign\n ? snapRect.bottom - snapRect.height / 2 - top\n : snapRect.bottom - top;\n const width = this.options.edgeLineWidth;\n const lineData = {\n top,\n width,\n height,\n };\n edgeLines.push({\n className: 'edge-full-top-left',\n sourceNode: topFullAlign.sourceNodeId,\n left: snapRect.left,\n ...lineData,\n });\n edgeLines.push({\n className: 'edge-full-top-right',\n sourceNode: topFullAlign.sourceNodeId,\n left: snapRect.right - 1,\n ...lineData,\n });\n edgeLines.push({\n className: 'edge-full-top-mid',\n sourceNode: topFullAlign.sourceNodeId,\n left: snapRect.left + snapRect.width / 2,\n dashed: true,\n ...lineData,\n });\n }\n\n // 处理底部对齐\n if (bottomFullAlign) {\n const top = topFullAlign ? snapRect.top + snapRect.height / 2 : snapRect.top;\n const height = bottomFullAlign.rect.bottom - top;\n const width = this.options.edgeLineWidth;\n const lineData = {\n top,\n width,\n height,\n };\n edgeLines.push({\n className: 'edge-full-bottom-left',\n sourceNode: bottomFullAlign.sourceNodeId,\n left: snapRect.left,\n ...lineData,\n });\n edgeLines.push({\n className: 'edge-full-bottom-right',\n sourceNode: bottomFullAlign.sourceNodeId,\n left: snapRect.right - 1,\n ...lineData,\n });\n edgeLines.push({\n className: 'edge-full-bottom-mid',\n sourceNode: bottomFullAlign.sourceNodeId,\n left: snapRect.left + snapRect.width / 2,\n dashed: true,\n ...lineData,\n });\n }\n\n // 处理左侧对齐\n if (leftFullAlign) {\n const left = leftFullAlign.rect.left;\n const width = rightFullAlign\n ? snapRect.right - snapRect.width / 2 - left\n : snapRect.right - left;\n const height = this.options.edgeLineWidth;\n const lineData = {\n left,\n width,\n height,\n };\n edgeLines.push({\n className: 'edge-full-left-top',\n sourceNode: leftFullAlign.sourceNodeId,\n top: snapRect.top,\n ...lineData,\n });\n edgeLines.push({\n className: 'edge-full-left-bottom',\n sourceNode: leftFullAlign.sourceNodeId,\n top: snapRect.bottom - 1,\n ...lineData,\n });\n edgeLines.push({\n className: 'edge-full-left-mid',\n sourceNode: leftFullAlign.sourceNodeId,\n top: snapRect.top + snapRect.height / 2,\n dashed: true,\n ...lineData,\n });\n }\n\n // 处理右侧对齐\n if (rightFullAlign) {\n const left = leftFullAlign ? snapRect.left + snapRect.width / 2 : snapRect.left;\n const width = rightFullAlign.rect.right - left;\n const height = this.options.edgeLineWidth;\n const lineData = {\n left,\n width,\n height,\n };\n edgeLines.push({\n className: 'edge-full-right-top',\n sourceNode: rightFullAlign.sourceNodeId,\n top: snapRect.top,\n ...lineData,\n });\n edgeLines.push({\n className: 'edge-full-right-bottom',\n sourceNode: rightFullAlign.sourceNodeId,\n top: snapRect.bottom - 1,\n ...lineData,\n });\n edgeLines.push({\n className: 'edge-full-right-mid',\n sourceNode: rightFullAlign.sourceNodeId,\n top: snapRect.top + snapRect.height / 2,\n dashed: true,\n ...lineData,\n });\n }\n\n const snappedEdgeLines = Object.entries(snapEdgeLines)\n .map(([direction, snapLine]) => {\n if (!snapLine) {\n return;\n }\n const sourceNode = this.document.getNode(snapLine.sourceNodeId);\n if (!sourceNode) {\n return;\n }\n const nodeRect = sourceNode.getData(FlowNodeTransformData).bounds;\n if (isNumber(snapLine.x)) {\n // 垂直\n const top = Math.min(nodeRect.top, snapRect.top);\n const bottom = Math.max(nodeRect.bottom, snapRect.bottom);\n const height = bottom - top;\n const left = direction === 'right' ? snapLine.x - 1 : snapLine.x;\n const width = this.options.edgeLineWidth;\n const isMidX = direction === 'midVertical';\n const lineData: SnapRenderLine = {\n className: `edge-snapped-${direction}`,\n sourceNode: snapLine.sourceNodeId,\n top,\n left,\n width,\n height,\n dashed: isMidX,\n };\n const onTop = top === nodeRect.top;\n if (onTop && topFullAlign) {\n return;\n }\n if (!onTop && bottomFullAlign) {\n return;\n }\n return lineData;\n } else if (isNumber(snapLine.y)) {\n // 水平\n const left = Math.min(nodeRect.left, snapRect.left);\n const right = Math.max(nodeRect.right, snapRect.right);\n const width = right - left;\n const top = direction === 'bottom' ? snapLine.y - 1 : snapLine.y;\n const height = this.options.edgeLineWidth;\n const isMidY = direction === 'midHorizontal';\n const lineData: SnapRenderLine = {\n className: `edge-snapped-${direction}`,\n sourceNode: snapLine.sourceNodeId,\n top,\n left,\n width,\n height,\n dashed: isMidY,\n };\n const onLeft = left === nodeRect.left;\n if (onLeft && leftFullAlign) {\n return;\n }\n if (!onLeft && rightFullAlign) {\n return;\n }\n return lineData;\n }\n })\n .filter(Boolean) as SnapRenderLine[];\n\n edgeLines.push(...snappedEdgeLines);\n\n return edgeLines;\n }\n\n private directionFullAlign(params: {\n alignRects: AlignRect[];\n targetRect: Rectangle;\n isVertical: boolean;\n }): AlignRect | undefined {\n const { alignRects, targetRect, isVertical } = params;\n let fullAlignIndex = -1;\n for (let i = 0; i < alignRects.length; i++) {\n const alignRect = alignRects[i];\n const prevRect = alignRects[i - 1]?.rect ?? targetRect;\n const isFullAlign = this.rectFullAlign(alignRect.rect, prevRect, isVertical);\n if (!isFullAlign) {\n // 未对齐则中断\n break; // 用 for 循环 + break 反而比 Array.findIndex 实现可读性更好\n }\n fullAlignIndex = i;\n }\n const fullAlignRect = alignRects[fullAlignIndex];\n return fullAlignRect;\n }\n\n private rectFullAlign(rectA: Rectangle, rectB: Rectangle, isVertical: boolean): boolean {\n if (isVertical) {\n return isEqual(rectA.left, rectB.left) && isEqual(rectA.right, rectB.right);\n } else {\n return isEqual(rectA.top, rectB.top) && isEqual(rectA.bottom, rectB.bottom);\n }\n }\n\n private calcAlignLines(event: SnapEvent): SnapRenderLine[] {\n const { alignRects, alignSpacing, snapRect } = event;\n\n const topAlignLines = this.calcDirectionAlignLines({\n alignRects: alignRects.top,\n targetRect: snapRect,\n isVertical: true,\n spacing: alignSpacing.midVertical ?? alignSpacing.top,\n });\n\n const bottomAlignLines = this.calcDirectionAlignLines({\n alignRects: alignRects.bottom,\n targetRect: snapRect,\n isVertical: true,\n spacing: alignSpacing.midVertical ?? alignSpacing.bottom,\n });\n\n const leftAlignLines = this.calcDirectionAlignLines({\n alignRects: alignRects.left,\n targetRect: snapRect,\n isVertical: false,\n spacing: alignSpacing.midHorizontal ?? alignSpacing.left,\n });\n\n const rightAlignLines = this.calcDirectionAlignLines({\n alignRects: alignRects.right,\n targetRect: snapRect,\n isVertical: false,\n spacing: alignSpacing.midHorizontal ?? alignSpacing.right,\n });\n\n return [...topAlignLines, ...bottomAlignLines, ...leftAlignLines, ...rightAlignLines];\n }\n\n private calcDirectionAlignLines(params: {\n alignRects: AlignRect[];\n targetRect: Rectangle;\n isVertical: boolean;\n spacing?: number;\n }) {\n const { alignRects, targetRect, isVertical, spacing } = params;\n const alignLines: SnapRenderLine[] = [];\n if (!spacing) {\n return alignLines;\n }\n for (let i = 0; i < alignRects.length; i++) {\n const alignRect = alignRects[i];\n const rect = alignRect.rect;\n const prevRect = alignRects[i - 1]?.rect ?? targetRect;\n\n const betweenSpacing = isVertical\n ? Math.min(Math.abs(prevRect.top - rect.bottom), Math.abs(prevRect.bottom - rect.top))\n : Math.min(Math.abs(prevRect.left - rect.right), Math.abs(prevRect.right - rect.left));\n if (!isEqual(betweenSpacing, spacing)) {\n // 不连续,需要中断\n break; // 因为要用到 break,所以不能用 Array.map()\n }\n if (isVertical) {\n const centerX = this.calcHorizontalIntersectionCenter(rect, targetRect);\n alignLines.push({\n className: 'align-vertical',\n sourceNode: alignRect.sourceNodeId,\n top: Math.min(rect.bottom, prevRect.bottom),\n left: centerX,\n width: 1,\n height: spacing,\n });\n } else {\n const centerY = this.calcVerticalIntersectionCenter(rect, targetRect);\n alignLines.push({\n className: 'align-horizontal',\n sourceNode: alignRect.sourceNodeId,\n top: centerY,\n left: Math.min(rect.right, prevRect.right),\n width: spacing,\n height: 1,\n });\n }\n }\n return alignLines;\n }\n\n private calcVerticalIntersectionCenter(rectA: Rectangle, rectB: Rectangle): number {\n const top = Math.max(rectA.top, rectB.top);\n const bottom = Math.min(rectA.bottom, rectB.bottom);\n return (top + bottom) / 2;\n }\n\n private calcHorizontalIntersectionCenter(rectA: Rectangle, rectB: Rectangle): number {\n const left = Math.max(rectA.left, rectB.left);\n const right = Math.min(rectA.right, rectB.right);\n return (left + right) / 2;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { definePluginCreator } from '@flowgram-vue/core';\n\nimport {\n FreeSnapPluginOptions,\n WorkflowSnapLayerOptions,\n WorkflowSnapServiceOptions,\n} from './type';\nimport { WorkflowSnapService } from './service';\nimport { WorkflowSnapLayer } from './layer';\nimport { SnapDefaultOptions } from './constant';\n\nexport const createFreeSnapPlugin = definePluginCreator<FreeSnapPluginOptions>({\n onBind({ bind }) {\n bind(WorkflowSnapService).toSelf().inSingletonScope();\n },\n onInit(ctx, opts) {\n const options: WorkflowSnapServiceOptions & WorkflowSnapLayerOptions = {\n ...SnapDefaultOptions,\n ...opts,\n };\n ctx.playground.registerLayer(WorkflowSnapLayer, options);\n const snapService = ctx.get<WorkflowSnapService>(WorkflowSnapService);\n snapService.init(options);\n },\n onDispose(ctx) {\n const snapService = ctx.get<WorkflowSnapService>(WorkflowSnapService);\n snapService.dispose();\n },\n});\n"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import * as _flowgram_vue_core from '@flowgram-vue/core';
|
|
2
|
+
import * as _flowgram_vue_utils from '@flowgram-vue/utils';
|
|
3
|
+
import { Rectangle } from '@flowgram-vue/utils';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
7
|
+
* SPDX-License-Identifier: MIT
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
interface SnapLine {
|
|
11
|
+
x?: number;
|
|
12
|
+
y?: number;
|
|
13
|
+
sourceNodeId: string;
|
|
14
|
+
}
|
|
15
|
+
interface SnapHorizontalLine extends SnapLine {
|
|
16
|
+
y: number;
|
|
17
|
+
}
|
|
18
|
+
interface SnapVerticalLine extends SnapLine {
|
|
19
|
+
x: number;
|
|
20
|
+
}
|
|
21
|
+
interface SnapMidHorizontalLine extends SnapLine {
|
|
22
|
+
y: number;
|
|
23
|
+
}
|
|
24
|
+
interface SnapMidVerticalLine extends SnapLine {
|
|
25
|
+
x: number;
|
|
26
|
+
}
|
|
27
|
+
interface SnapEdgeLines {
|
|
28
|
+
top?: SnapHorizontalLine;
|
|
29
|
+
bottom?: SnapHorizontalLine;
|
|
30
|
+
left?: SnapVerticalLine;
|
|
31
|
+
right?: SnapVerticalLine;
|
|
32
|
+
midHorizontal?: SnapMidHorizontalLine;
|
|
33
|
+
midVertical?: SnapMidVerticalLine;
|
|
34
|
+
}
|
|
35
|
+
interface AlignRect {
|
|
36
|
+
rect: Rectangle;
|
|
37
|
+
sourceNodeId: string;
|
|
38
|
+
}
|
|
39
|
+
interface AlignRects {
|
|
40
|
+
top: AlignRect[];
|
|
41
|
+
bottom: AlignRect[];
|
|
42
|
+
left: AlignRect[];
|
|
43
|
+
right: AlignRect[];
|
|
44
|
+
}
|
|
45
|
+
interface AlignSpacing {
|
|
46
|
+
top?: number;
|
|
47
|
+
bottom?: number;
|
|
48
|
+
left?: number;
|
|
49
|
+
right?: number;
|
|
50
|
+
midHorizontal?: number;
|
|
51
|
+
midVertical?: number;
|
|
52
|
+
}
|
|
53
|
+
interface SnapEvent {
|
|
54
|
+
snapEdgeLines: SnapEdgeLines;
|
|
55
|
+
snapRect: Rectangle;
|
|
56
|
+
alignRects: AlignRects;
|
|
57
|
+
alignSpacing: AlignSpacing;
|
|
58
|
+
}
|
|
59
|
+
interface WorkflowSnapServiceOptions {
|
|
60
|
+
edgeThreshold: number;
|
|
61
|
+
gridSize: number;
|
|
62
|
+
enableGridSnapping: boolean;
|
|
63
|
+
enableEdgeSnapping: boolean;
|
|
64
|
+
enableMultiSnapping: boolean;
|
|
65
|
+
enableOnlyViewportSnapping: boolean;
|
|
66
|
+
}
|
|
67
|
+
interface WorkflowSnapLayerOptions {
|
|
68
|
+
edgeColor: string;
|
|
69
|
+
alignColor: string;
|
|
70
|
+
edgeLineWidth: number;
|
|
71
|
+
alignLineWidth: number;
|
|
72
|
+
alignCrossWidth: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
declare const createFreeSnapPlugin: _flowgram_vue_core.PluginCreator<Partial<WorkflowSnapServiceOptions & WorkflowSnapLayerOptions>>;
|
|
76
|
+
|
|
77
|
+
declare class WorkflowSnapService {
|
|
78
|
+
private readonly document;
|
|
79
|
+
private readonly entityManager;
|
|
80
|
+
private readonly dragService;
|
|
81
|
+
private readonly playgroundConfig;
|
|
82
|
+
private disposers;
|
|
83
|
+
private options;
|
|
84
|
+
private snapEmitter;
|
|
85
|
+
readonly onSnap: _flowgram_vue_utils.Event<SnapEvent>;
|
|
86
|
+
private _disabled;
|
|
87
|
+
init(params?: Partial<WorkflowSnapServiceOptions>): void;
|
|
88
|
+
dispose(): void;
|
|
89
|
+
get disabled(): boolean;
|
|
90
|
+
disable(): void;
|
|
91
|
+
enable(): void;
|
|
92
|
+
private mountListener;
|
|
93
|
+
private snapping;
|
|
94
|
+
private calcSnapOffset;
|
|
95
|
+
private gridSnapping;
|
|
96
|
+
private clear;
|
|
97
|
+
private getSnapLines;
|
|
98
|
+
private getAvailableNodes;
|
|
99
|
+
private viewRect;
|
|
100
|
+
private getSnapNodeRects;
|
|
101
|
+
private get nodes();
|
|
102
|
+
private getBounds;
|
|
103
|
+
private updateNodePositionWithOffset;
|
|
104
|
+
private calcAlignOffset;
|
|
105
|
+
private calcAlignSpacing;
|
|
106
|
+
private getAlignRects;
|
|
107
|
+
private getMidAlignSpacing;
|
|
108
|
+
private getDirectionAlignSpacing;
|
|
109
|
+
private intersection;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export { WorkflowSnapService, createFreeSnapPlugin };
|