@tldraw/editor 3.13.0-canary.a2884bb1bab2 → 3.13.0-canary.ae38fb277ff7

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.
Files changed (178) hide show
  1. package/dist-cjs/index.d.ts +114 -111
  2. package/dist-cjs/index.js +7 -22
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/TldrawEditor.js +2 -1
  5. package/dist-cjs/lib/TldrawEditor.js.map +2 -2
  6. package/dist-cjs/lib/components/Shape.js +12 -8
  7. package/dist-cjs/lib/components/Shape.js.map +2 -2
  8. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +27 -2
  9. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  10. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js +14 -12
  11. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js.map +2 -2
  12. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +17 -11
  13. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +2 -2
  14. package/dist-cjs/lib/components/default-components/DefaultSpinner.js +1 -1
  15. package/dist-cjs/lib/components/default-components/DefaultSpinner.js.map +2 -2
  16. package/dist-cjs/lib/editor/Editor.js +65 -35
  17. package/dist-cjs/lib/editor/Editor.js.map +3 -3
  18. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js.map +2 -2
  19. package/dist-cjs/lib/editor/managers/TextManager.js +10 -0
  20. package/dist-cjs/lib/editor/managers/TextManager.js.map +2 -2
  21. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  22. package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js.map +2 -2
  23. package/dist-cjs/lib/exports/getSvgJsx.js +12 -3
  24. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  25. package/dist-cjs/lib/hooks/useDocumentEvents.js +3 -2
  26. package/dist-cjs/lib/hooks/useDocumentEvents.js.map +2 -2
  27. package/dist-cjs/lib/hooks/useEditorComponents.js +16 -15
  28. package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
  29. package/dist-cjs/lib/license/LicenseManager.js +8 -1
  30. package/dist-cjs/lib/license/LicenseManager.js.map +2 -2
  31. package/dist-cjs/lib/options.js.map +2 -2
  32. package/dist-cjs/lib/primitives/Box.js +16 -0
  33. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  34. package/dist-cjs/lib/primitives/Mat.js +1 -1
  35. package/dist-cjs/lib/primitives/Mat.js.map +2 -2
  36. package/dist-cjs/lib/primitives/Vec.js +20 -0
  37. package/dist-cjs/lib/primitives/Vec.js.map +2 -2
  38. package/dist-cjs/lib/primitives/geometry/Arc2d.js +2 -2
  39. package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
  40. package/dist-cjs/lib/primitives/geometry/Circle2d.js +1 -1
  41. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
  42. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +1 -1
  43. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
  44. package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js.map +2 -2
  45. package/dist-cjs/lib/primitives/geometry/Edge2d.js +1 -1
  46. package/dist-cjs/lib/primitives/geometry/Edge2d.js.map +2 -2
  47. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
  48. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +91 -20
  49. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
  50. package/dist-cjs/lib/primitives/geometry/Group2d.js +55 -2
  51. package/dist-cjs/lib/primitives/geometry/Group2d.js.map +2 -2
  52. package/dist-cjs/lib/primitives/geometry/Point2d.js.map +2 -2
  53. package/dist-cjs/lib/primitives/geometry/Polyline2d.js.map +2 -2
  54. package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +2 -2
  55. package/dist-cjs/lib/utils/areShapesContentEqual.js +25 -0
  56. package/dist-cjs/lib/utils/areShapesContentEqual.js.map +7 -0
  57. package/dist-cjs/lib/utils/debug-flags.js +5 -2
  58. package/dist-cjs/lib/utils/debug-flags.js.map +2 -2
  59. package/dist-cjs/lib/utils/dom.js +3 -3
  60. package/dist-cjs/lib/utils/dom.js.map +2 -2
  61. package/dist-cjs/lib/utils/nearestMultiple.js +34 -0
  62. package/dist-cjs/lib/utils/nearestMultiple.js.map +7 -0
  63. package/dist-cjs/lib/utils/rotation.js +5 -5
  64. package/dist-cjs/lib/utils/rotation.js.map +2 -2
  65. package/dist-cjs/version.js +3 -3
  66. package/dist-cjs/version.js.map +1 -1
  67. package/dist-esm/index.d.mts +114 -111
  68. package/dist-esm/index.mjs +9 -41
  69. package/dist-esm/index.mjs.map +2 -2
  70. package/dist-esm/lib/TldrawEditor.mjs +2 -1
  71. package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
  72. package/dist-esm/lib/components/Shape.mjs +12 -8
  73. package/dist-esm/lib/components/Shape.mjs.map +2 -2
  74. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +27 -2
  75. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  76. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs +14 -12
  77. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs.map +2 -2
  78. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +17 -11
  79. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +2 -2
  80. package/dist-esm/lib/components/default-components/DefaultSpinner.mjs +1 -1
  81. package/dist-esm/lib/components/default-components/DefaultSpinner.mjs.map +2 -2
  82. package/dist-esm/lib/editor/Editor.mjs +65 -35
  83. package/dist-esm/lib/editor/Editor.mjs.map +3 -3
  84. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs.map +2 -2
  85. package/dist-esm/lib/editor/managers/TextManager.mjs +10 -0
  86. package/dist-esm/lib/editor/managers/TextManager.mjs.map +2 -2
  87. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  88. package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs.map +2 -2
  89. package/dist-esm/lib/exports/getSvgJsx.mjs +12 -3
  90. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  91. package/dist-esm/lib/hooks/useDocumentEvents.mjs +3 -2
  92. package/dist-esm/lib/hooks/useDocumentEvents.mjs.map +2 -2
  93. package/dist-esm/lib/hooks/useEditorComponents.mjs +16 -15
  94. package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
  95. package/dist-esm/lib/license/LicenseManager.mjs +8 -1
  96. package/dist-esm/lib/license/LicenseManager.mjs.map +2 -2
  97. package/dist-esm/lib/options.mjs.map +2 -2
  98. package/dist-esm/lib/primitives/Box.mjs +16 -0
  99. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  100. package/dist-esm/lib/primitives/Mat.mjs +1 -1
  101. package/dist-esm/lib/primitives/Mat.mjs.map +2 -2
  102. package/dist-esm/lib/primitives/Vec.mjs +20 -0
  103. package/dist-esm/lib/primitives/Vec.mjs.map +2 -2
  104. package/dist-esm/lib/primitives/geometry/Arc2d.mjs +2 -2
  105. package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
  106. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +1 -1
  107. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
  108. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +1 -1
  109. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
  110. package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs.map +2 -2
  111. package/dist-esm/lib/primitives/geometry/Edge2d.mjs +1 -1
  112. package/dist-esm/lib/primitives/geometry/Edge2d.mjs.map +2 -2
  113. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
  114. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +92 -21
  115. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
  116. package/dist-esm/lib/primitives/geometry/Group2d.mjs +55 -2
  117. package/dist-esm/lib/primitives/geometry/Group2d.mjs.map +2 -2
  118. package/dist-esm/lib/primitives/geometry/Point2d.mjs.map +2 -2
  119. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs.map +2 -2
  120. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +2 -2
  121. package/dist-esm/lib/utils/areShapesContentEqual.mjs +5 -0
  122. package/dist-esm/lib/utils/areShapesContentEqual.mjs.map +7 -0
  123. package/dist-esm/lib/utils/debug-flags.mjs +5 -2
  124. package/dist-esm/lib/utils/debug-flags.mjs.map +2 -2
  125. package/dist-esm/lib/utils/dom.mjs +3 -3
  126. package/dist-esm/lib/utils/dom.mjs.map +2 -2
  127. package/dist-esm/lib/utils/nearestMultiple.mjs +14 -0
  128. package/dist-esm/lib/utils/nearestMultiple.mjs.map +7 -0
  129. package/dist-esm/lib/utils/rotation.mjs +5 -5
  130. package/dist-esm/lib/utils/rotation.mjs.map +2 -2
  131. package/dist-esm/version.mjs +3 -3
  132. package/dist-esm/version.mjs.map +1 -1
  133. package/editor.css +40 -4
  134. package/package.json +7 -7
  135. package/src/index.ts +16 -31
  136. package/src/lib/TldrawEditor.tsx +6 -1
  137. package/src/lib/components/Shape.tsx +14 -10
  138. package/src/lib/components/default-components/DefaultCanvas.tsx +32 -2
  139. package/src/lib/components/default-components/DefaultErrorFallback.tsx +25 -14
  140. package/src/lib/components/default-components/DefaultShapeIndicator.tsx +17 -8
  141. package/src/lib/components/default-components/DefaultSpinner.tsx +1 -1
  142. package/src/lib/editor/Editor.test.ts +1 -1
  143. package/src/lib/editor/Editor.ts +62 -34
  144. package/src/lib/editor/managers/SnapManager/HandleSnaps.ts +0 -1
  145. package/src/lib/editor/managers/TextManager.ts +12 -0
  146. package/src/lib/editor/shapes/ShapeUtil.ts +22 -2
  147. package/src/lib/editor/shapes/shared/getPerfectDashProps.ts +9 -9
  148. package/src/lib/exports/getSvgJsx.tsx +16 -7
  149. package/src/lib/hooks/useDocumentEvents.ts +7 -2
  150. package/src/lib/hooks/useEditorComponents.tsx +32 -28
  151. package/src/lib/license/LicenseManager.test.ts +40 -0
  152. package/src/lib/license/LicenseManager.ts +13 -1
  153. package/src/lib/options.ts +4 -0
  154. package/src/lib/primitives/Box.ts +20 -0
  155. package/src/lib/primitives/Mat.ts +5 -4
  156. package/src/lib/primitives/Vec.ts +23 -0
  157. package/src/lib/primitives/geometry/Arc2d.ts +5 -5
  158. package/src/lib/primitives/geometry/Circle2d.ts +4 -4
  159. package/src/lib/primitives/geometry/CubicBezier2d.ts +4 -4
  160. package/src/lib/primitives/geometry/CubicSpline2d.ts +3 -3
  161. package/src/lib/primitives/geometry/Edge2d.ts +3 -3
  162. package/src/lib/primitives/geometry/Ellipse2d.ts +3 -3
  163. package/src/lib/primitives/geometry/Geometry2d.test.ts +42 -0
  164. package/src/lib/primitives/geometry/Geometry2d.ts +123 -35
  165. package/src/lib/primitives/geometry/Group2d.ts +70 -7
  166. package/src/lib/primitives/geometry/Point2d.ts +2 -2
  167. package/src/lib/primitives/geometry/Polyline2d.ts +3 -3
  168. package/src/lib/primitives/geometry/Stadium2d.ts +3 -3
  169. package/src/lib/test/currentToolIdMask.test.ts +1 -1
  170. package/src/lib/test/user.test.ts +1 -1
  171. package/src/lib/utils/areShapesContentEqual.ts +4 -0
  172. package/src/lib/utils/debug-flags.ts +7 -2
  173. package/src/lib/utils/dom.ts +4 -4
  174. package/src/lib/utils/nearestMultiple.ts +13 -0
  175. package/src/lib/utils/rotation.ts +8 -6
  176. package/src/lib/utils/sync/LocalIndexedDb.test.ts +1 -1
  177. package/src/lib/utils/sync/TLLocalSyncClient.test.ts +1 -1
  178. package/src/version.ts +3 -3
