@flowgram.ai/free-layout-core 0.4.19 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/index.js CHANGED
@@ -776,16 +776,8 @@ var WorkflowLineRenderData = class extends EntityData3 {
776
776
  * WARNING: 这个方法,必须在 requestAnimationFrame / useLayoutEffect 中调用,否则会引起浏览器强制重排
777
777
  */
778
778
  updatePosition() {
779
- this.data.position.from = this.entity.from.ports.getOutputPoint(this.entity.info.fromPort);
780
- if (this.entity.info.drawingTo) {
781
- this.data.position.to = this.entity.info.drawingTo;
782
- } else {
783
- this.data.position.to = this.entity.to?.ports?.getInputPoint(this.entity.info.toPort) ?? {
784
- x: this.data.position.from.x,
785
- y: this.data.position.from.y,
786
- location: this.data.position.from.location === "right" ? "left" : "top"
787
- };
788
- }
779
+ this.data.position.from = this.entity.drawingFrom || this.entity.fromPort.point;
780
+ this.data.position.to = this.entity.drawingTo || this.entity.toPort.point;
789
781
  this.data.version = [
790
782
  this.lineType,
791
783
  this.data.position.from.x,
@@ -850,10 +842,11 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends Entity2 {
850
842
  to: opts.to,
851
843
  drawingTo: opts.drawingTo,
852
844
  fromPort: opts.fromPort,
845
+ drawingFrom: opts.drawingFrom,
853
846
  toPort: opts.toPort,
854
847
  data: opts.data
855
848
  });
856
- if (opts.drawingTo) {
849
+ if (opts.drawingTo || opts.drawingFrom) {
857
850
  this.isDrawing = true;
858
851
  }
859
852
  this.onEntityChange(() => {
@@ -988,6 +981,30 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends Entity2 {
988
981
  }
989
982
  this.fireChange();
990
983
  }
984
+ setFromPort(fromPort) {
985
+ if (!this.isDrawing) {
986
+ throw new Error("[setFromPort] only support drawing line.");
987
+ }
988
+ if (this.fromPort === fromPort) {
989
+ return;
990
+ }
991
+ const prePort = this.fromPort;
992
+ if (fromPort && fromPort.portType === "output" && this.linesManager.canAddLine(fromPort, this.toPort, true)) {
993
+ const { node, portID } = fromPort;
994
+ this._from = node;
995
+ this.info.drawingFrom = void 0;
996
+ this.info.from = node.id;
997
+ this.info.fromPort = portID;
998
+ } else {
999
+ this._from = void 0;
1000
+ this.info.from = void 0;
1001
+ this.info.fromPort = "";
1002
+ }
1003
+ if (prePort) {
1004
+ prePort.validate();
1005
+ }
1006
+ this.fireChange();
1007
+ }
991
1008
  /**
992
1009
  * 设置线条画线时的目标位置
993
1010
  */
@@ -1004,6 +1021,22 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends Entity2 {
1004
1021
  this.fireChange();
1005
1022
  }
1006
1023
  }
1024
+ set drawingFrom(pos) {
1025
+ const oldDrawingFrom = this.info.drawingFrom;
1026
+ if (!pos) {
1027
+ this.info.drawingFrom = void 0;
1028
+ this.fireChange();
1029
+ return;
1030
+ }
1031
+ if (!oldDrawingFrom || pos.x !== oldDrawingFrom.x || pos.y !== oldDrawingFrom.y) {
1032
+ this.info.from = void 0;
1033
+ this.info.drawingFrom = pos;
1034
+ this.fireChange();
1035
+ }
1036
+ }
1037
+ get drawingFrom() {
1038
+ return this.info.drawingFrom;
1039
+ }
1007
1040
  /**
1008
1041
  * 获取线条正在画线的位置
1009
1042
  */
@@ -1042,6 +1075,9 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends Entity2 {
1042
1075
  return this.getData(WorkflowLineRenderData).calcDistance(pos);
1043
1076
  }
1044
1077
  get fromPort() {
1078
+ if (!this.from) {
1079
+ return void 0;
1080
+ }
1045
1081
  return this.from.ports.getPortEntityByKey("output", this.info.fromPort);
1046
1082
  }
1047
1083
  get toPort() {
@@ -1082,7 +1118,7 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends Entity2 {
1082
1118
  * @deprecated
1083
1119
  */
1084
1120
  get vertical() {
1085
- const fromLocation = this.fromPort.location;
1121
+ const fromLocation = this.fromPort?.location;
1086
1122
  const toLocation = this.toPort?.location;
1087
1123
  if (toLocation) {
1088
1124
  return toLocation === "top";
@@ -1108,7 +1144,7 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends Entity2 {
1108
1144
  initInfo(info) {
1109
1145
  if (!isEqual2(info, this.info)) {
1110
1146
  this.info = info;
1111
- this._from = this.document.getNode(info.from);
1147
+ this._from = info.from ? this.document.getNode(info.from) : void 0;
1112
1148
  this._to = info.to ? this.document.getNode(info.to) : void 0;
1113
1149
  this._lineData = info.data;
1114
1150
  this.fireChange();
@@ -1142,7 +1178,7 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends Entity2 {
1142
1178
  this._node = domUtils.createDivWithClass("gedit-flow-activity-line");
1143
1179
  this._node.dataset.testid = "sdk.workflow.canvas.line";
1144
1180
  this._node.dataset.lineId = this.id;
1145
- this._node.dataset.fromNodeId = this.from.id;
1181
+ this._node.dataset.fromNodeId = this.from?.id ?? "";
1146
1182
  this._node.dataset.fromPortId = this.fromPort?.id ?? "";
1147
1183
  this._node.dataset.toNodeId = this.to?.id ?? "";
1148
1184
  this._node.dataset.toPortId = this.toPort?.id ?? "";
@@ -1324,10 +1360,17 @@ var WorkflowHoverService = class {
1324
1360
  }
1325
1361
  /**
1326
1362
  * 获取被 hover 的节点或线条
1363
+ * @deprecated use 'someHovered' instead
1327
1364
  */
1328
1365
  get hoveredNode() {
1329
1366
  return this.entityManager.getEntityById(this.hoveredKey);
1330
1367
  }
1368
+ /**
1369
+ * 获取被 hover 的节点或线条
1370
+ */
1371
+ get someHovered() {
1372
+ return this.entityManager.getEntityById(this.hoveredKey);
1373
+ }
1331
1374
  };
1332
1375
  __decorateClass([
1333
1376
  inject2(EntityManager)
@@ -1345,7 +1388,8 @@ import {
1345
1388
  Emitter as Emitter6,
1346
1389
  DisposableCollection as DisposableCollection2,
1347
1390
  Rectangle as Rectangle8,
1348
- delay as delay2
1391
+ delay as delay2,
1392
+ Point
1349
1393
  } from "@flowgram.ai/utils";
1350
1394
  import {
1351
1395
  FlowNodeTransformData as FlowNodeTransformData6,
@@ -1405,10 +1449,11 @@ function initFormDataFromJSON(node, json, isFirstCreate) {
1405
1449
  // src/workflow-document-option.ts
1406
1450
  var WorkflowDocumentOptions = Symbol("WorkflowDocumentOptions");
1407
1451
  var WorkflowDocumentOptionsDefault = {
1408
- cursors: {
1409
- grab: 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMC40ODczIDIuNjIzNzhDOS45MDczMSAyLjYyMzc4IDkuNDM3MTMgMy4wOTM5NiA5LjQzNzEzIDMuNjczOTZWNS4xNDM3NkM5LjM5NDI4IDQuNDAyNzQgOC43Nzk3OCAzLjgxNTA0IDguMDI4MDIgMy44MTUwNEM3LjI0ODQ4IDMuODE1MDQgNi42MTY1MyA0LjQ0Njk5IDYuNjE2NTMgNS4yMjY1M1YxMS44Mjg5TDUuNjc0MTggMTEuMDA0OUM1LjE1NDg3IDEwLjU1MDkgNC40MDk1IDEwLjQ2MzYgMy43OTkzOCAxMC43ODU1TDMuNjk2OTQgMTAuODM5NkMzLjA2MjE3IDExLjE3NDUgMi45MjI2IDEyLjAyMjggMy40MTY2MiAxMi41NDM0TDcuMzM5NTkgMTYuNjc3NVYxNy4zMjU5QzcuMzM5NTkgMTcuNzg2MiA3LjcxMjY5IDE4LjE1OTMgOC4xNzI5MiAxOC4xNTkzSDEzLjgwODRDMTQuMjY4NyAxOC4xNTkzIDE0LjY0MTcgMTcuNzg2MiAxNC42NDE3IDE3LjMyNTlWMTYuNzkzNUMxNS44MDk0IDE1LjY0ODUgMTYuNDY3MyAxNC4wODE5IDE2LjQ2NzMgMTIuNDQ2NVYxMS40OTY3TDE2LjQ2NzEgNi42MzY4NUMxNi40NjcxIDUuOTU2MyAxNS45MTU0IDUuNDA0NjEgMTUuMjM0OCA1LjQwNDYxQzE0LjU1NDMgNS40MDQ2MSAxNC4wMDI2IDUuOTU2MyAxNC4wMDI2IDYuNjM2ODVMMTQuMDAyMSA1LjA0NzI4QzE0LjAwMjEgNC4zNjY3MyAxMy40NTA0IDMuODE1MDQgMTIuNzY5OCAzLjgxNTA0QzEyLjA4OTMgMy44MTUwNCAxMS41Mzc2IDQuMzY2NzMgMTEuNTM3NiA1LjA0NzI4TDExLjUzNzUgMy42NzM5NUMxMS41Mzc1IDMuMDkzOTYgMTEuMDY3MyAyLjYyMzc4IDEwLjQ4NzMgMi42MjM3OFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3NCAxLjM3NDAyQzExLjM2MTIgMS4zNzQwMiAxMi4xMjExIDEuODYxMTggMTIuNTEwNSAyLjU3ODY4QzEyLjU5NTggMi41Njk4MyAxMi42ODIzIDIuNTY1MjggMTIuNzcgMi41NjUyOEMxMy44Mjc4IDIuNTY1MjggMTQuNzMxMSAzLjIyNzAxIDE1LjA4ODUgNC4xNTkxMUMxNS4xMzcgNC4xNTYyOSAxNS4xODU4IDQuMTU0ODYgMTUuMjM1IDQuMTU0ODZDMTYuNjA1OSA0LjE1NDg2IDE3LjcxNzIgNS4yNjYxOSAxNy43MTcyIDYuNjM3MDlMMTcuNzE3NCAxMi40NDY3QzE3LjcxNzQgMTQuMjM1NSAxNy4wNjQ0IDE1Ljk1NTkgMTUuODkxOSAxNy4yOTA0VjE3LjMyNjJDMTUuODkxOSAxOC40NzY4IDE0Ljk1OTEgMTkuNDA5NSAxMy44MDg1IDE5LjQwOTVIOC4xNzMwNkM3LjAyMjQ3IDE5LjQwOTUgNi4wODk3MyAxOC40NzY4IDYuMDg5NzMgMTcuMzI2MlYxNy4xNzY0TDIuNTEwMDMgMTMuNDA0MUMxLjQ0NTk5IDEyLjI4MjggMS43NDY2IDEwLjQ1NTUgMy4xMTM3OSA5LjczNDI0TDMuMjE2MjQgOS42ODAxOUMzLjg5MTY4IDkuMzIzODMgNC42NjE4NSA5LjI1NDAxIDUuMzY2NjYgOS40NTE5OFY1LjIyNjc4QzUuMzY2NjYgMy43NTY4NyA2LjU1ODI2IDIuNTY1MjggOC4wMjgxNiAyLjU2NTI4QzguMTcyOTMgMi41NjUyOCA4LjMxNDk5IDIuNTc2ODQgOC40NTM0NyAyLjU5OTA3QzguODM5NDMgMS44NzA0MiA5LjYwNTQ2IDEuMzc0MDIgMTAuNDg3NCAxLjM3NDAyWk0xMi40NDc2IDMuODU3ODdWOS40NzY0NkMxMi40NDc2IDkuNzI4NTIgMTIuMjQzMyA5LjkzMjg1IDExLjk5MTMgOS45MzI4NUMxMS43MzkyIDkuOTMyODUgMTEuNTM0OSA5LjcyODUyIDExLjUzNDkgOS40NzY0NlYzLjc5NjU1QzExLjUzNDkgMy43Nzk1NiAxMS41MzU4IDMuNzYyNzcgMTEuNTM3NiAzLjc0NjI2VjMuNjc0MkMxMS41Mzc2IDMuNDMyODIgMTEuNDU2MiAzLjIxMDQ2IDExLjMxOTMgMy4wMzMwOUMxMS4xMjcyIDIuNzg0MjggMTAuODI2MSAyLjYyNDAyIDEwLjQ4NzQgMi42MjQwMkMxMC4xMjM4IDIuNjI0MDIgOS44MDMzMiAyLjgwODg2IDkuNjE0ODMgMy4wODk3QzkuNTAyNjkgMy4yNTY3OSA5LjQzNzI2IDMuNDU3ODUgOS40MzcyNiAzLjY3NDJWMy43ODU3M0M5LjQzNzM1IDMuNzg5MzMgOS40MzczOSAzLjc5Mjk0IDkuNDM3MzkgMy43OTY1NVY5LjkwMTdDOS40MzczOSAxMC4xNTM3IDkuMjMzMDYgMTAuMzU4MSA4Ljk4MTAxIDEwLjM1ODFDOC43Mjg5NSAxMC4zNTgxIDguNTI0NjIgMTAuMTUzNyA4LjUyNDYyIDkuOTAxN1YzLjkwNTA3QzguNDE3NzMgMy44NjQ5IDguMzA0NjggMy44MzczMiA4LjE4NzI2IDMuODI0MTVDOC4xMzUwNCAzLjgxODI5IDguMDgxOTUgMy44MTUyOCA4LjAyODE2IDMuODE1MjhDNy4yNDg2MSAzLjgxNTI4IDYuNjE2NjYgNC40NDcyMyA2LjYxNjY2IDUuMjI2NzhWMTEuODI5Mkw1LjY3NDMxIDExLjAwNTJDNS41Nzg2OCAxMC45MjE2IDUuNDc1MzcgMTAuODUwNCA1LjM2NjY2IDEwLjc5MTlDNC44ODUwNiAxMC41MzI5IDQuMjk3MjggMTAuNTIzMSAzLjc5OTUyIDEwLjc4NThMMy42OTcwNyAxMC44Mzk4QzMuMDYyMzEgMTEuMTc0NyAyLjkyMjczIDEyLjAyMzEgMy40MTY3NSAxMi41NDM3TDcuMzM5NzMgMTYuNjc3N1YxNy4zMjYyQzcuMzM5NzMgMTcuNzg2NCA3LjcxMjgyIDE4LjE1OTUgOC4xNzMwNiAxOC4xNTk1SDEzLjgwODVDMTQuMjY4OCAxOC4xNTk1IDE0LjY0MTkgMTcuNzg2NCAxNC42NDE5IDE3LjMyNjJWMTYuNzkzOEMxNS43Mzc5IDE1LjcxOSAxNi4zODQ3IDE0LjI3MjggMTYuNDYgMTIuNzQ3QzE2LjQ2NDEgMTIuNjY0MSAxNi40NjY1IDEyLjU4MDkgMTYuNDY3MiAxMi40OTc1TDE2LjQ2NzQgMTIuNDQ2N0wxNi40NjcyIDYuNjM3MDlDMTYuNDY3MiA1Ljk2MjMgMTUuOTI0OCA1LjQxNDE5IDE1LjI1MjIgNS40MDQ5N0wxNS4yMzUgNS40MDQ4NkMxNS4xMjQ2IDUuNDA0ODYgMTUuMDE3NyA1LjQxOTM2IDE0LjkxNTkgNS40NDY1NlY5LjYwMjI2QzE0LjkxNTkgOS44NTQzMSAxNC43MTE2IDEwLjA1ODYgMTQuNDU5NSAxMC4wNTg2QzE0LjIwNzUgMTAuMDU4NiAxNC4wMDMxIDkuODU0MzEgMTQuMDAzMSA5LjYwMjI2VjYuNjA1MTRDMTQuMDAyOSA2LjYxNTc2IDE0LjAwMjcgNi42MjY0MSAxNC4wMDI3IDYuNjM3MDlWOS4yNzcwNUwxNC4wMDIyIDUuMDQ3NTJDMTQuMDAyMiA0Ljg2OTEzIDEzLjk2NDMgNC42OTk2IDEzLjg5NjEgNC41NDY1M0MxMy43MDY0IDQuMTIwNzIgMTMuMjgyMiAzLjgyMjM1IDEyLjc4NzYgMy44MTU0MUwxMi43NyAzLjgxNTI4QzEyLjY1ODQgMy44MTUyOCAxMi41NTA0IDMuODMwMSAxMi40NDc2IDMuODU3ODdaIiBmaWxsPSIjMUQxQzIzIi8+Cjwvc3ZnPg=="), auto',
1410
- grabbing: 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02LjYxODE3IDUuNTk4NzVDNi42MTgxNyA0LjgxOTIgNy4yNTAxMiA0LjE4NzI2IDguMDI5NjcgNC4xODcyNkM4Ljc3ODczIDQuMTg3MjYgOS4zOTE1MiA0Ljc3MDc1IDkuNDM4MjkgNS41MDgwMUM5LjQ1OTkyIDQuOTQ3MSA5LjkyMTQ3IDQuNDk5MDIgMTAuNDg3NyA0LjQ5OTAyQzExLjA2NzcgNC40OTkwMiAxMS41Mzc4IDQuOTY5MiAxMS41Mzc4IDUuNTQ5MTlWOC43NjI0NkwxMS41Mzc5IDYuNzExNUMxMS41Mzc5IDYuMDMwOTUgMTIuMDg5NiA1LjQ3OTI2IDEyLjc3MDIgNS40NzkyNkMxMy40NTA3IDUuNDc5MjYgMTQuMDAyNCA2LjAzMDk1IDE0LjAwMjQgNi43MTE1TDE0LjAwMjQgOC43NjI0NkwxNC4wMDI5IDguMDE5ODNDMTQuMDAyOSA3LjMzOTI5IDE0LjU1NDYgNi43ODc1OSAxNS4yMzUyIDYuNzg3NTlDMTUuOTE1NyA2Ljc4NzU5IDE2LjQ2NzQgNy4zMzkyOCAxNi40Njc0IDguMDE5ODNWMTEuNDk3TDE2LjQ2NzUgMTIuNDQ2N0MxNi40Njc1IDE0LjA4MjEgMTUuODA5NiAxNS42NDg3IDE0LjY0MiAxNi43OTM4VjE3LjMyNjJDMTQuNjQyIDE3Ljc4NjQgMTQuMjY4OSAxOC4xNTk1IDEzLjgwODcgMTguMTU5NUg4LjE3MzE3QzcuNzEyOTMgMTguMTU5NSA3LjMzOTg0IDE3Ljc4NjQgNy4zMzk4NCAxNy4zMjYyVjE1Ljk0MjRMNS4zNDU2MiAxNC43NTM0QzQuNTg5MjQgMTQuMzAyNCA0LjEyNTkxIDEzLjQ4NjcgNC4xMjU4OSAxMi42MDYxTDQuMTI1ODMgOS4yODM4M0M0LjEyNTgyIDguOTU0MjcgNC4zMjAwMyA4LjY1NTY2IDQuNjIxMjkgOC41MjIwNUw2LjYxODE3IDcuNjM2MzRWNS41OTg3NVoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3OCAzLjI0OTAyQzExLjI3OTYgMy4yNDkwMiAxMS45Nzc4IDMuNjQ5MDIgMTIuMzkxNyA0LjI1Nzk2QzEyLjUxNTEgNC4yMzkwNiAxMi42NDE2IDQuMjI5MjYgMTIuNzcwMyA0LjIyOTI2QzEzLjcyMjQgNC4yMjkyNiAxNC41NDkzIDQuNzY1MzEgMTQuOTY1NyA1LjU1MjA3QzE1LjA1NDMgNS41NDI1IDE1LjE0NDIgNS41Mzc1OSAxNS4yMzUzIDUuNTM3NTlDMTYuNjA2MiA1LjUzNzU5IDE3LjcxNzYgNi42NDg5MyAxNy43MTc2IDguMDE5ODNMMTcuNzE3NyAxMi40NDY3QzE3LjcxNzcgMTQuMjM1NSAxNy4wNjQ3IDE1Ljk1NTkgMTUuODkyMSAxNy4yOTA0VjE3LjMyNjJDMTUuODkyMSAxOC40NzY4IDE0Ljk1OTQgMTkuNDA5NSAxMy44MDg4IDE5LjQwOTVIOC4xNzMzMkM3LjAyMjczIDE5LjQwOTUgNi4wODk5OCAxOC40NzY4IDYuMDg5OTggMTcuMzI2MlYxNi42NTI0TDQuNzA1NjMgMTUuODI3QzMuNTcxMDYgMTUuMTUwNSAyLjg3NjA3IDEzLjkyNzEgMi44NzYwNCAxMi42MDYxTDIuODc1OTggOS4yODM4NUMyLjg3NTk2IDguNDU5OTYgMy4zNjE0OSA3LjcxMzQ1IDQuMTE0NjIgNy4zNzk0TDUuMzY4MzIgNi44MjMzM1Y1LjU5ODc1QzUuMzY4MzIgNC4xMjg4NSA2LjU1OTkxIDIuOTM3MjYgOC4wMjk4MiAyLjkzNzI2QzguNjA4MzEgMi45MzcyNiA5LjE0MzU1IDMuMTIxNyA5LjU4MDA1IDMuNDM1MDVDOS44NTg1MyAzLjMxNTMyIDEwLjE2NTQgMy4yNDkwMiAxMC40ODc4IDMuMjQ5MDJaTTEyLjQ0NzkgNS41MjE4NlY5LjQ3NTU3QzEyLjQ0NzkgOS43Mjc2MiAxMi4yNDM2IDkuOTMxOTUgMTEuOTkxNiA5LjkzMTk1QzExLjc1NjggOS45MzE5NSAxMS41NjM0IDkuNzU0NjUgMTEuNTM4IDkuNTI2NjNDMTEuNTM2MSA5LjUwOTg3IDExLjUzNTIgOS40OTI4MyAxMS41MzUyIDkuNDc1NTdWNS40NzE1OEMxMS41MTU0IDUuMjAwODMgMTEuMzkzIDQuOTU4NTggMTEuMjA2NiA0Ljc4MzU4QzExLjAxODggNC42MDcxMSAxMC43NjU5IDQuNDk5MDIgMTAuNDg3OCA0LjQ5OTAyQzEwLjQ3NjYgNC40OTkwMiAxMC40NjU0IDQuNDk5MTkgMTAuNDU0MiA0LjQ5OTU0QzkuOTAzNDcgNC41MTY4NCA5LjQ1OTY0IDQuOTU4MjQgOS40Mzg0NCA1LjUwODAxQzkuNDM4MiA1LjUwNDMgOS40Mzc5NSA1LjUwMDU4IDkuNDM3NjkgNS40OTY4OFY5LjkwMjQzQzkuNDM3NjkgMTAuMTU0NSA5LjIzMzM2IDEwLjM1ODggOC45ODEzMSAxMC4zNTg4QzguNzI5MjUgMTAuMzU4OCA4LjUyNDkyIDEwLjE1NDUgOC41MjQ5MiA5LjkwMjQzVjQuMjc2NTNDOC4zNzA4NiA0LjIxODgyIDguMjA0MDIgNC4xODcyNiA4LjAyOTgyIDQuMTg3MjZDNy4yNTAyNyA0LjE4NzI2IDYuNjE4MzIgNC44MTkyIDYuNjE4MzIgNS41OTg3NUw2LjYxODI3IDkuOTc1OTlDNi42MTgyNyAxMC4yMjggNi40MTM5NCAxMC40MzI0IDYuMTYxODkgMTAuNDMyNEM1LjkwOTgzIDEwLjQzMjQgNS43MDU1IDEwLjIyOCA1LjcwNTUgOS45NzU5OVY4LjA0MTIyTDQuNjIxNDQgOC41MjIwNUM0LjMyMDE4IDguNjU1NjYgNC4xMjU5NyA4Ljk1NDI3IDQuMTI1OTggOS4yODM4M0w0LjEyNjA0IDEyLjYwNjFDNC4xMjYwNiAxMy40ODY3IDQuNTg5MzkgMTQuMzAyNCA1LjM0NTc2IDE0Ljc1MzRMNy4zMzk5OCAxNS45NDI0VjE3LjMyNjJDNy4zMzk5OCAxNy43ODY0IDcuNzEzMDggMTguMTU5NSA4LjE3MzMyIDE4LjE1OTVIMTMuODA4OEMxNC4yNjkgMTguMTU5NSAxNC42NDIxIDE3Ljc4NjQgMTQuNjQyMSAxNy4zMjYyVjE2Ljc5MzhDMTUuNzM4MSAxNS43MTkgMTYuMzg1IDE0LjI3MjggMTYuNDYwMyAxMi43NDdDMTYuNDY0NiAxMi42NiAxNi40NjcgMTIuNTcyOCAxNi40Njc2IDEyLjQ4NTRMMTYuNDY3NyAxMi40NDY3TDE2LjQ2NzYgOC4wMTk4M0MxNi40Njc2IDcuMzQ1MDQgMTUuOTI1MiA2Ljc5NjkzIDE1LjI1MjUgNi43ODc3MUwxNS4yMzUzIDYuNzg3NTlDMTUuMTI1IDYuNzg3NTkgMTUuMDE4IDYuODAyMSAxNC45MTYyIDYuODI5MzFWOS42MDEzNkMxNC45MTYyIDkuODUzNDIgMTQuNzExOSAxMC4wNTc3IDE0LjQ1OTggMTAuMDU3N0MxNC4yMDc4IDEwLjA1NzcgMTQuMDAzNCA5Ljg1MzQxIDE0LjAwMzQgOS42MDEzNlY3Ljk4OTg1QzE0LjAwMzIgNy45OTk4MiAxNC4wMDMxIDguMDA5ODEgMTQuMDAzMSA4LjAxOTgzTDE0LjAwMzQgOS42MDEzNkwxNC4wMDI1IDYuNzExNUMxNC4wMDI1IDYuNDQ5NzQgMTMuOTIwOSA2LjIwNzA1IDEzLjc4MTggNi4wMDc0OEMxMy41NjIgNS42OTI0MiAxMy4xOTg5IDUuNDg0ODMgMTIuNzg3IDUuNDc5MzdMMTIuNzcwMyA1LjQ3OTI2QzEyLjY1ODggNS40NzkyNiAxMi41NTA3IDUuNDk0MDggMTIuNDQ3OSA1LjUyMTg2WiIgZmlsbD0iIzFEMUMyMyIvPgo8L3N2Zz4="), auto'
1411
- },
1452
+ // cursors: {
1453
+ // grab: 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMC40ODczIDIuNjIzNzhDOS45MDczMSAyLjYyMzc4IDkuNDM3MTMgMy4wOTM5NiA5LjQzNzEzIDMuNjczOTZWNS4xNDM3NkM5LjM5NDI4IDQuNDAyNzQgOC43Nzk3OCAzLjgxNTA0IDguMDI4MDIgMy44MTUwNEM3LjI0ODQ4IDMuODE1MDQgNi42MTY1MyA0LjQ0Njk5IDYuNjE2NTMgNS4yMjY1M1YxMS44Mjg5TDUuNjc0MTggMTEuMDA0OUM1LjE1NDg3IDEwLjU1MDkgNC40MDk1IDEwLjQ2MzYgMy43OTkzOCAxMC43ODU1TDMuNjk2OTQgMTAuODM5NkMzLjA2MjE3IDExLjE3NDUgMi45MjI2IDEyLjAyMjggMy40MTY2MiAxMi41NDM0TDcuMzM5NTkgMTYuNjc3NVYxNy4zMjU5QzcuMzM5NTkgMTcuNzg2MiA3LjcxMjY5IDE4LjE1OTMgOC4xNzI5MiAxOC4xNTkzSDEzLjgwODRDMTQuMjY4NyAxOC4xNTkzIDE0LjY0MTcgMTcuNzg2MiAxNC42NDE3IDE3LjMyNTlWMTYuNzkzNUMxNS44MDk0IDE1LjY0ODUgMTYuNDY3MyAxNC4wODE5IDE2LjQ2NzMgMTIuNDQ2NVYxMS40OTY3TDE2LjQ2NzEgNi42MzY4NUMxNi40NjcxIDUuOTU2MyAxNS45MTU0IDUuNDA0NjEgMTUuMjM0OCA1LjQwNDYxQzE0LjU1NDMgNS40MDQ2MSAxNC4wMDI2IDUuOTU2MyAxNC4wMDI2IDYuNjM2ODVMMTQuMDAyMSA1LjA0NzI4QzE0LjAwMjEgNC4zNjY3MyAxMy40NTA0IDMuODE1MDQgMTIuNzY5OCAzLjgxNTA0QzEyLjA4OTMgMy44MTUwNCAxMS41Mzc2IDQuMzY2NzMgMTEuNTM3NiA1LjA0NzI4TDExLjUzNzUgMy42NzM5NUMxMS41Mzc1IDMuMDkzOTYgMTEuMDY3MyAyLjYyMzc4IDEwLjQ4NzMgMi42MjM3OFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3NCAxLjM3NDAyQzExLjM2MTIgMS4zNzQwMiAxMi4xMjExIDEuODYxMTggMTIuNTEwNSAyLjU3ODY4QzEyLjU5NTggMi41Njk4MyAxMi42ODIzIDIuNTY1MjggMTIuNzcgMi41NjUyOEMxMy44Mjc4IDIuNTY1MjggMTQuNzMxMSAzLjIyNzAxIDE1LjA4ODUgNC4xNTkxMUMxNS4xMzcgNC4xNTYyOSAxNS4xODU4IDQuMTU0ODYgMTUuMjM1IDQuMTU0ODZDMTYuNjA1OSA0LjE1NDg2IDE3LjcxNzIgNS4yNjYxOSAxNy43MTcyIDYuNjM3MDlMMTcuNzE3NCAxMi40NDY3QzE3LjcxNzQgMTQuMjM1NSAxNy4wNjQ0IDE1Ljk1NTkgMTUuODkxOSAxNy4yOTA0VjE3LjMyNjJDMTUuODkxOSAxOC40NzY4IDE0Ljk1OTEgMTkuNDA5NSAxMy44MDg1IDE5LjQwOTVIOC4xNzMwNkM3LjAyMjQ3IDE5LjQwOTUgNi4wODk3MyAxOC40NzY4IDYuMDg5NzMgMTcuMzI2MlYxNy4xNzY0TDIuNTEwMDMgMTMuNDA0MUMxLjQ0NTk5IDEyLjI4MjggMS43NDY2IDEwLjQ1NTUgMy4xMTM3OSA5LjczNDI0TDMuMjE2MjQgOS42ODAxOUMzLjg5MTY4IDkuMzIzODMgNC42NjE4NSA5LjI1NDAxIDUuMzY2NjYgOS40NTE5OFY1LjIyNjc4QzUuMzY2NjYgMy43NTY4NyA2LjU1ODI2IDIuNTY1MjggOC4wMjgxNiAyLjU2NTI4QzguMTcyOTMgMi41NjUyOCA4LjMxNDk5IDIuNTc2ODQgOC40NTM0NyAyLjU5OTA3QzguODM5NDMgMS44NzA0MiA5LjYwNTQ2IDEuMzc0MDIgMTAuNDg3NCAxLjM3NDAyWk0xMi40NDc2IDMuODU3ODdWOS40NzY0NkMxMi40NDc2IDkuNzI4NTIgMTIuMjQzMyA5LjkzMjg1IDExLjk5MTMgOS45MzI4NUMxMS43MzkyIDkuOTMyODUgMTEuNTM0OSA5LjcyODUyIDExLjUzNDkgOS40NzY0NlYzLjc5NjU1QzExLjUzNDkgMy43Nzk1NiAxMS41MzU4IDMuNzYyNzcgMTEuNTM3NiAzLjc0NjI2VjMuNjc0MkMxMS41Mzc2IDMuNDMyODIgMTEuNDU2MiAzLjIxMDQ2IDExLjMxOTMgMy4wMzMwOUMxMS4xMjcyIDIuNzg0MjggMTAuODI2MSAyLjYyNDAyIDEwLjQ4NzQgMi42MjQwMkMxMC4xMjM4IDIuNjI0MDIgOS44MDMzMiAyLjgwODg2IDkuNjE0ODMgMy4wODk3QzkuNTAyNjkgMy4yNTY3OSA5LjQzNzI2IDMuNDU3ODUgOS40MzcyNiAzLjY3NDJWMy43ODU3M0M5LjQzNzM1IDMuNzg5MzMgOS40MzczOSAzLjc5Mjk0IDkuNDM3MzkgMy43OTY1NVY5LjkwMTdDOS40MzczOSAxMC4xNTM3IDkuMjMzMDYgMTAuMzU4MSA4Ljk4MTAxIDEwLjM1ODFDOC43Mjg5NSAxMC4zNTgxIDguNTI0NjIgMTAuMTUzNyA4LjUyNDYyIDkuOTAxN1YzLjkwNTA3QzguNDE3NzMgMy44NjQ5IDguMzA0NjggMy44MzczMiA4LjE4NzI2IDMuODI0MTVDOC4xMzUwNCAzLjgxODI5IDguMDgxOTUgMy44MTUyOCA4LjAyODE2IDMuODE1MjhDNy4yNDg2MSAzLjgxNTI4IDYuNjE2NjYgNC40NDcyMyA2LjYxNjY2IDUuMjI2NzhWMTEuODI5Mkw1LjY3NDMxIDExLjAwNTJDNS41Nzg2OCAxMC45MjE2IDUuNDc1MzcgMTAuODUwNCA1LjM2NjY2IDEwLjc5MTlDNC44ODUwNiAxMC41MzI5IDQuMjk3MjggMTAuNTIzMSAzLjc5OTUyIDEwLjc4NThMMy42OTcwNyAxMC44Mzk4QzMuMDYyMzEgMTEuMTc0NyAyLjkyMjczIDEyLjAyMzEgMy40MTY3NSAxMi41NDM3TDcuMzM5NzMgMTYuNjc3N1YxNy4zMjYyQzcuMzM5NzMgMTcuNzg2NCA3LjcxMjgyIDE4LjE1OTUgOC4xNzMwNiAxOC4xNTk1SDEzLjgwODVDMTQuMjY4OCAxOC4xNTk1IDE0LjY0MTkgMTcuNzg2NCAxNC42NDE5IDE3LjMyNjJWMTYuNzkzOEMxNS43Mzc5IDE1LjcxOSAxNi4zODQ3IDE0LjI3MjggMTYuNDYgMTIuNzQ3QzE2LjQ2NDEgMTIuNjY0MSAxNi40NjY1IDEyLjU4MDkgMTYuNDY3MiAxMi40OTc1TDE2LjQ2NzQgMTIuNDQ2N0wxNi40NjcyIDYuNjM3MDlDMTYuNDY3MiA1Ljk2MjMgMTUuOTI0OCA1LjQxNDE5IDE1LjI1MjIgNS40MDQ5N0wxNS4yMzUgNS40MDQ4NkMxNS4xMjQ2IDUuNDA0ODYgMTUuMDE3NyA1LjQxOTM2IDE0LjkxNTkgNS40NDY1NlY5LjYwMjI2QzE0LjkxNTkgOS44NTQzMSAxNC43MTE2IDEwLjA1ODYgMTQuNDU5NSAxMC4wNTg2QzE0LjIwNzUgMTAuMDU4NiAxNC4wMDMxIDkuODU0MzEgMTQuMDAzMSA5LjYwMjI2VjYuNjA1MTRDMTQuMDAyOSA2LjYxNTc2IDE0LjAwMjcgNi42MjY0MSAxNC4wMDI3IDYuNjM3MDlWOS4yNzcwNUwxNC4wMDIyIDUuMDQ3NTJDMTQuMDAyMiA0Ljg2OTEzIDEzLjk2NDMgNC42OTk2IDEzLjg5NjEgNC41NDY1M0MxMy43MDY0IDQuMTIwNzIgMTMuMjgyMiAzLjgyMjM1IDEyLjc4NzYgMy44MTU0MUwxMi43NyAzLjgxNTI4QzEyLjY1ODQgMy44MTUyOCAxMi41NTA0IDMuODMwMSAxMi40NDc2IDMuODU3ODdaIiBmaWxsPSIjMUQxQzIzIi8+Cjwvc3ZnPg=="), auto',
1454
+ // grabbing:
1455
+ // 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02LjYxODE3IDUuNTk4NzVDNi42MTgxNyA0LjgxOTIgNy4yNTAxMiA0LjE4NzI2IDguMDI5NjcgNC4xODcyNkM4Ljc3ODczIDQuMTg3MjYgOS4zOTE1MiA0Ljc3MDc1IDkuNDM4MjkgNS41MDgwMUM5LjQ1OTkyIDQuOTQ3MSA5LjkyMTQ3IDQuNDk5MDIgMTAuNDg3NyA0LjQ5OTAyQzExLjA2NzcgNC40OTkwMiAxMS41Mzc4IDQuOTY5MiAxMS41Mzc4IDUuNTQ5MTlWOC43NjI0NkwxMS41Mzc5IDYuNzExNUMxMS41Mzc5IDYuMDMwOTUgMTIuMDg5NiA1LjQ3OTI2IDEyLjc3MDIgNS40NzkyNkMxMy40NTA3IDUuNDc5MjYgMTQuMDAyNCA2LjAzMDk1IDE0LjAwMjQgNi43MTE1TDE0LjAwMjQgOC43NjI0NkwxNC4wMDI5IDguMDE5ODNDMTQuMDAyOSA3LjMzOTI5IDE0LjU1NDYgNi43ODc1OSAxNS4yMzUyIDYuNzg3NTlDMTUuOTE1NyA2Ljc4NzU5IDE2LjQ2NzQgNy4zMzkyOCAxNi40Njc0IDguMDE5ODNWMTEuNDk3TDE2LjQ2NzUgMTIuNDQ2N0MxNi40Njc1IDE0LjA4MjEgMTUuODA5NiAxNS42NDg3IDE0LjY0MiAxNi43OTM4VjE3LjMyNjJDMTQuNjQyIDE3Ljc4NjQgMTQuMjY4OSAxOC4xNTk1IDEzLjgwODcgMTguMTU5NUg4LjE3MzE3QzcuNzEyOTMgMTguMTU5NSA3LjMzOTg0IDE3Ljc4NjQgNy4zMzk4NCAxNy4zMjYyVjE1Ljk0MjRMNS4zNDU2MiAxNC43NTM0QzQuNTg5MjQgMTQuMzAyNCA0LjEyNTkxIDEzLjQ4NjcgNC4xMjU4OSAxMi42MDYxTDQuMTI1ODMgOS4yODM4M0M0LjEyNTgyIDguOTU0MjcgNC4zMjAwMyA4LjY1NTY2IDQuNjIxMjkgOC41MjIwNUw2LjYxODE3IDcuNjM2MzRWNS41OTg3NVoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3OCAzLjI0OTAyQzExLjI3OTYgMy4yNDkwMiAxMS45Nzc4IDMuNjQ5MDIgMTIuMzkxNyA0LjI1Nzk2QzEyLjUxNTEgNC4yMzkwNiAxMi42NDE2IDQuMjI5MjYgMTIuNzcwMyA0LjIyOTI2QzEzLjcyMjQgNC4yMjkyNiAxNC41NDkzIDQuNzY1MzEgMTQuOTY1NyA1LjU1MjA3QzE1LjA1NDMgNS41NDI1IDE1LjE0NDIgNS41Mzc1OSAxNS4yMzUzIDUuNTM3NTlDMTYuNjA2MiA1LjUzNzU5IDE3LjcxNzYgNi42NDg5MyAxNy43MTc2IDguMDE5ODNMMTcuNzE3NyAxMi40NDY3QzE3LjcxNzcgMTQuMjM1NSAxNy4wNjQ3IDE1Ljk1NTkgMTUuODkyMSAxNy4yOTA0VjE3LjMyNjJDMTUuODkyMSAxOC40NzY4IDE0Ljk1OTQgMTkuNDA5NSAxMy44MDg4IDE5LjQwOTVIOC4xNzMzMkM3LjAyMjczIDE5LjQwOTUgNi4wODk5OCAxOC40NzY4IDYuMDg5OTggMTcuMzI2MlYxNi42NTI0TDQuNzA1NjMgMTUuODI3QzMuNTcxMDYgMTUuMTUwNSAyLjg3NjA3IDEzLjkyNzEgMi44NzYwNCAxMi42MDYxTDIuODc1OTggOS4yODM4NUMyLjg3NTk2IDguNDU5OTYgMy4zNjE0OSA3LjcxMzQ1IDQuMTE0NjIgNy4zNzk0TDUuMzY4MzIgNi44MjMzM1Y1LjU5ODc1QzUuMzY4MzIgNC4xMjg4NSA2LjU1OTkxIDIuOTM3MjYgOC4wMjk4MiAyLjkzNzI2QzguNjA4MzEgMi45MzcyNiA5LjE0MzU1IDMuMTIxNyA5LjU4MDA1IDMuNDM1MDVDOS44NTg1MyAzLjMxNTMyIDEwLjE2NTQgMy4yNDkwMiAxMC40ODc4IDMuMjQ5MDJaTTEyLjQ0NzkgNS41MjE4NlY5LjQ3NTU3QzEyLjQ0NzkgOS43Mjc2MiAxMi4yNDM2IDkuOTMxOTUgMTEuOTkxNiA5LjkzMTk1QzExLjc1NjggOS45MzE5NSAxMS41NjM0IDkuNzU0NjUgMTEuNTM4IDkuNTI2NjNDMTEuNTM2MSA5LjUwOTg3IDExLjUzNTIgOS40OTI4MyAxMS41MzUyIDkuNDc1NTdWNS40NzE1OEMxMS41MTU0IDUuMjAwODMgMTEuMzkzIDQuOTU4NTggMTEuMjA2NiA0Ljc4MzU4QzExLjAxODggNC42MDcxMSAxMC43NjU5IDQuNDk5MDIgMTAuNDg3OCA0LjQ5OTAyQzEwLjQ3NjYgNC40OTkwMiAxMC40NjU0IDQuNDk5MTkgMTAuNDU0MiA0LjQ5OTU0QzkuOTAzNDcgNC41MTY4NCA5LjQ1OTY0IDQuOTU4MjQgOS40Mzg0NCA1LjUwODAxQzkuNDM4MiA1LjUwNDMgOS40Mzc5NSA1LjUwMDU4IDkuNDM3NjkgNS40OTY4OFY5LjkwMjQzQzkuNDM3NjkgMTAuMTU0NSA5LjIzMzM2IDEwLjM1ODggOC45ODEzMSAxMC4zNTg4QzguNzI5MjUgMTAuMzU4OCA4LjUyNDkyIDEwLjE1NDUgOC41MjQ5MiA5LjkwMjQzVjQuMjc2NTNDOC4zNzA4NiA0LjIxODgyIDguMjA0MDIgNC4xODcyNiA4LjAyOTgyIDQuMTg3MjZDNy4yNTAyNyA0LjE4NzI2IDYuNjE4MzIgNC44MTkyIDYuNjE4MzIgNS41OTg3NUw2LjYxODI3IDkuOTc1OTlDNi42MTgyNyAxMC4yMjggNi40MTM5NCAxMC40MzI0IDYuMTYxODkgMTAuNDMyNEM1LjkwOTgzIDEwLjQzMjQgNS43MDU1IDEwLjIyOCA1LjcwNTUgOS45NzU5OVY4LjA0MTIyTDQuNjIxNDQgOC41MjIwNUM0LjMyMDE4IDguNjU1NjYgNC4xMjU5NyA4Ljk1NDI3IDQuMTI1OTggOS4yODM4M0w0LjEyNjA0IDEyLjYwNjFDNC4xMjYwNiAxMy40ODY3IDQuNTg5MzkgMTQuMzAyNCA1LjM0NTc2IDE0Ljc1MzRMNy4zMzk5OCAxNS45NDI0VjE3LjMyNjJDNy4zMzk5OCAxNy43ODY0IDcuNzEzMDggMTguMTU5NSA4LjE3MzMyIDE4LjE1OTVIMTMuODA4OEMxNC4yNjkgMTguMTU5NSAxNC42NDIxIDE3Ljc4NjQgMTQuNjQyMSAxNy4zMjYyVjE2Ljc5MzhDMTUuNzM4MSAxNS43MTkgMTYuMzg1IDE0LjI3MjggMTYuNDYwMyAxMi43NDdDMTYuNDY0NiAxMi42NiAxNi40NjcgMTIuNTcyOCAxNi40Njc2IDEyLjQ4NTRMMTYuNDY3NyAxMi40NDY3TDE2LjQ2NzYgOC4wMTk4M0MxNi40Njc2IDcuMzQ1MDQgMTUuOTI1MiA2Ljc5NjkzIDE1LjI1MjUgNi43ODc3MUwxNS4yMzUzIDYuNzg3NTlDMTUuMTI1IDYuNzg3NTkgMTUuMDE4IDYuODAyMSAxNC45MTYyIDYuODI5MzFWOS42MDEzNkMxNC45MTYyIDkuODUzNDIgMTQuNzExOSAxMC4wNTc3IDE0LjQ1OTggMTAuMDU3N0MxNC4yMDc4IDEwLjA1NzcgMTQuMDAzNCA5Ljg1MzQxIDE0LjAwMzQgOS42MDEzNlY3Ljk4OTg1QzE0LjAwMzIgNy45OTk4MiAxNC4wMDMxIDguMDA5ODEgMTQuMDAzMSA4LjAxOTgzTDE0LjAwMzQgOS42MDEzNkwxNC4wMDI1IDYuNzExNUMxNC4wMDI1IDYuNDQ5NzQgMTMuOTIwOSA2LjIwNzA1IDEzLjc4MTggNi4wMDc0OEMxMy41NjIgNS42OTI0MiAxMy4xOTg5IDUuNDg0ODMgMTIuNzg3IDUuNDc5MzdMMTIuNzcwMyA1LjQ3OTI2QzEyLjY1ODggNS40NzkyNiAxMi41NTA3IDUuNDk0MDggMTIuNDQ3OSA1LjUyMTg2WiIgZmlsbD0iIzFEMUMyMyIvPgo8L3N2Zz4="), auto',
1456
+ // },
1412
1457
  fromNodeJSON(node, json, isFirstCreate) {
1413
1458
  initFormDataFromJSON(node, json, isFirstCreate);
1414
1459
  return;
@@ -1509,6 +1554,9 @@ var WorkflowLinesManager = class {
1509
1554
  getAllLines() {
1510
1555
  return this.entityManager.getEntities(WorkflowLineEntity);
1511
1556
  }
1557
+ getAllAvailableLines() {
1558
+ return this.getAllLines().filter((l) => !l.isDrawing && !l.isHidden);
1559
+ }
1512
1560
  hasLine(portInfo) {
1513
1561
  return !!this.entityManager.getEntityById(
1514
1562
  WorkflowLineEntity.portInfoToLineId(portInfo)
@@ -1530,7 +1578,7 @@ var WorkflowLinesManager = class {
1530
1578
  return this.createLine(newPortInfo);
1531
1579
  }
1532
1580
  createLine(options) {
1533
- const { from, to, drawingTo, fromPort, toPort, data } = options;
1581
+ const { from, to, drawingTo, fromPort, drawingFrom, toPort, data } = options;
1534
1582
  const available = Boolean(from && to);
1535
1583
  const key = options.key || WorkflowLineEntity.portInfoToLineId(options);
1536
1584
  let line = this.entityManager.getEntityById(key);
@@ -1539,12 +1587,12 @@ var WorkflowLinesManager = class {
1539
1587
  line.validate();
1540
1588
  return line;
1541
1589
  }
1542
- const fromNode = this.entityManager.getEntityById(from)?.getData(WorkflowNodeLinesData);
1590
+ const fromNode = from ? this.entityManager.getEntityById(from).getData(WorkflowNodeLinesData) : void 0;
1543
1591
  const toNode = to ? this.entityManager.getEntityById(to).getData(WorkflowNodeLinesData) : void 0;
1544
- if (!fromNode) {
1592
+ if (!fromNode && !toNode) {
1545
1593
  return;
1546
1594
  }
1547
- this.isDrawing = Boolean(drawingTo);
1595
+ this.isDrawing = Boolean(drawingTo || drawingFrom);
1548
1596
  line = this.entityManager.createEntity(WorkflowLineEntity, {
1549
1597
  id: key,
1550
1598
  document: this.document,
@@ -1554,16 +1602,15 @@ var WorkflowLinesManager = class {
1554
1602
  toPort,
1555
1603
  to,
1556
1604
  drawingTo,
1605
+ drawingFrom,
1557
1606
  data
1558
1607
  });
1559
1608
  this.registerData(line);
1560
- fromNode.addLine(line);
1609
+ fromNode?.addLine(line);
1561
1610
  toNode?.addLine(line);
1562
1611
  line.onDispose(() => {
1563
- if (drawingTo) {
1564
- this.isDrawing = false;
1565
- }
1566
- fromNode.removeLine(line);
1612
+ this.isDrawing = false;
1613
+ fromNode?.removeLine(line);
1567
1614
  toNode?.removeLine(line);
1568
1615
  });
1569
1616
  line.onDispose(() => {
@@ -1686,7 +1733,7 @@ var WorkflowLinesManager = class {
1686
1733
  return this.lineColor.default;
1687
1734
  }
1688
1735
  canAddLine(fromPort, toPort, silent) {
1689
- if (fromPort === toPort || fromPort.node === toPort.node || fromPort.portType !== "output" || toPort.portType !== "input" || toPort.disabled) {
1736
+ if (fromPort === toPort || fromPort.node === toPort.node || fromPort.portType !== "output" || toPort.portType !== "input" || fromPort.disabled || toPort.disabled) {
1690
1737
  return false;
1691
1738
  }
1692
1739
  const fromCanAdd = fromPort.node.getNodeRegistry().canAddLine;
@@ -1714,8 +1761,8 @@ var WorkflowLinesManager = class {
1714
1761
  }
1715
1762
  return true;
1716
1763
  }
1717
- canReset(fromPort, oldToPort, newToPort) {
1718
- if (this.options && this.options.canResetLine && !this.options.canResetLine(fromPort, oldToPort, newToPort, this)) {
1764
+ canReset(oldLine, newLineInfo) {
1765
+ if (this.options && this.options.canResetLine && !this.options.canResetLine(oldLine, newLineInfo, this)) {
1719
1766
  return false;
1720
1767
  }
1721
1768
  return true;
@@ -1724,9 +1771,14 @@ var WorkflowLinesManager = class {
1724
1771
  * 根据鼠标位置找到 port
1725
1772
  * @param pos
1726
1773
  */
1727
- getPortFromMousePos(pos) {
1774
+ getPortFromMousePos(pos, portType) {
1728
1775
  const allNodes = this.getSortedNodes().reverse();
1729
- const allPorts = allNodes.map((node) => node.ports.allPorts).flat();
1776
+ const allPorts = allNodes.map((node) => {
1777
+ if (!portType) {
1778
+ return node.ports.allPorts;
1779
+ }
1780
+ return portType === "input" ? node.ports.inputPorts : node.ports.outputPorts;
1781
+ }).flat();
1730
1782
  const targetPort = allPorts.find((port) => port.isHovered(pos.x, pos.y));
1731
1783
  if (targetPort) {
1732
1784
  const containNodes = this.getContainNodesFromMousePos(pos);
@@ -2946,18 +2998,30 @@ var WorkflowDragService = class {
2946
2998
  line.highlightColor = color;
2947
2999
  this.hoverService.clearHovered();
2948
3000
  }
2949
- handleDragOnNode(toNode, fromPort, line, toPort, originLine) {
2950
- if (toPort && (originLine?.toPort === toPort || toPort.portType === "input" && this.linesManager.canAddLine(fromPort, toPort, true))) {
2951
- this.hoverService.updateHoveredKey(toPort.id);
2952
- line.setToPort(toPort);
3001
+ checkDraggingPort(isDrawingTo, line, draggingNode, draggingPort, originLine) {
3002
+ let successDrawing = false;
3003
+ if (isDrawingTo) {
3004
+ successDrawing = !!(draggingPort && // 同一条线条则不用在判断 canAddLine
3005
+ (originLine?.toPort === draggingPort || draggingPort.portType === "input" && this.linesManager.canAddLine(line.fromPort, draggingPort, true)));
3006
+ } else {
3007
+ successDrawing = !!(draggingPort && // 同一条线条则不用在判断 canAddLine
3008
+ (originLine?.fromPort === draggingPort || draggingPort.portType === "output" && this.linesManager.canAddLine(draggingPort, line.toPort, true)));
3009
+ }
3010
+ if (successDrawing) {
3011
+ this.hoverService.updateHoveredKey(draggingPort.id);
3012
+ if (isDrawingTo) {
3013
+ line.setToPort(draggingPort);
3014
+ } else {
3015
+ line.setFromPort(draggingPort);
3016
+ }
2953
3017
  this._onDragLineEventEmitter.fire({
2954
3018
  type: "onDrag",
2955
- onDragNodeId: toNode.id
3019
+ onDragNodeId: draggingNode.id
2956
3020
  });
2957
3021
  return {
2958
3022
  hasError: false
2959
3023
  };
2960
- } else if (this.isContainer(toNode)) {
3024
+ } else if (this.isContainer(draggingNode)) {
2961
3025
  return {
2962
3026
  hasError: false
2963
3027
  };
@@ -3023,16 +3087,18 @@ var WorkflowDragService = class {
3023
3087
  * @param opts
3024
3088
  * @param event
3025
3089
  */
3026
- async startDrawingLine(fromPort, event, originLine) {
3027
- const isFromInActivePort = !originLine && fromPort.isErrorPort() && fromPort.disabled;
3028
- if (originLine?.disabled || isFromInActivePort || this.playgroundConfig.readonly || this.playgroundConfig.disabled) {
3090
+ async startDrawingLine(port, event, originLine) {
3091
+ const isDrawingTo = port.portType === "output";
3092
+ const isInActivePort = !originLine && port.isErrorPort() && port.disabled;
3093
+ if (originLine?.disabled || isInActivePort || this.playgroundConfig.readonly || this.playgroundConfig.disabled) {
3029
3094
  return { dragSuccess: false, newLine: void 0 };
3030
3095
  }
3031
3096
  this.selectService.clear();
3032
3097
  const config = this.playgroundConfig;
3033
3098
  const deferred = new PromiseDeferred();
3034
3099
  const preCursor = config.cursor;
3035
- let line, toPort, toNode, lineErrorReset = false;
3100
+ let line;
3101
+ let newLineInfo;
3036
3102
  const startTime = Date.now();
3037
3103
  let dragSuccess = false;
3038
3104
  const dragger = new PlaygroundDrag({
@@ -3043,16 +3109,29 @@ var WorkflowDragService = class {
3043
3109
  }
3044
3110
  dragSuccess = true;
3045
3111
  const pos = config.getPosFromMouseEvent(event);
3046
- line = this.linesManager.createLine({
3047
- from: fromPort.node.id,
3048
- fromPort: fromPort.portID,
3049
- data: originLine?.lineData,
3050
- drawingTo: {
3051
- x: pos.x,
3052
- y: pos.y,
3053
- location: fromPort.location === "right" ? "left" : "top"
3054
- }
3055
- });
3112
+ if (isDrawingTo) {
3113
+ line = this.linesManager.createLine({
3114
+ from: port.node.id,
3115
+ fromPort: port.portID,
3116
+ data: originLine?.lineData,
3117
+ drawingTo: {
3118
+ x: pos.x,
3119
+ y: pos.y,
3120
+ location: port.location === "right" ? "left" : "top"
3121
+ }
3122
+ });
3123
+ } else {
3124
+ line = this.linesManager.createLine({
3125
+ to: port.node.id,
3126
+ toPort: port.portID,
3127
+ data: originLine?.lineData,
3128
+ drawingFrom: {
3129
+ x: pos.x,
3130
+ y: pos.y,
3131
+ location: port.location === "left" ? "right" : "bottom"
3132
+ }
3133
+ });
3134
+ }
3056
3135
  if (!line) {
3057
3136
  return;
3058
3137
  }
@@ -3063,49 +3142,15 @@ var WorkflowDragService = class {
3063
3142
  if (!line) {
3064
3143
  return;
3065
3144
  }
3066
- lineErrorReset = false;
3067
3145
  const dragPos = config.getPosFromMouseEvent(e);
3068
- toNode = this.linesManager.getNodeFromMousePos(dragPos);
3069
- toPort = this.linesManager.getPortFromMousePos(dragPos);
3070
- if (!toPort) {
3071
- line.setToPort(void 0);
3072
- } else if (!this.linesManager.canAddLine(fromPort, toPort, true)) {
3073
- line.highlightColor = this.linesManager.lineColor.error;
3074
- lineErrorReset = true;
3075
- line.setToPort(void 0);
3076
- } else {
3077
- line.setToPort(toPort);
3078
- }
3079
- this._onDragLineEventEmitter.fire({
3080
- type: "onDrag"
3081
- });
3082
- this.setLineColor(line, originLine?.lockedColor || this.linesManager.lineColor.drawing);
3083
- if (toNode && this.canBuildContainerLine(toNode, dragPos)) {
3084
- toPort = this.getNearestPort(toNode, dragPos);
3085
- const { hasError } = this.handleDragOnNode(toNode, fromPort, line, toPort, originLine);
3086
- lineErrorReset = hasError;
3087
- }
3088
- if (line.toPort) {
3089
- line.drawingTo = {
3090
- x: line.toPort.point.x,
3091
- y: line.toPort.point.y,
3092
- location: line.toPort.location
3093
- };
3094
- } else {
3095
- line.drawingTo = {
3096
- x: dragPos.x,
3097
- y: dragPos.y,
3098
- location: reverseLocation(line.fromPort.location)
3099
- };
3100
- }
3101
- originLine?.validate();
3102
- line.validate();
3146
+ newLineInfo = this.updateDrawingLine(isDrawingTo, line, dragPos, originLine);
3103
3147
  },
3104
3148
  // eslint-disable-next-line complexity
3105
3149
  onDragEnd: async (e) => {
3106
3150
  const dragPos = config.getPosFromMouseEvent(e);
3107
3151
  const onDragLineEndCallbacks = Array.from(this._onDragLineEndCallbacks.values());
3108
3152
  config.updateCursor(preCursor);
3153
+ const { fromPort, toPort, hasError } = newLineInfo || {};
3109
3154
  await Promise.all(
3110
3155
  onDragLineEndCallbacks.map(
3111
3156
  (callback) => callback({
@@ -3130,36 +3175,32 @@ var WorkflowDragService = class {
3130
3175
  deferred.resolve({ dragSuccess });
3131
3176
  };
3132
3177
  if (dragSuccess) {
3133
- if (originLine && originLine.toPort === toPort) {
3178
+ if (originLine && originLine.toPort === toPort && originLine.fromPort === fromPort) {
3134
3179
  return end();
3135
3180
  }
3136
- if (toPort && toPort.portType !== "input") {
3181
+ if (toPort && toPort.portType !== "input" || fromPort && fromPort.portType !== "output") {
3137
3182
  return end();
3138
3183
  }
3139
- const newLineInfo = toPort ? {
3184
+ const newLinePortInfo = toPort && fromPort ? {
3140
3185
  from: fromPort.node.id,
3141
3186
  fromPort: fromPort.portID,
3142
3187
  to: toPort.node.id,
3143
3188
  toPort: toPort.portID,
3144
3189
  data: originLine?.lineData
3145
3190
  } : void 0;
3146
- const isReset = originLine && toPort;
3147
- if (isReset && !this.linesManager.canReset(
3148
- originLine.fromPort,
3149
- originLine.toPort,
3150
- toPort
3151
- )) {
3191
+ const isReset = originLine && newLinePortInfo;
3192
+ if (isReset && !this.linesManager.canReset(originLine, newLinePortInfo)) {
3152
3193
  return end();
3153
3194
  }
3154
- if (originLine && (!this.linesManager.canRemove(originLine, newLineInfo, false) || lineErrorReset)) {
3195
+ if (originLine && (!this.linesManager.canRemove(originLine, newLinePortInfo, false) || hasError)) {
3155
3196
  return end();
3156
3197
  } else {
3157
3198
  originLine?.dispose();
3158
3199
  }
3159
- if (!toPort || !this.linesManager.canAddLine(fromPort, toPort, false)) {
3200
+ if (!newLinePortInfo || !this.linesManager.canAddLine(fromPort, toPort, false)) {
3160
3201
  return end();
3161
3202
  }
3162
- const newLine = this.linesManager.createLine(newLineInfo);
3203
+ const newLine = this.linesManager.createLine(newLinePortInfo);
3163
3204
  if (!newLine) {
3164
3205
  end();
3165
3206
  }
@@ -3176,14 +3217,109 @@ var WorkflowDragService = class {
3176
3217
  await dragger.start(clientX, clientY, config);
3177
3218
  return deferred.promise;
3178
3219
  }
3220
+ updateDrawingLine(isDrawingTo, line, dragPos, originLine) {
3221
+ let hasError = false;
3222
+ const mouseNode = this.linesManager.getNodeFromMousePos(dragPos);
3223
+ let toNode;
3224
+ let toPort;
3225
+ let fromPort;
3226
+ let fromNode;
3227
+ if (isDrawingTo) {
3228
+ fromPort = line.fromPort;
3229
+ toNode = mouseNode;
3230
+ toPort = this.linesManager.getPortFromMousePos(dragPos, "input");
3231
+ if (toNode && this.canBuildContainerLine(toNode, dragPos)) {
3232
+ toPort = this.getNearestPort(toNode, dragPos, "input");
3233
+ hasError = this.checkDraggingPort(isDrawingTo, line, toNode, toPort, originLine).hasError;
3234
+ }
3235
+ if (!toPort) {
3236
+ line.setToPort(void 0);
3237
+ } else if (!this.linesManager.canAddLine(fromPort, toPort, true)) {
3238
+ hasError = true;
3239
+ line.setToPort(void 0);
3240
+ } else {
3241
+ line.setToPort(toPort);
3242
+ }
3243
+ if (line.toPort) {
3244
+ line.drawingTo = {
3245
+ x: line.toPort.point.x,
3246
+ y: line.toPort.point.y,
3247
+ location: line.toPort.location
3248
+ };
3249
+ } else {
3250
+ line.drawingTo = {
3251
+ x: dragPos.x,
3252
+ y: dragPos.y,
3253
+ location: reverseLocation(line.fromPort.location)
3254
+ };
3255
+ }
3256
+ } else {
3257
+ toPort = line.toPort;
3258
+ fromNode = mouseNode;
3259
+ fromPort = this.linesManager.getPortFromMousePos(dragPos, "output");
3260
+ if (fromNode && this.canBuildContainerLine(fromNode, dragPos)) {
3261
+ fromPort = this.getNearestPort(fromNode, dragPos, "output");
3262
+ hasError = this.checkDraggingPort(
3263
+ isDrawingTo,
3264
+ line,
3265
+ fromNode,
3266
+ fromPort,
3267
+ originLine
3268
+ ).hasError;
3269
+ }
3270
+ if (!fromPort) {
3271
+ line.setFromPort(void 0);
3272
+ } else if (!this.linesManager.canAddLine(fromPort, toPort, true)) {
3273
+ hasError = true;
3274
+ line.setFromPort(void 0);
3275
+ } else {
3276
+ line.setFromPort(fromPort);
3277
+ }
3278
+ if (line.fromPort) {
3279
+ line.drawingFrom = {
3280
+ x: line.fromPort.point.x,
3281
+ y: line.fromPort.point.y,
3282
+ location: line.fromPort.location
3283
+ };
3284
+ } else {
3285
+ line.drawingFrom = {
3286
+ x: dragPos.x,
3287
+ y: dragPos.y,
3288
+ location: reverseLocation(line.toPort.location)
3289
+ };
3290
+ }
3291
+ }
3292
+ this._onDragLineEventEmitter.fire({
3293
+ type: "onDrag"
3294
+ });
3295
+ if (hasError) {
3296
+ this.setLineColor(line, this.linesManager.lineColor.error);
3297
+ } else {
3298
+ this.setLineColor(line, originLine?.lockedColor || this.linesManager.lineColor.drawing);
3299
+ }
3300
+ originLine?.validate();
3301
+ line.validate();
3302
+ return {
3303
+ fromPort,
3304
+ toPort,
3305
+ hasError
3306
+ };
3307
+ }
3179
3308
  /**
3180
3309
  * 重新连接线条
3181
3310
  * @param line
3182
3311
  * @param e
3183
3312
  */
3184
3313
  async resetLine(line, e) {
3185
- const { fromPort } = line;
3186
- const { dragSuccess } = await this.startDrawingLine(fromPort, e, line);
3314
+ const { fromPort, toPort } = line;
3315
+ const mousePos = this.playgroundConfig.getPosFromMouseEvent(e);
3316
+ const distanceFrom = Point.getDistance(fromPort.point, mousePos);
3317
+ const distanceTo = Point.getDistance(toPort.point, mousePos);
3318
+ const { dragSuccess } = await this.startDrawingLine(
3319
+ distanceTo <= distanceFrom || !this.document.options.twoWayConnection ? fromPort : toPort,
3320
+ e,
3321
+ line
3322
+ );
3187
3323
  if (!dragSuccess) {
3188
3324
  this.selectService.select(line);
3189
3325
  }
@@ -3205,17 +3341,27 @@ var WorkflowDragService = class {
3205
3341
  return true;
3206
3342
  }
3207
3343
  const { padding, bounds } = node.transform;
3208
- const contentRect = new Rectangle8(bounds.x, bounds.y, padding.left * 2 / 3, bounds.height);
3209
- return contentRect.contains(mousePos.x, mousePos.y);
3344
+ const DEFAULT_DELTA = 10;
3345
+ const leftDelta = padding.left * 2 / 3 || DEFAULT_DELTA;
3346
+ const rightDelta = padding.right * 2 / 3 || DEFAULT_DELTA;
3347
+ const bottomDelta = padding.bottom * 2 / 3 || DEFAULT_DELTA;
3348
+ const topDelta = padding.top * 2 / 3 || DEFAULT_DELTA;
3349
+ const rectangles = [
3350
+ new Rectangle8(bounds.x, bounds.y, leftDelta, bounds.height),
3351
+ // left
3352
+ new Rectangle8(bounds.x, bounds.y, bounds.width, topDelta),
3353
+ // top
3354
+ new Rectangle8(bounds.x, bounds.y + bounds.height - bottomDelta, bounds.width, bottomDelta),
3355
+ // bottom
3356
+ new Rectangle8(bounds.x + bounds.width - rightDelta, bounds.y, rightDelta, bounds.height)
3357
+ // right
3358
+ ];
3359
+ return rectangles.some((rect) => rect.contains(mousePos.x, mousePos.y));
3210
3360
  }
3211
3361
  /** 获取最近的 port */
3212
- getNearestPort(node, mousePos) {
3362
+ getNearestPort(node, mousePos, portType = "input") {
3213
3363
  const portsData = node.ports;
3214
- const distanceSortedPorts = portsData.inputPorts.sort((a, b) => {
3215
- const aDistance = Math.abs(mousePos.y - a.point.y);
3216
- const bDistance = Math.abs(mousePos.y - b.point.y);
3217
- return aDistance - bDistance;
3218
- });
3364
+ const distanceSortedPorts = (portType === "input" ? portsData.inputPorts : portsData.outputPorts).sort((a, b) => Point.getDistance(mousePos, a.point) - Point.getDistance(mousePos, b.point));
3219
3365
  return distanceSortedPorts[0];
3220
3366
  }
3221
3367
  };
@@ -3487,8 +3633,8 @@ function useNodeRender(nodeFromProps) {
3487
3633
  }, []);
3488
3634
  const getExtInfo = useCallback(() => node.getExtInfo(), [node]);
3489
3635
  const updateExtInfo = useCallback(
3490
- (data) => {
3491
- node.updateExtInfo(data);
3636
+ (data, fullUpdate) => {
3637
+ node.updateExtInfo(data, fullUpdate);
3492
3638
  },
3493
3639
  [node]
3494
3640
  );
@@ -3523,7 +3669,7 @@ function useNodeRender(nodeFromProps) {
3523
3669
  if (form) {
3524
3670
  form.updateFormValues(values);
3525
3671
  } else {
3526
- updateExtInfo(values);
3672
+ updateExtInfo(values, true);
3527
3673
  }
3528
3674
  },
3529
3675
  node,