@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.
@@ -7,7 +7,7 @@ var ConnectionCategory = /* @__PURE__ */ function(ConnectionCategory) {
7
7
  }({});
8
8
  //#endregion
9
9
  //#region src/html-view/core-html-view/create-host/create-host.ts
10
- var createHost$1 = () => {
10
+ var createHost$2 = () => {
11
11
  const host = document.createElement("div");
12
12
  host.style.width = "100%";
13
13
  host.style.height = "100%";
@@ -49,7 +49,7 @@ var CoreHtmlView = class {
49
49
  graphStore;
50
50
  viewportStore;
51
51
  element;
52
- host = createHost$1();
52
+ host = createHost$2();
53
53
  container = createContainer();
54
54
  edgeIdToElementMap = /* @__PURE__ */ new Map();
55
55
  attachedNodeIds = /* @__PURE__ */ new Set();
@@ -768,7 +768,7 @@ var GraphStore = class {
768
768
  if (request.from !== void 0 && !this.hasPort(request.from)) throw new CanvasError(canvasErrorText.updateNonexistentEdgeSource(edgeId, request.from));
769
769
  if (request.to !== void 0 && !this.hasPort(request.to)) throw new CanvasError(canvasErrorText.updateNonexistentEdgeTarget(edgeId, request.to));
770
770
  const edge = this.getEdge(edgeId);
771
- const payload = edge.payload;
771
+ const { payload } = edge;
772
772
  this.removeEdgeInternal(edgeId);
773
773
  this.addEdgeInternal({
774
774
  id: edgeId,
@@ -778,7 +778,7 @@ var GraphStore = class {
778
778
  priority: payload.priority
779
779
  });
780
780
  }
781
- const edge = this.edges.get(edgeId);
781
+ const edge = this.getEdge(edgeId);
782
782
  if (request.shape !== void 0) {
783
783
  edge.payload.shape = request.shape;
784
784
  this.afterEdgeShapeUpdatedEmitter.emit(edgeId);
@@ -1097,10 +1097,10 @@ var createAddNodeOverlayRequest = (payload) => {
1097
1097
  };
1098
1098
  //#endregion
1099
1099
  //#region src/configurators/shared/find-port-at-point/find-port-for-element/find-port-for-element.ts
1100
- var findPortForElement = (graph, element) => {
1100
+ var findPortForElement = (graph, element, portIdResolver) => {
1101
1101
  let elementBuf = element;
1102
1102
  while (elementBuf !== null) {
1103
- const portId = graph.findPortIdsByElement(elementBuf)[0] ?? null;
1103
+ const portId = portIdResolver(graph.findPortIdsByElement(elementBuf));
1104
1104
  if (portId !== null) return {
1105
1105
  status: "portFound",
1106
1106
  portId
@@ -1124,10 +1124,10 @@ function* getElementsAtPoint(root, point) {
1124
1124
  }
1125
1125
  //#endregion
1126
1126
  //#region src/configurators/shared/find-port-at-point/find-port-at-point.ts
1127
- var findPortAtPoint = (graph, point) => {
1127
+ var findPortAtPoint = (graph, point, portIdResolver) => {
1128
1128
  const elements = getElementsAtPoint(document, point);
1129
1129
  for (const element of elements) {
1130
- const result = findPortForElement(graph, element);
1130
+ const result = findPortForElement(graph, element, portIdResolver);
1131
1131
  if (result.status === "portFound") return result.portId;
1132
1132
  if (result.status === "nodeEncountered") return null;
1133
1133
  }
@@ -3333,7 +3333,9 @@ var DraggablePortsConfigurator = class DraggablePortsConfigurator {
3333
3333
  const mouseEvent = event;
3334
3334
  if (!this.params.mouseDownEventVerifier(mouseEvent)) return;
3335
3335
  const target = event.currentTarget;
3336
- const portId = this.canvas.graph.findPortIdsByElement(target)[0];
3336
+ const portIds = this.canvas.graph.findPortIdsByElement(target);
3337
+ const portId = this.params.grabbedPortIdResolver(portIds);
3338
+ if (portId === null) return;
3337
3339
  if (!this.params.onPointerDownVerifier(portId, {
3338
3340
  x: mouseEvent.clientX,
3339
3341
  y: mouseEvent.clientY
@@ -3634,6 +3636,12 @@ var ConstantDraggingPortDirectionResolver = class {
3634
3636
  }
3635
3637
  };
3636
3638
  //#endregion
3639
+ //#region src/configurators/shared/port-id-resolver/default-port-id-resolver/default-port-id-resolver.ts
3640
+ var defaultPortIdResolver = (portIds) => {
3641
+ if (portIds.length > 0) return portIds[0];
3642
+ return null;
3643
+ };
3644
+ //#endregion
3637
3645
  //#region src/configurators/user-draggable-nodes-configurator/user-draggable-nodes-configurator.ts
3638
3646
  var UserDraggableNodesConfigurator = class UserDraggableNodesConfigurator {
3639
3647
  canvas;
@@ -4299,7 +4307,8 @@ var UserConnectablePortsConfigurator = class UserConnectablePortsConfigurator {
4299
4307
  const params = this.edgeInProgress;
4300
4308
  this.resetDragState();
4301
4309
  this.params.onEdgeCreationInterrupted(params);
4302
- }
4310
+ },
4311
+ grabbedPortIdResolver: this.params.grabbedPortIdResolver
4303
4312
  };
4304
4313
  DraggablePortsConfigurator.configure(this.canvas, this.window, this.pointInsideVerifier, this.eventTagger, draggablePortsParams);
4305
4314
  }
@@ -4353,18 +4362,17 @@ var UserConnectablePortsConfigurator = class UserConnectablePortsConfigurator {
4353
4362
  this.overlayCanvas.clear();
4354
4363
  }
4355
4364
  tryCreateConnection(cursor) {
4356
- const targetPortId = findPortAtPoint(this.canvas.graph, cursor);
4365
+ const targetPortId = findPortAtPoint(this.canvas.graph, cursor, this.params.releasedPortIdResolver);
4357
4366
  if (targetPortId === null) {
4358
4367
  this.params.onEdgeCreationInterrupted(this.edgeInProgress);
4359
4368
  return;
4360
4369
  }
4361
4370
  const request = resolveCreateEdgeRequest(this.edgeInProgress, targetPortId);
4362
- const connectionAllowed = this.params.connectionAllowedVerifier(request);
4363
- const processedRequest = this.params.connectionPreprocessor({
4364
- from: request.from,
4365
- to: request.to
4366
- });
4367
- if (connectionAllowed && processedRequest !== null) {
4371
+ if (this.params.connectionAllowedVerifier(request)) {
4372
+ const processedRequest = this.params.connectionPreprocessor({
4373
+ from: request.from,
4374
+ to: request.to
4375
+ });
4368
4376
  this.canvas.graph.onAfterEdgeAdded.subscribe(this.onEdgeCreated);
4369
4377
  this.canvas.addEdge(processedRequest);
4370
4378
  this.canvas.graph.onAfterEdgeAdded.unsubscribe(this.onEdgeCreated);
@@ -4434,7 +4442,8 @@ var UserDraggableEdgesConfigurator = class UserDraggableEdgesConfigurator {
4434
4442
  shape: edge.shape,
4435
4443
  priority: edge.priority
4436
4444
  });
4437
- }
4445
+ },
4446
+ grabbedPortIdResolver: this.params.grabbedPortIdResolver
4438
4447
  };
4439
4448
  DraggablePortsConfigurator.configure(this.canvas, this.window, this.pointInsideVerifier, this.eventTagger, draggablePortsParams);
4440
4449
  }
@@ -4524,7 +4533,7 @@ var UserDraggableEdgesConfigurator = class UserDraggableEdgesConfigurator {
4524
4533
  }).updatePort(OverlayId.DraggingNodeId, { direction });
4525
4534
  }
4526
4535
  tryCreateConnection(cursor) {
4527
- const draggingPortId = findPortAtPoint(this.canvas.graph, cursor);
4536
+ const draggingPortId = findPortAtPoint(this.canvas.graph, cursor, this.params.releasedPortIdResolver);
4528
4537
  this.overlayCanvas.removeEdge(OverlayId.EdgeId);
4529
4538
  if (draggingPortId === null) {
4530
4539
  const edge = this.draggingEdgePayload;
@@ -4711,19 +4720,17 @@ var AnimatedLayoutApplier = class {
4711
4720
  //#endregion
4712
4721
  //#region src/configurators/animated-layout-configurator/animated-layout-configurator.ts
4713
4722
  var AnimatedLayoutConfigurator = class AnimatedLayoutConfigurator {
4714
- win;
4715
4723
  applier;
4716
4724
  step = (dt) => {
4717
4725
  this.applier.apply(dt);
4718
4726
  };
4719
4727
  constructor(canvas, params, win) {
4720
- this.win = win;
4721
4728
  this.applier = new AnimatedLayoutApplier(canvas, params.algorithm, {
4722
4729
  staticNodeResolver: params.staticNodeResolver,
4723
4730
  onBeforeApplied: params.onBeforeApplied,
4724
4731
  onAfterApplied: params.onAfterApplied
4725
4732
  });
4726
- new AnimationSeries(this.win, this.step);
4733
+ new AnimationSeries(win, this.step);
4727
4734
  }
4728
4735
  static configure(canvas, params, win) {
4729
4736
  new AnimatedLayoutConfigurator(canvas, params, win);
@@ -4863,6 +4870,134 @@ var UserSelectableCanvasConfigurator = class UserSelectableCanvasConfigurator {
4863
4870
  }
4864
4871
  };
4865
4872
  //#endregion
4873
+ //#region src/configurators/rectangular-selection-configurator/create-host/create-host.ts
4874
+ var createHost$1 = () => {
4875
+ const element = document.createElement("div");
4876
+ element.style.width = "100%";
4877
+ element.style.height = "100%";
4878
+ element.style.position = "relative";
4879
+ return element;
4880
+ };
4881
+ //#endregion
4882
+ //#region src/configurators/rectangular-selection-configurator/create-selection-rectangle-wrapper/create-selection-rectangle-wrapper.ts
4883
+ var createSelectionRectangleWrapper = () => {
4884
+ const element = document.createElement("div");
4885
+ element.style.position = "absolute";
4886
+ return element;
4887
+ };
4888
+ //#endregion
4889
+ //#region src/configurators/rectangular-selection-configurator/rectangular-selection-configurator.ts
4890
+ var RectangularSelectionConfigurator = class RectangularSelectionConfigurator {
4891
+ canvas;
4892
+ mainElement;
4893
+ overlayLayer;
4894
+ pointInsideVerifier;
4895
+ eventTagger;
4896
+ win;
4897
+ params;
4898
+ host = createHost$1();
4899
+ selectionRectangleWrapper = createSelectionRectangleWrapper();
4900
+ initialContentPoint = null;
4901
+ draggingViewportPoint = null;
4902
+ eventHandledTag = dragEventHandledTag;
4903
+ onAfterViewportUpdated = () => {
4904
+ this.updateSelectionRectangle();
4905
+ };
4906
+ onCanvasMouseDown = (event) => {
4907
+ const mouseEvent = event;
4908
+ if (!this.params.mouseDownEventVerifier(mouseEvent)) return;
4909
+ if (this.eventTagger.has(event, this.eventHandledTag)) return;
4910
+ this.params.onSelectionStarted();
4911
+ const rect = this.mainElement.getBoundingClientRect();
4912
+ const cursorViewportCoords = {
4913
+ x: mouseEvent.clientX - rect.x,
4914
+ y: mouseEvent.clientY - rect.y
4915
+ };
4916
+ this.initialContentPoint = this.canvas.viewport.createContentCoords(cursorViewportCoords);
4917
+ this.draggingViewportPoint = cursorViewportCoords;
4918
+ this.updateSelectionRectangle();
4919
+ this.host.appendChild(this.selectionRectangleWrapper);
4920
+ this.win.addEventListener("mousemove", this.onWindowMouseMove, { passive: true });
4921
+ this.win.addEventListener("mouseup", this.onWindowMouseUp, { passive: true });
4922
+ };
4923
+ onWindowMouseMove = (event) => {
4924
+ const mouseEvent = event;
4925
+ if (!this.pointInsideVerifier.verify(mouseEvent.clientX, mouseEvent.clientY)) {
4926
+ this.removeMouseListeners();
4927
+ this.interruptSelection();
4928
+ return;
4929
+ }
4930
+ const rect = this.mainElement.getBoundingClientRect();
4931
+ const cursorViewportCoords = {
4932
+ x: mouseEvent.clientX - rect.x,
4933
+ y: mouseEvent.clientY - rect.y
4934
+ };
4935
+ this.draggingViewportPoint = cursorViewportCoords;
4936
+ this.updateSelectionRectangle();
4937
+ const selectionRect = this.selectionRectangleWrapper.getBoundingClientRect();
4938
+ this.params.onSelectionChange(selectionRect);
4939
+ };
4940
+ onWindowMouseUp = (event) => {
4941
+ const mouseEvent = event;
4942
+ if (!this.params.mouseUpEventVerifier(mouseEvent)) return;
4943
+ this.removeMouseListeners();
4944
+ this.finishSelection();
4945
+ };
4946
+ constructor(canvas, mainElement, overlayLayer, pointInsideVerifier, eventTagger, win, params) {
4947
+ this.canvas = canvas;
4948
+ this.mainElement = mainElement;
4949
+ this.overlayLayer = overlayLayer;
4950
+ this.pointInsideVerifier = pointInsideVerifier;
4951
+ this.eventTagger = eventTagger;
4952
+ this.win = win;
4953
+ this.params = params;
4954
+ this.overlayLayer.appendChild(this.host);
4955
+ this.selectionRectangleWrapper.appendChild(this.params.rectangleElement);
4956
+ this.canvas.viewport.onAfterUpdated.subscribe(this.onAfterViewportUpdated);
4957
+ this.mainElement.addEventListener("mousedown", this.onCanvasMouseDown, { passive: true });
4958
+ this.canvas.onBeforeDestroy.subscribe(() => {
4959
+ this.mainElement.removeEventListener("mousedown", this.onCanvasMouseDown);
4960
+ this.removeMouseListeners();
4961
+ });
4962
+ }
4963
+ static configure(canvas, mainElement, overlayLayer, pointInsideVerifier, eventTagger, win, params) {
4964
+ new RectangularSelectionConfigurator(canvas, mainElement, overlayLayer, pointInsideVerifier, eventTagger, win, params);
4965
+ }
4966
+ updateSelectionRectangle() {
4967
+ if (this.initialContentPoint === null || this.draggingViewportPoint === null) return;
4968
+ const initialViewportPoint = this.canvas.viewport.createViewportCoords(this.initialContentPoint);
4969
+ const draggingViewportPoint = this.draggingViewportPoint;
4970
+ const x = Math.min(initialViewportPoint.x, draggingViewportPoint.x);
4971
+ const y = Math.min(initialViewportPoint.y, draggingViewportPoint.y);
4972
+ const width = Math.abs(draggingViewportPoint.x - initialViewportPoint.x);
4973
+ const height = Math.abs(draggingViewportPoint.y - initialViewportPoint.y);
4974
+ const { style } = this.selectionRectangleWrapper;
4975
+ style.left = `${x}px`;
4976
+ style.top = `${y}px`;
4977
+ style.width = `${width}px`;
4978
+ style.height = `${height}px`;
4979
+ }
4980
+ removeMouseListeners() {
4981
+ this.win.removeEventListener("mousemove", this.onWindowMouseMove);
4982
+ this.win.removeEventListener("mouseup", this.onWindowMouseUp);
4983
+ }
4984
+ finishSelection() {
4985
+ const selectionRect = this.selectionRectangleWrapper.getBoundingClientRect();
4986
+ this.terminateSelection();
4987
+ this.params.onSelectionFinished(selectionRect);
4988
+ }
4989
+ interruptSelection() {
4990
+ const selectionRect = this.selectionRectangleWrapper.getBoundingClientRect();
4991
+ this.terminateSelection();
4992
+ this.params.onSelectionInterrupted(selectionRect);
4993
+ }
4994
+ terminateSelection() {
4995
+ this.host.removeChild(this.selectionRectangleWrapper);
4996
+ this.initialContentPoint = null;
4997
+ this.draggingViewportPoint = null;
4998
+ }
4999
+ };
5000
+ //#endregion
4866
5001
  //#region src/canvas-builder/layers/create-host/create-host.ts
4867
5002
  var createHost = () => {
4868
5003
  const host = document.createElement("div");
@@ -4873,16 +5008,17 @@ var createHost = () => {
4873
5008
  };
4874
5009
  //#endregion
4875
5010
  //#region src/canvas-builder/layers/create-layer/create-layer.ts
4876
- var createLayer = () => {
5011
+ var createLayer = (zIndex) => {
4877
5012
  const host = document.createElement("div");
4878
5013
  host.style.position = "absolute";
4879
5014
  host.style.inset = "0";
5015
+ host.style.zIndex = `${zIndex}`;
4880
5016
  return host;
4881
5017
  };
4882
5018
  //#endregion
4883
5019
  //#region src/canvas-builder/layers/create-overlay-layer/create-overlay-layer.ts
4884
- var createOverlayLayer = () => {
4885
- const layer = createLayer();
5020
+ var createOverlayLayer = (zIndex) => {
5021
+ const layer = createLayer(zIndex);
4886
5022
  layer.style.pointerEvents = "none";
4887
5023
  return layer;
4888
5024
  };
@@ -4890,10 +5026,11 @@ var createOverlayLayer = () => {
4890
5026
  //#region src/canvas-builder/layers/layers.ts
4891
5027
  var Layers = class {
4892
5028
  element;
4893
- background = createLayer();
4894
- main = createLayer();
4895
- overlayConnectablePorts = createOverlayLayer();
4896
- overlayDraggableEdges = createOverlayLayer();
5029
+ background = createLayer(0);
5030
+ main = createLayer(1);
5031
+ overlayConnectablePorts = createOverlayLayer(1);
5032
+ overlayDraggableEdges = createOverlayLayer(1);
5033
+ overlayRectangularSelection = createOverlayLayer(2);
4897
5034
  host = createHost();
4898
5035
  constructor(element) {
4899
5036
  this.element = element;
@@ -4902,12 +5039,14 @@ var Layers = class {
4902
5039
  this.host.appendChild(this.main);
4903
5040
  this.host.appendChild(this.overlayConnectablePorts);
4904
5041
  this.host.appendChild(this.overlayDraggableEdges);
5042
+ this.host.appendChild(this.overlayRectangularSelection);
4905
5043
  }
4906
5044
  destroy() {
4907
5045
  this.host.removeChild(this.background);
4908
5046
  this.host.removeChild(this.main);
4909
5047
  this.host.removeChild(this.overlayConnectablePorts);
4910
5048
  this.host.removeChild(this.overlayDraggableEdges);
5049
+ this.host.removeChild(this.overlayRectangularSelection);
4911
5050
  this.element.removeChild(this.host);
4912
5051
  }
4913
5052
  };
@@ -4922,20 +5061,13 @@ var forceDirectedDefaults = Object.freeze({
4922
5061
  edgeStiffness: 1e3,
4923
5062
  dtSec: .01,
4924
5063
  maxIterations: 1e3,
4925
- convergenceVelocity: 10,
5064
+ stopVelocity: 10,
4926
5065
  maxForce: 1e7,
4927
5066
  nodeForceCoefficient: 1,
4928
5067
  barnesHutAreaRadiusThreshold: .01,
4929
5068
  barnesHutTheta: 1
4930
5069
  });
4931
5070
  //#endregion
4932
- //#region src/canvas-builder/shared/selection-defaults.ts
4933
- var selectionDefaults = Object.freeze({
4934
- mouseDownEventVerifier: (event) => event.button === 0,
4935
- mouseUpEventVerifier: (event) => event.button === 0,
4936
- movementThreshold: 10
4937
- });
4938
- //#endregion
4939
5071
  //#region src/canvas-builder/shared/noop-fn/noop-fn.ts
4940
5072
  var noopFn = () => {};
4941
5073
  //#endregion
@@ -5001,27 +5133,28 @@ var resolveEdgeShapeFactory = (config) => {
5001
5133
  }
5002
5134
  };
5003
5135
  //#endregion
5136
+ //#region src/canvas-builder/shared/lmb-ctrl-mouse-event-verifier/lmb-ctrl-mouse-event-verifier.ts
5137
+ var lmbCtrlMouseEventVerifier = (event) => event.button === 0 && event.ctrlKey;
5138
+ //#endregion
5139
+ //#region src/canvas-builder/shared/lmb-mouse-event-verifier/lmb-mouse-event-verifier.ts
5140
+ var lmbMouseEventVerifier = (event) => event.button === 0;
5141
+ //#endregion
5142
+ //#region src/canvas-builder/shared/lmb-no-ctrl-mouse-event-verifier/lmb-no-ctrl-mouse-event-verifier.ts
5143
+ var lmbNoCtrlMouseEventVerifier = (event) => event.button === 0 && !event.ctrlKey;
5144
+ //#endregion
5004
5145
  //#region src/canvas-builder/create-draggable-nodes-params/create-draggable-nodes-params.ts
5005
5146
  var createDraggableNodesParams = (config) => {
5006
- const nodeDragVerifier = config.nodeDragVerifier ?? (() => true);
5007
5147
  const moveOnTop = config.moveOnTop !== false;
5008
- const moveEdgesOnTop = config.moveEdgesOnTop !== false && moveOnTop;
5009
- const cursor = config.mouse?.dragCursor;
5010
- const dragCursor = cursor !== void 0 ? cursor : "grab";
5011
- const defaultMouseDownEventVerifier = config.mouse?.mouseDownEventVerifier;
5012
- const mouseDownEventVerifier = defaultMouseDownEventVerifier !== void 0 ? defaultMouseDownEventVerifier : (event) => event.button === 0;
5013
- const defaultMouseUpEventVerifier = config.mouse?.mouseUpEventVerifier;
5014
- const mouseUpEventVerifier = defaultMouseUpEventVerifier !== void 0 ? defaultMouseUpEventVerifier : (event) => event.button === 0;
5015
5148
  return {
5016
5149
  moveOnTop,
5017
- moveEdgesOnTop,
5018
- dragCursor,
5150
+ moveEdgesOnTop: config.moveEdgesOnTop !== false && moveOnTop,
5151
+ dragCursor: config.mouse?.dragCursor ?? "grab",
5019
5152
  gridSize: config.gridSize ?? null,
5020
- mouseDownEventVerifier,
5021
- mouseUpEventVerifier,
5153
+ mouseDownEventVerifier: config.mouse?.mouseDownEventVerifier ?? lmbNoCtrlMouseEventVerifier,
5154
+ mouseUpEventVerifier: config.mouse?.mouseUpEventVerifier ?? lmbMouseEventVerifier,
5022
5155
  onNodeDragStarted: config.events?.onNodeDragStarted ?? noopFn,
5023
5156
  onNodeDrag: config.events?.onNodeDrag ?? noopFn,
5024
- nodeDragVerifier,
5157
+ nodeDragVerifier: config.nodeDragVerifier ?? (() => true),
5025
5158
  onNodeDragFinished: config.events?.onNodeDragFinished ?? noopFn
5026
5159
  };
5027
5160
  };
@@ -5111,33 +5244,26 @@ var resolveTransformPreprocessor = (option) => {
5111
5244
  //#endregion
5112
5245
  //#region src/canvas-builder/create-transformable-viewport-params/create-transformable-viewport-params.ts
5113
5246
  var createTransformableViewportParams = (transformConfig) => {
5114
- const configWheelSensitivity = transformConfig?.scale?.mouseWheelSensitivity;
5115
- const wheelSensitivity = configWheelSensitivity !== void 0 ? configWheelSensitivity : 1.2;
5116
5247
  const preprocessors = transformConfig?.transformPreprocessor;
5117
5248
  let transformPreprocessor;
5118
- if (preprocessors !== void 0) if (Array.isArray(preprocessors)) transformPreprocessor = createCombinedTransformPreprocessor(preprocessors.map((preprocessor) => resolveTransformPreprocessor(preprocessor)));
5249
+ if (preprocessors !== void 0) if (Array.isArray(preprocessors)) transformPreprocessor = createCombinedTransformPreprocessor(preprocessors.map((preprocessor) => {
5250
+ return resolveTransformPreprocessor(preprocessor);
5251
+ }));
5119
5252
  else transformPreprocessor = resolveTransformPreprocessor(preprocessors);
5120
5253
  else transformPreprocessor = (params) => {
5121
5254
  return params.nextTransform;
5122
5255
  };
5123
- const shiftCursor = transformConfig?.pan?.cursor !== void 0 ? transformConfig.pan.cursor : "grab";
5124
- const defaultMouseDownEventVerifier = transformConfig?.pan?.mouseDownEventVerifier;
5125
- const mouseDownEventVerifier = defaultMouseDownEventVerifier !== void 0 ? defaultMouseDownEventVerifier : (event) => event.button === 0;
5126
- const defaultMouseUpEventVerifier = transformConfig?.pan?.mouseUpEventVerifier;
5127
- const mouseUpEventVerifier = defaultMouseUpEventVerifier !== void 0 ? defaultMouseUpEventVerifier : (event) => event.button === 0;
5128
- const defaultMouseWheelEventVerifier = transformConfig?.scale?.mouseWheelEventVerifier;
5129
- const mouseWheelEventVerifier = defaultMouseWheelEventVerifier !== void 0 ? defaultMouseWheelEventVerifier : () => true;
5130
5256
  return {
5131
- wheelSensitivity,
5257
+ wheelSensitivity: transformConfig?.scale?.mouseWheelSensitivity ?? 1.2,
5132
5258
  onTransformStarted: transformConfig?.events?.onTransformStarted ?? noopFn,
5133
5259
  onTransformFinished: transformConfig?.events?.onTransformFinished ?? noopFn,
5134
5260
  onBeforeTransformChange: transformConfig?.events?.onBeforeTransformChange ?? noopFn,
5135
5261
  onTransformChange: transformConfig?.events?.onTransformChange ?? noopFn,
5136
5262
  transformPreprocessor,
5137
- shiftCursor,
5138
- mouseDownEventVerifier,
5139
- mouseUpEventVerifier,
5140
- mouseWheelEventVerifier,
5263
+ shiftCursor: transformConfig?.pan?.cursor ?? "grab",
5264
+ mouseDownEventVerifier: transformConfig?.pan?.mouseDownEventVerifier ?? lmbNoCtrlMouseEventVerifier,
5265
+ mouseUpEventVerifier: transformConfig?.pan?.mouseUpEventVerifier ?? lmbMouseEventVerifier,
5266
+ mouseWheelEventVerifier: transformConfig?.scale?.mouseWheelEventVerifier ?? (() => true),
5141
5267
  scaleWheelFinishTimeout: transformConfig?.scale?.wheelFinishTimeout ?? 500,
5142
5268
  onResizeTransformStarted: transformConfig?.events?.onResizeTransformStarted ?? noopFn,
5143
5269
  onResizeTransformFinished: transformConfig?.events?.onResizeTransformFinished ?? noopFn
@@ -5175,8 +5301,7 @@ var createBackgroundParams = (backgroundConfig) => {
5175
5301
  var defaults$3 = Object.freeze({
5176
5302
  connectionTypeResolver: () => "direct",
5177
5303
  connectionPreprocessor: (request) => request,
5178
- connectionAllowedVerifier: () => true,
5179
- mouseEventVerifier: (event) => event.button === 0
5304
+ connectionAllowedVerifier: () => true
5180
5305
  });
5181
5306
  //#endregion
5182
5307
  //#region src/canvas-builder/create-connectable-ports-params/create-connectable-ports-params.ts
@@ -5188,20 +5313,20 @@ var createConnectablePortsParams = (config, defaultEdgeShapeFactory, graph) => {
5188
5313
  draggingPortDirectionResolver: resolveDraggingPortDirectionResolver(config.dragPortDirection, graph, connectionAllowedVerifier),
5189
5314
  edgeShapeFactory: config.edgeShape !== void 0 ? resolveEdgeShapeFactory(config.edgeShape) : defaultEdgeShapeFactory,
5190
5315
  connectionPreprocessor: config.connectionPreprocessor ?? defaults$3.connectionPreprocessor,
5191
- mouseDownEventVerifier: config.mouseDownEventVerifier ?? defaults$3.mouseEventVerifier,
5192
- mouseUpEventVerifier: config.mouseUpEventVerifier ?? defaults$3.mouseEventVerifier,
5316
+ mouseDownEventVerifier: config.mouseDownEventVerifier ?? lmbNoCtrlMouseEventVerifier,
5317
+ mouseUpEventVerifier: config.mouseUpEventVerifier ?? lmbMouseEventVerifier,
5193
5318
  onAfterEdgeCreated: config.events?.onAfterEdgeCreated ?? noopFn,
5194
5319
  onEdgeCreationInterrupted: config.events?.onEdgeCreationInterrupted ?? noopFn,
5195
- onEdgeCreationPrevented: config.events?.onEdgeCreationPrevented ?? noopFn
5320
+ onEdgeCreationPrevented: config.events?.onEdgeCreationPrevented ?? noopFn,
5321
+ grabbedPortIdResolver: config.grabbedPortIdResolver ?? defaultPortIdResolver,
5322
+ releasedPortIdResolver: config.releasedPortIdResolver ?? defaultPortIdResolver
5196
5323
  };
5197
5324
  };
5198
5325
  //#endregion
5199
5326
  //#region src/canvas-builder/create-draggable-edges-params/defaults.ts
5200
5327
  var defaults$2 = Object.freeze({
5201
5328
  connectionAllowedVerifier: () => true,
5202
- connectionPreprocessor: (request) => request,
5203
- mouseDownEventVerifier: (event) => event.button === 0,
5204
- mouseUpEventVerifier: (event) => event.button === 0
5329
+ connectionPreprocessor: (request) => request
5205
5330
  });
5206
5331
  //#endregion
5207
5332
  //#region src/canvas-builder/create-draggable-edges-params/create-draggable-edges-params.ts
@@ -5215,14 +5340,16 @@ var createDraggableEdgeParams = (config, graph) => {
5215
5340
  return {
5216
5341
  connectionPreprocessor: config.connectionPreprocessor ?? defaults$2.connectionPreprocessor,
5217
5342
  connectionAllowedVerifier,
5218
- mouseDownEventVerifier: config.mouseDownEventVerifier ?? defaults$2.mouseDownEventVerifier,
5219
- mouseUpEventVerifier: config.mouseUpEventVerifier ?? defaults$2.mouseUpEventVerifier,
5343
+ mouseDownEventVerifier: config.mouseDownEventVerifier ?? lmbNoCtrlMouseEventVerifier,
5344
+ mouseUpEventVerifier: config.mouseUpEventVerifier ?? lmbMouseEventVerifier,
5220
5345
  draggingEdgeResolver: config.draggingEdgeResolver ?? defaultDraggingEdgeResolver,
5221
5346
  draggingEdgeShapeFactory: config.draggingEdgeShape !== void 0 ? resolveEdgeShapeFactory(config.draggingEdgeShape) : null,
5222
5347
  onAfterEdgeReattached: config.events?.onAfterEdgeReattached ?? noopFn,
5223
5348
  onEdgeReattachInterrupted: config.events?.onEdgeReattachInterrupted ?? noopFn,
5224
5349
  onEdgeReattachPrevented: config.events?.onEdgeReattachPrevented ?? noopFn,
5225
- draggingPortDirectionResolver: resolveDraggingPortDirectionResolver(config.dragPortDirection, graph, connectionAllowedVerifier)
5350
+ draggingPortDirectionResolver: resolveDraggingPortDirectionResolver(config.dragPortDirection, graph, connectionAllowedVerifier),
5351
+ grabbedPortIdResolver: config.grabbedPortIdResolver ?? defaultPortIdResolver,
5352
+ releasedPortIdResolver: config.releasedPortIdResolver ?? defaultPortIdResolver
5226
5353
  };
5227
5354
  };
5228
5355
  //#endregion
@@ -5880,14 +6007,14 @@ var ForceDirectedLayoutAlgorithm = class {
5880
6007
  nodeMass;
5881
6008
  edgeEquilibriumLength;
5882
6009
  edgeStiffness;
5883
- convergenceVelocity;
6010
+ stopVelocity;
5884
6011
  constructor(params) {
5885
6012
  this.maxIterations = params.maxIterations;
5886
6013
  this.dtSec = params.dtSec;
5887
6014
  this.nodeMass = params.nodeMass;
5888
6015
  this.edgeEquilibriumLength = params.edgeEquilibriumLength;
5889
6016
  this.edgeStiffness = params.edgeStiffness;
5890
- this.convergenceVelocity = params.stopVelocity;
6017
+ this.stopVelocity = params.stopVelocity;
5891
6018
  this.distanceVectorGenerator = new DistanceVectorGenerator(params.rand);
5892
6019
  this.nodeForcesApplicationStrategy = resolveNodeForcesApplicationStrategy({
5893
6020
  distanceVectorGenerator: this.distanceVectorGenerator,
@@ -5916,7 +6043,7 @@ var ForceDirectedLayoutAlgorithm = class {
5916
6043
  nodeMass: this.nodeMass,
5917
6044
  edgeEquilibriumLength: this.edgeEquilibriumLength,
5918
6045
  edgeStiffness: this.edgeStiffness
5919
- }).apply() < this.convergenceVelocity) break;
6046
+ }).apply() < this.stopVelocity) break;
5920
6047
  return currentCoords;
5921
6048
  }
5922
6049
  };
@@ -6136,14 +6263,14 @@ var incomingNextLayerNodesResolver = (params) => {
6136
6263
  var ForceDirectedAnimatedLayoutAlgorithm = class {
6137
6264
  distanceVectorGenerator;
6138
6265
  nodeForcesApplicationStrategy;
6139
- convergenceVelocity;
6266
+ stopVelocity;
6140
6267
  maxTimeDeltaSec;
6141
6268
  nodeMass;
6142
6269
  edgeEquilibriumLength;
6143
6270
  edgeStiffness;
6144
6271
  fillerLayoutAlgorithm;
6145
6272
  constructor(params) {
6146
- this.convergenceVelocity = params.stopVelocity;
6273
+ this.stopVelocity = params.stopVelocity;
6147
6274
  this.maxTimeDeltaSec = params.maxTimeDeltaSec;
6148
6275
  this.nodeMass = params.nodeMass;
6149
6276
  this.edgeEquilibriumLength = params.edgeEquilibriumLength;
@@ -6176,7 +6303,7 @@ var ForceDirectedAnimatedLayoutAlgorithm = class {
6176
6303
  nodeMass: this.nodeMass,
6177
6304
  edgeEquilibriumLength: this.edgeEquilibriumLength,
6178
6305
  edgeStiffness: this.edgeStiffness
6179
- }).apply() < this.convergenceVelocity) {
6306
+ }).apply() < this.stopVelocity) {
6180
6307
  if (!graph.getAllNodeIds().some((nodeId) => {
6181
6308
  const node = graph.getNode(nodeId);
6182
6309
  return node.x === null || node.y === null;
@@ -6242,7 +6369,7 @@ var resolveAnimatedLayoutAlgorithm = (config) => {
6242
6369
  nodeMass: config?.nodeMass ?? forceDirectedDefaults.nodeMass,
6243
6370
  edgeEquilibriumLength: config?.edgeEquilibriumLength ?? forceDirectedDefaults.edgeEquilibriumLength,
6244
6371
  edgeStiffness: config?.edgeStiffness ?? forceDirectedDefaults.edgeStiffness,
6245
- stopVelocity: config?.stopVelocity ?? forceDirectedDefaults.convergenceVelocity,
6372
+ stopVelocity: config?.stopVelocity ?? forceDirectedDefaults.stopVelocity,
6246
6373
  maxForce: config?.maxForce ?? forceDirectedDefaults.maxForce,
6247
6374
  nodeForceCoefficient: config?.nodeForceCoefficient ?? forceDirectedDefaults.nodeForceCoefficient,
6248
6375
  barnesHutTheta: config?.barnesHut?.theta ?? forceDirectedDefaults.barnesHutTheta,
@@ -6466,7 +6593,7 @@ var resolveLayoutAlgorithm = (config) => {
6466
6593
  nodeMass: config?.nodeMass ?? forceDirectedDefaults.nodeMass,
6467
6594
  edgeEquilibriumLength: config?.edgeEquilibriumLength ?? forceDirectedDefaults.edgeEquilibriumLength,
6468
6595
  edgeStiffness: config?.edgeStiffness ?? forceDirectedDefaults.edgeStiffness,
6469
- stopVelocity: config?.stopVelocity ?? forceDirectedDefaults.convergenceVelocity,
6596
+ stopVelocity: config?.stopVelocity ?? forceDirectedDefaults.stopVelocity,
6470
6597
  maxForce: config?.maxForce ?? forceDirectedDefaults.maxForce,
6471
6598
  nodeForceCoefficient: config?.nodeForceCoefficient ?? forceDirectedDefaults.nodeForceCoefficient,
6472
6599
  barnesHutTheta: config?.barnesHut?.theta ?? forceDirectedDefaults.barnesHutTheta,
@@ -6592,9 +6719,9 @@ var createViewportControllerParams = (params) => {
6592
6719
  var createUserSelectableNodesParams = (config) => {
6593
6720
  return {
6594
6721
  onNodeSelected: config.onNodeSelected,
6595
- mouseDownEventVerifier: config.mouseDownEventVerifier ?? selectionDefaults.mouseDownEventVerifier,
6596
- mouseUpEventVerifier: config.mouseUpEventVerifier ?? selectionDefaults.mouseUpEventVerifier,
6597
- movementThreshold: config.movementThreshold ?? selectionDefaults.movementThreshold
6722
+ mouseDownEventVerifier: config.mouseDownEventVerifier ?? lmbNoCtrlMouseEventVerifier,
6723
+ mouseUpEventVerifier: config.mouseUpEventVerifier ?? lmbMouseEventVerifier,
6724
+ movementThreshold: config.movementThreshold ?? 10
6598
6725
  };
6599
6726
  };
6600
6727
  //#endregion
@@ -6602,9 +6729,9 @@ var createUserSelectableNodesParams = (config) => {
6602
6729
  var createUserSelectableCanvasParams = (config) => {
6603
6730
  return {
6604
6731
  onCanvasSelected: config.onCanvasSelected,
6605
- mouseDownEventVerifier: config.mouseDownEventVerifier ?? selectionDefaults.mouseDownEventVerifier,
6606
- mouseUpEventVerifier: config.mouseUpEventVerifier ?? selectionDefaults.mouseUpEventVerifier,
6607
- movementThreshold: config.movementThreshold ?? selectionDefaults.movementThreshold
6732
+ mouseDownEventVerifier: config.mouseDownEventVerifier ?? lmbNoCtrlMouseEventVerifier,
6733
+ mouseUpEventVerifier: config.mouseUpEventVerifier ?? lmbMouseEventVerifier,
6734
+ movementThreshold: config.movementThreshold ?? 10
6608
6735
  };
6609
6736
  };
6610
6737
  //#endregion
@@ -6612,9 +6739,32 @@ var createUserSelectableCanvasParams = (config) => {
6612
6739
  var createUserSelectableEdgesParams = (config) => {
6613
6740
  return {
6614
6741
  onEdgeSelected: config.onEdgeSelected,
6615
- mouseDownEventVerifier: config.mouseDownEventVerifier ?? selectionDefaults.mouseDownEventVerifier,
6616
- mouseUpEventVerifier: config.mouseUpEventVerifier ?? selectionDefaults.mouseUpEventVerifier,
6617
- movementThreshold: config.movementThreshold ?? selectionDefaults.movementThreshold
6742
+ mouseDownEventVerifier: config.mouseDownEventVerifier ?? lmbNoCtrlMouseEventVerifier,
6743
+ mouseUpEventVerifier: config.mouseUpEventVerifier ?? lmbMouseEventVerifier,
6744
+ movementThreshold: config.movementThreshold ?? 10
6745
+ };
6746
+ };
6747
+ //#endregion
6748
+ //#region src/canvas-builder/create-rectangular-selection-params/create-default-rectangle-element/create-default-rectangle-element.ts
6749
+ var createDefaultRectangleElement = () => {
6750
+ const element = document.createElement("div");
6751
+ element.style.width = "100%";
6752
+ element.style.height = "100%";
6753
+ element.style.background = "rgba(174, 238, 255, 0.34)";
6754
+ element.style.border = "1px dashed rgba(96, 96, 96, 0.47)";
6755
+ return element;
6756
+ };
6757
+ //#endregion
6758
+ //#region src/canvas-builder/create-rectangular-selection-params/create-rectangular-selection-params.ts
6759
+ var createRectangularSelectionParams = (config) => {
6760
+ return {
6761
+ rectangleElement: config?.rectangleElement ?? createDefaultRectangleElement(),
6762
+ mouseDownEventVerifier: config?.mouseDownEventVerifier ?? lmbCtrlMouseEventVerifier,
6763
+ mouseUpEventVerifier: config?.mouseUpEventVerifier ?? lmbMouseEventVerifier,
6764
+ onSelectionStarted: config?.onSelectionStarted ?? noopFn,
6765
+ onSelectionChange: config?.onSelectionChange ?? noopFn,
6766
+ onSelectionInterrupted: config?.onSelectionInterrupted ?? noopFn,
6767
+ onSelectionFinished: config?.onSelectionFinished ?? noopFn
6618
6768
  };
6619
6769
  };
6620
6770
  //#endregion
@@ -6628,6 +6778,7 @@ var CanvasBuilder = class {
6628
6778
  backgroundConfig = {};
6629
6779
  connectablePortsConfig = {};
6630
6780
  draggableEdgesConfig = {};
6781
+ rectangularSelectionConfig = void 0;
6631
6782
  virtualScrollConfig = void 0;
6632
6783
  layoutConfig = {};
6633
6784
  animatedLayoutConfig = {};
@@ -6640,6 +6791,7 @@ var CanvasBuilder = class {
6640
6791
  hasBackground = false;
6641
6792
  hasUserConnectablePorts = false;
6642
6793
  hasUserDraggableEdges = false;
6794
+ hasRectangularSelection = false;
6643
6795
  hasAnimatedLayout = false;
6644
6796
  hasLayout = false;
6645
6797
  boxRenderingTrigger = new EventSubject();
@@ -6688,6 +6840,11 @@ var CanvasBuilder = class {
6688
6840
  this.draggableEdgesConfig = config ?? {};
6689
6841
  return this;
6690
6842
  }
6843
+ enableRectangularSelection(config) {
6844
+ this.hasRectangularSelection = true;
6845
+ this.rectangularSelectionConfig = config;
6846
+ return this;
6847
+ }
6691
6848
  enableLayout(config) {
6692
6849
  this.layoutConfig = config ?? {};
6693
6850
  this.hasLayout = true;
@@ -6758,6 +6915,7 @@ var CanvasBuilder = class {
6758
6915
  }
6759
6916
  if (this.virtualScrollConfig !== void 0) UserTransformableViewportVirtualScrollConfigurator.configure(canvas, layers.main, this.window, createTransformableViewportParams(this.transformConfig), this.boxRenderingTrigger, this.pointInsideVerifier, this.eventTagger, createVirtualScrollParams(this.virtualScrollConfig));
6760
6917
  else if (this.hasTransformableViewport) UserTransformableViewportConfigurator.configure(canvas, layers.main, this.window, this.pointInsideVerifier, this.eventTagger, createTransformableViewportParams(this.transformConfig));
6918
+ if (this.hasRectangularSelection) RectangularSelectionConfigurator.configure(canvas, layers.main, layers.overlayRectangularSelection, this.pointInsideVerifier, this.eventTagger, this.window, createRectangularSelectionParams(this.rectangularSelectionConfig));
6761
6919
  if (this.hasLayout) LayoutConfigurator.configure(canvas, layoutParams);
6762
6920
  if (this.hasAnimatedLayout) {
6763
6921
  let config = createAnimatedLayoutParams(this.animatedLayoutConfig);