@html-graph/html-graph 9.0.0 → 9.2.0

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.
@@ -11,7 +11,7 @@
11
11
  }({});
12
12
  //#endregion
13
13
  //#region src/html-view/core-html-view/create-host/create-host.ts
14
- var createHost$1 = () => {
14
+ var createHost$2 = () => {
15
15
  const host = document.createElement("div");
16
16
  host.style.width = "100%";
17
17
  host.style.height = "100%";
@@ -53,7 +53,7 @@
53
53
  graphStore;
54
54
  viewportStore;
55
55
  element;
56
- host = createHost$1();
56
+ host = createHost$2();
57
57
  container = createContainer();
58
58
  edgeIdToElementMap = /* @__PURE__ */ new Map();
59
59
  attachedNodeIds = /* @__PURE__ */ new Set();
@@ -772,7 +772,7 @@
772
772
  if (request.from !== void 0 && !this.hasPort(request.from)) throw new CanvasError(canvasErrorText.updateNonexistentEdgeSource(edgeId, request.from));
773
773
  if (request.to !== void 0 && !this.hasPort(request.to)) throw new CanvasError(canvasErrorText.updateNonexistentEdgeTarget(edgeId, request.to));
774
774
  const edge = this.getEdge(edgeId);
775
- const payload = edge.payload;
775
+ const { payload } = edge;
776
776
  this.removeEdgeInternal(edgeId);
777
777
  this.addEdgeInternal({
778
778
  id: edgeId,
@@ -782,7 +782,7 @@
782
782
  priority: payload.priority
783
783
  });
784
784
  }
785
- const edge = this.edges.get(edgeId);
785
+ const edge = this.getEdge(edgeId);
786
786
  if (request.shape !== void 0) {
787
787
  edge.payload.shape = request.shape;
788
788
  this.afterEdgeShapeUpdatedEmitter.emit(edgeId);
@@ -1101,10 +1101,10 @@
1101
1101
  };
1102
1102
  //#endregion
1103
1103
  //#region src/configurators/shared/find-port-at-point/find-port-for-element/find-port-for-element.ts
1104
- var findPortForElement = (graph, element) => {
1104
+ var findPortForElement = (graph, element, portIdResolver) => {
1105
1105
  let elementBuf = element;
1106
1106
  while (elementBuf !== null) {
1107
- const portId = graph.findPortIdsByElement(elementBuf)[0] ?? null;
1107
+ const portId = portIdResolver(graph.findPortIdsByElement(elementBuf));
1108
1108
  if (portId !== null) return {
1109
1109
  status: "portFound",
1110
1110
  portId
@@ -1128,10 +1128,10 @@
1128
1128
  }
1129
1129
  //#endregion
1130
1130
  //#region src/configurators/shared/find-port-at-point/find-port-at-point.ts
1131
- var findPortAtPoint = (graph, point) => {
1131
+ var findPortAtPoint = (graph, point, portIdResolver) => {
1132
1132
  const elements = getElementsAtPoint(document, point);
1133
1133
  for (const element of elements) {
1134
- const result = findPortForElement(graph, element);
1134
+ const result = findPortForElement(graph, element, portIdResolver);
1135
1135
  if (result.status === "portFound") return result.portId;
1136
1136
  if (result.status === "nodeEncountered") return null;
1137
1137
  }
@@ -3337,7 +3337,9 @@
3337
3337
  const mouseEvent = event;
3338
3338
  if (!this.params.mouseDownEventVerifier(mouseEvent)) return;
3339
3339
  const target = event.currentTarget;
3340
- const portId = this.canvas.graph.findPortIdsByElement(target)[0];
3340
+ const portIds = this.canvas.graph.findPortIdsByElement(target);
3341
+ const portId = this.params.grabbedPortIdResolver(portIds);
3342
+ if (portId === null) return;
3341
3343
  if (!this.params.onPointerDownVerifier(portId, {
3342
3344
  x: mouseEvent.clientX,
3343
3345
  y: mouseEvent.clientY
@@ -3638,6 +3640,12 @@
3638
3640
  }
3639
3641
  };
3640
3642
  //#endregion
3643
+ //#region src/configurators/shared/port-id-resolver/default-port-id-resolver/default-port-id-resolver.ts
3644
+ var defaultPortIdResolver = (portIds) => {
3645
+ if (portIds.length > 0) return portIds[0];
3646
+ return null;
3647
+ };
3648
+ //#endregion
3641
3649
  //#region src/configurators/user-draggable-nodes-configurator/user-draggable-nodes-configurator.ts
3642
3650
  var UserDraggableNodesConfigurator = class UserDraggableNodesConfigurator {
3643
3651
  canvas;
@@ -4303,7 +4311,8 @@
4303
4311
  const params = this.edgeInProgress;
4304
4312
  this.resetDragState();
4305
4313
  this.params.onEdgeCreationInterrupted(params);
4306
- }
4314
+ },
4315
+ grabbedPortIdResolver: this.params.grabbedPortIdResolver
4307
4316
  };
4308
4317
  DraggablePortsConfigurator.configure(this.canvas, this.window, this.pointInsideVerifier, this.eventTagger, draggablePortsParams);
4309
4318
  }
@@ -4357,18 +4366,17 @@
4357
4366
  this.overlayCanvas.clear();
4358
4367
  }
4359
4368
  tryCreateConnection(cursor) {
4360
- const targetPortId = findPortAtPoint(this.canvas.graph, cursor);
4369
+ const targetPortId = findPortAtPoint(this.canvas.graph, cursor, this.params.releasedPortIdResolver);
4361
4370
  if (targetPortId === null) {
4362
4371
  this.params.onEdgeCreationInterrupted(this.edgeInProgress);
4363
4372
  return;
4364
4373
  }
4365
4374
  const request = resolveCreateEdgeRequest(this.edgeInProgress, targetPortId);
4366
- const connectionAllowed = this.params.connectionAllowedVerifier(request);
4367
- const processedRequest = this.params.connectionPreprocessor({
4368
- from: request.from,
4369
- to: request.to
4370
- });
4371
- if (connectionAllowed && processedRequest !== null) {
4375
+ if (this.params.connectionAllowedVerifier(request)) {
4376
+ const processedRequest = this.params.connectionPreprocessor({
4377
+ from: request.from,
4378
+ to: request.to
4379
+ });
4372
4380
  this.canvas.graph.onAfterEdgeAdded.subscribe(this.onEdgeCreated);
4373
4381
  this.canvas.addEdge(processedRequest);
4374
4382
  this.canvas.graph.onAfterEdgeAdded.unsubscribe(this.onEdgeCreated);
@@ -4438,7 +4446,8 @@
4438
4446
  shape: edge.shape,
4439
4447
  priority: edge.priority
4440
4448
  });
4441
- }
4449
+ },
4450
+ grabbedPortIdResolver: this.params.grabbedPortIdResolver
4442
4451
  };
4443
4452
  DraggablePortsConfigurator.configure(this.canvas, this.window, this.pointInsideVerifier, this.eventTagger, draggablePortsParams);
4444
4453
  }
