@excalidraw/element 0.18.0-dda3affcb-8fc71066d → 0.18.0-de715913e

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
@@ -13540,6 +13540,14 @@ var StoreDelta = class {
13540
13540
  const appState = AppStateDelta.create(appStateDelta);
13541
13541
  return new this(id, elements, appState);
13542
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;
13550
+ }
13543
13551
  /**
13544
13552
  * Inverse store delta, creates new instance of `StoreDelta`.
13545
13553
  */
@@ -14643,10 +14651,10 @@ var Delta = class _Delta {
14643
14651
  /**
14644
14652
  * Merges two deltas into a new one.
14645
14653
  */
14646
- static merge(delta1, delta2) {
14654
+ static merge(delta1, delta2, delta3) {
14647
14655
  return _Delta.create(
14648
- { ...delta1.deleted, ...delta2.deleted },
14649
- { ...delta1.inserted, ...delta2.inserted }
14656
+ { ...delta1.deleted, ...delta2.deleted, ...delta3?.deleted ?? {} },
14657
+ { ...delta1.inserted, ...delta2.inserted, ...delta3?.inserted ?? {} }
14650
14658
  );
14651
14659
  }
14652
14660
  /**
@@ -14654,7 +14662,7 @@ var Delta = class _Delta {
14654
14662
  */
14655
14663
  static mergeObjects(prev, added, removed) {
14656
14664
  const cloned = { ...prev };
14657
- for (const key of Object.keys(removed)) {
14665
+ for (const key of Object.keys(removed ?? {})) {
14658
14666
  delete cloned[key];
14659
14667
  }
14660
14668
  return { ...cloned, ...added };
@@ -14898,7 +14906,33 @@ var AppStateDelta = class _AppStateDelta {
14898
14906
  return new _AppStateDelta(inversedDelta);
14899
14907
  }
14900
14908
  squash(delta) {
14901
- this.delta = Delta.merge(this.delta, delta.delta);
14909
+ const mergedDeletedSelectedElementIds = Delta.mergeObjects(
14910
+ this.delta.deleted.selectedElementIds ?? {},
14911
+ delta.delta.deleted.selectedElementIds ?? {}
14912
+ );
14913
+ const mergedInsertedSelectedElementIds = Delta.mergeObjects(
14914
+ this.delta.inserted.selectedElementIds ?? {},
14915
+ delta.delta.inserted.selectedElementIds ?? {}
14916
+ );
14917
+ const mergedInsertedSelectedGroupIds = Delta.mergeObjects(
14918
+ this.delta.inserted.selectedGroupIds ?? {},
14919
+ delta.delta.inserted.selectedGroupIds ?? {}
14920
+ );
14921
+ const mergedDeletedSelectedGroupIds = Delta.mergeObjects(
14922
+ this.delta.deleted.selectedGroupIds ?? {},
14923
+ delta.delta.deleted.selectedGroupIds ?? {}
14924
+ );
14925
+ const mergedDelta = Delta.create(
14926
+ {
14927
+ selectedElementIds: mergedDeletedSelectedElementIds,
14928
+ selectedGroupIds: mergedDeletedSelectedGroupIds
14929
+ },
14930
+ {
14931
+ selectedElementIds: mergedInsertedSelectedElementIds,
14932
+ selectedGroupIds: mergedInsertedSelectedGroupIds
14933
+ }
14934
+ );
14935
+ this.delta = Delta.merge(this.delta, delta.delta, mergedDelta);
14902
14936
  return this;
14903
14937
  }
14904
14938
  applyTo(appState, nextElements) {
@@ -15417,10 +15451,12 @@ var ElementsDelta = class _ElementsDelta {
15417
15451
  let changedElements;
15418
15452
  const flags = {
15419
15453
  containsVisibleDifference: false,
15420
- containsZindexDifference: false
15454
+ containsZindexDifference: false,
15455
+ applyDirection: void 0
15421
15456
  };
15422
15457
  try {
15423
15458
  const applyDeltas = _ElementsDelta.createApplier(
15459
+ elements,
15424
15460
  nextElements,
15425
15461
  snapshot,
15426
15462
  flags,
@@ -15429,7 +15465,11 @@ var ElementsDelta = class _ElementsDelta {
15429
15465
  const addedElements = applyDeltas(this.added);
15430
15466
  const removedElements = applyDeltas(this.removed);
15431
15467
  const updatedElements = applyDeltas(this.updated);
15432
- const affectedElements = this.resolveConflicts(elements, nextElements);
15468
+ const affectedElements = this.resolveConflicts(
15469
+ elements,
15470
+ nextElements,
15471
+ flags.applyDirection
15472
+ );
15433
15473
  changedElements = new Map([
15434
15474
  ...addedElements,
15435
15475
  ...removedElements,
@@ -15449,9 +15489,7 @@ var ElementsDelta = class _ElementsDelta {
15449
15489
  changedElements,
15450
15490
  flags
15451
15491
  );
15452
- if (!options?.skipRedraw) {
15453
- _ElementsDelta.redrawElements(nextElements, changedElements);
15454
- }
15492
+ _ElementsDelta.redrawElements(nextElements, changedElements);
15455
15493
  } catch (e) {
15456
15494
  console.error(
15457
15495
  `Couldn't mutate elements after applying elements change`,
@@ -15466,12 +15504,35 @@ var ElementsDelta = class _ElementsDelta {
15466
15504
  }
15467
15505
  squash(delta) {
15468
15506
  const { added, removed, updated } = delta;
15507
+ function mergeBoundElements(prevDelta, nextDelta) {
15508
+ const mergedDeletedBoundElements = Delta.mergeArrays(
15509
+ prevDelta.deleted.boundElements ?? [],
15510
+ nextDelta.deleted.boundElements ?? [],
15511
+ void 0,
15512
+ (x) => x.id
15513
+ ) ?? [];
15514
+ const mergedInsertedBoundElements = Delta.mergeArrays(
15515
+ prevDelta.inserted.boundElements ?? [],
15516
+ nextDelta.inserted.boundElements ?? [],
15517
+ void 0,
15518
+ (x) => x.id
15519
+ ) ?? [];
15520
+ return Delta.create(
15521
+ {
15522
+ boundElements: mergedDeletedBoundElements
15523
+ },
15524
+ {
15525
+ boundElements: mergedInsertedBoundElements
15526
+ }
15527
+ );
15528
+ }
15469
15529
  for (const [id, nextDelta] of Object.entries(added)) {
15470
15530
  const prevDelta = this.added[id];
15471
15531
  if (!prevDelta) {
15472
15532
  this.added[id] = nextDelta;
15473
15533
  } else {
15474
- this.added[id] = Delta.merge(prevDelta, nextDelta);
15534
+ const mergedDelta = mergeBoundElements(prevDelta, nextDelta);
15535
+ this.added[id] = Delta.merge(prevDelta, nextDelta, mergedDelta);
15475
15536
  }
15476
15537
  }
15477
15538
  for (const [id, nextDelta] of Object.entries(removed)) {
@@ -15479,7 +15540,8 @@ var ElementsDelta = class _ElementsDelta {
15479
15540
  if (!prevDelta) {
15480
15541
  this.removed[id] = nextDelta;
15481
15542
  } else {
15482
- this.removed[id] = Delta.merge(prevDelta, nextDelta);
15543
+ const mergedDelta = mergeBoundElements(prevDelta, nextDelta);
15544
+ this.removed[id] = Delta.merge(prevDelta, nextDelta, mergedDelta);
15483
15545
  }
15484
15546
  }
15485
15547
  for (const [id, nextDelta] of Object.entries(updated)) {
@@ -15487,12 +15549,13 @@ var ElementsDelta = class _ElementsDelta {
15487
15549
  if (!prevDelta) {
15488
15550
  this.updated[id] = nextDelta;
15489
15551
  } else {
15490
- this.updated[id] = Delta.merge(prevDelta, nextDelta);
15552
+ const mergedDelta = mergeBoundElements(prevDelta, nextDelta);
15553
+ this.updated[id] = Delta.merge(prevDelta, nextDelta, mergedDelta);
15491
15554
  }
15492
15555
  }
15493
15556
  return this;
15494
15557
  }
15495
- static createApplier = (nextElements, snapshot, flags, options) => (deltas) => {
15558
+ static createApplier = (prevElements, nextElements, snapshot, flags, options) => (deltas) => {
15496
15559
  const getElement = _ElementsDelta.createGetter(
15497
15560
  nextElements,
15498
15561
  snapshot,
@@ -15501,14 +15564,20 @@ var ElementsDelta = class _ElementsDelta {
15501
15564
  return Object.entries(deltas).reduce((acc, [id, delta]) => {
15502
15565
  const element = getElement(id, delta.inserted);
15503
15566
  if (element) {
15504
- const newElement2 = _ElementsDelta.applyDelta(
15567
+ const nextElement = _ElementsDelta.applyDelta(
15505
15568
  element,
15506
15569
  delta,
15507
15570
  flags,
15508
15571
  options
15509
15572
  );
15510
- nextElements.set(newElement2.id, newElement2);
15511
- acc.set(newElement2.id, newElement2);
15573
+ nextElements.set(nextElement.id, nextElement);
15574
+ acc.set(nextElement.id, nextElement);
15575
+ if (!flags.applyDirection) {
15576
+ const prevElement = prevElements.get(id);
15577
+ if (prevElement) {
15578
+ flags.applyDirection = prevElement.version > nextElement.version ? "backward" : "forward";
15579
+ }
15580
+ }
15512
15581
  }
15513
15582
  return acc;
15514
15583
  }, /* @__PURE__ */ new Map());
@@ -15567,7 +15636,7 @@ var ElementsDelta = class _ElementsDelta {
15567
15636
  if (!flags.containsZindexDifference) {
15568
15637
  flags.containsZindexDifference = delta.deleted.index !== delta.inserted.index;
15569
15638
  }
15570
- return newElementWith(element, directlyApplicablePartial);
15639
+ return newElementWith(element, directlyApplicablePartial, true);
15571
15640
  }
15572
15641
  /**
15573
15642
  * Check for visible changes regardless of whether they were removed, added or updated.
@@ -15592,7 +15661,7 @@ var ElementsDelta = class _ElementsDelta {
15592
15661
  *
15593
15662
  * @returns all elements affected by the conflict resolution
15594
15663
  */
15595
- resolveConflicts(prevElements, nextElements) {
15664
+ resolveConflicts(prevElements, nextElements, applyDirection = "forward") {
15596
15665
  const nextAffectedElements = /* @__PURE__ */ new Map();
15597
15666
  const updater = (element, updates) => {
15598
15667
  const nextElement = nextElements.get(element.id);
@@ -15600,18 +15669,24 @@ var ElementsDelta = class _ElementsDelta {
15600
15669
  return;
15601
15670
  }
15602
15671
  const prevElement = prevElements.get(element.id);
15672
+ const nextVersion = applyDirection === "forward" ? nextElement.version + 1 : nextElement.version - 1;
15673
+ const elementUpdates = updates;
15603
15674
  let affectedElement;
15604
15675
  if (prevElement === nextElement) {
15605
15676
  affectedElement = newElementWith(
15606
15677
  nextElement,
15607
- updates
15678
+ {
15679
+ ...elementUpdates,
15680
+ version: nextVersion
15681
+ },
15682
+ true
15608
15683
  );
15609
15684
  } else {
15610
- affectedElement = mutateElement(
15611
- nextElement,
15612
- nextElements,
15613
- updates
15614
- );
15685
+ affectedElement = mutateElement(nextElement, nextElements, {
15686
+ ...elementUpdates,
15687
+ // don't modify the version further, if it's already different
15688
+ version: prevElement?.version !== nextElement.version ? nextElement.version : nextVersion
15689
+ });
15615
15690
  }
15616
15691
  nextAffectedElements.set(affectedElement.id, affectedElement);
15617
15692
  nextElements.set(affectedElement.id, affectedElement);