@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/index.js CHANGED
@@ -818,16 +818,8 @@ var WorkflowLineRenderData = class extends import_core7.EntityData {
818
818
  * WARNING: 这个方法,必须在 requestAnimationFrame / useLayoutEffect 中调用,否则会引起浏览器强制重排
819
819
  */
820
820
  updatePosition() {
821
- this.data.position.from = this.entity.from.ports.getOutputPoint(this.entity.info.fromPort);
822
- if (this.entity.info.drawingTo) {
823
- this.data.position.to = this.entity.info.drawingTo;
824
- } else {
825
- this.data.position.to = this.entity.to?.ports?.getInputPoint(this.entity.info.toPort) ?? {
826
- x: this.data.position.from.x,
827
- y: this.data.position.from.y,
828
- location: this.data.position.from.location === "right" ? "left" : "top"
829
- };
830
- }
821
+ this.data.position.from = this.entity.drawingFrom || this.entity.fromPort.point;
822
+ this.data.position.to = this.entity.drawingTo || this.entity.toPort.point;
831
823
  this.data.version = [
832
824
  this.lineType,
833
825
  this.data.position.from.x,
@@ -892,10 +884,11 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends import_core8.Entity
892
884
  to: opts.to,
893
885
  drawingTo: opts.drawingTo,
894
886
  fromPort: opts.fromPort,
887
+ drawingFrom: opts.drawingFrom,
895
888
  toPort: opts.toPort,
896
889
  data: opts.data
897
890
  });
898
- if (opts.drawingTo) {
891
+ if (opts.drawingTo || opts.drawingFrom) {
899
892
  this.isDrawing = true;
900
893
  }
901
894
  this.onEntityChange(() => {
@@ -1030,6 +1023,30 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends import_core8.Entity
1030
1023
  }
1031
1024
  this.fireChange();
1032
1025
  }
1026
+ setFromPort(fromPort) {
1027
+ if (!this.isDrawing) {
1028
+ throw new Error("[setFromPort] only support drawing line.");
1029
+ }
1030
+ if (this.fromPort === fromPort) {
1031
+ return;
1032
+ }
1033
+ const prePort = this.fromPort;
1034
+ if (fromPort && fromPort.portType === "output" && this.linesManager.canAddLine(fromPort, this.toPort, true)) {
1035
+ const { node, portID } = fromPort;
1036
+ this._from = node;
1037
+ this.info.drawingFrom = void 0;
1038
+ this.info.from = node.id;
1039
+ this.info.fromPort = portID;
1040
+ } else {
1041
+ this._from = void 0;
1042
+ this.info.from = void 0;
1043
+ this.info.fromPort = "";
1044
+ }
1045
+ if (prePort) {
1046
+ prePort.validate();
1047
+ }
1048
+ this.fireChange();
1049
+ }
1033
1050
  /**
1034
1051
  * 设置线条画线时的目标位置
1035
1052
  */
@@ -1046,6 +1063,22 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends import_core8.Entity
1046
1063
  this.fireChange();
1047
1064
  }
1048
1065
  }
1066
+ set drawingFrom(pos) {
1067
+ const oldDrawingFrom = this.info.drawingFrom;
1068
+ if (!pos) {
1069
+ this.info.drawingFrom = void 0;
1070
+ this.fireChange();
1071
+ return;
1072
+ }
1073
+ if (!oldDrawingFrom || pos.x !== oldDrawingFrom.x || pos.y !== oldDrawingFrom.y) {
1074
+ this.info.from = void 0;
1075
+ this.info.drawingFrom = pos;
1076
+ this.fireChange();
1077
+ }
1078
+ }
1079
+ get drawingFrom() {
1080
+ return this.info.drawingFrom;
1081
+ }
1049
1082
  /**
1050
1083
  * 获取线条正在画线的位置
1051
1084
  */
@@ -1084,6 +1117,9 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends import_core8.Entity
1084
1117
  return this.getData(WorkflowLineRenderData).calcDistance(pos);
1085
1118
  }
1086
1119
  get fromPort() {
1120
+ if (!this.from) {
1121
+ return void 0;
1122
+ }
1087
1123
  return this.from.ports.getPortEntityByKey("output", this.info.fromPort);
1088
1124
  }