@@ -4528,7 +4537,7 @@
4528
4537
  }).updatePort(OverlayId.DraggingNodeId, { direction });
4529
4538
  }
4530
4539
  tryCreateConnection(cursor) {
4531
- const draggingPortId = findPortAtPoint(this.canvas.graph, cursor);
4540
+ const draggingPortId = findPortAtPoint(this.canvas.graph, cursor, this.params.releasedPortIdResolver);
4532
4541
  this.overlayCanvas.removeEdge(OverlayId.EdgeId);
4533
4542
  if (draggingPortId === null) {
4534
4543
  const edge = this.draggingEdgePayload;
@@ -4715,19 +4724,17 @@
4715
4724
  //#endregion
4716
4725
  //#region src/configurators/animated-layout-configurator/animated-layout-configurator.ts
4717
4726
  var AnimatedLayoutConfigurator = class AnimatedLayoutConfigurator {
4718
- win;
4719
4727
  applier;
4720
4728
  step = (dt) => {
4721
4729
  this.applier.apply(dt);
4722
4730
  };
4723
4731
  constructor(canvas, params, win) {
4724
- this.win = win;
4725
4732
  this.applier = new AnimatedLayoutApplier(canvas, params.algorithm, {
4726
4733
  staticNodeResolver: params.staticNodeResolver,
4727
4734
  onBeforeApplied: params.onBeforeApplied,
4728
4735
  onAfterApplied: params.onAfterApplied
4729
4736
  });
4730
- new AnimationSeries(this.win, this.step);
4737
+ new AnimationSeries(win, this.step);
4731
4738
  }
4732
4739
  static configure(canvas, params, win) {
4733
4740
  new AnimatedLayoutConfigurator(canvas, params, win);
@@ -4867,6 +4874,134 @@
4867
4874
  }
4868
4875
  };
4869
4876
  //#endregion
4877
+ //#region src/configurators/rectangular-selection-configurator/create-host/create-host.ts
4878
+ var createHost$1 = () => {
4879
+ const element = document.createElement("div");
4880
+ element.style.width = "100%";
4881
+ element.style.height = "100%";
4882
+ element.style.position = "relative";
4883
+ return element;
4884
+ };
4885
+ //#endregion
4886
+ //#region src/configurators/rectangular-selection-configurator/create-selection-rectangle-wrapper/create-selection-rectangle-wrapper.ts
4887
+ var createSelectionRectangleWrapper = () => {
4888
+ const element = document.createElement("div");
4889
+ element.style.position = "absolute";
4890
+ return element;
4891
+ };
4892
+ //#endregion
4893
+ //#region src/configurators/rectangular-selection-configurator/rectangular-selection-configurator.ts
4894
+ var RectangularSelectionConfigurator = class RectangularSelectionConfigurator {
4895
+ canvas;
4896
+ mainElement;
4897
+ overlayLayer;
4898
+ pointInsideVerifier;
4899
+ eventTagger;
4900
+ win;
4901
+ params;
4902
+ host = createHost$1();
4903
+ selectionRectangleWrapper = createSelectionRectangleWrapper();
4904
+ initialContentPoint = null;
4905
+ draggingViewportPoint = null;
4906
+ eventHandledTag = dragEventHandledTag;
4907
+ onAfterViewportUpdated = () => {
4908
+ this.updateSelectionRectangle();
4909
+ };
4910
+ onCanvasMouseDown = (event) => {
4911
+ const mouseEvent = event;
4912
+ if (!this.params.mouseDownEventVerifier(mouseEvent)) return;
4913
+ if (this.eventTagger.has(event, this.eventHandledTag)) return;
4914
+ this.params.onSelectionStarted();
4915
+ const rect = this.mainElement.getBoundingClientRect();
4916
+ const cursorViewportCoords = {
4917
+ x: mouseEvent.clientX - rect.x,
4918
+ y: mouseEvent.clientY - rect.y
4919
+ };
4920
+ this.initialContentPoint = this.canvas.viewport.createContentCoords(cursorViewportCoords);
4921
+ this.draggingViewportPoint = cursorViewportCoords;
4922
+ this.updateSelectionRectangle();
4923
+ this.host.appendChild(this.selectionRectangleWrapper);
4924
+ this.win.addEventListener("mousemove", this.onWindowMouseMove, { passive: true });
4925
+ this.win.addEventListener("mouseup", this.onWindowMouseUp, { passive: true });
4926
+ };
4927
+ onWindowMouseMove = (event) => {
4928
+ const mouseEvent = event;
4929
+ if (!this.pointInsideVerifier.verify(mouseEvent.clientX, mouseEvent.clientY)) {
4930
+ this.removeMouseListeners();
4931
+ this.interruptSelection();
4932
+ return;
4933
+ }
4934
+ const rect = this.mainElement.getBoundingClientRect();
4935
+ const cursorViewportCoords = {
4936
+ x: mouseEvent.clientX - rect.x,
4937
+ y: mouseEvent.clientY - rect.y
4938
+ };
4939
+ this.draggingViewportPoint = cursorViewportCoords;
4940
+ this.updateSelectionRectangle();
4941
+ const selectionRect = this.selectionRectangleWrapper.getBoundingClientRect();
4942
+ this.params.onSelectionChange(selectionRect);
4943
+ };
4944
+ onWindowMouseUp = (event) => {
4945
+ const mouseEvent = event;
4946
+ if (!this.params.mouseUpEventVerifier(mouseEvent)) return;
4947
+ this.removeMouseListeners();
4948
+ this.finishSelection();
4949
+ };
4950
+ constructor(canvas, mainElement, overlayLayer, pointInsideVerifier, eventTagger, win, params) {
4951
+ this.canvas = canvas;
4952
+ this.mainElement = mainElement;
4953
+ this.overlayLayer = overlayLayer;
4954
+ this.pointInsideVerifier = pointInsideVerifier;
4955
+ this.eventTagger = eventTagger;
4956
+ this.win = win;
4957
+ this.params = params;
4958
+ this.overlayLayer.appendChild(this.host);
4959
+ this.selectionRectangleWrapper.appendChild(this.params.rectangleElement);
4960
+ this.canvas.viewport.onAfterUpdated.subscribe(this.onAfterViewportUpdated);
4961
+ this.mainElement.addEventListener("mousedown", this.onCanvasMouseDown, { passive: true });
4962
+ this.canvas.onBeforeDestroy.subscribe(() => {
4963
+ this.mainElement.removeEventListener("mousedown", this.onCanvasMouseDown);
4964
+ this.removeMouseListeners();
4965
+ });
4966
+ }
4967
+ static configure(canvas, mainElement, overlayLayer, pointInsideVerifier, eventTagger, win, params) {
4968
+ new RectangularSelectionConfigurator(canvas, mainElement, overlayLayer, pointInsideVerifier, eventTagger, win, params);
4969
+ }
4970
+ updateSelectionRectangle() {
4971
+ if (this.initialContentPoint === null || this.draggingViewportPoint === null) return;
4972
+ const initialViewportPoint = this.canvas.viewport.createViewportCoords(this.initialContentPoint);
4973
+ const draggingViewportPoint = this.draggingViewportPoint;
4974
+ const x = Math.min(initialViewportPoint.x, draggingViewportPoint.x);
4975
+ const y = Math.min(initialViewportPoint.y, draggingViewportPoint.y);
4976
+ const width = Math.abs(draggingViewportPoint.x - initialViewportPoint.x);
4977
+ const height = Math.abs(draggingViewportPoint.y - initialViewportPoint.y);
4978
+ const { style } = this.selectionRectangleWrapper;
4979
+ style.left = `${x}px`;
4980
+ style.top = `${y}px`;
4981
+ style.width = `${width}px`;
4982
+ style.height = `${height}px`;
4983
+ }
4984
+ removeMouseListeners() {
4985
+ this.win.removeEventListener("mousemove", this.onWindowMouseMove);
4986
+ this.win.removeEventListener("mouseup", this.onWindowMouseUp);
4987
+ }
4988
+ finishSelection() {
4989
+ const selectionRect = this.selectionRectangleWrapper.getBoundingClientRect();
4990
+ this.terminateSelection();
4991
+ this.params.onSelectionFinished(selectionRect);
4992
+ }
4993
+ interruptSelection() {
4994
+ const selectionRect = this.selectionRectangleWrapper.getBoundingClientRect();
4995
+ this.terminateSelection();
4996
+ this.params.onSelectionInterrupted(selectionRect);
4997
+ }
4998
+ terminateSelection() {
4999
+ this.host.removeChild(this.selectionRectangleWrapper);
5000
+ this.initialContentPoint = null;
5001
+ this.draggingViewportPoint = null;
5002
+ }
5003
+ };
5004
+ //#endregion
4870
5005
  //#region src/canvas-builder/layers/create-host/create-host.ts
4871
5006
  var createHost = () => {
4872
5007
  const host = document.createElement("div");
@@ -4877,16 +5012,17 @@
4877
5012
  };
4878
5013
  //#endregion
4879
5014
  //#region src/canvas-builder/layers/create-layer/create-layer.ts
4880
- var createLayer = () => {
5015
+ var createLayer = (zIndex) => {
4881
5016
  const host = document.createElement("div");
4882
5017
  host.style.position = "absolute";
4883
5018
  host.style.inset = "0";
5019
+ host.style.zIndex = `${zIndex}`;
4884
5020
  return host;
4885
5021
  };
4886
5022
  //#endregion
4887
5023
  //#region src/canvas-builder/layers/create-overlay-layer/create-overlay-layer.ts
4888
- var createOverlayLayer = () => {
4889
- const layer = createLayer();
5024
+ var createOverlayLayer = (zIndex) => {
5025
+ const layer = createLayer(zIndex);
4890
5026
  layer.style.pointerEvents = "none";
4891
5027
  return layer;
4892
5028
  };
@@ -4894,10 +5030,11 @@
4894
5030
  //#region src/canvas-builder/layers/layers.ts
4895
5031
  var Layers = class {
4896
5032
  element;
4897
- background = createLayer();
4898
- main = createLayer();
4899
- overlayConnectablePorts = createOverlayLayer();
4900
- overlayDraggableEdges = createOverlayLayer();
5033
+ background = createLayer(0);
5034
+ main = createLayer(1);
5035
+ overlayConnectablePorts = createOverlayLayer(1);
5036
+ overlayDraggableEdges = createOverlayLayer(1);
5037
+ overlayRectangularSelection = createOverlayLayer(2);
4901
5038
  host = createHost();
4902
5039
  constructor(element) {
4903
5040
  this.element = element;
@@ -4906,12 +5043,14 @@
4906
5043
  this.host.appendChild(this.main);
4907
5044
  this.host.appendChild(this.overlayConnectablePorts);
4908
5045
  this.host.appendChild(this.overlayDraggableEdges);
5046
+ this.host.appendChild(this.overlayRectangularSelection);
4909
5047
  }
4910
5048
  destroy() {
4911
5049
  this.host.removeChild(this.background);
4912
5050
  this.host.removeChild(this.main);
4913
5051
  this.host.removeChild(this.overlayConnectablePorts);
4914
5052
  this.host.removeChild(this.overlayDraggableEdges);
5053
+ this.host.removeChild(this.overlayRectangularSelection);
4915
5054
  this.element.removeChild(this.host);
4916
5055
  }
4917
5056
  };
@@ -4926,20 +5065,13 @@
4926
5065
  edgeStiffness: 1e3,
4927
5066
  dtSec: .01,
4928
5067
  maxIterations: 1e3,
4929
- convergenceVelocity: 10,
5068
+ stopVelocity: 10,
4930
5069
  maxForce: 1e7,
4931
5070
  nodeForceCoefficient: 1,
4932
5071
  barnesHutAreaRadiusThreshold: .01,
4933
5072
  barnesHutTheta: 1
4934
5073
  });
4935
5074
  //#endregion
4936
- //#region src/canvas-builder/shared/selection-defaults.ts
4937
- var selectionDefaults = Object.freeze({
4938
- mouseDownEventVerifier: (event) => event.button === 0,
4939
- mouseUpEventVerifier: (event) => event.button === 0,
4940
- movementThreshold: 10
4941
- });
4942
- //#endregion
4943
5075
  //#region src/canvas-builder/shared/noop-fn/noop-fn.ts
4944
5076
  var noopFn = () => {};
4945
5077
  //#endregion
@@ -5005,27 +5137,28 @@
5005
5137
  }
5006
5138
  };
