@logicflow/core 2.0.7 → 2.0.8

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 (72) hide show
  1. package/.turbo/turbo-build$colon$dev.log +10 -10
  2. package/.turbo/turbo-build.log +17 -33
  3. package/CHANGELOG.md +12 -2
  4. package/__tests__/algorithm/egde.test.ts +4 -4
  5. package/dist/index.css +3 -0
  6. package/es/algorithm/edge.js +3 -5
  7. package/es/constant/index.d.ts +4 -0
  8. package/es/constant/index.js +4 -0
  9. package/es/event/eventArgs.d.ts +17 -1
  10. package/es/index.css +3 -0
  11. package/es/model/GraphModel.d.ts +3 -3
  12. package/es/model/GraphModel.js +33 -7
  13. package/es/model/edge/LineEdgeModel.d.ts +2 -0
  14. package/es/model/edge/LineEdgeModel.js +8 -0
  15. package/es/model/edge/PolylineEdgeModel.d.ts +1 -0
  16. package/es/model/edge/PolylineEdgeModel.js +4 -3
  17. package/es/model/node/BaseNodeModel.d.ts +2 -2
  18. package/es/model/node/HtmlNodeModel.d.ts +2 -2
  19. package/es/model/node/TextNodeModel.d.ts +2 -2
  20. package/es/style/index.css +3 -0
  21. package/es/style/index.less +5 -0
  22. package/es/style/raw.d.ts +1 -1
  23. package/es/style/raw.js +1 -1
  24. package/es/view/edge/BaseEdge.d.ts +2 -0
  25. package/es/view/edge/BaseEdge.js +13 -1
  26. package/es/view/node/BaseNode.d.ts +2 -0
  27. package/es/view/node/BaseNode.js +13 -1
  28. package/es/view/overlay/BackgroundOverlay.js +2 -1
  29. package/es/view/overlay/getTransformHoc.d.ts +1 -1
  30. package/lib/algorithm/edge.js +3 -5
  31. package/lib/constant/index.d.ts +4 -0
  32. package/lib/constant/index.js +4 -0
  33. package/lib/event/eventArgs.d.ts +17 -1
  34. package/lib/index.css +3 -0
  35. package/lib/model/GraphModel.d.ts +3 -3
  36. package/lib/model/GraphModel.js +32 -6
  37. package/lib/model/edge/LineEdgeModel.d.ts +2 -0
  38. package/lib/model/edge/LineEdgeModel.js +8 -0
  39. package/lib/model/edge/PolylineEdgeModel.d.ts +1 -0
  40. package/lib/model/edge/PolylineEdgeModel.js +4 -3
  41. package/lib/model/node/BaseNodeModel.d.ts +2 -2
  42. package/lib/model/node/HtmlNodeModel.d.ts +2 -2
  43. package/lib/model/node/TextNodeModel.d.ts +2 -2
  44. package/lib/style/index.css +3 -0
  45. package/lib/style/index.less +5 -0
  46. package/lib/style/raw.d.ts +1 -1
  47. package/lib/style/raw.js +1 -1
  48. package/lib/view/edge/BaseEdge.d.ts +2 -0
  49. package/lib/view/edge/BaseEdge.js +13 -1
  50. package/lib/view/node/BaseNode.d.ts +2 -0
  51. package/lib/view/node/BaseNode.js +13 -1
  52. package/lib/view/overlay/BackgroundOverlay.js +2 -1
  53. package/lib/view/overlay/getTransformHoc.d.ts +1 -1
  54. package/package.json +1 -1
  55. package/src/LogicFlow.tsx +6 -0
  56. package/src/algorithm/edge.ts +1 -1
  57. package/src/algorithm/outline.ts +1 -1
  58. package/src/constant/index.ts +4 -0
  59. package/src/event/eventArgs.ts +27 -1
  60. package/src/model/GraphModel.ts +111 -3
  61. package/src/model/edge/LineEdgeModel.ts +8 -0
  62. package/src/model/edge/PolylineEdgeModel.ts +5 -3
  63. package/src/style/index.less +5 -0
  64. package/src/style/raw.ts +3 -0
  65. package/src/view/Graph.tsx +3 -4
  66. package/src/view/edge/BaseEdge.tsx +16 -0
  67. package/src/view/node/BaseNode.tsx +17 -1
  68. package/src/view/overlay/BackgroundOverlay.tsx +11 -16
  69. package/src/view/overlay/OutlineOverlay.tsx +1 -1
  70. package/stats.html +1 -1
  71. package/dist/index.min.js +0 -2
  72. package/dist/index.min.js.map +0 -1
@@ -57,6 +57,8 @@ var EventType;
57
57
  EventType["NODE_CONTEXTMENU"] = "node:contextmenu";
58
58
  EventType["NODE_ROTATE"] = "node:rotate";
59
59
  EventType["NODE_RESIZE"] = "node:resize";
60
+ EventType["NODE_FOCUS"] = "node:focus";
61
+ EventType["NODE_BLUR"] = "node:blur";
60
62
  // 节点 properties 变化事件
61
63
  EventType["NODE_PROPERTIES_CHANGE"] = "node:properties-change";
62
64
  EventType["NODE_PROPERTIES_DELETE"] = "node:properties-delete";
@@ -65,6 +67,8 @@ var EventType;
65
67
  EventType["EDGE_DELETE"] = "edge:delete";
66
68
  EventType["EDGE_CLICK"] = "edge:click";
67
69
  EventType["EDGE_DBCLICK"] = "edge:dbclick";
70
+ EventType["EDGE_FOCUS"] = "edge:focus";
71
+ EventType["EDGE_BLUR"] = "edge:blur";
68
72
  EventType["EDGE_MOUSEENTER"] = "edge:mouseenter";
69
73
  EventType["EDGE_MOUSELEAVE"] = "edge:mouseleave";
70
74
  EventType["EDGE_CONTEXTMENU"] = "edge:contextmenu";
@@ -97,7 +97,7 @@ interface NodeEventArgs {
97
97
  /**
98
98
  * 删除节点
99
99
  */
100
- 'node:delete': NodeEventArgsPick<'data'>;
100
+ 'node:delete': NodeEventArgsPick<'data' | 'model'>;
101
101
  /**
102
102
  * 添加外部拖入节点
103
103
  */
@@ -151,6 +151,14 @@ interface NodeEventArgs {
151
151
  */
152
152
  properties: Record<string, any>;
153
153
  };
154
+ /**
155
+ * 节点获焦
156
+ */
157
+ 'node:focus': NodeEventArgsPick<'data'>;
158
+ /**
159
+ * 节点失焦
160
+ */
161
+ 'node:blur': NodeEventArgsPick<'data'>;
154
162
  }
