@excalidraw/element 0.18.0-6d870b1c8 → 0.18.0-7b8a5f54c

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
@@ -13533,10 +13533,20 @@ var StoreDelta = class {
13533
13533
  */
13534
13534
  static load({
13535
13535
  id,
13536
- elements: { added, removed, updated }
13536
+ elements: { added, removed, updated },
13537
+ appState: { delta: appStateDelta }
13537
13538
  }) {
13538
13539
  const elements = ElementsDelta.create(added, removed, updated);
13539
- return new this(id, elements, AppStateDelta.empty());
13540
+ const appState = AppStateDelta.create(appStateDelta);
13541
+ return new this(id, elements, appState);
13542
+ }
13543
+ /**
13544
+ * Squash the passed delta into the current instance.
13545
+ */
13546
+ squash(delta) {
13547
+ this.elements.squash(delta.elements);
13548
+ this.appState.squash(delta.appState);
13549
+ return this;
13540
13550
  }
13541
13551
  /**
13542
13552
  * Inverse store delta, creates new instance of `StoreDelta`.
@@ -13547,9 +13557,7 @@ var StoreDelta = class {
13547
13557
  /**
13548
13558
  * Apply the delta to the passed elements and appState, does not modify the snapshot.
13549
13559
  */
13550
- static applyTo(delta, elements, appState, options = {
13551
- excludedProperties: /* @__PURE__ */ new Set()
13552
- }) {
13560
+ static applyTo(delta, elements, appState, options) {
13553
13561
  const [nextElements, elementsContainVisibleChange] = delta.elements.applyTo(
13554
13562
  elements,
13555
13563
  StoreSnapshot.empty().elements,
@@ -14398,9 +14406,9 @@ var Scene = class {
14398
14406
  getFramesIncludingDeleted() {
14399
14407
  return this.frames;
14400
14408
  }
14401
- constructor(elements = null) {
14409
+ constructor(elements = null, options) {
14402
14410
  if (elements) {
14403
- this.replaceAllElements(elements);
14411
+ this.replaceAllElements(elements, options);
14404
14412
  }
14405
14413
  }
14406
14414
  getSelectedElements(opts) {
@@ -14465,10 +14473,12 @@ var Scene = class {
14465
14473
  }
14466
14474
  return didChange;
14467
14475
  }
14468
- replaceAllElements(nextElements) {
14476
+ replaceAllElements(nextElements, options) {
14469
14477
  const _nextElements = toArray(nextElements);
14470
14478
  const nextFrameLikes = [];
14471
- validateIndicesThrottled(_nextElements);
14479
+ if (!options?.skipValidation) {
14480
+ validateIndicesThrottled(_nextElements);
14481
+ }
14472
14482
  this.elements = syncInvalidIndices2(_nextElements);
14473
14483
  this.elementsMap.clear();
14474
14484
  this.elements.forEach((element) => {
@@ -14871,6 +14881,9 @@ var AppStateDelta = class _AppStateDelta {
14871
14881
  constructor(delta) {
14872
14882
  this.delta = delta;
14873
14883
  }
14884
+ static create(delta) {
14885
+ return new _AppStateDelta(delta);
14886
+ }
14874
14887
  static calculate(prevAppState, nextAppState) {
14875
14888
  const delta = Delta.calculate(
14876
14889
  prevAppState,
@@ -15407,26 +15420,30 @@ var ElementsDelta = class _ElementsDelta {
15407
15420
  // redistribute the deltas as `isDeleted` could have been updated
15408
15421
  });
15409
15422
  }
15410
- applyTo(elements, snapshot = StoreSnapshot.empty().elements, options = {
15411
- excludedProperties: /* @__PURE__ */ new Set()
15412
- }) {
15423
+ applyTo(elements, snapshot = StoreSnapshot.empty().elements, options) {
15413
15424
  let nextElements = new Map(elements);
15414
15425
  let changedElements;
15415
15426
  const flags = {
15416
15427
  containsVisibleDifference: false,
15417
- containsZindexDifference: false
15428
+ containsZindexDifference: false,
15429
+ applyDirection: void 0
15418
15430
  };
15419
15431
  try {
15420
15432
  const applyDeltas = _ElementsDelta.createApplier(
15433
+ elements,
15421
15434
  nextElements,
15422
15435
  snapshot,
15423
- options,
15424
- flags
15436
+ flags,
15437
+ options
15425
15438
  );
15426
15439
  const addedElements = applyDeltas(this.added);
15427
15440
  const removedElements = applyDeltas(this.removed);
15428
15441
  const updatedElements = applyDeltas(this.updated);
15429
- const affectedElements = this.resolveConflicts(elements, nextElements);
15442
+ const affectedElements = this.resolveConflicts(
15443
+ elements,
15444
+ nextElements,
15445
+ flags.applyDirection
15446
+ );
15430
15447
  changedElements = new Map([
15431
15448
  ...addedElements,
15432
15449
  ...removedElements,
@@ -15446,9 +15463,7 @@ var ElementsDelta = class _ElementsDelta {
15446
15463
  changedElements,
15447
15464
  flags
15448
15465
  );
15449
- const tempScene = new Scene(nextElements);
15450
- _ElementsDelta.redrawTextBoundingBoxes(tempScene, changedElements);
15451
- _ElementsDelta.redrawBoundArrows(tempScene, changedElements);
15466
+ _ElementsDelta.redrawElements(nextElements, changedElements);
15452
15467
  } catch (e) {
15453
15468
  console.error(
15454
15469
  `Couldn't mutate elements after applying elements change`,
@@ -15489,7 +15504,7 @@ var ElementsDelta = class _ElementsDelta {
15489
15504
  }
15490
15505
  return this;
15491
15506
  }
15492
- static createApplier = (nextElements, snapshot, options, flags) => (deltas) => {
15507
+ static createApplier = (prevElements, nextElements, snapshot, flags, options) => (deltas) => {
15493
15508
  const getElement = _ElementsDelta.createGetter(
15494
15509
  nextElements,
15495
15510
  snapshot,
@@ -15498,14 +15513,20 @@ var ElementsDelta = class _ElementsDelta {
15498
15513
  return Object.entries(deltas).reduce((acc, [id, delta]) => {
15499
15514
  const element = getElement(id, delta.inserted);
15500
15515
  if (element) {
15501
- const newElement2 = _ElementsDelta.applyDelta(
15516
+ const nextElement = _ElementsDelta.applyDelta(
15502
15517
  element,
15503
15518
  delta,
15504
- options,
15505
- flags
15519
+ flags,
15520
+ options
15506
15521
  );
15507
- nextElements.set(newElement2.id, newElement2);
15508
- acc.set(newElement2.id, newElement2);
15522
+ nextElements.set(nextElement.id, nextElement);
15523
+ acc.set(nextElement.id, nextElement);
15524
+ if (!flags.applyDirection) {
15525
+ const prevElement = prevElements.get(id);
15526
+ if (prevElement) {
15527
+ flags.applyDirection = prevElement.version > nextElement.version ? "backward" : "forward";
15528
+ }
15529
+ }
15509
15530
  }
15510
15531
  return acc;
15511
15532
  }, /* @__PURE__ */ new Map());
@@ -15530,13 +15551,13 @@ var ElementsDelta = class _ElementsDelta {
15530
15551
  }
15531
15552
  return element;
15532
15553
  };
15533
- static applyDelta(element, delta, options, flags) {
15554
+ static applyDelta(element, delta, flags, options) {
15534
15555
  const directlyApplicablePartial = {};
15535
15556
  for (const key of Object.keys(delta.inserted)) {
15536
15557
  if (key === "boundElements") {
15537
15558
  continue;
15538
15559
  }
15539
- if (options.excludedProperties.has(key)) {
15560
+ if (options?.excludedProperties?.has(key)) {
15540
15561
  continue;
15541
15562
  }
15542
15563
  const value = delta.inserted[key];
@@ -15564,7 +15585,7 @@ var ElementsDelta = class _ElementsDelta {
15564
15585
  if (!flags.containsZindexDifference) {
15565
15586
  flags.containsZindexDifference = delta.deleted.index !== delta.inserted.index;
15566
15587
  }
15567
- return newElementWith(element, directlyApplicablePartial);
15588
+ return newElementWith(element, directlyApplicablePartial, true);
15568
15589
  }
15569
15590
  /**
15570
15591
  * Check for visible changes regardless of whether they were removed, added or updated.
@@ -15589,25 +15610,31 @@ var ElementsDelta = class _ElementsDelta {
15589
15610
  *
15590
15611
  * @returns all elements affected by the conflict resolution
15591
15612
  */
15592
- resolveConflicts(prevElements, nextElements) {
15613
+ resolveConflicts(prevElements, nextElements, applyDirection = "forward") {
15593
15614
  const nextAffectedElements = /* @__PURE__ */ new Map();
15594
15615
  const updater = (element, updates) => {
15595
15616
  const nextElement = nextElements.get(element.id);
15596
15617
  if (!nextElement) {
15597
15618
  return;
15598
15619
  }
15620
+ const prevElement = prevElements.get(element.id);
15621
+ const elementUpdates = updates;
15599
15622
  let affectedElement;
15600
- if (prevElements.get(element.id) === nextElement) {
15623
+ if (prevElement === nextElement) {
15601
15624
  affectedElement = newElementWith(
15602
15625
  nextElement,
15603
- updates
15626
+ {
15627
+ ...elementUpdates,
15628
+ version: applyDirection === "forward" ? nextElement.version + 1 : nextElement.version - 1
15629
+ },
15630
+ true
15604
15631
  );
15605
15632
  } else {
15606
- affectedElement = mutateElement(
15607
- nextElement,
15608
- nextElements,
15609
- updates
15610
- );
15633
+ affectedElement = mutateElement(nextElement, nextElements, {
15634
+ ...elementUpdates,
15635
+ // don't modify the version further, as we've already updated it
15636
+ version: nextElement.version
15637
+ });
15611
15638
  }
15612
15639
  nextAffectedElements.set(affectedElement.id, affectedElement);
15613
15640
  nextElements.set(affectedElement.id, affectedElement);
@@ -15670,6 +15697,20 @@ var ElementsDelta = class _ElementsDelta {
15670
15697
  );
15671
15698
  BindableElement.rebindAffected(nextElements, nextElement(), updater);
15672
15699
  }
15700
+ static redrawElements(nextElements, changedElements) {
15701
+ try {
15702
+ const tempScene = new Scene(nextElements, { skipValidation: true });
15703
+ _ElementsDelta.redrawTextBoundingBoxes(tempScene, changedElements);
15704
+ _ElementsDelta.redrawBoundArrows(tempScene, changedElements);
15705
+ } catch (e) {
15706
+ console.error(`Couldn't redraw elements`, e);
15707
+ if (isTestEnv8() || isDevEnv7()) {
15708
+ throw e;
15709
+ }
15710
+ } finally {
15711
+ return nextElements;
15712
+ }
15713
+ }
15673
15714
  static redrawTextBoundingBoxes(scene, changed) {
15674
15715
  const elements = scene.getNonDeletedElementsMap();
15675
15716
  const boxesToRedraw = /* @__PURE__ */ new Map();