5007
5139
  //#endregion
5140
+ //#region src/canvas-builder/shared/lmb-ctrl-mouse-event-verifier/lmb-ctrl-mouse-event-verifier.ts
5141
+ var lmbCtrlMouseEventVerifier = (event) => event.button === 0 && event.ctrlKey;
5142
+ //#endregion
5143
+ //#region src/canvas-builder/shared/lmb-mouse-event-verifier/lmb-mouse-event-verifier.ts
5144
+ var lmbMouseEventVerifier = (event) => event.button === 0;
5145
+ //#endregion
5146
+ //#region src/canvas-builder/shared/lmb-no-ctrl-mouse-event-verifier/lmb-no-ctrl-mouse-event-verifier.ts
5147
+ var lmbNoCtrlMouseEventVerifier = (event) => event.button === 0 && !event.ctrlKey;
5148
+ //#endregion
5008
5149
  //#region src/canvas-builder/create-draggable-nodes-params/create-draggable-nodes-params.ts
5009
5150
  var createDraggableNodesParams = (config) => {
5010
- const nodeDragVerifier = config.nodeDragVerifier ?? (() => true);
5011
5151
  const moveOnTop = config.moveOnTop !== false;
5012
- const moveEdgesOnTop = config.moveEdgesOnTop !== false && moveOnTop;
5013
- const cursor = config.mouse?.dragCursor;
5014
- const dragCursor = cursor !== void 0 ? cursor : "grab";
5015
- const defaultMouseDownEventVerifier = config.mouse?.mouseDownEventVerifier;
5016
- const mouseDownEventVerifier = defaultMouseDownEventVerifier !== void 0 ? defaultMouseDownEventVerifier : (event) => event.button === 0;
5017
- const defaultMouseUpEventVerifier = config.mouse?.mouseUpEventVerifier;
5018
- const mouseUpEventVerifier = defaultMouseUpEventVerifier !== void 0 ? defaultMouseUpEventVerifier : (event) => event.button === 0;
5019
5152
  return {
5020
5153
  moveOnTop,
5021
- moveEdgesOnTop,
5022
- dragCursor,
5154
+ moveEdgesOnTop: config.moveEdgesOnTop !== false && moveOnTop,
5155
+ dragCursor: config.mouse?.dragCursor ?? "grab",
5023
5156
  gridSize: config.gridSize ?? null,
5024
- mouseDownEventVerifier,
5025
- mouseUpEventVerifier,
5157
+ mouseDownEventVerifier: config.mouse?.mouseDownEventVerifier ?? lmbNoCtrlMouseEventVerifier,
5158
+ mouseUpEventVerifier: config.mouse?.mouseUpEventVerifier ?? lmbMouseEventVerifier,
5026
5159
  onNodeDragStarted: config.events?.onNodeDragStarted ?? noopFn,
5027
5160
  onNodeDrag: config.events?.onNodeDrag ?? noopFn,
5028
- nodeDragVerifier,
5161
+ nodeDragVerifier: config.nodeDragVerifier ?? (() => true),
5029
5162
  onNodeDragFinished: config.events?.onNodeDragFinished ?? noopFn
5030
5163
  };
5031
5164
  };