155
163
  type EdgeEventArgsPick<T extends 'data' | 'e' | 'position'> = Pick<{
156
164
  /**
@@ -217,6 +225,14 @@ interface EdgeEventArgs {
217
225
  oldEdge: EdgeData;
218
226
  };
219
227
  };
228
+ /**
229
+ * 边获焦
230
+ */
231
+ 'edge:focus': EdgeEventArgsPick<'data'>;
232
+ /**
233
+ * 边失焦
234
+ */
235
+ 'edge:blur': EdgeEventArgsPick<'data'>;
220
236
  }
221
237
  /**
222
238
  * 文本事件
package/lib/index.css CHANGED
@@ -15,6 +15,9 @@
15
15
  .lf-text-draggable {
16
16
  cursor: move;
17
17
  }
18
+ *:focus {
19
+ outline: none;
20
+ }
18
21
  .lf-node-anchor {
19
22
  cursor: crosshair;
20
23
  }
@@ -70,15 +70,15 @@ export declare class GraphModel {
70
70
  * 基于zIndex对元素进行排序。
71
71
  * todo: 性能优化
72
72
  */
73
- get sortElements(): (BaseNodeModel<LogicFlow.PropertiesType> | BaseEdgeModel<LogicFlow.PropertiesType>)[];
73
+ get sortElements(): (BaseEdgeModel<LogicFlow.PropertiesType> | BaseNodeModel<LogicFlow.PropertiesType>)[];
74
74
  /**
75
75
  * 当前编辑的元素,低频操作,先循环找。
76
76
  */
77
- get textEditElement(): BaseNodeModel<LogicFlow.PropertiesType> | BaseEdgeModel<LogicFlow.PropertiesType> | undefined;
77
+ get textEditElement(): BaseEdgeModel<LogicFlow.PropertiesType> | BaseNodeModel<LogicFlow.PropertiesType> | undefined;
78
78
  /**
79
79
  * 当前画布所有被选中的元素
80
80
  */
81
- get selectElements(): Map<string, BaseNodeModel<LogicFlow.PropertiesType> | BaseEdgeModel<LogicFlow.PropertiesType>>;
81
+ get selectElements(): Map<string, BaseEdgeModel<LogicFlow.PropertiesType> | BaseNodeModel<LogicFlow.PropertiesType>>;
82
82
  get selectNodes(): BaseNodeModel<LogicFlow.PropertiesType>[];
