@flowgram.ai/free-layout-core 0.2.16 → 0.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/esm/{chunk-J5FVRRUV.js → chunk-242F2JCI.js} +1 -1
  2. package/dist/esm/chunk-242F2JCI.js.map +1 -0
  3. package/dist/esm/{chunk-BJKYSQMI.js → chunk-CTGO4RKX.js} +1 -1
  4. package/dist/esm/chunk-CTGO4RKX.js.map +1 -0
  5. package/dist/esm/{chunk-IYUZVBAO.js → chunk-IKQUOAWQ.js} +1 -1
  6. package/dist/esm/chunk-IKQUOAWQ.js.map +1 -0
  7. package/dist/esm/{chunk-LJH3TSLZ.js → chunk-O4WKIIW2.js} +1 -1
  8. package/dist/esm/chunk-O4WKIIW2.js.map +1 -0
  9. package/dist/esm/index.js +55 -35
  10. package/dist/esm/index.js.map +1 -1
  11. package/dist/esm/typings/index.js +4 -4
  12. package/dist/esm/typings/workflow-json.js +1 -1
  13. package/dist/esm/typings/workflow-line.js +1 -1
  14. package/dist/esm/typings/workflow-operation.js +1 -1
  15. package/dist/index.d.mts +82 -5
  16. package/dist/index.d.ts +82 -5
  17. package/dist/index.js +35 -15
  18. package/dist/index.js.map +1 -1
  19. package/dist/typings/index.d.mts +7 -2
  20. package/dist/typings/index.d.ts +7 -2
  21. package/dist/typings/index.js.map +1 -1
  22. package/dist/typings/workflow-drag.d.mts +2 -2
  23. package/dist/typings/workflow-drag.d.ts +2 -2
  24. package/dist/typings/workflow-drag.js.map +1 -1
  25. package/dist/typings/workflow-edge.d.mts +4 -0
  26. package/dist/typings/workflow-edge.d.ts +4 -0
  27. package/dist/typings/workflow-edge.js.map +1 -1
  28. package/dist/typings/workflow-json.d.mts +2 -2
  29. package/dist/typings/workflow-json.d.ts +2 -2
  30. package/dist/typings/workflow-json.js.map +1 -1
  31. package/dist/typings/workflow-line.d.mts +2 -2
  32. package/dist/typings/workflow-line.d.ts +2 -2
  33. package/dist/typings/workflow-line.js.map +1 -1
  34. package/dist/typings/workflow-node.d.mts +2 -2
  35. package/dist/typings/workflow-node.d.ts +2 -2
  36. package/dist/typings/workflow-node.js.map +1 -1
  37. package/dist/typings/workflow-operation.d.mts +5 -0
  38. package/dist/typings/workflow-operation.d.ts +5 -0
  39. package/dist/typings/workflow-operation.js.map +1 -1
  40. package/dist/typings/workflow-registry.d.mts +7 -2
  41. package/dist/typings/workflow-registry.d.ts +7 -2
  42. package/dist/typings/workflow-registry.js.map +1 -1
  43. package/dist/typings/workflow-sub-canvas.d.mts +1 -1
  44. package/dist/typings/workflow-sub-canvas.d.ts +1 -1
  45. package/dist/typings/workflow-sub-canvas.js.map +1 -1
  46. package/dist/{workflow-line-entity-B4Mfa03B.d.ts → workflow-line-entity-BUokXoMi.d.ts} +61 -2
  47. package/dist/{workflow-line-entity-B34FWw9W.d.mts → workflow-line-entity-BuRLWUuf.d.mts} +61 -2
  48. package/dist/{workflow-sub-canvas-DOVla1mw.d.mts → workflow-sub-canvas-IQzlYvPD.d.mts} +10 -0
  49. package/dist/{workflow-sub-canvas-DOVla1mw.d.ts → workflow-sub-canvas-IQzlYvPD.d.ts} +10 -0
  50. package/package.json +9 -9
  51. package/dist/esm/chunk-BJKYSQMI.js.map +0 -1
  52. package/dist/esm/chunk-IYUZVBAO.js.map +0 -1
  53. package/dist/esm/chunk-J5FVRRUV.js.map +0 -1
  54. package/dist/esm/chunk-LJH3TSLZ.js.map +0 -1