@@ -5115,33 +5248,26 @@
5115
5248
  //#endregion
5116
5249
  //#region src/canvas-builder/create-transformable-viewport-params/create-transformable-viewport-params.ts
5117
5250
  var createTransformableViewportParams = (transformConfig) => {
5118
- const configWheelSensitivity = transformConfig?.scale?.mouseWheelSensitivity;
5119
- const wheelSensitivity = configWheelSensitivity !== void 0 ? configWheelSensitivity : 1.2;
5120
5251
  const preprocessors = transformConfig?.transformPreprocessor;
5121
5252
  let transformPreprocessor;
5122
- if (preprocessors !== void 0) if (Array.isArray(preprocessors)) transformPreprocessor = createCombinedTransformPreprocessor(preprocessors.map((preprocessor) => resolveTransformPreprocessor(preprocessor)));
5253
+ if (preprocessors !== void 0) if (Array.isArray(preprocessors)) transformPreprocessor = createCombinedTransformPreprocessor(preprocessors.map((preprocessor) => {
5254
+ return resolveTransformPreprocessor(preprocessor);
5255
+ }));
5123
5256
  else transformPreprocessor = resolveTransformPreprocessor(preprocessors);
5124
5257
  else transformPreprocessor = (params) => {
5125
5258
  return params.nextTransform;
5126
5259
  };
5127
- const shiftCursor = transformConfig?.pan?.cursor !== void 0 ? transformConfig.pan.cursor : "grab";
5128
- const defaultMouseDownEventVerifier = transformConfig?.pan?.mouseDownEventVerifier;
5129
- const mouseDownEventVerifier = defaultMouseDownEventVerifier !== void 0 ? defaultMouseDownEventVerifier : (event) => event.button === 0;
5130
- const defaultMouseUpEventVerifier = transformConfig?.pan?.mouseUpEventVerifier;
5131
- const mouseUpEventVerifier = defaultMouseUpEventVerifier !== void 0 ? defaultMouseUpEventVerifier : (event) => event.button === 0;
5132
- const defaultMouseWheelEventVerifier = transformConfig?.scale?.mouseWheelEventVerifier;
5133
- const mouseWheelEventVerifier = defaultMouseWheelEventVerifier !== void 0 ? defaultMouseWheelEventVerifier : () => true;
5134
5260
  return {
5135
- wheelSensitivity,
5261
+ wheelSensitivity: transformConfig?.scale?.mouseWheelSensitivity ?? 1.2,
5136
5262
  onTransformStarted: transformConfig?.events?.onTransformStarted ?? noopFn,
5137
5263
  onTransformFinished: transformConfig?.events?.onTransformFinished ?? noopFn,
5138
5264
  onBeforeTransformChange: transformConfig?.events?.onBeforeTransformChange ?? noopFn,
5139
5265
  onTransformChange: transformConfig?.events?.onTransformChange ?? noopFn,
5140
5266
  transformPreprocessor,
5141
- shiftCursor,
5142
- mouseDownEventVerifier,
5143
- mouseUpEventVerifier,
5144
- mouseWheelEventVerifier,
5267
+ shiftCursor: transformConfig?.pan?.cursor ?? "grab",
5268
+ mouseDownEventVerifier: transformConfig?.pan?.mouseDownEventVerifier ?? lmbNoCtrlMouseEventVerifier,
5269
+ mouseUpEventVerifier: transformConfig?.pan?.mouseUpEventVerifier ?? lmbMouseEventVerifier,
5270
+ mouseWheelEventVerifier: transformConfig?.scale?.mouseWheelEventVerifier ?? (() => true),
5145
5271
  scaleWheelFinishTimeout: transformConfig?.scale?.wheelFinishTimeout ?? 500,
5146
5272
  onResizeTransformStarted: transformConfig?.events?.onResizeTransformStarted ?? noopFn,
5147
5273
  onResizeTransformFinished: transformConfig?.events?.onResizeTransformFinished ?? noopFn
@@ -5179,8 +5305,7 @@
5179
5305
  var defaults$3 = Object.freeze({
5180
5306
  connectionTypeResolver: () => "direct",
5181
5307
  connectionPreprocessor: (request) => request,
5182
- connectionAllowedVerifier: () => true,
5183
- mouseEventVerifier: (event) => event.button === 0
5308
+ connectionAllowedVerifier: () => true
5184
5309
  });
5185
5310
  //#endregion
5186
5311
  //#region src/canvas-builder/create-connectable-ports-params/create-connectable-ports-params.ts
@@ -5192,20 +5317,20 @@
5192
5317
  draggingPortDirectionResolver: resolveDraggingPortDirectionResolver(config.dragPortDirection, graph, connectionAllowedVerifier),
5193
5318
  edgeShapeFactory: config.edgeShape !== void 0 ? resolveEdgeShapeFactory(config.edgeShape) : defaultEdgeShapeFactory,
5194
5319
  connectionPreprocessor: config.connectionPreprocessor ?? defaults$3.connectionPreprocessor,
5195
- mouseDownEventVerifier: config.mouseDownEventVerifier ?? defaults$3.mouseEventVerifier,
5196
- mouseUpEventVerifier: config.mouseUpEventVerifier ?? defaults$3.mouseEventVerifier,
5320
+ mouseDownEventVerifier: config.mouseDownEventVerifier ?? lmbNoCtrlMouseEventVerifier,
5321
+ mouseUpEventVerifier: config.mouseUpEventVerifier ?? lmbMouseEventVerifier,
5197
5322
  onAfterEdgeCreated: config.events?.onAfterEdgeCreated ?? noopFn,
5198
5323
  onEdgeCreationInterrupted: config.events?.onEdgeCreationInterrupted ?? noopFn,
5199
- onEdgeCreationPrevented: config.events?.onEdgeCreationPrevented ?? noopFn
5324
+ onEdgeCreationPrevented: config.events?.onEdgeCreationPrevented ?? noopFn,
5325
+ grabbedPortIdResolver: config.grabbedPortIdResolver ?? defaultPortIdResolver,
5326
+ releasedPortIdResolver: config.releasedPortIdResolver ?? defaultPortIdResolver
5200
5327
  };
5201
5328
  };