83
83
  /**
84
84
  * 获取指定区域内的所有元素
@@ -381,6 +381,31 @@ var GraphModel = /** @class */ (function () {
381
381
  throw new Error("\u627E\u4E0D\u5230".concat(edge.type, "\u5BF9\u5E94\u7684\u8FB9\u3002"));
382
382
  }
383
383
  var edgeModel = new Model(edge, _this);
384
+ // 根据edgeModel中存储的数据找到当前画布上的起终锚点坐标
385
+ // 判断当前起终锚点数据和Model中存储的起终点数据是否一致,不一致更新起终点信息
386
+ var sourceNodeId = edgeModel.sourceNodeId, targetNodeId = edgeModel.targetNodeId, _b = edgeModel.sourceAnchorId, sourceAnchorId = _b === void 0 ? '' : _b, _c = edgeModel.targetAnchorId, targetAnchorId = _c === void 0 ? '' : _c, startPoint = edgeModel.startPoint, endPoint = edgeModel.endPoint, text = edgeModel.text, textPosition = edgeModel.textPosition;
387
+ var updateAnchorPoint = function (node, anchorId, point, updatePoint) {
388
+ var anchor = node === null || node === void 0 ? void 0 : node.anchors.find(function (anchor) { return anchor.id === anchorId; });
389
+ if (anchor && !(0, lodash_es_1.isEqual)(anchor, point)) {
390
+ updatePoint(anchor);
391
+ }
392
+ };
393
+ var sourceNode = _this.getNodeModelById(sourceNodeId);
394
+ var targetNode = _this.getNodeModelById(targetNodeId);
395
+ updateAnchorPoint(sourceNode, sourceAnchorId, startPoint, edgeModel.updateStartPoint.bind(edgeModel));
396
+ updateAnchorPoint(targetNode, targetAnchorId, endPoint, edgeModel.updateEndPoint.bind(edgeModel));
397
+ // 而文本需要先算一下文本与默认文本位置之间的相对位置差
398
+ // 再计算新路径的文本默认位置,加上相对位置差,得到调整后边的文本的位置
399
+ if (text) {
400
+ var x = text.x, y = text.y;
401
+ var defaultX = textPosition.x, defaultY = textPosition.y;
402
+ if (x && y && defaultX && defaultY) {
403
+ var deltaX = x - defaultX;
404
+ var deltaY = y - defaultY;
405
+ edgeModel.resetTextPosition();
406
+ edgeModel.moveText(deltaX, deltaY);
407
+ }
408
+ }
384
409
  _this.edgeModelMap.set(edgeModel.id, edgeModel);
385
410
  _this.elementsModelMap.set(edgeModel.id, edgeModel);
386
411
  return edgeModel;
@@ -672,11 +697,15 @@ var GraphModel = /** @class */ (function () {
672
697
  * @param {string} nodeId 节点Id
673
698
  */
674
699
  GraphModel.prototype.deleteNode = function (nodeId) {
675
- var nodeData = this.nodesMap[nodeId].model.getData();
700
+ var nodeModel = this.nodesMap[nodeId].model;
701
+ var nodeData = nodeModel.getData();
676
702
  this.deleteEdgeBySource(nodeId);
677
703
  this.deleteEdgeByTarget(nodeId);
678
704
  this.nodes.splice(this.nodesMap[nodeId].index, 1);
679
- this.eventCenter.emit(constant_1.EventType.NODE_DELETE, { data: nodeData });
705
+ this.eventCenter.emit(constant_1.EventType.NODE_DELETE, {
706
+ data: nodeData,
707
+ model: nodeModel,
708
+ });
680
709
  };
681
710
  /**
682
711
  * 添加节点
@@ -1256,10 +1285,7 @@ var GraphModel = /** @class */ (function () {
1256
1285
  * 更新网格配置
1257
1286
  */
1258
1287
  GraphModel.prototype.updateBackgroundOptions = function (options) {
1259
- if (typeof options === 'boolean') {
1260
- this.background = options;
1261
- }
1262
- else if (typeof this.background === 'boolean') {
1288
+ if ((0, lodash_es_1.isBoolean)(options) || (0, lodash_es_1.isBoolean)(this.background)) {
1263
1289
  this.background = options;
1264
1290
  }
1265
1291
  else {
@@ -16,6 +16,8 @@ export declare class LineEdgeModel extends BaseEdgeModel {
16
16
  height?: number | undefined;
17
17
  path?: string | undefined;
18
18
  };
19
+ initEdgeData(data: LogicFlow.EdgeConfig): void;
20
+ getPath(points: Point[]): string;
19
21
  getTextPosition(): Point;
20
22
  }
21
23
  export default LineEdgeModel;
@@ -71,6 +71,14 @@ var LineEdgeModel = /** @class */ (function (_super) {
71
71
  var _a = this.properties.style, customStyle = _a === void 0 ? {} : _a;
72
72
  return __assign(__assign(__assign({}, style), (0, lodash_es_1.cloneDeep)(line)), (0, lodash_es_1.cloneDeep)(customStyle));
73
73
  };
74
+ LineEdgeModel.prototype.initEdgeData = function (data) {
75
+ _super.prototype.initEdgeData.call(this, data);
76
+ this.points = this.getPath([this.startPoint, this.endPoint]);
77
+ };
78
+ LineEdgeModel.prototype.getPath = function (points) {
79
+ var _a = __read(points, 2), start = _a[0], end = _a[1];
80
+ return "".concat(start.x, ",").concat(start.y, " ").concat(end.x, ",").concat(end.y);
81
+ };
74
82
  LineEdgeModel.prototype.getTextPosition = function () {
75
83
  return {
76
84
  x: (this.startPoint.x + this.endPoint.x) / 2,
@@ -39,6 +39,7 @@ export declare class PolylineEdgeModel extends BaseEdgeModel {
39
39
  y: number;
40
40
  }[];
41
41
  };
42
+ getPath(points: Point[]): string;
42
43
  initPoints(): void;
43
44
  updatePoints(): void;
44
45
  updateStartPoint(anchor: Point): void;
@@ -298,11 +298,12 @@ var PolylineEdgeModel = /** @class */ (function (_super) {
298
298
  pointsList: pointsList,
299
299
  });
300
300
  };
301
+ PolylineEdgeModel.prototype.getPath = function (points) {
302
+ return points.map(function (point) { return "".concat(point.x, ",").concat(point.y); }).join(' ');
303
+ };
301
304
  PolylineEdgeModel.prototype.initPoints = function () {
302
305
  if (this.pointsList.length > 0) {
303
- this.points = this.pointsList
304
- .map(function (point) { return "".concat(point.x, ",").concat(point.y); })
305
- .join(' ');
306
+ this.points = this.getPath(this.pointsList);
306
307
  }
307
308
  else {
308
309
  this.updatePoints();
@@ -172,8 +172,8 @@ export declare class BaseNodeModel<P extends PropertiesType = PropertiesType> im
172
172
  color?: string | undefined;
173
173
  fontSize: number;
174
174
  lineHeight?: number | undefined;
175
- textAnchor?: "middle" | "start" | "end" | undefined;
176
- dominantBaseline?: "middle" | "central" | "auto" | "text-bottom" | "alphabetic" | "ideographic" | "mathematical" | "hanging" | "text-top" | undefined;
175
+ textAnchor?: "start" | "end" | "middle" | undefined;
176
+ dominantBaseline?: "middle" | "auto" | "text-bottom" | "alphabetic" | "ideographic" | "central" | "mathematical" | "hanging" | "text-top" | undefined;
177
177
  };
178
178
  /**
179
179
  * @overridable 支持重写
@@ -4,13 +4,13 @@ import { ModelType } from '../../constant';
4
4
  import AnchorConfig = Model.AnchorConfig;
5
5
  import LogicFlow from '../../LogicFlow';
6
6
  import GraphModel from '../GraphModel';
7
- export type IHtmlNodeProperties = {
7
+ export interface IHtmlNodeProperties {
8
8
  width?: number;
9
9
  height?: number;
10
10
  style?: LogicFlow.CommonTheme;
11
11
  textStyle?: LogicFlow.CommonTheme;
12
12
  [key: string]: unknown;
13
- };
13
+ }
14
14
  export declare class HtmlNodeModel<P extends IHtmlNodeProperties = IHtmlNodeProperties> extends BaseNodeModel<P> {
15
15
  modelType: ModelType;
16
16
  constructor(data: LogicFlow.NodeConfig<P>, graphModel: GraphModel);
@@ -24,8 +24,8 @@ export declare class TextNodeModel<P extends ITextNodeProperties = ITextNodeProp
24
24
  fontSize: number;
25
25
  textWidth?: number | undefined;
26
26
  lineHeight?: number | undefined;
27
- textAnchor?: "middle" | "start" | "end" | undefined;
28
- dominantBaseline?: "middle" | "central" | "auto" | "text-bottom" | "alphabetic" | "ideographic" | "mathematical" | "hanging" | "text-top" | undefined;
27
+ textAnchor?: "start" | "end" | "middle" | undefined;
28
+ dominantBaseline?: "middle" | "auto" | "text-bottom" | "alphabetic" | "ideographic" | "central" | "mathematical" | "hanging" | "text-top" | undefined;
29
29
  overflowMode?: "default" | "autoWrap" | "ellipsis" | undefined;
30
30
  wrapPadding?: string | undefined;
31
31
  };
@@ -15,6 +15,9 @@
15
15
  .lf-text-draggable {
16
16
  cursor: move;
17
17
  }
18
+ *:focus {
19
+ outline: none;
20
+ }
18
21
  .lf-node-anchor {
19
22
  cursor: crosshair;
20
23
  }
@@ -19,6 +19,11 @@
19
19
  cursor: move;
20
20
  }
21
21
 
22
+ // 在元素focus时浏览器会给元素outline设置一个5像素宽的默认样式,这里先全局禁用一下,后续再根据需要再做调整
23
+ *:focus {
24
+ outline: none;
25
+ }
26
+
22
27
  .lf-node-anchor {
23
28
  cursor: crosshair;
24
29
  }
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * Auto generated file, do not modify it!
3
3
  */
4
- export declare const content = ".lf-graph {\n position: relative;\n z-index: 0;\n width: 100%;\n height: 100%;\n background: #fff;\n user-select: none;\n}\n.lf-element-text {\n cursor: text;\n}\n.lf-text-disabled {\n pointer-events: none;\n}\n.lf-text-draggable {\n cursor: move;\n}\n.lf-node-anchor {\n cursor: crosshair;\n}\n.lf-node-anchor-hover {\n visibility: hidden;\n}\n.lf-anchor:hover .lf-node-anchor-hover {\n visibility: visible;\n}\n.lf-edge.pointer-none {\n pointer-events: none;\n}\n.lf-edge-append {\n cursor: pointer;\n}\n.lf-edge-animation {\n stroke-dashoffset: 100%;\n animation: lf_animate_dash 5s linear infinite;\n}\n@keyframes lf_animate_dash {\n to {\n stroke-dashoffset: 0;\n }\n}\n/* node */\n.lf-node-not-allow {\n cursor: not-allowed;\n}\n.lf-polyline-append-ns-resize {\n cursor: ns-resize;\n}\n.lf-polyline-append-ew-resize {\n cursor: ew-resize;\n}\n.lf-dragging {\n cursor: move;\n}\n.lf-dragging .lf-element-text {\n cursor: move;\n}\n.lf-draggable {\n cursor: default;\n}\n.lf-bezier-adjust-anchor {\n cursor: pointer;\n}\n/* background */\n.lf-background,\n.lf-grid {\n position: absolute;\n inset: 0;\n z-index: -1;\n}\n.lf-background-area {\n width: 100%;\n height: 100%;\n}\n/* html-overlay */\n.lf-html-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n user-select: none;\n pointer-events: none;\n}\n.lf-html-overlay__transform > * {\n pointer-events: all;\n}\n.lf-text-editable {\n pointer-events: all;\n}\n.lf-text-input {\n position: absolute;\n box-sizing: border-box;\n min-width: 100px;\n min-height: 20px;\n padding: 5px;\n line-height: 1.2;\n white-space: pre;\n text-align: center;\n background: #fff;\n border: 1px solid #edefed;\n border-radius: 3px;\n outline: none;\n transform: translate(-50%, -50%);\n resize: none;\n}\n.lf-get-text-height {\n display: inline-block;\n box-sizing: border-box;\n word-break: break-all;\n /* \u4E3A\u4E86\u8DDF\u8F93\u5165\u6548\u679C\u4FDD\u6301\u4E00\u81F4\uFF0C\u8BBE\u7F6E\u900F\u660E\u8FB9\u6846\u5360\u4F4D */\n border: 1px solid transparent;\n}\n.lf-node-text-auto-wrap {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n /* border: 1px solid transparent; */\n}\n.lf-node-text-auto-wrap-content {\n width: 100%;\n line-height: 1.2;\n text-align: center;\n word-break: break-all;\n background: transparent;\n}\n.lf-node-text-ellipsis-content {\n width: 100%;\n line-height: 1.2;\n white-space: nowrap;\n text-align: center;\n background: transparent;\n /* overflow: hidden;\n text-overflow: ellipsis; */\n}\n.lf-node-text-ellipsis-content > div {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n/* tool-overlay */\n.lf-tool-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n overflow: hidden;\n pointer-events: none;\n}\n.lf-tool-overlay > * {\n pointer-events: all;\n}\n/* modification-overlay */\n.modification-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n pointer-events: none;\n}\n.modification-overlay > * {\n pointer-events: all;\n}\n.lf-outline,\n.lf-snapline {\n pointer-events: none;\n}\n.lf-keyboard-tips {\n float: right;\n}\n.lf-node-select-decorate {\n position: absolute;\n border: 1px dashed #343435;\n transform: translate(-50%, -50%);\n pointer-events: none;\n}\n.lf-multiple-select {\n position: absolute;\n border: 2px dashed #187dffcc;\n box-shadow: 0 0 3px 0 #187dff80;\n cursor: move;\n}\n.lf-edge-adjust-point {\n cursor: move;\n}\n.lf-rotate-control {\n cursor: grabbing;\n}\n.lf-resize-control-nw {\n cursor: nw-resize;\n}\n.lf-resize-control-n {\n cursor: n-resize;\n}\n.lf-resize-control-ne {\n cursor: ne-resize;\n}\n.lf-resize-control-e {\n cursor: e-resize;\n}\n.lf-resize-control-se {\n cursor: se-resize;\n}\n.lf-resize-control-s {\n cursor: s-resize;\n}\n.lf-resize-control-sw {\n cursor: sw-resize;\n}\n.lf-resize-control-w {\n cursor: w-resize;\n}\n";
4
+ export declare const content = ".lf-graph {\n position: relative;\n z-index: 0;\n width: 100%;\n height: 100%;\n background: #fff;\n user-select: none;\n}\n.lf-element-text {\n cursor: text;\n}\n.lf-text-disabled {\n pointer-events: none;\n}\n.lf-text-draggable {\n cursor: move;\n}\n*:focus {\n outline: none;\n}\n.lf-node-anchor {\n cursor: crosshair;\n}\n.lf-node-anchor-hover {\n visibility: hidden;\n}\n.lf-anchor:hover .lf-node-anchor-hover {\n visibility: visible;\n}\n.lf-edge.pointer-none {\n pointer-events: none;\n}\n.lf-edge-append {\n cursor: pointer;\n}\n.lf-edge-animation {\n stroke-dashoffset: 100%;\n animation: lf_animate_dash 5s linear infinite;\n}\n@keyframes lf_animate_dash {\n to {\n stroke-dashoffset: 0;\n }\n}\n/* node */\n.lf-node-not-allow {\n cursor: not-allowed;\n}\n.lf-polyline-append-ns-resize {\n cursor: ns-resize;\n}\n.lf-polyline-append-ew-resize {\n cursor: ew-resize;\n}\n.lf-dragging {\n cursor: move;\n}\n.lf-dragging .lf-element-text {\n cursor: move;\n}\n.lf-draggable {\n cursor: default;\n}\n.lf-bezier-adjust-anchor {\n cursor: pointer;\n}\n/* background */\n.lf-background,\n.lf-grid {\n position: absolute;\n inset: 0;\n z-index: -1;\n}\n.lf-background-area {\n width: 100%;\n height: 100%;\n}\n/* html-overlay */\n.lf-html-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n user-select: none;\n pointer-events: none;\n}\n.lf-html-overlay__transform > * {\n pointer-events: all;\n}\n.lf-text-editable {\n pointer-events: all;\n}\n.lf-text-input {\n position: absolute;\n box-sizing: border-box;\n min-width: 100px;\n min-height: 20px;\n padding: 5px;\n line-height: 1.2;\n white-space: pre;\n text-align: center;\n background: #fff;\n border: 1px solid #edefed;\n border-radius: 3px;\n outline: none;\n transform: translate(-50%, -50%);\n resize: none;\n}\n.lf-get-text-height {\n display: inline-block;\n box-sizing: border-box;\n word-break: break-all;\n /* \u4E3A\u4E86\u8DDF\u8F93\u5165\u6548\u679C\u4FDD\u6301\u4E00\u81F4\uFF0C\u8BBE\u7F6E\u900F\u660E\u8FB9\u6846\u5360\u4F4D */\n border: 1px solid transparent;\n}\n.lf-node-text-auto-wrap {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n /* border: 1px solid transparent; */\n}\n.lf-node-text-auto-wrap-content {\n width: 100%;\n line-height: 1.2;\n text-align: center;\n word-break: break-all;\n background: transparent;\n}\n.lf-node-text-ellipsis-content {\n width: 100%;\n line-height: 1.2;\n white-space: nowrap;\n text-align: center;\n background: transparent;\n /* overflow: hidden;\n text-overflow: ellipsis; */\n}\n.lf-node-text-ellipsis-content > div {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n/* tool-overlay */\n.lf-tool-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n overflow: hidden;\n pointer-events: none;\n}\n.lf-tool-overlay > * {\n pointer-events: all;\n}\n/* modification-overlay */\n.modification-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n pointer-events: none;\n}\n.modification-overlay > * {\n pointer-events: all;\n}\n.lf-outline,\n.lf-snapline {\n pointer-events: none;\n}\n.lf-keyboard-tips {\n float: right;\n}\n.lf-node-select-decorate {\n position: absolute;\n border: 1px dashed #343435;\n transform: translate(-50%, -50%);\n pointer-events: none;\n}\n.lf-multiple-select {\n position: absolute;\n border: 2px dashed #187dffcc;\n box-shadow: 0 0 3px 0 #187dff80;\n cursor: move;\n}\n.lf-edge-adjust-point {\n cursor: move;\n}\n.lf-rotate-control {\n cursor: grabbing;\n}\n.lf-resize-control-nw {\n cursor: nw-resize;\n}\n.lf-resize-control-n {\n cursor: n-resize;\n}\n.lf-resize-control-ne {\n cursor: ne-resize;\n}\n.lf-resize-control-e {\n cursor: e-resize;\n}\n.lf-resize-control-se {\n cursor: se-resize;\n}\n.lf-resize-control-s {\n cursor: s-resize;\n}\n.lf-resize-control-sw {\n cursor: sw-resize;\n}\n.lf-resize-control-w {\n cursor: w-resize;\n}\n";
package/lib/style/raw.js CHANGED
@@ -5,4 +5,4 @@ exports.content = void 0;
5
5
  /**
6
6
  * Auto generated file, do not modify it!
7
7
  */
8
- exports.content = ".lf-graph {\n position: relative;\n z-index: 0;\n width: 100%;\n height: 100%;\n background: #fff;\n user-select: none;\n}\n.lf-element-text {\n cursor: text;\n}\n.lf-text-disabled {\n pointer-events: none;\n}\n.lf-text-draggable {\n cursor: move;\n}\n.lf-node-anchor {\n cursor: crosshair;\n}\n.lf-node-anchor-hover {\n visibility: hidden;\n}\n.lf-anchor:hover .lf-node-anchor-hover {\n visibility: visible;\n}\n.lf-edge.pointer-none {\n pointer-events: none;\n}\n.lf-edge-append {\n cursor: pointer;\n}\n.lf-edge-animation {\n stroke-dashoffset: 100%;\n animation: lf_animate_dash 5s linear infinite;\n}\n@keyframes lf_animate_dash {\n to {\n stroke-dashoffset: 0;\n }\n}\n/* node */\n.lf-node-not-allow {\n cursor: not-allowed;\n}\n.lf-polyline-append-ns-resize {\n cursor: ns-resize;\n}\n.lf-polyline-append-ew-resize {\n cursor: ew-resize;\n}\n.lf-dragging {\n cursor: move;\n}\n.lf-dragging .lf-element-text {\n cursor: move;\n}\n.lf-draggable {\n cursor: default;\n}\n.lf-bezier-adjust-anchor {\n cursor: pointer;\n}\n/* background */\n.lf-background,\n.lf-grid {\n position: absolute;\n inset: 0;\n z-index: -1;\n}\n.lf-background-area {\n width: 100%;\n height: 100%;\n}\n/* html-overlay */\n.lf-html-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n user-select: none;\n pointer-events: none;\n}\n.lf-html-overlay__transform > * {\n pointer-events: all;\n}\n.lf-text-editable {\n pointer-events: all;\n}\n.lf-text-input {\n position: absolute;\n box-sizing: border-box;\n min-width: 100px;\n min-height: 20px;\n padding: 5px;\n line-height: 1.2;\n white-space: pre;\n text-align: center;\n background: #fff;\n border: 1px solid #edefed;\n border-radius: 3px;\n outline: none;\n transform: translate(-50%, -50%);\n resize: none;\n}\n.lf-get-text-height {\n display: inline-block;\n box-sizing: border-box;\n word-break: break-all;\n /* \u4E3A\u4E86\u8DDF\u8F93\u5165\u6548\u679C\u4FDD\u6301\u4E00\u81F4\uFF0C\u8BBE\u7F6E\u900F\u660E\u8FB9\u6846\u5360\u4F4D */\n border: 1px solid transparent;\n}\n.lf-node-text-auto-wrap {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n /* border: 1px solid transparent; */\n}\n.lf-node-text-auto-wrap-content {\n width: 100%;\n line-height: 1.2;\n text-align: center;\n word-break: break-all;\n background: transparent;\n}\n.lf-node-text-ellipsis-content {\n width: 100%;\n line-height: 1.2;\n white-space: nowrap;\n text-align: center;\n background: transparent;\n /* overflow: hidden;\n text-overflow: ellipsis; */\n}\n.lf-node-text-ellipsis-content > div {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n/* tool-overlay */\n.lf-tool-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n overflow: hidden;\n pointer-events: none;\n}\n.lf-tool-overlay > * {\n pointer-events: all;\n}\n/* modification-overlay */\n.modification-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n pointer-events: none;\n}\n.modification-overlay > * {\n pointer-events: all;\n}\n.lf-outline,\n.lf-snapline {\n pointer-events: none;\n}\n.lf-keyboard-tips {\n float: right;\n}\n.lf-node-select-decorate {\n position: absolute;\n border: 1px dashed #343435;\n transform: translate(-50%, -50%);\n pointer-events: none;\n}\n.lf-multiple-select {\n position: absolute;\n border: 2px dashed #187dffcc;\n box-shadow: 0 0 3px 0 #187dff80;\n cursor: move;\n}\n.lf-edge-adjust-point {\n cursor: move;\n}\n.lf-rotate-control {\n cursor: grabbing;\n}\n.lf-resize-control-nw {\n cursor: nw-resize;\n}\n.lf-resize-control-n {\n cursor: n-resize;\n}\n.lf-resize-control-ne {\n cursor: ne-resize;\n}\n.lf-resize-control-e {\n cursor: e-resize;\n}\n.lf-resize-control-se {\n cursor: se-resize;\n}\n.lf-resize-control-s {\n cursor: s-resize;\n}\n.lf-resize-control-sw {\n cursor: sw-resize;\n}\n.lf-resize-control-w {\n cursor: w-resize;\n}\n";
8
+ exports.content = ".lf-graph {\n position: relative;\n z-index: 0;\n width: 100%;\n height: 100%;\n background: #fff;\n user-select: none;\n}\n.lf-element-text {\n cursor: text;\n}\n.lf-text-disabled {\n pointer-events: none;\n}\n.lf-text-draggable {\n cursor: move;\n}\n*:focus {\n outline: none;\n}\n.lf-node-anchor {\n cursor: crosshair;\n}\n.lf-node-anchor-hover {\n visibility: hidden;\n}\n.lf-anchor:hover .lf-node-anchor-hover {\n visibility: visible;\n}\n.lf-edge.pointer-none {\n pointer-events: none;\n}\n.lf-edge-append {\n cursor: pointer;\n}\n.lf-edge-animation {\n stroke-dashoffset: 100%;\n animation: lf_animate_dash 5s linear infinite;\n}\n@keyframes lf_animate_dash {\n to {\n stroke-dashoffset: 0;\n }\n}\n/* node */\n.lf-node-not-allow {\n cursor: not-allowed;\n}\n.lf-polyline-append-ns-resize {\n cursor: ns-resize;\n}\n.lf-polyline-append-ew-resize {\n cursor: ew-resize;\n}\n.lf-dragging {\n cursor: move;\n}\n.lf-dragging .lf-element-text {\n cursor: move;\n}\n.lf-draggable {\n cursor: default;\n}\n.lf-bezier-adjust-anchor {\n cursor: pointer;\n}\n/* background */\n.lf-background,\n.lf-grid {\n position: absolute;\n inset: 0;\n z-index: -1;\n}\n.lf-background-area {\n width: 100%;\n height: 100%;\n}\n/* html-overlay */\n.lf-html-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n user-select: none;\n pointer-events: none;\n}\n.lf-html-overlay__transform > * {\n pointer-events: all;\n}\n.lf-text-editable {\n pointer-events: all;\n}\n.lf-text-input {\n position: absolute;\n box-sizing: border-box;\n min-width: 100px;\n min-height: 20px;\n padding: 5px;\n line-height: 1.2;\n white-space: pre;\n text-align: center;\n background: #fff;\n border: 1px solid #edefed;\n border-radius: 3px;\n outline: none;\n transform: translate(-50%, -50%);\n resize: none;\n}\n.lf-get-text-height {\n display: inline-block;\n box-sizing: border-box;\n word-break: break-all;\n /* \u4E3A\u4E86\u8DDF\u8F93\u5165\u6548\u679C\u4FDD\u6301\u4E00\u81F4\uFF0C\u8BBE\u7F6E\u900F\u660E\u8FB9\u6846\u5360\u4F4D */\n border: 1px solid transparent;\n}\n.lf-node-text-auto-wrap {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n /* border: 1px solid transparent; */\n}\n.lf-node-text-auto-wrap-content {\n width: 100%;\n line-height: 1.2;\n text-align: center;\n word-break: break-all;\n background: transparent;\n}\n.lf-node-text-ellipsis-content {\n width: 100%;\n line-height: 1.2;\n white-space: nowrap;\n text-align: center;\n background: transparent;\n /* overflow: hidden;\n text-overflow: ellipsis; */\n}\n.lf-node-text-ellipsis-content > div {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n/* tool-overlay */\n.lf-tool-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n overflow: hidden;\n pointer-events: none;\n}\n.lf-tool-overlay > * {\n pointer-events: all;\n}\n/* modification-overlay */\n.modification-overlay {\n position: absolute;\n inset: 0;\n z-index: 1;\n overflow: hidden;\n pointer-events: none;\n}\n.modification-overlay > * {\n pointer-events: all;\n}\n.lf-outline,\n.lf-snapline {\n pointer-events: none;\n}\n.lf-keyboard-tips {\n float: right;\n}\n.lf-node-select-decorate {\n position: absolute;\n border: 1px dashed #343435;\n transform: translate(-50%, -50%);\n pointer-events: none;\n}\n.lf-multiple-select {\n position: absolute;\n border: 2px dashed #187dffcc;\n box-shadow: 0 0 3px 0 #187dff80;\n cursor: move;\n}\n.lf-edge-adjust-point {\n cursor: move;\n}\n.lf-rotate-control {\n cursor: grabbing;\n}\n.lf-resize-control-nw {\n cursor: nw-resize;\n}\n.lf-resize-control-n {\n cursor: n-resize;\n}\n.lf-resize-control-ne {\n cursor: ne-resize;\n}\n.lf-resize-control-e {\n cursor: e-resize;\n}\n.lf-resize-control-se {\n cursor: se-resize;\n}\n.lf-resize-control-s {\n cursor: s-resize;\n}\n.lf-resize-control-sw {\n cursor: sw-resize;\n}\n.lf-resize-control-w {\n cursor: w-resize;\n}\n";
@@ -133,6 +133,8 @@ export declare abstract class BaseEdge<P extends IProps> extends Component<P, IE
133
133
  * 不支持重写
134
134
  */
135
135
  handleClick: (e: MouseEvent) => void;
136
+ handleFocus: () => void;
137
+ handleBlur: () => void;
136
138
  /**
137
139
  * @overridable 支持重写, 此方法为获取边的形状,如果需要自定义边的形状,请重写此方法。
138
140
  * @example https://docs.logic-flow.cn/docs/#/zh/guide/basic/edge?id=%e5%9f%ba%e4%ba%8e-react-%e7%bb%84%e4%bb%b6%e8%87%aa%e5%ae%9a%e4%b9%89%e8%be%b9
@@ -220,6 +220,18 @@ var BaseEdge = /** @class */ (function (_super) {
220
220
  graphModel.selectEdgeById(model.id, (0, util_1.isMultipleSelect)(e, editConfigModel));
221
221
  _this.toFront();
222
222
  };
223
+ _this.handleFocus = function () {
224
+ var _a = _this.props, model = _a.model, graphModel = _a.graphModel;
225
+ graphModel.eventCenter.emit(constant_1.EventType.EDGE_FOCUS, {
226
+ data: model.getData(),
227
+ });
228
+ };
229
+ _this.handleBlur = function () {
230
+ var _a = _this.props, model = _a.model, graphModel = _a.graphModel;
231
+ graphModel.eventCenter.emit(constant_1.EventType.EDGE_BLUR, {
232
+ data: model.getData(),
233
+ });
234
+ };
223
235
  return _this;
224
236
  }
225
237
  /**
@@ -408,7 +420,7 @@ var BaseEdge = /** @class */ (function (_super) {
408
420
  isSelected && 'lf-edge-selected',
409
421
  ]
410
422
  .filter(Boolean)
411
- .join(' '), onMouseDown: this.handleMouseDown, onMouseUp: this.handleMouseUp, onClick: this.handleClick, onContextMenu: this.handleContextMenu, onMouseOver: this.setHoverOn, onMouseEnter: this.setHoverOn, onMouseLeave: this.setHoverOff, children: [this.getShape(), this.getAppend(), this.getText(), this.getArrow()] }), isShowAdjustPoint && isSelected ? this.getAdjustPoints() : ''] }));
423
+ .join(' '), onMouseDown: this.handleMouseDown, onMouseUp: this.handleMouseUp, onClick: this.handleClick, onContextMenu: this.handleContextMenu, onMouseOver: this.setHoverOn, onMouseEnter: this.setHoverOn, onMouseLeave: this.setHoverOff, onFocus: this.handleFocus, onBlur: this.handleBlur, children: [this.getShape(), this.getAppend(), this.getText(), this.getArrow()] }), isShowAdjustPoint && isSelected ? this.getAdjustPoints() : ''] }));
412
424
  };