@@ -13,4 +13,4 @@ var WorkflowContentChangeType = /* @__PURE__ */ ((WorkflowContentChangeType2) =>
13
13
  export {
14
14
  WorkflowContentChangeType
15
15
  };
16
- //# sourceMappingURL=chunk-J5FVRRUV.js.map
16
+ //# sourceMappingURL=chunk-242F2JCI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/typings/workflow-json.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type WorkflowLineEntity, type WorkflowNodeEntity } from '../entities';\nimport { type WorkflowNodeJSON } from './workflow-node';\nimport { type WorkflowEdgeJSON } from './workflow-edge';\n\nexport interface WorkflowJSON {\n nodes: WorkflowNodeJSON[];\n edges: WorkflowEdgeJSON[];\n}\n\nexport enum WorkflowContentChangeType {\n /**\n * 添加节点\n */\n ADD_NODE = 'ADD_NODE',\n /**\n * 删除节点\n */\n DELETE_NODE = 'DELETE_NODE',\n /**\n * 移动节点\n */\n MOVE_NODE = 'MOVE_NODE',\n /**\n * 节点数据更新 (表单引擎数据 或者 extInfo 数据)\n */\n NODE_DATA_CHANGE = 'NODE_DATA_CHANGE',\n /**\n * 添加线条\n */\n ADD_LINE = 'ADD_LINE',\n /**\n * 删除线条\n */\n DELETE_LINE = 'DELETE_LINE',\n /**\n * 节点Meta信息变更\n */\n META_CHANGE = 'META_CHANGE',\n}\n\nexport interface WorkflowContentChangeEvent {\n type: WorkflowContentChangeType;\n /**\n * 当前触发的元素的json数据,toJSON 需要主动触发\n */\n toJSON: () => any;\n /*\n * 当前的事件的 entity\n */\n entity: WorkflowNodeEntity | WorkflowLineEntity;\n}\n"],"mappings":";AAcO,IAAK,4BAAL,kBAAKA,+BAAL;AAIL,EAAAA,2BAAA,cAAW;AAIX,EAAAA,2BAAA,iBAAc;AAId,EAAAA,2BAAA,eAAY;AAIZ,EAAAA,2BAAA,sBAAmB;AAInB,EAAAA,2BAAA,cAAW;AAIX,EAAAA,2BAAA,iBAAc;AAId,EAAAA,2BAAA,iBAAc;AA5BJ,SAAAA;AAAA,GAAA;","names":["WorkflowContentChangeType"]}
@@ -19,4 +19,4 @@ export {
19
19
  LineType,
20
20
  LineColors
21
21
  };
22
- //# sourceMappingURL=chunk-BJKYSQMI.js.map
22
+ //# sourceMappingURL=chunk-CTGO4RKX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/typings/workflow-line.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport type { Rectangle, IPoint } from '@flowgram.ai/utils';\n\nimport { type WorkflowLineEntity } from '../entities';\n\nexport enum LineType {\n BEZIER, // 贝塞尔曲线\n LINE_CHART, // 折叠线\n}\n\nexport type LineRenderType = LineType | string;\n\nexport interface LinePosition {\n from: IPoint;\n to: IPoint;\n}\n\nexport interface LineColor {\n hidden: string;\n default: string;\n drawing: string;\n hovered: string;\n selected: string;\n error: string;\n flowing: string;\n}\n\nexport enum LineColors {\n HIDDEN = 'var(--g-workflow-line-color-hidden,transparent)', // 隐藏线条\n DEFUALT = 'var(--g-workflow-line-color-default,#4d53e8)',\n DRAWING = 'var(--g-workflow-line-color-drawing, #5DD6E3)', // '#b5bbf8', // '#9197F1',\n HOVER = 'var(--g-workflow-line-color-hover,#37d0ff)',\n SELECTED = 'var(--g-workflow-line-color-selected,#37d0ff)',\n ERROR = 'var(--g-workflow-line-color-error,red)',\n FLOWING = 'var(--g-workflow-line-color-flowing,#4d53e8)', // 流动线条,默认使用主题色\n}\n\nexport interface WorkflowLineRenderContribution {\n entity: WorkflowLineEntity;\n path: string;\n bounds: Rectangle;\n update: (params: { fromPos: IPoint; toPos: IPoint }) => void;\n calcDistance: (pos: IPoint) => number;\n}\n\nexport type WorkflowLineRenderContributionFactory = (new (\n entity: WorkflowLineEntity\n) => WorkflowLineRenderContribution) & {\n type: LineRenderType;\n};\n"],"mappings":";AASO,IAAK,WAAL,kBAAKA,cAAL;AACL,EAAAA,oBAAA;AACA,EAAAA,oBAAA;AAFU,SAAAA;AAAA,GAAA;AAsBL,IAAK,aAAL,kBAAKC,gBAAL;AACL,EAAAA,YAAA,YAAS;AACT,EAAAA,YAAA,aAAU;AACV,EAAAA,YAAA,aAAU;AACV,EAAAA,YAAA,WAAQ;AACR,EAAAA,YAAA,cAAW;AACX,EAAAA,YAAA,WAAQ;AACR,EAAAA,YAAA,aAAU;AAPA,SAAAA;AAAA,GAAA;","names":["LineType","LineColors"]}
@@ -4,4 +4,4 @@ var URLParams = Symbol("");
4
4
  export {
5
5
  URLParams
6
6
  };
7
- //# sourceMappingURL=chunk-IYUZVBAO.js.map
7
+ //# sourceMappingURL=chunk-IKQUOAWQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/typings/index.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport * from './workflow-json';\nexport * from './workflow-edge';\nexport * from './workflow-node';\nexport * from './workflow-registry';\nexport * from './workflow-line';\nexport * from './workflow-sub-canvas';\nexport * from './workflow-operation';\nexport * from './workflow-drag';\n\nexport const URLParams = Symbol('');\n\nexport interface URLParams {\n [key: string]: string;\n}\n"],"mappings":";AAcO,IAAM,YAAY,OAAO,EAAE;","names":[]}
@@ -4,4 +4,4 @@ var WorkflowOperationBaseService = Symbol("WorkflowOperationBaseService");
4
4
  export {
5
5
  WorkflowOperationBaseService
6
6
  };
7
- //# sourceMappingURL=chunk-LJH3TSLZ.js.map
7
+ //# sourceMappingURL=chunk-O4WKIIW2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/typings/workflow-operation.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { IPoint, Event } from '@flowgram.ai/utils';\nimport {\n FlowNodeEntity,\n FlowNodeEntityOrId,\n FlowOperationBaseService,\n} from '@flowgram.ai/document';\n\nexport interface NodePostionUpdateEvent {\n node: FlowNodeEntity;\n oldPosition: IPoint;\n newPosition: IPoint;\n}\n\nexport interface WorkflowOperationBaseService extends FlowOperationBaseService {\n /**\n * 节点位置更新事件\n */\n readonly onNodePostionUpdate: Event<NodePostionUpdateEvent>;\n /**\n * 更新节点位置\n * @param nodeOrId\n * @param position\n * @returns\n */\n updateNodePosition(nodeOrId: FlowNodeEntityOrId, position: IPoint): void;\n}\n\nexport const WorkflowOperationBaseService = Symbol('WorkflowOperationBaseService');\n"],"mappings":";AAgCO,IAAM,+BAA+B,OAAO,8BAA8B;","names":[]}
package/dist/esm/index.js CHANGED
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  URLParams
3
- } from "./chunk-IYUZVBAO.js";
3
+ } from "./chunk-IKQUOAWQ.js";
4
4
  import "./chunk-KNYZRMIO.js";