1089
1125
  get toPort() {
@@ -1124,7 +1160,7 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends import_core8.Entity
1124
1160
  * @deprecated
1125
1161
  */
1126
1162
  get vertical() {
1127
- const fromLocation = this.fromPort.location;
1163
+ const fromLocation = this.fromPort?.location;
1128
1164
  const toLocation = this.toPort?.location;
1129
1165
  if (toLocation) {
1130
1166
  return toLocation === "top";
@@ -1150,7 +1186,7 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends import_core8.Entity
1150
1186
  initInfo(info) {
1151
1187
  if (!(0, import_lodash_es2.isEqual)(info, this.info)) {
1152
1188
  this.info = info;
1153
- this._from = this.document.getNode(info.from);
1189
+ this._from = info.from ? this.document.getNode(info.from) : void 0;
1154
1190
  this._to = info.to ? this.document.getNode(info.to) : void 0;
1155
1191
  this._lineData = info.data;
1156
1192
  this.fireChange();
@@ -1184,7 +1220,7 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends import_core8.Entity
1184
1220
  this._node = import_utils8.domUtils.createDivWithClass("gedit-flow-activity-line");
1185
1221
  this._node.dataset.testid = "sdk.workflow.canvas.line";
1186
1222
  this._node.dataset.lineId = this.id;
1187
- this._node.dataset.fromNodeId = this.from.id;
1223
+ this._node.dataset.fromNodeId = this.from?.id ?? "";
1188
1224
  this._node.dataset.fromPortId = this.fromPort?.id ?? "";
1189
1225
  this._node.dataset.toNodeId = this.to?.id ?? "";
1190
1226
  this._node.dataset.toPortId = this.toPort?.id ?? "";
@@ -1366,10 +1402,17 @@ var WorkflowHoverService = class {
1366
1402
  }
1367
1403
  /**
1368
1404
  * 获取被 hover 的节点或线条
1405
+ * @deprecated use 'someHovered' instead
1369
1406
  */
1370
1407
  get hoveredNode() {
1371
1408
  return this.entityManager.getEntityById(this.hoveredKey);
1372
1409
  }
1410
+ /**
1411
+ * 获取被 hover 的节点或线条
1412
+ */
1413
+ get someHovered() {
1414
+ return this.entityManager.getEntityById(this.hoveredKey);
1415
+ }
1373
1416
  };
1374
1417
  __decorateClass([
1375
1418
  (0, import_inversify2.inject)(import_core10.EntityManager)
@@ -1470,10 +1513,11 @@ function initFormDataFromJSON(node, json, isFirstCreate) {
1470
1513
  // src/workflow-document-option.ts
1471
1514
  var WorkflowDocumentOptions = Symbol("WorkflowDocumentOptions");
1472
1515
  var WorkflowDocumentOptionsDefault = {
1473
- cursors: {
1474
- grab: 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMC40ODczIDIuNjIzNzhDOS45MDczMSAyLjYyMzc4IDkuNDM3MTMgMy4wOTM5NiA5LjQzNzEzIDMuNjczOTZWNS4xNDM3NkM5LjM5NDI4IDQuNDAyNzQgOC43Nzk3OCAzLjgxNTA0IDguMDI4MDIgMy44MTUwNEM3LjI0ODQ4IDMuODE1MDQgNi42MTY1MyA0LjQ0Njk5IDYuNjE2NTMgNS4yMjY1M1YxMS44Mjg5TDUuNjc0MTggMTEuMDA0OUM1LjE1NDg3IDEwLjU1MDkgNC40MDk1IDEwLjQ2MzYgMy43OTkzOCAxMC43ODU1TDMuNjk2OTQgMTAuODM5NkMzLjA2MjE3IDExLjE3NDUgMi45MjI2IDEyLjAyMjggMy40MTY2MiAxMi41NDM0TDcuMzM5NTkgMTYuNjc3NVYxNy4zMjU5QzcuMzM5NTkgMTcuNzg2MiA3LjcxMjY5IDE4LjE1OTMgOC4xNzI5MiAxOC4xNTkzSDEzLjgwODRDMTQuMjY4NyAxOC4xNTkzIDE0LjY0MTcgMTcuNzg2MiAxNC42NDE3IDE3LjMyNTlWMTYuNzkzNUMxNS44MDk0IDE1LjY0ODUgMTYuNDY3MyAxNC4wODE5IDE2LjQ2NzMgMTIuNDQ2NVYxMS40OTY3TDE2LjQ2NzEgNi42MzY4NUMxNi40NjcxIDUuOTU2MyAxNS45MTU0IDUuNDA0NjEgMTUuMjM0OCA1LjQwNDYxQzE0LjU1NDMgNS40MDQ2MSAxNC4wMDI2IDUuOTU2MyAxNC4wMDI2IDYuNjM2ODVMMTQuMDAyMSA1LjA0NzI4QzE0LjAwMjEgNC4zNjY3MyAxMy40NTA0IDMuODE1MDQgMTIuNzY5OCAzLjgxNTA0QzEyLjA4OTMgMy44MTUwNCAxMS41Mzc2IDQuMzY2NzMgMTEuNTM3NiA1LjA0NzI4TDExLjUzNzUgMy42NzM5NUMxMS41Mzc1IDMuMDkzOTYgMTEuMDY3MyAyLjYyMzc4IDEwLjQ4NzMgMi42MjM3OFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3NCAxLjM3NDAyQzExLjM2MTIgMS4zNzQwMiAxMi4xMjExIDEuODYxMTggMTIuNTEwNSAyLjU3ODY4QzEyLjU5NTggMi41Njk4MyAxMi42ODIzIDIuNTY1MjggMTIuNzcgMi41NjUyOEMxMy44Mjc4IDIuNTY1MjggMTQuNzMxMSAzLjIyNzAxIDE1LjA4ODUgNC4xNTkxMUMxNS4xMzcgNC4xNTYyOSAxNS4xODU4IDQuMTU0ODYgMTUuMjM1IDQuMTU0ODZDMTYuNjA1OSA0LjE1NDg2IDE3LjcxNzIgNS4yNjYxOSAxNy43MTcyIDYuNjM3MDlMMTcuNzE3NCAxMi40NDY3QzE3LjcxNzQgMTQuMjM1NSAxNy4wNjQ0IDE1Ljk1NTkgMTUuODkxOSAxNy4yOTA0VjE3LjMyNjJDMTUuODkxOSAxOC40NzY4IDE0Ljk1OTEgMTkuNDA5NSAxMy44MDg1IDE5LjQwOTVIOC4xNzMwNkM3LjAyMjQ3IDE5LjQwOTUgNi4wODk3MyAxOC40NzY4IDYuMDg5NzMgMTcuMzI2MlYxNy4xNzY0TDIuNTEwMDMgMTMuNDA0MUMxLjQ0NTk5IDEyLjI4MjggMS43NDY2IDEwLjQ1NTUgMy4xMTM3OSA5LjczNDI0TDMuMjE2MjQgOS42ODAxOUMzLjg5MTY4IDkuMzIzODMgNC42NjE4NSA5LjI1NDAxIDUuMzY2NjYgOS40NTE5OFY1LjIyNjc4QzUuMzY2NjYgMy43NTY4NyA2LjU1ODI2IDIuNTY1MjggOC4wMjgxNiAyLjU2NTI4QzguMTcyOTMgMi41NjUyOCA4LjMxNDk5IDIuNTc2ODQgOC40NTM0NyAyLjU5OTA3QzguODM5NDMgMS44NzA0MiA5LjYwNTQ2IDEuMzc0MDIgMTAuNDg3NCAxLjM3NDAyWk0xMi40NDc2IDMuODU3ODdWOS40NzY0NkMxMi40NDc2IDkuNzI4NTIgMTIuMjQzMyA5LjkzMjg1IDExLjk5MTMgOS45MzI4NUMxMS43MzkyIDkuOTMyODUgMTEuNTM0OSA5LjcyODUyIDExLjUzNDkgOS40NzY0NlYzLjc5NjU1QzExLjUzNDkgMy43Nzk1NiAxMS41MzU4IDMuNzYyNzcgMTEuNTM3NiAzLjc0NjI2VjMuNjc0MkMxMS41Mzc2IDMuNDMyODIgMTEuNDU2MiAzLjIxMDQ2IDExLjMxOTMgMy4wMzMwOUMxMS4xMjcyIDIuNzg0MjggMTAuODI2MSAyLjYyNDAyIDEwLjQ4NzQgMi42MjQwMkMxMC4xMjM4IDIuNjI0MDIgOS44MDMzMiAyLjgwODg2IDkuNjE0ODMgMy4wODk3QzkuNTAyNjkgMy4yNTY3OSA5LjQzNzI2IDMuNDU3ODUgOS40MzcyNiAzLjY3NDJWMy43ODU3M0M5LjQzNzM1IDMuNzg5MzMgOS40MzczOSAzLjc5Mjk0IDkuNDM3MzkgMy43OTY1NVY5LjkwMTdDOS40MzczOSAxMC4xNTM3IDkuMjMzMDYgMTAuMzU4MSA4Ljk4MTAxIDEwLjM1ODFDOC43Mjg5NSAxMC4zNTgxIDguNTI0NjIgMTAuMTUzNyA4LjUyNDYyIDkuOTAxN1YzLjkwNTA3QzguNDE3NzMgMy44NjQ5IDguMzA0NjggMy44MzczMiA4LjE4NzI2IDMuODI0MTVDOC4xMzUwNCAzLjgxODI5IDguMDgxOTUgMy44MTUyOCA4LjAyODE2IDMuODE1MjhDNy4yNDg2MSAzLjgxNTI4IDYuNjE2NjYgNC40NDcyMyA2LjYxNjY2IDUuMjI2NzhWMTEuODI5Mkw1LjY3NDMxIDExLjAwNTJDNS41Nzg2OCAxMC45MjE2IDUuNDc1MzcgMTAuODUwNCA1LjM2NjY2IDEwLjc5MTlDNC44ODUwNiAxMC41MzI5IDQuMjk3MjggMTAuNTIzMSAzLjc5OTUyIDEwLjc4NThMMy42OTcwNyAxMC44Mzk4QzMuMDYyMzEgMTEuMTc0NyAyLjkyMjczIDEyLjAyMzEgMy40MTY3NSAxMi41NDM3TDcuMzM5NzMgMTYuNjc3N1YxNy4zMjYyQzcuMzM5NzMgMTcuNzg2NCA3LjcxMjgyIDE4LjE1OTUgOC4xNzMwNiAxOC4xNTk1SDEzLjgwODVDMTQuMjY4OCAxOC4xNTk1IDE0LjY0MTkgMTcuNzg2NCAxNC42NDE5IDE3LjMyNjJWMTYuNzkzOEMxNS43Mzc5IDE1LjcxOSAxNi4zODQ3IDE0LjI3MjggMTYuNDYgMTIuNzQ3QzE2LjQ2NDEgMTIuNjY0MSAxNi40NjY1IDEyLjU4MDkgMTYuNDY3MiAxMi40OTc1TDE2LjQ2NzQgMTIuNDQ2N0wxNi40NjcyIDYuNjM3MDlDMTYuNDY3MiA1Ljk2MjMgMTUuOTI0OCA1LjQxNDE5IDE1LjI1MjIgNS40MDQ5N0wxNS4yMzUgNS40MDQ4NkMxNS4xMjQ2IDUuNDA0ODYgMTUuMDE3NyA1LjQxOTM2IDE0LjkxNTkgNS40NDY1NlY5LjYwMjI2QzE0LjkxNTkgOS44NTQzMSAxNC43MTE2IDEwLjA1ODYgMTQuNDU5NSAxMC4wNTg2QzE0LjIwNzUgMTAuMDU4NiAxNC4wMDMxIDkuODU0MzEgMTQuMDAzMSA5LjYwMjI2VjYuNjA1MTRDMTQuMDAyOSA2LjYxNTc2IDE0LjAwMjcgNi42MjY0MSAxNC4wMDI3IDYuNjM3MDlWOS4yNzcwNUwxNC4wMDIyIDUuMDQ3NTJDMTQuMDAyMiA0Ljg2OTEzIDEzLjk2NDMgNC42OTk2IDEzLjg5NjEgNC41NDY1M0MxMy43MDY0IDQuMTIwNzIgMTMuMjgyMiAzLjgyMjM1IDEyLjc4NzYgMy44MTU0MUwxMi43NyAzLjgxNTI4QzEyLjY1ODQgMy44MTUyOCAxMi41NTA0IDMuODMwMSAxMi40NDc2IDMuODU3ODdaIiBmaWxsPSIjMUQxQzIzIi8+Cjwvc3ZnPg=="), auto',
1475
- grabbing: 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02LjYxODE3IDUuNTk4NzVDNi42MTgxNyA0LjgxOTIgNy4yNTAxMiA0LjE4NzI2IDguMDI5NjcgNC4xODcyNkM4Ljc3ODczIDQuMTg3MjYgOS4zOTE1MiA0Ljc3MDc1IDkuNDM4MjkgNS41MDgwMUM5LjQ1OTkyIDQuOTQ3MSA5LjkyMTQ3IDQuNDk5MDIgMTAuNDg3NyA0LjQ5OTAyQzExLjA2NzcgNC40OTkwMiAxMS41Mzc4IDQuOTY5MiAxMS41Mzc4IDUuNTQ5MTlWOC43NjI0NkwxMS41Mzc5IDYuNzExNUMxMS41Mzc5IDYuMDMwOTUgMTIuMDg5NiA1LjQ3OTI2IDEyLjc3MDIgNS40NzkyNkMxMy40NTA3IDUuNDc5MjYgMTQuMDAyNCA2LjAzMDk1IDE0LjAwMjQgNi43MTE1TDE0LjAwMjQgOC43NjI0NkwxNC4wMDI5IDguMDE5ODNDMTQuMDAyOSA3LjMzOTI5IDE0LjU1NDYgNi43ODc1OSAxNS4yMzUyIDYuNzg3NTlDMTUuOTE1NyA2Ljc4NzU5IDE2LjQ2NzQgNy4zMzkyOCAxNi40Njc0IDguMDE5ODNWMTEuNDk3TDE2LjQ2NzUgMTIuNDQ2N0MxNi40Njc1IDE0LjA4MjEgMTUuODA5NiAxNS42NDg3IDE0LjY0MiAxNi43OTM4VjE3LjMyNjJDMTQuNjQyIDE3Ljc4NjQgMTQuMjY4OSAxOC4xNTk1IDEzLjgwODcgMTguMTU5NUg4LjE3MzE3QzcuNzEyOTMgMTguMTU5NSA3LjMzOTg0IDE3Ljc4NjQgNy4zMzk4NCAxNy4zMjYyVjE1Ljk0MjRMNS4zNDU2MiAxNC43NTM0QzQuNTg5MjQgMTQuMzAyNCA0LjEyNTkxIDEzLjQ4NjcgNC4xMjU4OSAxMi42MDYxTDQuMTI1ODMgOS4yODM4M0M0LjEyNTgyIDguOTU0MjcgNC4zMjAwMyA4LjY1NTY2IDQuNjIxMjkgOC41MjIwNUw2LjYxODE3IDcuNjM2MzRWNS41OTg3NVoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3OCAzLjI0OTAyQzExLjI3OTYgMy4yNDkwMiAxMS45Nzc4IDMuNjQ5MDIgMTIuMzkxNyA0LjI1Nzk2QzEyLjUxNTEgNC4yMzkwNiAxMi42NDE2IDQuMjI5MjYgMTIuNzcwMyA0LjIyOTI2QzEzLjcyMjQgNC4yMjkyNiAxNC41NDkzIDQuNzY1MzEgMTQuOTY1NyA1LjU1MjA3QzE1LjA1NDMgNS41NDI1IDE1LjE0NDIgNS41Mzc1OSAxNS4yMzUzIDUuNTM3NTlDMTYuNjA2MiA1LjUzNzU5IDE3LjcxNzYgNi42NDg5MyAxNy43MTc2IDguMDE5ODNMMTcuNzE3NyAxMi40NDY3QzE3LjcxNzcgMTQuMjM1NSAxNy4wNjQ3IDE1Ljk1NTkgMTUuODkyMSAxNy4yOTA0VjE3LjMyNjJDMTUuODkyMSAxOC40NzY4IDE0Ljk1OTQgMTkuNDA5NSAxMy44MDg4IDE5LjQwOTVIOC4xNzMzMkM3LjAyMjczIDE5LjQwOTUgNi4wODk5OCAxOC40NzY4IDYuMDg5OTggMTcuMzI2MlYxNi42NTI0TDQuNzA1NjMgMTUuODI3QzMuNTcxMDYgMTUuMTUwNSAyLjg3NjA3IDEzLjkyNzEgMi44NzYwNCAxMi42MDYxTDIuODc1OTggOS4yODM4NUMyLjg3NTk2IDguNDU5OTYgMy4zNjE0OSA3LjcxMzQ1IDQuMTE0NjIgNy4zNzk0TDUuMzY4MzIgNi44MjMzM1Y1LjU5ODc1QzUuMzY4MzIgNC4xMjg4NSA2LjU1OTkxIDIuOTM3MjYgOC4wMjk4MiAyLjkzNzI2QzguNjA4MzEgMi45MzcyNiA5LjE0MzU1IDMuMTIxNyA5LjU4MDA1IDMuNDM1MDVDOS44NTg1MyAzLjMxNTMyIDEwLjE2NTQgMy4yNDkwMiAxMC40ODc4IDMuMjQ5MDJaTTEyLjQ0NzkgNS41MjE4NlY5LjQ3NTU3QzEyLjQ0NzkgOS43Mjc2MiAxMi4yNDM2IDkuOTMxOTUgMTEuOTkxNiA5LjkzMTk1QzExLjc1NjggOS45MzE5NSAxMS41NjM0IDkuNzU0NjUgMTEuNTM4IDkuNTI2NjNDMTEuNTM2MSA5LjUwOTg3IDExLjUzNTIgOS40OTI4MyAxMS41MzUyIDkuNDc1NTdWNS40NzE1OEMxMS41MTU0IDUuMjAwODMgMTEuMzkzIDQuOTU4NTggMTEuMjA2NiA0Ljc4MzU4QzExLjAxODggNC42MDcxMSAxMC43NjU5IDQuNDk5MDIgMTAuNDg3OCA0LjQ5OTAyQzEwLjQ3NjYgNC40OTkwMiAxMC40NjU0IDQuNDk5MTkgMTAuNDU0MiA0LjQ5OTU0QzkuOTAzNDcgNC41MTY4NCA5LjQ1OTY0IDQuOTU4MjQgOS40Mzg0NCA1LjUwODAxQzkuNDM4MiA1LjUwNDMgOS40Mzc5NSA1LjUwMDU4IDkuNDM3NjkgNS40OTY4OFY5LjkwMjQzQzkuNDM3NjkgMTAuMTU0NSA5LjIzMzM2IDEwLjM1ODggOC45ODEzMSAxMC4zNTg4QzguNzI5MjUgMTAuMzU4OCA4LjUyNDkyIDEwLjE1NDUgOC41MjQ5MiA5LjkwMjQzVjQuMjc2NTNDOC4zNzA4NiA0LjIxODgyIDguMjA0MDIgNC4xODcyNiA4LjAyOTgyIDQuMTg3MjZDNy4yNTAyNyA0LjE4NzI2IDYuNjE4MzIgNC44MTkyIDYuNjE4MzIgNS41OTg3NUw2LjYxODI3IDkuOTc1OTlDNi42MTgyNyAxMC4yMjggNi40MTM5NCAxMC40MzI0IDYuMTYxODkgMTAuNDMyNEM1LjkwOTgzIDEwLjQzMjQgNS43MDU1IDEwLjIyOCA1LjcwNTUgOS45NzU5OVY4LjA0MTIyTDQuNjIxNDQgOC41MjIwNUM0LjMyMDE4IDguNjU1NjYgNC4xMjU5NyA4Ljk1NDI3IDQuMTI1OTggOS4yODM4M0w0LjEyNjA0IDEyLjYwNjFDNC4xMjYwNiAxMy40ODY3IDQuNTg5MzkgMTQuMzAyNCA1LjM0NTc2IDE0Ljc1MzRMNy4zMzk5OCAxNS45NDI0VjE3LjMyNjJDNy4zMzk5OCAxNy43ODY0IDcuNzEzMDggMTguMTU5NSA4LjE3MzMyIDE4LjE1OTVIMTMuODA4OEMxNC4yNjkgMTguMTU5NSAxNC42NDIxIDE3Ljc4NjQgMTQuNjQyMSAxNy4zMjYyVjE2Ljc5MzhDMTUuNzM4MSAxNS43MTkgMTYuMzg1IDE0LjI3MjggMTYuNDYwMyAxMi43NDdDMTYuNDY0NiAxMi42NiAxNi40NjcgMTIuNTcyOCAxNi40Njc2IDEyLjQ4NTRMMTYuNDY3NyAxMi40NDY3TDE2LjQ2NzYgOC4wMTk4M0MxNi40Njc2IDcuMzQ1MDQgMTUuOTI1MiA2Ljc5NjkzIDE1LjI1MjUgNi43ODc3MUwxNS4yMzUzIDYuNzg3NTlDMTUuMTI1IDYuNzg3NTkgMTUuMDE4IDYuODAyMSAxNC45MTYyIDYuODI5MzFWOS42MDEzNkMxNC45MTYyIDkuODUzNDIgMTQuNzExOSAxMC4wNTc3IDE0LjQ1OTggMTAuMDU3N0MxNC4yMDc4IDEwLjA1NzcgMTQuMDAzNCA5Ljg1MzQxIDE0LjAwMzQgOS42MDEzNlY3Ljk4OTg1QzE0LjAwMzIgNy45OTk4MiAxNC4wMDMxIDguMDA5ODEgMTQuMDAzMSA4LjAxOTgzTDE0LjAwMzQgOS42MDEzNkwxNC4wMDI1IDYuNzExNUMxNC4wMDI1IDYuNDQ5NzQgMTMuOTIwOSA2LjIwNzA1IDEzLjc4MTggNi4wMDc0OEMxMy41NjIgNS42OTI0MiAxMy4xOTg5IDUuNDg0ODMgMTIuNzg3IDUuNDc5MzdMMTIuNzcwMyA1LjQ3OTI2QzEyLjY1ODggNS40NzkyNiAxMi41NTA3IDUuNDk0MDggMTIuNDQ3OSA1LjUyMTg2WiIgZmlsbD0iIzFEMUMyMyIvPgo8L3N2Zz4="), auto'
1476
- },
1516
+ // cursors: {
1517
+ // grab: 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMC40ODczIDIuNjIzNzhDOS45MDczMSAyLjYyMzc4IDkuNDM3MTMgMy4wOTM5NiA5LjQzNzEzIDMuNjczOTZWNS4xNDM3NkM5LjM5NDI4IDQuNDAyNzQgOC43Nzk3OCAzLjgxNTA0IDguMDI4MDIgMy44MTUwNEM3LjI0ODQ4IDMuODE1MDQgNi42MTY1MyA0LjQ0Njk5IDYuNjE2NTMgNS4yMjY1M1YxMS44Mjg5TDUuNjc0MTggMTEuMDA0OUM1LjE1NDg3IDEwLjU1MDkgNC40MDk1IDEwLjQ2MzYgMy43OTkzOCAxMC43ODU1TDMuNjk2OTQgMTAuODM5NkMzLjA2MjE3IDExLjE3NDUgMi45MjI2IDEyLjAyMjggMy40MTY2MiAxMi41NDM0TDcuMzM5NTkgMTYuNjc3NVYxNy4zMjU5QzcuMzM5NTkgMTcuNzg2MiA3LjcxMjY5IDE4LjE1OTMgOC4xNzI5MiAxOC4xNTkzSDEzLjgwODRDMTQuMjY4NyAxOC4xNTkzIDE0LjY0MTcgMTcuNzg2MiAxNC42NDE3IDE3LjMyNTlWMTYuNzkzNUMxNS44MDk0IDE1LjY0ODUgMTYuNDY3MyAxNC4wODE5IDE2LjQ2NzMgMTIuNDQ2NVYxMS40OTY3TDE2LjQ2NzEgNi42MzY4NUMxNi40NjcxIDUuOTU2MyAxNS45MTU0IDUuNDA0NjEgMTUuMjM0OCA1LjQwNDYxQzE0LjU1NDMgNS40MDQ2MSAxNC4wMDI2IDUuOTU2MyAxNC4wMDI2IDYuNjM2ODVMMTQuMDAyMSA1LjA0NzI4QzE0LjAwMjEgNC4zNjY3MyAxMy40NTA0IDMuODE1MDQgMTIuNzY5OCAzLjgxNTA0QzEyLjA4OTMgMy44MTUwNCAxMS41Mzc2IDQuMzY2NzMgMTEuNTM3NiA1LjA0NzI4TDExLjUzNzUgMy42NzM5NUMxMS41Mzc1IDMuMDkzOTYgMTEuMDY3MyAyLjYyMzc4IDEwLjQ4NzMgMi42MjM3OFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3NCAxLjM3NDAyQzExLjM2MTIgMS4zNzQwMiAxMi4xMjExIDEuODYxMTggMTIuNTEwNSAyLjU3ODY4QzEyLjU5NTggMi41Njk4MyAxMi42ODIzIDIuNTY1MjggMTIuNzcgMi41NjUyOEMxMy44Mjc4IDIuNTY1MjggMTQuNzMxMSAzLjIyNzAxIDE1LjA4ODUgNC4xNTkxMUMxNS4xMzcgNC4xNTYyOSAxNS4xODU4IDQuMTU0ODYgMTUuMjM1IDQuMTU0ODZDMTYuNjA1OSA0LjE1NDg2IDE3LjcxNzIgNS4yNjYxOSAxNy43MTcyIDYuNjM3MDlMMTcuNzE3NCAxMi40NDY3QzE3LjcxNzQgMTQuMjM1NSAxNy4wNjQ0IDE1Ljk1NTkgMTUuODkxOSAxNy4yOTA0VjE3LjMyNjJDMTUuODkxOSAxOC40NzY4IDE0Ljk1OTEgMTkuNDA5NSAxMy44MDg1IDE5LjQwOTVIOC4xNzMwNkM3LjAyMjQ3IDE5LjQwOTUgNi4wODk3MyAxOC40NzY4IDYuMDg5NzMgMTcuMzI2MlYxNy4xNzY0TDIuNTEwMDMgMTMuNDA0MUMxLjQ0NTk5IDEyLjI4MjggMS43NDY2IDEwLjQ1NTUgMy4xMTM3OSA5LjczNDI0TDMuMjE2MjQgOS42ODAxOUMzLjg5MTY4IDkuMzIzODMgNC42NjE4NSA5LjI1NDAxIDUuMzY2NjYgOS40NTE5OFY1LjIyNjc4QzUuMzY2NjYgMy43NTY4NyA2LjU1ODI2IDIuNTY1MjggOC4wMjgxNiAyLjU2NTI4QzguMTcyOTMgMi41NjUyOCA4LjMxNDk5IDIuNTc2ODQgOC40NTM0NyAyLjU5OTA3QzguODM5NDMgMS44NzA0MiA5LjYwNTQ2IDEuMzc0MDIgMTAuNDg3NCAxLjM3NDAyWk0xMi40NDc2IDMuODU3ODdWOS40NzY0NkMxMi40NDc2IDkuNzI4NTIgMTIuMjQzMyA5LjkzMjg1IDExLjk5MTMgOS45MzI4NUMxMS43MzkyIDkuOTMyODUgMTEuNTM0OSA5LjcyODUyIDExLjUzNDkgOS40NzY0NlYzLjc5NjU1QzExLjUzNDkgMy43Nzk1NiAxMS41MzU4IDMuNzYyNzcgMTEuNTM3NiAzLjc0NjI2VjMuNjc0MkMxMS41Mzc2IDMuNDMyODIgMTEuNDU2MiAzLjIxMDQ2IDExLjMxOTMgMy4wMzMwOUMxMS4xMjcyIDIuNzg0MjggMTAuODI2MSAyLjYyNDAyIDEwLjQ4NzQgMi42MjQwMkMxMC4xMjM4IDIuNjI0MDIgOS44MDMzMiAyLjgwODg2IDkuNjE0ODMgMy4wODk3QzkuNTAyNjkgMy4yNTY3OSA5LjQzNzI2IDMuNDU3ODUgOS40MzcyNiAzLjY3NDJWMy43ODU3M0M5LjQzNzM1IDMuNzg5MzMgOS40MzczOSAzLjc5Mjk0IDkuNDM3MzkgMy43OTY1NVY5LjkwMTdDOS40MzczOSAxMC4xNTM3IDkuMjMzMDYgMTAuMzU4MSA4Ljk4MTAxIDEwLjM1ODFDOC43Mjg5NSAxMC4zNTgxIDguNTI0NjIgMTAuMTUzNyA4LjUyNDYyIDkuOTAxN1YzLjkwNTA3QzguNDE3NzMgMy44NjQ5IDguMzA0NjggMy44MzczMiA4LjE4NzI2IDMuODI0MTVDOC4xMzUwNCAzLjgxODI5IDguMDgxOTUgMy44MTUyOCA4LjAyODE2IDMuODE1MjhDNy4yNDg2MSAzLjgxNTI4IDYuNjE2NjYgNC40NDcyMyA2LjYxNjY2IDUuMjI2NzhWMTEuODI5Mkw1LjY3NDMxIDExLjAwNTJDNS41Nzg2OCAxMC45MjE2IDUuNDc1MzcgMTAuODUwNCA1LjM2NjY2IDEwLjc5MTlDNC44ODUwNiAxMC41MzI5IDQuMjk3MjggMTAuNTIzMSAzLjc5OTUyIDEwLjc4NThMMy42OTcwNyAxMC44Mzk4QzMuMDYyMzEgMTEuMTc0NyAyLjkyMjczIDEyLjAyMzEgMy40MTY3NSAxMi41NDM3TDcuMzM5NzMgMTYuNjc3N1YxNy4zMjYyQzcuMzM5NzMgMTcuNzg2NCA3LjcxMjgyIDE4LjE1OTUgOC4xNzMwNiAxOC4xNTk1SDEzLjgwODVDMTQuMjY4OCAxOC4xNTk1IDE0LjY0MTkgMTcuNzg2NCAxNC42NDE5IDE3LjMyNjJWMTYuNzkzOEMxNS43Mzc5IDE1LjcxOSAxNi4zODQ3IDE0LjI3MjggMTYuNDYgMTIuNzQ3QzE2LjQ2NDEgMTIuNjY0MSAxNi40NjY1IDEyLjU4MDkgMTYuNDY3MiAxMi40OTc1TDE2LjQ2NzQgMTIuNDQ2N0wxNi40NjcyIDYuNjM3MDlDMTYuNDY3MiA1Ljk2MjMgMTUuOTI0OCA1LjQxNDE5IDE1LjI1MjIgNS40MDQ5N0wxNS4yMzUgNS40MDQ4NkMxNS4xMjQ2IDUuNDA0ODYgMTUuMDE3NyA1LjQxOTM2IDE0LjkxNTkgNS40NDY1NlY5LjYwMjI2QzE0LjkxNTkgOS44NTQzMSAxNC43MTE2IDEwLjA1ODYgMTQuNDU5NSAxMC4wNTg2QzE0LjIwNzUgMTAuMDU4NiAxNC4wMDMxIDkuODU0MzEgMTQuMDAzMSA5LjYwMjI2VjYuNjA1MTRDMTQuMDAyOSA2LjYxNTc2IDE0LjAwMjcgNi42MjY0MSAxNC4wMDI3IDYuNjM3MDlWOS4yNzcwNUwxNC4wMDIyIDUuMDQ3NTJDMTQuMDAyMiA0Ljg2OTEzIDEzLjk2NDMgNC42OTk2IDEzLjg5NjEgNC41NDY1M0MxMy43MDY0IDQuMTIwNzIgMTMuMjgyMiAzLjgyMjM1IDEyLjc4NzYgMy44MTU0MUwxMi43NyAzLjgxNTI4QzEyLjY1ODQgMy44MTUyOCAxMi41NTA0IDMuODMwMSAxMi40NDc2IDMuODU3ODdaIiBmaWxsPSIjMUQxQzIzIi8+Cjwvc3ZnPg=="), auto',
1518
+ // grabbing:
1519
+ // 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02LjYxODE3IDUuNTk4NzVDNi42MTgxNyA0LjgxOTIgNy4yNTAxMiA0LjE4NzI2IDguMDI5NjcgNC4xODcyNkM4Ljc3ODczIDQuMTg3MjYgOS4zOTE1MiA0Ljc3MDc1IDkuNDM4MjkgNS41MDgwMUM5LjQ1OTkyIDQuOTQ3MSA5LjkyMTQ3IDQuNDk5MDIgMTAuNDg3NyA0LjQ5OTAyQzExLjA2NzcgNC40OTkwMiAxMS41Mzc4IDQuOTY5MiAxMS41Mzc4IDUuNTQ5MTlWOC43NjI0NkwxMS41Mzc5IDYuNzExNUMxMS41Mzc5IDYuMDMwOTUgMTIuMDg5NiA1LjQ3OTI2IDEyLjc3MDIgNS40NzkyNkMxMy40NTA3IDUuNDc5MjYgMTQuMDAyNCA2LjAzMDk1IDE0LjAwMjQgNi43MTE1TDE0LjAwMjQgOC43NjI0NkwxNC4wMDI5IDguMDE5ODNDMTQuMDAyOSA3LjMzOTI5IDE0LjU1NDYgNi43ODc1OSAxNS4yMzUyIDYuNzg3NTlDMTUuOTE1NyA2Ljc4NzU5IDE2LjQ2NzQgNy4zMzkyOCAxNi40Njc0IDguMDE5ODNWMTEuNDk3TDE2LjQ2NzUgMTIuNDQ2N0MxNi40Njc1IDE0LjA4MjEgMTUuODA5NiAxNS42NDg3IDE0LjY0MiAxNi43OTM4VjE3LjMyNjJDMTQuNjQyIDE3Ljc4NjQgMTQuMjY4OSAxOC4xNTk1IDEzLjgwODcgMTguMTU5NUg4LjE3MzE3QzcuNzEyOTMgMTguMTU5NSA3LjMzOTg0IDE3Ljc4NjQgNy4zMzk4NCAxNy4zMjYyVjE1Ljk0MjRMNS4zNDU2MiAxNC43NTM0QzQuNTg5MjQgMTQuMzAyNCA0LjEyNTkxIDEzLjQ4NjcgNC4xMjU4OSAxMi42MDYxTDQuMTI1ODMgOS4yODM4M0M0LjEyNTgyIDguOTU0MjcgNC4zMjAwMyA4LjY1NTY2IDQuNjIxMjkgOC41MjIwNUw2LjYxODE3IDcuNjM2MzRWNS41OTg3NVoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3OCAzLjI0OTAyQzExLjI3OTYgMy4yNDkwMiAxMS45Nzc4IDMuNjQ5MDIgMTIuMzkxNyA0LjI1Nzk2QzEyLjUxNTEgNC4yMzkwNiAxMi42NDE2IDQuMjI5MjYgMTIuNzcwMyA0LjIyOTI2QzEzLjcyMjQgNC4yMjkyNiAxNC41NDkzIDQuNzY1MzEgMTQuOTY1NyA1LjU1MjA3QzE1LjA1NDMgNS41NDI1IDE1LjE0NDIgNS41Mzc1OSAxNS4yMzUzIDUuNTM3NTlDMTYuNjA2MiA1LjUzNzU5IDE3LjcxNzYgNi42NDg5MyAxNy43MTc2IDguMDE5ODNMMTcuNzE3NyAxMi40NDY3QzE3LjcxNzcgMTQuMjM1NSAxNy4wNjQ3IDE1Ljk1NTkgMTUuODkyMSAxNy4yOTA0VjE3LjMyNjJDMTUuODkyMSAxOC40NzY4IDE0Ljk1OTQgMTkuNDA5NSAxMy44MDg4IDE5LjQwOTVIOC4xNzMzMkM3LjAyMjczIDE5LjQwOTUgNi4wODk5OCAxOC40NzY4IDYuMDg5OTggMTcuMzI2MlYxNi42NTI0TDQuNzA1NjMgMTUuODI3QzMuNTcxMDYgMTUuMTUwNSAyLjg3NjA3IDEzLjkyNzEgMi44NzYwNCAxMi42MDYxTDIuODc1OTggOS4yODM4NUMyLjg3NTk2IDguNDU5OTYgMy4zNjE0OSA3LjcxMzQ1IDQuMTE0NjIgNy4zNzk0TDUuMzY4MzIgNi44MjMzM1Y1LjU5ODc1QzUuMzY4MzIgNC4xMjg4NSA2LjU1OTkxIDIuOTM3MjYgOC4wMjk4MiAyLjkzNzI2QzguNjA4MzEgMi45MzcyNiA5LjE0MzU1IDMuMTIxNyA5LjU4MDA1IDMuNDM1MDVDOS44NTg1MyAzLjMxNTMyIDEwLjE2NTQgMy4yNDkwMiAxMC40ODc4IDMuMjQ5MDJaTTEyLjQ0NzkgNS41MjE4NlY5LjQ3NTU3QzEyLjQ0NzkgOS43Mjc2MiAxMi4yNDM2IDkuOTMxOTUgMTEuOTkxNiA5LjkzMTk1QzExLjc1NjggOS45MzE5NSAxMS41NjM0IDkuNzU0NjUgMTEuNTM4IDkuNTI2NjNDMTEuNTM2MSA5LjUwOTg3IDExLjUzNTIgOS40OTI4MyAxMS41MzUyIDkuNDc1NTdWNS40NzE1OEMxMS41MTU0IDUuMjAwODMgMTEuMzkzIDQuOTU4NTggMTEuMjA2NiA0Ljc4MzU4QzExLjAxODggNC42MDcxMSAxMC43NjU5IDQuNDk5MDIgMTAuNDg3OCA0LjQ5OTAyQzEwLjQ3NjYgNC40OTkwMiAxMC40NjU0IDQuNDk5MTkgMTAuNDU0MiA0LjQ5OTU0QzkuOTAzNDcgNC41MTY4NCA5LjQ1OTY0IDQuOTU4MjQgOS40Mzg0NCA1LjUwODAxQzkuNDM4MiA1LjUwNDMgOS40Mzc5NSA1LjUwMDU4IDkuNDM3NjkgNS40OTY4OFY5LjkwMjQzQzkuNDM3NjkgMTAuMTU0NSA5LjIzMzM2IDEwLjM1ODggOC45ODEzMSAxMC4zNTg4QzguNzI5MjUgMTAuMzU4OCA4LjUyNDkyIDEwLjE1NDUgOC41MjQ5MiA5LjkwMjQzVjQuMjc2NTNDOC4zNzA4NiA0LjIxODgyIDguMjA0MDIgNC4xODcyNiA4LjAyOTgyIDQuMTg3MjZDNy4yNTAyNyA0LjE4NzI2IDYuNjE4MzIgNC44MTkyIDYuNjE4MzIgNS41OTg3NUw2LjYxODI3IDkuOTc1OTlDNi42MTgyNyAxMC4yMjggNi40MTM5NCAxMC40MzI0IDYuMTYxODkgMTAuNDMyNEM1LjkwOTgzIDEwLjQzMjQgNS43MDU1IDEwLjIyOCA1LjcwNTUgOS45NzU5OVY4LjA0MTIyTDQuNjIxNDQgOC41MjIwNUM0LjMyMDE4IDguNjU1NjYgNC4xMjU5NyA4Ljk1NDI3IDQuMTI1OTggOS4yODM4M0w0LjEyNjA0IDEyLjYwNjFDNC4xMjYwNiAxMy40ODY3IDQuNTg5MzkgMTQuMzAyNCA1LjM0NTc2IDE0Ljc1MzRMNy4zMzk5OCAxNS45NDI0VjE3LjMyNjJDNy4zMzk5OCAxNy43ODY0IDcuNzEzMDggMTguMTU5NSA4LjE3MzMyIDE4LjE1OTVIMTMuODA4OEMxNC4yNjkgMTguMTU5NSAxNC42NDIxIDE3Ljc4NjQgMTQuNjQyMSAxNy4zMjYyVjE2Ljc5MzhDMTUuNzM4MSAxNS43MTkgMTYuMzg1IDE0LjI3MjggMTYuNDYwMyAxMi43NDdDMTYuNDY0NiAxMi42NiAxNi40NjcgMTIuNTcyOCAxNi40Njc2IDEyLjQ4NTRMMTYuNDY3NyAxMi40NDY3TDE2LjQ2NzYgOC4wMTk4M0MxNi40Njc2IDcuMzQ1MDQgMTUuOTI1MiA2Ljc5NjkzIDE1LjI1MjUgNi43ODc3MUwxNS4yMzUzIDYuNzg3NTlDMTUuMTI1IDYuNzg3NTkgMTUuMDE4IDYuODAyMSAxNC45MTYyIDYuODI5MzFWOS42MDEzNkMxNC45MTYyIDkuODUzNDIgMTQuNzExOSAxMC4wNTc3IDE0LjQ1OTggMTAuMDU3N0MxNC4yMDc4IDEwLjA1NzcgMTQuMDAzNCA5Ljg1MzQxIDE0LjAwMzQgOS42MDEzNlY3Ljk4OTg1QzE0LjAwMzIgNy45OTk4MiAxNC4wMDMxIDguMDA5ODEgMTQuMDAzMSA4LjAxOTgzTDE0LjAwMzQgOS42MDEzNkwxNC4wMDI1IDYuNzExNUMxNC4wMDI1IDYuNDQ5NzQgMTMuOTIwOSA2LjIwNzA1IDEzLjc4MTggNi4wMDc0OEMxMy41NjIgNS42OTI0MiAxMy4xOTg5IDUuNDg0ODMgMTIuNzg3IDUuNDc5MzdMMTIuNzcwMyA1LjQ3OTI2QzEyLjY1ODggNS40NzkyNiAxMi41NTA3IDUuNDk0MDggMTIuNDQ3OSA1LjUyMTg2WiIgZmlsbD0iIzFEMUMyMyIvPgo8L3N2Zz4="), auto',
1520
+ // },
1477
1521
  fromNodeJSON(node, json, isFirstCreate) {
1478
1522
  initFormDataFromJSON(node, json, isFirstCreate);
1479
1523
  return;
@@ -1574,6 +1618,9 @@ var WorkflowLinesManager = class {
1574
1618
  getAllLines() {
1575
1619
  return this.entityManager.getEntities(WorkflowLineEntity);
1576
1620
  }
1621
+ getAllAvailableLines() {
1622
+ return this.getAllLines().filter((l) => !l.isDrawing && !l.isHidden);
1623
+ }
1577
1624
  hasLine(portInfo) {
1578
1625
  return !!this.entityManager.getEntityById(
1579
1626
  WorkflowLineEntity.portInfoToLineId(portInfo)
@@ -1595,7 +1642,7 @@ var WorkflowLinesManager = class {
1595
1642
  return this.createLine(newPortInfo);
1596
1643
  }
1597
1644
  createLine(options) {
1598
- const { from, to, drawingTo, fromPort, toPort, data } = options;
1645
+ const { from, to, drawingTo, fromPort, drawingFrom, toPort, data } = options;
1599
1646
  const available = Boolean(from && to);
1600
1647
  const key = options.key || WorkflowLineEntity.portInfoToLineId(options);
1601
1648
  let line = this.entityManager.getEntityById(key);
@@ -1604,12 +1651,12 @@ var WorkflowLinesManager = class {
1604
1651
  line.validate();
1605
1652
  return line;
1606
1653
  }
1607
- const fromNode = this.entityManager.getEntityById(from)?.getData(WorkflowNodeLinesData);
1654
+ const fromNode = from ? this.entityManager.getEntityById(from).getData(WorkflowNodeLinesData) : void 0;
1608
1655
  const toNode = to ? this.entityManager.getEntityById(to).getData(WorkflowNodeLinesData) : void 0;
1609
- if (!fromNode) {
1656
+ if (!fromNode && !toNode) {
1610
1657
  return;
1611
1658
  }
1612
- this.isDrawing = Boolean(drawingTo);
1659
+ this.isDrawing = Boolean(drawingTo || drawingFrom);
1613
1660
  line = this.entityManager.createEntity(WorkflowLineEntity, {
1614
1661
  id: key,
1615
1662
  document: this.document,
@@ -1619,16 +1666,15 @@ var WorkflowLinesManager = class {
1619
1666
  toPort,
1620
1667
  to,
1621
1668
  drawingTo,
1669
+ drawingFrom,
1622
1670
  data
1623
1671
  });
1624
1672
  this.registerData(line);
1625
- fromNode.addLine(line);
1673
+ fromNode?.addLine(line);
1626
1674
  toNode?.addLine(line);
1627
1675
  line.onDispose(() => {
1628
- if (drawingTo) {
1629
- this.isDrawing = false;
1630
- }
1631
- fromNode.removeLine(line);
1676
+ this.isDrawing = false;
1677
+ fromNode?.removeLine(line);
1632
1678
  toNode?.removeLine(line);
1633
1679
  });
1634
1680
  line.onDispose(() => {
@@ -1751,7 +1797,7 @@ var WorkflowLinesManager = class {
1751
1797
  return this.lineColor.default;
1752
1798
  }
1753
1799
  canAddLine(fromPort, toPort, silent) {
1754
- if (fromPort === toPort || fromPort.node === toPort.node || fromPort.portType !== "output" || toPort.portType !== "input" || toPort.disabled) {
1800
+ if (fromPort === toPort || fromPort.node === toPort.node || fromPort.portType !== "output" || toPort.portType !== "input" || fromPort.disabled || toPort.disabled) {
1755
1801
  return false;
1756
1802
  }
1757
1803
  const fromCanAdd = fromPort.node.getNodeRegistry().canAddLine;
@@ -1779,8 +1825,8 @@ var WorkflowLinesManager = class {
1779
1825
  }
1780
1826
  return true;
1781
1827
  }
1782
- canReset(fromPort, oldToPort, newToPort) {
1783
- if (this.options && this.options.canResetLine && !this.options.canResetLine(fromPort, oldToPort, newToPort, this)) {
1828
+ canReset(oldLine, newLineInfo) {
1829
+ if (this.options && this.options.canResetLine && !this.options.canResetLine(oldLine, newLineInfo, this)) {
1784
1830
  return false;
1785
1831
  }
1786
1832
  return true;
@@ -1789,9 +1835,14 @@ var WorkflowLinesManager = class {
1789
1835
  * 根据鼠标位置找到 port
1790
1836
  * @param pos
1791
1837
  */
1792
- getPortFromMousePos(pos) {
1838
+ getPortFromMousePos(pos, portType) {
1793
1839
  const allNodes = this.getSortedNodes().reverse();
1794
- const allPorts = allNodes.map((node) => node.ports.allPorts).flat();
1840
+ const allPorts = allNodes.map((node) => {
1841
+ if (!portType) {
1842
+ return node.ports.allPorts;
1843
+ }
1844
+ return portType === "input" ? node.ports.inputPorts : node.ports.outputPorts;
1845
+ }).flat();
1795
1846
  const targetPort = allPorts.find((port) => port.isHovered(pos.x, pos.y));
1796
1847
  if (targetPort) {
1797
1848
  const containNodes = this.getContainNodesFromMousePos(pos);
@@ -2995,18 +3046,30 @@ var WorkflowDragService = class {
2995
3046
  line.highlightColor = color;
2996
3047
  this.hoverService.clearHovered();
2997
3048
  }
2998
- handleDragOnNode(toNode, fromPort, line, toPort, originLine) {
2999
- if (toPort && (originLine?.toPort === toPort || toPort.portType === "input" && this.linesManager.canAddLine(fromPort, toPort, true))) {
3000
- this.hoverService.updateHoveredKey(toPort.id);
3001
- line.setToPort(toPort);
3049
+ checkDraggingPort(isDrawingTo, line, draggingNode, draggingPort, originLine) {
3050
+ let successDrawing = false;
3051
+ if (isDrawingTo) {
3052
+ successDrawing = !!(draggingPort && // 同一条线条则不用在判断 canAddLine
3053
+ (originLine?.toPort === draggingPort || draggingPort.portType === "input" && this.linesManager.canAddLine(line.fromPort, draggingPort, true)));
3054
+ } else {
3055
+ successDrawing = !!(draggingPort && // 同一条线条则不用在判断 canAddLine
3056
+ (originLine?.fromPort === draggingPort || draggingPort.portType === "output" && this.linesManager.canAddLine(draggingPort, line.toPort, true)));
3057
+ }
3058
+ if (successDrawing) {
3059
+ this.hoverService.updateHoveredKey(draggingPort.id);
3060
+ if (isDrawingTo) {
3061
+ line.setToPort(draggingPort);
3062
+ } else {
3063
+ line.setFromPort(draggingPort);
3064
+ }
3002
3065
  this._onDragLineEventEmitter.fire({
3003
3066
  type: "onDrag",
3004
- onDragNodeId: toNode.id
3067
+ onDragNodeId: draggingNode.id
3005
3068
  });
3006
3069
  return {
3007
3070
  hasError: false
3008
3071
  };
3009
- } else if (this.isContainer(toNode)) {
3072
+ } else if (this.isContainer(draggingNode)) {
3010
3073
  return {
3011
3074
  hasError: false
3012
3075
  };
@@ -3072,16 +3135,18 @@ var WorkflowDragService = class {
3072
3135
  * @param opts
3073
3136
  * @param event
3074
3137
  */
3075
- async startDrawingLine(fromPort, event, originLine) {
3076
- const isFromInActivePort = !originLine && fromPort.isErrorPort() && fromPort.disabled;
3077
- if (originLine?.disabled || isFromInActivePort || this.playgroundConfig.readonly || this.playgroundConfig.disabled) {
3138
+ async startDrawingLine(port, event, originLine) {
3139
+ const isDrawingTo = port.portType === "output";
3140
+ const isInActivePort = !originLine && port.isErrorPort() && port.disabled;
3141
+ if (originLine?.disabled || isInActivePort || this.playgroundConfig.readonly || this.playgroundConfig.disabled) {
3078
3142
  return { dragSuccess: false, newLine: void 0 };
3079
3143
  }
3080
3144
  this.selectService.clear();
3081
3145
  const config = this.playgroundConfig;
3082
3146
  const deferred = new import_utils16.PromiseDeferred();
3083
3147
  const preCursor = config.cursor;
3084
- let line, toPort, toNode, lineErrorReset = false;
3148
+ let line;
3149
+ let newLineInfo;
3085
3150
  const startTime = Date.now();
3086
3151
  let dragSuccess = false;
3087
3152
  const dragger = new import_core15.PlaygroundDrag({
@@ -3092,16 +3157,29 @@ var WorkflowDragService = class {
3092
3157
  }
3093
3158
  dragSuccess = true;
3094
3159
  const pos = config.getPosFromMouseEvent(event);
3095
- line = this.linesManager.createLine({
3096
- from: fromPort.node.id,
3097
- fromPort: fromPort.portID,
3098
- data: originLine?.lineData,
3099
- drawingTo: {
3100
- x: pos.x,
3101
- y: pos.y,
3102
- location: fromPort.location === "right" ? "left" : "top"
3103
- }
3104
- });
3160
+ if (isDrawingTo) {
3161
+ line = this.linesManager.createLine({
3162
+ from: port.node.id,
3163
+ fromPort: port.portID,
3164
+ data: originLine?.lineData,
3165
+ drawingTo: {
3166
+ x: pos.x,
3167
+ y: pos.y,
3168
+ location: port.location === "right" ? "left" : "top"
3169
+ }
3170
+ });
3171
+ } else {
3172
+ line = this.linesManager.createLine({
3173
+ to: port.node.id,
3174
+ toPort: port.portID,
3175
+ data: originLine?.lineData,
3176
+ drawingFrom: {
3177
+ x: pos.x,
3178
+ y: pos.y,
3179
+ location: port.location === "left" ? "right" : "bottom"
3180
+ }
3181
+ });
3182
+ }
3105
3183
  if (!line) {
3106
3184
  return;
3107
3185
  }
@@ -3112,49 +3190,15 @@ var WorkflowDragService = class {
3112
3190
  if (!line) {
3113
3191
  return;
3114
3192
  }
3115
- lineErrorReset = false;
3116
3193
  const dragPos = config.getPosFromMouseEvent(e);
3117
- toNode = this.linesManager.getNodeFromMousePos(dragPos);
3118
- toPort = this.linesManager.getPortFromMousePos(dragPos);
3119
- if (!toPort) {
3120
- line.setToPort(void 0);
3121
- } else if (!this.linesManager.canAddLine(fromPort, toPort, true)) {
3122
- line.highlightColor = this.linesManager.lineColor.error;
3123
- lineErrorReset = true;
3124
- line.setToPort(void 0);
3125
- } else {
3126
- line.setToPort(toPort);
3127
- }
3128
- this._onDragLineEventEmitter.fire({
3129
- type: "onDrag"
3130
- });
3131
- this.setLineColor(line, originLine?.lockedColor || this.linesManager.lineColor.drawing);
3132
- if (toNode && this.canBuildContainerLine(toNode, dragPos)) {
3133
- toPort = this.getNearestPort(toNode, dragPos);
3134
- const { hasError } = this.handleDragOnNode(toNode, fromPort, line, toPort, originLine);
3135
- lineErrorReset = hasError;
3136
- }
3137
- if (line.toPort) {
3138
- line.drawingTo = {
3139
- x: line.toPort.point.x,
3140
- y: line.toPort.point.y,
3141
- location: line.toPort.location
3142
- };
3143
- } else {
3144
- line.drawingTo = {
3145
- x: dragPos.x,
3146
- y: dragPos.y,
3147
- location: reverseLocation(line.fromPort.location)
3148
- };
3149
- }
3150
- originLine?.validate();
3151
- line.validate();
3194
+ newLineInfo = this.updateDrawingLine(isDrawingTo, line, dragPos, originLine);
3152
3195
  },
3153
3196
  // eslint-disable-next-line complexity
3154
3197
  onDragEnd: async (e) => {
3155
3198
  const dragPos = config.getPosFromMouseEvent(e);
3156
3199
  const onDragLineEndCallbacks = Array.from(this._onDragLineEndCallbacks.values());
3157
3200
  config.updateCursor(preCursor);
3201
+ const { fromPort, toPort, hasError } = newLineInfo || {};
3158
3202
  await Promise.all(
3159
3203
  onDragLineEndCallbacks.map(
3160
3204
  (callback) => callback({
@@ -3179,36 +3223,32 @@ var WorkflowDragService = class {
3179
3223
  deferred.resolve({ dragSuccess });
3180
3224
  };
3181
3225
  if (dragSuccess) {
3182
- if (originLine && originLine.toPort === toPort) {
3226
+ if (originLine && originLine.toPort === toPort && originLine.fromPort === fromPort) {
3183
3227
  return end();
3184
3228
  }
3185
- if (toPort && toPort.portType !== "input") {
3229
+ if (toPort && toPort.portType !== "input" || fromPort && fromPort.portType !== "output") {
3186
3230
  return end();
3187
3231
  }
3188
- const newLineInfo = toPort ? {
3232
+ const newLinePortInfo = toPort && fromPort ? {
3189
3233
  from: fromPort.node.id,
3190
3234
  fromPort: fromPort.portID,
3191
3235
  to: toPort.node.id,
3192
3236
  toPort: toPort.portID,
3193
3237
  data: originLine?.lineData
3194
3238
  } : void 0;
3195
- const isReset = originLine && toPort;
3196
- if (isReset && !this.linesManager.canReset(
3197
- originLine.fromPort,
3198
- originLine.toPort,
3199
- toPort
3200
- )) {
3239
+ const isReset = originLine && newLinePortInfo;
3240
+ if (isReset && !this.linesManager.canReset(originLine, newLinePortInfo)) {
3201
3241
  return end();
3202
3242
  }
3203
- if (originLine && (!this.linesManager.canRemove(originLine, newLineInfo, false) || lineErrorReset)) {
3243
+ if (originLine && (!this.linesManager.canRemove(originLine, newLinePortInfo, false) || hasError)) {
3204
3244
  return end();
3205
3245
  } else {
3206
3246
  originLine?.dispose();
3207
3247
  }
3208
- if (!toPort || !this.linesManager.canAddLine(fromPort, toPort, false)) {
3248
+ if (!newLinePortInfo || !this.linesManager.canAddLine(fromPort, toPort, false)) {
3209
3249
  return end();
3210
3250
  }
3211
- const newLine = this.linesManager.createLine(newLineInfo);
3251
+ const newLine = this.linesManager.createLine(newLinePortInfo);
3212
3252
  if (!newLine) {
3213
3253
  end();
3214
3254
  }
@@ -3225,14 +3265,109 @@ var WorkflowDragService = class {
3225
3265
  await dragger.start(clientX, clientY, config);
3226
3266
  return deferred.promise;
3227
3267
  }
3268
+ updateDrawingLine(isDrawingTo, line, dragPos, originLine) {
3269
+ let hasError = false;
3270
+ const mouseNode = this.linesManager.getNodeFromMousePos(dragPos);
3271
+ let toNode;
3272
+ let toPort;
3273
+ let fromPort;
3274
+ let fromNode;
3275
+ if (isDrawingTo) {
3276
+ fromPort = line.fromPort;
3277
+ toNode = mouseNode;
3278
+ toPort = this.linesManager.getPortFromMousePos(dragPos, "input");
3279
+ if (toNode && this.canBuildContainerLine(toNode, dragPos)) {
3280
+ toPort = this.getNearestPort(toNode, dragPos, "input");
3281
+ hasError = this.checkDraggingPort(isDrawingTo, line, toNode, toPort, originLine).hasError;
3282
+ }
3283
+ if (!toPort) {
3284
+ line.setToPort(void 0);
3285
+ } else if (!this.linesManager.canAddLine(fromPort, toPort, true)) {
3286
+ hasError = true;
3287
+ line.setToPort(void 0);
3288
+ } else {
3289
+ line.setToPort(toPort);
3290
+ }
3291
+ if (line.toPort) {
3292
+ line.drawingTo = {
3293
+ x: line.toPort.point.x,
3294
+ y: line.toPort.point.y,
3295
+ location: line.toPort.location
3296
+ };
3297
+ } else {
3298
+ line.drawingTo = {
3299
+ x: dragPos.x,
3300
+ y: dragPos.y,
3301
+ location: reverseLocation(line.fromPort.location)
3302
+ };
3303
+ }
3304
+ } else {
3305
+ toPort = line.toPort;
3306
+ fromNode = mouseNode;
3307
+ fromPort = this.linesManager.getPortFromMousePos(dragPos, "output");
3308
+ if (fromNode && this.canBuildContainerLine(fromNode, dragPos)) {
3309
+ fromPort = this.getNearestPort(fromNode, dragPos, "output");
3310
+ hasError = this.checkDraggingPort(
3311
+ isDrawingTo,
3312
+ line,
3313
+ fromNode,
3314
+ fromPort,
3315
+ originLine
3316
+ ).hasError;
3317
+ }
3318
+ if (!fromPort) {
3319
+ line.setFromPort(void 0);
3320
+ } else if (!this.linesManager.canAddLine(fromPort, toPort, true)) {
3321
+ hasError = true;
3322
+ line.setFromPort(void 0);
3323
+ } else {
3324
+ line.setFromPort(fromPort);
3325
+ }
3326
+ if (line.fromPort) {
3327
+ line.drawingFrom = {
3328
+ x: line.fromPort.point.x,
3329
+ y: line.fromPort.point.y,
3330
+ location: line.fromPort.location
3331
+ };
3332
+ } else {
3333
+ line.drawingFrom = {
3334
+ x: dragPos.x,
3335
+ y: dragPos.y,
3336
+ location: reverseLocation(line.toPort.location)
3337
+ };
3338
+ }
3339
+ }
3340
+ this._onDragLineEventEmitter.fire({
3341
+ type: "onDrag"
3342
+ });
3343
+ if (hasError) {
3344
+ this.setLineColor(line, this.linesManager.lineColor.error);
3345
+ } else {
3346
+ this.setLineColor(line, originLine?.lockedColor || this.linesManager.lineColor.drawing);
3347
+ }
3348
+ originLine?.validate();
3349
+ line.validate();
3350
+ return {
3351
+ fromPort,
3352
+ toPort,
3353
+ hasError
3354
+ };
3355
+ }
3228
3356
  /**
3229
3357
  * 重新连接线条
3230
3358
  * @param line
3231
3359
  * @param e
3232
3360
  */
3233
3361
  async resetLine(line, e) {
3234
- const { fromPort } = line;
3235
- const { dragSuccess } = await this.startDrawingLine(fromPort, e, line);
3362
+ const { fromPort, toPort } = line;
3363
+ const mousePos = this.playgroundConfig.getPosFromMouseEvent(e);
3364
+ const distanceFrom = import_utils16.Point.getDistance(fromPort.point, mousePos);
3365
+ const distanceTo = import_utils16.Point.getDistance(toPort.point, mousePos);
3366
+ const { dragSuccess } = await this.startDrawingLine(
3367
+ distanceTo <= distanceFrom || !this.document.options.twoWayConnection ? fromPort : toPort,
3368
+ e,
3369
+ line
3370
+ );
3236
3371
  if (!dragSuccess) {
3237
3372
  this.selectService.select(line);
3238
3373
  }
@@ -3254,17 +3389,27 @@ var WorkflowDragService = class {
3254
3389
  return true;
3255
3390
  }
3256
3391
  const { padding, bounds } = node.transform;
3257
- const contentRect = new import_utils16.Rectangle(bounds.x, bounds.y, padding.left * 2 / 3, bounds.height);
3258
- return contentRect.contains(mousePos.x, mousePos.y);
3392
+ const DEFAULT_DELTA = 10;
3393
+ const leftDelta = padding.left * 2 / 3 || DEFAULT_DELTA;
3394
+ const rightDelta = padding.right * 2 / 3 || DEFAULT_DELTA;
3395
+ const bottomDelta = padding.bottom * 2 / 3 || DEFAULT_DELTA;
3396
+ const topDelta = padding.top * 2 / 3 || DEFAULT_DELTA;
3397
+ const rectangles = [
3398
+ new import_utils16.Rectangle(bounds.x, bounds.y, leftDelta, bounds.height),
3399
+ // left
3400
+ new import_utils16.Rectangle(bounds.x, bounds.y, bounds.width, topDelta),
3401
+ // top
3402
+ new import_utils16.Rectangle(bounds.x, bounds.y + bounds.height - bottomDelta, bounds.width, bottomDelta),
3403
+ // bottom
3404
+ new import_utils16.Rectangle(bounds.x + bounds.width - rightDelta, bounds.y, rightDelta, bounds.height)
3405
+ // right
3406
+ ];
3407
+ return rectangles.some((rect) => rect.contains(mousePos.x, mousePos.y));
3259
3408
  }
3260
3409
  /** 获取最近的 port */
3261
- getNearestPort(node, mousePos) {
3410
+ getNearestPort(node, mousePos, portType = "input") {
3262
3411
  const portsData = node.ports;
3263
- const distanceSortedPorts = portsData.inputPorts.sort((a, b) => {
3264
- const aDistance = Math.abs(mousePos.y - a.point.y);
3265
- const bDistance = Math.abs(mousePos.y - b.point.y);
3266
- return aDistance - bDistance;
3267
- });
3412
+ const distanceSortedPorts = (portType === "input" ? portsData.inputPorts : portsData.outputPorts).sort((a, b) => import_utils16.Point.getDistance(mousePos, a.point) - import_utils16.Point.getDistance(mousePos, b.point));
3268
3413
  return distanceSortedPorts[0];
3269
3414
  }
3270
3415
  };
@@ -3536,8 +3681,8 @@ function useNodeRender(nodeFromProps) {
3536
3681
  }, []);
3537
3682
  const getExtInfo = (0, import_react2.useCallback)(() => node.getExtInfo(), [node]);
3538
3683
  const updateExtInfo = (0, import_react2.useCallback)(
3539
- (data) => {
3540
- node.updateExtInfo(data);
3684
+ (data, fullUpdate) => {
3685
+ node.updateExtInfo(data, fullUpdate);
3541
3686
  },
3542
3687
  [node]
3543
3688
  );
@@ -3572,7 +3717,7 @@ function useNodeRender(nodeFromProps) {
3572
3717
  if (form) {
3573
3718
  form.updateFormValues(values);
3574
3719
  } else {
3575
- updateExtInfo(values);
3720
+ updateExtInfo(values, true);
3576
3721
  }
3577
3722
  },
3578
3723
  node,