413
425
  BaseEdge.isObserved = false;
414
426
  return BaseEdge;
@@ -38,6 +38,8 @@ export declare abstract class BaseNode<P extends IProps = IProps> extends Compon
38
38
  handleClick: (e: MouseEvent) => void;
39
39
  handleContextMenu: (ev: MouseEvent) => void;
40
40
  handleMouseDown: (ev: MouseEvent) => void;
41
+ handleFocus: () => void;
42
+ handleBlur: () => void;
41
43
  setHoverOn: (ev: MouseEvent) => void;
42
44
  setHoverOff: (ev: MouseEvent) => void;
43
45
  /**
@@ -262,6 +262,18 @@ var BaseNode = /** @class */ (function (_super) {
262
262
  _this.stepDrag && _this.stepDrag.handleMouseDown(ev);
263
263
  }
264
264
  };
265
+ _this.handleFocus = function () {
266
+ var _a = _this.props, model = _a.model, graphModel = _a.graphModel;
267
+ graphModel.eventCenter.emit(constant_1.EventType.NODE_FOCUS, {
268
+ data: model.getData(),
269
+ });
270
+ };
271
+ _this.handleBlur = function () {
272
+ var _a = _this.props, model = _a.model, graphModel = _a.graphModel;
273
+ graphModel.eventCenter.emit(constant_1.EventType.NODE_BLUR, {
274
+ data: model.getData(),
275
+ });
276
+ };
265
277
  // 因为自定义节点的时候,可能会基于hover状态自定义不同的样式。
