@inditextech/weave-sdk 5.0.0-SNAPSHOT.397.1 → 5.0.0-SNAPSHOT.409.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/sdk.node.js CHANGED
@@ -3500,13 +3500,34 @@ function getBoundingBox(nodes, config) {
3500
3500
  height: maxY - minY
3501
3501
  };
3502
3502
  }
3503
+ /**
3504
+ * Builds an array of Weave node IDs from `groupId` up to the root,
3505
+ * including only nodes that have a `nodeType` attribute (actual Weave nodes,
3506
+ * not Konva stage/layer). Used as the multi-stop set for `getInstanceRecursive`
3507
+ * and group-context ancestor checks.
3508
+ */
3509
+ function buildAncestorGroupIds(groupId, stage) {
3510
+ const ids = [];
3511
+ let cur = stage.findOne(`#${groupId}`) ?? null;
3512
+ while (cur) {
3513
+ const id = cur.getAttrs().id;
3514
+ if (id && cur.getAttrs().nodeType) ids.push(id);
3515
+ cur = cur.getParent();
3516
+ }
3517
+ return ids;
3518
+ }
3503
3519
  function getTargetedNode(instance) {
3504
3520
  const stage = instance.getStage();
3505
3521
  let selectedGroup = void 0;
3506
3522
  const mousePos = stage.getPointerPosition();
3507
3523
  if (mousePos) {
3508
3524
  const inter = stage.getIntersection(mousePos);
3509
- if (inter) selectedGroup = instance.getInstanceRecursive(inter);
3525
+ if (inter) {
3526
+ const selectionPlugin = instance.getPlugin("nodesSelection");
3527
+ const activeGroupContext = selectionPlugin?.getActiveGroupContext() ?? void 0;
3528
+ const stopIds = activeGroupContext ? buildAncestorGroupIds(activeGroupContext, stage) : void 0;
3529
+ selectedGroup = instance.getInstanceRecursive(inter, [], stopIds);
3530
+ }
3510
3531
  }
3511
3532
  return selectedGroup;
3512
3533
  }
