@dwelle/excalidraw 0.5.0-c0212b3 → 0.5.0-c45e6ba

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.
@@ -1,7 +1,7 @@
1
1
  // <define:import.meta.env>
2
- var define_import_meta_env_default = { MODE: "development", VITE_APP_BACKEND_V2_GET_URL: "https://json-dev.excalidraw.com/api/v2/", VITE_APP_BACKEND_V2_POST_URL: "https://json-dev.excalidraw.com/api/v2/post/", VITE_APP_LIBRARY_URL: "https://libraries.excalidraw.com", VITE_APP_LIBRARY_BACKEND: "https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries", VITE_APP_WS_SERVER_URL: "http://localhost:3002", VITE_APP_PLUS_LP: "https://plus.excalidraw.com", VITE_APP_PLUS_APP: "http://localhost:3000", VITE_APP_AI_BACKEND: "http://localhost:3015", VITE_APP_FIREBASE_CONFIG: '{"apiKey":"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8","authDomain":"excalidraw-oss-dev.firebaseapp.com","projectId":"excalidraw-oss-dev","storageBucket":"excalidraw-oss-dev.appspot.com","messagingSenderId":"664559512677","appId":"1:664559512677:web:a385181f2928d328a7aa8c"}', VITE_APP_DEV_DISABLE_LIVE_RELOAD: "", VITE_APP_ENABLE_TRACKING: "true", FAST_REFRESH: "false", VITE_APP_PORT: "3000", VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX: "", VITE_APP_COLLAPSE_OVERLAY: "true", VITE_APP_ENABLE_ESLINT: "true", VITE_APP_ENABLE_PWA: "false", VITE_APP_PLUS_EXPORT_PUBLIC_KEY: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm2g5T+Rub6Kbf1Mf57t0\n7r2zeHuVg4dla3r5ryXMswtzz6x767octl6oLThn33mQsPSy3GKglFZoCTXJR4ij\nba8SxB04sL/N8eRrKja7TFWjCVtRwTTfyy771NYYNFVJclkxHyE5qw4m27crHF1y\nUNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD\ns9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot\nkdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS\nHQIDAQAB", VITE_APP_DISABLE_PREVENT_UNLOAD: "", PKG_NAME: "@excalidraw/excalidraw", PKG_VERSION: "0.5.0-c0212b3", DEV: true };
2
+ var define_import_meta_env_default = { MODE: "development", VITE_APP_BACKEND_V2_GET_URL: "https://json-dev.excalidraw.com/api/v2/", VITE_APP_BACKEND_V2_POST_URL: "https://json-dev.excalidraw.com/api/v2/post/", VITE_APP_LIBRARY_URL: "https://libraries.excalidraw.com", VITE_APP_LIBRARY_BACKEND: "https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries", VITE_APP_WS_SERVER_URL: "http://localhost:3002", VITE_APP_PLUS_LP: "https://plus.excalidraw.com", VITE_APP_PLUS_APP: "http://localhost:3000", VITE_APP_AI_BACKEND: "http://localhost:3015", VITE_APP_FIREBASE_CONFIG: '{"apiKey":"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8","authDomain":"excalidraw-oss-dev.firebaseapp.com","projectId":"excalidraw-oss-dev","storageBucket":"excalidraw-oss-dev.appspot.com","messagingSenderId":"664559512677","appId":"1:664559512677:web:a385181f2928d328a7aa8c"}', VITE_APP_DEV_DISABLE_LIVE_RELOAD: "", VITE_APP_ENABLE_TRACKING: "true", FAST_REFRESH: "false", VITE_APP_PORT: "3000", VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX: "", VITE_APP_COLLAPSE_OVERLAY: "true", VITE_APP_ENABLE_ESLINT: "true", VITE_APP_ENABLE_PWA: "false", VITE_APP_PLUS_EXPORT_PUBLIC_KEY: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm2g5T+Rub6Kbf1Mf57t0\n7r2zeHuVg4dla3r5ryXMswtzz6x767octl6oLThn33mQsPSy3GKglFZoCTXJR4ij\nba8SxB04sL/N8eRrKja7TFWjCVtRwTTfyy771NYYNFVJclkxHyE5qw4m27crHF1y\nUNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD\ns9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot\nkdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS\nHQIDAQAB", VITE_APP_DISABLE_PREVENT_UNLOAD: "", PKG_NAME: "@excalidraw/excalidraw", PKG_VERSION: "0.5.0-c45e6ba", DEV: true };
3
3
 
4
4
  export {
5
5
  define_import_meta_env_default
6
6
  };
7
- //# sourceMappingURL=chunk-UYYRR25G.js.map
7
+ //# sourceMappingURL=chunk-BT2OAKRD.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  define_import_meta_env_default
3
- } from "./chunk-UYYRR25G.js";
3
+ } from "./chunk-BT2OAKRD.js";
4
4
  import {
5
5
  __publicField
6
6
  } from "./chunk-XDFCUUT6.js";
