@flowgram.ai/free-layout-core 0.1.0-alpha.17 → 0.1.0-alpha.19

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 (32) hide show
  1. package/dist/esm/{chunk-O4WKIIW2.js → chunk-3UW6BHP2.js} +1 -1
  2. package/dist/esm/chunk-3UW6BHP2.js.map +1 -0
  3. package/dist/esm/index.js +161 -55
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/typings/index.js +1 -1
  6. package/dist/esm/typings/workflow-operation.js +1 -1
  7. package/dist/index.d.mts +7 -5
  8. package/dist/index.d.ts +7 -5
  9. package/dist/index.js +159 -50
  10. package/dist/index.js.map +1 -1
  11. package/dist/typings/index.d.mts +1 -1
  12. package/dist/typings/index.d.ts +1 -1
  13. package/dist/typings/index.js.map +1 -1
  14. package/dist/typings/workflow-drag.d.mts +1 -1
  15. package/dist/typings/workflow-drag.d.ts +1 -1
  16. package/dist/typings/workflow-json.d.mts +1 -1
  17. package/dist/typings/workflow-json.d.ts +1 -1
  18. package/dist/typings/workflow-line.d.mts +1 -1
  19. package/dist/typings/workflow-line.d.ts +1 -1
  20. package/dist/typings/workflow-node.d.mts +1 -1
  21. package/dist/typings/workflow-node.d.ts +1 -1
  22. package/dist/typings/workflow-operation.d.mts +9 -0
  23. package/dist/typings/workflow-operation.d.ts +9 -0
  24. package/dist/typings/workflow-operation.js.map +1 -1
  25. package/dist/typings/workflow-registry.d.mts +1 -1
  26. package/dist/typings/workflow-registry.d.ts +1 -1
  27. package/dist/typings/workflow-sub-canvas.d.mts +1 -1
  28. package/dist/typings/workflow-sub-canvas.d.ts +1 -1
  29. package/dist/{workflow-node-entity-B-9mEm2k.d.mts → workflow-node-entity-DH5qlw7I.d.mts} +41 -7
  30. package/dist/{workflow-node-entity-DvBGZ5Ve.d.ts → workflow-node-entity-DWVtlA2a.d.ts} +41 -7
  31. package/package.json +9 -9
  32. package/dist/esm/chunk-O4WKIIW2.js.map +0 -1
@@ -4,4 +4,4 @@ var WorkflowOperationBaseService = Symbol("WorkflowOperationBaseService");
4
4
  export {
5
5
  WorkflowOperationBaseService
6
6
  };
7
- //# sourceMappingURL=chunk-O4WKIIW2.js.map
7
+ //# sourceMappingURL=chunk-3UW6BHP2.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\nimport { WorkflowJSON } from './workflow-json';\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 /**\n * 更新节点与线条\n */\n fromJSON(json: WorkflowJSON): void;\n}\n\nexport const WorkflowOperationBaseService = Symbol('WorkflowOperationBaseService');\n"],"mappings":";AAuCO,IAAM,+BAA+B,OAAO,8BAA8B;","names":[]}
package/dist/esm/index.js CHANGED
@@ -15,7 +15,7 @@ import {
15
15
  import "./chunk-DDJTYHXN.js";
16
16
  import {
17
17
  WorkflowOperationBaseService
18
- } from "./chunk-O4WKIIW2.js";
18
+ } from "./chunk-3UW6BHP2.js";
19
19
  import {
20
20
  __decorateClass
21
21
  } from "./chunk-EUXUH3YW.js";
@@ -183,6 +183,27 @@ import {
183
183
  PlaygroundConfigEntity,
184
184
  TransformData as TransformData3
185
185
  } from "@flowgram.ai/core";
186
+
187
+ // src/utils/location-config-to-point.ts
188
+ function locationConfigToPoint(bounds, config, _offset = { x: 0, y: 0 }) {
189
+ const offset = { ..._offset };
190
+ if (config.left !== void 0) {
191
+ offset.x += typeof config.left === "string" ? parseFloat(config.left) * 0.01 * bounds.width : config.left;
192
+ } else if (config.right !== void 0) {
193
+ offset.x += bounds.width - (typeof config.right === "string" ? parseFloat(config.right) * 0.01 * bounds.width : config.right);
194
+ }
195
+ if (config.top !== void 0) {
196
+ offset.y += typeof config.top === "string" ? parseFloat(config.top) * 0.01 * bounds.height : config.top;
197
+ } else if (config.bottom !== void 0) {
198
+ offset.y += bounds.height - (typeof config.bottom === "string" ? parseFloat(config.bottom) * 0.01 * bounds.height : config.bottom);
199
+ }
200
+ return {
201
+ x: bounds.x + offset.x,
202
+ y: bounds.y + offset.y
203
+ };
204
+ }
205
+
206
+ // src/entities/workflow-port-entity.ts
186
207
  var PORT_SIZE = 24;