5
5
  import "./chunk-NU6G5HF4.js";
6
6
  import "./chunk-TQLT57GW.js";
7
7
  import "./chunk-CGOMTQ3G.js";
8
8
  import {
9
9
  WorkflowContentChangeType
10
- } from "./chunk-J5FVRRUV.js";
10
+ } from "./chunk-242F2JCI.js";
11
11
  import {
12
12
  LineColors,
13
13
  LineType
14
- } from "./chunk-BJKYSQMI.js";
14
+ } from "./chunk-CTGO4RKX.js";
15
15
  import "./chunk-DDJTYHXN.js";
16
16
  import {
17
17
  WorkflowOperationBaseService
18
- } from "./chunk-LJH3TSLZ.js";
18
+ } from "./chunk-O4WKIIW2.js";
19
19
  import {
20
20
  __decorateClass
21
21
  } from "./chunk-EUXUH3YW.js";
@@ -694,6 +694,7 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends Entity2 {
694
694
  super(opts);
695
695
  this._processing = false;
696
696
  this._hasError = false;
697
+ this.stackIndex = 0;
697
698
  /**
698
699
  * 线条数据
699
700
  */
@@ -1134,7 +1135,7 @@ import {
1134
1135
  MouseTouchEvent,
1135
1136
  PlaygroundConfigEntity as PlaygroundConfigEntity5,
1136
1137
  PlaygroundDrag,
1137
- TransformData as TransformData9
1138
+ TransformData as TransformData8
1138
1139
  } from "@flowgram.ai/core";
1139
1140
 
1140
1141
  // src/workflow-lines-manager.ts
@@ -1142,7 +1143,7 @@ import { last } from "lodash-es";
1142
1143
  import { inject as inject3, injectable as injectable3 } from "inversify";
1143
1144
  import { DisposableCollection, Emitter as Emitter3 } from "@flowgram.ai/utils";
1144
1145
  import { FlowNodeRenderData as FlowNodeRenderData2, FlowNodeTransformData as FlowNodeTransformData3 } from "@flowgram.ai/document";
1145
- import { EntityManager as EntityManager2, PlaygroundConfigEntity as PlaygroundConfigEntity2, TransformData as TransformData6 } from "@flowgram.ai/core";
1146
+ import { EntityManager as EntityManager2, PlaygroundConfigEntity as PlaygroundConfigEntity2 } from "@flowgram.ai/core";
1146
1147
 
1147
1148
  // src/workflow-document-option.ts
1148
1149
  import { FlowNodeErrorData } from "@flowgram.ai/form-core";
@@ -1489,7 +1490,8 @@ var WorkflowLinesManager = class {
1489
1490
  const allPorts = this.entityManager.getEntities(WorkflowPortEntity).filter((port) => port.node.flowNodeType !== "root");
1490
1491
  const targetPort = allPorts.find((port) => port.isHovered(pos.x, pos.y));
1491
1492
  if (targetPort) {
1492
- const targetNode = this.document.getAllNodes().slice().reverse().filter((node) => targetPort.node?.parent?.id !== node.id).find((node) => node.getData(TransformData6).contains(pos.x, pos.y));
1493
+ const containNodes = this.getContainNodesFromMousePos(pos);
1494
+ const targetNode = last(containNodes);
1493
1495
  if (targetNode && targetNode !== targetPort.node) {
1494
1496
  return;
1495
1497
  }
@@ -1501,16 +1503,8 @@ var WorkflowLinesManager = class {
1501
1503
  * @param pos - 鼠标位置
1502
1504
  */
1503
1505
  getNodeFromMousePos(pos) {
1504
- const allNodes = this.document.getAllNodes().sort((a, b) => this.getNodeIndex(a) - this.getNodeIndex(b));
1505
- const containNodes = [];
1506
1506
  const { selection } = this.selectService;
1507
- const zoom = this.entityManager.getEntity(PlaygroundConfigEntity2)?.config?.zoom || 1;
1508
- allNodes.forEach((node) => {
1509
- const { bounds } = node.getData(FlowNodeTransformData3);
1510
- if (bounds.clone().pad(4 / zoom).contains(pos.x, pos.y)) {
1511
- containNodes.push(node);
1512
- }
1513
- });
1507
+ const containNodes = this.getContainNodesFromMousePos(pos);
1514
1508
  if (selection?.length) {
1515
1509
  const filteredNodes = containNodes.filter(
1516
1510
  (node) => selection.some((_node) => node.id === _node.id)
@@ -1528,6 +1522,18 @@ var WorkflowLinesManager = class {
1528
1522
  registerData(line) {
1529
1523
  line.addData(WorkflowLineRenderData);
1530
1524
  }
1525
+ /** 获取鼠标坐标位置的所有节点(stackIndex 从小到大排序) */
1526
+ getContainNodesFromMousePos(pos) {
1527
+ const allNodes = this.document.getAllNodes().sort((a, b) => this.getNodeIndex(a) - this.getNodeIndex(b));
1528
+ const zoom = this.entityManager.getEntity(PlaygroundConfigEntity2)?.config?.zoom || 1;
1529
+ const containNodes = allNodes.map((node) => {
1530
+ const { bounds } = node.getData(FlowNodeTransformData3);
1531
+ if (bounds.clone().pad(4 / zoom).contains(pos.x, pos.y)) {
1532
+ return node;
1533
+ }
1534
+ }).filter(Boolean);
1535
+ return containNodes;
1536
+ }
1531
1537
  getNodeIndex(node) {
1532
1538
  const nodeRenderData = node.getData(FlowNodeRenderData2);
1533
1539
  return nodeRenderData.stackIndex;
@@ -1563,7 +1569,7 @@ import {
1563
1569
  injectPlaygroundContext,
1564
1570
  PlaygroundConfigEntity as PlaygroundConfigEntity4,
1565
1571
  PositionData,
1566
- TransformData as TransformData8
1572
+ TransformData as TransformData7
1567
1573
  } from "@flowgram.ai/core";
1568
1574
 
1569
1575
  // src/layout/free-layout.ts
@@ -1577,7 +1583,7 @@ import {
1577
1583
  FlowDocumentProvider,
1578
1584
  FlowNodeTransformData as FlowNodeTransformData4
1579
1585
  } from "@flowgram.ai/document";
1580
- import { PlaygroundConfigEntity as PlaygroundConfigEntity3, TransformData as TransformData7 } from "@flowgram.ai/core";
1586
+ import { PlaygroundConfigEntity as PlaygroundConfigEntity3, TransformData as TransformData6 } from "@flowgram.ai/core";
1581
1587
  var FREE_LAYOUT_KEY = "free-layout";
1582
1588
  var FreeLayout = class {
1583
1589
  constructor() {
@@ -1645,7 +1651,7 @@ var FreeLayout = class {
1645
1651
  */
1646
1652
  getInitScroll(contentSize) {
1647
1653
  const bounds = Rectangle7.enlarge(
1648
- this.document.getAllNodes().map((node) => node.getData(TransformData7).bounds)
1654
+ this.document.getAllNodes().map((node) => node.getData(TransformData6).bounds)
1649
1655
  ).pad(30, 30);
1650
1656
  const viewport = this.playgroundConfig.getViewport(false);
1651
1657
  const zoom = SizeSchema2.fixSize(bounds, viewport);
@@ -1658,13 +1664,13 @@ var FreeLayout = class {
1658
1664
  * 获取默认输入点
1659
1665
  */
1660
1666
  getDefaultInputPoint(node) {
1661
- return node.getData(TransformData7).bounds.leftCenter;
1667
+ return node.getData(TransformData6).bounds.leftCenter;
1662
1668
  }
1663
1669
  /**
1664
1670
  * 获取默认输出点
1665
1671
  */
1666
1672
  getDefaultOutputPoint(node) {
1667
- return node.getData(TransformData7).bounds.rightCenter;
1673
+ return node.getData(TransformData6).bounds.rightCenter;
1668
1674
  }
1669
1675
  /**
1670
1676
  * 水平中心点
@@ -1818,7 +1824,7 @@ var WorkflowDocument = class extends FlowDocument {
1818
1824
  if (!position) {
1819
1825
  position = this.getNodeDefaultPosition(json.type);
1820
1826
  }
1821
- node.getData(TransformData8).update({
1827
+ node.getData(TransformData7).update({
1822
1828
  position
1823
1829
  });
1824
1830
  if (formMeta && formData && !formData.formModel.initialized) {
@@ -1877,7 +1883,7 @@ var WorkflowDocument = class extends FlowDocument {
1877
1883
  );
1878
1884
  }
1879
1885
  if (subCanvas) {
1880
- const canvasTransform = subCanvas.canvasNode.getData(TransformData8);
1886
+ const canvasTransform = subCanvas.canvasNode.getData(TransformData7);
1881
1887
  canvasTransform.update({
1882
1888
  position: subCanvas.parentNode.getNodeMeta()?.canvasPosition
1883
1889
  });
@@ -2346,7 +2352,7 @@ var WorkflowDragService = class {
2346
2352
  }
2347
2353
  let startPosition = this.getNodesPosition(selectedNodes);
2348
2354
  let startPositions = selectedNodes.map((node) => {
2349
- const transform = node.getData(TransformData9);
2355
+ const transform = node.getData(TransformData8);
2350
2356
  return { x: transform.position.x, y: transform.position.y };
2351
2357
  });
2352
2358
  let dragSuccess = false;
@@ -2373,7 +2379,7 @@ var WorkflowDragService = class {
2373
2379
  });
2374
2380
  const positions = [];
2375
2381
  selectedNodes.forEach((node, index) => {
2376
- const transform = node.getData(TransformData9);
2382
+ const transform = node.getData(TransformData8);
2377
2383
  const nodeStartPosition = startPositions[index];
2378
2384
  const newPosition = {
2379
2385
  x: nodeStartPosition.x + offset.x,
@@ -2482,6 +2488,7 @@ var WorkflowDragService = class {
2482
2488
  const dropNode = this._dropNode;
2483
2489
  const { allowDrop } = this.canDropToNode({
2484
2490
  dragNodeType: type,
2491
+ dropNodeType: dropNode?.flowNodeType,
2485
2492
  dropNode
2486
2493
  });
2487
2494
  const dragNode = allowDrop ? await this.dropCard(type, e, data, dropNode) : void 0;
@@ -2506,7 +2513,7 @@ var WorkflowDragService = class {
2506
2513
  /**
2507
2514
  * 如果存在容器节点,且传入鼠标坐标,需要用容器的坐标减去传入的鼠标坐标
2508
2515
  */
2509
- adjustSubNodePosition(subNodeType, containerNode, mousePos, resetEmptyPos = true) {
2516
+ adjustSubNodePosition(subNodeType, containerNode, mousePos) {
2510
2517
  if (!mousePos) {
2511
2518
  return { x: 0, y: 0 };
2512
2519
  }
@@ -2515,16 +2522,16 @@ var WorkflowDragService = class {
2515
2522
  }
2516
2523
  const isParentEmpty = !containerNode.children || containerNode.children.length === 0;
2517
2524
  const parentPadding = this.document.layout.getPadding(containerNode);
2518
- const parentTransform = containerNode.getData(TransformData9);
2519
- if (isParentEmpty && resetEmptyPos) {
2525
+ const containerWorldTransform = containerNode.transform.transform.worldTransform;
2526
+ if (isParentEmpty) {
2520
2527
  return {
2521
2528
  x: 0,
2522
2529
  y: parentPadding.top
2523
2530
  };
2524
2531
  } else {
2525
2532
  return {
2526
- x: mousePos.x - parentTransform.position.x,
2527
- y: mousePos.y - parentTransform.position.y
2533
+ x: mousePos.x - containerWorldTransform.tx,
2534
+ y: mousePos.y - containerWorldTransform.ty
2528
2535
  };
2529
2536
  }
2530
2537
  }
@@ -2541,7 +2548,20 @@ var WorkflowDragService = class {
2541
2548
  * 判断是否可以放置节点
2542
2549
  */
2543
2550
  canDropToNode(params) {
2551
+ const { canDropToNode } = this.document.options;
2544
2552
  const { dragNodeType, dropNode } = params;
2553
+ if (canDropToNode) {
2554
+ const result = canDropToNode(params);
2555
+ if (result) {
2556
+ return {
2557
+ allowDrop: true,
2558
+ dropNode
2559
+ };
2560
+ }
2561
+ return {
2562
+ allowDrop: false
2563
+ };
2564
+ }
2545
2565
  if (!dragNodeType) {
2546
2566
  return {
2547
2567
  allowDrop: false,
@@ -2884,11 +2904,11 @@ import { DisposableCollection as DisposableCollection3, Emitter as Emitter6 } fr
2884
2904
 
2885
2905
  // src/utils/layout-to-positions.ts
2886
2906
  import { FlowNodeTransformData as FlowNodeTransformData7 } from "@flowgram.ai/document";
2887
- import { TransformData as TransformData10, startTween } from "@flowgram.ai/core";
2907
+ import { TransformData as TransformData9, startTween } from "@flowgram.ai/core";
2888
2908
  var layoutToPositions = async (nodes, nodePositionMap) => {
2889
2909
  const newNodePositionMap = {};
2890
2910
  nodes.forEach((node) => {
2891
- const transform = node.getData(TransformData10);
2911
+ const transform = node.getData(TransformData9);
2892
2912
  const nodeTransform = node.getData(FlowNodeTransformData7);
2893
2913
  newNodePositionMap[node.id] = {
2894
2914
  x: transform.position.x,
@@ -2902,7 +2922,7 @@ var layoutToPositions = async (nodes, nodePositionMap) => {
2902
2922
  duration: 300,
2903
2923
  onUpdate: (v) => {
2904
2924
  nodes.forEach((node) => {
2905
- const transform = node.getData(TransformData10);
2925
+ const transform = node.getData(TransformData9);
2906
2926
  const deltaX = (nodePositionMap[node.id].x - transform.position.x) * v.d / 100;
2907
2927
  const deltaY = (nodePositionMap[node.id].y - transform.bounds.height / 2 - transform.position.y) * v.d / 100;
2908
2928
  transform.update({
@@ -2986,7 +3006,7 @@ WorkflowResetLayoutService = __decorateClass([
2986
3006
  import { inject as inject8 } from "inversify";
2987
3007
  import { Emitter as Emitter7 } from "@flowgram.ai/utils";
2988
3008
  import { FlowOperationBaseServiceImpl } from "@flowgram.ai/document";
2989
- import { TransformData as TransformData11 } from "@flowgram.ai/core";
3009
+ import { TransformData as TransformData10 } from "@flowgram.ai/core";
2990
3010
  var WorkflowOperationBaseServiceImpl = class extends FlowOperationBaseServiceImpl {
2991
3011
  constructor() {
2992
3012
  super(...arguments);
@@ -2998,7 +3018,7 @@ var WorkflowOperationBaseServiceImpl = class extends FlowOperationBaseServiceImp
2998
3018
  if (!node) {
2999
3019
  return;
3000
3020
  }
3001
- const transformData = node.getData(TransformData11);
3021
+ const transformData = node.getData(TransformData10);
3002
3022
  const oldPosition = {
3003
3023
  x: transformData.position.x,
3004
3024
  y: transformData.position.y