5202
5329
  //#endregion
5203
5330
  //#region src/canvas-builder/create-draggable-edges-params/defaults.ts
5204
5331
  var defaults$2 = Object.freeze({
5205
5332
  connectionAllowedVerifier: () => true,
5206
- connectionPreprocessor: (request) => request,
5207
- mouseDownEventVerifier: (event) => event.button === 0,
5208
- mouseUpEventVerifier: (event) => event.button === 0
5333
+ connectionPreprocessor: (request) => request
5209
5334
  });
5210
5335
  //#endregion
5211
5336
  //#region src/canvas-builder/create-draggable-edges-params/create-draggable-edges-params.ts
@@ -5219,14 +5344,16 @@
5219
5344
  return {
5220
5345
  connectionPreprocessor: config.connectionPreprocessor ?? defaults$2.connectionPreprocessor,
5221
5346
  connectionAllowedVerifier,
5222
- mouseDownEventVerifier: config.mouseDownEventVerifier ?? defaults$2.mouseDownEventVerifier,
5223
- mouseUpEventVerifier: config.mouseUpEventVerifier ?? defaults$2.mouseUpEventVerifier,
5347
+ mouseDownEventVerifier: config.mouseDownEventVerifier ?? lmbNoCtrlMouseEventVerifier,
5348
+ mouseUpEventVerifier: config.mouseUpEventVerifier ?? lmbMouseEventVerifier,
5224
5349
  draggingEdgeResolver: config.draggingEdgeResolver ?? defaultDraggingEdgeResolver,
5225
5350
  draggingEdgeShapeFactory: config.draggingEdgeShape !== void 0 ? resolveEdgeShapeFactory(config.draggingEdgeShape) : null,
5226
5351
  onAfterEdgeReattached: config.events?.onAfterEdgeReattached ?? noopFn,
5227
5352
  onEdgeReattachInterrupted: config.events?.onEdgeReattachInterrupted ?? noopFn,
5228
5353
  onEdgeReattachPrevented: config.events?.onEdgeReattachPrevented ?? noopFn,
5229
- draggingPortDirectionResolver: resolveDraggingPortDirectionResolver(config.dragPortDirection, graph, connectionAllowedVerifier)
5354
+ draggingPortDirectionResolver: resolveDraggingPortDirectionResolver(config.dragPortDirection, graph, connectionAllowedVerifier),
5355
+ grabbedPortIdResolver: config.grabbedPortIdResolver ?? defaultPortIdResolver,
5356
+ releasedPortIdResolver: config.releasedPortIdResolver ?? defaultPortIdResolver
5230
5357
  };