@@ -3647,7 +3668,7 @@ function getVisibleNodes({ instance, skipNodes, referenceLayer }) {
3647
3668
  nodes.forEach((node) => {
3648
3669
  const actualNodeParent = instance.getNodeContainer(node);
3649
3670
  if (actualNodeParent?.getAttrs().id !== referenceLayer?.getAttrs().id) return;
3650
- if (node.getParent()?.getAttrs().nodeType === "group") return;
3671
+ if (node.getParent()?.getAttrs().nodeType === "group" && node.getParent()?.getAttrs().id !== referenceLayer?.getAttrs().id) return;
3651
3672
  if (skipNodes.includes(node.getParent()?.getAttrs().nodeId)) return;
3652
3673
  if (skipNodes.includes(node.getAttrs().id ?? "")) return;
3653
3674
  if (node.getAttrs().nodeType === "connector") return;
@@ -4825,6 +4846,7 @@ function handleClickOrTap(ctx, e) {
4825
4846
  let areNodesSelected = false;
4826
4847
  let nodeTargeted = selectedGroup && !(selectedGroup.getAttrs().active ?? false) ? selectedGroup : e.target;
4827
4848
  if (e.target === weave.getStage()) {
4849
+ if (ctx.getActiveGroupContext() !== null) ctx.exitGroupContext();
4828
4850
  ctx.getGesture().resetDoubleTap();
4829
4851
  ctx.getNodesSelectionFeedbackPlugin()?.cleanupSelectedHalos();
4830
4852
  return;
@@ -4834,6 +4856,18 @@ function handleClickOrTap(ctx, e) {
4834
4856
  ctx.getGesture().resetDoubleTap();
4835
4857
  return;
4836
4858
  }
4859
+ const activeGroupContext = ctx.getActiveGroupContext();
4860
+ if (activeGroupContext !== null) {
4861
+ const isInsideActiveGroup = isNodeInsideGroup(nodeTargeted, activeGroupContext, stage);
4862
+ if (isInsideActiveGroup) {
4863
+ const parentId = nodeTargeted.getParent()?.getAttrs().id ?? "";
4864
+ if (parentId !== activeGroupContext) ctx.enterGroupContext(parentId);
4865
+ }
4866
+ if (!isInsideActiveGroup) {
4867
+ ctx.exitGroupContext();
4868
+ nodeTargeted = weave.getInstanceRecursive(nodeTargeted);
4869
+ }
4870
+ }
4837
4871
  const metaPressed = e.evt.shiftKey || e.evt.ctrlKey || e.evt.metaKey;
4838
4872
  const nodeSelectedIndex = tr.nodes().findIndex((node) => {
4839
4873
  return node.getAttrs().id === nodeTargeted.getAttrs().id;
@@ -4857,6 +4891,13 @@ function handleClickOrTap(ctx, e) {
4857
4891
  if (realNode) nodeTargeted = realNode;
4858
4892
  }
4859
4893
  if (typeof nodeTargeted.getAttrs().isContainerPrincipal !== "undefined" && !nodeTargeted.getAttrs().isContainerPrincipal) return;
4894
+ let cur = nodeTargeted;
4895
+ let p = cur.getParent();
4896
+ while (p?.getAttrs().nodeType === "group" && activeGroupContext !== p.getAttrs().id && !isAncestorOfActiveGroup(p, activeGroupContext, stage)) {
4897
+ cur = p;
4898
+ p = cur.getParent();
4899
+ }
4900
+ nodeTargeted = cur;
4860
4901
  if (ctx.getGesture().isDoubleTap && !metaPressed) {
4861
4902
  ctx.getGesture().resetDoubleTap();
4862
4903
  nodeTargeted.dblClick();
@@ -4888,6 +4929,40 @@ function handleClickOrTap(ctx, e) {
4888
4929
  }
4889
4930
  ctx.triggerSelectedNodesEvent();
4890
4931
  }
4932
+ /**
4933
+ * Returns true if `node` is anywhere within the group hierarchy rooted at
4934
+ * `groupId`: either a descendant of the active group itself, or a descendant
4935
+ * of any ancestor group in the path from `groupId` to the root.
4936
+ * Used to decide whether a click should keep the current group context active.
4937
+ */
4938
+ function isNodeInsideGroup(node, groupId, stage) {
4939
+ const groupNode = stage.findOne(`#${groupId}`);
4940
+ if (!groupNode) return false;
4941
+ const containerIds = new Set(buildAncestorGroupIds(groupId, stage));
4942
+ let current = node;
4943
+ while (current) {
4944
+ if (containerIds.has(current.getAttrs().id ?? "")) return true;
4945
+ current = current.getParent();
4946
+ }
4947
+ return false;
4948
+ }
4949
+ /**
4950
+ * Returns true if `node` is a (strict) ancestor of the active group — i.e.
4951
+ * it appears in the parent chain above `activeGroupId`, not at the group
4952
+ * itself and not below it.
4953
+ */
4954
+ function isAncestorOfActiveGroup(node, activeGroupId, stage) {
4955
+ if (!node || !activeGroupId) return false;
4956
+ const nodeId = node.getAttrs().id ?? "";
4957
+ const activeGroupNode = stage.findOne(`#${activeGroupId}`);
4958
+ if (!activeGroupNode) return false;
4959
+ let cur = activeGroupNode.getParent();
4960
+ while (cur) {
4961
+ if ((cur.getAttrs().id ?? "") === nodeId) return true;
4962
+ cur = cur.getParent();
4963
+ }
4964
+ return false;
4965
+ }
4891
4966
 
4892
4967
  //#endregion
4893
4968
  //#region src/plugins/nodes-selection/events/keyboard.ts
@@ -4901,6 +4976,13 @@ function registerKeyboardHandlers(ctx) {
4901
4976
  const signal = ctx.getWeaveInstance().getEventsController().signal;
4902
4977
  stage.container().addEventListener("keydown", (e) => {
4903
4978
  if (e.code === "Space") ctx.setSpaceKeyPressed(true);
4979
+ if (e.code === "Escape") {
4980
+ if (ctx.getActiveGroupContext() !== null) {
4981
+ ctx.exitGroupContext();
4982
+ e.stopPropagation();
4983
+ return;
4984
+ }
4985
+ }
4904
4986
  if (e.code === "Backspace" || e.code === "Delete") {
4905
4987
  Promise.resolve().then(() => {
4906
4988
  ctx.removeSelectedNodes();
@@ -4964,6 +5046,8 @@ function handlePointerDown(ctx, e) {
4964
5046
  const nodesSelected = tr.nodes();
4965
5047
  for (const node of nodesSelected) node.fire("onSelectionCleared", { bubbles: true });
4966
5048
  }
5049
+ const activeGroupContext = ctx.getActiveGroupContext();
5050
+ if (activeGroupContext !== null) ctx.exitGroupContext();
4967
5051
  ctx.selectNone();
4968
5052
  ctx.triggerSelectedNodesEvent();
4969
5053
  ctx.getWeaveInstance().emitEvent("onSelectionState", true);
@@ -5111,6 +5195,8 @@ var WeaveNodesSelectionPlugin = class extends WeavePlugin {
5111
5195
  gesture = new GestureDetector();
5112
5196
  _handledClickOrTap = false;
5113
5197
  dragSelectedNodes = [];
5198
+ _activeGroupContext = null;
5199
+ onRender = void 0;
5114
5200
  constructor(params) {
5115
5201
  super();
5116
5202
  this.config = mergeExceptArrays(WEAVE_NODES_SELECTION_DEFAULT_CONFIG, params?.config ?? {});
@@ -5135,6 +5221,8 @@ var WeaveNodesSelectionPlugin = class extends WeavePlugin {
5135
5221
  this.enabled = false;
5136
5222
  this.pointers = {};
5137
5223
  this.dragSelectedNodes = [];
5224
+ this._handledClickOrTap = false;
5225
+ this._activeGroupContext = null;
5138
5226
  }
5139
5227
  getName() {
5140
5228
  return WEAVE_NODES_SELECTION_KEY;
@@ -5256,6 +5344,7 @@ var WeaveNodesSelectionPlugin = class extends WeavePlugin {
5256
5344
  this.active = true;
5257
5345
  });
5258
5346
  this.instance.addEventListener("onNodeRemoved", (node) => {
5347
+ if (this._activeGroupContext === node.id) this.exitGroupContext();
5259
5348
  const selectedNodes = this.getSelectedNodes();
5260
5349
  const newSelectedNodes = selectedNodes.filter((actNode) => actNode.getAttrs().id !== node.id);
5261
5350
  this.setSelectedNodes(newSelectedNodes);
@@ -5264,6 +5353,31 @@ var WeaveNodesSelectionPlugin = class extends WeavePlugin {
5264
5353
  stage.container().style.cursor = "default";
5265
5354
  });
5266
5355
  }
5356
+ getActiveGroupContext() {
5357
+ return this._activeGroupContext;
5358
+ }
5359
+ enterGroupContext(groupId) {
5360
+ const stage = this.instance.getStage();
5361
+ const groupNode = stage.findOne(`#${groupId}`);
5362
+ if (!groupNode) return;
5363
+ this._activeGroupContext = groupId;
5364
+ groupNode.getChildren().forEach((child) => {
5365
+ child.setAttr("draggable", true);
5366
+ });
5367
+ this.selectNone();
5368
+ this.instance.emitEvent("onGroupContextChange", groupId);
5369
+ }
5370
+ exitGroupContext() {
5371
+ if (this._activeGroupContext === null) return;
5372
+ const stage = this.instance.getStage();
5373
+ const groupNode = stage.findOne(`#${this._activeGroupContext}`);
5374
+ if (groupNode) groupNode.getChildren().forEach((child) => {
5375
+ child.setAttr("draggable", false);
5376
+ });
5377
+ this._activeGroupContext = null;
5378
+ this.selectNone();
5379
+ this.instance.emitEvent("onGroupContextChange", null);
5380
+ }
5267
5381
  getLayer() {
5268
5382
  const stage = this.instance.getStage();
5269
5383
  return stage.findOne(`#${this.getLayerName()}`);
@@ -6214,10 +6328,27 @@ var WeaveNode = class {
6214
6328
  this.hideHoverState();
6215
6329
  return;
6216
6330
  }
6331
+ if (this.isHoverSuppressedByGroupContext(node, selectionPlugin)) {
6332
+ this.hideHoverState();
6333
+ return;
6334
+ }
6217
6335
  if (node?.canBeHovered?.()) selectionPlugin.getHoverTransformer().nodes([node]);
6218
6336
  else selectionPlugin.getHoverTransformer().nodes([]);
6219
6337
  selectionPlugin.getHoverTransformer().moveToTop();
6220
6338
  }
6339
+ isHoverSuppressedByGroupContext(node, selectionPlugin) {
6340
+ const activeGroupId = selectionPlugin.getActiveGroupContext();
6341
+ if (activeGroupId === null) return false;
6342
+ const activeGroupNode = this.instance.getStage().findOne(`#${activeGroupId}`);
6343
+ if (!activeGroupNode) return false;
6344
+ const hoveredId = node.getAttrs().id ?? "";
6345
+ let current = activeGroupNode;
6346
+ while (current) {
6347
+ if ((current.getAttrs().id ?? "") === hoveredId) return true;
6348
+ current = current.getParent();
6349
+ }
6350
+ return false;
6351
+ }
6221
6352
  hideHoverState() {
6222
6353
  const selectionPlugin = this.getSelectionPlugin();
6223
6354
  if (!selectionPlugin) return;
@@ -6475,7 +6606,8 @@ var WeaveNode = class {
6475
6606
  }
6476
6607
  this.instance.emitEvent("onDrag", null);
6477
6608
  const realNodeTarget = this.getRealSelectedNode(nodeTarget);
6478
- if (this.isSelecting() && this.getSelectionPlugin()?.getSelectedNodes().length === 1 && (realNodeTarget.getAttrs().lockToContainer === void 0 || !realNodeTarget.getAttrs().lockToContainer)) this.instance.stateTransactional(() => {
6609
+ const isInGroupContext = (this.getSelectionPlugin()?.getActiveGroupContext() ?? null) !== null;
6610
+ if (!isInGroupContext && this.isSelecting() && this.getSelectionPlugin()?.getSelectedNodes().length === 1 && (realNodeTarget.getAttrs().lockToContainer === void 0 || !realNodeTarget.getAttrs().lockToContainer)) this.instance.stateTransactional(() => {
6479
6611
  clearContainerTargets(this.instance);
6480
6612
  const layerToMove = containerOverCursor(this.instance, [realNodeTarget]);
6481
6613
  let containerToMove = this.instance.getMainLayer();
@@ -6563,7 +6695,19 @@ var WeaveNode = class {
6563
6695
  const user = this.instance.getStore().getUser();
6564
6696
  const activeAction = this.instance.getActiveAction();
6565
6697
  const isNodeSelectionEnabled = this.getSelectionPlugin()?.isEnabled();
6566
- const realNode = this.instance.getInstanceRecursive(node);
6698
+ const activeGroupCtx = this.getSelectionPlugin()?.getActiveGroupContext() ?? void 0;
6699
+ let realNode;
6700
+ if (activeGroupCtx) {
6701
+ const stage$1 = this.instance.getStage();
6702
+ const stopIds = [];
6703
+ let cur = stage$1.findOne(`#${activeGroupCtx}`) ?? null;
6704
+ while (cur) {
6705
+ const id = cur.getAttrs().id;
6706
+ if (id) stopIds.push(id);
6707
+ cur = cur.getParent();
6708
+ }
6709
+ realNode = this.instance.getInstanceRecursive(node, [], stopIds);
6710
+ } else realNode = this.instance.getInstanceRecursive(node);
6567
6711
  const canBeTargeted = realNode.getAttrs().canBeTargeted !== false;
6568
6712
  const isLocked = realNode.getAttrs().locked ?? false;
6569
6713
  const isMutexLocked = realNode.getAttrs().mutexLocked && realNode.getAttrs().mutexUserId !== user.id;
@@ -9517,7 +9661,7 @@ var WeaveRegisterManager = class {
9517
9661
 
9518
9662
  //#endregion
9519
9663
  //#region package.json
9520
- var version = "5.0.0-SNAPSHOT.397.1";
9664
+ var version = "5.0.0-SNAPSHOT.409.1";
9521
9665
 
9522
9666
  //#endregion
9523
9667
  //#region src/managers/setup.ts
@@ -9611,13 +9755,18 @@ var WeaveStageManager = class {
9611
9755
  const stage = this.getStage();
9612
9756
  return stage.findOne(`#${WEAVE_UTILITY_LAYER_ID}`);
9613
9757
  }
9614
- getInstanceRecursive(instance, filterInstanceType = []) {
9758
+ getInstanceRecursive(instance, filterInstanceType = [], stopAtGroupId) {
9615
9759
  const attributes = instance.getAttrs();
9760
+ if (stopAtGroupId) {
9761
+ const parentId = instance.getParent()?.getAttrs().id ?? "";
9762
+ const matches = Array.isArray(stopAtGroupId) ? stopAtGroupId.includes(parentId) : parentId === stopAtGroupId;
9763
+ if (matches) return instance;
9764
+ }
9616
9765
  if (instance.getParent() && instance.getParent()?.getAttrs().nodeType && ![
9617
9766
  "stage",
9618
9767
  "layer",
9619
9768
  ...filterInstanceType
9620
- ].includes(instance.getParent()?.getAttrs().nodeType)) return this.getInstanceRecursive(instance.getParent());
9769
+ ].includes(instance.getParent()?.getAttrs().nodeType)) return this.getInstanceRecursive(instance.getParent(), filterInstanceType, stopAtGroupId);
9621
9770
  if (attributes.id === "mainLayer") return this.instance.getMainLayer();
9622
9771
  if (attributes.id === "stage") return this.instance.getMainLayer();
9623
9772
  return instance;
@@ -10827,6 +10976,12 @@ var Weave = class {
10827
10976
  this.stageManager.initStage();
10828
10977
  this.status = WEAVE_INSTANCE_STATUS.CONNECTING_TO_ROOM;
10829
10978
  this.emitEvent("onInstanceStatus", this.status);
10979
+ this.emitEvent("onUndoManagerStatusChange", {
10980
+ canUndo: false,
10981
+ canRedo: false,
10982
+ redoStackLength: 0,
10983
+ undoStackLength: 0
10984
+ });
10830
10985
  this.addEventListener("onStoreConnectionStatusChange", this.handleStoreConnectionStatusChange.bind(this));
10831
10986
  }
10832
10987
  async destroy() {
@@ -10956,8 +11111,8 @@ var Weave = class {
10956
11111
  getStageConfiguration() {
10957
11112
  return this.stageManager.getConfiguration();
10958
11113
  }
10959
- getInstanceRecursive(instance, filterInstanceType = []) {
10960
- return this.stageManager.getInstanceRecursive(instance, filterInstanceType);
11114
+ getInstanceRecursive(instance, filterInstanceType = [], stopAtGroupId) {
11115
+ return this.stageManager.getInstanceRecursive(instance, filterInstanceType, stopAtGroupId);
10961
11116
  }
10962
11117
  getContainerNodes() {
10963
11118
  return this.stageManager.getContainerNodes();
@@ -11925,6 +12080,25 @@ var WeaveGroupNode = class extends WeaveNode {
11925
12080
  y: 1
11926
12081
  });
11927
12082
  });
12083
+ group.dblClick = () => {
12084
+ const selectionPlugin = this.instance.getPlugin("nodesSelection");
12085
+ if (!selectionPlugin) return;
12086
+ const groupId = group.getAttrs().id ?? "";
12087
+ selectionPlugin.enterGroupContext(groupId);
12088
+ const stage = this.instance.getStage();
12089
+ const mousePos = stage.getPointerPosition();
12090
+ if (!mousePos) return;
12091
+ const selectionLayer = stage.findOne("#" + selectionPlugin.getLayerName());
12092
+ selectionLayer?.listening(false);
12093
+ const intersected = stage.getIntersection(mousePos);
12094
+ selectionLayer?.listening(true);
12095
+ if (!intersected) return;
12096
+ const directChild = this.instance.getInstanceRecursive(intersected, [], groupId);
12097
+ if (directChild.getParent()?.getAttrs().id === groupId) {
12098
+ selectionPlugin.setSelectedNodes([directChild]);
12099
+ selectionPlugin.triggerSelectedNodesEvent();
12100
+ }
12101
+ };
11928
12102
  return group;
11929
12103
  }
11930
12104
  onUpdate(nodeInstance, nextProps) {
@@ -12129,6 +12303,7 @@ var WeaveShapeLabelEditor = class {
12129
12303
  this.instance.releaseMutexLock();
12130
12304
  this.instance.getStage().mode(WEAVE_STAGE_DEFAULT_MODE);
12131
12305
  this.editing = false;
12306
+ const editedGroupId = this.editingGroup?.id() ?? null;
12132
12307
  if (this.editingGroup) {
12133
12308
  const liveGroup = this.instance.getStage().findOne(`#${this.editingGroup.id()}`);
12134
12309
  const labelNode = liveGroup?.findOne(`#${labelId(this.editingGroup.id())}`);
@@ -12144,7 +12319,13 @@ var WeaveShapeLabelEditor = class {
12144
12319
  this.editingTextBounds = null;
12145
12320
  this.instance.getStage().off(".weaveLabelEdit");
12146
12321
  const selectionPlugin = this.instance.getPlugin("nodesSelection");
12147
- if (selectionPlugin) this.instance.enablePlugin("nodesSelection");
12322
+ if (selectionPlugin) {
12323
+ this.instance.enablePlugin("nodesSelection");
12324
+ if (editedGroupId) requestAnimationFrame(() => {
12325
+ const liveGroup = this.instance.getStage().findOne(`#${editedGroupId}`);
12326
+ if (liveGroup) selectionPlugin.setSelectedNodes([liveGroup]);
12327
+ });
12328
+ }
12148
12329
  }
12149
12330
  updateTextAreaPosition(group, textBounds) {
12150
12331
  if (!this.editing || !this.textArea) return;
@@ -32205,19 +32386,40 @@ var WeaveNodesSnappingGuides = class {
32205
32386
  const stage = this.instance.getStage();
32206
32387
  const scaleX = stage.scaleX();
32207
32388
  const scaleY = stage.scaleY();
32208
- let finalContainer = container;
32209
- if (container !== stage) finalContainer = container.getParent();
32210
- const pos = finalContainer.position();
32211
- const rect = finalContainer.getClientRect({ relativeTo: stage });
32212
- const x = finalContainer === stage ? -pos.x / scaleX : rect.x;
32213
- const y = finalContainer === stage ? -pos.y / scaleX : rect.y;
32214
- const width = finalContainer === stage ? stage.width() / scaleX : rect.width;
32215
- const height = finalContainer === stage ? stage.height() / scaleY : rect.height;
32389
+ const mainLayer = this.instance.getMainLayer();
32390
+ if (container === stage || container === mainLayer) {
32391
+ const pos$1 = stage.position();
32392
+ return {
32393
+ x: -pos$1.x / scaleX,
32394
+ y: -pos$1.y / scaleY,
32395
+ width: stage.width() / scaleX,
32396
+ height: stage.height() / scaleY
32397
+ };
32398
+ }
32399
+ let frameNode = null;
32400
+ let cur = container;
32401
+ while (cur && cur !== mainLayer && cur !== stage) {
32402
+ if (cur.getAttrs().nodeType === "frame") {
32403
+ frameNode = cur;
32404
+ break;
32405
+ }
32406
+ cur = cur.getParent();
32407
+ }
32408
+ if (frameNode) {
32409
+ const rect = frameNode.getClientRect({ relativeTo: stage });
32410
+ return {
32411
+ x: rect.x,
32412
+ y: rect.y,
32413
+ width: rect.width,
32414
+ height: rect.height
32415
+ };
32416
+ }
32417
+ const pos = stage.position();
32216
32418
  return {
32217
- x,
32218
- y,
32219
- width,
32220
- height
32419
+ x: -pos.x / scaleX,
32420
+ y: -pos.y / scaleY,
32421
+ width: stage.width() / scaleX,
32422
+ height: stage.height() / scaleY
32221
32423
  };
32222
32424
  }
32223
32425
  renderSnapGuides(container, snap) {
@@ -32229,8 +32431,11 @@ var WeaveNodesSnappingGuides = class {
32229
32431
  if (snap.containerId !== "mainLayer") {
32230
32432
  const containerNode = stage.findOne(`#${snap.containerId}`);
32231
32433
  if (containerNode) {
32232
- const containerPos = containerNode.getClientRect({ relativeTo: stage });
32233
- value = containerPos.x + snap.guide;
32434
+ const canvasPt = containerNode.getAbsoluteTransform().point({
32435
+ x: snap.guide,
32436
+ y: 0
32437
+ });
32438
+ value = stage.getAbsoluteTransform().copy().invert().point(canvasPt).x;
32234
32439
  }
32235
32440
  }
32236
32441
  this.layer.add(new Konva.Line({
@@ -32253,8 +32458,11 @@ var WeaveNodesSnappingGuides = class {
32253
32458
  if (snap.containerId !== "mainLayer") {
32254
32459
  const containerNode = stage.findOne(`#${snap.containerId}`);
32255
32460
  if (containerNode) {
32256
- const containerPos = containerNode.getClientRect({ relativeTo: stage });
32257
- value = containerPos.y + snap.guide;
32461
+ const canvasPt = containerNode.getAbsoluteTransform().point({
32462
+ x: 0,
32463
+ y: snap.guide
32464
+ });
32465
+ value = stage.getAbsoluteTransform().copy().invert().point(canvasPt).y;
32258
32466
  }
32259
32467
  }
32260
32468
  this.layer.add(new Konva.Line({
@@ -32720,6 +32928,10 @@ var WeaveNodesSnappingPlugin = class extends WeavePlugin {
32720
32928
  this.relativeToId = containerNode.id();
32721
32929
  }
32722
32930
  }
32931
+ if (container !== this.instance.getMainLayer() && !container.getAttrs().nodeId && container.getAttrs().nodeType === "group") {
32932
+ this.relativeTo = container;
32933
+ this.relativeToId = container.id();
32934
+ }
32723
32935
  if (!this.relativeTo) return;
32724
32936
  this.visibleNodes = getVisibleNodes({
32725
32937
  instance: this.instance,
@@ -32750,8 +32962,8 @@ var WeaveNodesSnappingPlugin = class extends WeavePlugin {
32750
32962
  y: -1 * (relativeTo.getAttrs().containerCompensationY ?? 0)
32751
32963
  };
32752
32964
  const diff = {
32753
- x: Math.abs(nodeBox.x - node.x()),
32754
- y: Math.abs(nodeBox.y - node.y())
32965
+ x: node.x() - nodeBox.x,
32966
+ y: node.y() - nodeBox.y
32755
32967
  };
32756
32968
  this.selectionOffsets.push({
32757
32969
  x: nodeBox.x - nodesBox.x + diff.x + containerCompensation.x,
@@ -32910,4 +33122,4 @@ const setupCanvasBackend = async () => {
32910
33122
  };
32911
33123
 
32912
33124
  //#endregion
32913
- export { ALIGN_NODES_ALIGN_TO, ALIGN_NODES_TOOL_ACTION_NAME, ALIGN_NODES_TOOL_STATE, BRUSH_TOOL_ACTION_NAME, BRUSH_TOOL_DEFAULT_CONFIG, BRUSH_TOOL_STATE, CONNECTOR_TOOL_ACTION_NAME, CONNECTOR_TOOL_DEFAULT_CONFIG, CONNECTOR_TOOL_STATE, COPY_PASTE_NODES_PLUGIN_STATE, DEFAULT_GUIDE_TOOL_ACTION_CONFIG, DEFAULT_SNAPPING_MANAGER_CONFIG, ELLIPSE_TOOL_ACTION_NAME, ELLIPSE_TOOL_STATE, ERASER_TOOL_ACTION_NAME, ERASER_TOOL_STATE, FRAME_TOOL_ACTION_NAME, FRAME_TOOL_STATE, GUIDE_DISTANCE_NAME, GUIDE_DISTANCE_ORIGIN, GUIDE_KIND, GUIDE_NAME, GUIDE_ORIENTATION, GUIDE_STATE, GUIDE_TOOL_ACTION_NAME, GUIDE_TOOL_STATE, LINE_TOOL_ACTION_NAME, LINE_TOOL_DEFAULT_CONFIG, LINE_TOOL_STATE, MEASURE_TOOL_ACTION_NAME, MEASURE_TOOL_STATE, MOVE_ORIENTATION, MOVE_TOOL_ACTION_NAME, MOVE_TOOL_STATE, PEN_TOOL_ACTION_NAME, PEN_TOOL_STATE, POLYGON_TOOL_ACTION_NAME, POLYGON_TOOL_STATE, RECTANGLE_TOOL_ACTION_NAME, RECTANGLE_TOOL_STATE, REGULAR_POLYGON_TOOL_ACTION_NAME, REGULAR_POLYGON_TOOL_STATE, SELECTION_TOOL_ACTION_NAME, SELECTION_TOOL_STATE, STAGE_MINIMAP_DEFAULT_CONFIG, STAR_TOOL_ACTION_NAME, STAR_TOOL_STATE, TEXT_LAYOUT, TEXT_TOOL_ACTION_NAME, TEXT_TOOL_STATE, VIDEO_TOOL_ACTION_NAME, VIDEO_TOOL_STATE, WEAVE_ARROW_NODE_TYPE, WEAVE_ARROW_TOOL_ACTION_NAME, WEAVE_ARROW_TOOL_STATE, WEAVE_COMMENTS_RENDERER_KEY, WEAVE_COMMENTS_TOOL_LAYER_ID, WEAVE_COMMENT_CREATE_ACTION, WEAVE_COMMENT_NODE_ACTION, WEAVE_COMMENT_NODE_DEFAULTS, WEAVE_COMMENT_NODE_TYPE, WEAVE_COMMENT_STATUS, WEAVE_COMMENT_TOOL_ACTION_NAME, WEAVE_COMMENT_TOOL_DEFAULT_CONFIG, WEAVE_COMMENT_TOOL_STATE, WEAVE_COMMENT_VIEW_ACTION, WEAVE_CONNECTOR_NODE_ANCHOR_ORIGIN, WEAVE_CONNECTOR_NODE_DECORATOR_TYPE, WEAVE_CONNECTOR_NODE_DEFAULT_CONFIG, WEAVE_CONNECTOR_NODE_LINE_ORIGIN, WEAVE_CONNECTOR_NODE_LINE_TYPE, WEAVE_CONNECTOR_NODE_TYPE, WEAVE_COPY_PASTE_CONFIG_DEFAULT, WEAVE_COPY_PASTE_NODES_KEY, WEAVE_COPY_PASTE_PASTE_CATCHER_ID, WEAVE_COPY_PASTE_PASTE_MODES, WEAVE_DEFAULT_USER_INFO_FUNCTION, WEAVE_ELLIPSE_NODE_TYPE, WEAVE_FRAME_DEFAULT_BACKGROUND_COLOR, WEAVE_FRAME_NODE_DEFAULT_CONFIG, WEAVE_FRAME_NODE_DEFAULT_PROPS, WEAVE_FRAME_NODE_TYPE, WEAVE_GRID_DEFAULT_CONFIG, WEAVE_GRID_DOT_TYPES, WEAVE_GRID_LAYER_ID, WEAVE_GRID_TYPES, WEAVE_GROUP_NODE_TYPE, WEAVE_IMAGES_TOOL_ACTION_NAME, WEAVE_IMAGES_TOOL_DEFAULT_CONFIG, WEAVE_IMAGES_TOOL_STATE, WEAVE_IMAGES_TOOL_UPLOAD_TYPE, WEAVE_IMAGE_CROP_ANCHOR_POSITION, WEAVE_IMAGE_CROP_END_TYPE, WEAVE_IMAGE_DEFAULT_CONFIG, WEAVE_IMAGE_NODE_TYPE, WEAVE_IMAGE_TOOL_ACTION_NAME, WEAVE_IMAGE_TOOL_CONFIG_DEFAULT, WEAVE_IMAGE_TOOL_STATE, WEAVE_IMAGE_TOOL_UPLOAD_TYPE, WEAVE_LAYER_NODE_TYPE, WEAVE_LINE_NODE_DEFAULT_CONFIG, WEAVE_LINE_NODE_TYPE, WEAVE_MEASURE_NODE_DEFAULT_CONFIG, WEAVE_MEASURE_NODE_TYPE, WEAVE_MEASURE_TOOL_DEFAULT_CONFIG, WEAVE_NODES_MULTI_SELECTION_FEEDBACK_PLUGIN_DEFAULT_CONFIG, WEAVE_NODES_MULTI_SELECTION_FEEDBACK_PLUGIN_KEY, WEAVE_NODES_MULTI_SELECTION_FEEDBACK_PLUGIN_LAYER_ID, WEAVE_NODES_SELECTION_DEFAULT_CONFIG, WEAVE_NODES_SELECTION_KEY, WEAVE_NODES_SELECTION_LAYER_ID, WEAVE_NODES_SNAPPING_PLUGIN_KEY, WEAVE_POLYGON_NODE_TYPE, WEAVE_POLYGON_PRESETS, WEAVE_RECTANGLE_NODE_TYPE, WEAVE_REGULAR_POLYGON_NODE_TYPE, WEAVE_SHAPE_LABEL_DEFAULTS, WEAVE_STAGE_DEFAULT_MODE, WEAVE_STAGE_DROP_AREA_KEY, WEAVE_STAGE_GRID_PLUGIN_KEY, WEAVE_STAGE_IMAGE_CROPPING_MODE, WEAVE_STAGE_KEYBOARD_MOVE_DEFAULT_CONFIG, WEAVE_STAGE_KEYBOARD_MOVE_KEY, WEAVE_STAGE_KEYBOARD_MOVE_ORIENTATION, WEAVE_STAGE_MINIMAP_KEY, WEAVE_STAGE_NODE_TYPE, WEAVE_STAGE_PANNING_DEFAULT_CONFIG, WEAVE_STAGE_PANNING_KEY, WEAVE_STAGE_PANNING_THROTTLE_MS, WEAVE_STAGE_SHAPE_LABEL_EDITION_MODE, WEAVE_STAGE_TEXT_EDITION_MODE, WEAVE_STAGE_ZOOM_DEFAULT_CONFIG, WEAVE_STAGE_ZOOM_KEY, WEAVE_STAGE_ZOOM_TYPE, WEAVE_STAR_NODE_TYPE, WEAVE_STROKE_NODE_DEFAULT_CONFIG, WEAVE_STROKE_NODE_TYPE, WEAVE_STROKE_SINGLE_NODE_DEFAULT_CONFIG, WEAVE_STROKE_SINGLE_NODE_TIP_SIDE, WEAVE_STROKE_SINGLE_NODE_TIP_TYPE, WEAVE_STROKE_SINGLE_NODE_TYPE, WEAVE_STROKE_TOOL_ACTION_NAME, WEAVE_STROKE_TOOL_ACTION_NAME_ALIASES, WEAVE_STROKE_TOOL_DEFAULT_CONFIG, WEAVE_STROKE_TOOL_STATE, WEAVE_TEXT_NODE_DEFAULT_CONFIG, WEAVE_TEXT_NODE_TYPE, WEAVE_USERS_POINTERS_CONFIG_DEFAULT_PROPS, WEAVE_USERS_POINTERS_KEY, WEAVE_USERS_PRESENCE_CONFIG_DEFAULT_PROPS, WEAVE_USERS_PRESENCE_PLUGIN_KEY, WEAVE_USERS_SELECTION_KEY, WEAVE_USER_POINTER_KEY, WEAVE_USER_PRESENCE_KEY, WEAVE_USER_SELECTION_KEY, WEAVE_VIDEO_DEFAULT_CONFIG, WEAVE_VIDEO_NODE_TYPE, Weave, WeaveAction, WeaveAlignNodesToolAction, WeaveArrowNode, WeaveArrowToolAction, WeaveBrushToolAction, WeaveCommentNode, WeaveCommentToolAction, WeaveCommentsRendererPlugin, WeaveConnectedUsersPlugin, WeaveConnectorNode, WeaveConnectorToolAction, WeaveContextMenuPlugin, WeaveCopyPasteNodesPlugin, WeaveEllipseNode, WeaveEllipseToolAction, WeaveEraserToolAction, WeaveExportNodesToolAction, WeaveExportStageToolAction, WeaveFitToScreenToolAction, WeaveFitToSelectionToolAction, WeaveFrameNode, WeaveFrameToolAction, WeaveGroupNode, WeaveGuideToolAction, WeaveImageNode, WeaveImageToolAction, WeaveImagesToolAction, WeaveLayerNode, WeaveLineNode, WeaveLineToolAction, WeaveMeasureNode, WeaveMeasureToolAction, WeaveMoveToolAction, WeaveNode, WeaveNodesMultiSelectionFeedbackPlugin, WeaveNodesSelectionPlugin, WeaveNodesSnappingPlugin, WeavePenToolAction, WeavePlugin, WeavePolygonNode, WeavePolygonToolAction, WeaveRectangleNode, WeaveRectangleToolAction, WeaveRegularPolygonNode, WeaveRegularPolygonToolAction, WeaveRenderer, WeaveSelectionToolAction, WeaveStageDropAreaPlugin, WeaveStageGridPlugin, WeaveStageKeyboardMovePlugin, WeaveStageMinimapPlugin, WeaveStageNode, WeaveStagePanningPlugin, WeaveStageResizePlugin, WeaveStageZoomPlugin, WeaveStarNode, WeaveStarToolAction, WeaveStateManipulation, WeaveStore, WeaveStrokeNode, WeaveStrokeSingleNode, WeaveStrokeToolAction, WeaveTextNode, WeaveTextToolAction, WeaveUsersPointersPlugin, WeaveUsersPresencePlugin, WeaveUsersSelectionPlugin, WeaveVideoNode, WeaveVideoToolAction, WeaveZoomInToolAction, WeaveZoomOutToolAction, canComposite, clearContainerTargets, computeEllipseLabelMinSize, computePolygonLabelMinSize, computeRectangleLabelMinSize, containerOverCursor, containsNodeDeep, defaultInitialState, downscaleImageFile, downscaleImageFromURL, getBoundingBox, getDownscaleRatio, getExportBoundingBox, getImageSizeFromFile, getSelectedNodesMetadata, getShapeLabelSchemaFields, getStageClickPoint, getTargetAndSkipNodes, getTargetedNode, getTopmostShadowHost, getVisibleNodes, getVisibleNodesInViewport, hasFrames, hasImages, instantiatePreset, intersectArrays, isIOS, isInShadowDOM, isNodeInSelection, isNumber, isServer, labelId, loadImageSource, memoize, mergeExceptArrays, moveNodeToContainer, moveNodeToContainerNT, resetScale, setupCanvasBackend, setupSkiaBackend, spreadLabelProps };
33125
+ export { ALIGN_NODES_ALIGN_TO, ALIGN_NODES_TOOL_ACTION_NAME, ALIGN_NODES_TOOL_STATE, BRUSH_TOOL_ACTION_NAME, BRUSH_TOOL_DEFAULT_CONFIG, BRUSH_TOOL_STATE, CONNECTOR_TOOL_ACTION_NAME, CONNECTOR_TOOL_DEFAULT_CONFIG, CONNECTOR_TOOL_STATE, COPY_PASTE_NODES_PLUGIN_STATE, DEFAULT_GUIDE_TOOL_ACTION_CONFIG, DEFAULT_SNAPPING_MANAGER_CONFIG, ELLIPSE_TOOL_ACTION_NAME, ELLIPSE_TOOL_STATE, ERASER_TOOL_ACTION_NAME, ERASER_TOOL_STATE, FRAME_TOOL_ACTION_NAME, FRAME_TOOL_STATE, GUIDE_DISTANCE_NAME, GUIDE_DISTANCE_ORIGIN, GUIDE_KIND, GUIDE_NAME, GUIDE_ORIENTATION, GUIDE_STATE, GUIDE_TOOL_ACTION_NAME, GUIDE_TOOL_STATE, LINE_TOOL_ACTION_NAME, LINE_TOOL_DEFAULT_CONFIG, LINE_TOOL_STATE, MEASURE_TOOL_ACTION_NAME, MEASURE_TOOL_STATE, MOVE_ORIENTATION, MOVE_TOOL_ACTION_NAME, MOVE_TOOL_STATE, PEN_TOOL_ACTION_NAME, PEN_TOOL_STATE, POLYGON_TOOL_ACTION_NAME, POLYGON_TOOL_STATE, RECTANGLE_TOOL_ACTION_NAME, RECTANGLE_TOOL_STATE, REGULAR_POLYGON_TOOL_ACTION_NAME, REGULAR_POLYGON_TOOL_STATE, SELECTION_TOOL_ACTION_NAME, SELECTION_TOOL_STATE, STAGE_MINIMAP_DEFAULT_CONFIG, STAR_TOOL_ACTION_NAME, STAR_TOOL_STATE, TEXT_LAYOUT, TEXT_TOOL_ACTION_NAME, TEXT_TOOL_STATE, VIDEO_TOOL_ACTION_NAME, VIDEO_TOOL_STATE, WEAVE_ARROW_NODE_TYPE, WEAVE_ARROW_TOOL_ACTION_NAME, WEAVE_ARROW_TOOL_STATE, WEAVE_COMMENTS_RENDERER_KEY, WEAVE_COMMENTS_TOOL_LAYER_ID, WEAVE_COMMENT_CREATE_ACTION, WEAVE_COMMENT_NODE_ACTION, WEAVE_COMMENT_NODE_DEFAULTS, WEAVE_COMMENT_NODE_TYPE, WEAVE_COMMENT_STATUS, WEAVE_COMMENT_TOOL_ACTION_NAME, WEAVE_COMMENT_TOOL_DEFAULT_CONFIG, WEAVE_COMMENT_TOOL_STATE, WEAVE_COMMENT_VIEW_ACTION, WEAVE_CONNECTOR_NODE_ANCHOR_ORIGIN, WEAVE_CONNECTOR_NODE_DECORATOR_TYPE, WEAVE_CONNECTOR_NODE_DEFAULT_CONFIG, WEAVE_CONNECTOR_NODE_LINE_ORIGIN, WEAVE_CONNECTOR_NODE_LINE_TYPE, WEAVE_CONNECTOR_NODE_TYPE, WEAVE_COPY_PASTE_CONFIG_DEFAULT, WEAVE_COPY_PASTE_NODES_KEY, WEAVE_COPY_PASTE_PASTE_CATCHER_ID, WEAVE_COPY_PASTE_PASTE_MODES, WEAVE_DEFAULT_USER_INFO_FUNCTION, WEAVE_ELLIPSE_NODE_TYPE, WEAVE_FRAME_DEFAULT_BACKGROUND_COLOR, WEAVE_FRAME_NODE_DEFAULT_CONFIG, WEAVE_FRAME_NODE_DEFAULT_PROPS, WEAVE_FRAME_NODE_TYPE, WEAVE_GRID_DEFAULT_CONFIG, WEAVE_GRID_DOT_TYPES, WEAVE_GRID_LAYER_ID, WEAVE_GRID_TYPES, WEAVE_GROUP_NODE_TYPE, WEAVE_IMAGES_TOOL_ACTION_NAME, WEAVE_IMAGES_TOOL_DEFAULT_CONFIG, WEAVE_IMAGES_TOOL_STATE, WEAVE_IMAGES_TOOL_UPLOAD_TYPE, WEAVE_IMAGE_CROP_ANCHOR_POSITION, WEAVE_IMAGE_CROP_END_TYPE, WEAVE_IMAGE_DEFAULT_CONFIG, WEAVE_IMAGE_NODE_TYPE, WEAVE_IMAGE_TOOL_ACTION_NAME, WEAVE_IMAGE_TOOL_CONFIG_DEFAULT, WEAVE_IMAGE_TOOL_STATE, WEAVE_IMAGE_TOOL_UPLOAD_TYPE, WEAVE_LAYER_NODE_TYPE, WEAVE_LINE_NODE_DEFAULT_CONFIG, WEAVE_LINE_NODE_TYPE, WEAVE_MEASURE_NODE_DEFAULT_CONFIG, WEAVE_MEASURE_NODE_TYPE, WEAVE_MEASURE_TOOL_DEFAULT_CONFIG, WEAVE_NODES_MULTI_SELECTION_FEEDBACK_PLUGIN_DEFAULT_CONFIG, WEAVE_NODES_MULTI_SELECTION_FEEDBACK_PLUGIN_KEY, WEAVE_NODES_MULTI_SELECTION_FEEDBACK_PLUGIN_LAYER_ID, WEAVE_NODES_SELECTION_DEFAULT_CONFIG, WEAVE_NODES_SELECTION_KEY, WEAVE_NODES_SELECTION_LAYER_ID, WEAVE_NODES_SNAPPING_PLUGIN_KEY, WEAVE_POLYGON_NODE_TYPE, WEAVE_POLYGON_PRESETS, WEAVE_RECTANGLE_NODE_TYPE, WEAVE_REGULAR_POLYGON_NODE_TYPE, WEAVE_SHAPE_LABEL_DEFAULTS, WEAVE_STAGE_DEFAULT_MODE, WEAVE_STAGE_DROP_AREA_KEY, WEAVE_STAGE_GRID_PLUGIN_KEY, WEAVE_STAGE_IMAGE_CROPPING_MODE, WEAVE_STAGE_KEYBOARD_MOVE_DEFAULT_CONFIG, WEAVE_STAGE_KEYBOARD_MOVE_KEY, WEAVE_STAGE_KEYBOARD_MOVE_ORIENTATION, WEAVE_STAGE_MINIMAP_KEY, WEAVE_STAGE_NODE_TYPE, WEAVE_STAGE_PANNING_DEFAULT_CONFIG, WEAVE_STAGE_PANNING_KEY, WEAVE_STAGE_PANNING_THROTTLE_MS, WEAVE_STAGE_SHAPE_LABEL_EDITION_MODE, WEAVE_STAGE_TEXT_EDITION_MODE, WEAVE_STAGE_ZOOM_DEFAULT_CONFIG, WEAVE_STAGE_ZOOM_KEY, WEAVE_STAGE_ZOOM_TYPE, WEAVE_STAR_NODE_TYPE, WEAVE_STROKE_NODE_DEFAULT_CONFIG, WEAVE_STROKE_NODE_TYPE, WEAVE_STROKE_SINGLE_NODE_DEFAULT_CONFIG, WEAVE_STROKE_SINGLE_NODE_TIP_SIDE, WEAVE_STROKE_SINGLE_NODE_TIP_TYPE, WEAVE_STROKE_SINGLE_NODE_TYPE, WEAVE_STROKE_TOOL_ACTION_NAME, WEAVE_STROKE_TOOL_ACTION_NAME_ALIASES, WEAVE_STROKE_TOOL_DEFAULT_CONFIG, WEAVE_STROKE_TOOL_STATE, WEAVE_TEXT_NODE_DEFAULT_CONFIG, WEAVE_TEXT_NODE_TYPE, WEAVE_USERS_POINTERS_CONFIG_DEFAULT_PROPS, WEAVE_USERS_POINTERS_KEY, WEAVE_USERS_PRESENCE_CONFIG_DEFAULT_PROPS, WEAVE_USERS_PRESENCE_PLUGIN_KEY, WEAVE_USERS_SELECTION_KEY, WEAVE_USER_POINTER_KEY, WEAVE_USER_PRESENCE_KEY, WEAVE_USER_SELECTION_KEY, WEAVE_VIDEO_DEFAULT_CONFIG, WEAVE_VIDEO_NODE_TYPE, Weave, WeaveAction, WeaveAlignNodesToolAction, WeaveArrowNode, WeaveArrowToolAction, WeaveBrushToolAction, WeaveCommentNode, WeaveCommentToolAction, WeaveCommentsRendererPlugin, WeaveConnectedUsersPlugin, WeaveConnectorNode, WeaveConnectorToolAction, WeaveContextMenuPlugin, WeaveCopyPasteNodesPlugin, WeaveEllipseNode, WeaveEllipseToolAction, WeaveEraserToolAction, WeaveExportNodesToolAction, WeaveExportStageToolAction, WeaveFitToScreenToolAction, WeaveFitToSelectionToolAction, WeaveFrameNode, WeaveFrameToolAction, WeaveGroupNode, WeaveGuideToolAction, WeaveImageNode, WeaveImageToolAction, WeaveImagesToolAction, WeaveLayerNode, WeaveLineNode, WeaveLineToolAction, WeaveMeasureNode, WeaveMeasureToolAction, WeaveMoveToolAction, WeaveNode, WeaveNodesMultiSelectionFeedbackPlugin, WeaveNodesSelectionPlugin, WeaveNodesSnappingPlugin, WeavePenToolAction, WeavePlugin, WeavePolygonNode, WeavePolygonToolAction, WeaveRectangleNode, WeaveRectangleToolAction, WeaveRegularPolygonNode, WeaveRegularPolygonToolAction, WeaveRenderer, WeaveSelectionToolAction, WeaveStageDropAreaPlugin, WeaveStageGridPlugin, WeaveStageKeyboardMovePlugin, WeaveStageMinimapPlugin, WeaveStageNode, WeaveStagePanningPlugin, WeaveStageResizePlugin, WeaveStageZoomPlugin, WeaveStarNode, WeaveStarToolAction, WeaveStateManipulation, WeaveStore, WeaveStrokeNode, WeaveStrokeSingleNode, WeaveStrokeToolAction, WeaveTextNode, WeaveTextToolAction, WeaveUsersPointersPlugin, WeaveUsersPresencePlugin, WeaveUsersSelectionPlugin, WeaveVideoNode, WeaveVideoToolAction, WeaveZoomInToolAction, WeaveZoomOutToolAction, buildAncestorGroupIds, canComposite, clearContainerTargets, computeEllipseLabelMinSize, computePolygonLabelMinSize, computeRectangleLabelMinSize, containerOverCursor, containsNodeDeep, defaultInitialState, downscaleImageFile, downscaleImageFromURL, getBoundingBox, getDownscaleRatio, getExportBoundingBox, getImageSizeFromFile, getSelectedNodesMetadata, getShapeLabelSchemaFields, getStageClickPoint, getTargetAndSkipNodes, getTargetedNode, getTopmostShadowHost, getVisibleNodes, getVisibleNodesInViewport, hasFrames, hasImages, instantiatePreset, intersectArrays, isIOS, isInShadowDOM, isNodeInSelection, isNumber, isServer, labelId, loadImageSource, memoize, mergeExceptArrays, moveNodeToContainer, moveNodeToContainerNT, resetScale, setupCanvasBackend, setupSkiaBackend, spreadLabelProps };