@inditextech/weave-sdk 5.0.0-SNAPSHOT.397.1 → 5.0.0-SNAPSHOT.403.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.js CHANGED
@@ -3501,13 +3501,34 @@ function getBoundingBox(nodes, config) {
3501
3501
  height: maxY - minY
3502
3502
  };
3503
3503
  }
3504
+ /**
3505
+ * Builds an array of Weave node IDs from `groupId` up to the root,
3506
+ * including only nodes that have a `nodeType` attribute (actual Weave nodes,
3507
+ * not Konva stage/layer). Used as the multi-stop set for `getInstanceRecursive`
3508
+ * and group-context ancestor checks.
3509
+ */
3510
+ function buildAncestorGroupIds(groupId, stage) {
3511
+ const ids = [];
3512
+ let cur = stage.findOne(`#${groupId}`) ?? null;
3513
+ while (cur) {
3514
+ const id = cur.getAttrs().id;
3515
+ if (id && cur.getAttrs().nodeType) ids.push(id);
3516
+ cur = cur.getParent();
3517
+ }
3518
+ return ids;
3519
+ }
3504
3520
  function getTargetedNode(instance) {
3505
3521
  const stage = instance.getStage();
3506
3522
  let selectedGroup = void 0;
3507
3523
  const mousePos = stage.getPointerPosition();
3508
3524
  if (mousePos) {
3509
3525
  const inter = stage.getIntersection(mousePos);
3510
- if (inter) selectedGroup = instance.getInstanceRecursive(inter);
3526
+ if (inter) {
3527
+ const selectionPlugin = instance.getPlugin("nodesSelection");
3528
+ const activeGroupContext = selectionPlugin?.getActiveGroupContext() ?? void 0;
3529
+ const stopIds = activeGroupContext ? buildAncestorGroupIds(activeGroupContext, stage) : void 0;
3530
+ selectedGroup = instance.getInstanceRecursive(inter, [], stopIds);
3531
+ }
3511
3532
  }
3512
3533
  return selectedGroup;
3513
3534
  }