5231
5358
  };
5232
5359
  //#endregion
@@ -5884,14 +6011,14 @@
5884
6011
  nodeMass;
5885
6012
  edgeEquilibriumLength;
5886
6013
  edgeStiffness;
5887
- convergenceVelocity;
6014
+ stopVelocity;
5888
6015
  constructor(params) {
5889
6016
  this.maxIterations = params.maxIterations;
5890
6017
  this.dtSec = params.dtSec;
5891
6018
  this.nodeMass = params.nodeMass;
5892
6019
  this.edgeEquilibriumLength = params.edgeEquilibriumLength;
5893
6020
  this.edgeStiffness = params.edgeStiffness;
5894
- this.convergenceVelocity = params.stopVelocity;
6021
+ this.stopVelocity = params.stopVelocity;
5895
6022
  this.distanceVectorGenerator = new DistanceVectorGenerator(params.rand);
5896
6023
  this.nodeForcesApplicationStrategy = resolveNodeForcesApplicationStrategy({
5897
6024
  distanceVectorGenerator: this.distanceVectorGenerator,
@@ -5920,7 +6047,7 @@
5920
6047
  nodeMass: this.nodeMass,
5921
6048
  edgeEquilibriumLength: this.edgeEquilibriumLength,
5922
6049
  edgeStiffness: this.edgeStiffness
5923
- }).apply() < this.convergenceVelocity) break;
6050
+ }).apply() < this.stopVelocity) break;
5924
6051
  return currentCoords;