187
208
  var WorkflowPortEntity = class extends Entity {
188
209
  constructor(opts) {
@@ -195,6 +216,7 @@ var WorkflowPortEntity = class extends Entity {
195
216
  this.portType = opts.type;
196
217
  this._disabled = opts.disabled;
197
218
  this._offset = opts.offset;
219
+ this._locationConfig = opts.locationConfig;
198
220
  this._location = opts.location;
199
221
  this._size = opts.size;
200
222
  this.node = opts.node;
@@ -242,7 +264,7 @@ var WorkflowPortEntity = class extends Entity {
242
264
  return "right";
243
265
  }
244
266
  get point() {
245
- const { targetElement } = this;
267
+ const { targetElement, _locationConfig } = this;
246
268
  const { bounds } = this.node.getData(FlowNodeTransformData);
247
269
  const location2 = this.location;
248
270
  if (targetElement) {
@@ -257,8 +279,14 @@ var WorkflowPortEntity = class extends Entity {
257
279
  location: location2
258
280
  };
259
281
  }
260
- let point = { x: 0, y: 0 };
282
+ if (_locationConfig) {
283
+ return {
284
+ ...locationConfigToPoint(bounds, _locationConfig, this._offset),
285
+ location: location2
286
+ };
287
+ }
261
288
  const offset = this._offset || { x: 0, y: 0 };
289
+ let point = { x: 0, y: 0 };
262
290
  switch (location2) {
263
291
  case "left":
264
292
  point = bounds.leftCenter;
@@ -371,6 +399,10 @@ var WorkflowPortEntity = class extends Entity {
371
399
  this._offset = data.offset;
372
400
  changed = true;
373
401
  }
402
+ if (Compare.isChanged(data.locationConfig, this._locationConfig)) {
403
+ this._locationConfig = data.locationConfig;
404
+ changed = true;
405
+ }
374
406
  if (Compare.isChanged(data.size, this._size)) {
375
407
  this._size = data.size;
376
408
  changed = true;
@@ -1391,10 +1423,7 @@ import {
1391
1423
  delay as delay2,
1392
1424
  Point
1393
1425
  } from "@flowgram.ai/utils";
1394
- import {
1395
- FlowNodeTransformData as FlowNodeTransformData6,
1396
- FlowOperationBaseService
1397
- } from "@flowgram.ai/document";
1426
+ import { FlowNodeTransformData as FlowNodeTransformData6 } from "@flowgram.ai/document";
1398
1427
  import { FlowNodeBaseType as FlowNodeBaseType3 } from "@flowgram.ai/document";
1399
1428
  import {
1400
1429
  CommandService,
@@ -1449,10 +1478,11 @@ function initFormDataFromJSON(node, json, isFirstCreate) {
1449
1478
  // src/workflow-document-option.ts
1450
1479
  var WorkflowDocumentOptions = Symbol("WorkflowDocumentOptions");
1451
1480
  var WorkflowDocumentOptionsDefault = {
1452
- cursors: {
1453
- grab: 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMC40ODczIDIuNjIzNzhDOS45MDczMSAyLjYyMzc4IDkuNDM3MTMgMy4wOTM5NiA5LjQzNzEzIDMuNjczOTZWNS4xNDM3NkM5LjM5NDI4IDQuNDAyNzQgOC43Nzk3OCAzLjgxNTA0IDguMDI4MDIgMy44MTUwNEM3LjI0ODQ4IDMuODE1MDQgNi42MTY1MyA0LjQ0Njk5IDYuNjE2NTMgNS4yMjY1M1YxMS44Mjg5TDUuNjc0MTggMTEuMDA0OUM1LjE1NDg3IDEwLjU1MDkgNC40MDk1IDEwLjQ2MzYgMy43OTkzOCAxMC43ODU1TDMuNjk2OTQgMTAuODM5NkMzLjA2MjE3IDExLjE3NDUgMi45MjI2IDEyLjAyMjggMy40MTY2MiAxMi41NDM0TDcuMzM5NTkgMTYuNjc3NVYxNy4zMjU5QzcuMzM5NTkgMTcuNzg2MiA3LjcxMjY5IDE4LjE1OTMgOC4xNzI5MiAxOC4xNTkzSDEzLjgwODRDMTQuMjY4NyAxOC4xNTkzIDE0LjY0MTcgMTcuNzg2MiAxNC42NDE3IDE3LjMyNTlWMTYuNzkzNUMxNS44MDk0IDE1LjY0ODUgMTYuNDY3MyAxNC4wODE5IDE2LjQ2NzMgMTIuNDQ2NVYxMS40OTY3TDE2LjQ2NzEgNi42MzY4NUMxNi40NjcxIDUuOTU2MyAxNS45MTU0IDUuNDA0NjEgMTUuMjM0OCA1LjQwNDYxQzE0LjU1NDMgNS40MDQ2MSAxNC4wMDI2IDUuOTU2MyAxNC4wMDI2IDYuNjM2ODVMMTQuMDAyMSA1LjA0NzI4QzE0LjAwMjEgNC4zNjY3MyAxMy40NTA0IDMuODE1MDQgMTIuNzY5OCAzLjgxNTA0QzEyLjA4OTMgMy44MTUwNCAxMS41Mzc2IDQuMzY2NzMgMTEuNTM3NiA1LjA0NzI4TDExLjUzNzUgMy42NzM5NUMxMS41Mzc1IDMuMDkzOTYgMTEuMDY3MyAyLjYyMzc4IDEwLjQ4NzMgMi42MjM3OFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3NCAxLjM3NDAyQzExLjM2MTIgMS4zNzQwMiAxMi4xMjExIDEuODYxMTggMTIuNTEwNSAyLjU3ODY4QzEyLjU5NTggMi41Njk4MyAxMi42ODIzIDIuNTY1MjggMTIuNzcgMi41NjUyOEMxMy44Mjc4IDIuNTY1MjggMTQuNzMxMSAzLjIyNzAxIDE1LjA4ODUgNC4xNTkxMUMxNS4xMzcgNC4xNTYyOSAxNS4xODU4IDQuMTU0ODYgMTUuMjM1IDQuMTU0ODZDMTYuNjA1OSA0LjE1NDg2IDE3LjcxNzIgNS4yNjYxOSAxNy43MTcyIDYuNjM3MDlMMTcuNzE3NCAxMi40NDY3QzE3LjcxNzQgMTQuMjM1NSAxNy4wNjQ0IDE1Ljk1NTkgMTUuODkxOSAxNy4yOTA0VjE3LjMyNjJDMTUuODkxOSAxOC40NzY4IDE0Ljk1OTEgMTkuNDA5NSAxMy44MDg1IDE5LjQwOTVIOC4xNzMwNkM3LjAyMjQ3IDE5LjQwOTUgNi4wODk3MyAxOC40NzY4IDYuMDg5NzMgMTcuMzI2MlYxNy4xNzY0TDIuNTEwMDMgMTMuNDA0MUMxLjQ0NTk5IDEyLjI4MjggMS43NDY2IDEwLjQ1NTUgMy4xMTM3OSA5LjczNDI0TDMuMjE2MjQgOS42ODAxOUMzLjg5MTY4IDkuMzIzODMgNC42NjE4NSA5LjI1NDAxIDUuMzY2NjYgOS40NTE5OFY1LjIyNjc4QzUuMzY2NjYgMy43NTY4NyA2LjU1ODI2IDIuNTY1MjggOC4wMjgxNiAyLjU2NTI4QzguMTcyOTMgMi41NjUyOCA4LjMxNDk5IDIuNTc2ODQgOC40NTM0NyAyLjU5OTA3QzguODM5NDMgMS44NzA0MiA5LjYwNTQ2IDEuMzc0MDIgMTAuNDg3NCAxLjM3NDAyWk0xMi40NDc2IDMuODU3ODdWOS40NzY0NkMxMi40NDc2IDkuNzI4NTIgMTIuMjQzMyA5LjkzMjg1IDExLjk5MTMgOS45MzI4NUMxMS43MzkyIDkuOTMyODUgMTEuNTM0OSA5LjcyODUyIDExLjUzNDkgOS40NzY0NlYzLjc5NjU1QzExLjUzNDkgMy43Nzk1NiAxMS41MzU4IDMuNzYyNzcgMTEuNTM3NiAzLjc0NjI2VjMuNjc0MkMxMS41Mzc2IDMuNDMyODIgMTEuNDU2MiAzLjIxMDQ2IDExLjMxOTMgMy4wMzMwOUMxMS4xMjcyIDIuNzg0MjggMTAuODI2MSAyLjYyNDAyIDEwLjQ4NzQgMi42MjQwMkMxMC4xMjM4IDIuNjI0MDIgOS44MDMzMiAyLjgwODg2IDkuNjE0ODMgMy4wODk3QzkuNTAyNjkgMy4yNTY3OSA5LjQzNzI2IDMuNDU3ODUgOS40MzcyNiAzLjY3NDJWMy43ODU3M0M5LjQzNzM1IDMuNzg5MzMgOS40MzczOSAzLjc5Mjk0IDkuNDM3MzkgMy43OTY1NVY5LjkwMTdDOS40MzczOSAxMC4xNTM3IDkuMjMzMDYgMTAuMzU4MSA4Ljk4MTAxIDEwLjM1ODFDOC43Mjg5NSAxMC4zNTgxIDguNTI0NjIgMTAuMTUzNyA4LjUyNDYyIDkuOTAxN1YzLjkwNTA3QzguNDE3NzMgMy44NjQ5IDguMzA0NjggMy44MzczMiA4LjE4NzI2IDMuODI0MTVDOC4xMzUwNCAzLjgxODI5IDguMDgxOTUgMy44MTUyOCA4LjAyODE2IDMuODE1MjhDNy4yNDg2MSAzLjgxNTI4IDYuNjE2NjYgNC40NDcyMyA2LjYxNjY2IDUuMjI2NzhWMTEuODI5Mkw1LjY3NDMxIDExLjAwNTJDNS41Nzg2OCAxMC45MjE2IDUuNDc1MzcgMTAuODUwNCA1LjM2NjY2IDEwLjc5MTlDNC44ODUwNiAxMC41MzI5IDQuMjk3MjggMTAuNTIzMSAzLjc5OTUyIDEwLjc4NThMMy42OTcwNyAxMC44Mzk4QzMuMDYyMzEgMTEuMTc0NyAyLjkyMjczIDEyLjAyMzEgMy40MTY3NSAxMi41NDM3TDcuMzM5NzMgMTYuNjc3N1YxNy4zMjYyQzcuMzM5NzMgMTcuNzg2NCA3LjcxMjgyIDE4LjE1OTUgOC4xNzMwNiAxOC4xNTk1SDEzLjgwODVDMTQuMjY4OCAxOC4xNTk1IDE0LjY0MTkgMTcuNzg2NCAxNC42NDE5IDE3LjMyNjJWMTYuNzkzOEMxNS43Mzc5IDE1LjcxOSAxNi4zODQ3IDE0LjI3MjggMTYuNDYgMTIuNzQ3QzE2LjQ2NDEgMTIuNjY0MSAxNi40NjY1IDEyLjU4MDkgMTYuNDY3MiAxMi40OTc1TDE2LjQ2NzQgMTIuNDQ2N0wxNi40NjcyIDYuNjM3MDlDMTYuNDY3MiA1Ljk2MjMgMTUuOTI0OCA1LjQxNDE5IDE1LjI1MjIgNS40MDQ5N0wxNS4yMzUgNS40MDQ4NkMxNS4xMjQ2IDUuNDA0ODYgMTUuMDE3NyA1LjQxOTM2IDE0LjkxNTkgNS40NDY1NlY5LjYwMjI2QzE0LjkxNTkgOS44NTQzMSAxNC43MTE2IDEwLjA1ODYgMTQuNDU5NSAxMC4wNTg2QzE0LjIwNzUgMTAuMDU4NiAxNC4wMDMxIDkuODU0MzEgMTQuMDAzMSA5LjYwMjI2VjYuNjA1MTRDMTQuMDAyOSA2LjYxNTc2IDE0LjAwMjcgNi42MjY0MSAxNC4wMDI3IDYuNjM3MDlWOS4yNzcwNUwxNC4wMDIyIDUuMDQ3NTJDMTQuMDAyMiA0Ljg2OTEzIDEzLjk2NDMgNC42OTk2IDEzLjg5NjEgNC41NDY1M0MxMy43MDY0IDQuMTIwNzIgMTMuMjgyMiAzLjgyMjM1IDEyLjc4NzYgMy44MTU0MUwxMi43NyAzLjgxNTI4QzEyLjY1ODQgMy44MTUyOCAxMi41NTA0IDMuODMwMSAxMi40NDc2IDMuODU3ODdaIiBmaWxsPSIjMUQxQzIzIi8+Cjwvc3ZnPg=="), auto',
1454
- grabbing: 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02LjYxODE3IDUuNTk4NzVDNi42MTgxNyA0LjgxOTIgNy4yNTAxMiA0LjE4NzI2IDguMDI5NjcgNC4xODcyNkM4Ljc3ODczIDQuMTg3MjYgOS4zOTE1MiA0Ljc3MDc1IDkuNDM4MjkgNS41MDgwMUM5LjQ1OTkyIDQuOTQ3MSA5LjkyMTQ3IDQuNDk5MDIgMTAuNDg3NyA0LjQ5OTAyQzExLjA2NzcgNC40OTkwMiAxMS41Mzc4IDQuOTY5MiAxMS41Mzc4IDUuNTQ5MTlWOC43NjI0NkwxMS41Mzc5IDYuNzExNUMxMS41Mzc5IDYuMDMwOTUgMTIuMDg5NiA1LjQ3OTI2IDEyLjc3MDIgNS40NzkyNkMxMy40NTA3IDUuNDc5MjYgMTQuMDAyNCA2LjAzMDk1IDE0LjAwMjQgNi43MTE1TDE0LjAwMjQgOC43NjI0NkwxNC4wMDI5IDguMDE5ODNDMTQuMDAyOSA3LjMzOTI5IDE0LjU1NDYgNi43ODc1OSAxNS4yMzUyIDYuNzg3NTlDMTUuOTE1NyA2Ljc4NzU5IDE2LjQ2NzQgNy4zMzkyOCAxNi40Njc0IDguMDE5ODNWMTEuNDk3TDE2LjQ2NzUgMTIuNDQ2N0MxNi40Njc1IDE0LjA4MjEgMTUuODA5NiAxNS42NDg3IDE0LjY0MiAxNi43OTM4VjE3LjMyNjJDMTQuNjQyIDE3Ljc4NjQgMTQuMjY4OSAxOC4xNTk1IDEzLjgwODcgMTguMTU5NUg4LjE3MzE3QzcuNzEyOTMgMTguMTU5NSA3LjMzOTg0IDE3Ljc4NjQgNy4zMzk4NCAxNy4zMjYyVjE1Ljk0MjRMNS4zNDU2MiAxNC43NTM0QzQuNTg5MjQgMTQuMzAyNCA0LjEyNTkxIDEzLjQ4NjcgNC4xMjU4OSAxMi42MDYxTDQuMTI1ODMgOS4yODM4M0M0LjEyNTgyIDguOTU0MjcgNC4zMjAwMyA4LjY1NTY2IDQuNjIxMjkgOC41MjIwNUw2LjYxODE3IDcuNjM2MzRWNS41OTg3NVoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3OCAzLjI0OTAyQzExLjI3OTYgMy4yNDkwMiAxMS45Nzc4IDMuNjQ5MDIgMTIuMzkxNyA0LjI1Nzk2QzEyLjUxNTEgNC4yMzkwNiAxMi42NDE2IDQuMjI5MjYgMTIuNzcwMyA0LjIyOTI2QzEzLjcyMjQgNC4yMjkyNiAxNC41NDkzIDQuNzY1MzEgMTQuOTY1NyA1LjU1MjA3QzE1LjA1NDMgNS41NDI1IDE1LjE0NDIgNS41Mzc1OSAxNS4yMzUzIDUuNTM3NTlDMTYuNjA2MiA1LjUzNzU5IDE3LjcxNzYgNi42NDg5MyAxNy43MTc2IDguMDE5ODNMMTcuNzE3NyAxMi40NDY3QzE3LjcxNzcgMTQuMjM1NSAxNy4wNjQ3IDE1Ljk1NTkgMTUuODkyMSAxNy4yOTA0VjE3LjMyNjJDMTUuODkyMSAxOC40NzY4IDE0Ljk1OTQgMTkuNDA5NSAxMy44MDg4IDE5LjQwOTVIOC4xNzMzMkM3LjAyMjczIDE5LjQwOTUgNi4wODk5OCAxOC40NzY4IDYuMDg5OTggMTcuMzI2MlYxNi42NTI0TDQuNzA1NjMgMTUuODI3QzMuNTcxMDYgMTUuMTUwNSAyLjg3NjA3IDEzLjkyNzEgMi44NzYwNCAxMi42MDYxTDIuODc1OTggOS4yODM4NUMyLjg3NTk2IDguNDU5OTYgMy4zNjE0OSA3LjcxMzQ1IDQuMTE0NjIgNy4zNzk0TDUuMzY4MzIgNi44MjMzM1Y1LjU5ODc1QzUuMzY4MzIgNC4xMjg4NSA2LjU1OTkxIDIuOTM3MjYgOC4wMjk4MiAyLjkzNzI2QzguNjA4MzEgMi45MzcyNiA5LjE0MzU1IDMuMTIxNyA5LjU4MDA1IDMuNDM1MDVDOS44NTg1MyAzLjMxNTMyIDEwLjE2NTQgMy4yNDkwMiAxMC40ODc4IDMuMjQ5MDJaTTEyLjQ0NzkgNS41MjE4NlY5LjQ3NTU3QzEyLjQ0NzkgOS43Mjc2MiAxMi4yNDM2IDkuOTMxOTUgMTEuOTkxNiA5LjkzMTk1QzExLjc1NjggOS45MzE5NSAxMS41NjM0IDkuNzU0NjUgMTEuNTM4IDkuNTI2NjNDMTEuNTM2MSA5LjUwOTg3IDExLjUzNTIgOS40OTI4MyAxMS41MzUyIDkuNDc1NTdWNS40NzE1OEMxMS41MTU0IDUuMjAwODMgMTEuMzkzIDQuOTU4NTggMTEuMjA2NiA0Ljc4MzU4QzExLjAxODggNC42MDcxMSAxMC43NjU5IDQuNDk5MDIgMTAuNDg3OCA0LjQ5OTAyQzEwLjQ3NjYgNC40OTkwMiAxMC40NjU0IDQuNDk5MTkgMTAuNDU0MiA0LjQ5OTU0QzkuOTAzNDcgNC41MTY4NCA5LjQ1OTY0IDQuOTU4MjQgOS40Mzg0NCA1LjUwODAxQzkuNDM4MiA1LjUwNDMgOS40Mzc5NSA1LjUwMDU4IDkuNDM3NjkgNS40OTY4OFY5LjkwMjQzQzkuNDM3NjkgMTAuMTU0NSA5LjIzMzM2IDEwLjM1ODggOC45ODEzMSAxMC4zNTg4QzguNzI5MjUgMTAuMzU4OCA4LjUyNDkyIDEwLjE1NDUgOC41MjQ5MiA5LjkwMjQzVjQuMjc2NTNDOC4zNzA4NiA0LjIxODgyIDguMjA0MDIgNC4xODcyNiA4LjAyOTgyIDQuMTg3MjZDNy4yNTAyNyA0LjE4NzI2IDYuNjE4MzIgNC44MTkyIDYuNjE4MzIgNS41OTg3NUw2LjYxODI3IDkuOTc1OTlDNi42MTgyNyAxMC4yMjggNi40MTM5NCAxMC40MzI0IDYuMTYxODkgMTAuNDMyNEM1LjkwOTgzIDEwLjQzMjQgNS43MDU1IDEwLjIyOCA1LjcwNTUgOS45NzU5OVY4LjA0MTIyTDQuNjIxNDQgOC41MjIwNUM0LjMyMDE4IDguNjU1NjYgNC4xMjU5NyA4Ljk1NDI3IDQuMTI1OTggOS4yODM4M0w0LjEyNjA0IDEyLjYwNjFDNC4xMjYwNiAxMy40ODY3IDQuNTg5MzkgMTQuMzAyNCA1LjM0NTc2IDE0Ljc1MzRMNy4zMzk5OCAxNS45NDI0VjE3LjMyNjJDNy4zMzk5OCAxNy43ODY0IDcuNzEzMDggMTguMTU5NSA4LjE3MzMyIDE4LjE1OTVIMTMuODA4OEMxNC4yNjkgMTguMTU5NSAxNC42NDIxIDE3Ljc4NjQgMTQuNjQyMSAxNy4zMjYyVjE2Ljc5MzhDMTUuNzM4MSAxNS43MTkgMTYuMzg1IDE0LjI3MjggMTYuNDYwMyAxMi43NDdDMTYuNDY0NiAxMi42NiAxNi40NjcgMTIuNTcyOCAxNi40Njc2IDEyLjQ4NTRMMTYuNDY3NyAxMi40NDY3TDE2LjQ2NzYgOC4wMTk4M0MxNi40Njc2IDcuMzQ1MDQgMTUuOTI1MiA2Ljc5NjkzIDE1LjI1MjUgNi43ODc3MUwxNS4yMzUzIDYuNzg3NTlDMTUuMTI1IDYuNzg3NTkgMTUuMDE4IDYuODAyMSAxNC45MTYyIDYuODI5MzFWOS42MDEzNkMxNC45MTYyIDkuODUzNDIgMTQuNzExOSAxMC4wNTc3IDE0LjQ1OTggMTAuMDU3N0MxNC4yMDc4IDEwLjA1NzcgMTQuMDAzNCA5Ljg1MzQxIDE0LjAwMzQgOS42MDEzNlY3Ljk4OTg1QzE0LjAwMzIgNy45OTk4MiAxNC4wMDMxIDguMDA5ODEgMTQuMDAzMSA4LjAxOTgzTDE0LjAwMzQgOS42MDEzNkwxNC4wMDI1IDYuNzExNUMxNC4wMDI1IDYuNDQ5NzQgMTMuOTIwOSA2LjIwNzA1IDEzLjc4MTggNi4wMDc0OEMxMy41NjIgNS42OTI0MiAxMy4xOTg5IDUuNDg0ODMgMTIuNzg3IDUuNDc5MzdMMTIuNzcwMyA1LjQ3OTI2QzEyLjY1ODggNS40NzkyNiAxMi41NTA3IDUuNDk0MDggMTIuNDQ3OSA1LjUyMTg2WiIgZmlsbD0iIzFEMUMyMyIvPgo8L3N2Zz4="), auto'
1455
- },
1481
+ // cursors: {
1482
+ // grab: 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMC40ODczIDIuNjIzNzhDOS45MDczMSAyLjYyMzc4IDkuNDM3MTMgMy4wOTM5NiA5LjQzNzEzIDMuNjczOTZWNS4xNDM3NkM5LjM5NDI4IDQuNDAyNzQgOC43Nzk3OCAzLjgxNTA0IDguMDI4MDIgMy44MTUwNEM3LjI0ODQ4IDMuODE1MDQgNi42MTY1MyA0LjQ0Njk5IDYuNjE2NTMgNS4yMjY1M1YxMS44Mjg5TDUuNjc0MTggMTEuMDA0OUM1LjE1NDg3IDEwLjU1MDkgNC40MDk1IDEwLjQ2MzYgMy43OTkzOCAxMC43ODU1TDMuNjk2OTQgMTAuODM5NkMzLjA2MjE3IDExLjE3NDUgMi45MjI2IDEyLjAyMjggMy40MTY2MiAxMi41NDM0TDcuMzM5NTkgMTYuNjc3NVYxNy4zMjU5QzcuMzM5NTkgMTcuNzg2MiA3LjcxMjY5IDE4LjE1OTMgOC4xNzI5MiAxOC4xNTkzSDEzLjgwODRDMTQuMjY4NyAxOC4xNTkzIDE0LjY0MTcgMTcuNzg2MiAxNC42NDE3IDE3LjMyNTlWMTYuNzkzNUMxNS44MDk0IDE1LjY0ODUgMTYuNDY3MyAxNC4wODE5IDE2LjQ2NzMgMTIuNDQ2NVYxMS40OTY3TDE2LjQ2NzEgNi42MzY4NUMxNi40NjcxIDUuOTU2MyAxNS45MTU0IDUuNDA0NjEgMTUuMjM0OCA1LjQwNDYxQzE0LjU1NDMgNS40MDQ2MSAxNC4wMDI2IDUuOTU2MyAxNC4wMDI2IDYuNjM2ODVMMTQuMDAyMSA1LjA0NzI4QzE0LjAwMjEgNC4zNjY3MyAxMy40NTA0IDMuODE1MDQgMTIuNzY5OCAzLjgxNTA0QzEyLjA4OTMgMy44MTUwNCAxMS41Mzc2IDQuMzY2NzMgMTEuNTM3NiA1LjA0NzI4TDExLjUzNzUgMy42NzM5NUMxMS41Mzc1IDMuMDkzOTYgMTEuMDY3MyAyLjYyMzc4IDEwLjQ4NzMgMi42MjM3OFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3NCAxLjM3NDAyQzExLjM2MTIgMS4zNzQwMiAxMi4xMjExIDEuODYxMTggMTIuNTEwNSAyLjU3ODY4QzEyLjU5NTggMi41Njk4MyAxMi42ODIzIDIuNTY1MjggMTIuNzcgMi41NjUyOEMxMy44Mjc4IDIuNTY1MjggMTQuNzMxMSAzLjIyNzAxIDE1LjA4ODUgNC4xNTkxMUMxNS4xMzcgNC4xNTYyOSAxNS4xODU4IDQuMTU0ODYgMTUuMjM1IDQuMTU0ODZDMTYuNjA1OSA0LjE1NDg2IDE3LjcxNzIgNS4yNjYxOSAxNy43MTcyIDYuNjM3MDlMMTcuNzE3NCAxMi40NDY3QzE3LjcxNzQgMTQuMjM1NSAxNy4wNjQ0IDE1Ljk1NTkgMTUuODkxOSAxNy4yOTA0VjE3LjMyNjJDMTUuODkxOSAxOC40NzY4IDE0Ljk1OTEgMTkuNDA5NSAxMy44MDg1IDE5LjQwOTVIOC4xNzMwNkM3LjAyMjQ3IDE5LjQwOTUgNi4wODk3MyAxOC40NzY4IDYuMDg5NzMgMTcuMzI2MlYxNy4xNzY0TDIuNTEwMDMgMTMuNDA0MUMxLjQ0NTk5IDEyLjI4MjggMS43NDY2IDEwLjQ1NTUgMy4xMTM3OSA5LjczNDI0TDMuMjE2MjQgOS42ODAxOUMzLjg5MTY4IDkuMzIzODMgNC42NjE4NSA5LjI1NDAxIDUuMzY2NjYgOS40NTE5OFY1LjIyNjc4QzUuMzY2NjYgMy43NTY4NyA2LjU1ODI2IDIuNTY1MjggOC4wMjgxNiAyLjU2NTI4QzguMTcyOTMgMi41NjUyOCA4LjMxNDk5IDIuNTc2ODQgOC40NTM0NyAyLjU5OTA3QzguODM5NDMgMS44NzA0MiA5LjYwNTQ2IDEuMzc0MDIgMTAuNDg3NCAxLjM3NDAyWk0xMi40NDc2IDMuODU3ODdWOS40NzY0NkMxMi40NDc2IDkuNzI4NTIgMTIuMjQzMyA5LjkzMjg1IDExLjk5MTMgOS45MzI4NUMxMS43MzkyIDkuOTMyODUgMTEuNTM0OSA5LjcyODUyIDExLjUzNDkgOS40NzY0NlYzLjc5NjU1QzExLjUzNDkgMy43Nzk1NiAxMS41MzU4IDMuNzYyNzcgMTEuNTM3NiAzLjc0NjI2VjMuNjc0MkMxMS41Mzc2IDMuNDMyODIgMTEuNDU2MiAzLjIxMDQ2IDExLjMxOTMgMy4wMzMwOUMxMS4xMjcyIDIuNzg0MjggMTAuODI2MSAyLjYyNDAyIDEwLjQ4NzQgMi42MjQwMkMxMC4xMjM4IDIuNjI0MDIgOS44MDMzMiAyLjgwODg2IDkuNjE0ODMgMy4wODk3QzkuNTAyNjkgMy4yNTY3OSA5LjQzNzI2IDMuNDU3ODUgOS40MzcyNiAzLjY3NDJWMy43ODU3M0M5LjQzNzM1IDMuNzg5MzMgOS40MzczOSAzLjc5Mjk0IDkuNDM3MzkgMy43OTY1NVY5LjkwMTdDOS40MzczOSAxMC4xNTM3IDkuMjMzMDYgMTAuMzU4MSA4Ljk4MTAxIDEwLjM1ODFDOC43Mjg5NSAxMC4zNTgxIDguNTI0NjIgMTAuMTUzNyA4LjUyNDYyIDkuOTAxN1YzLjkwNTA3QzguNDE3NzMgMy44NjQ5IDguMzA0NjggMy44MzczMiA4LjE4NzI2IDMuODI0MTVDOC4xMzUwNCAzLjgxODI5IDguMDgxOTUgMy44MTUyOCA4LjAyODE2IDMuODE1MjhDNy4yNDg2MSAzLjgxNTI4IDYuNjE2NjYgNC40NDcyMyA2LjYxNjY2IDUuMjI2NzhWMTEuODI5Mkw1LjY3NDMxIDExLjAwNTJDNS41Nzg2OCAxMC45MjE2IDUuNDc1MzcgMTAuODUwNCA1LjM2NjY2IDEwLjc5MTlDNC44ODUwNiAxMC41MzI5IDQuMjk3MjggMTAuNTIzMSAzLjc5OTUyIDEwLjc4NThMMy42OTcwNyAxMC44Mzk4QzMuMDYyMzEgMTEuMTc0NyAyLjkyMjczIDEyLjAyMzEgMy40MTY3NSAxMi41NDM3TDcuMzM5NzMgMTYuNjc3N1YxNy4zMjYyQzcuMzM5NzMgMTcuNzg2NCA3LjcxMjgyIDE4LjE1OTUgOC4xNzMwNiAxOC4xNTk1SDEzLjgwODVDMTQuMjY4OCAxOC4xNTk1IDE0LjY0MTkgMTcuNzg2NCAxNC42NDE5IDE3LjMyNjJWMTYuNzkzOEMxNS43Mzc5IDE1LjcxOSAxNi4zODQ3IDE0LjI3MjggMTYuNDYgMTIuNzQ3QzE2LjQ2NDEgMTIuNjY0MSAxNi40NjY1IDEyLjU4MDkgMTYuNDY3MiAxMi40OTc1TDE2LjQ2NzQgMTIuNDQ2N0wxNi40NjcyIDYuNjM3MDlDMTYuNDY3MiA1Ljk2MjMgMTUuOTI0OCA1LjQxNDE5IDE1LjI1MjIgNS40MDQ5N0wxNS4yMzUgNS40MDQ4NkMxNS4xMjQ2IDUuNDA0ODYgMTUuMDE3NyA1LjQxOTM2IDE0LjkxNTkgNS40NDY1NlY5LjYwMjI2QzE0LjkxNTkgOS44NTQzMSAxNC43MTE2IDEwLjA1ODYgMTQuNDU5NSAxMC4wNTg2QzE0LjIwNzUgMTAuMDU4NiAxNC4wMDMxIDkuODU0MzEgMTQuMDAzMSA5LjYwMjI2VjYuNjA1MTRDMTQuMDAyOSA2LjYxNTc2IDE0LjAwMjcgNi42MjY0MSAxNC4wMDI3IDYuNjM3MDlWOS4yNzcwNUwxNC4wMDIyIDUuMDQ3NTJDMTQuMDAyMiA0Ljg2OTEzIDEzLjk2NDMgNC42OTk2IDEzLjg5NjEgNC41NDY1M0MxMy43MDY0IDQuMTIwNzIgMTMuMjgyMiAzLjgyMjM1IDEyLjc4NzYgMy44MTU0MUwxMi43NyAzLjgxNTI4QzEyLjY1ODQgMy44MTUyOCAxMi41NTA0IDMuODMwMSAxMi40NDc2IDMuODU3ODdaIiBmaWxsPSIjMUQxQzIzIi8+Cjwvc3ZnPg=="), auto',
1483
+ // grabbing:
1484
+ // 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02LjYxODE3IDUuNTk4NzVDNi42MTgxNyA0LjgxOTIgNy4yNTAxMiA0LjE4NzI2IDguMDI5NjcgNC4xODcyNkM4Ljc3ODczIDQuMTg3MjYgOS4zOTE1MiA0Ljc3MDc1IDkuNDM4MjkgNS41MDgwMUM5LjQ1OTkyIDQuOTQ3MSA5LjkyMTQ3IDQuNDk5MDIgMTAuNDg3NyA0LjQ5OTAyQzExLjA2NzcgNC40OTkwMiAxMS41Mzc4IDQuOTY5MiAxMS41Mzc4IDUuNTQ5MTlWOC43NjI0NkwxMS41Mzc5IDYuNzExNUMxMS41Mzc5IDYuMDMwOTUgMTIuMDg5NiA1LjQ3OTI2IDEyLjc3MDIgNS40NzkyNkMxMy40NTA3IDUuNDc5MjYgMTQuMDAyNCA2LjAzMDk1IDE0LjAwMjQgNi43MTE1TDE0LjAwMjQgOC43NjI0NkwxNC4wMDI5IDguMDE5ODNDMTQuMDAyOSA3LjMzOTI5IDE0LjU1NDYgNi43ODc1OSAxNS4yMzUyIDYuNzg3NTlDMTUuOTE1NyA2Ljc4NzU5IDE2LjQ2NzQgNy4zMzkyOCAxNi40Njc0IDguMDE5ODNWMTEuNDk3TDE2LjQ2NzUgMTIuNDQ2N0MxNi40Njc1IDE0LjA4MjEgMTUuODA5NiAxNS42NDg3IDE0LjY0MiAxNi43OTM4VjE3LjMyNjJDMTQuNjQyIDE3Ljc4NjQgMTQuMjY4OSAxOC4xNTk1IDEzLjgwODcgMTguMTU5NUg4LjE3MzE3QzcuNzEyOTMgMTguMTU5NSA3LjMzOTg0IDE3Ljc4NjQgNy4zMzk4NCAxNy4zMjYyVjE1Ljk0MjRMNS4zNDU2MiAxNC43NTM0QzQuNTg5MjQgMTQuMzAyNCA0LjEyNTkxIDEzLjQ4NjcgNC4xMjU4OSAxMi42MDYxTDQuMTI1ODMgOS4yODM4M0M0LjEyNTgyIDguOTU0MjcgNC4zMjAwMyA4LjY1NTY2IDQuNjIxMjkgOC41MjIwNUw2LjYxODE3IDcuNjM2MzRWNS41OTg3NVoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3OCAzLjI0OTAyQzExLjI3OTYgMy4yNDkwMiAxMS45Nzc4IDMuNjQ5MDIgMTIuMzkxNyA0LjI1Nzk2QzEyLjUxNTEgNC4yMzkwNiAxMi42NDE2IDQuMjI5MjYgMTIuNzcwMyA0LjIyOTI2QzEzLjcyMjQgNC4yMjkyNiAxNC41NDkzIDQuNzY1MzEgMTQuOTY1NyA1LjU1MjA3QzE1LjA1NDMgNS41NDI1IDE1LjE0NDIgNS41Mzc1OSAxNS4yMzUzIDUuNTM3NTlDMTYuNjA2MiA1LjUzNzU5IDE3LjcxNzYgNi42NDg5MyAxNy43MTc2IDguMDE5ODNMMTcuNzE3NyAxMi40NDY3QzE3LjcxNzcgMTQuMjM1NSAxNy4wNjQ3IDE1Ljk1NTkgMTUuODkyMSAxNy4yOTA0VjE3LjMyNjJDMTUuODkyMSAxOC40NzY4IDE0Ljk1OTQgMTkuNDA5NSAxMy44MDg4IDE5LjQwOTVIOC4xNzMzMkM3LjAyMjczIDE5LjQwOTUgNi4wODk5OCAxOC40NzY4IDYuMDg5OTggMTcuMzI2MlYxNi42NTI0TDQuNzA1NjMgMTUuODI3QzMuNTcxMDYgMTUuMTUwNSAyLjg3NjA3IDEzLjkyNzEgMi44NzYwNCAxMi42MDYxTDIuODc1OTggOS4yODM4NUMyLjg3NTk2IDguNDU5OTYgMy4zNjE0OSA3LjcxMzQ1IDQuMTE0NjIgNy4zNzk0TDUuMzY4MzIgNi44MjMzM1Y1LjU5ODc1QzUuMzY4MzIgNC4xMjg4NSA2LjU1OTkxIDIuOTM3MjYgOC4wMjk4MiAyLjkzNzI2QzguNjA4MzEgMi45MzcyNiA5LjE0MzU1IDMuMTIxNyA5LjU4MDA1IDMuNDM1MDVDOS44NTg1MyAzLjMxNTMyIDEwLjE2NTQgMy4yNDkwMiAxMC40ODc4IDMuMjQ5MDJaTTEyLjQ0NzkgNS41MjE4NlY5LjQ3NTU3QzEyLjQ0NzkgOS43Mjc2MiAxMi4yNDM2IDkuOTMxOTUgMTEuOTkxNiA5LjkzMTk1QzExLjc1NjggOS45MzE5NSAxMS41NjM0IDkuNzU0NjUgMTEuNTM4IDkuNTI2NjNDMTEuNTM2MSA5LjUwOTg3IDExLjUzNTIgOS40OTI4MyAxMS41MzUyIDkuNDc1NTdWNS40NzE1OEMxMS41MTU0IDUuMjAwODMgMTEuMzkzIDQuOTU4NTggMTEuMjA2NiA0Ljc4MzU4QzExLjAxODggNC42MDcxMSAxMC43NjU5IDQuNDk5MDIgMTAuNDg3OCA0LjQ5OTAyQzEwLjQ3NjYgNC40OTkwMiAxMC40NjU0IDQuNDk5MTkgMTAuNDU0MiA0LjQ5OTU0QzkuOTAzNDcgNC41MTY4NCA5LjQ1OTY0IDQuOTU4MjQgOS40Mzg0NCA1LjUwODAxQzkuNDM4MiA1LjUwNDMgOS40Mzc5NSA1LjUwMDU4IDkuNDM3NjkgNS40OTY4OFY5LjkwMjQzQzkuNDM3NjkgMTAuMTU0NSA5LjIzMzM2IDEwLjM1ODggOC45ODEzMSAxMC4zNTg4QzguNzI5MjUgMTAuMzU4OCA4LjUyNDkyIDEwLjE1NDUgOC41MjQ5MiA5LjkwMjQzVjQuMjc2NTNDOC4zNzA4NiA0LjIxODgyIDguMjA0MDIgNC4xODcyNiA4LjAyOTgyIDQuMTg3MjZDNy4yNTAyNyA0LjE4NzI2IDYuNjE4MzIgNC44MTkyIDYuNjE4MzIgNS41OTg3NUw2LjYxODI3IDkuOTc1OTlDNi42MTgyNyAxMC4yMjggNi40MTM5NCAxMC40MzI0IDYuMTYxODkgMTAuNDMyNEM1LjkwOTgzIDEwLjQzMjQgNS43MDU1IDEwLjIyOCA1LjcwNTUgOS45NzU5OVY4LjA0MTIyTDQuNjIxNDQgOC41MjIwNUM0LjMyMDE4IDguNjU1NjYgNC4xMjU5NyA4Ljk1NDI3IDQuMTI1OTggOS4yODM4M0w0LjEyNjA0IDEyLjYwNjFDNC4xMjYwNiAxMy40ODY3IDQuNTg5MzkgMTQuMzAyNCA1LjM0NTc2IDE0Ljc1MzRMNy4zMzk5OCAxNS45NDI0VjE3LjMyNjJDNy4zMzk5OCAxNy43ODY0IDcuNzEzMDggMTguMTU5NSA4LjE3MzMyIDE4LjE1OTVIMTMuODA4OEMxNC4yNjkgMTguMTU5NSAxNC42NDIxIDE3Ljc4NjQgMTQuNjQyMSAxNy4zMjYyVjE2Ljc5MzhDMTUuNzM4MSAxNS43MTkgMTYuMzg1IDE0LjI3MjggMTYuNDYwMyAxMi43NDdDMTYuNDY0NiAxMi42NiAxNi40NjcgMTIuNTcyOCAxNi40Njc2IDEyLjQ4NTRMMTYuNDY3NyAxMi40NDY3TDE2LjQ2NzYgOC4wMTk4M0MxNi40Njc2IDcuMzQ1MDQgMTUuOTI1MiA2Ljc5NjkzIDE1LjI1MjUgNi43ODc3MUwxNS4yMzUzIDYuNzg3NTlDMTUuMTI1IDYuNzg3NTkgMTUuMDE4IDYuODAyMSAxNC45MTYyIDYuODI5MzFWOS42MDEzNkMxNC45MTYyIDkuODUzNDIgMTQuNzExOSAxMC4wNTc3IDE0LjQ1OTggMTAuMDU3N0MxNC4yMDc4IDEwLjA1NzcgMTQuMDAzNCA5Ljg1MzQxIDE0LjAwMzQgOS42MDEzNlY3Ljk4OTg1QzE0LjAwMzIgNy45OTk4MiAxNC4wMDMxIDguMDA5ODEgMTQuMDAzMSA4LjAxOTgzTDE0LjAwMzQgOS42MDEzNkwxNC4wMDI1IDYuNzExNUMxNC4wMDI1IDYuNDQ5NzQgMTMuOTIwOSA2LjIwNzA1IDEzLjc4MTggNi4wMDc0OEMxMy41NjIgNS42OTI0MiAxMy4xOTg5IDUuNDg0ODMgMTIuNzg3IDUuNDc5MzdMMTIuNzcwMyA1LjQ3OTI2QzEyLjY1ODggNS40NzkyNiAxMi41NTA3IDUuNDk0MDggMTIuNDQ3OSA1LjUyMTg2WiIgZmlsbD0iIzFEMUMyMyIvPgo8L3N2Zz4="), auto',
1485
+ // },
1456
1486
  fromNodeJSON(node, json, isFirstCreate) {
1457
1487
  initFormDataFromJSON(node, json, isFirstCreate);
1458
1488
  return;
@@ -2056,6 +2086,9 @@ var WorkflowDocument = class extends FlowDocument {
2056
2086
  this._loading = false;
2057
2087
  this.onLoadedEmitter.fire();
2058
2088
  }
2089
+ /**
2090
+ * @deprecated use `ctx.operation.fromJSON` instead
2091
+ */
2059
2092
  async reload(json, delayTime = 0) {
2060
2093
  if (this.disposed) return;
2061
2094
  this._loading = true;
@@ -2076,7 +2109,7 @@ var WorkflowDocument = class extends FlowDocument {
2076
2109
  edges: json.edges ?? []
2077
2110
  };
2078
2111
  this.entityManager.changeEntityLocked = true;
2079
- this.renderJSON(workflowJSON);
2112
+ this.batchAddFromJSON(workflowJSON);
2080
2113
  this.entityManager.changeEntityLocked = false;
2081
2114
  this.transformer.loading = false;
2082
2115
  if (fireRender) {
@@ -2096,9 +2129,17 @@ var WorkflowDocument = class extends FlowDocument {
2096
2129
  * 创建流程节点
2097
2130
  * @param json
2098
2131
  */
2099
- createWorkflowNode(json, isClone = false, parentId) {
2132
+ createWorkflowNode(json, isClone = false, parentID) {
2133
+ return this._createWorkflowNode(json, { parentID });
2134
+ }
2135
+ /**
2136
+ * 创建流程节点
2137
+ * @param json
2138
+ */
2139
+ _createWorkflowNode(json, options) {
2140
+ const { parentID, onNodeCreated, onEdgeCreated } = options ?? {};
2100
2141
  const isExistedNode = this.getNode(json.id);
2101
- const parent = this.getNode(parentId ?? this.root.id) ?? this.root;
2142
+ const parent = this.getNode(parentID ?? this.root.id) ?? this.root;
2102
2143
  const node = this.addNode(
2103
2144
  {
2104
2145
  ...json,
@@ -2125,15 +2166,19 @@ var WorkflowDocument = class extends FlowDocument {
2125
2166
  node.getData(TransformData7).update({
2126
2167
  position
2127
2168
  });
2128
- if (formMeta && formData && !formData.formModel.initialized) {
2129
- formData.createForm(formMeta, json.data);
2130
- formData.onDataChange(() => {
2131
- this.fireContentChange({
2132
- type: "NODE_DATA_CHANGE" /* NODE_DATA_CHANGE */,
2133
- toJSON: () => formData.toJSON(),
2134
- entity: node
2169
+ if (formMeta && formData) {
2170
+ if (!formData.formModel.initialized) {
2171
+ formData.createForm(formMeta, json.data);
2172
+ formData.onDataChange(() => {
2173
+ this.fireContentChange({
2174
+ type: "NODE_DATA_CHANGE" /* NODE_DATA_CHANGE */,
2175
+ toJSON: () => formData.toJSON(),
2176
+ entity: node
2177
+ });
2135
2178
  });
2136
- });
2179
+ } else {
2180
+ formData.updateFormValues(json.data);
2181
+ }
2137
2182
  }
2138
2183
  const positionData = node.getData(PositionData);
2139
2184
  if (!isExistedNode) {
@@ -2172,11 +2217,12 @@ var WorkflowDocument = class extends FlowDocument {
2172
2217
  });
2173
2218
  }
2174
2219
  if (json.blocks) {
2175
- this.renderJSON(
2220
+ this.batchAddFromJSON(
2176
2221
  { nodes: json.blocks, edges: json.edges ?? [] },
2177
2222
  {
2178
2223
  parent: node,
2179
- isClone
2224
+ onNodeCreated,
2225
+ onEdgeCreated
2180
2226
  }
2181
2227
  );
2182
2228
  }
@@ -2308,7 +2354,7 @@ var WorkflowDocument = class extends FlowDocument {
2308
2354
  throw new Error(`[WorkflowDocument.createWorkflowNodeByType] Node Id "${id}" duplicated.`);
2309
2355
  }
2310
2356
  }
2311
- return this.createWorkflowNode(
2357
+ return this._createWorkflowNode(
2312
2358
  {
2313
2359
  ...json,
2314
2360
  id,
@@ -2319,13 +2365,15 @@ var WorkflowDocument = class extends FlowDocument {
2319
2365
  blocks: json?.blocks,
2320
2366
  edges: json?.edges
2321
2367
  },
2322
- false,
2323
- parentID
2368
+ { parentID }
2324
2369
  );
2325
2370
  }
2326
2371
  getAllNodes() {
2327
2372
  return this.entityManager.getEntities(WorkflowNodeEntity).filter((n) => n.id !== FlowNodeBaseType2.ROOT);
2328
2373
  }
2374
+ getAllEdges() {
2375
+ return this.entityManager.getEntities(WorkflowLineEntity);
2376
+ }
2329
2377
  getAllPorts() {
2330
2378
  return this.entityManager.getEntities(WorkflowPortEntity).filter((p) => p.node.id !== FlowNodeBaseType2.ROOT);
2331
2379
  }
@@ -2426,7 +2474,7 @@ var WorkflowDocument = class extends FlowDocument {
2426
2474
  x: json.meta.position.x + 30,
2427
2475
  y: json.meta.position.y + 30
2428
2476
  };
2429
- return this.createWorkflowNode(
2477
+ return this._createWorkflowNode(
2430
2478
  {
2431
2479
  id: newNodeId || `1${nanoid2()}`,
2432
2480
  type: node.flowNodeType,
@@ -2438,16 +2486,17 @@ var WorkflowDocument = class extends FlowDocument {
2438
2486
  blocks: json.blocks,
2439
2487
  edges: json.edges
2440
2488
  },
2441
- true,
2442
- node.parent?.id
2489
+ {
2490
+ parentID: node.parent?.id
2491
+ }
2443
2492
  );
2444
2493
  }
2445
- copyNodeFromJSON(flowNodeType, nodeJSON, newNodeId, position, parentId) {
2494
+ copyNodeFromJSON(flowNodeType, nodeJSON, newNodeId, position, parentID) {
2446
2495
  position = position || {
2447
2496
  x: nodeJSON.meta.position.x + 30,
2448
2497
  y: nodeJSON.meta.position.y + 30
2449
2498
  };
2450
- return this.createWorkflowNode(
2499
+ return this._createWorkflowNode(
2451
2500
  {
2452
2501
  id: newNodeId || `1${nanoid2()}`,
2453
2502
  type: flowNodeType,
@@ -2459,8 +2508,9 @@ var WorkflowDocument = class extends FlowDocument {
2459
2508
  blocks: nodeJSON.blocks,
2460
2509
  edges: nodeJSON.edges
2461
2510
  },
2462
- true,
2463
- parentId
2511
+ {
2512
+ parentID
2513
+ }
2464
2514
  );
2465
2515
  }
2466
2516
  canRemove(node, silent) {
@@ -2515,13 +2565,19 @@ var WorkflowDocument = class extends FlowDocument {
2515
2565
  * 批量添加节点
2516
2566
  */
2517
2567
  batchAddFromJSON(json, options) {
2518
- const { parent = this.root, isClone = false } = options ?? {};
2519
- const containerID = this.getNodeSubCanvas(parent)?.canvasNode.id ?? parent.id;
2568
+ const { parent = this.root, onNodeCreated, onEdgeCreated } = options ?? {};
2569
+ const parentID = this.getNodeSubCanvas(parent)?.canvasNode.id ?? parent.id;
2520
2570
  const processedJSON = buildGroupJSON(json);
2521
2571
  const nodes = processedJSON.nodes.map(
2522
- (nodeJSON) => this.createWorkflowNode(nodeJSON, isClone, containerID)
2572
+ (nodeJSON) => this._createWorkflowNode(nodeJSON, {
2573
+ parentID,
2574
+ onNodeCreated,
2575
+ onEdgeCreated
2576
+ })
2523
2577
  );
2524
- const edges = processedJSON.edges.map((edge) => this.createWorkflowLine(edge, containerID)).filter(Boolean);
2578
+ const edges = processedJSON.edges.map((edge) => this.createWorkflowLine(edge, parentID)).filter(Boolean);
2579
+ nodes.forEach((node) => options?.onNodeCreated?.(node));
2580
+ edges.forEach((edge) => options?.onEdgeCreated?.(edge));
2525
2581
  return { nodes, edges };
2526
2582
  }
2527
2583
  getNodeSubCanvas(node) {
@@ -2570,7 +2626,7 @@ var WorkflowDocument = class extends FlowDocument {
2570
2626
  }
2571
2627
  return lineJSON;
2572
2628
  }
2573
- createWorkflowLine(json, parentId) {
2629
+ createWorkflowLine(json, parentID) {
2574
2630
  const fromNode = this.getNode(json.sourceNodeID);
2575
2631
  const toNode = this.getNode(json.targetNodeID);
2576
2632
  if (!fromNode || !toNode) {
@@ -2583,10 +2639,10 @@ var WorkflowDocument = class extends FlowDocument {
2583
2639
  toPort: json.targetPortID,
2584
2640
  data: json.data
2585
2641
  };
2586
- if (!parentId) {
2642
+ if (!parentID) {
2587
2643
  return this.linesManager.createLine(lineInfo);
2588
2644
  }
2589
- const canvasNode = this.getNode(parentId);
2645
+ const canvasNode = this.getNode(parentID);
2590
2646
  if (!canvasNode) {
2591
2647
  return this.linesManager.createLine(lineInfo);
2592
2648
  }
@@ -3049,20 +3105,16 @@ var WorkflowDragService = class {
3049
3105
  })
3050
3106
  );
3051
3107
  const containerTransform = container.getData(TransformData8);
3052
- containerTransform.update({
3053
- position: {
3054
- x: containerTransform.position.x + bounds.x,
3055
- y: containerTransform.position.y + bounds.y
3056
- }
3108
+ this.operationService.updateNodePosition(container, {
3109
+ x: containerTransform.position.x + bounds.x,
3110
+ y: containerTransform.position.y + bounds.y
3057
3111
  });
3058
3112
  this.document.layout.updateAffectedTransform(container);
3059
3113
  container.blocks.forEach((node) => {
3060
3114
  const transform = node.getData(TransformData8);
3061
- transform.update({
3062
- position: {
3063
- x: transform.position.x - bounds.x,
3064
- y: transform.position.y - bounds.y
3065
- }
3115
+ this.operationService.updateNodePosition(node, {
3116
+ x: transform.position.x - bounds.x,
3117
+ y: transform.position.y - bounds.y
3066
3118
  });
3067
3119
  this.document.layout.updateAffectedTransform(node);
3068
3120
  });
@@ -3383,7 +3435,7 @@ __decorateClass([
3383
3435
  inject6(WorkflowSelectService)
3384
3436
  ], WorkflowDragService.prototype, "selectService", 2);
3385
3437
  __decorateClass([
3386
- inject6(FlowOperationBaseService)
3438
+ inject6(WorkflowOperationBaseService)
3387
3439
  ], WorkflowDragService.prototype, "operationService", 2);
3388
3440
  __decorateClass([
3389
3441
  inject6(WorkflowDocumentOptions)
@@ -3531,10 +3583,64 @@ var WorkflowOperationBaseServiceImpl = class extends FlowOperationBaseServiceImp
3531
3583
  newPosition: position
3532
3584
  });
3533
3585
  }
3586
+ fromJSON(json) {
3587
+ if (this.document.disposed) return;
3588
+ const workflowJSON = {
3589
+ nodes: json.nodes ?? [],
3590
+ edges: json.edges ?? []
3591
+ };
3592
+ const oldNodes = this.document.getAllNodes();
3593
+ const oldEdges = this.linesManager.getAllLines();
3594
+ const oldPositionMap = new Map(
3595
+ oldNodes.map((node) => [
3596
+ node.id,
3597
+ {
3598
+ x: node.transform.transform.position.x,
3599
+ y: node.transform.transform.position.y
3600
+ }
3601
+ ])
3602
+ );
3603
+ const newNodes = [];
3604
+ const newEdges = [];
3605
+ this.document.batchAddFromJSON(workflowJSON, {
3606
+ onNodeCreated: (node) => newNodes.push(node),
3607
+ onEdgeCreated: (edge) => newEdges.push(edge)
3608
+ });
3609
+ const newEdgeIDSet = new Set(newEdges.map((edge) => edge.id));
3610
+ oldEdges.forEach((edge) => {
3611
+ if (!newEdgeIDSet.has(edge.id)) {
3612
+ edge.dispose();
3613
+ return;
3614
+ }
3615
+ });
3616
+ const newNodeIDSet = new Set(newNodes.map((node) => node.id));
3617
+ oldNodes.forEach((node) => {
3618
+ if (!newNodeIDSet.has(node.id)) {
3619
+ node.dispose();
3620
+ return;
3621
+ }
3622
+ const oldPosition = oldPositionMap.get(node.id);
3623
+ const newPosition = {
3624
+ x: node.transform.transform.position.x,
3625
+ y: node.transform.transform.position.y
3626
+ };
3627
+ if (oldPosition && (oldPosition.x !== newPosition.x || oldPosition.y !== newPosition.y)) {
3628
+ this.onNodePostionUpdateEmitter.fire({
3629
+ node,
3630
+ oldPosition,
3631
+ newPosition
3632
+ });
3633
+ }
3634
+ });
3635
+ this.document.fireRender();
3636
+ }
3534
3637
  };
3535
3638
  __decorateClass([
3536
3639
  inject8(WorkflowDocument)
3537
3640
  ], WorkflowOperationBaseServiceImpl.prototype, "document", 2);
3641
+ __decorateClass([
3642
+ inject8(WorkflowLinesManager)
3643
+ ], WorkflowOperationBaseServiceImpl.prototype, "linesManager", 2);
3538
3644
 
3539
3645
  // src/hooks/use-playground-readonly-state.ts
3540
3646
  import { useEffect } from "react";
@@ -3632,8 +3738,8 @@ function useNodeRender(nodeFromProps) {
3632
3738
  }, []);
3633
3739
  const getExtInfo = useCallback(() => node.getExtInfo(), [node]);
3634
3740
  const updateExtInfo = useCallback(
3635
- (data) => {
3636
- node.updateExtInfo(data);
3741
+ (data, fullUpdate) => {
3742
+ node.updateExtInfo(data, fullUpdate);
3637
3743
  },
3638
3744
  [node]
3639
3745
  );
@@ -3668,7 +3774,7 @@ function useNodeRender(nodeFromProps) {
3668
3774
  if (form) {
3669
3775
  form.updateFormValues(values);
3670
3776
  } else {
3671
- updateExtInfo(values);
3777
+ updateExtInfo(values, true);
3672
3778
  }
3673
3779
  },
3674
3780
  node,