@@ -12973,7 +12973,7 @@ var EphemeralIncrement = class extends StoreIncrement {
12973
12973
  this.change = change;
12974
12974
  }
12975
12975
  };
12976
- var StoreDelta = class {
12976
+ var StoreDelta = class _StoreDelta {
12977
12977
  constructor(id, elements, appState) {
12978
12978
  this.id = id;
12979
12979
  this.elements = elements;
@@ -13011,10 +13011,23 @@ var StoreDelta = class {
13011
13011
  */
13012
13012
  static load({
13013
13013
  id,
13014
- elements: { added, removed, updated }
13014
+ elements: { added, removed, updated },
13015
+ appState: { delta: appStateDelta }
13015
13016
  }) {
13016
13017
  const elements = ElementsDelta.create(added, removed, updated);
13017
- return new this(id, elements, AppStateDelta.empty());
13018
+ const appState = AppStateDelta.create(appStateDelta);
13019
+ return new this(id, elements, appState);
13020
+ }
13021
+ /**
13022
+ * Squash the passed deltas into the aggregated delta instance.
13023
+ */
13024
+ static squash(...deltas) {
13025
+ const aggregatedDelta = _StoreDelta.empty();
13026
+ for (const delta of deltas) {
13027
+ aggregatedDelta.elements.squash(delta.elements);
13028
+ aggregatedDelta.appState.squash(delta.appState);
13029
+ }
13030
+ return aggregatedDelta;
13018
13031
  }
13019
13032
  /**
13020
13033
  * Inverse store delta, creates new instance of `StoreDelta`.
@@ -13025,9 +13038,7 @@ var StoreDelta = class {
13025
13038
  /**
13026
13039
  * Apply the delta to the passed elements and appState, does not modify the snapshot.
13027
13040
  */
13028
- static applyTo(delta, elements, appState, options = {
13029
- excludedProperties: /* @__PURE__ */ new Set()
13030
- }) {
13041
+ static applyTo(delta, elements, appState, options) {
13031
13042
  const [nextElements, elementsContainVisibleChange] = delta.elements.applyTo(
13032
13043
  elements,
13033
13044
  StoreSnapshot.empty().elements,
@@ -13053,6 +13064,9 @@ var StoreDelta = class {
13053
13064
  }
13054
13065
  );
13055
13066
  }
13067
+ static empty() {
13068
+ return _StoreDelta.create(ElementsDelta.empty(), AppStateDelta.empty());
13069
+ }
13056
13070
  isEmpty() {
13057
13071
  return this.elements.isEmpty() && this.appState.isEmpty();
13058
13072
  }
@@ -13603,7 +13617,7 @@ var hashSelectionOpts = (opts) => {
13603
13617
  return hash;
13604
13618
  };
13605
13619
  var Scene = class {
13606
- constructor(elements = null) {
13620
+ constructor(elements = null, options) {
13607
13621
  // ---------------------------------------------------------------------------
13608
13622
  // instance methods/props
13609
13623
  // ---------------------------------------------------------------------------
@@ -13658,7 +13672,7 @@ var Scene = class {
13658
13672
  return getElementsInGroup(elementsMap, id);
13659
13673
  });
13660
13674
  if (elements) {
13661
- this.replaceAllElements(elements);
13675
+ this.replaceAllElements(elements, options);
13662
13676
  }
13663
13677
  }
13664
13678
  getSceneNonce() {
@@ -13741,10 +13755,12 @@ var Scene = class {
13741
13755
  }
13742
13756
  return didChange;
13743
13757
  }
13744
- replaceAllElements(nextElements) {
13758
+ replaceAllElements(nextElements, options) {
13745
13759
  const _nextElements = toArray(nextElements);
13746
13760
  const nextFrameLikes = [];
13747
- validateIndicesThrottled(_nextElements);
13761
+ if (!options?.skipValidation) {
13762
+ validateIndicesThrottled(_nextElements);
13763
+ }
13748
13764
  this.elements = syncInvalidIndices(_nextElements);
13749
13765
  this.elementsMap.clear();
13750
13766
  this.elements.forEach((element) => {
@@ -13889,16 +13905,16 @@ var Delta = class _Delta {
13889
13905
  /**
13890
13906
  * Merges two deltas into a new one.
13891
13907
  */
13892
- static merge(delta1, delta2) {
13908
+ static merge(delta1, delta2, delta3 = _Delta.empty()) {
13893
13909
  return _Delta.create(
13894
- { ...delta1.deleted, ...delta2.deleted },
13895
- { ...delta1.inserted, ...delta2.inserted }
13910
+ { ...delta1.deleted, ...delta2.deleted, ...delta3.deleted },
13911
+ { ...delta1.inserted, ...delta2.inserted, ...delta3.inserted }
13896
13912
  );
13897
13913
  }
13898
13914
  /**
13899
13915
  * Merges deleted and inserted object partials.
13900
13916
  */
13901
- static mergeObjects(prev, added, removed) {
13917
+ static mergeObjects(prev, added, removed = {}) {
13902
13918
  const cloned = { ...prev };
13903
13919
  for (const key of Object.keys(removed)) {
13904
13920
  delete cloned[key];
@@ -14119,6 +14135,9 @@ var AppStateDelta = class _AppStateDelta {
14119
14135
  constructor(delta) {
14120
14136
  this.delta = delta;
14121
14137
  }
14138
+ static create(delta) {
14139
+ return new _AppStateDelta(delta);
14140
+ }
14122
14141
  static calculate(prevAppState, nextAppState) {
14123
14142
  const delta = Delta.calculate(
14124
14143
  prevAppState,
@@ -14141,18 +14160,65 @@ var AppStateDelta = class _AppStateDelta {
14141
14160
  return new _AppStateDelta(inversedDelta);
14142
14161
  }
14143
14162
  squash(delta) {
14144
- this.delta = Delta.merge(this.delta, delta.delta);
14163
+ if (delta.isEmpty()) {
14164
+ return this;
14165
+ }
14166
+ const mergedDeletedSelectedElementIds = Delta.mergeObjects(
14167
+ this.delta.deleted.selectedElementIds ?? {},
14168
+ delta.delta.deleted.selectedElementIds ?? {}
14169
+ );
14170
+ const mergedInsertedSelectedElementIds = Delta.mergeObjects(
14171
+ this.delta.inserted.selectedElementIds ?? {},
14172
+ delta.delta.inserted.selectedElementIds ?? {}
14173
+ );
14174
+ const mergedDeletedSelectedGroupIds = Delta.mergeObjects(
14175
+ this.delta.deleted.selectedGroupIds ?? {},
14176
+ delta.delta.deleted.selectedGroupIds ?? {}
14177
+ );
14178
+ const mergedInsertedSelectedGroupIds = Delta.mergeObjects(
14179
+ this.delta.inserted.selectedGroupIds ?? {},
14180
+ delta.delta.inserted.selectedGroupIds ?? {}
14181
+ );
14182
+ const mergedDeletedLockedMultiSelections = Delta.mergeObjects(
14183
+ this.delta.deleted.lockedMultiSelections ?? {},
14184
+ delta.delta.deleted.lockedMultiSelections ?? {}
14185
+ );
14186
+ const mergedInsertedLockedMultiSelections = Delta.mergeObjects(
14187
+ this.delta.inserted.lockedMultiSelections ?? {},
14188
+ delta.delta.inserted.lockedMultiSelections ?? {}
14189
+ );
14190
+ const mergedInserted = {};
14191
+ const mergedDeleted = {};
14192
+ if (Object.keys(mergedDeletedSelectedElementIds).length || Object.keys(mergedInsertedSelectedElementIds).length) {
14193
+ mergedDeleted.selectedElementIds = mergedDeletedSelectedElementIds;
14194
+ mergedInserted.selectedElementIds = mergedInsertedSelectedElementIds;
14195
+ }
14196
+ if (Object.keys(mergedDeletedSelectedGroupIds).length || Object.keys(mergedInsertedSelectedGroupIds).length) {
14197
+ mergedDeleted.selectedGroupIds = mergedDeletedSelectedGroupIds;
14198
+ mergedInserted.selectedGroupIds = mergedInsertedSelectedGroupIds;
14199
+ }
14200
+ if (Object.keys(mergedDeletedLockedMultiSelections).length || Object.keys(mergedInsertedLockedMultiSelections).length) {
14201
+ mergedDeleted.lockedMultiSelections = mergedDeletedLockedMultiSelections;
14202
+ mergedInserted.lockedMultiSelections = mergedInsertedLockedMultiSelections;
14203
+ }
14204
+ this.delta = Delta.merge(
14205
+ this.delta,
14206
+ delta.delta,
14207
+ Delta.create(mergedDeleted, mergedInserted)
14208
+ );
14145
14209
  return this;
14146
14210
  }
14147
14211
  applyTo(appState, nextElements) {
14148
14212
  try {
14149
14213
  const {
14150
14214
  selectedElementIds: deletedSelectedElementIds = {},
14151
- selectedGroupIds: deletedSelectedGroupIds = {}
14215
+ selectedGroupIds: deletedSelectedGroupIds = {},
14216
+ lockedMultiSelections: deletedLockedMultiSelections = {}
14152
14217
  } = this.delta.deleted;
14153
14218
  const {
14154
14219
  selectedElementIds: insertedSelectedElementIds = {},
14155
14220
  selectedGroupIds: insertedSelectedGroupIds = {},
14221
+ lockedMultiSelections: insertedLockedMultiSelections = {},
14156
14222
  selectedLinearElement: insertedSelectedLinearElement,
14157
14223
  ...directlyApplicablePartial
14158
14224
  } = this.delta.inserted;
@@ -14166,6 +14232,11 @@ var AppStateDelta = class _AppStateDelta {
14166
14232
  insertedSelectedGroupIds,
14167
14233
  deletedSelectedGroupIds
14168
14234
  );
14235
+ const mergedLockedMultiSelections = Delta.mergeObjects(
14236
+ appState.lockedMultiSelections,
14237
+ insertedLockedMultiSelections,
14238
+ deletedLockedMultiSelections
14239
+ );
14169
14240
  const selectedLinearElement = insertedSelectedLinearElement && nextElements.has(insertedSelectedLinearElement.elementId) ? new LinearElementEditor(
14170
14241
  nextElements.get(
14171
14242
  insertedSelectedLinearElement.elementId
@@ -14178,6 +14249,7 @@ var AppStateDelta = class _AppStateDelta {
14178
14249
  ...directlyApplicablePartial,
14179
14250
  selectedElementIds: mergedSelectedElementIds,
14180
14251
  selectedGroupIds: mergedSelectedGroupIds,
14252
+ lockedMultiSelections: mergedLockedMultiSelections,
14181
14253
  selectedLinearElement: typeof insertedSelectedLinearElement !== "undefined" ? selectedLinearElement : appState.selectedLinearElement
14182
14254
  };
14183
14255
  const constainsVisibleChanges = this.filterInvisibleChanges(
@@ -14381,12 +14453,6 @@ var AppStateDelta = class _AppStateDelta {
14381
14453
  "lockedMultiSelections",
14382
14454
  (prevValue) => prevValue ?? {}
14383
14455
  );
14384
- Delta.diffObjects(
14385
- deleted,
14386
- inserted,
14387
- "activeLockedId",
14388
- (prevValue) => prevValue ?? null
14389
- );
14390
14456
  } catch (e) {
14391
14457
  console.error(`Couldn't postprocess appstate change deltas.`);
14392
14458
  if (isTestEnv() || isDevEnv()) {
@@ -14449,7 +14515,7 @@ var _ElementsDelta = class _ElementsDelta {
14449
14515
  }
14450
14516
  static validate(elementsDelta, type, satifiesSpecialInvariants) {
14451
14517
  for (const [id, delta] of Object.entries(elementsDelta[type])) {
14452
- if (!this.satisfiesCommmonInvariants(delta) || !satifiesSpecialInvariants(delta)) {
14518
+ if (!this.satisfiesCommmonInvariants(delta) || !this.satisfiesUniqueInvariants(elementsDelta, id) || !satifiesSpecialInvariants(delta)) {
14453
14519
  console.error(
14454
14520
  `Broken invariant for "${type}" delta, element "${id}", delta:`,
14455
14521
  delta
@@ -14633,26 +14699,30 @@ var _ElementsDelta = class _ElementsDelta {
14633
14699
  // redistribute the deltas as `isDeleted` could have been updated
14634
14700
  });
14635
14701
  }
14636
- applyTo(elements, snapshot = StoreSnapshot.empty().elements, options = {
14637
- excludedProperties: /* @__PURE__ */ new Set()
14638
- }) {
14702
+ applyTo(elements, snapshot = StoreSnapshot.empty().elements, options) {
14639
14703
  let nextElements = new Map(elements);
14640
14704
  let changedElements;
14641
14705
  const flags = {
14642
14706
  containsVisibleDifference: false,
14643
- containsZindexDifference: false
14707
+ containsZindexDifference: false,
14708
+ applyDirection: void 0
14644
14709
  };
14645
14710
  try {
14646
14711
  const applyDeltas = _ElementsDelta.createApplier(
14712
+ elements,
14647
14713
  nextElements,
14648
14714
  snapshot,
14649
- options,
14650
- flags
14715
+ flags,
14716
+ options
14651
14717
  );
14652
14718
  const addedElements = applyDeltas(this.added);
14653
14719
  const removedElements = applyDeltas(this.removed);
14654
14720
  const updatedElements = applyDeltas(this.updated);
14655
- const affectedElements = this.resolveConflicts(elements, nextElements);
14721
+ const affectedElements = this.resolveConflicts(
14722
+ elements,
14723
+ nextElements,
14724
+ flags.applyDirection
14725
+ );
14656
14726
  changedElements = new Map([
14657
14727
  ...addedElements,
14658
14728
  ...removedElements,
@@ -14672,9 +14742,7 @@ var _ElementsDelta = class _ElementsDelta {
14672
14742
  changedElements,
14673
14743
  flags
14674
14744
  );
14675
- const tempScene = new Scene(nextElements);
14676
- _ElementsDelta.redrawTextBoundingBoxes(tempScene, changedElements);
14677
- _ElementsDelta.redrawBoundArrows(tempScene, changedElements);
14745
+ _ElementsDelta.redrawElements(nextElements, changedElements);
14678
14746
  } catch (e) {
14679
14747
  console.error(
14680
14748
  `Couldn't mutate elements after applying elements change`,
@@ -14688,40 +14756,87 @@ var _ElementsDelta = class _ElementsDelta {
14688
14756
  }
14689
14757
  }
14690
14758
  squash(delta) {
14759
+ if (delta.isEmpty()) {
14760
+ return this;
14761
+ }
14691
14762
  const { added, removed, updated } = delta;
14763
+ const mergeBoundElements = (prevDelta, nextDelta) => {
14764
+ const mergedDeletedBoundElements = Delta.mergeArrays(
14765
+ prevDelta.deleted.boundElements ?? [],
14766
+ nextDelta.deleted.boundElements ?? [],
14767
+ void 0,
14768
+ (x) => x.id
14769
+ ) ?? [];
14770
+ const mergedInsertedBoundElements = Delta.mergeArrays(
14771
+ prevDelta.inserted.boundElements ?? [],
14772
+ nextDelta.inserted.boundElements ?? [],
14773
+ void 0,
14774
+ (x) => x.id
14775
+ ) ?? [];
14776
+ if (!mergedDeletedBoundElements.length && !mergedInsertedBoundElements.length) {
14777
+ return;
14778
+ }
14779
+ return Delta.create(
14780
+ {
14781
+ boundElements: mergedDeletedBoundElements
14782
+ },
14783
+ {
14784
+ boundElements: mergedInsertedBoundElements
14785
+ }
14786
+ );
14787
+ };
14692
14788
  for (const [id, nextDelta] of Object.entries(added)) {
14693
- const prevDelta = this.added[id];
14789
+ const prevDelta = this.added[id] ?? this.removed[id] ?? this.updated[id];
14694
14790
  if (!prevDelta) {
14695
14791
  this.added[id] = nextDelta;
14696
14792
  } else {
14697
- this.added[id] = Delta.merge(prevDelta, nextDelta);
14793
+ const mergedDelta = mergeBoundElements(prevDelta, nextDelta);
14794
+ delete this.removed[id];
14795
+ delete this.updated[id];
14796
+ this.added[id] = Delta.merge(prevDelta, nextDelta, mergedDelta);
14698
14797
  }
14699
14798
  }
14700
14799
  for (const [id, nextDelta] of Object.entries(removed)) {
14701
- const prevDelta = this.removed[id];
14800
+ const prevDelta = this.added[id] ?? this.removed[id] ?? this.updated[id];
14702
14801
  if (!prevDelta) {
14703
14802
  this.removed[id] = nextDelta;
14704
14803
  } else {
14705
- this.removed[id] = Delta.merge(prevDelta, nextDelta);
14804
+ const mergedDelta = mergeBoundElements(prevDelta, nextDelta);
14805
+ delete this.added[id];
14806
+ delete this.updated[id];
14807
+ this.removed[id] = Delta.merge(prevDelta, nextDelta, mergedDelta);
14706
14808
  }
14707
14809
  }
14708
14810
  for (const [id, nextDelta] of Object.entries(updated)) {
14709
- const prevDelta = this.updated[id];
14811
+ const prevDelta = this.added[id] ?? this.removed[id] ?? this.updated[id];
14710
14812
  if (!prevDelta) {
14711
14813
  this.updated[id] = nextDelta;
14712
14814
  } else {
14713
- this.updated[id] = Delta.merge(prevDelta, nextDelta);
14815
+ const mergedDelta = mergeBoundElements(prevDelta, nextDelta);
14816
+ const updatedDelta = Delta.merge(prevDelta, nextDelta, mergedDelta);
14817
+ if (prevDelta === this.added[id]) {
14818
+ this.added[id] = updatedDelta;
14819
+ } else if (prevDelta === this.removed[id]) {
14820
+ this.removed[id] = updatedDelta;
14821
+ } else {
14822
+ this.updated[id] = updatedDelta;
14823
+ }
14714
14824
  }
14715
14825
  }
14826
+ if (isTestEnv() || isDevEnv()) {
14827
+ _ElementsDelta.validate(this, "added", _ElementsDelta.satisfiesAddition);
14828
+ _ElementsDelta.validate(this, "removed", _ElementsDelta.satisfiesRemoval);
14829
+ _ElementsDelta.validate(this, "updated", _ElementsDelta.satisfiesUpdate);
14830
+ }
14716
14831
  return this;
14717
14832
  }
14718
- static applyDelta(element, delta, options, flags) {
14833
+ static applyDelta(element, delta, flags, options) {
14719
14834
  const directlyApplicablePartial = {};
14720
14835
  for (const key of Object.keys(delta.inserted)) {
14721
14836
  if (key === "boundElements") {
14722
14837
  continue;
14723
14838
  }
14724
- if (options.excludedProperties.has(key)) {
14839
+ if (options?.excludedProperties?.has(key)) {
14725
14840
  continue;
14726
14841
  }
14727
14842
  const value = delta.inserted[key];
@@ -14749,7 +14864,7 @@ var _ElementsDelta = class _ElementsDelta {
14749
14864
  if (!flags.containsZindexDifference) {
14750
14865
  flags.containsZindexDifference = delta.deleted.index !== delta.inserted.index;
14751
14866
  }
14752
- return newElementWith(element, directlyApplicablePartial);
14867
+ return newElementWith(element, directlyApplicablePartial, true);
14753
14868
  }
14754
14869
  /**
14755
14870
  * Check for visible changes regardless of whether they were removed, added or updated.
@@ -14774,25 +14889,32 @@ var _ElementsDelta = class _ElementsDelta {
14774
14889
  *
14775
14890
  * @returns all elements affected by the conflict resolution
14776
14891
  */
14777
- resolveConflicts(prevElements, nextElements) {
14892
+ resolveConflicts(prevElements, nextElements, applyDirection = "forward") {
14778
14893
  const nextAffectedElements = /* @__PURE__ */ new Map();
14779
14894
  const updater = (element, updates) => {
14780
14895
  const nextElement = nextElements.get(element.id);
14781
14896
  if (!nextElement) {
14782
14897
  return;
14783
14898
  }
14899
+ const prevElement = prevElements.get(element.id);
14900
+ const nextVersion = applyDirection === "forward" ? nextElement.version + 1 : nextElement.version - 1;
14901
+ const elementUpdates = updates;
14784
14902
  let affectedElement;
14785
- if (prevElements.get(element.id) === nextElement) {
14903
+ if (prevElement === nextElement) {
14786
14904
  affectedElement = newElementWith(
14787
14905
  nextElement,
14788
- updates
14906
+ {
14907
+ ...elementUpdates,
14908
+ version: nextVersion
14909
+ },
14910
+ true
14789
14911
  );
14790
14912
  } else {
14791
- affectedElement = mutateElement(
14792
- nextElement,
14793
- nextElements,
14794
- updates
14795
- );
14913
+ affectedElement = mutateElement(nextElement, nextElements, {
14914
+ ...elementUpdates,
14915
+ // don't modify the version further, if it's already different
14916
+ version: prevElement?.version !== nextElement.version ? nextElement.version : nextVersion
14917
+ });
14796
14918
  }
14797
14919
  nextAffectedElements.set(affectedElement.id, affectedElement);
14798
14920
  nextElements.set(affectedElement.id, affectedElement);
@@ -14855,6 +14977,20 @@ var _ElementsDelta = class _ElementsDelta {
14855
14977
  );
14856
14978
  BindableElement.rebindAffected(nextElements, nextElement(), updater);
14857
14979
  }
14980
+ static redrawElements(nextElements, changedElements) {
14981
+ try {
14982
+ const tempScene = new Scene(nextElements, { skipValidation: true });
14983
+ _ElementsDelta.redrawTextBoundingBoxes(tempScene, changedElements);
14984
+ _ElementsDelta.redrawBoundArrows(tempScene, changedElements);
14985
+ } catch (e) {
14986
+ console.error(`Couldn't redraw elements`, e);
14987
+ if (isTestEnv() || isDevEnv()) {
14988
+ throw e;
14989
+ }
14990
+ } finally {
14991
+ return nextElements;
14992
+ }
14993
+ }
14858
14994
  static redrawTextBoundingBoxes(scene, changed) {
14859
14995
  const elements = scene.getNonDeletedElementsMap();
14860
14996
  const boxesToRedraw = /* @__PURE__ */ new Map();
@@ -14970,7 +15106,11 @@ __publicField(_ElementsDelta, "satisfiesCommmonInvariants", ({
14970
15106
  Number.isInteger(deleted.version) && Number.isInteger(inserted.version) && // versions should be positive, zero included
14971
15107
  deleted.version >= 0 && inserted.version >= 0 && // versions should never be the same
14972
15108
  deleted.version !== inserted.version));
14973
- __publicField(_ElementsDelta, "createApplier", (nextElements, snapshot, options, flags) => (deltas) => {
15109
+ __publicField(_ElementsDelta, "satisfiesUniqueInvariants", (elementsDelta, id) => {
15110
+ const { added, removed, updated } = elementsDelta;
15111
+ return [added[id], removed[id], updated[id]].filter(Boolean).length === 1;
15112
+ });
15113
+ __publicField(_ElementsDelta, "createApplier", (prevElements, nextElements, snapshot, flags, options) => (deltas) => {
14974
15114
  const getElement = _ElementsDelta.createGetter(
14975
15115
  nextElements,
14976
15116
  snapshot,
@@ -14979,14 +15119,20 @@ __publicField(_ElementsDelta, "createApplier", (nextElements, snapshot, options,
14979
15119
  return Object.entries(deltas).reduce((acc, [id, delta]) => {
14980
15120
  const element = getElement(id, delta.inserted);
14981
15121
  if (element) {
14982
- const newElement2 = _ElementsDelta.applyDelta(
15122
+ const nextElement = _ElementsDelta.applyDelta(
14983
15123
  element,
14984
15124
  delta,
14985
- options,
14986
- flags
15125
+ flags,
15126
+ options
14987
15127
  );
14988
- nextElements.set(newElement2.id, newElement2);
14989
- acc.set(newElement2.id, newElement2);
15128
+ nextElements.set(nextElement.id, nextElement);
15129
+ acc.set(nextElement.id, nextElement);
15130
+ if (!flags.applyDirection) {
15131
+ const prevElement = prevElements.get(id);
15132
+ if (prevElement) {
15133
+ flags.applyDirection = prevElement.version > nextElement.version ? "backward" : "forward";
15134
+ }
15135
+ }
14990
15136
  }
14991
15137
  return acc;
14992
15138
  }, /* @__PURE__ */ new Map());
@@ -23324,7 +23470,7 @@ var parseFileContents = async (blob) => {
23324
23470
  let contents;
23325
23471
  if (blob.type === MIME_TYPES.png) {
23326
23472
  try {
23327
- return await (await import("./data/image-ENWDYSLD.js")).decodePngMetadata(blob);
23473
+ return await (await import("./data/image-FLUMXXQ3.js")).decodePngMetadata(blob);
23328
23474
  } catch (error) {
23329
23475
  if (error.message === "INVALID") {
23330
23476
  throw new ImageSceneDataError(
@@ -24190,4 +24336,4 @@ export {
24190
24336
  createFile,
24191
24337
  normalizeFile
24192
24338
  };
24193
- //# sourceMappingURL=chunk-JSZNJITD.js.map
24339
+ //# sourceMappingURL=chunk-VF5WL5WV.js.map