@@ -100,6 +100,7 @@ var import_Group2d = require("../primitives/geometry/Group2d");
100
100
  var import_intersect = require("../primitives/intersect");
101
101
  var import_utils2 = require("../primitives/utils");
102
102
  var import_SharedStylesMap = require("../utils/SharedStylesMap");
103
+ var import_areShapesContentEqual = require("../utils/areShapesContentEqual");
103
104
  var import_assets = require("../utils/assets");
104
105
  var import_debug_flags = require("../utils/debug-flags");
105
106
  var import_deepLinks = require("../utils/deepLinks");
@@ -423,7 +424,6 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
423
424
  ) : getShapeVisibility;
424
425
  this.options = { ...import_options.defaultTldrawOptions, ...options };
425
426
  this.store = store;
426
- this.disposables.add(this.store.dispose.bind(this.store));
427
427
  this.history = new import_HistoryManager.HistoryManager({
428
428
  store,
429
429
  annotateError: (error) => {
@@ -835,6 +835,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
835
835
  dispose() {
836
836
  this.disposables.forEach((dispose) => dispose());
837
837
  this.disposables.clear();
838
+ this.store.dispose();
838
839
  this.isDisposed = true;
839
840
  }
840
841
  getShapeUtil(arg) {
@@ -1347,8 +1348,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1347
1348
  return this.getCurrentPageState().selectedShapeIds;
1348
1349
  }
1349
1350
  getSelectedShapes() {
1350
- const { selectedShapeIds } = this.getCurrentPageState();
1351
- return (0, import_utils.compact)(selectedShapeIds.map((id) => this.store.get(id)));
1351
+ return (0, import_utils.compact)(this.getSelectedShapeIds().map((id) => this.store.get(id)));
1352
1352
  }
1353
1353
  /**
1354
1354
  * Select one or more shapes.
@@ -1738,13 +1738,21 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1738
1738
  setEditingShape(shape) {
1739
1739
  const id = typeof shape === "string" ? shape : shape?.id ?? null;
1740
1740
  this.setRichTextEditor(null);
1741
- if (id !== this.getEditingShapeId()) {
1741
+ const prevEditingShapeId = this.getEditingShapeId();
1742
+ if (id !== prevEditingShapeId) {
1742
1743
  if (id) {
1743
1744
  const shape2 = this.getShape(id);
1744
1745
  if (shape2 && this.getShapeUtil(shape2).canEdit(shape2)) {
1745
1746
  this.run(
1746
1747
  () => {
1747
1748
  this._updateCurrentPageState({ editingShapeId: id });
1749
+ if (prevEditingShapeId) {
1750
+ const prevEditingShape = this.getShape(prevEditingShapeId);
1751
+ if (prevEditingShape) {
1752
+ this.getShapeUtil(prevEditingShape).onEditEnd?.(prevEditingShape);
1753
+ }
1754
+ }
1755
+ this.getShapeUtil(shape2).onEditStart?.(shape2);
1748
1756
  },
1749
1757
  { history: "ignore" }
1750
1758
  );
@@ -1755,6 +1763,12 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1755
1763
  () => {
1756
1764
  this._updateCurrentPageState({ editingShapeId: null });
1757
1765
  this._currentRichTextEditor.set(null);
1766
+ if (prevEditingShapeId) {
1767
+ const prevEditingShape = this.getShape(prevEditingShapeId);
1768
+ if (prevEditingShape) {
1769
+ this.getShapeUtil(prevEditingShape).onEditEnd?.(prevEditingShape);
1770
+ }
1771
+ }
1758
1772
  },
1759
1773
  { history: "ignore" }
1760
1774
  );
@@ -1950,12 +1964,22 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1950
1964
  }
1951
1965
  return baseCamera;
1952
1966
  }
1967
+ _getFollowingPresence(targetUserId) {
1968
+ const visited = [this.user.getId()];
1969
+ const collaborators = this.getCollaborators();
1970
+ let leaderPresence = null;
1971
+ while (targetUserId && !visited.includes(targetUserId)) {
1972
+ leaderPresence = collaborators.find((c) => c.userId === targetUserId) ?? null;
1973
+ targetUserId = leaderPresence?.followingUserId ?? null;
1974
+ if (leaderPresence) {
1975
+ visited.push(leaderPresence.userId);
1976
+ }
1977
+ }
1978
+ return leaderPresence;
1979
+ }
1953
1980
  getViewportPageBoundsForFollowing() {
1954
- const followingUserId = this.getInstanceState().followingUserId;
1955
- if (!followingUserId) return null;
1956
- const leaderPresence = this.getCollaborators().find((c) => c.userId === followingUserId);
1957
- if (!leaderPresence) return null;
1958
- if (!leaderPresence.camera || !leaderPresence.screenBounds) return null;
1981
+ const leaderPresence = this._getFollowingPresence(this.getInstanceState().followingUserId);
1982
+ if (!leaderPresence?.camera || !leaderPresence?.screenBounds) return null;
1959
1983
  const { w: lw, h: lh } = leaderPresence.screenBounds;
1960
1984
  const { x: lx, y: ly, z: lz } = leaderPresence.camera;
1961
1985
  const theirViewport = new import_Box.Box(-lx, -ly, lw / lz, lh / lz);
@@ -2862,34 +2886,30 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
2862
2886
  */
2863
2887
  startFollowingUser(userId) {
2864
2888
  this.stopFollowingUser();
2865
- const leaderPresences = this._getCollaboratorsQuery().get().filter((p) => p.userId === userId);
2866
- if (!leaderPresences.length) {
2867
- console.warn("User not found");
2868
- return this;
2869
- }
2870
2889
  const thisUserId = this.user.getId();
2871
2890
  if (!thisUserId) {
2872
2891
  console.warn("You should set the userId for the current instance before following a user");
2873
2892
  }
2874
- if (leaderPresences.some((p) => p.followingUserId === thisUserId)) {
2893
+ const leaderPresence = this._getFollowingPresence(userId);
2894
+ if (!leaderPresence) {
2875
2895
  return this;
2876
2896
  }
2877
2897
  const latestLeaderPresence = (0, import_state.computed)("latestLeaderPresence", () => {
2878
- return this.getCollaborators().find((p) => p.userId === userId);
2898
+ return this._getFollowingPresence(userId);
2879
2899
  });
2880
2900
  (0, import_state.transact)(() => {
2881
2901
  this.updateInstanceState({ followingUserId: userId }, { history: "ignore" });
2882
2902
  const dispose = (0, import_state.react)("update current page", () => {
2883
- const leaderPresence = latestLeaderPresence.get();
2884
- if (!leaderPresence) {
2903
+ const leaderPresence2 = latestLeaderPresence.get();
2904
+ if (!leaderPresence2) {
2885
2905
  this.stopFollowingUser();
2886
2906
  return;
2887
2907
  }
2888
- if (leaderPresence.currentPageId !== this.getCurrentPageId() && this.getPage(leaderPresence.currentPageId)) {
2908
+ if (leaderPresence2.currentPageId !== this.getCurrentPageId() && this.getPage(leaderPresence2.currentPageId)) {
2889
2909
  this.run(
2890
2910
  () => {
2891
2911
  this.store.put([
2892
- { ...this.getInstanceState(), currentPageId: leaderPresence.currentPageId }
2912
+ { ...this.getInstanceState(), currentPageId: leaderPresence2.currentPageId }
2893
2913
  ]);
2894
2914
  this._isLockedOnFollowingUser.set(true);
2895
2915
  },
@@ -2904,8 +2924,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
2904
2924
  this.off("stop-following", cancel);
2905
2925
  };
2906
2926
  const moveTowardsUser = () => {
2907
- const leaderPresence = latestLeaderPresence.get();
2908
- if (!leaderPresence) {
2927
+ const leaderPresence2 = latestLeaderPresence.get();
2928
+ if (!leaderPresence2) {
2909
2929
  this.stopFollowingUser();
2910
2930
  return;
2911
2931
  }
@@ -3434,7 +3454,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
3434
3454
  this.fonts.trackFontsForShape(shape2);
3435
3455
  return this.getShapeUtil(shape2).getGeometry(shape2, opts);
3436
3456
  },
3437
- { areRecordsEqual: (a, b) => a.props === b.props }
3457
+ { areRecordsEqual: import_areShapesContentEqual.areShapesContentEqual }
3438
3458
  );
3439
3459
  }
3440
3460
  return this._shapeGeometryCaches[context].get(
@@ -3477,9 +3497,15 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
3477
3497
  );
3478
3498
  }
3479
3499
  _getShapeHandlesCache() {
3480
- return this.store.createComputedCache("handles", (shape) => {
3481
- return this.getShapeUtil(shape).getHandles?.(shape);
3482
- });
3500
+ return this.store.createComputedCache(
3501
+ "handles",
3502
+ (shape) => {
3503
+ return this.getShapeUtil(shape).getHandles?.(shape);
3504
+ },
3505
+ {
3506
+ areRecordsEqual: import_areShapesContentEqual.areShapesContentEqual
3507
+ }
3508
+ );
3483
3509
  }
3484
3510
  /**
3485
3511
  * Get the handles (if any) for a shape.
@@ -4363,9 +4389,15 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
4363
4389
  }
4364
4390
  _getBindingsIndexCache() {
4365
4391
  const index = (0, import_bindingsIndex.bindingsIndex)(this);
4366
- return this.store.createComputedCache("bindingsIndex", (shape) => {
4367
- return index.get().get(shape.id);
4368
- });
4392
+ return this.store.createComputedCache(
4393
+ "bindingsIndex",
4394
+ (shape) => {
4395
+ return index.get().get(shape.id);
4396
+ },
4397
+ // we can ignore the shape equality check here because the index is
4398
+ // computed incrementally based on what bindings are in the store
4399
+ { areRecordsEqual: () => true }
4400
+ );
4369
4401
  }
4370
4402
  /**
4371
4403
  * Get a binding from the store by its ID if it exists.
@@ -7440,7 +7472,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7440
7472
  const { x: cx, y: cy, z: cz } = (0, import_state.unsafe__withoutCapture)(() => this.getCamera());
7441
7473
  const { x: dx, y: dy, z: dz = 0 } = info.delta;
7442
7474
  let behavior = wheelBehavior;
7443
- if (inputs.ctrlKey) behavior = wheelBehavior === "pan" ? "zoom" : "pan";
7475
+ if (info.ctrlKey) behavior = wheelBehavior === "pan" ? "zoom" : "pan";
7444
7476
  switch (behavior) {
7445
7477
  case "zoom": {
7446
7478
  const { x, y } = this.inputs.currentScreenPoint;
@@ -7521,12 +7553,10 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7521
7553
  const { x: cx, y: cy, z: cz } = (0, import_state.unsafe__withoutCapture)(() => this.getCamera());
7522
7554
  if (this.inputs.isPanning && this.inputs.isPointing) {
7523
7555
  const { currentScreenPoint, previousScreenPoint } = this.inputs;
7524
- const { panSpeed } = cameraOptions;
7525
7556
  const offset = import_Vec.Vec.Sub(currentScreenPoint, previousScreenPoint);
7526
- this.setCamera(
7527
- new import_Vec.Vec(cx + offset.x * panSpeed / cz, cy + offset.y * panSpeed / cz, cz),
7528
- { immediate: true }
7529
- );
7557
+ this.setCamera(new import_Vec.Vec(cx + offset.x / cz, cy + offset.y / cz, cz), {
7558
+ immediate: true
7559
+ });
7530
7560
  this.maybeTrackPerformance("Panning");
7531
7561
  return;
7532
7562
  }