266
278
  _this.setHoverOn = function (ev) {
267
279
  var _a = _this.props, model = _a.model, graphModel = _a.graphModel;
@@ -421,7 +433,7 @@ var BaseNode = /** @class */ (function (_super) {
421
433
  if (adjustNodePosition && draggable) {
422
434
  this.stepDrag.setStep(gridSize * SCALE_X);
423
435
  }
424
- nodeShape = ((0, jsx_runtime_1.jsx)("g", __assign({ className: "".concat(this.getStateClassName(), " ").concat(className), onMouseDown: this.handleMouseDown, onMouseUp: this.handleMouseUp, onClick: this.handleClick, onMouseEnter: this.setHoverOn, onMouseOver: this.setHoverOn, onMouseLeave: this.setHoverOff, onMouseOut: this.onMouseOut, onContextMenu: this.handleContextMenu }, restAttributes, { children: nodeShapeInner })));
436
+ nodeShape = ((0, jsx_runtime_1.jsx)("g", __assign({ className: "".concat(this.getStateClassName(), " ").concat(className), onMouseDown: this.handleMouseDown, onMouseUp: this.handleMouseUp, onClick: this.handleClick, onMouseEnter: this.setHoverOn, onMouseOver: this.setHoverOn, onMouseLeave: this.setHoverOff, onMouseOut: this.onMouseOut, onContextMenu: this.handleContextMenu, onFocus: this.handleFocus, onBlur: this.handleBlur }, restAttributes, { children: nodeShapeInner })));
425
437
  }
426
438
  return nodeShape;
427
439
  };
@@ -24,6 +24,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.BackgroundOverlay = void 0;
25
25
  var jsx_runtime_1 = require("preact/jsx-runtime");
26
26
  var compat_1 = require("preact/compat");
27
+ var lodash_es_1 = require("lodash-es");
27
28
  var __1 = require("../..");
28
29
  var BackgroundOverlay = /** @class */ (function (_super) {
29
30
  __extends(BackgroundOverlay, _super);
@@ -32,7 +33,7 @@ var BackgroundOverlay = /** @class */ (function (_super) {
32
33
  }
33
34
  BackgroundOverlay.prototype.render = function () {
34
35
  var background = this.props.background;
35
- return ((0, jsx_runtime_1.jsx)("div", { className: "lf-background", children: (0, jsx_runtime_1.jsx)("div", { style: typeof background === 'object' ? background : {}, className: "lf-background-area" }) }));
36
+ return ((0, jsx_runtime_1.jsx)("div", { className: "lf-background", children: (0, jsx_runtime_1.jsx)("div", { style: (0, lodash_es_1.isObject)(background) ? background : {}, className: "lf-background-area" }) }));
36
37
  };
37
38
  BackgroundOverlay = __decorate([
38
39
  __1.observer
@@ -25,7 +25,7 @@ export declare function getTransform<P>(WrappedComponent: ComponentType<P>): {
25
25
  props: import("preact").RenderableProps<IProps & P, any>;
26
26
  context: any;
27
27
  base?: Element | Text | undefined;
28
- setState<K extends never>(state: Partial<{}> | ((prevState: Readonly<{}>, props: Readonly<IProps & P>) => Partial<{}> | Pick<{}, K> | null) | Pick<{}, K> | null, callback?: (() => void) | undefined): void;
28
+ setState<K extends never>(state: ((prevState: Readonly<{}>, props: Readonly<IProps & P>) => Pick<{}, K> | Partial<{}> | null) | Pick<{}, K> | Partial<{}> | null, callback?: (() => void) | undefined): void;
29
29
  forceUpdate(callback?: (() => void) | undefined): void;
30
30
  };
31
31
  displayName?: string | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@logicflow/core",
3
- "version": "2.0.7",
3
+ "version": "2.0.8",
4
4
  "description": "LogicFlow, help you quickly create flowcharts",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",
package/src/LogicFlow.tsx CHANGED
@@ -1369,6 +1369,11 @@ export class LogicFlow {
1369
1369
  this.components.push(extensionIns.render.bind(extensionIns))
1370
1370
  this.extension[pluginName] = extensionIns
1371
1371
  }
1372
+
1373
+ /** 销毁当前实例 */
1374
+ destroy() {
1375
+ this.graphModel.destroy()
1376
+ }
1372
1377
  }
1373
1378
 
1374
1379
  // Option
@@ -1451,6 +1456,7 @@ export namespace LogicFlow {
1451
1456
  // label数据类型声明
1452
1457
  export type LabelConfig = {
1453
1458
  id?: string // label唯一标识
1459
+ type?: string
1454
1460
  x: number
1455
1461
  y: number
1456
1462
  content?: string // 富文本内容
@@ -62,6 +62,6 @@ export const isInSegment = (point: Point, start: Point, end: Point) => {
62
62
  return (
63
63
  ((x >= startX && x <= endX) || (x <= startX && x >= endX)) &&
64
64
  ((y >= startY && y <= endY) || (y <= startY && y >= endY)) &&
65
- Math.abs(y - k * x + b) < Number.EPSILON
65
+ Math.abs(y - k * x - b) < Number.EPSILON
66
66
  )
67
67
  }
@@ -66,7 +66,7 @@ export const getEdgeOutline = (
66
66
  edge: BaseEdgeModel,
67
67
  ): OutlineInfo | undefined => {
68
68
  if (edge.modelType === ModelType.LINE_EDGE) {
69
- return getLineOutline(edge)
69
+ return getLineOutline(edge as LineEdgeModel)
70
70
  }
71
71
  if (edge.modelType === ModelType.POLYLINE_EDGE) {
72
72
  return getPolylineOutline(edge as PolylineEdgeModel)
@@ -57,6 +57,8 @@ export enum EventType {
57
57
  NODE_CONTEXTMENU = 'node:contextmenu',
58
58
  NODE_ROTATE = 'node:rotate',
59
59
  NODE_RESIZE = 'node:resize',
60
+ NODE_FOCUS = 'node:focus',
61
+ NODE_BLUR = 'node:blur',
60
62
 
61
63
  // 节点 properties 变化事件
62
64
  NODE_PROPERTIES_CHANGE = 'node:properties-change',
@@ -67,6 +69,8 @@ export enum EventType {
67
69
  EDGE_DELETE = 'edge:delete',
68
70
  EDGE_CLICK = 'edge:click',
69
71
  EDGE_DBCLICK = 'edge:dbclick',
72
+ EDGE_FOCUS = 'edge:focus',
73
+ EDGE_BLUR = 'edge:blur',
70
74
 
71
75
  EDGE_MOUSEENTER = 'edge:mouseenter',
72
76
  EDGE_MOUSELEAVE = 'edge:mouseleave',
@@ -132,7 +132,7 @@ interface NodeEventArgs {
132
132
  /**
133
133
  * 删除节点
134
134
  */
135
- 'node:delete': NodeEventArgsPick<'data'>
135
+ 'node:delete': NodeEventArgsPick<'data' | 'model'>
136
136
  /**
137
137
  * 添加外部拖入节点
138
138
  */
@@ -188,6 +188,14 @@ interface NodeEventArgs {
188
188
  */
189
189
  properties: Record<string, any>
190
190
  }
191
+ /**
192
+ * 节点获焦
193
+ */
194
+ 'node:focus': NodeEventArgsPick<'data'>
195
+ /**
196
+ * 节点失焦
197
+ */
198
+ 'node:blur': NodeEventArgsPick<'data'>
191
199
  }
192
200
 
193
201
  type EdgeEventArgsPick<T extends 'data' | 'e' | 'position'> = Pick<
@@ -259,6 +267,14 @@ interface EdgeEventArgs {
259
267
  oldEdge: EdgeData
260
268
  }
261
269
  }
270
+ /**
271
+ * 边获焦
272
+ */
273
+ 'edge:focus': EdgeEventArgsPick<'data'>
274
+ /**
275
+ * 边失焦
276
+ */
277
+ 'edge:blur': EdgeEventArgsPick<'data'>
262
278
  }
263
279
 
264
280
  /**
@@ -414,6 +430,16 @@ interface CommonEventArgs {
414
430
  */
415
431
  data: GraphData
416
432
  }
433
+ /**
434
+ * 画布容器大小发生变化触发,为了性能考虑对事件做了防抖处理,间隔为16ms
435
+ */
436
+ 'graph:resize': {
437
+ /**
438
+ * 更新后的画布数据
439
+ */
440
+ target: HTMLElement
441
+ contentRect: DOMRectReadOnly
442
+ }
417
443
  }
418
444
 
419
445
  type AnchorEventArgsPick<T extends 'data' | 'e' | 'nodeModel' | 'edgeModel'> =