@@ -3648,7 +3669,7 @@ function getVisibleNodes({ instance, skipNodes, referenceLayer }) {
3648
3669
  nodes.forEach((node) => {
3649
3670
  const actualNodeParent = instance.getNodeContainer(node);
3650
3671
  if (actualNodeParent?.getAttrs().id !== referenceLayer?.getAttrs().id) return;
3651
- if (node.getParent()?.getAttrs().nodeType === "group") return;
3672
+ if (node.getParent()?.getAttrs().nodeType === "group" && node.getParent()?.getAttrs().id !== referenceLayer?.getAttrs().id) return;
3652
3673
  if (skipNodes.includes(node.getParent()?.getAttrs().nodeId)) return;
3653
3674
  if (skipNodes.includes(node.getAttrs().id ?? "")) return;
3654
3675
  if (node.getAttrs().nodeType === "connector") return;
@@ -4826,6 +4847,7 @@ function handleClickOrTap(ctx, e) {
4826
4847
  let areNodesSelected = false;
4827
4848
  let nodeTargeted = selectedGroup && !(selectedGroup.getAttrs().active ?? false) ? selectedGroup : e.target;
4828
4849
  if (e.target === weave.getStage()) {
4850
+ if (ctx.getActiveGroupContext() !== null) ctx.exitGroupContext();
4829
4851
  ctx.getGesture().resetDoubleTap();
4830
4852
  ctx.getNodesSelectionFeedbackPlugin()?.cleanupSelectedHalos();
4831
4853
  return;
@@ -4835,6 +4857,18 @@ function handleClickOrTap(ctx, e) {
4835
4857
  ctx.getGesture().resetDoubleTap();
4836
4858
  return;
4837
4859
  }
4860
+ const activeGroupContext = ctx.getActiveGroupContext();
4861
+ if (activeGroupContext !== null) {
4862
+ const isInsideActiveGroup = isNodeInsideGroup(nodeTargeted, activeGroupContext, stage);
4863
+ if (isInsideActiveGroup) {
4864
+ const parentId = nodeTargeted.getParent()?.getAttrs().id ?? "";
4865
+ if (parentId !== activeGroupContext) ctx.enterGroupContext(parentId);
4866
+ }
4867
+ if (!isInsideActiveGroup) {
4868
+ ctx.exitGroupContext();
4869
+ nodeTargeted = weave.getInstanceRecursive(nodeTargeted);
4870
+ }
4871
+ }
4838
4872
  const metaPressed = e.evt.shiftKey || e.evt.ctrlKey || e.evt.metaKey;
4839
4873
  const nodeSelectedIndex = tr.nodes().findIndex((node) => {
4840
4874
  return node.getAttrs().id === nodeTargeted.getAttrs().id;
@@ -4858,6 +4892,13 @@ function handleClickOrTap(ctx, e) {
4858
4892
  if (realNode) nodeTargeted = realNode;
4859
4893
  }
4860
4894
  if (typeof nodeTargeted.getAttrs().isContainerPrincipal !== "undefined" && !nodeTargeted.getAttrs().isContainerPrincipal) return;
4895
+ let cur = nodeTargeted;
4896
+ let p = cur.getParent();
4897
+ while (p?.getAttrs().nodeType === "group" && activeGroupContext !== p.getAttrs().id && !isAncestorOfActiveGroup(p, activeGroupContext, stage)) {
4898
+ cur = p;
4899
+ p = cur.getParent();
4900
+ }
4901
+ nodeTargeted = cur;
4861
4902
  if (ctx.getGesture().isDoubleTap && !metaPressed) {
4862
4903
  ctx.getGesture().resetDoubleTap();
4863
4904
  nodeTargeted.dblClick();
@@ -4889,6 +4930,40 @@ function handleClickOrTap(ctx, e) {
4889
4930
  }
4890
4931
  ctx.triggerSelectedNodesEvent();
4891
4932
  }
4933
+ /**
4934
+ * Returns true if `node` is anywhere within the group hierarchy rooted at
4935
+ * `groupId`: either a descendant of the active group itself, or a descendant
4936
+ * of any ancestor group in the path from `groupId` to the root.
4937
+ * Used to decide whether a click should keep the current group context active.
4938
+ */
4939
+ function isNodeInsideGroup(node, groupId, stage) {
4940
+ const groupNode = stage.findOne(`#${groupId}`);
4941
+ if (!groupNode) return false;
4942
+ const containerIds = new Set(buildAncestorGroupIds(groupId, stage));
4943
+ let current = node;
4944
+ while (current) {
4945
+ if (containerIds.has(current.getAttrs().id ?? "")) return true;
4946
+ current = current.getParent();
4947
+ }
4948
+ return false;
4949
+ }
4950
+ /**
4951
+ * Returns true if `node` is a (strict) ancestor of the active group — i.e.
4952
+ * it appears in the parent chain above `activeGroupId`, not at the group
4953
+ * itself and not below it.
4954
+ */
4955
+ function isAncestorOfActiveGroup(node, activeGroupId, stage) {
4956
+ if (!node || !activeGroupId) return false;
4957
+ const nodeId = node.getAttrs().id ?? "";
4958
+ const activeGroupNode = stage.findOne(`#${activeGroupId}`);
4959
+ if (!activeGroupNode) return false;
4960
+ let cur = activeGroupNode.getParent();
4961
+ while (cur) {
4962
+ if ((cur.getAttrs().id ?? "") === nodeId) return true;
4963
+ cur = cur.getParent();
4964
+ }
4965
+ return false;
4966
+ }
4892
4967
 
4893
4968
  //#endregion
4894
4969
  //#region src/plugins/nodes-selection/events/keyboard.ts
@@ -4902,6 +4977,13 @@ function registerKeyboardHandlers(ctx) {
4902
4977
  const signal = ctx.getWeaveInstance().getEventsController().signal;
4903
4978
  stage.container().addEventListener("keydown", (e) => {
4904
4979
  if (e.code === "Space") ctx.setSpaceKeyPressed(true);
4980
+ if (e.code === "Escape") {
4981
+ if (ctx.getActiveGroupContext() !== null) {
4982
+ ctx.exitGroupContext();
4983
+ e.stopPropagation();
4984
+ return;
4985
+ }
4986
+ }
4905
4987
  if (e.code === "Backspace" || e.code === "Delete") {
4906
4988
  Promise.resolve().then(() => {
4907
4989
  ctx.removeSelectedNodes();
@@ -4965,6 +5047,8 @@ function handlePointerDown(ctx, e) {
4965
5047
  const nodesSelected = tr.nodes();
4966
5048
  for (const node of nodesSelected) node.fire("onSelectionCleared", { bubbles: true });
4967
5049
  }
5050
+ const activeGroupContext = ctx.getActiveGroupContext();
5051
+ if (activeGroupContext !== null) ctx.exitGroupContext();
4968
5052
  ctx.selectNone();
4969
5053
  ctx.triggerSelectedNodesEvent();
4970
5054
  ctx.getWeaveInstance().emitEvent("onSelectionState", true);
@@ -5112,6 +5196,8 @@ var WeaveNodesSelectionPlugin = class extends WeavePlugin {
5112
5196
  gesture = new GestureDetector();
5113
5197
  _handledClickOrTap = false;
5114
5198
  dragSelectedNodes = [];
5199
+ _activeGroupContext = null;
5200
+ onRender = void 0;
5115
5201
  constructor(params) {
5116
5202
  super();
5117
5203
  this.config = mergeExceptArrays(WEAVE_NODES_SELECTION_DEFAULT_CONFIG, params?.config ?? {});
@@ -5136,6 +5222,8 @@ var WeaveNodesSelectionPlugin = class extends WeavePlugin {
5136
5222
  this.enabled = false;
5137
5223
  this.pointers = {};
5138
5224
  this.dragSelectedNodes = [];
5225
+ this._handledClickOrTap = false;
5226
+ this._activeGroupContext = null;
5139
5227
  }
5140
5228
  getName() {
5141
5229
  return WEAVE_NODES_SELECTION_KEY;
@@ -5257,6 +5345,7 @@ var WeaveNodesSelectionPlugin = class extends WeavePlugin {
5257
5345
  this.active = true;
5258
5346
  });
5259
5347
  this.instance.addEventListener("onNodeRemoved", (node) => {
5348
+ if (this._activeGroupContext === node.id) this.exitGroupContext();
5260
5349
  const selectedNodes = this.getSelectedNodes();
5261
5350
  const newSelectedNodes = selectedNodes.filter((actNode) => actNode.getAttrs().id !== node.id);
5262
5351
  this.setSelectedNodes(newSelectedNodes);
@@ -5265,6 +5354,31 @@ var WeaveNodesSelectionPlugin = class extends WeavePlugin {
5265
5354
  stage.container().style.cursor = "default";
5266
5355
  });
5267
5356
  }
5357
+ getActiveGroupContext() {
5358
+ return this._activeGroupContext;
5359
+ }
5360
+ enterGroupContext(groupId) {
5361
+ const stage = this.instance.getStage();
5362
+ const groupNode = stage.findOne(`#${groupId}`);
5363
+ if (!groupNode) return;
5364
+ this._activeGroupContext = groupId;
5365
+ groupNode.getChildren().forEach((child) => {
5366
+ child.setAttr("draggable", true);
5367
+ });
5368
+ this.selectNone();
5369
+ this.instance.emitEvent("onGroupContextChange", groupId);
5370
+ }
5371
+ exitGroupContext() {
5372
+ if (this._activeGroupContext === null) return;
5373
+ const stage = this.instance.getStage();
5374
+ const groupNode = stage.findOne(`#${this._activeGroupContext}`);
5375
+ if (groupNode) groupNode.getChildren().forEach((child) => {
5376
+ child.setAttr("draggable", false);
5377
+ });
5378
+ this._activeGroupContext = null;
5379
+ this.selectNone();
5380
+ this.instance.emitEvent("onGroupContextChange", null);
5381
+ }
5268
5382
  getLayer() {
5269
5383
  const stage = this.instance.getStage();
5270
5384
  return stage.findOne(`#${this.getLayerName()}`);
@@ -6215,10 +6329,27 @@ var WeaveNode = class {
6215
6329
  this.hideHoverState();
6216
6330
  return;
6217
6331
  }
6332
+ if (this.isHoverSuppressedByGroupContext(node, selectionPlugin)) {
6333
+ this.hideHoverState();
6334
+ return;
6335
+ }
6218
6336
  if (node?.canBeHovered?.()) selectionPlugin.getHoverTransformer().nodes([node]);
6219
6337
  else selectionPlugin.getHoverTransformer().nodes([]);
6220
6338
  selectionPlugin.getHoverTransformer().moveToTop();
6221
6339
  }
6340
+ isHoverSuppressedByGroupContext(node, selectionPlugin) {
6341
+ const activeGroupId = selectionPlugin.getActiveGroupContext();
6342
+ if (activeGroupId === null) return false;
6343
+ const activeGroupNode = this.instance.getStage().findOne(`#${activeGroupId}`);
6344
+ if (!activeGroupNode) return false;
6345
+ const hoveredId = node.getAttrs().id ?? "";
6346
+ let current = activeGroupNode;
6347
+ while (current) {
6348
+ if ((current.getAttrs().id ?? "") === hoveredId) return true;
6349
+ current = current.getParent();
6350
+ }
6351
+ return false;
6352
+ }
6222
6353
  hideHoverState() {
6223
6354
  const selectionPlugin = this.getSelectionPlugin();
6224
6355
  if (!selectionPlugin) return;
@@ -6476,7 +6607,8 @@ var WeaveNode = class {
6476
6607
  }
6477
6608
  this.instance.emitEvent("onDrag", null);
6478
6609
  const realNodeTarget = this.getRealSelectedNode(nodeTarget);
6479
- if (this.isSelecting() && this.getSelectionPlugin()?.getSelectedNodes().length === 1 && (realNodeTarget.getAttrs().lockToContainer === void 0 || !realNodeTarget.getAttrs().lockToContainer)) this.instance.stateTransactional(() => {
6610
+ const isInGroupContext = (this.getSelectionPlugin()?.getActiveGroupContext() ?? null) !== null;
6611
+ if (!isInGroupContext && this.isSelecting() && this.getSelectionPlugin()?.getSelectedNodes().length === 1 && (realNodeTarget.getAttrs().lockToContainer === void 0 || !realNodeTarget.getAttrs().lockToContainer)) this.instance.stateTransactional(() => {
6480
6612
  clearContainerTargets(this.instance);
6481
6613
  const layerToMove = containerOverCursor(this.instance, [realNodeTarget]);
6482
6614
  let containerToMove = this.instance.getMainLayer();
@@ -6564,7 +6696,19 @@ var WeaveNode = class {
6564
6696
  const user = this.instance.getStore().getUser();
6565
6697
  const activeAction = this.instance.getActiveAction();
6566
6698
  const isNodeSelectionEnabled = this.getSelectionPlugin()?.isEnabled();
6567
- const realNode = this.instance.getInstanceRecursive(node);
6699
+ const activeGroupCtx = this.getSelectionPlugin()?.getActiveGroupContext() ?? void 0;
6700
+ let realNode;
6701
+ if (activeGroupCtx) {
6702
+ const stage$1 = this.instance.getStage();
6703
+ const stopIds = [];
6704
+ let cur = stage$1.findOne(`#${activeGroupCtx}`) ?? null;
6705
+ while (cur) {
6706
+ const id = cur.getAttrs().id;
6707
+ if (id) stopIds.push(id);
6708
+ cur = cur.getParent();
6709
+ }
6710
+ realNode = this.instance.getInstanceRecursive(node, [], stopIds);
6711
+ } else realNode = this.instance.getInstanceRecursive(node);
6568
6712
  const canBeTargeted = realNode.getAttrs().canBeTargeted !== false;
6569
6713
  const isLocked = realNode.getAttrs().locked ?? false;
6570
6714
  const isMutexLocked = realNode.getAttrs().mutexLocked && realNode.getAttrs().mutexUserId !== user.id;
@@ -9518,7 +9662,7 @@ var WeaveRegisterManager = class {
9518
9662
 
9519
9663
  //#endregion
9520
9664
  //#region package.json
9521
- var version = "5.0.0-SNAPSHOT.397.1";
9665
+ var version = "5.0.0-SNAPSHOT.403.1";
9522
9666
 
9523
9667
  //#endregion
9524
9668
  //#region src/managers/setup.ts
@@ -9612,13 +9756,18 @@ var WeaveStageManager = class {
9612
9756
  const stage = this.getStage();
9613
9757
  return stage.findOne(`#${WEAVE_UTILITY_LAYER_ID}`);
9614
9758
  }
9615
- getInstanceRecursive(instance, filterInstanceType = []) {
9759
+ getInstanceRecursive(instance, filterInstanceType = [], stopAtGroupId) {
9616
9760
  const attributes = instance.getAttrs();
9761
+ if (stopAtGroupId) {
9762
+ const parentId = instance.getParent()?.getAttrs().id ?? "";
9763
+ const matches = Array.isArray(stopAtGroupId) ? stopAtGroupId.includes(parentId) : parentId === stopAtGroupId;
9764
+ if (matches) return instance;
9765
+ }
9617
9766
  if (instance.getParent() && instance.getParent()?.getAttrs().nodeType && ![
9618
9767
  "stage",
9619
9768
  "layer",
9620
9769
  ...filterInstanceType
9621
- ].includes(instance.getParent()?.getAttrs().nodeType)) return this.getInstanceRecursive(instance.getParent());
9770
+ ].includes(instance.getParent()?.getAttrs().nodeType)) return this.getInstanceRecursive(instance.getParent(), filterInstanceType, stopAtGroupId);
9622
9771
  if (attributes.id === "mainLayer") return this.instance.getMainLayer();
9623
9772
  if (attributes.id === "stage") return this.instance.getMainLayer();
9624
9773
  return instance;
@@ -10957,8 +11106,8 @@ var Weave = class {
10957
11106
  getStageConfiguration() {
10958
11107
  return this.stageManager.getConfiguration();
10959
11108
  }
10960
- getInstanceRecursive(instance, filterInstanceType = []) {
10961
- return this.stageManager.getInstanceRecursive(instance, filterInstanceType);
11109
+ getInstanceRecursive(instance, filterInstanceType = [], stopAtGroupId) {
11110
+ return this.stageManager.getInstanceRecursive(instance, filterInstanceType, stopAtGroupId);
10962
11111
  }
10963
11112
  getContainerNodes() {
10964
11113
  return this.stageManager.getContainerNodes();
@@ -11926,6 +12075,25 @@ var WeaveGroupNode = class extends WeaveNode {
11926
12075
  y: 1
11927
12076
  });
11928
12077
  });
12078
+ group.dblClick = () => {
12079
+ const selectionPlugin = this.instance.getPlugin("nodesSelection");
12080
+ if (!selectionPlugin) return;
12081
+ const groupId = group.getAttrs().id ?? "";
12082
+ selectionPlugin.enterGroupContext(groupId);
12083
+ const stage = this.instance.getStage();
12084
+ const mousePos = stage.getPointerPosition();
12085
+ if (!mousePos) return;
12086
+ const selectionLayer = stage.findOne("#" + selectionPlugin.getLayerName());
12087
+ selectionLayer?.listening(false);
12088
+ const intersected = stage.getIntersection(mousePos);
12089
+ selectionLayer?.listening(true);
12090
+ if (!intersected) return;
12091
+ const directChild = this.instance.getInstanceRecursive(intersected, [], groupId);
12092
+ if (directChild.getParent()?.getAttrs().id === groupId) {
12093
+ selectionPlugin.setSelectedNodes([directChild]);
12094
+ selectionPlugin.triggerSelectedNodesEvent();
12095
+ }
12096
+ };
11929
12097
  return group;
11930
12098
  }
11931
12099
  onUpdate(nodeInstance, nextProps) {
@@ -12130,6 +12298,7 @@ var WeaveShapeLabelEditor = class {
12130
12298
  this.instance.releaseMutexLock();
12131
12299
  this.instance.getStage().mode(WEAVE_STAGE_DEFAULT_MODE);
12132
12300
  this.editing = false;
12301
+ const editedGroupId = this.editingGroup?.id() ?? null;
12133
12302
  if (this.editingGroup) {
12134
12303
  const liveGroup = this.instance.getStage().findOne(`#${this.editingGroup.id()}`);
12135
12304
  const labelNode = liveGroup?.findOne(`#${labelId(this.editingGroup.id())}`);
@@ -12145,7 +12314,13 @@ var WeaveShapeLabelEditor = class {
12145
12314
  this.editingTextBounds = null;
12146
12315
  this.instance.getStage().off(".weaveLabelEdit");
12147
12316
  const selectionPlugin = this.instance.getPlugin("nodesSelection");
12148
- if (selectionPlugin) this.instance.enablePlugin("nodesSelection");
12317
+ if (selectionPlugin) {
12318
+ this.instance.enablePlugin("nodesSelection");
12319
+ if (editedGroupId) requestAnimationFrame(() => {
12320
+ const liveGroup = this.instance.getStage().findOne(`#${editedGroupId}`);
12321
+ if (liveGroup) selectionPlugin.setSelectedNodes([liveGroup]);
12322
+ });
12323
+ }
12149
12324
  }
12150
12325
  updateTextAreaPosition(group, textBounds) {
12151
12326
  if (!this.editing || !this.textArea) return;
@@ -32190,19 +32365,40 @@ var WeaveNodesSnappingGuides = class {
32190
32365
  const stage = this.instance.getStage();
32191
32366
  const scaleX = stage.scaleX();
32192
32367
  const scaleY = stage.scaleY();
32193
- let finalContainer = container;
32194
- if (container !== stage) finalContainer = container.getParent();
32195
- const pos = finalContainer.position();
32196
- const rect = finalContainer.getClientRect({ relativeTo: stage });
32197
- const x = finalContainer === stage ? -pos.x / scaleX : rect.x;
32198
- const y = finalContainer === stage ? -pos.y / scaleX : rect.y;
32199
- const width = finalContainer === stage ? stage.width() / scaleX : rect.width;
32200
- const height = finalContainer === stage ? stage.height() / scaleY : rect.height;
32368
+ const mainLayer = this.instance.getMainLayer();
32369
+ if (container === stage || container === mainLayer) {
32370
+ const pos$1 = stage.position();
32371
+ return {
32372
+ x: -pos$1.x / scaleX,
32373
+ y: -pos$1.y / scaleY,
32374
+ width: stage.width() / scaleX,
32375
+ height: stage.height() / scaleY
32376
+ };
32377
+ }
32378
+ let frameNode = null;
32379
+ let cur = container;
32380
+ while (cur && cur !== mainLayer && cur !== stage) {
32381
+ if (cur.getAttrs().nodeType === "frame") {
32382
+ frameNode = cur;
32383
+ break;
32384
+ }
32385
+ cur = cur.getParent();
32386
+ }
32387
+ if (frameNode) {
32388
+ const rect = frameNode.getClientRect({ relativeTo: stage });
32389
+ return {
32390
+ x: rect.x,
32391
+ y: rect.y,
32392
+ width: rect.width,
32393
+ height: rect.height
32394
+ };
32395
+ }
32396
+ const pos = stage.position();
32201
32397
  return {
32202
- x,
32203
- y,
32204
- width,
32205
- height
32398
+ x: -pos.x / scaleX,
32399
+ y: -pos.y / scaleY,
32400
+ width: stage.width() / scaleX,
32401
+ height: stage.height() / scaleY
32206
32402
  };
32207
32403
  }
32208
32404
  renderSnapGuides(container, snap) {
@@ -32214,8 +32410,11 @@ var WeaveNodesSnappingGuides = class {
32214
32410
  if (snap.containerId !== "mainLayer") {
32215
32411
  const containerNode = stage.findOne(`#${snap.containerId}`);
32216
32412
  if (containerNode) {
32217
- const containerPos = containerNode.getClientRect({ relativeTo: stage });
32218
- value = containerPos.x + snap.guide;
32413
+ const canvasPt = containerNode.getAbsoluteTransform().point({
32414
+ x: snap.guide,
32415
+ y: 0
32416
+ });
32417
+ value = stage.getAbsoluteTransform().copy().invert().point(canvasPt).x;
32219
32418
  }
32220
32419
  }
32221
32420
  this.layer.add(new Konva.Line({
@@ -32238,8 +32437,11 @@ var WeaveNodesSnappingGuides = class {
32238
32437
  if (snap.containerId !== "mainLayer") {
32239
32438
  const containerNode = stage.findOne(`#${snap.containerId}`);
32240
32439
  if (containerNode) {
32241
- const containerPos = containerNode.getClientRect({ relativeTo: stage });
32242
- value = containerPos.y + snap.guide;
32440
+ const canvasPt = containerNode.getAbsoluteTransform().point({
32441
+ x: 0,
32442
+ y: snap.guide
32443
+ });
32444
+ value = stage.getAbsoluteTransform().copy().invert().point(canvasPt).y;
32243
32445
  }
32244
32446
  }
32245
32447
  this.layer.add(new Konva.Line({
@@ -32705,6 +32907,10 @@ var WeaveNodesSnappingPlugin = class extends WeavePlugin {
32705
32907
  this.relativeToId = containerNode.id();
32706
32908
  }
32707
32909
  }
32910
+ if (container !== this.instance.getMainLayer() && !container.getAttrs().nodeId && container.getAttrs().nodeType === "group") {
32911
+ this.relativeTo = container;
32912
+ this.relativeToId = container.id();
32913
+ }
32708
32914
  if (!this.relativeTo) return;
32709
32915
  this.visibleNodes = getVisibleNodes({
32710
32916
  instance: this.instance,
@@ -32735,8 +32941,8 @@ var WeaveNodesSnappingPlugin = class extends WeavePlugin {
32735
32941
  y: -1 * (relativeTo.getAttrs().containerCompensationY ?? 0)
32736
32942
  };
32737
32943
  const diff = {
32738
- x: Math.abs(nodeBox.x - node.x()),
32739
- y: Math.abs(nodeBox.y - node.y())
32944
+ x: node.x() - nodeBox.x,
32945
+ y: node.y() - nodeBox.y
32740
32946
  };
32741
32947
  this.selectionOffsets.push({
32742
32948
  x: nodeBox.x - nodesBox.x + diff.x + containerCompensation.x,
@@ -32930,4 +33136,4 @@ function getJSONFromYjsBinary(actualState) {
32930
33136
  }
32931
33137
 
32932
33138
  //#endregion
32933
- 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, getJSONFromYjsBinary, getSelectedNodesMetadata, getShapeLabelSchemaFields, getStageClickPoint, getTargetAndSkipNodes, getTargetedNode, getTopmostShadowHost, getVisibleNodes, getVisibleNodesInViewport, hasFrames, hasImages, instantiatePreset, intersectArrays, isArray, isIOS, isInShadowDOM, isNodeInSelection, isNumber, isObject, isServer, labelId, loadImageSource, mapJsonToYjsArray, mapJsonToYjsElements, mapJsonToYjsMap, memoize, mergeExceptArrays, moveNodeToContainer, moveNodeToContainerNT, resetScale, spreadLabelProps, weavejsToYjsBinary };
33139
+ 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, getJSONFromYjsBinary, getSelectedNodesMetadata, getShapeLabelSchemaFields, getStageClickPoint, getTargetAndSkipNodes, getTargetedNode, getTopmostShadowHost, getVisibleNodes, getVisibleNodesInViewport, hasFrames, hasImages, instantiatePreset, intersectArrays, isArray, isIOS, isInShadowDOM, isNodeInSelection, isNumber, isObject, isServer, labelId, loadImageSource, mapJsonToYjsArray, mapJsonToYjsElements, mapJsonToYjsMap, memoize, mergeExceptArrays, moveNodeToContainer, moveNodeToContainerNT, resetScale, spreadLabelProps, weavejsToYjsBinary };