@excalidraw/element 0.18.0-b16b6f8fd → 0.18.0-b9d27d3

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/dev/index.js CHANGED
@@ -2269,9 +2269,9 @@ import {
2269
2269
  degreesToRadians,
2270
2270
  lineSegment as lineSegment5,
2271
2271
  pointDistance as pointDistance7,
2272
- pointFrom as pointFrom12,
2272
+ pointFrom as pointFrom13,
2273
2273
  pointFromArray as pointFromArray3,
2274
- pointRotateRads as pointRotateRads10
2274
+ pointRotateRads as pointRotateRads11
2275
2275
  } from "@excalidraw/math";
2276
2276
 
2277
2277
  // ../utils/src/shape.ts
@@ -2448,9 +2448,9 @@ var getClosedCurveShape = (element, roughShape, startingPoint = pointFrom(0, 0),
2448
2448
  // src/shape.ts
2449
2449
  init_define_import_meta_env();
2450
2450
  import {
2451
- pointFrom as pointFrom11,
2451
+ pointFrom as pointFrom12,
2452
2452
  pointDistance as pointDistance6,
2453
- pointRotateRads as pointRotateRads9
2453
+ pointRotateRads as pointRotateRads10
2454
2454
  } from "@excalidraw/math";
2455
2455
  import {
2456
2456
  ROUGHNESS,
@@ -3103,8 +3103,8 @@ var getFlipAdjustedCropPosition = (element, natural = false) => {
3103
3103
  init_define_import_meta_env();
3104
3104
  import {
3105
3105
  pointCenter as pointCenter2,
3106
- pointFrom as pointFrom8,
3107
- pointRotateRads as pointRotateRads7,
3106
+ pointFrom as pointFrom9,
3107
+ pointRotateRads as pointRotateRads8,
3108
3108
  pointsEqual as pointsEqual6,
3109
3109
  pointDistance as pointDistance5,
3110
3110
  vectorFromPoint as vectorFromPoint7,
@@ -3138,8 +3138,8 @@ import {
3138
3138
  } from "@excalidraw/common";
3139
3139
  import {
3140
3140
  lineSegment as lineSegment4,
3141
- pointFrom as pointFrom7,
3142
- pointRotateRads as pointRotateRads6,
3141
+ pointFrom as pointFrom8,
3142
+ pointRotateRads as pointRotateRads7,
3143
3143
  vectorFromPoint as vectorFromPoint6,
3144
3144
  pointDistanceSq,
3145
3145
  clamp as clamp3,
@@ -3161,9 +3161,9 @@ import {
3161
3161
  isPointWithinBounds,
3162
3162
  lineSegment as lineSegment3,
3163
3163
  lineSegmentIntersectionPoints,
3164
- pointFrom as pointFrom4,
3164
+ pointFrom as pointFrom5,
3165
3165
  pointFromVector as pointFromVector3,
3166
- pointRotateRads as pointRotateRads4,
3166
+ pointRotateRads as pointRotateRads5,
3167
3167
  pointsEqual as pointsEqual2,
3168
3168
  vectorFromPoint as vectorFromPoint3,
3169
3169
  vectorNormalize as vectorNormalize2,
@@ -3711,6 +3711,7 @@ import {
3711
3711
  isProdEnv,
3712
3712
  invariant as invariant2
3713
3713
  } from "@excalidraw/common";
3714
+ import { pointFrom as pointFrom4, pointRotateRads as pointRotateRads3 } from "@excalidraw/math";
3714
3715
 
3715
3716
  // src/containerCache.ts
3716
3717
  init_define_import_meta_env();
@@ -4390,6 +4391,22 @@ var computeBoundTextPosition = (container, boundTextElement, elementsMap) => {
4390
4391
  } else {
4391
4392
  x = containerCoords.x + (maxContainerWidth / 2 - boundTextElement.width / 2);
4392
4393
  }
4394
+ const angle = container.angle ?? 0;
4395
+ if (angle !== 0) {
4396
+ const contentCenter = pointFrom4(
4397
+ containerCoords.x + maxContainerWidth / 2,
4398
+ containerCoords.y + maxContainerHeight / 2
4399
+ );
4400
+ const textCenter = pointFrom4(
4401
+ x + boundTextElement.width / 2,
4402
+ y + boundTextElement.height / 2
4403
+ );
4404
+ const [rx, ry] = pointRotateRads3(textCenter, contentCenter, angle);
4405
+ return {
4406
+ x: rx - boundTextElement.width / 2,
4407
+ y: ry - boundTextElement.height / 2
4408
+ };
4409
+ }
4393
4410
  return { x, y };
4394
4411
  };
4395
4412
  var getBoundTextElementId = (container) => {
@@ -4573,7 +4590,7 @@ init_define_import_meta_env();
4573
4590
  import {
4574
4591
  curvePointDistance,
4575
4592
  distanceToLineSegment,
4576
- pointRotateRads as pointRotateRads3
4593
+ pointRotateRads as pointRotateRads4
4577
4594
  } from "@excalidraw/math";
4578
4595
  import { ellipse as ellipse2, ellipseDistanceFromPoint } from "@excalidraw/math/ellipse";
4579
4596
  var distanceToElement = (element, elementsMap, p) => {
@@ -4599,7 +4616,7 @@ var distanceToElement = (element, elementsMap, p) => {
4599
4616
  };
4600
4617
  var distanceToRectanguloidElement = (element, elementsMap, p) => {
4601
4618
  const center = elementCenterPoint(element, elementsMap);
4602
- const rotatedPoint = pointRotateRads3(p, center, -element.angle);
4619
+ const rotatedPoint = pointRotateRads4(p, center, -element.angle);
4603
4620
  const [sides, corners] = deconstructRectanguloidElement(element);
4604
4621
  return Math.min(
4605
4622
  ...sides.map((s) => distanceToLineSegment(rotatedPoint, s)),
@@ -4608,7 +4625,7 @@ var distanceToRectanguloidElement = (element, elementsMap, p) => {
4608
4625
  };
4609
4626
  var distanceToDiamondElement = (element, elementsMap, p) => {
4610
4627
  const center = elementCenterPoint(element, elementsMap);
4611
- const rotatedPoint = pointRotateRads3(p, center, -element.angle);
4628
+ const rotatedPoint = pointRotateRads4(p, center, -element.angle);
4612
4629
  const [sides, curves] = deconstructDiamondElement(element);
4613
4630
  return Math.min(
4614
4631
  ...sides.map((s) => distanceToLineSegment(rotatedPoint, s)),
@@ -4619,7 +4636,7 @@ var distanceToEllipseElement = (element, elementsMap, p) => {
4619
4636
  const center = elementCenterPoint(element, elementsMap);
4620
4637
  return ellipseDistanceFromPoint(
4621
4638
  // Instead of rotating the ellipse, rotate the point to the inverse angle
4622
- pointRotateRads3(p, center, -element.angle),
4639
+ pointRotateRads4(p, center, -element.angle),
4623
4640
  ellipse2(center, element.width / 2, element.height / 2)
4624
4641
  );
4625
4642
  };
@@ -4653,22 +4670,22 @@ var hitElementItself = ({
4653
4670
  frameNameBound = null
4654
4671
  }) => {
4655
4672
  const hitFrameName = frameNameBound ? isPointWithinBounds(
4656
- pointFrom4(frameNameBound.x - threshold, frameNameBound.y - threshold),
4673
+ pointFrom5(frameNameBound.x - threshold, frameNameBound.y - threshold),
4657
4674
  point,
4658
- pointFrom4(
4675
+ pointFrom5(
4659
4676
  frameNameBound.x + frameNameBound.width + threshold,
4660
4677
  frameNameBound.y + frameNameBound.height + threshold
4661
4678
  )
4662
4679
  ) : false;
4663
4680
  const bounds = getElementBounds(element, elementsMap, true);
4664
4681
  const hitBounds = isPointWithinBounds(
4665
- pointFrom4(bounds[0] - threshold, bounds[1] - threshold),
4666
- pointRotateRads4(
4682
+ pointFrom5(bounds[0] - threshold, bounds[1] - threshold),
4683
+ pointRotateRads5(
4667
4684
  point,
4668
4685
  getCenterForBounds(bounds),
4669
4686
  -element.angle
4670
4687
  ),
4671
- pointFrom4(bounds[2] + threshold, bounds[3] + threshold)
4688
+ pointFrom5(bounds[2] + threshold, bounds[3] + threshold)
4672
4689
  );
4673
4690
  if (!hitBounds && !hitFrameName) {
4674
4691
  return false;
@@ -4686,7 +4703,7 @@ var hitElementBoundingBox = (point, element, elementsMap, tolerance = 0) => {
4686
4703
  y1 -= tolerance;
4687
4704
  x2 += tolerance;
4688
4705
  y2 += tolerance;
4689
- return isPointWithinBounds(pointFrom4(x1, y1), point, pointFrom4(x2, y2));
4706
+ return isPointWithinBounds(pointFrom5(x1, y1), point, pointFrom5(x2, y2));
4690
4707
  };
4691
4708
  var hitElementBoundingBoxOnly = (hitArgs, elementsMap) => !hitElementItself(hitArgs) && // bound text is considered part of the element (even if it's outside the bounding box)
4692
4709
  !hitElementBoundText(hitArgs.point, hitArgs.element, elementsMap) && hitElementBoundingBox(hitArgs.point, hitArgs.element, elementsMap);
@@ -4770,7 +4787,7 @@ var curveIntersections = (curves, segment, intersections, center, angle, onlyFir
4770
4787
  const hits = curveIntersectLineSegment(c, segment);
4771
4788
  if (hits.length > 0) {
4772
4789
  for (const j of hits) {
4773
- intersections.push(pointRotateRads4(j, center, angle));
4790
+ intersections.push(pointRotateRads5(j, center, angle));
4774
4791
  }
4775
4792
  if (onlyFirst) {
4776
4793
  return intersections;
@@ -4783,7 +4800,7 @@ var lineIntersections = (lines, segment, intersections, center, angle, onlyFirst
4783
4800
  for (const l2 of lines) {
4784
4801
  const intersection = lineSegmentIntersectionPoints(l2, segment);
4785
4802
  if (intersection) {
4786
- intersections.push(pointRotateRads4(intersection, center, angle));
4803
+ intersections.push(pointRotateRads5(intersection, center, angle));
4787
4804
  if (onlyFirst) {
4788
4805
  return intersections;
4789
4806
  }
@@ -4826,12 +4843,12 @@ var intersectLinearOrFreeDrawWithLineSegment = (element, segment, onlyFirst = fa
4826
4843
  };
4827
4844
  var intersectRectanguloidWithLineSegment = (element, elementsMap, segment, offset = 0, onlyFirst = false) => {
4828
4845
  const center = elementCenterPoint(element, elementsMap);
4829
- const rotatedA = pointRotateRads4(
4846
+ const rotatedA = pointRotateRads5(
4830
4847
  segment[0],
4831
4848
  center,
4832
4849
  -element.angle
4833
4850
  );
4834
- const rotatedB = pointRotateRads4(
4851
+ const rotatedB = pointRotateRads5(
4835
4852
  segment[1],
4836
4853
  center,
4837
4854
  -element.angle
@@ -4862,8 +4879,8 @@ var intersectRectanguloidWithLineSegment = (element, elementsMap, segment, offse
4862
4879
  };
4863
4880
  var intersectDiamondWithLineSegment = (element, elementsMap, l2, offset = 0, onlyFirst = false) => {
4864
4881
  const center = elementCenterPoint(element, elementsMap);
4865
- const rotatedA = pointRotateRads4(l2[0], center, -element.angle);
4866
- const rotatedB = pointRotateRads4(l2[1], center, -element.angle);
4882
+ const rotatedA = pointRotateRads5(l2[0], center, -element.angle);
4883
+ const rotatedB = pointRotateRads5(l2[1], center, -element.angle);
4867
4884
  const rotatedIntersector = lineSegment3(rotatedA, rotatedB);
4868
4885
  const [sides, corners] = deconstructDiamondElement(element, offset);
4869
4886
  const intersections = [];
@@ -4890,12 +4907,12 @@ var intersectDiamondWithLineSegment = (element, elementsMap, l2, offset = 0, onl
4890
4907
  };
4891
4908
  var intersectEllipseWithLineSegment = (element, elementsMap, l2, offset = 0) => {
4892
4909
  const center = elementCenterPoint(element, elementsMap);
4893
- const rotatedA = pointRotateRads4(l2[0], center, -element.angle);
4894
- const rotatedB = pointRotateRads4(l2[1], center, -element.angle);
4910
+ const rotatedA = pointRotateRads5(l2[0], center, -element.angle);
4911
+ const rotatedB = pointRotateRads5(l2[1], center, -element.angle);
4895
4912
  return ellipseSegmentInterceptPoints(
4896
4913
  ellipse3(center, element.width / 2 + offset, element.height / 2 + offset),
4897
4914
  lineSegment3(rotatedA, rotatedB)
4898
- ).map((p) => pointRotateRads4(p, center, element.angle));
4915
+ ).map((p) => pointRotateRads5(p, center, element.angle));
4899
4916
  };
4900
4917
  var isPointOnElementOutline = (point, element, elementsMap, tolerance = 1) => distanceToElement(element, elementsMap, point) <= tolerance;
4901
4918
  var isPointInElement = (point, element, elementsMap) => {
@@ -4903,10 +4920,10 @@ var isPointInElement = (point, element, elementsMap) => {
4903
4920
  return false;
4904
4921
  }
4905
4922
  const [x1, y1, x2, y2] = getElementBounds(element, elementsMap);
4906
- if (!isPointWithinBounds(pointFrom4(x1, y1), point, pointFrom4(x2, y2))) {
4923
+ if (!isPointWithinBounds(pointFrom5(x1, y1), point, pointFrom5(x2, y2))) {
4907
4924
  return false;
4908
4925
  }
4909
- const center = pointFrom4((x1 + x2) / 2, (y1 + y2) / 2);
4926
+ const center = pointFrom5((x1 + x2) / 2, (y1 + y2) / 2);
4910
4927
  const otherPoint = pointFromVector3(
4911
4928
  vectorScale3(
4912
4929
  vectorNormalize2(vectorFromPoint3(point, center, 0.1)),
@@ -4927,9 +4944,9 @@ var isPointInElement = (point, element, elementsMap) => {
4927
4944
  init_define_import_meta_env();
4928
4945
  import { invariant as invariant3, isDevEnv as isDevEnv2, isTestEnv as isTestEnv3 } from "@excalidraw/common";
4929
4946
  import {
4930
- pointFrom as pointFrom5,
4947
+ pointFrom as pointFrom6,
4931
4948
  pointFromVector as pointFromVector4,
4932
- pointRotateRads as pointRotateRads5,
4949
+ pointRotateRads as pointRotateRads6,
4933
4950
  pointScaleFromOrigin,
4934
4951
  pointsEqual as pointsEqual3,
4935
4952
  triangleIncludesPoint,
@@ -4975,8 +4992,8 @@ var headingForPointFromDiamondElement = (element, aabb, point) => {
4975
4992
  const top = pointFromVector4(
4976
4993
  vectorScale4(
4977
4994
  vectorFromPoint4(
4978
- pointRotateRads5(
4979
- pointFrom5(element.x + element.width / 2, element.y),
4995
+ pointRotateRads6(
4996
+ pointFrom6(element.x + element.width / 2, element.y),
4980
4997
  midPoint,
4981
4998
  element.angle
4982
4999
  ),
@@ -4989,8 +5006,8 @@ var headingForPointFromDiamondElement = (element, aabb, point) => {
4989
5006
  const right = pointFromVector4(
4990
5007
  vectorScale4(
4991
5008
  vectorFromPoint4(
4992
- pointRotateRads5(
4993
- pointFrom5(
5009
+ pointRotateRads6(
5010
+ pointFrom6(
4994
5011
  element.x + element.width,
4995
5012
  element.y + element.height / 2
4996
5013
  ),
@@ -5006,8 +5023,8 @@ var headingForPointFromDiamondElement = (element, aabb, point) => {
5006
5023
  const bottom = pointFromVector4(
5007
5024
  vectorScale4(
5008
5025
  vectorFromPoint4(
5009
- pointRotateRads5(
5010
- pointFrom5(
5026
+ pointRotateRads6(
5027
+ pointFrom6(
5011
5028
  element.x + element.width / 2,
5012
5029
  element.y + element.height
5013
5030
  ),
@@ -5023,8 +5040,8 @@ var headingForPointFromDiamondElement = (element, aabb, point) => {
5023
5040
  const left = pointFromVector4(
5024
5041
  vectorScale4(
5025
5042
  vectorFromPoint4(
5026
- pointRotateRads5(
5027
- pointFrom5(element.x, element.y + element.height / 2),
5043
+ pointRotateRads6(
5044
+ pointFrom6(element.x, element.y + element.height / 2),
5028
5045
  midPoint,
5029
5046
  element.angle
5030
5047
  ),
@@ -5090,22 +5107,22 @@ var headingForPointFromElement = (element, aabb, p) => {
5090
5107
  return headingForPointFromDiamondElement(element, aabb, p);
5091
5108
  }
5092
5109
  const topLeft = pointScaleFromOrigin(
5093
- pointFrom5(aabb[0], aabb[1]),
5110
+ pointFrom6(aabb[0], aabb[1]),
5094
5111
  midPoint,
5095
5112
  SEARCH_CONE_MULTIPLIER
5096
5113
  );
5097
5114
  const topRight = pointScaleFromOrigin(
5098
- pointFrom5(aabb[2], aabb[1]),
5115
+ pointFrom6(aabb[2], aabb[1]),
5099
5116
  midPoint,
5100
5117
  SEARCH_CONE_MULTIPLIER
5101
5118
  );
5102
5119
  const bottomLeft = pointScaleFromOrigin(
5103
- pointFrom5(aabb[0], aabb[3]),
5120
+ pointFrom6(aabb[0], aabb[3]),
5104
5121
  midPoint,
5105
5122
  SEARCH_CONE_MULTIPLIER
5106
5123
  );
5107
5124
  const bottomRight = pointScaleFromOrigin(
5108
- pointFrom5(aabb[2], aabb[3]),
5125
+ pointFrom6(aabb[2], aabb[3]),
5109
5126
  midPoint,
5110
5127
  SEARCH_CONE_MULTIPLIER
5111
5128
  );
@@ -5138,7 +5155,7 @@ init_define_import_meta_env();
5138
5155
  import {
5139
5156
  clamp as clamp2,
5140
5157
  pointDistance as pointDistance3,
5141
- pointFrom as pointFrom6,
5158
+ pointFrom as pointFrom7,
5142
5159
  pointScaleFromOrigin as pointScaleFromOrigin2,
5143
5160
  pointsEqual as pointsEqual4,
5144
5161
  pointTranslate,
@@ -5162,7 +5179,7 @@ var handleSegmentRenormalization = (arrow, elementsMap) => {
5162
5179
  const nextFixedSegments = arrow.fixedSegments ? arrow.fixedSegments.slice() : null;
5163
5180
  if (nextFixedSegments) {
5164
5181
  const _nextPoints = [];
5165
- arrow.points.map((p) => pointFrom6(arrow.x + p[0], arrow.y + p[1])).forEach((p, i, points) => {
5182
+ arrow.points.map((p) => pointFrom7(arrow.x + p[0], arrow.y + p[1])).forEach((p, i, points) => {
5166
5183
  if (i < 2) {
5167
5184
  return _nextPoints.push(p);
5168
5185
  }
@@ -5180,7 +5197,7 @@ var handleSegmentRenormalization = (arrow, elementsMap) => {
5180
5197
  ) ?? -1;
5181
5198
  const segmentIdx = nextFixedSegments?.findIndex((segment) => segment.index === i) ?? -1;
5182
5199
  if (segmentIdx !== -1) {
5183
- nextFixedSegments[segmentIdx].start = pointFrom6(
5200
+ nextFixedSegments[segmentIdx].start = pointFrom7(
5184
5201
  points[i - 2][0] - arrow.x,
5185
5202
  points[i - 2][1] - arrow.y
5186
5203
  );
@@ -5222,7 +5239,7 @@ var handleSegmentRenormalization = (arrow, elementsMap) => {
5222
5239
  });
5223
5240
  const isHorizontal = headingForPointIsHorizontal(p, points[i - 1]);
5224
5241
  return nextPoints.push(
5225
- pointFrom6(
5242
+ pointFrom7(
5226
5243
  !isHorizontal ? points[i - 2][0] : p[0],
5227
5244
  isHorizontal ? points[i - 2][1] : p[1]
5228
5245
  )
@@ -5243,7 +5260,7 @@ var handleSegmentRenormalization = (arrow, elementsMap) => {
5243
5260
  arrow,
5244
5261
  elementsMap,
5245
5262
  nextPoints.map(
5246
- (p) => pointFrom6(p[0] - arrow.x, p[1] - arrow.y)
5263
+ (p) => pointFrom7(p[0] - arrow.x, p[1] - arrow.y)
5247
5264
  )
5248
5265
  )
5249
5266
  ) ?? []
@@ -5312,8 +5329,8 @@ var handleSegmentRelease = (arrow, fixedSegments, elementsMap) => {
5312
5329
  },
5313
5330
  elementsMap,
5314
5331
  [
5315
- pointFrom6(0, 0),
5316
- pointFrom6(
5332
+ pointFrom7(0, 0),
5333
+ pointFrom7(
5317
5334
  arrow.x + (nextSegment?.start[0] ?? arrow.points[arrow.points.length - 1][0]) - x,
5318
5335
  arrow.y + (nextSegment?.start[1] ?? arrow.points[arrow.points.length - 1][1]) - y
5319
5336
  )
@@ -5338,11 +5355,16 @@ var handleSegmentRelease = (arrow, fixedSegments, elementsMap) => {
5338
5355
  null,
5339
5356
  null
5340
5357
  );
5358
+ if (!restoredPoints || restoredPoints.length < 2) {
5359
+ throw new Error(
5360
+ "Property 'points' is required in the update returned by normalizeArrowElementUpdate()"
5361
+ );
5362
+ }
5341
5363
  const nextPoints = [];
5342
5364
  if (prevSegment) {
5343
5365
  for (let i = 0; i < prevSegment.index; i++) {
5344
5366
  nextPoints.push(
5345
- pointFrom6(
5367
+ pointFrom7(
5346
5368
  arrow.x + arrow.points[i][0],
5347
5369
  arrow.y + arrow.points[i][1]
5348
5370
  )
@@ -5351,7 +5373,7 @@ var handleSegmentRelease = (arrow, fixedSegments, elementsMap) => {
5351
5373
  }
5352
5374
  restoredPoints.forEach((p) => {
5353
5375
  nextPoints.push(
5354
- pointFrom6(
5376
+ pointFrom7(
5355
5377
  arrow.x + (prevSegment ? prevSegment.end[0] : 0) + p[0],
5356
5378
  arrow.y + (prevSegment ? prevSegment.end[1] : 0) + p[1]
5357
5379
  )
@@ -5360,7 +5382,7 @@ var handleSegmentRelease = (arrow, fixedSegments, elementsMap) => {
5360
5382
  if (nextSegment) {
5361
5383
  for (let i = nextSegment.index; i < arrow.points.length; i++) {
5362
5384
  nextPoints.push(
5363
- pointFrom6(
5385
+ pointFrom7(
5364
5386
  arrow.x + arrow.points[i][0],
5365
5387
  arrow.y + arrow.points[i][1]
5366
5388
  )
@@ -5431,7 +5453,7 @@ var handleSegmentMove = (arrow, fixedSegments, startHeading, endHeading, hovered
5431
5453
  const startIsHorizontal = headingIsHorizontal(startHeading);
5432
5454
  const startIsPositive = startIsHorizontal ? compareHeading(startHeading, HEADING_RIGHT) : compareHeading(startHeading, HEADING_DOWN);
5433
5455
  const padding = startIsPositive ? segmentIsTooShort ? segmentLength / 2 : BASE_PADDING : segmentIsTooShort ? -segmentLength / 2 : -BASE_PADDING;
5434
- fixedSegments[activelyModifiedSegmentIdx].start = pointFrom6(
5456
+ fixedSegments[activelyModifiedSegmentIdx].start = pointFrom7(
5435
5457
  fixedSegments[activelyModifiedSegmentIdx].start[0] + (startIsHorizontal ? padding : 0),
5436
5458
  fixedSegments[activelyModifiedSegmentIdx].start[1] + (!startIsHorizontal ? padding : 0)
5437
5459
  );
@@ -5440,24 +5462,24 @@ var handleSegmentMove = (arrow, fixedSegments, startHeading, endHeading, hovered
5440
5462
  const endIsHorizontal = headingIsHorizontal(endHeading);
5441
5463
  const endIsPositive = endIsHorizontal ? compareHeading(endHeading, HEADING_RIGHT) : compareHeading(endHeading, HEADING_DOWN);
5442
5464
  const padding = endIsPositive ? segmentIsTooShort ? segmentLength / 2 : BASE_PADDING : segmentIsTooShort ? -segmentLength / 2 : -BASE_PADDING;
5443
- fixedSegments[activelyModifiedSegmentIdx].end = pointFrom6(
5465
+ fixedSegments[activelyModifiedSegmentIdx].end = pointFrom7(
5444
5466
  fixedSegments[activelyModifiedSegmentIdx].end[0] + (endIsHorizontal ? padding : 0),
5445
5467
  fixedSegments[activelyModifiedSegmentIdx].end[1] + (!endIsHorizontal ? padding : 0)
5446
5468
  );
5447
5469
  }
5448
5470
  const nextFixedSegments = fixedSegments.map((segment) => ({
5449
5471
  ...segment,
5450
- start: pointFrom6(
5472
+ start: pointFrom7(
5451
5473
  arrow.x + segment.start[0],
5452
5474
  arrow.y + segment.start[1]
5453
5475
  ),
5454
- end: pointFrom6(
5476
+ end: pointFrom7(
5455
5477
  arrow.x + segment.end[0],
5456
5478
  arrow.y + segment.end[1]
5457
5479
  )
5458
5480
  }));
5459
5481
  const newPoints = arrow.points.map(
5460
- (p, i) => pointFrom6(arrow.x + p[0], arrow.y + p[1])
5482
+ (p, i) => pointFrom7(arrow.x + p[0], arrow.y + p[1])
5461
5483
  );
5462
5484
  const startIdx = nextFixedSegments[activelyModifiedSegmentIdx].index - 1;
5463
5485
  const endIdx = nextFixedSegments[activelyModifiedSegmentIdx].index;
@@ -5503,14 +5525,14 @@ var handleSegmentMove = (arrow, fixedSegments, startHeading, endHeading, hovered
5503
5525
  if (firstSegmentIdx === -1 && startIdx === 0) {
5504
5526
  const startIsHorizontal = hoveredStartElement ? headingIsHorizontal(startHeading) : headingForPointIsHorizontal(newPoints[1], newPoints[0]);
5505
5527
  newPoints.unshift(
5506
- pointFrom6(
5528
+ pointFrom7(
5507
5529
  startIsHorizontal ? start[0] : arrow.x + arrow.points[0][0],
5508
5530
  !startIsHorizontal ? start[1] : arrow.y + arrow.points[0][1]
5509
5531
  )
5510
5532
  );
5511
5533
  if (hoveredStartElement) {
5512
5534
  newPoints.unshift(
5513
- pointFrom6(
5535
+ pointFrom7(
5514
5536
  arrow.x + arrow.points[0][0],
5515
5537
  arrow.y + arrow.points[0][1]
5516
5538
  )
@@ -5523,14 +5545,14 @@ var handleSegmentMove = (arrow, fixedSegments, startHeading, endHeading, hovered
5523
5545
  if (lastSegmentIdx === -1 && endIdx === arrow.points.length - 1) {
5524
5546
  const endIsHorizontal = headingIsHorizontal(endHeading);
5525
5547
  newPoints.push(
5526
- pointFrom6(
5548
+ pointFrom7(
5527
5549
  endIsHorizontal ? end[0] : arrow.x + arrow.points[arrow.points.length - 1][0],
5528
5550
  !endIsHorizontal ? end[1] : arrow.y + arrow.points[arrow.points.length - 1][1]
5529
5551
  )
5530
5552
  );
5531
5553
  if (hoveredEndElement) {
5532
5554
  newPoints.push(
5533
- pointFrom6(
5555
+ pointFrom7(
5534
5556
  arrow.x + arrow.points[arrow.points.length - 1][0],
5535
5557
  arrow.y + arrow.points[arrow.points.length - 1][1]
5536
5558
  )
@@ -5541,11 +5563,11 @@ var handleSegmentMove = (arrow, fixedSegments, startHeading, endHeading, hovered
5541
5563
  newPoints,
5542
5564
  nextFixedSegments.map((segment) => ({
5543
5565
  ...segment,
5544
- start: pointFrom6(
5566
+ start: pointFrom7(
5545
5567
  segment.start[0] - arrow.x,
5546
5568
  segment.start[1] - arrow.y
5547
5569
  ),
5548
- end: pointFrom6(
5570
+ end: pointFrom7(
5549
5571
  segment.end[0] - arrow.x,
5550
5572
  segment.end[1] - arrow.y
5551
5573
  )
@@ -5560,18 +5582,18 @@ var handleEndpointDrag = (arrow, updatedPoints, fixedSegments, startHeading, end
5560
5582
  let startIsSpecial = arrow.startIsSpecial ?? null;
5561
5583
  let endIsSpecial = arrow.endIsSpecial ?? null;
5562
5584
  const globalUpdatedPoints = updatedPoints.map(
5563
- (p, i) => i === 0 ? pointFrom6(arrow.x + p[0], arrow.y + p[1]) : i === updatedPoints.length - 1 ? pointFrom6(arrow.x + p[0], arrow.y + p[1]) : pointFrom6(
5585
+ (p, i) => i === 0 ? pointFrom7(arrow.x + p[0], arrow.y + p[1]) : i === updatedPoints.length - 1 ? pointFrom7(arrow.x + p[0], arrow.y + p[1]) : pointFrom7(
5564
5586
  arrow.x + arrow.points[i][0],
5565
5587
  arrow.y + arrow.points[i][1]
5566
5588
  )
5567
5589
  );
5568
5590
  const nextFixedSegments = fixedSegments.map((segment) => ({
5569
5591
  ...segment,
5570
- start: pointFrom6(
5592
+ start: pointFrom7(
5571
5593
  arrow.x + (segment.start[0] - updatedPoints[0][0]),
5572
5594
  arrow.y + (segment.start[1] - updatedPoints[0][1])
5573
5595
  ),
5574
- end: pointFrom6(
5596
+ end: pointFrom7(
5575
5597
  arrow.x + (segment.end[0] - updatedPoints[0][0]),
5576
5598
  arrow.y + (segment.end[1] - updatedPoints[0][1])
5577
5599
  )
@@ -5583,8 +5605,13 @@ var handleEndpointDrag = (arrow, updatedPoints, fixedSegments, startHeading, end
5583
5605
  newPoints.push(globalUpdatedPoints[newPoints.length + offset]);
5584
5606
  }
5585
5607
  {
5586
- const secondPoint = globalUpdatedPoints[startIsSpecial ? 2 : 1];
5587
- const thirdPoint = globalUpdatedPoints[startIsSpecial ? 3 : 2];
5608
+ const secondPoint = globalUpdatedPoints.at(startIsSpecial ? 2 : 1);
5609
+ const thirdPoint = globalUpdatedPoints.at(startIsSpecial ? 3 : 2);
5610
+ if (!secondPoint || !thirdPoint) {
5611
+ throw new Error(
5612
+ `Second and third points must exist when handling endpoint drag (${startIsSpecial})`
5613
+ );
5614
+ }
5588
5615
  const startIsHorizontal = headingIsHorizontal(startHeading);
5589
5616
  const secondIsHorizontal = headingIsHorizontal(
5590
5617
  vectorToHeading(vectorFromPoint5(secondPoint, thirdPoint))
@@ -5592,13 +5619,13 @@ var handleEndpointDrag = (arrow, updatedPoints, fixedSegments, startHeading, end
5592
5619
  if (hoveredStartElement && startIsHorizontal === secondIsHorizontal) {
5593
5620
  const positive = startIsHorizontal ? compareHeading(startHeading, HEADING_RIGHT) : compareHeading(startHeading, HEADING_DOWN);
5594
5621
  newPoints.unshift(
5595
- pointFrom6(
5622
+ pointFrom7(
5596
5623
  !secondIsHorizontal ? thirdPoint[0] : startGlobalPoint[0] + (positive ? BASE_PADDING : -BASE_PADDING),
5597
5624
  secondIsHorizontal ? thirdPoint[1] : startGlobalPoint[1] + (positive ? BASE_PADDING : -BASE_PADDING)
5598
5625
  )
5599
5626
  );
5600
5627
  newPoints.unshift(
5601
- pointFrom6(
5628
+ pointFrom7(
5602
5629
  startIsHorizontal ? startGlobalPoint[0] + (positive ? BASE_PADDING : -BASE_PADDING) : startGlobalPoint[0],
5603
5630
  !startIsHorizontal ? startGlobalPoint[1] + (positive ? BASE_PADDING : -BASE_PADDING) : startGlobalPoint[1]
5604
5631
  )
@@ -5613,7 +5640,7 @@ var handleEndpointDrag = (arrow, updatedPoints, fixedSegments, startHeading, end
5613
5640
  }
5614
5641
  } else {
5615
5642
  newPoints.unshift(
5616
- pointFrom6(
5643
+ pointFrom7(
5617
5644
  !secondIsHorizontal ? secondPoint[0] : startGlobalPoint[0],
5618
5645
  secondIsHorizontal ? secondPoint[1] : startGlobalPoint[1]
5619
5646
  )
@@ -5630,8 +5657,17 @@ var handleEndpointDrag = (arrow, updatedPoints, fixedSegments, startHeading, end
5630
5657
  newPoints.unshift(startGlobalPoint);
5631
5658
  }
5632
5659
  {
5633
- const secondToLastPoint = globalUpdatedPoints[globalUpdatedPoints.length - (endIsSpecial ? 3 : 2)];
5634
- const thirdToLastPoint = globalUpdatedPoints[globalUpdatedPoints.length - (endIsSpecial ? 4 : 3)];
5660
+ const secondToLastPoint = globalUpdatedPoints.at(
5661
+ globalUpdatedPoints.length - (endIsSpecial ? 3 : 2)
5662
+ );
5663
+ const thirdToLastPoint = globalUpdatedPoints.at(
5664
+ globalUpdatedPoints.length - (endIsSpecial ? 4 : 3)
5665
+ );
5666
+ if (!secondToLastPoint || !thirdToLastPoint) {
5667
+ throw new Error(
5668
+ `Second and third to last points must exist when handling endpoint drag (${endIsSpecial})`
5669
+ );
5670
+ }
5635
5671
  const endIsHorizontal = headingIsHorizontal(endHeading);
5636
5672
  const secondIsHorizontal = headingForPointIsHorizontal(
5637
5673
  thirdToLastPoint,
@@ -5640,13 +5676,13 @@ var handleEndpointDrag = (arrow, updatedPoints, fixedSegments, startHeading, end
5640
5676
  if (hoveredEndElement && endIsHorizontal === secondIsHorizontal) {
5641
5677
  const positive = endIsHorizontal ? compareHeading(endHeading, HEADING_RIGHT) : compareHeading(endHeading, HEADING_DOWN);
5642
5678
  newPoints.push(
5643
- pointFrom6(
5679
+ pointFrom7(
5644
5680
  !secondIsHorizontal ? thirdToLastPoint[0] : endGlobalPoint[0] + (positive ? BASE_PADDING : -BASE_PADDING),
5645
5681
  secondIsHorizontal ? thirdToLastPoint[1] : endGlobalPoint[1] + (positive ? BASE_PADDING : -BASE_PADDING)
5646
5682
  )
5647
5683
  );
5648
5684
  newPoints.push(
5649
- pointFrom6(
5685
+ pointFrom7(
5650
5686
  endIsHorizontal ? endGlobalPoint[0] + (positive ? BASE_PADDING : -BASE_PADDING) : endGlobalPoint[0],
5651
5687
  !endIsHorizontal ? endGlobalPoint[1] + (positive ? BASE_PADDING : -BASE_PADDING) : endGlobalPoint[1]
5652
5688
  )
@@ -5656,7 +5692,7 @@ var handleEndpointDrag = (arrow, updatedPoints, fixedSegments, startHeading, end
5656
5692
  }
5657
5693
  } else {
5658
5694
  newPoints.push(
5659
- pointFrom6(
5695
+ pointFrom7(
5660
5696
  !secondIsHorizontal ? secondToLastPoint[0] : endGlobalPoint[0],
5661
5697
  secondIsHorizontal ? secondToLastPoint[1] : endGlobalPoint[1]
5662
5698
  )
@@ -5675,11 +5711,11 @@ var handleEndpointDrag = (arrow, updatedPoints, fixedSegments, startHeading, end
5675
5711
  end: newPoints[index]
5676
5712
  })).map((segment) => ({
5677
5713
  ...segment,
5678
- start: pointFrom6(
5714
+ start: pointFrom7(
5679
5715
  segment.start[0] - startGlobalPoint[0],
5680
5716
  segment.start[1] - startGlobalPoint[1]
5681
5717
  ),
5682
- end: pointFrom6(
5718
+ end: pointFrom7(
5683
5719
  segment.end[0] - startGlobalPoint[0],
5684
5720
  segment.end[1] - startGlobalPoint[1]
5685
5721
  )
@@ -5741,7 +5777,7 @@ var updateElbowArrowPoints = (arrow, elementsMap, updates, options) => {
5741
5777
  if (startBinding && !startElement && areUpdatedPointsValid || endBinding && !endElement && areUpdatedPointsValid || elementsMap.size === 0 && areUpdatedPointsValid || Object.keys(restOfTheUpdates).length === 0 && (startElement?.id !== startBinding?.elementId || endElement?.id !== endBinding?.elementId)) {
5742
5778
  return normalizeArrowElementUpdate(
5743
5779
  updatedPoints.map(
5744
- (p) => pointFrom6(arrow.x + p[0], arrow.y + p[1])
5780
+ (p) => pointFrom7(arrow.x + p[0], arrow.y + p[1])
5745
5781
  ),
5746
5782
  arrow.fixedSegments,
5747
5783
  arrow.startIsSpecial,
@@ -5773,7 +5809,7 @@ var updateElbowArrowPoints = (arrow, elementsMap, updates, options) => {
5773
5809
  if (elementsMap.size === 0 && areUpdatedPointsValid) {
5774
5810
  return normalizeArrowElementUpdate(
5775
5811
  updatedPoints.map(
5776
- (p) => pointFrom6(arrow.x + p[0], arrow.y + p[1])
5812
+ (p) => pointFrom7(arrow.x + p[0], arrow.y + p[1])
5777
5813
  ),
5778
5814
  arrow.fixedSegments,
5779
5815
  arrow.startIsSpecial,
@@ -5786,7 +5822,7 @@ var updateElbowArrowPoints = (arrow, elementsMap, updates, options) => {
5786
5822
  if (updates.startBinding === arrow.startBinding && updates.endBinding === arrow.endBinding && (updates.points ?? []).every(
5787
5823
  (p, i) => pointsEqual4(
5788
5824
  p,
5789
- arrow.points[i] ?? pointFrom6(Infinity, Infinity)
5825
+ arrow.points[i] ?? pointFrom7(Infinity, Infinity)
5790
5826
  )
5791
5827
  ) && areUpdatedPointsValid) {
5792
5828
  return {};
@@ -6280,13 +6316,13 @@ var calculateGrid = (aabbs, start, startHeading, end, endHeading, common) => {
6280
6316
  var getDonglePosition = (bounds, heading, p) => {
6281
6317
  switch (heading) {
6282
6318
  case HEADING_UP:
6283
- return pointFrom6(p[0], bounds[1]);
6319
+ return pointFrom7(p[0], bounds[1]);
6284
6320
  case HEADING_RIGHT:
6285
- return pointFrom6(bounds[2], p[1]);
6321
+ return pointFrom7(bounds[2], p[1]);
6286
6322
  case HEADING_DOWN:
6287
- return pointFrom6(p[0], bounds[3]);
6323
+ return pointFrom7(p[0], bounds[3]);
6288
6324
  }
6289
- return pointFrom6(bounds[0], p[1]);
6325
+ return pointFrom7(bounds[0], p[1]);
6290
6326
  };
6291
6327
  var estimateSegmentCount = (start, end, startHeading, endHeading) => {
6292
6328
  if (endHeading === HEADING_RIGHT) {
@@ -6454,7 +6490,7 @@ var normalizeArrowElementUpdate = (global2, nextFixedSegments, startIsSpecial, e
6454
6490
  );
6455
6491
  }
6456
6492
  points = points.map(
6457
- ([x, y]) => pointFrom6(clamp2(x, -1e6, 1e6), clamp2(y, -1e6, 1e6))
6493
+ ([x, y]) => pointFrom7(clamp2(x, -1e6, 1e6), clamp2(y, -1e6, 1e6))
6458
6494
  );
6459
6495
  return {
6460
6496
  points,
@@ -7192,7 +7228,7 @@ var bindPointToSnapToElementOutline = (arrow, bindableElement, startOrEnd, eleme
7192
7228
  }
7193
7229
  const aabb = aabbForElement(bindableElement, elementsMap);
7194
7230
  const localP = arrow.points[startOrEnd === "start" ? 0 : arrow.points.length - 1];
7195
- const globalP = pointFrom7(
7231
+ const globalP = pointFrom8(
7196
7232
  arrow.x + localP[0],
7197
7233
  arrow.y + localP[1]
7198
7234
  );
@@ -7200,8 +7236,8 @@ var bindPointToSnapToElementOutline = (arrow, bindableElement, startOrEnd, eleme
7200
7236
  const elbowed = isElbowArrow(arrow);
7201
7237
  const center = getCenterForBounds(aabb);
7202
7238
  const adjacentPointIdx = startOrEnd === "start" ? 1 : arrow.points.length - 2;
7203
- const adjacentPoint = pointRotateRads6(
7204
- pointFrom7(
7239
+ const adjacentPoint = pointRotateRads7(
7240
+ pointFrom8(
7205
7241
  arrow.x + arrow.points[adjacentPointIdx][0],
7206
7242
  arrow.y + arrow.points[adjacentPointIdx][1]
7207
7243
  ),
@@ -7214,7 +7250,7 @@ var bindPointToSnapToElementOutline = (arrow, bindableElement, startOrEnd, eleme
7214
7250
  headingForPointFromElement(bindableElement, aabb, globalP)
7215
7251
  );
7216
7252
  const snapPoint = snapToMid(bindableElement, elementsMap, edgePoint);
7217
- const otherPoint = pointFrom7(
7253
+ const otherPoint = pointFrom8(
7218
7254
  isHorizontal ? center[0] : snapPoint[0],
7219
7255
  !isHorizontal ? center[1] : snapPoint[1]
7220
7256
  );
@@ -7261,24 +7297,24 @@ var bindPointToSnapToElementOutline = (arrow, bindableElement, startOrEnd, eleme
7261
7297
  };
7262
7298
  var avoidRectangularCorner = (element, elementsMap, p) => {
7263
7299
  const center = elementCenterPoint(element, elementsMap);
7264
- const nonRotatedPoint = pointRotateRads6(p, center, -element.angle);
7300
+ const nonRotatedPoint = pointRotateRads7(p, center, -element.angle);
7265
7301
  if (nonRotatedPoint[0] < element.x && nonRotatedPoint[1] < element.y) {
7266
7302
  if (nonRotatedPoint[1] - element.y > -FIXED_BINDING_DISTANCE) {
7267
- return pointRotateRads6(
7268
- pointFrom7(element.x - FIXED_BINDING_DISTANCE, element.y),
7303
+ return pointRotateRads7(
7304
+ pointFrom8(element.x - FIXED_BINDING_DISTANCE, element.y),
7269
7305
  center,
7270
7306
  element.angle
7271
7307
  );
7272
7308
  }
7273
- return pointRotateRads6(
7274
- pointFrom7(element.x, element.y - FIXED_BINDING_DISTANCE),
7309
+ return pointRotateRads7(
7310
+ pointFrom8(element.x, element.y - FIXED_BINDING_DISTANCE),
7275
7311
  center,
7276
7312
  element.angle
7277
7313
  );
7278
7314
  } else if (nonRotatedPoint[0] < element.x && nonRotatedPoint[1] > element.y + element.height) {
7279
7315
  if (nonRotatedPoint[0] - element.x > -FIXED_BINDING_DISTANCE) {
7280
- return pointRotateRads6(
7281
- pointFrom7(
7316
+ return pointRotateRads7(
7317
+ pointFrom8(
7282
7318
  element.x,
7283
7319
  element.y + element.height + FIXED_BINDING_DISTANCE
7284
7320
  ),
@@ -7286,15 +7322,15 @@ var avoidRectangularCorner = (element, elementsMap, p) => {
7286
7322
  element.angle
7287
7323
  );
7288
7324
  }
7289
- return pointRotateRads6(
7290
- pointFrom7(element.x - FIXED_BINDING_DISTANCE, element.y + element.height),
7325
+ return pointRotateRads7(
7326
+ pointFrom8(element.x - FIXED_BINDING_DISTANCE, element.y + element.height),
7291
7327
  center,
7292
7328
  element.angle
7293
7329
  );
7294
7330
  } else if (nonRotatedPoint[0] > element.x + element.width && nonRotatedPoint[1] > element.y + element.height) {
7295
7331
  if (nonRotatedPoint[0] - element.x < element.width + FIXED_BINDING_DISTANCE) {
7296
- return pointRotateRads6(
7297
- pointFrom7(
7332
+ return pointRotateRads7(
7333
+ pointFrom8(
7298
7334
  element.x + element.width,
7299
7335
  element.y + element.height + FIXED_BINDING_DISTANCE
7300
7336
  ),
@@ -7302,8 +7338,8 @@ var avoidRectangularCorner = (element, elementsMap, p) => {
7302
7338
  element.angle
7303
7339
  );
7304
7340
  }
7305
- return pointRotateRads6(
7306
- pointFrom7(
7341
+ return pointRotateRads7(
7342
+ pointFrom8(
7307
7343
  element.x + element.width + FIXED_BINDING_DISTANCE,
7308
7344
  element.y + element.height
7309
7345
  ),
@@ -7312,8 +7348,8 @@ var avoidRectangularCorner = (element, elementsMap, p) => {
7312
7348
  );
7313
7349
  } else if (nonRotatedPoint[0] > element.x + element.width && nonRotatedPoint[1] < element.y) {
7314
7350
  if (nonRotatedPoint[0] - element.x < element.width + FIXED_BINDING_DISTANCE) {
7315
- return pointRotateRads6(
7316
- pointFrom7(
7351
+ return pointRotateRads7(
7352
+ pointFrom8(
7317
7353
  element.x + element.width,
7318
7354
  element.y - FIXED_BINDING_DISTANCE
7319
7355
  ),
@@ -7321,8 +7357,8 @@ var avoidRectangularCorner = (element, elementsMap, p) => {
7321
7357
  element.angle
7322
7358
  );
7323
7359
  }
7324
- return pointRotateRads6(
7325
- pointFrom7(element.x + element.width + FIXED_BINDING_DISTANCE, element.y),
7360
+ return pointRotateRads7(
7361
+ pointFrom8(element.x + element.width + FIXED_BINDING_DISTANCE, element.y),
7326
7362
  center,
7327
7363
  element.angle
7328
7364
  );
@@ -7332,62 +7368,62 @@ var avoidRectangularCorner = (element, elementsMap, p) => {
7332
7368
  var snapToMid = (element, elementsMap, p, tolerance = 0.05) => {
7333
7369
  const { x, y, width, height, angle } = element;
7334
7370
  const center = elementCenterPoint(element, elementsMap, -0.1, -0.1);
7335
- const nonRotated = pointRotateRads6(p, center, -angle);
7371
+ const nonRotated = pointRotateRads7(p, center, -angle);
7336
7372
  const verticalThreshold = clamp3(tolerance * height, 5, 80);
7337
7373
  const horizontalThreshold = clamp3(tolerance * width, 5, 80);
7338
7374
  if (nonRotated[0] <= x + width / 2 && nonRotated[1] > center[1] - verticalThreshold && nonRotated[1] < center[1] + verticalThreshold) {
7339
- return pointRotateRads6(
7340
- pointFrom7(x - FIXED_BINDING_DISTANCE, center[1]),
7375
+ return pointRotateRads7(
7376
+ pointFrom8(x - FIXED_BINDING_DISTANCE, center[1]),
7341
7377
  center,
7342
7378
  angle
7343
7379
  );
7344
7380
  } else if (nonRotated[1] <= y + height / 2 && nonRotated[0] > center[0] - horizontalThreshold && nonRotated[0] < center[0] + horizontalThreshold) {
7345
- return pointRotateRads6(
7346
- pointFrom7(center[0], y - FIXED_BINDING_DISTANCE),
7381
+ return pointRotateRads7(
7382
+ pointFrom8(center[0], y - FIXED_BINDING_DISTANCE),
7347
7383
  center,
7348
7384
  angle
7349
7385
  );
7350
7386
  } else if (nonRotated[0] >= x + width / 2 && nonRotated[1] > center[1] - verticalThreshold && nonRotated[1] < center[1] + verticalThreshold) {
7351
- return pointRotateRads6(
7352
- pointFrom7(x + width + FIXED_BINDING_DISTANCE, center[1]),
7387
+ return pointRotateRads7(
7388
+ pointFrom8(x + width + FIXED_BINDING_DISTANCE, center[1]),
7353
7389
  center,
7354
7390
  angle
7355
7391
  );
7356
7392
  } else if (nonRotated[1] >= y + height / 2 && nonRotated[0] > center[0] - horizontalThreshold && nonRotated[0] < center[0] + horizontalThreshold) {
7357
- return pointRotateRads6(
7358
- pointFrom7(center[0], y + height + FIXED_BINDING_DISTANCE),
7393
+ return pointRotateRads7(
7394
+ pointFrom8(center[0], y + height + FIXED_BINDING_DISTANCE),
7359
7395
  center,
7360
7396
  angle
7361
7397
  );
7362
7398
  } else if (element.type === "diamond") {
7363
7399
  const distance3 = FIXED_BINDING_DISTANCE;
7364
- const topLeft = pointFrom7(
7400
+ const topLeft = pointFrom8(
7365
7401
  x + width / 4 - distance3,
7366
7402
  y + height / 4 - distance3
7367
7403
  );
7368
- const topRight = pointFrom7(
7404
+ const topRight = pointFrom8(
7369
7405
  x + 3 * width / 4 + distance3,
7370
7406
  y + height / 4 - distance3
7371
7407
  );
7372
- const bottomLeft = pointFrom7(
7408
+ const bottomLeft = pointFrom8(
7373
7409
  x + width / 4 - distance3,
7374
7410
  y + 3 * height / 4 + distance3
7375
7411
  );
7376
- const bottomRight = pointFrom7(
7412
+ const bottomRight = pointFrom8(
7377
7413
  x + 3 * width / 4 + distance3,
7378
7414
  y + 3 * height / 4 + distance3
7379
7415
  );
7380
7416
  if (pointDistance4(topLeft, nonRotated) < Math.max(horizontalThreshold, verticalThreshold)) {
7381
- return pointRotateRads6(topLeft, center, angle);
7417
+ return pointRotateRads7(topLeft, center, angle);
7382
7418
  }
7383
7419
  if (pointDistance4(topRight, nonRotated) < Math.max(horizontalThreshold, verticalThreshold)) {
7384
- return pointRotateRads6(topRight, center, angle);
7420
+ return pointRotateRads7(topRight, center, angle);
7385
7421
  }
7386
7422
  if (pointDistance4(bottomLeft, nonRotated) < Math.max(horizontalThreshold, verticalThreshold)) {
7387
- return pointRotateRads6(bottomLeft, center, angle);
7423
+ return pointRotateRads7(bottomLeft, center, angle);
7388
7424
  }
7389
7425
  if (pointDistance4(bottomRight, nonRotated) < Math.max(horizontalThreshold, verticalThreshold)) {
7390
- return pointRotateRads6(bottomRight, center, angle);
7426
+ return pointRotateRads7(bottomRight, center, angle);
7391
7427
  }
7392
7428
  }
7393
7429
  return p;
@@ -7407,11 +7443,11 @@ var updateBoundPoint = (linearElement, startOrEnd, binding, bindableElement, ele
7407
7443
  elementsMap
7408
7444
  ).fixedPoint;
7409
7445
  const globalMidPoint = elementCenterPoint(bindableElement, elementsMap);
7410
- const global2 = pointFrom7(
7446
+ const global2 = pointFrom8(
7411
7447
  bindableElement.x + fixedPoint[0] * bindableElement.width,
7412
7448
  bindableElement.y + fixedPoint[1] * bindableElement.height
7413
7449
  );
7414
- const rotatedGlobal = pointRotateRads6(
7450
+ const rotatedGlobal = pointRotateRads7(
7415
7451
  global2,
7416
7452
  globalMidPoint,
7417
7453
  bindableElement.angle
@@ -7501,11 +7537,11 @@ var calculateFixedPointForElbowArrowBinding = (linearElement, hoveredElement, st
7501
7537
  startOrEnd,
7502
7538
  elementsMap
7503
7539
  );
7504
- const globalMidPoint = pointFrom7(
7540
+ const globalMidPoint = pointFrom8(
7505
7541
  bounds[0] + (bounds[2] - bounds[0]) / 2,
7506
7542
  bounds[1] + (bounds[3] - bounds[1]) / 2
7507
7543
  );
7508
- const nonRotatedSnappedGlobalPoint = pointRotateRads6(
7544
+ const nonRotatedSnappedGlobalPoint = pointRotateRads7(
7509
7545
  snappedPoint,
7510
7546
  globalMidPoint,
7511
7547
  -hoveredElement.angle
@@ -7638,7 +7674,7 @@ var newBoundElements = (boundElements, idsToRemove, elementsToAdd = []) => {
7638
7674
  return nextBoundElements;
7639
7675
  };
7640
7676
  var bindingBorderTest = (element, { x, y }, elementsMap, zoom, fullShape) => {
7641
- const p = pointFrom7(x, y);
7677
+ const p = pointFrom8(x, y);
7642
7678
  const threshold = maxBindingGap(element, element.width, element.height, zoom);
7643
7679
  const shouldTestInside2 = (
7644
7680
  // disable fullshape snapping for frame elements so we
@@ -7680,8 +7716,8 @@ var determineFocusDistance = (element, elementsMap, a2, b2) => {
7680
7716
  if (pointsEqual5(a2, b2)) {
7681
7717
  return 0;
7682
7718
  }
7683
- const rotatedA = pointRotateRads6(a2, center, -element.angle);
7684
- const rotatedB = pointRotateRads6(b2, center, -element.angle);
7719
+ const rotatedA = pointRotateRads7(a2, center, -element.angle);
7720
+ const rotatedB = pointRotateRads7(b2, center, -element.angle);
7685
7721
  const sign = Math.sign(
7686
7722
  vectorCross3(
7687
7723
  vectorFromPoint6(rotatedB, a2),
@@ -7700,70 +7736,70 @@ var determineFocusDistance = (element, elementsMap, a2, b2) => {
7700
7736
  );
7701
7737
  const axes = element.type === "diamond" ? [
7702
7738
  lineSegment4(
7703
- pointFrom7(element.x + element.width / 2, element.y),
7704
- pointFrom7(
7739
+ pointFrom8(element.x + element.width / 2, element.y),
7740
+ pointFrom8(
7705
7741
  element.x + element.width / 2,
7706
7742
  element.y + element.height
7707
7743
  )
7708
7744
  ),
7709
7745
  lineSegment4(
7710
- pointFrom7(element.x, element.y + element.height / 2),
7711
- pointFrom7(
7746
+ pointFrom8(element.x, element.y + element.height / 2),
7747
+ pointFrom8(
7712
7748
  element.x + element.width,
7713
7749
  element.y + element.height / 2
7714
7750
  )
7715
7751
  )
7716
7752
  ] : [
7717
7753
  lineSegment4(
7718
- pointFrom7(element.x, element.y),
7719
- pointFrom7(
7754
+ pointFrom8(element.x, element.y),
7755
+ pointFrom8(
7720
7756
  element.x + element.width,
7721
7757
  element.y + element.height
7722
7758
  )
7723
7759
  ),
7724
7760
  lineSegment4(
7725
- pointFrom7(element.x + element.width, element.y),
7726
- pointFrom7(element.x, element.y + element.height)
7761
+ pointFrom8(element.x + element.width, element.y),
7762
+ pointFrom8(element.x, element.y + element.height)
7727
7763
  )
7728
7764
  ];
7729
7765
  const interceptees = element.type === "diamond" ? [
7730
7766
  lineSegment4(
7731
- pointFrom7(
7767
+ pointFrom8(
7732
7768
  element.x + element.width / 2,
7733
7769
  element.y - element.height
7734
7770
  ),
7735
- pointFrom7(
7771
+ pointFrom8(
7736
7772
  element.x + element.width / 2,
7737
7773
  element.y + element.height * 2
7738
7774
  )
7739
7775
  ),
7740
7776
  lineSegment4(
7741
- pointFrom7(
7777
+ pointFrom8(
7742
7778
  element.x - element.width,
7743
7779
  element.y + element.height / 2
7744
7780
  ),
7745
- pointFrom7(
7781
+ pointFrom8(
7746
7782
  element.x + element.width * 2,
7747
7783
  element.y + element.height / 2
7748
7784
  )
7749
7785
  )
7750
7786
  ] : [
7751
7787
  lineSegment4(
7752
- pointFrom7(
7788
+ pointFrom8(
7753
7789
  element.x - element.width,
7754
7790
  element.y - element.height
7755
7791
  ),
7756
- pointFrom7(
7792
+ pointFrom8(
7757
7793
  element.x + element.width * 2,
7758
7794
  element.y + element.height * 2
7759
7795
  )
7760
7796
  ),
7761
7797
  lineSegment4(
7762
- pointFrom7(
7798
+ pointFrom8(
7763
7799
  element.x + element.width * 2,
7764
7800
  element.y - element.height
7765
7801
  ),
7766
- pointFrom7(
7802
+ pointFrom8(
7767
7803
  element.x - element.width,
7768
7804
  element.y + element.height * 2
7769
7805
  )
@@ -7784,30 +7820,30 @@ var determineFocusPoint = (element, elementsMap, focus, adjacentPoint) => {
7784
7820
  return center;
7785
7821
  }
7786
7822
  const candidates = (element.type === "diamond" ? [
7787
- pointFrom7(element.x, element.y + element.height / 2),
7788
- pointFrom7(element.x + element.width / 2, element.y),
7789
- pointFrom7(
7823
+ pointFrom8(element.x, element.y + element.height / 2),
7824
+ pointFrom8(element.x + element.width / 2, element.y),
7825
+ pointFrom8(
7790
7826
  element.x + element.width,
7791
7827
  element.y + element.height / 2
7792
7828
  ),
7793
- pointFrom7(
7829
+ pointFrom8(
7794
7830
  element.x + element.width / 2,
7795
7831
  element.y + element.height
7796
7832
  )
7797
7833
  ] : [
7798
- pointFrom7(element.x, element.y),
7799
- pointFrom7(element.x + element.width, element.y),
7800
- pointFrom7(
7834
+ pointFrom8(element.x, element.y),
7835
+ pointFrom8(element.x + element.width, element.y),
7836
+ pointFrom8(
7801
7837
  element.x + element.width,
7802
7838
  element.y + element.height
7803
7839
  ),
7804
- pointFrom7(element.x, element.y + element.height)
7840
+ pointFrom8(element.x, element.y + element.height)
7805
7841
  ]).map(
7806
7842
  (p) => pointFromVector5(
7807
7843
  vectorScale6(vectorFromPoint6(p, center), Math.abs(focus)),
7808
7844
  center
7809
7845
  )
7810
- ).map((p) => pointRotateRads6(p, center, element.angle));
7846
+ ).map((p) => pointRotateRads7(p, center, element.angle));
7811
7847
  const selected = [
7812
7848
  vectorCross3(
7813
7849
  vectorFromPoint6(adjacentPoint, candidates[0]),
@@ -8052,8 +8088,8 @@ var BindableElement = class {
8052
8088
  };
8053
8089
  var getGlobalFixedPointForBindableElement = (fixedPointRatio, element, elementsMap) => {
8054
8090
  const [fixedX, fixedY] = normalizeFixedPoint(fixedPointRatio);
8055
- return pointRotateRads6(
8056
- pointFrom7(
8091
+ return pointRotateRads7(
8092
+ pointFrom8(
8057
8093
  element.x + element.width * fixedX,
8058
8094
  element.y + element.height * fixedY
8059
8095
  ),
@@ -8068,7 +8104,7 @@ var getGlobalFixedPoints = (arrow, elementsMap) => {
8068
8104
  arrow.startBinding.fixedPoint,
8069
8105
  startElement,
8070
8106
  elementsMap
8071
- ) : pointFrom7(
8107
+ ) : pointFrom8(
8072
8108
  arrow.x + arrow.points[0][0],
8073
8109
  arrow.y + arrow.points[0][1]
8074
8110
  );
@@ -8076,7 +8112,7 @@ var getGlobalFixedPoints = (arrow, elementsMap) => {
8076
8112
  arrow.endBinding.fixedPoint,
8077
8113
  endElement,
8078
8114
  elementsMap
8079
- ) : pointFrom7(
8115
+ ) : pointFrom8(
8080
8116
  arrow.x + arrow.points[arrow.points.length - 1][0],
8081
8117
  arrow.y + arrow.points[arrow.points.length - 1][1]
8082
8118
  );
@@ -8106,7 +8142,7 @@ var getNormalizedPoints = ({
8106
8142
  const offsetY = points[0][1];
8107
8143
  return {
8108
8144
  points: points.map((p) => {
8109
- return pointFrom8(p[0] - offsetX, p[1] - offsetY);
8145
+ return pointFrom9(p[0] - offsetX, p[1] - offsetY);
8110
8146
  }),
8111
8147
  offsetX,
8112
8148
  offsetY
@@ -8130,7 +8166,7 @@ var LinearElementEditor = class _LinearElementEditor {
8130
8166
  isEditing;
8131
8167
  constructor(element, elementsMap, isEditing = false) {
8132
8168
  this.elementId = element.id;
8133
- if (!pointsEqual6(element.points[0], pointFrom8(0, 0))) {
8169
+ if (!pointsEqual6(element.points[0], pointFrom9(0, 0))) {
8134
8170
  console.error("Linear element is not normalized", Error().stack);
8135
8171
  mutateElement(
8136
8172
  element,
@@ -8244,7 +8280,7 @@ var LinearElementEditor = class _LinearElementEditor {
8244
8280
  element,
8245
8281
  elementsMap,
8246
8282
  referencePoint,
8247
- pointFrom8(scenePointerX, scenePointerY),
8283
+ pointFrom9(scenePointerX, scenePointerY),
8248
8284
  event[KEYS2.CTRL_OR_CMD] ? null : app.getEffectiveGridSize(),
8249
8285
  customLineAngle
8250
8286
  );
@@ -8255,7 +8291,7 @@ var LinearElementEditor = class _LinearElementEditor {
8255
8291
  [
8256
8292
  selectedIndex,
8257
8293
  {
8258
- point: pointFrom8(
8294
+ point: pointFrom9(
8259
8295
  width + referencePoint[0],
8260
8296
  height + referencePoint[1]
8261
8297
  ),
@@ -8285,7 +8321,7 @@ var LinearElementEditor = class _LinearElementEditor {
8285
8321
  scenePointerX - linearElementEditor.pointerOffset.x,
8286
8322
  scenePointerY - linearElementEditor.pointerOffset.y,
8287
8323
  event[KEYS2.CTRL_OR_CMD] ? null : app.getEffectiveGridSize()
8288
- ) : pointFrom8(
8324
+ ) : pointFrom9(
8289
8325
  element.points[pointIndex][0] + deltaX,
8290
8326
  element.points[pointIndex][1] + deltaY
8291
8327
  );
@@ -8498,11 +8534,11 @@ var LinearElementEditor = class _LinearElementEditor {
8498
8534
  const existingSegmentMidpointHitCoords = linearElementEditor.segmentMidPointHoveredCoords;
8499
8535
  if (existingSegmentMidpointHitCoords) {
8500
8536
  const distance3 = pointDistance5(
8501
- pointFrom8(
8537
+ pointFrom9(
8502
8538
  existingSegmentMidpointHitCoords[0],
8503
8539
  existingSegmentMidpointHitCoords[1]
8504
8540
  ),
8505
- pointFrom8(scenePointer.x, scenePointer.y)
8541
+ pointFrom9(scenePointer.x, scenePointer.y)
8506
8542
  );
8507
8543
  if (distance3 <= threshold) {
8508
8544
  return existingSegmentMidpointHitCoords;
@@ -8518,7 +8554,7 @@ var LinearElementEditor = class _LinearElementEditor {
8518
8554
  if (midPoints[index] !== null) {
8519
8555
  const distance3 = pointDistance5(
8520
8556
  midPoints[index],
8521
- pointFrom8(scenePointer.x, scenePointer.y)
8557
+ pointFrom9(scenePointer.x, scenePointer.y)
8522
8558
  );
8523
8559
  if (distance3 <= threshold) {
8524
8560
  return midPoints[index];
@@ -8557,7 +8593,7 @@ var LinearElementEditor = class _LinearElementEditor {
8557
8593
  "Invalid segment index while calculating elbow arrow mid point"
8558
8594
  );
8559
8595
  const p = pointCenter2(element.points[index - 1], element.points[index]);
8560
- return pointFrom8(element.x + p[0], element.y + p[1]);
8596
+ return pointFrom9(element.x + p[0], element.y + p[1]);
8561
8597
  }
8562
8598
  const [lines, curves] = deconstructLinearOrFreeDrawElement2(element);
8563
8599
  invariant6(
@@ -8697,12 +8733,12 @@ var LinearElementEditor = class _LinearElementEditor {
8697
8733
  const [x1, y1, x2, y2] = getElementAbsoluteCoords2(element, elementsMap);
8698
8734
  const cx = (x1 + x2) / 2;
8699
8735
  const cy = (y1 + y2) / 2;
8700
- const targetPoint = clickedPointIndex > -1 && pointRotateRads7(
8701
- pointFrom8(
8736
+ const targetPoint = clickedPointIndex > -1 && pointRotateRads8(
8737
+ pointFrom9(
8702
8738
  element.x + element.points[clickedPointIndex][0],
8703
8739
  element.y + element.points[clickedPointIndex][1]
8704
8740
  ),
8705
- pointFrom8(cx, cy),
8741
+ pointFrom9(cx, cy),
8706
8742
  element.angle
8707
8743
  );
8708
8744
  const nextSelectedPointsIndices = clickedPointIndex > -1 || event.shiftKey ? event.shiftKey || linearElementEditor.selectedPointsIndices?.includes(clickedPointIndex) ? normalizeSelectedPoints([
@@ -8768,10 +8804,10 @@ var LinearElementEditor = class _LinearElementEditor {
8768
8804
  element,
8769
8805
  elementsMap,
8770
8806
  lastCommittedPoint,
8771
- pointFrom8(scenePointerX, scenePointerY),
8807
+ pointFrom9(scenePointerX, scenePointerY),
8772
8808
  event[KEYS2.CTRL_OR_CMD] ? null : app.getEffectiveGridSize()
8773
8809
  );
8774
- newPoint = pointFrom8(
8810
+ newPoint = pointFrom9(
8775
8811
  width + lastCommittedPoint[0],
8776
8812
  height + lastCommittedPoint[1]
8777
8813
  );
@@ -8811,9 +8847,9 @@ var LinearElementEditor = class _LinearElementEditor {
8811
8847
  const cx = (x1 + x2) / 2;
8812
8848
  const cy = (y1 + y2) / 2;
8813
8849
  const { x, y } = element;
8814
- return pointRotateRads7(
8815
- pointFrom8(x + p[0], y + p[1]),
8816
- pointFrom8(cx, cy),
8850
+ return pointRotateRads8(
8851
+ pointFrom9(x + p[0], y + p[1]),
8852
+ pointFrom9(cx, cy),
8817
8853
  element.angle
8818
8854
  );
8819
8855
  }
@@ -8824,9 +8860,9 @@ var LinearElementEditor = class _LinearElementEditor {
8824
8860
  const cy = (y1 + y2) / 2;
8825
8861
  return element.points.map((p) => {
8826
8862
  const { x, y } = element;
8827
- return pointRotateRads7(
8828
- pointFrom8(x + p[0], y + p[1]),
8829
- pointFrom8(cx, cy),
8863
+ return pointRotateRads8(
8864
+ pointFrom9(x + p[0], y + p[1]),
8865
+ pointFrom9(cx, cy),
8830
8866
  element.angle
8831
8867
  );
8832
8868
  });
@@ -8838,15 +8874,15 @@ var LinearElementEditor = class _LinearElementEditor {
8838
8874
  const cy = (y1 + y2) / 2;
8839
8875
  const p = element.points[index];
8840
8876
  const { x, y } = element;
8841
- return p ? pointRotateRads7(
8842
- pointFrom8(x + p[0], y + p[1]),
8843
- pointFrom8(cx, cy),
8877
+ return p ? pointRotateRads8(
8878
+ pointFrom9(x + p[0], y + p[1]),
8879
+ pointFrom9(cx, cy),
8844
8880
  element.angle
8845
- ) : pointRotateRads7(pointFrom8(x, y), pointFrom8(cx, cy), element.angle);
8881
+ ) : pointRotateRads8(pointFrom9(x, y), pointFrom9(cx, cy), element.angle);
8846
8882
  }
8847
8883
  static pointFromAbsoluteCoords(element, absoluteCoords, elementsMap) {
8848
8884
  if (isElbowArrow(element)) {
8849
- return pointFrom8(
8885
+ return pointFrom9(
8850
8886
  absoluteCoords[0] - element.x,
8851
8887
  absoluteCoords[1] - element.y
8852
8888
  );
@@ -8854,12 +8890,12 @@ var LinearElementEditor = class _LinearElementEditor {
8854
8890
  const [x1, y1, x2, y2] = getElementAbsoluteCoords2(element, elementsMap);
8855
8891
  const cx = (x1 + x2) / 2;
8856
8892
  const cy = (y1 + y2) / 2;
8857
- const [x, y] = pointRotateRads7(
8858
- pointFrom8(absoluteCoords[0], absoluteCoords[1]),
8859
- pointFrom8(cx, cy),
8893
+ const [x, y] = pointRotateRads8(
8894
+ pointFrom9(absoluteCoords[0], absoluteCoords[1]),
8895
+ pointFrom9(cx, cy),
8860
8896
  -element.angle
8861
8897
  );
8862
- return pointFrom8(x - element.x, y - element.y);
8898
+ return pointFrom9(x - element.x, y - element.y);
8863
8899
  }
8864
8900
  static getPointIndexUnderCursor(element, elementsMap, zoom, x, y) {
8865
8901
  const pointHandles = _LinearElementEditor.getPointsGlobalCoordinates(
@@ -8869,7 +8905,7 @@ var LinearElementEditor = class _LinearElementEditor {
8869
8905
  let idx = pointHandles.length;
8870
8906
  while (--idx > -1) {
8871
8907
  const p = pointHandles[idx];
8872
- if (pointDistance5(pointFrom8(x, y), pointFrom8(p[0], p[1])) * zoom.value < // +1px to account for outline stroke
8908
+ if (pointDistance5(pointFrom9(x, y), pointFrom9(p[0], p[1])) * zoom.value < // +1px to account for outline stroke
8873
8909
  _LinearElementEditor.POINT_HANDLE_SIZE + 1) {
8874
8910
  return idx;
8875
8911
  }
@@ -8881,12 +8917,12 @@ var LinearElementEditor = class _LinearElementEditor {
8881
8917
  const [x1, y1, x2, y2] = getElementAbsoluteCoords2(element, elementsMap);
8882
8918
  const cx = (x1 + x2) / 2;
8883
8919
  const cy = (y1 + y2) / 2;
8884
- const [rotatedX, rotatedY] = pointRotateRads7(
8885
- pointFrom8(pointerOnGrid[0], pointerOnGrid[1]),
8886
- pointFrom8(cx, cy),
8920
+ const [rotatedX, rotatedY] = pointRotateRads8(
8921
+ pointFrom9(pointerOnGrid[0], pointerOnGrid[1]),
8922
+ pointFrom9(cx, cy),
8887
8923
  -element.angle
8888
8924
  );
8889
- return pointFrom8(rotatedX - element.x, rotatedY - element.y);
8925
+ return pointFrom9(rotatedX - element.x, rotatedY - element.y);
8890
8926
  }
8891
8927
  /**
8892
8928
  * Normalizes line points so that the start point is at [0,0]. This is
@@ -8935,7 +8971,7 @@ var LinearElementEditor = class _LinearElementEditor {
8935
8971
  pointAddedToEnd = true;
8936
8972
  }
8937
8973
  acc.push(
8938
- nextPoint ? pointFrom8((p[0] + nextPoint[0]) / 2, (p[1] + nextPoint[1]) / 2) : pointFrom8(p[0], p[1])
8974
+ nextPoint ? pointFrom9((p[0] + nextPoint[0]) / 2, (p[1] + nextPoint[1]) / 2) : pointFrom9(p[0], p[1])
8939
8975
  );
8940
8976
  nextSelectedIndices.push(indexCursor + 1);
8941
8977
  ++indexCursor;
@@ -8951,7 +8987,7 @@ var LinearElementEditor = class _LinearElementEditor {
8951
8987
  /* @__PURE__ */ new Map([
8952
8988
  [
8953
8989
  element.points.length - 1,
8954
- { point: pointFrom8(lastPoint[0] + 30, lastPoint[1] + 30) }
8990
+ { point: pointFrom9(lastPoint[0] + 30, lastPoint[1] + 30) }
8955
8991
  ]
8956
8992
  ])
8957
8993
  );
@@ -8971,7 +9007,7 @@ var LinearElementEditor = class _LinearElementEditor {
8971
9007
  });
8972
9008
  const isPolygon = isLineElement(element) && element.polygon;
8973
9009
  if (isPolygon && (isUncommittedPoint || pointIndices.includes(0) || pointIndices.includes(element.points.length - 1))) {
8974
- nextPoints[0] = pointFrom8(
9010
+ nextPoints[0] = pointFrom9(
8975
9011
  nextPoints[nextPoints.length - 1][0],
8976
9012
  nextPoints[nextPoints.length - 1][1]
8977
9013
  );
@@ -8992,7 +9028,7 @@ var LinearElementEditor = class _LinearElementEditor {
8992
9028
  static addPoints(element, scene, addedPoints) {
8993
9029
  const nextPoints = [...element.points, ...addedPoints];
8994
9030
  if (isLineElement(element) && element.polygon) {
8995
- nextPoints[0] = pointFrom8(
9031
+ nextPoints[0] = pointFrom9(
8996
9032
  nextPoints[nextPoints.length - 1][0],
8997
9033
  nextPoints[nextPoints.length - 1][1]
8998
9034
  );
@@ -9017,7 +9053,7 @@ var LinearElementEditor = class _LinearElementEditor {
9017
9053
  const lastPointUpdate = pointUpdates.get(points.length - 1);
9018
9054
  if (firstPointUpdate) {
9019
9055
  pointUpdates.set(points.length - 1, {
9020
- point: pointFrom8(
9056
+ point: pointFrom9(
9021
9057
  firstPointUpdate.point[0],
9022
9058
  firstPointUpdate.point[1]
9023
9059
  ),
@@ -9025,19 +9061,19 @@ var LinearElementEditor = class _LinearElementEditor {
9025
9061
  });
9026
9062
  } else if (lastPointUpdate) {
9027
9063
  pointUpdates.set(0, {
9028
- point: pointFrom8(lastPointUpdate.point[0], lastPointUpdate.point[1]),
9064
+ point: pointFrom9(lastPointUpdate.point[0], lastPointUpdate.point[1]),
9029
9065
  isDragging: lastPointUpdate.isDragging
9030
9066
  });
9031
9067
  }
9032
9068
  }
9033
- const updatedOriginPoint = pointUpdates.get(0)?.point ?? pointFrom8(0, 0);
9069
+ const updatedOriginPoint = pointUpdates.get(0)?.point ?? pointFrom9(0, 0);
9034
9070
  const [offsetX, offsetY] = updatedOriginPoint;
9035
9071
  const nextPoints = isElbowArrow(element) ? [
9036
9072
  pointUpdates.get(0)?.point ?? points[0],
9037
9073
  pointUpdates.get(points.length - 1)?.point ?? points[points.length - 1]
9038
9074
  ] : points.map((p, idx) => {
9039
9075
  const current = pointUpdates.get(idx)?.point ?? p;
9040
- return pointFrom8(
9076
+ return pointFrom9(
9041
9077
  current[0] - offsetX,
9042
9078
  current[1] - offsetY
9043
9079
  );
@@ -9071,8 +9107,8 @@ var LinearElementEditor = class _LinearElementEditor {
9071
9107
  }
9072
9108
  const origin = linearElementEditor.pointerDownState.origin;
9073
9109
  const dist = pointDistance5(
9074
- pointFrom8(origin.x, origin.y),
9075
- pointFrom8(pointerCoords.x, pointerCoords.y)
9110
+ pointFrom9(origin.x, origin.y),
9111
+ pointFrom9(pointerCoords.x, pointerCoords.y)
9076
9112
  );
9077
9113
  if (!appState.selectedLinearElement?.isEditing && dist < DRAGGING_THRESHOLD / appState.zoom.value) {
9078
9114
  return false;
@@ -9140,9 +9176,9 @@ var LinearElementEditor = class _LinearElementEditor {
9140
9176
  const prevCenterY = (prevCoords[1] + prevCoords[3]) / 2;
9141
9177
  const dX = prevCenterX - nextCenterX;
9142
9178
  const dY = prevCenterY - nextCenterY;
9143
- const rotatedOffset = pointRotateRads7(
9144
- pointFrom8(offsetX, offsetY),
9145
- pointFrom8(dX, dY),
9179
+ const rotatedOffset = pointRotateRads8(
9180
+ pointFrom9(offsetX, offsetY),
9181
+ pointFrom9(dX, dY),
9146
9182
  element.angle
9147
9183
  );
9148
9184
  scene.mutateElement(element, {
@@ -9177,9 +9213,9 @@ var LinearElementEditor = class _LinearElementEditor {
9177
9213
  gridY,
9178
9214
  customLineAngle
9179
9215
  );
9180
- return pointRotateRads7(
9181
- pointFrom8(width, height),
9182
- pointFrom8(0, 0),
9216
+ return pointRotateRads8(
9217
+ pointFrom9(width, height),
9218
+ pointFrom9(0, 0),
9183
9219
  -element.angle
9184
9220
  );
9185
9221
  }
@@ -9224,34 +9260,34 @@ var LinearElementEditor = class _LinearElementEditor {
9224
9260
  );
9225
9261
  const boundTextX2 = boundTextX1 + boundTextElement.width;
9226
9262
  const boundTextY2 = boundTextY1 + boundTextElement.height;
9227
- const centerPoint = pointFrom8(cx, cy);
9228
- const topLeftRotatedPoint = pointRotateRads7(
9229
- pointFrom8(x1, y1),
9263
+ const centerPoint = pointFrom9(cx, cy);
9264
+ const topLeftRotatedPoint = pointRotateRads8(
9265
+ pointFrom9(x1, y1),
9230
9266
  centerPoint,
9231
9267
  element.angle
9232
9268
  );
9233
- const topRightRotatedPoint = pointRotateRads7(
9234
- pointFrom8(x2, y1),
9269
+ const topRightRotatedPoint = pointRotateRads8(
9270
+ pointFrom9(x2, y1),
9235
9271
  centerPoint,
9236
9272
  element.angle
9237
9273
  );
9238
- const counterRotateBoundTextTopLeft = pointRotateRads7(
9239
- pointFrom8(boundTextX1, boundTextY1),
9274
+ const counterRotateBoundTextTopLeft = pointRotateRads8(
9275
+ pointFrom9(boundTextX1, boundTextY1),
9240
9276
  centerPoint,
9241
9277
  -element.angle
9242
9278
  );
9243
- const counterRotateBoundTextTopRight = pointRotateRads7(
9244
- pointFrom8(boundTextX2, boundTextY1),
9279
+ const counterRotateBoundTextTopRight = pointRotateRads8(
9280
+ pointFrom9(boundTextX2, boundTextY1),
9245
9281
  centerPoint,
9246
9282
  -element.angle
9247
9283
  );
9248
- const counterRotateBoundTextBottomLeft = pointRotateRads7(
9249
- pointFrom8(boundTextX1, boundTextY2),
9284
+ const counterRotateBoundTextBottomLeft = pointRotateRads8(
9285
+ pointFrom9(boundTextX1, boundTextY2),
9250
9286
  centerPoint,
9251
9287
  -element.angle
9252
9288
  );
9253
- const counterRotateBoundTextBottomRight = pointRotateRads7(
9254
- pointFrom8(boundTextX2, boundTextY2),
9289
+ const counterRotateBoundTextBottomRight = pointRotateRads8(
9290
+ pointFrom9(boundTextX2, boundTextY2),
9255
9291
  centerPoint,
9256
9292
  -element.angle
9257
9293
  );
@@ -9367,11 +9403,11 @@ var LinearElementEditor = class _LinearElementEditor {
9367
9403
  );
9368
9404
  fixedSegments[index] = {
9369
9405
  index,
9370
- start: pointFrom8(
9406
+ start: pointFrom9(
9371
9407
  !isHorizontal ? x - element.x : element.points[index - 1][0],
9372
9408
  isHorizontal ? y - element.y : element.points[index - 1][1]
9373
9409
  ),
9374
- end: pointFrom8(
9410
+ end: pointFrom9(
9375
9411
  !isHorizontal ? x - element.x : element.points[index][0],
9376
9412
  isHorizontal ? y - element.y : element.points[index][1]
9377
9413
  )
@@ -9383,7 +9419,7 @@ var LinearElementEditor = class _LinearElementEditor {
9383
9419
  scene.mutateElement(element, {
9384
9420
  fixedSegments: nextFixedSegments
9385
9421
  });
9386
- const point = pointFrom8(
9422
+ const point = pointFrom9(
9387
9423
  element.x + (element.fixedSegments[offset].start[0] + element.fixedSegments[offset].end[0]) / 2,
9388
9424
  element.y + (element.fixedSegments[offset].start[1] + element.fixedSegments[offset].end[1]) / 2
9389
9425
  );
@@ -9421,7 +9457,7 @@ var normalizeSelectedPoints = (points) => {
9421
9457
  // src/frame.ts
9422
9458
  init_define_import_meta_env();
9423
9459
  import { arrayToMap as arrayToMap5 } from "@excalidraw/common";
9424
- import { isPointWithinBounds as isPointWithinBounds2, pointFrom as pointFrom10 } from "@excalidraw/math";
9460
+ import { isPointWithinBounds as isPointWithinBounds2, pointFrom as pointFrom11 } from "@excalidraw/math";
9425
9461
 
9426
9462
  // ../utils/src/bbox.ts
9427
9463
  init_define_import_meta_env();
@@ -9472,24 +9508,24 @@ import {
9472
9508
  } from "@excalidraw/element";
9473
9509
  import {
9474
9510
  rangeIncludesValue,
9475
- pointFrom as pointFrom9,
9476
- pointRotateRads as pointRotateRads8,
9511
+ pointFrom as pointFrom10,
9512
+ pointRotateRads as pointRotateRads9,
9477
9513
  rangeInclusive
9478
9514
  } from "@excalidraw/math";
9479
9515
  var getNonLinearElementRelativePoints = (element) => {
9480
9516
  if (element.type === "diamond") {
9481
9517
  return [
9482
- pointFrom9(element.width / 2, 0),
9483
- pointFrom9(element.width, element.height / 2),
9484
- pointFrom9(element.width / 2, element.height),
9485
- pointFrom9(0, element.height / 2)
9518
+ pointFrom10(element.width / 2, 0),
9519
+ pointFrom10(element.width, element.height / 2),
9520
+ pointFrom10(element.width / 2, element.height),
9521
+ pointFrom10(0, element.height / 2)
9486
9522
  ];
9487
9523
  }
9488
9524
  return [
9489
- pointFrom9(0, 0),
9490
- pointFrom9(0 + element.width, 0),
9491
- pointFrom9(0 + element.width, element.height),
9492
- pointFrom9(0, element.height)
9525
+ pointFrom10(0, 0),
9526
+ pointFrom10(0 + element.width, 0),
9527
+ pointFrom10(0 + element.width, element.height),
9528
+ pointFrom10(0, element.height)
9493
9529
  ];
9494
9530
  };
9495
9531
  var getElementRelativePoints = (element) => {
@@ -9523,9 +9559,9 @@ var getMinMaxPoints = (points) => {
9523
9559
  var getRotatedBBox = (element) => {
9524
9560
  const points = getElementRelativePoints(element);
9525
9561
  const { cx, cy } = getMinMaxPoints(points);
9526
- const centerPoint = pointFrom9(cx, cy);
9562
+ const centerPoint = pointFrom10(cx, cy);
9527
9563
  const rotatedPoints = points.map(
9528
- (p) => pointRotateRads8(p, centerPoint, element.angle)
9564
+ (p) => pointRotateRads9(p, centerPoint, element.angle)
9529
9565
  );
9530
9566
  const { minX, minY, maxX, maxY } = getMinMaxPoints(rotatedPoints);
9531
9567
  return [
@@ -10089,9 +10125,9 @@ var elementOverlapsWithFrame = (element, frame, elementsMap) => {
10089
10125
  var isCursorInFrame = (cursorCoords, frame, elementsMap) => {
10090
10126
  const [fx1, fy1, fx2, fy2] = getElementAbsoluteCoords2(frame, elementsMap);
10091
10127
  return isPointWithinBounds2(
10092
- pointFrom10(fx1, fy1),
10093
- pointFrom10(cursorCoords.x, cursorCoords.y),
10094
- pointFrom10(fx2, fy2)
10128
+ pointFrom11(fx1, fy1),
10129
+ pointFrom11(cursorCoords.x, cursorCoords.y),
10130
+ pointFrom11(fx2, fy2)
10095
10131
  );
10096
10132
  };
10097
10133
  var groupsAreAtLeastIntersectingTheFrame = (elements, groupIds, frame) => {
@@ -11450,26 +11486,26 @@ var generateLinearCollisionShape = (element) => {
11450
11486
  switch (element.type) {
11451
11487
  case "line":
11452
11488
  case "arrow": {
11453
- const points = element.points.length ? element.points : [pointFrom11(0, 0)];
11489
+ const points = element.points.length ? element.points : [pointFrom12(0, 0)];
11454
11490
  if (isElbowArrow(element)) {
11455
11491
  return generator.path(generateElbowArrowShape(points, 16), options).sets[0].ops;
11456
11492
  } else if (!element.roundness) {
11457
11493
  return points.map((point, idx) => {
11458
- const p = pointRotateRads9(
11459
- pointFrom11(element.x + point[0], element.y + point[1]),
11494
+ const p = pointRotateRads10(
11495
+ pointFrom12(element.x + point[0], element.y + point[1]),
11460
11496
  center,
11461
11497
  element.angle
11462
11498
  );
11463
11499
  return {
11464
11500
  op: idx === 0 ? "move" : "lineTo",
11465
- data: pointFrom11(p[0] - element.x, p[1] - element.y)
11501
+ data: pointFrom12(p[0] - element.x, p[1] - element.y)
11466
11502
  };
11467
11503
  });
11468
11504
  }
11469
11505
  return generator.curve(points, options).sets[0].ops.slice(0, element.points.length).map((op, i) => {
11470
11506
  if (i === 0) {
11471
- const p = pointRotateRads9(
11472
- pointFrom11(
11507
+ const p = pointRotateRads10(
11508
+ pointFrom12(
11473
11509
  element.x + op.data[0],
11474
11510
  element.y + op.data[1]
11475
11511
  ),
@@ -11478,30 +11514,30 @@ var generateLinearCollisionShape = (element) => {
11478
11514
  );
11479
11515
  return {
11480
11516
  op: "move",
11481
- data: pointFrom11(p[0] - element.x, p[1] - element.y)
11517
+ data: pointFrom12(p[0] - element.x, p[1] - element.y)
11482
11518
  };
11483
11519
  }
11484
11520
  return {
11485
11521
  op: "bcurveTo",
11486
11522
  data: [
11487
- pointRotateRads9(
11488
- pointFrom11(
11523
+ pointRotateRads10(
11524
+ pointFrom12(
11489
11525
  element.x + op.data[0],
11490
11526
  element.y + op.data[1]
11491
11527
  ),
11492
11528
  center,
11493
11529
  element.angle
11494
11530
  ),
11495
- pointRotateRads9(
11496
- pointFrom11(
11531
+ pointRotateRads10(
11532
+ pointFrom12(
11497
11533
  element.x + op.data[2],
11498
11534
  element.y + op.data[3]
11499
11535
  ),
11500
11536
  center,
11501
11537
  element.angle
11502
11538
  ),
11503
- pointRotateRads9(
11504
- pointFrom11(
11539
+ pointRotateRads10(
11540
+ pointFrom12(
11505
11541
  element.x + op.data[4],
11506
11542
  element.y + op.data[5]
11507
11543
  ),
@@ -11509,7 +11545,7 @@ var generateLinearCollisionShape = (element) => {
11509
11545
  element.angle
11510
11546
  )
11511
11547
  ].map(
11512
- (p) => pointFrom11(p[0] - element.x, p[1] - element.y)
11548
+ (p) => pointFrom12(p[0] - element.x, p[1] - element.y)
11513
11549
  ).flat()
11514
11550
  };
11515
11551
  });
@@ -11524,8 +11560,8 @@ var generateLinearCollisionShape = (element) => {
11524
11560
  );
11525
11561
  return generator.curve(simplifiedPoints, options).sets[0].ops.slice(0, element.points.length).map((op, i) => {
11526
11562
  if (i === 0) {
11527
- const p = pointRotateRads9(
11528
- pointFrom11(
11563
+ const p = pointRotateRads10(
11564
+ pointFrom12(
11529
11565
  element.x + op.data[0],
11530
11566
  element.y + op.data[1]
11531
11567
  ),
@@ -11534,30 +11570,30 @@ var generateLinearCollisionShape = (element) => {
11534
11570
  );
11535
11571
  return {
11536
11572
  op: "move",
11537
- data: pointFrom11(p[0] - element.x, p[1] - element.y)
11573
+ data: pointFrom12(p[0] - element.x, p[1] - element.y)
11538
11574
  };
11539
11575
  }
11540
11576
  return {
11541
11577
  op: "bcurveTo",
11542
11578
  data: [
11543
- pointRotateRads9(
11544
- pointFrom11(
11579
+ pointRotateRads10(
11580
+ pointFrom12(
11545
11581
  element.x + op.data[0],
11546
11582
  element.y + op.data[1]
11547
11583
  ),
11548
11584
  center,
11549
11585
  element.angle
11550
11586
  ),
11551
- pointRotateRads9(
11552
- pointFrom11(
11587
+ pointRotateRads10(
11588
+ pointFrom12(
11553
11589
  element.x + op.data[2],
11554
11590
  element.y + op.data[3]
11555
11591
  ),
11556
11592
  center,
11557
11593
  element.angle
11558
11594
  ),
11559
- pointRotateRads9(
11560
- pointFrom11(
11595
+ pointRotateRads10(
11596
+ pointFrom12(
11561
11597
  element.x + op.data[4],
11562
11598
  element.y + op.data[5]
11563
11599
  ),
@@ -11565,7 +11601,7 @@ var generateLinearCollisionShape = (element) => {
11565
11601
  element.angle
11566
11602
  )
11567
11603
  ].map(
11568
- (p) => pointFrom11(p[0] - element.x, p[1] - element.y)
11604
+ (p) => pointFrom12(p[0] - element.x, p[1] - element.y)
11569
11605
  ).flat()
11570
11606
  };
11571
11607
  });
@@ -11662,7 +11698,7 @@ var generateElementShape = (element, generator, {
11662
11698
  case "arrow": {
11663
11699
  let shape;
11664
11700
  const options = generateRoughOptions(element);
11665
- const points = element.points.length ? element.points : [pointFrom11(0, 0)];
11701
+ const points = element.points.length ? element.points : [pointFrom12(0, 0)];
11666
11702
  if (isElbowArrow(element)) {
11667
11703
  if (!points.every(
11668
11704
  (point) => Math.abs(point[0]) <= 1e6 && Math.abs(point[1]) <= 1e6
@@ -11824,14 +11860,14 @@ var getElementShape = (element, elementsMap) => {
11824
11860
  return shouldTestInside(element) ? getClosedCurveShape(
11825
11861
  element,
11826
11862
  roughShape,
11827
- pointFrom11(element.x, element.y),
11863
+ pointFrom12(element.x, element.y),
11828
11864
  element.angle,
11829
- pointFrom11(cx, cy)
11865
+ pointFrom12(cx, cy)
11830
11866
  ) : getCurveShape(
11831
11867
  roughShape,
11832
- pointFrom11(element.x, element.y),
11868
+ pointFrom12(element.x, element.y),
11833
11869
  element.angle,
11834
- pointFrom11(cx, cy)
11870
+ pointFrom12(cx, cy)
11835
11871
  );
11836
11872
  }
11837
11873
  case "ellipse":
@@ -11840,7 +11876,7 @@ var getElementShape = (element, elementsMap) => {
11840
11876
  const [, , , , cx, cy] = getElementAbsoluteCoords2(element, elementsMap);
11841
11877
  return getFreedrawShape(
11842
11878
  element,
11843
- pointFrom11(cx, cy),
11879
+ pointFrom12(cx, cy),
11844
11880
  shouldTestInside(element)
11845
11881
  );
11846
11882
  }
@@ -11859,9 +11895,9 @@ var toggleLinePolygonState = (element, nextPolygonState) => {
11859
11895
  firstPoint[1] - lastPoint[1]
11860
11896
  );
11861
11897
  if (distance3 > LINE_POLYGON_POINT_MERGE_DISTANCE || updatedPoints.length < 4) {
11862
- updatedPoints.push(pointFrom11(firstPoint[0], firstPoint[1]));
11898
+ updatedPoints.push(pointFrom12(firstPoint[0], firstPoint[1]));
11863
11899
  } else {
11864
- updatedPoints[updatedPoints.length - 1] = pointFrom11(
11900
+ updatedPoints[updatedPoints.length - 1] = pointFrom12(
11865
11901
  firstPoint[0],
11866
11902
  firstPoint[1]
11867
11903
  );
@@ -11915,9 +11951,9 @@ var ElementBounds = class _ElementBounds {
11915
11951
  if (isFreeDrawElement(element)) {
11916
11952
  const [minX, minY, maxX, maxY] = getBoundsFromPoints(
11917
11953
  element.points.map(
11918
- ([x, y]) => pointRotateRads10(
11919
- pointFrom12(x, y),
11920
- pointFrom12(cx - element.x, cy - element.y),
11954
+ ([x, y]) => pointRotateRads11(
11955
+ pointFrom13(x, y),
11956
+ pointFrom13(cx - element.x, cy - element.y),
11921
11957
  element.angle
11922
11958
  )
11923
11959
  )
@@ -11931,24 +11967,24 @@ var ElementBounds = class _ElementBounds {
11931
11967
  } else if (isLinearElement(element)) {
11932
11968
  bounds = getLinearElementRotatedBounds(element, cx, cy, elementsMap);
11933
11969
  } else if (element.type === "diamond") {
11934
- const [x11, y11] = pointRotateRads10(
11935
- pointFrom12(cx, y1),
11936
- pointFrom12(cx, cy),
11970
+ const [x11, y11] = pointRotateRads11(
11971
+ pointFrom13(cx, y1),
11972
+ pointFrom13(cx, cy),
11937
11973
  element.angle
11938
11974
  );
11939
- const [x12, y12] = pointRotateRads10(
11940
- pointFrom12(cx, y2),
11941
- pointFrom12(cx, cy),
11975
+ const [x12, y12] = pointRotateRads11(
11976
+ pointFrom13(cx, y2),
11977
+ pointFrom13(cx, cy),
11942
11978
  element.angle
11943
11979
  );
11944
- const [x22, y22] = pointRotateRads10(
11945
- pointFrom12(x1, cy),
11946
- pointFrom12(cx, cy),
11980
+ const [x22, y22] = pointRotateRads11(
11981
+ pointFrom13(x1, cy),
11982
+ pointFrom13(cx, cy),
11947
11983
  element.angle
11948
11984
  );
11949
- const [x21, y21] = pointRotateRads10(
11950
- pointFrom12(x2, cy),
11951
- pointFrom12(cx, cy),
11985
+ const [x21, y21] = pointRotateRads11(
11986
+ pointFrom13(x2, cy),
11987
+ pointFrom13(cx, cy),
11952
11988
  element.angle
11953
11989
  );
11954
11990
  const minX = Math.min(x11, x12, x22, x21);
@@ -11965,24 +12001,24 @@ var ElementBounds = class _ElementBounds {
11965
12001
  const hh = Math.hypot(h * cos, w * sin);
11966
12002
  bounds = [cx - ww, cy - hh, cx + ww, cy + hh];
11967
12003
  } else {
11968
- const [x11, y11] = pointRotateRads10(
11969
- pointFrom12(x1, y1),
11970
- pointFrom12(cx, cy),
12004
+ const [x11, y11] = pointRotateRads11(
12005
+ pointFrom13(x1, y1),
12006
+ pointFrom13(cx, cy),
11971
12007
  element.angle
11972
12008
  );
11973
- const [x12, y12] = pointRotateRads10(
11974
- pointFrom12(x1, y2),
11975
- pointFrom12(cx, cy),
12009
+ const [x12, y12] = pointRotateRads11(
12010
+ pointFrom13(x1, y2),
12011
+ pointFrom13(cx, cy),
11976
12012
  element.angle
11977
12013
  );
11978
- const [x22, y22] = pointRotateRads10(
11979
- pointFrom12(x2, y2),
11980
- pointFrom12(cx, cy),
12014
+ const [x22, y22] = pointRotateRads11(
12015
+ pointFrom13(x2, y2),
12016
+ pointFrom13(cx, cy),
11981
12017
  element.angle
11982
12018
  );
11983
- const [x21, y21] = pointRotateRads10(
11984
- pointFrom12(x2, y1),
11985
- pointFrom12(cx, cy),
12019
+ const [x21, y21] = pointRotateRads11(
12020
+ pointFrom13(x2, y1),
12021
+ pointFrom13(cx, cy),
11986
12022
  element.angle
11987
12023
  );
11988
12024
  const minX = Math.min(x11, x12, x22, x21);
@@ -12036,7 +12072,7 @@ var getElementLineSegments = (element, elementsMap) => {
12036
12072
  element,
12037
12073
  elementsMap
12038
12074
  );
12039
- const center = pointFrom12(cx, cy);
12075
+ const center = pointFrom13(cx, cy);
12040
12076
  if (shape.type === "polycurve") {
12041
12077
  const curves = shape.data;
12042
12078
  const points = curves.map((curve4) => pointsOnBezierCurves(curve4, 10)).flat();
@@ -12045,8 +12081,8 @@ var getElementLineSegments = (element, elementsMap) => {
12045
12081
  while (i < points.length - 1) {
12046
12082
  segments.push(
12047
12083
  lineSegment5(
12048
- pointFrom12(points[i][0], points[i][1]),
12049
- pointFrom12(points[i + 1][0], points[i + 1][1])
12084
+ pointFrom13(points[i][0], points[i][1]),
12085
+ pointFrom13(points[i + 1][0], points[i + 1][1])
12050
12086
  )
12051
12087
  );
12052
12088
  i++;
@@ -12069,10 +12105,10 @@ var getElementLineSegments = (element, elementsMap) => {
12069
12105
  const container = getContainerElement(element, elementsMap);
12070
12106
  if (container && isLinearElement(container)) {
12071
12107
  const segments2 = [
12072
- lineSegment5(pointFrom12(x1, y1), pointFrom12(x2, y1)),
12073
- lineSegment5(pointFrom12(x2, y1), pointFrom12(x2, y2)),
12074
- lineSegment5(pointFrom12(x2, y2), pointFrom12(x1, y2)),
12075
- lineSegment5(pointFrom12(x1, y2), pointFrom12(x1, y1))
12108
+ lineSegment5(pointFrom13(x1, y1), pointFrom13(x2, y1)),
12109
+ lineSegment5(pointFrom13(x2, y1), pointFrom13(x2, y2)),
12110
+ lineSegment5(pointFrom13(x2, y2), pointFrom13(x1, y2)),
12111
+ lineSegment5(pointFrom13(x1, y2), pointFrom13(x1, y1))
12076
12112
  ];
12077
12113
  return segments2;
12078
12114
  }
@@ -12095,7 +12131,7 @@ var getElementLineSegments = (element, elementsMap) => {
12095
12131
  [cx, y2],
12096
12132
  [x1, cy],
12097
12133
  [x2, cy]
12098
- ].map((point) => pointRotateRads10(point, center, element.angle));
12134
+ ].map((point) => pointRotateRads11(point, center, element.angle));
12099
12135
  return [
12100
12136
  lineSegment5(nw, ne),
12101
12137
  lineSegment5(sw, se2),
@@ -12113,8 +12149,8 @@ var _isRectanguloidElement = (element) => {
12113
12149
  var getRotatedSides = (sides, center, angle) => {
12114
12150
  return sides.map((side) => {
12115
12151
  return lineSegment5(
12116
- pointRotateRads10(side[0], center, angle),
12117
- pointRotateRads10(side[1], center, angle)
12152
+ pointRotateRads11(side[0], center, angle),
12153
+ pointRotateRads11(side[1], center, angle)
12118
12154
  );
12119
12155
  });
12120
12156
  };
@@ -12125,13 +12161,13 @@ var getSegmentsOnCurve = (curve4, center, angle) => {
12125
12161
  while (i < points.length - 1) {
12126
12162
  segments.push(
12127
12163
  lineSegment5(
12128
- pointRotateRads10(
12129
- pointFrom12(points[i][0], points[i][1]),
12164
+ pointRotateRads11(
12165
+ pointFrom13(points[i][0], points[i][1]),
12130
12166
  center,
12131
12167
  angle
12132
12168
  ),
12133
- pointRotateRads10(
12134
- pointFrom12(points[i + 1][0], points[i + 1][1]),
12169
+ pointRotateRads11(
12170
+ pointFrom13(points[i + 1][0], points[i + 1][1]),
12135
12171
  center,
12136
12172
  angle
12137
12173
  )
@@ -12142,7 +12178,7 @@ var getSegmentsOnCurve = (curve4, center, angle) => {
12142
12178
  return segments;
12143
12179
  };
12144
12180
  var getSegmentsOnEllipse = (ellipse4) => {
12145
- const center = pointFrom12(
12181
+ const center = pointFrom13(
12146
12182
  ellipse4.x + ellipse4.width / 2,
12147
12183
  ellipse4.y + ellipse4.height / 2
12148
12184
  );
@@ -12156,7 +12192,7 @@ var getSegmentsOnEllipse = (ellipse4) => {
12156
12192
  const t = i * deltaT;
12157
12193
  const x = center[0] + a2 * Math.cos(t);
12158
12194
  const y = center[1] + b2 * Math.sin(t);
12159
- points.push(pointRotateRads10(pointFrom12(x, y), center, ellipse4.angle));
12195
+ points.push(pointRotateRads11(pointFrom13(x, y), center, ellipse4.angle));
12160
12196
  }
12161
12197
  for (let i = 0; i < points.length - 1; i++) {
12162
12198
  segments.push(lineSegment5(points[i], points[i + 1]));
@@ -12239,7 +12275,7 @@ var getCubicBezierCurveBound = (p0, p1, p2, p3) => {
12239
12275
  return [minX, minY, maxX, maxY];
12240
12276
  };
12241
12277
  var getMinMaxXYFromCurvePathOps = (ops, transformXY) => {
12242
- let currentP = pointFrom12(0, 0);
12278
+ let currentP = pointFrom13(0, 0);
12243
12279
  const { minX, minY, maxX, maxY } = ops.reduce(
12244
12280
  (limits, { op, data }) => {
12245
12281
  if (op === "move") {
@@ -12247,9 +12283,9 @@ var getMinMaxXYFromCurvePathOps = (ops, transformXY) => {
12247
12283
  invariant7(p != null, "Op data is not a point");
12248
12284
  currentP = p;
12249
12285
  } else if (op === "bcurveTo") {
12250
- const _p1 = pointFrom12(data[0], data[1]);
12251
- const _p2 = pointFrom12(data[2], data[3]);
12252
- const _p3 = pointFrom12(data[4], data[5]);
12286
+ const _p1 = pointFrom13(data[0], data[1]);
12287
+ const _p2 = pointFrom13(data[2], data[3]);
12288
+ const _p3 = pointFrom13(data[4], data[5]);
12253
12289
  const p1 = transformXY ? transformXY(_p1) : _p1;
12254
12290
  const p2 = transformXY ? transformXY(_p2) : _p2;
12255
12291
  const p3 = transformXY ? transformXY(_p3) : _p3;
@@ -12331,17 +12367,17 @@ var getArrowheadPoints = (element, shape, position, arrowhead) => {
12331
12367
  const index = position === "start" ? 1 : ops.length - 1;
12332
12368
  const data = ops[index].data;
12333
12369
  invariant7(data.length === 6, "Op data length is not 6");
12334
- const p3 = pointFrom12(data[4], data[5]);
12335
- const p2 = pointFrom12(data[2], data[3]);
12336
- const p1 = pointFrom12(data[0], data[1]);
12370
+ const p3 = pointFrom13(data[4], data[5]);
12371
+ const p2 = pointFrom13(data[2], data[3]);
12372
+ const p1 = pointFrom13(data[0], data[1]);
12337
12373
  const prevOp = ops[index - 1];
12338
- let p0 = pointFrom12(0, 0);
12374
+ let p0 = pointFrom13(0, 0);
12339
12375
  if (prevOp.op === "move") {
12340
12376
  const p = pointFromArray3(prevOp.data);
12341
12377
  invariant7(p != null, "Op data is not a point");
12342
12378
  p0 = p;
12343
12379
  } else if (prevOp.op === "bcurveTo") {
12344
- p0 = pointFrom12(prevOp.data[4], prevOp.data[5]);
12380
+ p0 = pointFrom13(prevOp.data[4], prevOp.data[5]);
12345
12381
  }
12346
12382
  const equation = (t, idx) => Math.pow(1 - t, 3) * p3[idx] + 3 * t * Math.pow(1 - t, 2) * p2[idx] + 3 * Math.pow(t, 2) * (1 - t) * p1[idx] + p0[idx] * Math.pow(t, 3);
12347
12383
  const [x2, y2] = position === "start" ? p0 : p3;
@@ -12366,26 +12402,26 @@ var getArrowheadPoints = (element, shape, position, arrowhead) => {
12366
12402
  }
12367
12403
  const angle = getArrowheadAngle(arrowhead);
12368
12404
  if (arrowhead === "crowfoot_many" || arrowhead === "crowfoot_one_or_many") {
12369
- const [x32, y32] = pointRotateRads10(
12370
- pointFrom12(x2, y2),
12371
- pointFrom12(xs, ys),
12405
+ const [x32, y32] = pointRotateRads11(
12406
+ pointFrom13(x2, y2),
12407
+ pointFrom13(xs, ys),
12372
12408
  degreesToRadians(-angle)
12373
12409
  );
12374
- const [x42, y42] = pointRotateRads10(
12375
- pointFrom12(x2, y2),
12376
- pointFrom12(xs, ys),
12410
+ const [x42, y42] = pointRotateRads11(
12411
+ pointFrom13(x2, y2),
12412
+ pointFrom13(xs, ys),
12377
12413
  degreesToRadians(angle)
12378
12414
  );
12379
12415
  return [xs, ys, x32, y32, x42, y42];
12380
12416
  }
12381
- const [x3, y3] = pointRotateRads10(
12382
- pointFrom12(xs, ys),
12383
- pointFrom12(x2, y2),
12417
+ const [x3, y3] = pointRotateRads11(
12418
+ pointFrom13(xs, ys),
12419
+ pointFrom13(x2, y2),
12384
12420
  -angle * Math.PI / 180
12385
12421
  );
12386
- const [x4, y4] = pointRotateRads10(
12387
- pointFrom12(xs, ys),
12388
- pointFrom12(x2, y2),
12422
+ const [x4, y4] = pointRotateRads11(
12423
+ pointFrom13(xs, ys),
12424
+ pointFrom13(x2, y2),
12389
12425
  degreesToRadians(angle)
12390
12426
  );
12391
12427
  if (arrowhead === "diamond" || arrowhead === "diamond_outline") {
@@ -12393,16 +12429,16 @@ var getArrowheadPoints = (element, shape, position, arrowhead) => {
12393
12429
  let oy;
12394
12430
  if (position === "start") {
12395
12431
  const [px, py] = element.points.length > 1 ? element.points[1] : [0, 0];
12396
- [ox, oy] = pointRotateRads10(
12397
- pointFrom12(x2 + minSize * 2, y2),
12398
- pointFrom12(x2, y2),
12432
+ [ox, oy] = pointRotateRads11(
12433
+ pointFrom13(x2 + minSize * 2, y2),
12434
+ pointFrom13(x2, y2),
12399
12435
  Math.atan2(py - y2, px - x2)
12400
12436
  );
12401
12437
  } else {
12402
12438
  const [px, py] = element.points.length > 1 ? element.points[element.points.length - 2] : [0, 0];
12403
- [ox, oy] = pointRotateRads10(
12404
- pointFrom12(x2 - minSize * 2, y2),
12405
- pointFrom12(x2, y2),
12439
+ [ox, oy] = pointRotateRads11(
12440
+ pointFrom13(x2 - minSize * 2, y2),
12441
+ pointFrom13(x2, y2),
12406
12442
  Math.atan2(y2 - py, x2 - px)
12407
12443
  );
12408
12444
  }
@@ -12431,9 +12467,9 @@ var getLinearElementRotatedBounds = (element, cx, cy, elementsMap) => {
12431
12467
  const boundTextElement = getBoundTextElement(element, elementsMap);
12432
12468
  if (element.points.length < 2) {
12433
12469
  const [pointX, pointY] = element.points[0];
12434
- const [x, y] = pointRotateRads10(
12435
- pointFrom12(element.x + pointX, element.y + pointY),
12436
- pointFrom12(cx, cy),
12470
+ const [x, y] = pointRotateRads11(
12471
+ pointFrom13(element.x + pointX, element.y + pointY),
12472
+ pointFrom13(cx, cy),
12437
12473
  element.angle
12438
12474
  );
12439
12475
  let coords2 = [x, y, x, y];
@@ -12456,9 +12492,9 @@ var getLinearElementRotatedBounds = (element, cx, cy, elementsMap) => {
12456
12492
  const cachedShape = ShapeCache.get(element)?.[0];
12457
12493
  const shape = cachedShape ?? generateLinearElementShape(element);
12458
12494
  const ops = getCurvePathOps(shape);
12459
- const transformXY = ([x, y]) => pointRotateRads10(
12460
- pointFrom12(element.x + x, element.y + y),
12461
- pointFrom12(cx, cy),
12495
+ const transformXY = ([x, y]) => pointRotateRads11(
12496
+ pointFrom13(element.x + x, element.y + y),
12497
+ pointFrom13(cx, cy),
12462
12498
  element.angle
12463
12499
  );
12464
12500
  const res = getMinMaxXYFromCurvePathOps(ops, transformXY);
@@ -12569,8 +12605,8 @@ var getClosestElementBounds = (elements, from) => {
12569
12605
  elements.forEach((element) => {
12570
12606
  const [x1, y1, x2, y2] = getElementBounds(element, elementsMap);
12571
12607
  const distance3 = pointDistance7(
12572
- pointFrom12((x1 + x2) / 2, (y1 + y2) / 2),
12573
- pointFrom12(from.x, from.y)
12608
+ pointFrom13((x1 + x2) / 2, (y1 + y2) / 2),
12609
+ pointFrom13(from.x, from.y)
12574
12610
  );
12575
12611
  if (distance3 < minDistance) {
12576
12612
  minDistance = distance3;
@@ -12606,7 +12642,7 @@ var getVisibleSceneBounds = ({
12606
12642
  -scrollY + height / zoom.value
12607
12643
  ];
12608
12644
  };
12609
- var getCenterForBounds = (bounds) => pointFrom12(
12645
+ var getCenterForBounds = (bounds) => pointFrom13(
12610
12646
  bounds[0] + (bounds[2] - bounds[0]) / 2,
12611
12647
  bounds[1] + (bounds[3] - bounds[1]) / 2
12612
12648
  );
@@ -12620,23 +12656,23 @@ var aabbForElement = (element, elementsMap, offset) => {
12620
12656
  midY: element.y + element.height / 2
12621
12657
  };
12622
12658
  const center = elementCenterPoint(element, elementsMap);
12623
- const [topLeftX, topLeftY] = pointRotateRads10(
12624
- pointFrom12(bbox.minX, bbox.minY),
12659
+ const [topLeftX, topLeftY] = pointRotateRads11(
12660
+ pointFrom13(bbox.minX, bbox.minY),
12625
12661
  center,
12626
12662
  element.angle
12627
12663
  );
12628
- const [topRightX, topRightY] = pointRotateRads10(
12629
- pointFrom12(bbox.maxX, bbox.minY),
12664
+ const [topRightX, topRightY] = pointRotateRads11(
12665
+ pointFrom13(bbox.maxX, bbox.minY),
12630
12666
  center,
12631
12667
  element.angle
12632
12668
  );
12633
- const [bottomRightX, bottomRightY] = pointRotateRads10(
12634
- pointFrom12(bbox.maxX, bbox.maxY),
12669
+ const [bottomRightX, bottomRightY] = pointRotateRads11(
12670
+ pointFrom13(bbox.maxX, bbox.maxY),
12635
12671
  center,
12636
12672
  element.angle
12637
12673
  );
12638
- const [bottomLeftX, bottomLeftY] = pointRotateRads10(
12639
- pointFrom12(bbox.minX, bbox.maxY),
12674
+ const [bottomLeftX, bottomLeftY] = pointRotateRads11(
12675
+ pointFrom13(bbox.minX, bbox.maxY),
12640
12676
  center,
12641
12677
  element.angle
12642
12678
  );
@@ -12668,7 +12704,7 @@ var doBoundsIntersect = (bounds1, bounds2) => {
12668
12704
  };
12669
12705
  var elementCenterPoint = (element, elementsMap, xOffset = 0, yOffset = 0) => {
12670
12706
  const [x, y] = getCenterForBounds(getElementBounds(element, elementsMap));
12671
- return pointFrom12(x + xOffset, y + yOffset);
12707
+ return pointFrom13(x + xOffset, y + yOffset);
12672
12708
  };
12673
12709
 
12674
12710
  // src/sizeHelpers.ts
@@ -12849,7 +12885,6 @@ import {
12849
12885
  arrayToMap as arrayToMap10,
12850
12886
  arrayToObject,
12851
12887
  assertNever as assertNever4,
12852
- invariant as invariant8,
12853
12888
  isDevEnv as isDevEnv7,
12854
12889
  isShallowEqual as isShallowEqual2,
12855
12890
  isTestEnv as isTestEnv8,
@@ -13496,7 +13531,7 @@ var EphemeralIncrement = class extends StoreIncrement {
13496
13531
  this.change = change;
13497
13532
  }
13498
13533
  };
13499
- var StoreDelta = class {
13534
+ var StoreDelta = class _StoreDelta {
13500
13535
  constructor(id, elements, appState) {
13501
13536
  this.id = id;
13502
13537
  this.elements = elements;
@@ -13534,10 +13569,23 @@ var StoreDelta = class {
13534
13569
  */
13535
13570
  static load({
13536
13571
  id,
13537
- elements: { added, removed, updated }
13572
+ elements: { added, removed, updated },
13573
+ appState: { delta: appStateDelta }
13538
13574
  }) {
13539
13575
  const elements = ElementsDelta.create(added, removed, updated);
13540
- return new this(id, elements, AppStateDelta.empty());
13576
+ const appState = AppStateDelta.create(appStateDelta);
13577
+ return new this(id, elements, appState);
13578
+ }
13579
+ /**
13580
+ * Squash the passed deltas into the aggregated delta instance.
13581
+ */
13582
+ static squash(...deltas) {
13583
+ const aggregatedDelta = _StoreDelta.empty();
13584
+ for (const delta of deltas) {
13585
+ aggregatedDelta.elements.squash(delta.elements);
13586
+ aggregatedDelta.appState.squash(delta.appState);
13587
+ }
13588
+ return aggregatedDelta;
13541
13589
  }
13542
13590
  /**
13543
13591
  * Inverse store delta, creates new instance of `StoreDelta`.
@@ -13548,9 +13596,7 @@ var StoreDelta = class {
13548
13596
  /**
13549
13597
  * Apply the delta to the passed elements and appState, does not modify the snapshot.
13550
13598
  */
13551
- static applyTo(delta, elements, appState, options = {
13552
- excludedProperties: /* @__PURE__ */ new Set()
13553
- }) {
13599
+ static applyTo(delta, elements, appState, options) {
13554
13600
  const [nextElements, elementsContainVisibleChange] = delta.elements.applyTo(
13555
13601
  elements,
13556
13602
  StoreSnapshot.empty().elements,
@@ -13576,6 +13622,9 @@ var StoreDelta = class {
13576
13622
  }
13577
13623
  );
13578
13624
  }
13625
+ static empty() {
13626
+ return _StoreDelta.create(ElementsDelta.empty(), AppStateDelta.empty());
13627
+ }
13579
13628
  isEmpty() {
13580
13629
  return this.elements.isEmpty() && this.appState.isEmpty();
13581
13630
  }
@@ -13816,8 +13865,7 @@ var getDefaultObservedAppState = () => {
13816
13865
  viewBackgroundColor: COLOR_PALETTE2.white,
13817
13866
  selectedElementIds: {},
13818
13867
  selectedGroupIds: {},
13819
- selectedLinearElementId: null,
13820
- selectedLinearElementIsEditing: null,
13868
+ selectedLinearElement: null,
13821
13869
  croppingElementId: null,
13822
13870
  activeLockedId: null,
13823
13871
  lockedMultiSelections: {}
@@ -13833,8 +13881,10 @@ var getObservedAppState = (appState) => {
13833
13881
  croppingElementId: appState.croppingElementId,
13834
13882
  activeLockedId: appState.activeLockedId,
13835
13883
  lockedMultiSelections: appState.lockedMultiSelections,
13836
- selectedLinearElementId: appState.selectedLinearElement?.elementId ?? appState.selectedLinearElementId ?? null,
13837
- selectedLinearElementIsEditing: appState.selectedLinearElement?.isEditing ?? appState.selectedLinearElementIsEditing ?? null
13884
+ selectedLinearElement: appState.selectedLinearElement ? {
13885
+ elementId: appState.selectedLinearElement.elementId,
13886
+ isEditing: !!appState.selectedLinearElement.isEditing
13887
+ } : null
13838
13888
  };
13839
13889
  Reflect.defineProperty(observedAppState, hiddenObservedAppStateProp, {
13840
13890
  value: true,
@@ -14398,9 +14448,9 @@ var Scene = class {
14398
14448
  getFramesIncludingDeleted() {
14399
14449
  return this.frames;
14400
14450
  }
14401
- constructor(elements = null) {
14451
+ constructor(elements = null, options) {
14402
14452
  if (elements) {
14403
- this.replaceAllElements(elements);
14453
+ this.replaceAllElements(elements, options);
14404
14454
  }
14405
14455
  }
14406
14456
  getSelectedElements(opts) {
@@ -14465,10 +14515,12 @@ var Scene = class {
14465
14515
  }
14466
14516
  return didChange;
14467
14517
  }
14468
- replaceAllElements(nextElements) {
14518
+ replaceAllElements(nextElements, options) {
14469
14519
  const _nextElements = toArray(nextElements);
14470
14520
  const nextFrameLikes = [];
14471
- validateIndicesThrottled(_nextElements);
14521
+ if (!options?.skipValidation) {
14522
+ validateIndicesThrottled(_nextElements);
14523
+ }
14472
14524
  this.elements = syncInvalidIndices2(_nextElements);
14473
14525
  this.elementsMap.clear();
14474
14526
  this.elements.forEach((element) => {
@@ -14638,10 +14690,19 @@ var Delta = class _Delta {
14638
14690
  static isEmpty(delta) {
14639
14691
  return !Object.keys(delta.deleted).length && !Object.keys(delta.inserted).length;
14640
14692
  }
14693
+ /**
14694
+ * Merges two deltas into a new one.
14695
+ */
14696
+ static merge(delta1, delta2, delta3 = _Delta.empty()) {
14697
+ return _Delta.create(
14698
+ { ...delta1.deleted, ...delta2.deleted, ...delta3.deleted },
14699
+ { ...delta1.inserted, ...delta2.inserted, ...delta3.inserted }
14700
+ );
14701
+ }
14641
14702
  /**
14642
14703
  * Merges deleted and inserted object partials.
14643
14704
  */
14644
- static mergeObjects(prev, added, removed) {
14705
+ static mergeObjects(prev, added, removed = {}) {
14645
14706
  const cloned = { ...prev };
14646
14707
  for (const key of Object.keys(removed)) {
14647
14708
  delete cloned[key];
@@ -14862,6 +14923,9 @@ var AppStateDelta = class _AppStateDelta {
14862
14923
  constructor(delta) {
14863
14924
  this.delta = delta;
14864
14925
  }
14926
+ static create(delta) {
14927
+ return new _AppStateDelta(delta);
14928
+ }
14865
14929
  static calculate(prevAppState, nextAppState) {
14866
14930
  const delta = Delta.calculate(
14867
14931
  prevAppState,
@@ -14883,62 +14947,98 @@ var AppStateDelta = class _AppStateDelta {
14883
14947
  const inversedDelta = Delta.create(this.delta.inserted, this.delta.deleted);
14884
14948
  return new _AppStateDelta(inversedDelta);
14885
14949
  }
14950
+ squash(delta) {
14951
+ if (delta.isEmpty()) {
14952
+ return this;
14953
+ }
14954
+ const mergedDeletedSelectedElementIds = Delta.mergeObjects(
14955
+ this.delta.deleted.selectedElementIds ?? {},
14956
+ delta.delta.deleted.selectedElementIds ?? {}
14957
+ );
14958
+ const mergedInsertedSelectedElementIds = Delta.mergeObjects(
14959
+ this.delta.inserted.selectedElementIds ?? {},
14960
+ delta.delta.inserted.selectedElementIds ?? {}
14961
+ );
14962
+ const mergedDeletedSelectedGroupIds = Delta.mergeObjects(
14963
+ this.delta.deleted.selectedGroupIds ?? {},
14964
+ delta.delta.deleted.selectedGroupIds ?? {}
14965
+ );
14966
+ const mergedInsertedSelectedGroupIds = Delta.mergeObjects(
14967
+ this.delta.inserted.selectedGroupIds ?? {},
14968
+ delta.delta.inserted.selectedGroupIds ?? {}
14969
+ );
14970
+ const mergedDeletedLockedMultiSelections = Delta.mergeObjects(
14971
+ this.delta.deleted.lockedMultiSelections ?? {},
14972
+ delta.delta.deleted.lockedMultiSelections ?? {}
14973
+ );
14974
+ const mergedInsertedLockedMultiSelections = Delta.mergeObjects(
14975
+ this.delta.inserted.lockedMultiSelections ?? {},
14976
+ delta.delta.inserted.lockedMultiSelections ?? {}
14977
+ );
14978
+ const mergedInserted = {};
14979
+ const mergedDeleted = {};
14980
+ if (Object.keys(mergedDeletedSelectedElementIds).length || Object.keys(mergedInsertedSelectedElementIds).length) {
14981
+ mergedDeleted.selectedElementIds = mergedDeletedSelectedElementIds;
14982
+ mergedInserted.selectedElementIds = mergedInsertedSelectedElementIds;
14983
+ }
14984
+ if (Object.keys(mergedDeletedSelectedGroupIds).length || Object.keys(mergedInsertedSelectedGroupIds).length) {
14985
+ mergedDeleted.selectedGroupIds = mergedDeletedSelectedGroupIds;
14986
+ mergedInserted.selectedGroupIds = mergedInsertedSelectedGroupIds;
14987
+ }
14988
+ if (Object.keys(mergedDeletedLockedMultiSelections).length || Object.keys(mergedInsertedLockedMultiSelections).length) {
14989
+ mergedDeleted.lockedMultiSelections = mergedDeletedLockedMultiSelections;
14990
+ mergedInserted.lockedMultiSelections = mergedInsertedLockedMultiSelections;
14991
+ }
14992
+ this.delta = Delta.merge(
14993
+ this.delta,
14994
+ delta.delta,
14995
+ Delta.create(mergedDeleted, mergedInserted)
14996
+ );
14997
+ return this;
14998
+ }
14886
14999
  applyTo(appState, nextElements) {
14887
15000
  try {
14888
15001
  const {
14889
- selectedElementIds: removedSelectedElementIds = {},
14890
- selectedGroupIds: removedSelectedGroupIds = {}
15002
+ selectedElementIds: deletedSelectedElementIds = {},
15003
+ selectedGroupIds: deletedSelectedGroupIds = {},
15004
+ lockedMultiSelections: deletedLockedMultiSelections = {}
14891
15005
  } = this.delta.deleted;
14892
15006
  const {
14893
- selectedElementIds: addedSelectedElementIds = {},
14894
- selectedGroupIds: addedSelectedGroupIds = {},
14895
- selectedLinearElementId,
14896
- selectedLinearElementIsEditing,
15007
+ selectedElementIds: insertedSelectedElementIds = {},
15008
+ selectedGroupIds: insertedSelectedGroupIds = {},
15009
+ lockedMultiSelections: insertedLockedMultiSelections = {},
15010
+ selectedLinearElement: insertedSelectedLinearElement,
14897
15011
  ...directlyApplicablePartial
14898
15012
  } = this.delta.inserted;
14899
15013
  const mergedSelectedElementIds = Delta.mergeObjects(
14900
15014
  appState.selectedElementIds,
14901
- addedSelectedElementIds,
14902
- removedSelectedElementIds
15015
+ insertedSelectedElementIds,
15016
+ deletedSelectedElementIds
14903
15017
  );
14904
15018
  const mergedSelectedGroupIds = Delta.mergeObjects(
14905
15019
  appState.selectedGroupIds,
14906
- addedSelectedGroupIds,
14907
- removedSelectedGroupIds
15020
+ insertedSelectedGroupIds,
15021
+ deletedSelectedGroupIds
14908
15022
  );
14909
- let selectedLinearElement = appState.selectedLinearElement;
14910
- if (selectedLinearElementId === null) {
14911
- selectedLinearElement = null;
14912
- } else if (selectedLinearElementId && nextElements.has(selectedLinearElementId)) {
14913
- selectedLinearElement = new LinearElementEditor(
14914
- nextElements.get(
14915
- selectedLinearElementId
14916
- ),
14917
- nextElements,
14918
- selectedLinearElementIsEditing === true
14919
- // Can be unknown which is defaulted to false
14920
- );
14921
- }
14922
- if (
14923
- // Value being 'null' is equivaluent to unknown in this case because it only gets set
14924
- // to null when 'selectedLinearElementId' is set to null
14925
- selectedLinearElementIsEditing != null
14926
- ) {
14927
- invariant8(
14928
- selectedLinearElement,
14929
- `selectedLinearElement is null when selectedLinearElementIsEditing is set to ${selectedLinearElementIsEditing}`
14930
- );
14931
- selectedLinearElement = {
14932
- ...selectedLinearElement,
14933
- isEditing: selectedLinearElementIsEditing
14934
- };
14935
- }
15023
+ const mergedLockedMultiSelections = Delta.mergeObjects(
15024
+ appState.lockedMultiSelections,
15025
+ insertedLockedMultiSelections,
15026
+ deletedLockedMultiSelections
15027
+ );
15028
+ const selectedLinearElement = insertedSelectedLinearElement && nextElements.has(insertedSelectedLinearElement.elementId) ? new LinearElementEditor(
15029
+ nextElements.get(
15030
+ insertedSelectedLinearElement.elementId
15031
+ ),
15032
+ nextElements,
15033
+ insertedSelectedLinearElement.isEditing
15034
+ ) : null;
14936
15035
  const nextAppState = {
14937
15036
  ...appState,
14938
15037
  ...directlyApplicablePartial,
14939
15038
  selectedElementIds: mergedSelectedElementIds,
14940
15039
  selectedGroupIds: mergedSelectedGroupIds,
14941
- selectedLinearElement
15040
+ lockedMultiSelections: mergedLockedMultiSelections,
15041
+ selectedLinearElement: typeof insertedSelectedLinearElement !== "undefined" ? selectedLinearElement : appState.selectedLinearElement
14942
15042
  };
14943
15043
  const constainsVisibleChanges = this.filterInvisibleChanges(
14944
15044
  appState,
@@ -15028,63 +15128,44 @@ var AppStateDelta = class _AppStateDelta {
15028
15128
  nextAppState[key] = null;
15029
15129
  }
15030
15130
  break;
15031
- case "selectedLinearElementId": {
15032
- const appStateKey = _AppStateDelta.convertToAppStateKey(key);
15033
- const linearElement = nextAppState[appStateKey];
15034
- if (!linearElement) {
15131
+ case "selectedLinearElement":
15132
+ const nextLinearElement = nextAppState[key];
15133
+ if (!nextLinearElement) {
15035
15134
  visibleDifferenceFlag.value = true;
15036
15135
  } else {
15037
- const element = nextElements.get(linearElement.elementId);
15136
+ const element = nextElements.get(nextLinearElement.elementId);
15038
15137
  if (element && !element.isDeleted) {
15039
15138
  visibleDifferenceFlag.value = true;
15040
15139
  } else {
15041
- nextAppState[appStateKey] = null;
15140
+ nextAppState[key] = null;
15042
15141
  }
15043
15142
  }
15044
15143
  break;
15045
- }
15046
- case "selectedLinearElementIsEditing": {
15047
- const prevIsEditing = prevAppState.selectedLinearElement?.isEditing ?? false;
15048
- const nextIsEditing = nextAppState.selectedLinearElement?.isEditing ?? false;
15049
- if (prevIsEditing !== nextIsEditing) {
15050
- visibleDifferenceFlag.value = true;
15051
- }
15052
- break;
15053
- }
15054
- case "lockedMultiSelections": {
15144
+ case "lockedMultiSelections":
15055
15145
  const prevLockedUnits = prevAppState[key] || {};
15056
15146
  const nextLockedUnits = nextAppState[key] || {};
15057
15147
  if (!isShallowEqual2(prevLockedUnits, nextLockedUnits)) {
15058
15148
  visibleDifferenceFlag.value = true;
15059
15149
  }
15060
15150
  break;
15061
- }
15062
- case "activeLockedId": {
15151
+ case "activeLockedId":
15063
15152
  const prevHitLockedId = prevAppState[key] || null;
15064
15153
  const nextHitLockedId = nextAppState[key] || null;
15065
15154
  if (prevHitLockedId !== nextHitLockedId) {
15066
15155
  visibleDifferenceFlag.value = true;
15067
15156
  }
15068
15157
  break;
15069
- }
15070
- default: {
15158
+ default:
15071
15159
  assertNever4(
15072
15160
  key,
15073
15161
  `Unknown ObservedElementsAppState's key "${key}"`,
15074
15162
  true
15075
15163
  );
15076
- }
15077
15164
  }
15078
15165
  }
15079
15166
  }
15080
15167
  return visibleDifferenceFlag.value;
15081
15168
  }
15082
- static convertToAppStateKey(key) {
15083
- switch (key) {
15084
- case "selectedLinearElementId":
15085
- return "selectedLinearElement";
15086
- }
15087
- }
15088
15169
  static filterSelectedElements(selectedElementIds, elements, visibleDifferenceFlag) {
15089
15170
  const ids = Object.keys(selectedElementIds);
15090
15171
  if (!ids.length) {
@@ -15123,8 +15204,7 @@ var AppStateDelta = class _AppStateDelta {
15123
15204
  editingGroupId,
15124
15205
  selectedGroupIds,
15125
15206
  selectedElementIds,
15126
- selectedLinearElementId,
15127
- selectedLinearElementIsEditing,
15207
+ selectedLinearElement,
15128
15208
  croppingElementId,
15129
15209
  lockedMultiSelections,
15130
15210
  activeLockedId,
@@ -15161,12 +15241,6 @@ var AppStateDelta = class _AppStateDelta {
15161
15241
  "lockedMultiSelections",
15162
15242
  (prevValue) => prevValue ?? {}
15163
15243
  );
15164
- Delta.diffObjects(
15165
- deleted,
15166
- inserted,
15167
- "activeLockedId",
15168
- (prevValue) => prevValue ?? null
15169
- );
15170
15244
  } catch (e) {
15171
15245
  console.error(`Couldn't postprocess appstate change deltas.`);
15172
15246
  if (isTestEnv8() || isDevEnv7()) {
@@ -15245,13 +15319,17 @@ var ElementsDelta = class _ElementsDelta {
15245
15319
  static satisfiesCommmonInvariants = ({
15246
15320
  deleted,
15247
15321
  inserted
15248
- }) => !!(deleted.version && inserted.version && // versions are required integers
15249
- Number.isInteger(deleted.version) && Number.isInteger(inserted.version) && // versions should be positive, zero included
15322
+ }) => !!// versions are required integers
15323
+ (Number.isInteger(deleted.version) && Number.isInteger(inserted.version) && // versions should be positive, zero included
15250
15324
  deleted.version >= 0 && inserted.version >= 0 && // versions should never be the same
15251
15325
  deleted.version !== inserted.version);
15326
+ static satisfiesUniqueInvariants = (elementsDelta, id) => {
15327
+ const { added, removed, updated } = elementsDelta;
15328
+ return [added[id], removed[id], updated[id]].filter(Boolean).length === 1;
15329
+ };
15252
15330
  static validate(elementsDelta, type, satifiesSpecialInvariants) {
15253
15331
  for (const [id, delta] of Object.entries(elementsDelta[type])) {
15254
- if (!this.satisfiesCommmonInvariants(delta) || !satifiesSpecialInvariants(delta)) {
15332
+ if (!this.satisfiesCommmonInvariants(delta) || !this.satisfiesUniqueInvariants(elementsDelta, id) || !satifiesSpecialInvariants(delta)) {
15255
15333
  console.error(
15256
15334
  `Broken invariant for "${type}" delta, element "${id}", delta:`,
15257
15335
  delta
@@ -15278,7 +15356,7 @@ var ElementsDelta = class _ElementsDelta {
15278
15356
  for (const prevElement of prevElements.values()) {
15279
15357
  const nextElement = nextElements.get(prevElement.id);
15280
15358
  if (!nextElement) {
15281
- const deleted = { ...prevElement, isDeleted: false };
15359
+ const deleted = { ...prevElement };
15282
15360
  const inserted = {
15283
15361
  isDeleted: true,
15284
15362
  version: prevElement.version + 1,
@@ -15289,7 +15367,11 @@ var ElementsDelta = class _ElementsDelta {
15289
15367
  inserted,
15290
15368
  _ElementsDelta.stripIrrelevantProps
15291
15369
  );
15292
- removed[prevElement.id] = delta;
15370
+ if (!prevElement.isDeleted) {
15371
+ removed[prevElement.id] = delta;
15372
+ } else {
15373
+ updated[prevElement.id] = delta;
15374
+ }
15293
15375
  }
15294
15376
  }
15295
15377
  for (const nextElement of nextElements.values()) {
@@ -15301,15 +15383,18 @@ var ElementsDelta = class _ElementsDelta {
15301
15383
  versionNonce: randomInteger4()
15302
15384
  };
15303
15385
  const inserted = {
15304
- ...nextElement,
15305
- isDeleted: false
15386
+ ...nextElement
15306
15387
  };
15307
15388
  const delta = Delta.create(
15308
15389
  deleted,
15309
15390
  inserted,
15310
15391
  _ElementsDelta.stripIrrelevantProps
15311
15392
  );
15312
- added[nextElement.id] = delta;
15393
+ if (!nextElement.isDeleted) {
15394
+ added[nextElement.id] = delta;
15395
+ } else {
15396
+ updated[nextElement.id] = delta;
15397
+ }
15313
15398
  continue;
15314
15399
  }
15315
15400
  if (prevElement.versionNonce !== nextElement.versionNonce) {
@@ -15330,9 +15415,7 @@ var ElementsDelta = class _ElementsDelta {
15330
15415
  }
15331
15416
  continue;
15332
15417
  }
15333
- if (!Delta.isEmpty(delta)) {
15334
- updated[nextElement.id] = delta;
15335
- }
15418
+ updated[nextElement.id] = delta;
15336
15419
  }
15337
15420
  }
15338
15421
  return _ElementsDelta.create(added, removed, updated);
@@ -15422,26 +15505,30 @@ var ElementsDelta = class _ElementsDelta {
15422
15505
  // redistribute the deltas as `isDeleted` could have been updated
15423
15506
  });
15424
15507
  }
15425
- applyTo(elements, snapshot = StoreSnapshot.empty().elements, options = {
15426
- excludedProperties: /* @__PURE__ */ new Set()
15427
- }) {
15508
+ applyTo(elements, snapshot = StoreSnapshot.empty().elements, options) {
15428
15509
  let nextElements = new Map(elements);
15429
15510
  let changedElements;
15430
15511
  const flags = {
15431
15512
  containsVisibleDifference: false,
15432
- containsZindexDifference: false
15513
+ containsZindexDifference: false,
15514
+ applyDirection: void 0
15433
15515
  };
15434
15516
  try {
15435
15517
  const applyDeltas = _ElementsDelta.createApplier(
15518
+ elements,
15436
15519
  nextElements,
15437
15520
  snapshot,
15438
- options,
15439
- flags
15521
+ flags,
15522
+ options
15440
15523
  );
15441
15524
  const addedElements = applyDeltas(this.added);
15442
15525
  const removedElements = applyDeltas(this.removed);
15443
15526
  const updatedElements = applyDeltas(this.updated);
15444
- const affectedElements = this.resolveConflicts(elements, nextElements);
15527
+ const affectedElements = this.resolveConflicts(
15528
+ elements,
15529
+ nextElements,
15530
+ flags.applyDirection
15531
+ );
15445
15532
  changedElements = new Map([
15446
15533
  ...addedElements,
15447
15534
  ...removedElements,
@@ -15461,9 +15548,7 @@ var ElementsDelta = class _ElementsDelta {
15461
15548
  changedElements,
15462
15549
  flags
15463
15550
  );
15464
- const tempScene = new Scene(nextElements);
15465
- _ElementsDelta.redrawTextBoundingBoxes(tempScene, changedElements);
15466
- _ElementsDelta.redrawBoundArrows(tempScene, changedElements);
15551
+ _ElementsDelta.redrawElements(nextElements, changedElements);
15467
15552
  } catch (e) {
15468
15553
  console.error(
15469
15554
  `Couldn't mutate elements after applying elements change`,
@@ -15476,7 +15561,82 @@ var ElementsDelta = class _ElementsDelta {
15476
15561
  return [nextElements, flags.containsVisibleDifference];
15477
15562
  }
15478
15563
  }
15479
- static createApplier = (nextElements, snapshot, options, flags) => (deltas) => {
15564
+ squash(delta) {
15565
+ if (delta.isEmpty()) {
15566
+ return this;
15567
+ }
15568
+ const { added, removed, updated } = delta;
15569
+ const mergeBoundElements = (prevDelta, nextDelta) => {
15570
+ const mergedDeletedBoundElements = Delta.mergeArrays(
15571
+ prevDelta.deleted.boundElements ?? [],
15572
+ nextDelta.deleted.boundElements ?? [],
15573
+ void 0,
15574
+ (x) => x.id
15575
+ ) ?? [];
15576
+ const mergedInsertedBoundElements = Delta.mergeArrays(
15577
+ prevDelta.inserted.boundElements ?? [],
15578
+ nextDelta.inserted.boundElements ?? [],
15579
+ void 0,
15580
+ (x) => x.id
15581
+ ) ?? [];
15582
+ if (!mergedDeletedBoundElements.length && !mergedInsertedBoundElements.length) {
15583
+ return;
15584
+ }
15585
+ return Delta.create(
15586
+ {
15587
+ boundElements: mergedDeletedBoundElements
15588
+ },
15589
+ {
15590
+ boundElements: mergedInsertedBoundElements
15591
+ }
15592
+ );
15593
+ };
15594
+ for (const [id, nextDelta] of Object.entries(added)) {
15595
+ const prevDelta = this.added[id] ?? this.removed[id] ?? this.updated[id];
15596
+ if (!prevDelta) {
15597
+ this.added[id] = nextDelta;
15598
+ } else {
15599
+ const mergedDelta = mergeBoundElements(prevDelta, nextDelta);
15600
+ delete this.removed[id];
15601
+ delete this.updated[id];
15602
+ this.added[id] = Delta.merge(prevDelta, nextDelta, mergedDelta);
15603
+ }
15604
+ }
15605
+ for (const [id, nextDelta] of Object.entries(removed)) {
15606
+ const prevDelta = this.added[id] ?? this.removed[id] ?? this.updated[id];
15607
+ if (!prevDelta) {
15608
+ this.removed[id] = nextDelta;
15609
+ } else {
15610
+ const mergedDelta = mergeBoundElements(prevDelta, nextDelta);
15611
+ delete this.added[id];
15612
+ delete this.updated[id];
15613
+ this.removed[id] = Delta.merge(prevDelta, nextDelta, mergedDelta);
15614
+ }
15615
+ }
15616
+ for (const [id, nextDelta] of Object.entries(updated)) {
15617
+ const prevDelta = this.added[id] ?? this.removed[id] ?? this.updated[id];
15618
+ if (!prevDelta) {
15619
+ this.updated[id] = nextDelta;
15620
+ } else {
15621
+ const mergedDelta = mergeBoundElements(prevDelta, nextDelta);
15622
+ const updatedDelta = Delta.merge(prevDelta, nextDelta, mergedDelta);
15623
+ if (prevDelta === this.added[id]) {
15624
+ this.added[id] = updatedDelta;
15625
+ } else if (prevDelta === this.removed[id]) {
15626
+ this.removed[id] = updatedDelta;
15627
+ } else {
15628
+ this.updated[id] = updatedDelta;
15629
+ }
15630
+ }
15631
+ }
15632
+ if (isTestEnv8() || isDevEnv7()) {
15633
+ _ElementsDelta.validate(this, "added", _ElementsDelta.satisfiesAddition);
15634
+ _ElementsDelta.validate(this, "removed", _ElementsDelta.satisfiesRemoval);
15635
+ _ElementsDelta.validate(this, "updated", _ElementsDelta.satisfiesUpdate);
15636
+ }
15637
+ return this;
15638
+ }
15639
+ static createApplier = (prevElements, nextElements, snapshot, flags, options) => (deltas) => {
15480
15640
  const getElement = _ElementsDelta.createGetter(
15481
15641
  nextElements,
15482
15642
  snapshot,
@@ -15485,14 +15645,20 @@ var ElementsDelta = class _ElementsDelta {
15485
15645
  return Object.entries(deltas).reduce((acc, [id, delta]) => {
15486
15646
  const element = getElement(id, delta.inserted);
15487
15647
  if (element) {
15488
- const newElement2 = _ElementsDelta.applyDelta(
15648
+ const nextElement = _ElementsDelta.applyDelta(
15489
15649
  element,
15490
15650
  delta,
15491
- options,
15492
- flags
15651
+ flags,
15652
+ options
15493
15653
  );
15494
- nextElements.set(newElement2.id, newElement2);
15495
- acc.set(newElement2.id, newElement2);
15654
+ nextElements.set(nextElement.id, nextElement);
15655
+ acc.set(nextElement.id, nextElement);
15656
+ if (!flags.applyDirection) {
15657
+ const prevElement = prevElements.get(id);
15658
+ if (prevElement) {
15659
+ flags.applyDirection = prevElement.version > nextElement.version ? "backward" : "forward";
15660
+ }
15661
+ }
15496
15662
  }
15497
15663
  return acc;
15498
15664
  }, /* @__PURE__ */ new Map());
@@ -15517,13 +15683,13 @@ var ElementsDelta = class _ElementsDelta {
15517
15683
  }
15518
15684
  return element;
15519
15685
  };
15520
- static applyDelta(element, delta, options, flags) {
15686
+ static applyDelta(element, delta, flags, options) {
15521
15687
  const directlyApplicablePartial = {};
15522
15688
  for (const key of Object.keys(delta.inserted)) {
15523
15689
  if (key === "boundElements") {
15524
15690
  continue;
15525
15691
  }
15526
- if (options.excludedProperties.has(key)) {
15692
+ if (options?.excludedProperties?.has(key)) {
15527
15693
  continue;
15528
15694
  }
15529
15695
  const value = delta.inserted[key];
@@ -15551,7 +15717,7 @@ var ElementsDelta = class _ElementsDelta {
15551
15717
  if (!flags.containsZindexDifference) {
15552
15718
  flags.containsZindexDifference = delta.deleted.index !== delta.inserted.index;
15553
15719
  }
15554
- return newElementWith(element, directlyApplicablePartial);
15720
+ return newElementWith(element, directlyApplicablePartial, true);
15555
15721
  }
15556
15722
  /**
15557
15723
  * Check for visible changes regardless of whether they were removed, added or updated.
@@ -15576,25 +15742,32 @@ var ElementsDelta = class _ElementsDelta {
15576
15742
  *
15577
15743
  * @returns all elements affected by the conflict resolution
15578
15744
  */
15579
- resolveConflicts(prevElements, nextElements) {
15745
+ resolveConflicts(prevElements, nextElements, applyDirection = "forward") {
15580
15746
  const nextAffectedElements = /* @__PURE__ */ new Map();
15581
15747
  const updater = (element, updates) => {
15582
15748
  const nextElement = nextElements.get(element.id);
15583
15749
  if (!nextElement) {
15584
15750
  return;
15585
15751
  }
15752
+ const prevElement = prevElements.get(element.id);
15753
+ const nextVersion = applyDirection === "forward" ? nextElement.version + 1 : nextElement.version - 1;
15754
+ const elementUpdates = updates;
15586
15755
  let affectedElement;
15587
- if (prevElements.get(element.id) === nextElement) {
15756
+ if (prevElement === nextElement) {
15588
15757
  affectedElement = newElementWith(
15589
15758
  nextElement,
15590
- updates
15759
+ {
15760
+ ...elementUpdates,
15761
+ version: nextVersion
15762
+ },
15763
+ true
15591
15764
  );
15592
15765
  } else {
15593
- affectedElement = mutateElement(
15594
- nextElement,
15595
- nextElements,
15596
- updates
15597
- );
15766
+ affectedElement = mutateElement(nextElement, nextElements, {
15767
+ ...elementUpdates,
15768
+ // don't modify the version further, if it's already different
15769
+ version: prevElement?.version !== nextElement.version ? nextElement.version : nextVersion
15770
+ });
15598
15771
  }
15599
15772
  nextAffectedElements.set(affectedElement.id, affectedElement);
15600
15773
  nextElements.set(affectedElement.id, affectedElement);
@@ -15619,31 +15792,10 @@ var ElementsDelta = class _ElementsDelta {
15619
15792
  const prevAffectedElements = new Map(
15620
15793
  Array.from(prevElements).filter(([id]) => nextAffectedElements.has(id))
15621
15794
  );
15622
- const { added, removed, updated } = _ElementsDelta.calculate(
15623
- prevAffectedElements,
15624
- nextAffectedElements
15795
+ this.squash(
15796
+ // technically we could do better here if perf. would become an issue
15797
+ _ElementsDelta.calculate(prevAffectedElements, nextAffectedElements)
15625
15798
  );
15626
- for (const [id, delta] of Object.entries(added)) {
15627
- this.added[id] = {
15628
- // merge with the existing delta, if exists
15629
- ...this.added[id],
15630
- ...delta
15631
- };
15632
- }
15633
- for (const [id, delta] of Object.entries(removed)) {
15634
- this.removed[id] = {
15635
- // merge with the existing delta, if exists
15636
- ...this.removed[id],
15637
- ...delta
15638
- };
15639
- }
15640
- for (const [id, delta] of Object.entries(updated)) {
15641
- this.updated[id] = {
15642
- // merge with the existing delta, if exists
15643
- ...this.updated[id],
15644
- ...delta
15645
- };
15646
- }
15647
15799
  return nextAffectedElements;
15648
15800
  }
15649
15801
  /**
@@ -15678,6 +15830,20 @@ var ElementsDelta = class _ElementsDelta {
15678
15830
  );
15679
15831
  BindableElement.rebindAffected(nextElements, nextElement(), updater);
15680
15832
  }
15833
+ static redrawElements(nextElements, changedElements) {
15834
+ try {
15835
+ const tempScene = new Scene(nextElements, { skipValidation: true });
15836
+ _ElementsDelta.redrawTextBoundingBoxes(tempScene, changedElements);
15837
+ _ElementsDelta.redrawBoundArrows(tempScene, changedElements);
15838
+ } catch (e) {
15839
+ console.error(`Couldn't redraw elements`, e);
15840
+ if (isTestEnv8() || isDevEnv7()) {
15841
+ throw e;
15842
+ }
15843
+ } finally {
15844
+ return nextElements;
15845
+ }
15846
+ }
15681
15847
  static redrawTextBoundingBoxes(scene, changed) {
15682
15848
  const elements = scene.getNonDeletedElementsMap();
15683
15849
  const boxesToRedraw = /* @__PURE__ */ new Map();
@@ -16769,8 +16935,8 @@ var embeddableURLValidator = (url, validateEmbeddable) => {
16769
16935
 
16770
16936
  // src/flowchart.ts
16771
16937
  init_define_import_meta_env();
16772
- import { KEYS as KEYS3, invariant as invariant9, toBrandedType as toBrandedType2 } from "@excalidraw/common";
16773
- import { pointFrom as pointFrom13 } from "@excalidraw/math";
16938
+ import { KEYS as KEYS3, invariant as invariant8, toBrandedType as toBrandedType2 } from "@excalidraw/common";
16939
+ import { pointFrom as pointFrom14 } from "@excalidraw/math";
16774
16940
  var VERTICAL_OFFSET = 100;
16775
16941
  var HORIZONTAL_OFFSET = 100;
16776
16942
  var getLinkDirectionFromKey = (key) => {
@@ -16799,7 +16965,7 @@ var getNodeRelatives = (type, node, elementsMap, direction) => {
16799
16965
  if (!relative) {
16800
16966
  return acc;
16801
16967
  }
16802
- invariant9(
16968
+ invariant8(
16803
16969
  isBindableElement(relative),
16804
16970
  "not an ExcalidrawBindableElement"
16805
16971
  );
@@ -16915,7 +17081,7 @@ var addNewNode = (element, appState, direction, scene) => {
16915
17081
  fillStyle: element.fillStyle,
16916
17082
  strokeStyle: element.strokeStyle
16917
17083
  });
16918
- invariant9(
17084
+ invariant8(
16919
17085
  isFlowchartNodeElement(nextNode),
16920
17086
  "not an ExcalidrawFlowchartNodeElement"
16921
17087
  );
@@ -16973,7 +17139,7 @@ var addNewNodes = (startNode, appState, direction, scene, numberOfNodes) => {
16973
17139
  fillStyle: startNode.fillStyle,
16974
17140
  strokeStyle: startNode.strokeStyle
16975
17141
  });
16976
- invariant9(
17142
+ invariant8(
16977
17143
  isFlowchartNodeElement(nextNode),
16978
17144
  "not an ExcalidrawFlowchartNodeElement"
16979
17145
  );
@@ -17050,7 +17216,7 @@ var createBindingArrow = (startBindingElement, endBindingElement, direction, app
17050
17216
  strokeWidth: startBindingElement.strokeWidth,
17051
17217
  opacity: startBindingElement.opacity,
17052
17218
  roughness: startBindingElement.roughness,
17053
- points: [pointFrom13(0, 0), pointFrom13(endX, endY)],
17219
+ points: [pointFrom14(0, 0), pointFrom14(endX, endY)],
17054
17220
  elbowed: true
17055
17221
  });
17056
17222
  const elementsMap = scene.getNonDeletedElementsMap();
@@ -17199,7 +17365,7 @@ var FlowChartCreator = class {
17199
17365
  }
17200
17366
  if (startNode.frameId) {
17201
17367
  const frame = elementsMap.get(startNode.frameId);
17202
- invariant9(
17368
+ invariant8(
17203
17369
  frame && isFrameElement(frame),
17204
17370
  "not an ExcalidrawFrameElement"
17205
17371
  );
@@ -17334,13 +17500,80 @@ var normalizeSVG = (SVGString) => {
17334
17500
  }
17335
17501
  };
17336
17502
 
17503
+ // src/positionElementsOnGrid.ts
17504
+ init_define_import_meta_env();
17505
+ var positionElementsOnGrid = (elements, centerX, centerY, padding = 50) => {
17506
+ if (!elements || elements.length === 0) {
17507
+ return [];
17508
+ }
17509
+ const res = [];
17510
+ const atomicUnits = Array.isArray(elements[0]) ? elements : elements.map((element) => [element]);
17511
+ const numUnits = atomicUnits.length;
17512
+ const numColumns = Math.max(1, Math.ceil(Math.sqrt(numUnits)));
17513
+ const rows = [];
17514
+ for (let i = 0; i < numUnits; i += numColumns) {
17515
+ rows.push(atomicUnits.slice(i, i + numColumns));
17516
+ }
17517
+ let totalGridActualHeight = 0;
17518
+ const rowProperties = rows.map((rowUnits) => {
17519
+ let rowWidth = 0;
17520
+ let maxUnitHeightInRow = 0;
17521
+ const unitBounds = rowUnits.map((unit) => {
17522
+ const [minX, minY, maxX, maxY] = getCommonBounds(unit);
17523
+ return {
17524
+ elements: unit,
17525
+ bounds: [minX, minY, maxX, maxY],
17526
+ width: maxX - minX,
17527
+ height: maxY - minY
17528
+ };
17529
+ });
17530
+ unitBounds.forEach((unitBound, index) => {
17531
+ rowWidth += unitBound.width;
17532
+ if (index < unitBounds.length - 1) {
17533
+ rowWidth += padding;
17534
+ }
17535
+ if (unitBound.height > maxUnitHeightInRow) {
17536
+ maxUnitHeightInRow = unitBound.height;
17537
+ }
17538
+ });
17539
+ totalGridActualHeight += maxUnitHeightInRow;
17540
+ return {
17541
+ unitBounds,
17542
+ width: rowWidth,
17543
+ maxHeight: maxUnitHeightInRow
17544
+ };
17545
+ });
17546
+ const totalGridHeightWithPadding = totalGridActualHeight + Math.max(0, rows.length - 1) * padding;
17547
+ let currentY = centerY - totalGridHeightWithPadding / 2;
17548
+ rowProperties.forEach((rowProp) => {
17549
+ const { unitBounds, width: rowWidth, maxHeight: rowMaxHeight } = rowProp;
17550
+ let currentX = centerX - rowWidth / 2;
17551
+ unitBounds.forEach((unitBound) => {
17552
+ const [originalMinX, originalMinY] = unitBound.bounds;
17553
+ const offsetX = currentX - originalMinX;
17554
+ const offsetY = currentY - originalMinY;
17555
+ unitBound.elements.forEach((element) => {
17556
+ res.push(
17557
+ newElementWith(element, {
17558
+ x: element.x + offsetX,
17559
+ y: element.y + offsetY
17560
+ })
17561
+ );
17562
+ });
17563
+ currentX += unitBound.width + padding;
17564
+ });
17565
+ currentY += rowMaxHeight + padding;
17566
+ });
17567
+ return res;
17568
+ };
17569
+
17337
17570
  // src/resizeElements.ts
17338
17571
  init_define_import_meta_env();
17339
17572
  import {
17340
17573
  pointCenter as pointCenter3,
17341
17574
  normalizeRadians as normalizeRadians2,
17342
- pointFrom as pointFrom14,
17343
- pointRotateRads as pointRotateRads11
17575
+ pointFrom as pointFrom15,
17576
+ pointRotateRads as pointRotateRads12
17344
17577
  } from "@excalidraw/math";
17345
17578
  import {
17346
17579
  MIN_FONT_SIZE,
@@ -17468,7 +17701,16 @@ var rotateSingleElement = (element, scene, pointerX, pointerY, shouldRotateWithD
17468
17701
  if (boundTextElementId) {
17469
17702
  const textElement = scene.getElement(boundTextElementId);
17470
17703
  if (textElement && !isArrowElement(element)) {
17471
- scene.mutateElement(textElement, { angle });
17704
+ const { x, y } = computeBoundTextPosition(
17705
+ element,
17706
+ textElement,
17707
+ scene.getNonDeletedElementsMap()
17708
+ );
17709
+ scene.mutateElement(textElement, {
17710
+ angle,
17711
+ x,
17712
+ y
17713
+ });
17472
17714
  }
17473
17715
  }
17474
17716
  };
@@ -17505,7 +17747,7 @@ var resizeSingleTextElement = (origElement, element, scene, transformHandleType,
17505
17747
  return;
17506
17748
  }
17507
17749
  if (transformHandleType.includes("n") || transformHandleType.includes("s")) {
17508
- const previousOrigin = pointFrom14(origElement.x, origElement.y);
17750
+ const previousOrigin = pointFrom15(origElement.x, origElement.y);
17509
17751
  const newOrigin = getResizedOrigin(
17510
17752
  previousOrigin,
17511
17753
  origElement.width,
@@ -17546,7 +17788,7 @@ var resizeSingleTextElement = (origElement, element, scene, transformHandleType,
17546
17788
  element.lineHeight
17547
17789
  );
17548
17790
  const newHeight = metrics2.height;
17549
- const previousOrigin = pointFrom14(origElement.x, origElement.y);
17791
+ const previousOrigin = pointFrom15(origElement.x, origElement.y);
17550
17792
  const newOrigin = getResizedOrigin(
17551
17793
  previousOrigin,
17552
17794
  origElement.width,
@@ -17582,9 +17824,9 @@ var rotateMultipleElements = (originalElements, elements, scene, pointerX, point
17582
17824
  const cx = (x1 + x2) / 2;
17583
17825
  const cy = (y1 + y2) / 2;
17584
17826
  const origAngle = originalElements.get(element.id)?.angle ?? element.angle;
17585
- const [rotatedCX, rotatedCY] = pointRotateRads11(
17586
- pointFrom14(cx, cy),
17587
- pointFrom14(centerX, centerY),
17827
+ const [rotatedCX, rotatedCY] = pointRotateRads12(
17828
+ pointFrom15(cx, cy),
17829
+ pointFrom15(centerX, centerY),
17588
17830
  centerAngle + origAngle - element.angle
17589
17831
  );
17590
17832
  const updates = isElbowArrow(element) ? {
@@ -17601,9 +17843,14 @@ var rotateMultipleElements = (originalElements, elements, scene, pointerX, point
17601
17843
  });
17602
17844
  const boundText = getBoundTextElement(element, elementsMap);
17603
17845
  if (boundText && !isArrowElement(element)) {
17846
+ const { x, y } = computeBoundTextPosition(
17847
+ element,
17848
+ boundText,
17849
+ elementsMap
17850
+ );
17604
17851
  scene.mutateElement(boundText, {
17605
- x: boundText.x + (rotatedCX - cx),
17606
- y: boundText.y + (rotatedCY - cy),
17852
+ x,
17853
+ y,
17607
17854
  angle: normalizeRadians2(centerAngle + origAngle)
17608
17855
  });
17609
17856
  }
@@ -17616,44 +17863,44 @@ var getResizeOffsetXY = (transformHandleType, selectedElements, elementsMap, x,
17616
17863
  const cx = (x1 + x2) / 2;
17617
17864
  const cy = (y1 + y2) / 2;
17618
17865
  const angle = selectedElements.length === 1 ? selectedElements[0].angle : 0;
17619
- [x, y] = pointRotateRads11(
17620
- pointFrom14(x, y),
17621
- pointFrom14(cx, cy),
17866
+ [x, y] = pointRotateRads12(
17867
+ pointFrom15(x, y),
17868
+ pointFrom15(cx, cy),
17622
17869
  -angle
17623
17870
  );
17624
17871
  switch (transformHandleType) {
17625
17872
  case "n":
17626
- return pointRotateRads11(
17627
- pointFrom14(x - (x1 + x2) / 2, y - y1),
17628
- pointFrom14(0, 0),
17873
+ return pointRotateRads12(
17874
+ pointFrom15(x - (x1 + x2) / 2, y - y1),
17875
+ pointFrom15(0, 0),
17629
17876
  angle
17630
17877
  );
17631
17878
  case "s":
17632
- return pointRotateRads11(
17633
- pointFrom14(x - (x1 + x2) / 2, y - y2),
17634
- pointFrom14(0, 0),
17879
+ return pointRotateRads12(
17880
+ pointFrom15(x - (x1 + x2) / 2, y - y2),
17881
+ pointFrom15(0, 0),
17635
17882
  angle
17636
17883
  );
17637
17884
  case "w":
17638
- return pointRotateRads11(
17639
- pointFrom14(x - x1, y - (y1 + y2) / 2),
17640
- pointFrom14(0, 0),
17885
+ return pointRotateRads12(
17886
+ pointFrom15(x - x1, y - (y1 + y2) / 2),
17887
+ pointFrom15(0, 0),
17641
17888
  angle
17642
17889
  );
17643
17890
  case "e":
17644
- return pointRotateRads11(
17645
- pointFrom14(x - x2, y - (y1 + y2) / 2),
17646
- pointFrom14(0, 0),
17891
+ return pointRotateRads12(
17892
+ pointFrom15(x - x2, y - (y1 + y2) / 2),
17893
+ pointFrom15(0, 0),
17647
17894
  angle
17648
17895
  );
17649
17896
  case "nw":
17650
- return pointRotateRads11(pointFrom14(x - x1, y - y1), pointFrom14(0, 0), angle);
17897
+ return pointRotateRads12(pointFrom15(x - x1, y - y1), pointFrom15(0, 0), angle);
17651
17898
  case "ne":
17652
- return pointRotateRads11(pointFrom14(x - x2, y - y1), pointFrom14(0, 0), angle);
17899
+ return pointRotateRads12(pointFrom15(x - x2, y - y1), pointFrom15(0, 0), angle);
17653
17900
  case "sw":
17654
- return pointRotateRads11(pointFrom14(x - x1, y - y2), pointFrom14(0, 0), angle);
17901
+ return pointRotateRads12(pointFrom15(x - x1, y - y2), pointFrom15(0, 0), angle);
17655
17902
  case "se":
17656
- return pointRotateRads11(pointFrom14(x - x2, y - y2), pointFrom14(0, 0), angle);
17903
+ return pointRotateRads12(pointFrom15(x - x2, y - y2), pointFrom15(0, 0), angle);
17657
17904
  default:
17658
17905
  return [0, 0];
17659
17906
  }
@@ -17816,10 +18063,10 @@ var resizeSingleElement = (nextWidth, nextHeight, latestElement, origElement, or
17816
18063
  nextHeight,
17817
18064
  true
17818
18065
  );
17819
- let previousOrigin = pointFrom14(origElement.x, origElement.y);
18066
+ let previousOrigin = pointFrom15(origElement.x, origElement.y);
17820
18067
  if (isLinearElement(origElement)) {
17821
18068
  const [x1, y1] = getElementBounds(origElement, originalElementsMap);
17822
- previousOrigin = pointFrom14(x1, y1);
18069
+ previousOrigin = pointFrom15(x1, y1);
17823
18070
  }
17824
18071
  const newOrigin = getResizedOrigin(
17825
18072
  previousOrigin,
@@ -17842,7 +18089,7 @@ var resizeSingleElement = (nextWidth, nextHeight, latestElement, origElement, or
17842
18089
  newOrigin.x += scaledX;
17843
18090
  newOrigin.y += scaledY;
17844
18091
  rescaledPoints.points = rescaledPoints.points.map(
17845
- (p) => pointFrom14(p[0] - scaledX, p[1] - scaledY)
18092
+ (p) => pointFrom15(p[0] - scaledX, p[1] - scaledY)
17846
18093
  );
17847
18094
  }
17848
18095
  if (nextWidth < 0) {
@@ -17905,11 +18152,11 @@ var getNextSingleWidthAndHeightFromPointer = (latestElement, origElement, handle
17905
18152
  origElement.height,
17906
18153
  true
17907
18154
  );
17908
- const startTopLeft = pointFrom14(x1, y1);
17909
- const startBottomRight = pointFrom14(x2, y2);
18155
+ const startTopLeft = pointFrom15(x1, y1);
18156
+ const startBottomRight = pointFrom15(x2, y2);
17910
18157
  const startCenter = pointCenter3(startTopLeft, startBottomRight);
17911
- const rotatedPointer = pointRotateRads11(
17912
- pointFrom14(pointerX, pointerY),
18158
+ const rotatedPointer = pointRotateRads12(
18159
+ pointFrom15(pointerX, pointerY),
17913
18160
  startCenter,
17914
18161
  -origElement.angle
17915
18162
  );
@@ -18267,9 +18514,9 @@ var resizeMultipleElements = (selectedElements, elementsMap, handleDirection, sc
18267
18514
  // src/resizeTest.ts
18268
18515
  init_define_import_meta_env();
18269
18516
  import {
18270
- pointFrom as pointFrom16,
18517
+ pointFrom as pointFrom17,
18271
18518
  pointOnLineSegment,
18272
- pointRotateRads as pointRotateRads13
18519
+ pointRotateRads as pointRotateRads14
18273
18520
  } from "@excalidraw/math";
18274
18521
  import { SIDE_RESIZING_THRESHOLD } from "@excalidraw/common";
18275
18522
 
@@ -18280,7 +18527,7 @@ import {
18280
18527
  isAndroid,
18281
18528
  isIOS
18282
18529
  } from "@excalidraw/common";
18283
- import { pointFrom as pointFrom15, pointRotateRads as pointRotateRads12 } from "@excalidraw/math";
18530
+ import { pointFrom as pointFrom16, pointRotateRads as pointRotateRads13 } from "@excalidraw/math";
18284
18531
  var transformHandleSizes = {
18285
18532
  mouse: 8,
18286
18533
  pen: 16,
@@ -18321,9 +18568,9 @@ var OMIT_SIDES_FOR_LINE_BACKSLASH = {
18321
18568
  w: true
18322
18569
  };
18323
18570
  var generateTransformHandle = (x, y, width, height, cx, cy, angle) => {
18324
- const [xx, yy] = pointRotateRads12(
18325
- pointFrom15(x + width / 2, y + height / 2),
18326
- pointFrom15(cx, cy),
18571
+ const [xx, yy] = pointRotateRads13(
18572
+ pointFrom16(x + width / 2, y + height / 2),
18573
+ pointFrom16(cx, cy),
18327
18574
  angle
18328
18575
  );
18329
18576
  return [xx - width / 2, yy - height / 2, width, height];
@@ -18540,14 +18787,14 @@ var resizeTest = (element, elementsMap, appState, x, y, zoom, pointerType, devic
18540
18787
  const SPACING = isImageElement(element) ? 0 : SIDE_RESIZING_THRESHOLD / zoom.value;
18541
18788
  const ZOOMED_SIDE_RESIZING_THRESHOLD = SIDE_RESIZING_THRESHOLD / zoom.value;
18542
18789
  const sides = getSelectionBorders(
18543
- pointFrom16(x1 - SPACING, y1 - SPACING),
18544
- pointFrom16(x2 + SPACING, y2 + SPACING),
18545
- pointFrom16(cx, cy),
18790
+ pointFrom17(x1 - SPACING, y1 - SPACING),
18791
+ pointFrom17(x2 + SPACING, y2 + SPACING),
18792
+ pointFrom17(cx, cy),
18546
18793
  element.angle
18547
18794
  );
18548
18795
  for (const [dir, side] of Object.entries(sides)) {
18549
18796
  if (pointOnLineSegment(
18550
- pointFrom16(x, y),
18797
+ pointFrom17(x, y),
18551
18798
  side,
18552
18799
  ZOOMED_SIDE_RESIZING_THRESHOLD
18553
18800
  )) {
@@ -18596,14 +18843,14 @@ var getTransformHandleTypeFromCoords = ([x1, y1, x2, y2], scenePointerX, scenePo
18596
18843
  const cy = (y1 + y2) / 2;
18597
18844
  const SPACING = SIDE_RESIZING_THRESHOLD / zoom.value;
18598
18845
  const sides = getSelectionBorders(
18599
- pointFrom16(x1 - SPACING, y1 - SPACING),
18600
- pointFrom16(x2 + SPACING, y2 + SPACING),
18601
- pointFrom16(cx, cy),
18846
+ pointFrom17(x1 - SPACING, y1 - SPACING),
18847
+ pointFrom17(x2 + SPACING, y2 + SPACING),
18848
+ pointFrom17(cx, cy),
18602
18849
  0
18603
18850
  );
18604
18851
  for (const [dir, side] of Object.entries(sides)) {
18605
18852
  if (pointOnLineSegment(
18606
- pointFrom16(scenePointerX, scenePointerY),
18853
+ pointFrom17(scenePointerX, scenePointerY),
18607
18854
  side,
18608
18855
  SPACING
18609
18856
  )) {
@@ -18660,10 +18907,10 @@ var getCursorForResizingElement = (resizingElement) => {
18660
18907
  return cursor ? `${cursor}-resize` : "";
18661
18908
  };
18662
18909
  var getSelectionBorders = ([x1, y1], [x2, y2], center, angle) => {
18663
- const topLeft = pointRotateRads13(pointFrom16(x1, y1), center, angle);
18664
- const topRight = pointRotateRads13(pointFrom16(x2, y1), center, angle);
18665
- const bottomLeft = pointRotateRads13(pointFrom16(x1, y2), center, angle);
18666
- const bottomRight = pointRotateRads13(pointFrom16(x2, y2), center, angle);
18910
+ const topLeft = pointRotateRads14(pointFrom17(x1, y1), center, angle);
18911
+ const topRight = pointRotateRads14(pointFrom17(x2, y1), center, angle);
18912
+ const bottomLeft = pointRotateRads14(pointFrom17(x1, y2), center, angle);
18913
+ const bottomRight = pointRotateRads14(pointFrom17(x2, y2), center, angle);
18667
18914
  return {
18668
18915
  n: [topLeft, topRight],
18669
18916
  e: [topRight, bottomRight],
@@ -19369,6 +19616,7 @@ export {
19369
19616
  parseTokens,
19370
19617
  pathsCache,
19371
19618
  pointInsideBounds,
19619
+ positionElementsOnGrid,
19372
19620
  redrawTextBoundingBox,
19373
19621
  refreshTextDimensions,
19374
19622
  removeAllElementsFromFrame,