5925
6052
  }
5926
6053
  };
@@ -6140,14 +6267,14 @@
6140
6267
  var ForceDirectedAnimatedLayoutAlgorithm = class {
6141
6268
  distanceVectorGenerator;
6142
6269
  nodeForcesApplicationStrategy;
6143
- convergenceVelocity;
6270
+ stopVelocity;
6144
6271
  maxTimeDeltaSec;
6145
6272
  nodeMass;
6146
6273
  edgeEquilibriumLength;
6147
6274
  edgeStiffness;
6148
6275
  fillerLayoutAlgorithm;
6149
6276
  constructor(params) {
6150
- this.convergenceVelocity = params.stopVelocity;
6277
+ this.stopVelocity = params.stopVelocity;
6151
6278
  this.maxTimeDeltaSec = params.maxTimeDeltaSec;
6152
6279
  this.nodeMass = params.nodeMass;
6153
6280
  this.edgeEquilibriumLength = params.edgeEquilibriumLength;
@@ -6180,7 +6307,7 @@
6180
6307
  nodeMass: this.nodeMass,
6181
6308
  edgeEquilibriumLength: this.edgeEquilibriumLength,
6182
6309
  edgeStiffness: this.edgeStiffness
6183
- }).apply() < this.convergenceVelocity) {
6310
+ }).apply() < this.stopVelocity) {
6184
6311
  if (!graph.getAllNodeIds().some((nodeId) => {
6185
6312
  const node = graph.getNode(nodeId);
6186
6313
  return node.x === null || node.y === null;
@@ -6246,7 +6373,7 @@
6246
6373
  nodeMass: config?.nodeMass ?? forceDirectedDefaults.nodeMass,
6247
6374
  edgeEquilibriumLength: config?.edgeEquilibriumLength ?? forceDirectedDefaults.edgeEquilibriumLength,
6248
6375
  edgeStiffness: config?.edgeStiffness ?? forceDirectedDefaults.edgeStiffness,
6249
- stopVelocity: config?.stopVelocity ?? forceDirectedDefaults.convergenceVelocity,
6376
+ stopVelocity: config?.stopVelocity ?? forceDirectedDefaults.stopVelocity,
6250
6377
  maxForce: config?.maxForce ?? forceDirectedDefaults.maxForce,
6251
6378
  nodeForceCoefficient: config?.nodeForceCoefficient ?? forceDirectedDefaults.nodeForceCoefficient,
6252
6379
  barnesHutTheta: config?.barnesHut?.theta ?? forceDirectedDefaults.barnesHutTheta,
@@ -6470,7 +6597,7 @@
6470
6597
  nodeMass: config?.nodeMass ?? forceDirectedDefaults.nodeMass,
6471
6598
  edgeEquilibriumLength: config?.edgeEquilibriumLength ?? forceDirectedDefaults.edgeEquilibriumLength,
6472
6599
  edgeStiffness: config?.edgeStiffness ?? forceDirectedDefaults.edgeStiffness,
6473
- stopVelocity: config?.stopVelocity ?? forceDirectedDefaults.convergenceVelocity,
6600
+ stopVelocity: config?.stopVelocity ?? forceDirectedDefaults.stopVelocity,
6474
6601
  maxForce: config?.maxForce ?? forceDirectedDefaults.maxForce,
6475
6602
  nodeForceCoefficient: config?.nodeForceCoefficient ?? forceDirectedDefaults.nodeForceCoefficient,
6476
6603
  barnesHutTheta: config?.barnesHut?.theta ?? forceDirectedDefaults.barnesHutTheta,
@@ -6596,9 +6723,9 @@
6596
6723
  var createUserSelectableNodesParams = (config) => {
6597
6724
  return {
6598
6725
  onNodeSelected: config.onNodeSelected,
6599
- mouseDownEventVerifier: config.mouseDownEventVerifier ?? selectionDefaults.mouseDownEventVerifier,
6600
- mouseUpEventVerifier: config.mouseUpEventVerifier ?? selectionDefaults.mouseUpEventVerifier,
6601
- movementThreshold: config.movementThreshold ?? selectionDefaults.movementThreshold
6726
+ mouseDownEventVerifier: config.mouseDownEventVerifier ?? lmbNoCtrlMouseEventVerifier,
6727
+ mouseUpEventVerifier: config.mouseUpEventVerifier ?? lmbMouseEventVerifier,
6728
+ movementThreshold: config.movementThreshold ?? 10
6602
6729
  };
6603
6730
  };
6604
6731
  //#endregion
@@ -6606,9 +6733,9 @@
6606
6733
  var createUserSelectableCanvasParams = (config) => {
6607
6734
  return {
6608
6735
  onCanvasSelected: config.onCanvasSelected,
6609
- mouseDownEventVerifier: config.mouseDownEventVerifier ?? selectionDefaults.mouseDownEventVerifier,
6610
- mouseUpEventVerifier: config.mouseUpEventVerifier ?? selectionDefaults.mouseUpEventVerifier,
6611
- movementThreshold: config.movementThreshold ?? selectionDefaults.movementThreshold
6736
+ mouseDownEventVerifier: config.mouseDownEventVerifier ?? lmbNoCtrlMouseEventVerifier,
6737
+ mouseUpEventVerifier: config.mouseUpEventVerifier ?? lmbMouseEventVerifier,
6738
+ movementThreshold: config.movementThreshold ?? 10
6612
6739
  };
6613
6740
  };
6614
6741
  //#endregion
@@ -6616,9 +6743,32 @@
6616
6743
  var createUserSelectableEdgesParams = (config) => {
6617
6744
  return {
6618
6745
  onEdgeSelected: config.onEdgeSelected,
6619
- mouseDownEventVerifier: config.mouseDownEventVerifier ?? selectionDefaults.mouseDownEventVerifier,
6620
- mouseUpEventVerifier: config.mouseUpEventVerifier ?? selectionDefaults.mouseUpEventVerifier,
6621
- movementThreshold: config.movementThreshold ?? selectionDefaults.movementThreshold
6746
+ mouseDownEventVerifier: config.mouseDownEventVerifier ?? lmbNoCtrlMouseEventVerifier,
6747
+ mouseUpEventVerifier: config.mouseUpEventVerifier ?? lmbMouseEventVerifier,
6748
+ movementThreshold: config.movementThreshold ?? 10
6749
+ };
6750
+ };
6751
+ //#endregion
6752
+ //#region src/canvas-builder/create-rectangular-selection-params/create-default-rectangle-element/create-default-rectangle-element.ts
6753
+ var createDefaultRectangleElement = () => {
6754
+ const element = document.createElement("div");
6755
+ element.style.width = "100%";
6756
+ element.style.height = "100%";
6757
+ element.style.background = "rgba(174, 238, 255, 0.34)";
6758
+ element.style.border = "1px dashed rgba(96, 96, 96, 0.47)";
6759
+ return element;
6760
+ };
6761
+ //#endregion
6762
+ //#region src/canvas-builder/create-rectangular-selection-params/create-rectangular-selection-params.ts
6763
+ var createRectangularSelectionParams = (config) => {
6764
+ return {
6765
+ rectangleElement: config?.rectangleElement ?? createDefaultRectangleElement(),
6766
+ mouseDownEventVerifier: config?.mouseDownEventVerifier ?? lmbCtrlMouseEventVerifier,
6767
+ mouseUpEventVerifier: config?.mouseUpEventVerifier ?? lmbMouseEventVerifier,
6768
+ onSelectionStarted: config?.onSelectionStarted ?? noopFn,
6769
+ onSelectionChange: config?.onSelectionChange ?? noopFn,
6770
+ onSelectionInterrupted: config?.onSelectionInterrupted ?? noopFn,
6771
+ onSelectionFinished: config?.onSelectionFinished ?? noopFn
6622
6772
  };
6623
6773
  };
6624
6774
  //#endregion
@@ -6632,6 +6782,7 @@
6632
6782
  backgroundConfig = {};
6633
6783
  connectablePortsConfig = {};
6634
6784
  draggableEdgesConfig = {};
6785
+ rectangularSelectionConfig = void 0;
6635
6786
  virtualScrollConfig = void 0;
6636
6787
  layoutConfig = {};
6637
6788
  animatedLayoutConfig = {};
@@ -6644,6 +6795,7 @@
6644
6795
  hasBackground = false;
6645
6796
  hasUserConnectablePorts = false;
6646
6797
  hasUserDraggableEdges = false;
6798
+ hasRectangularSelection = false;
6647
6799
  hasAnimatedLayout = false;
6648
6800
  hasLayout = false;
6649
6801
  boxRenderingTrigger = new EventSubject();
@@ -6692,6 +6844,11 @@
6692
6844
  this.draggableEdgesConfig = config ?? {};
6693
6845
  return this;
6694
6846
  }
6847
+ enableRectangularSelection(config) {
6848
+ this.hasRectangularSelection = true;
6849
+ this.rectangularSelectionConfig = config;
6850
+ return this;
6851
+ }
6695
6852
  enableLayout(config) {
6696
6853
  this.layoutConfig = config ?? {};
6697
6854
  this.hasLayout = true;
@@ -6762,6 +6919,7 @@
6762
6919
  }
6763
6920
  if (this.virtualScrollConfig !== void 0) UserTransformableViewportVirtualScrollConfigurator.configure(canvas, layers.main, this.window, createTransformableViewportParams(this.transformConfig), this.boxRenderingTrigger, this.pointInsideVerifier, this.eventTagger, createVirtualScrollParams(this.virtualScrollConfig));
6764
6921
  else if (this.hasTransformableViewport) UserTransformableViewportConfigurator.configure(canvas, layers.main, this.window, this.pointInsideVerifier, this.eventTagger, createTransformableViewportParams(this.transformConfig));
6922
+ if (this.hasRectangularSelection) RectangularSelectionConfigurator.configure(canvas, layers.main, layers.overlayRectangularSelection, this.pointInsideVerifier, this.eventTagger, this.window, createRectangularSelectionParams(this.rectangularSelectionConfig));
6765
6923
  if (this.hasLayout) LayoutConfigurator.configure(canvas, layoutParams);
6766
6924
  if (this.hasAnimatedLayout) {
6767
6925
  let config = createAnimatedLayoutParams(this.animatedLayoutConfig);
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@html-graph/html-graph",
3
3
  "author": "Dmitry Marov <d.marov94@gmail.com>",
4
4
  "private": false,
5
- "version": "9.0.0",
5
+ "version": "9.2.0",
6
6
  "type": "module",
7
7
  "main": "dist/html-graph.js",
8
8
  "types": "dist/html-graph.d.ts",