@tldraw/editor 3.13.0-canary.3ac739625a6f → 3.13.0-canary.42a3293334f5

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
@@ -132,6 +132,7 @@ import { Group2d } from "../primitives/geometry/Group2d.mjs";
132
132
  import { intersectPolygonPolygon } from "../primitives/intersect.mjs";
133
133
  import { PI, approximately, areAnglesCompatible, clamp, pointInPolygon } from "../primitives/utils.mjs";
134
134
  import { SharedStyleMap } from "../utils/SharedStylesMap.mjs";
135
+ import { areShapesContentEqual } from "../utils/areShapesContentEqual.mjs";
135
136
  import { dataUrlToFile } from "../utils/assets.mjs";
136
137
  import { debugFlags } from "../utils/debug-flags.mjs";
137
138
  import {
@@ -457,7 +458,6 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
457
458
  ) : getShapeVisibility;
458
459
  this.options = { ...defaultTldrawOptions, ...options };
459
460
  this.store = store;
460
- this.disposables.add(this.store.dispose.bind(this.store));
461
461
  this.history = new HistoryManager({
462
462
  store,
463
463
  annotateError: (error) => {
@@ -869,6 +869,7 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
869
869
  dispose() {
870
870
  this.disposables.forEach((dispose) => dispose());
871
871
  this.disposables.clear();
872
+ this.store.dispose();
872
873
  this.isDisposed = true;
873
874
  }
874
875
  getShapeUtil(arg) {
@@ -1381,8 +1382,7 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
1381
1382
  return this.getCurrentPageState().selectedShapeIds;
1382
1383
  }
1383
1384
  getSelectedShapes() {
1384
- const { selectedShapeIds } = this.getCurrentPageState();
1385
- return compact(selectedShapeIds.map((id) => this.store.get(id)));
1385
+ return compact(this.getSelectedShapeIds().map((id) => this.store.get(id)));
1386
1386
  }
1387
1387
  /**
1388
1388
  * Select one or more shapes.
@@ -1772,13 +1772,21 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
1772
1772
  setEditingShape(shape) {
1773
1773
  const id = typeof shape === "string" ? shape : shape?.id ?? null;
1774
1774
  this.setRichTextEditor(null);
1775
- if (id !== this.getEditingShapeId()) {
1775
+ const prevEditingShapeId = this.getEditingShapeId();
1776
+ if (id !== prevEditingShapeId) {
1776
1777
  if (id) {
1777
1778
  const shape2 = this.getShape(id);
1778
1779
  if (shape2 && this.getShapeUtil(shape2).canEdit(shape2)) {
1779
1780
  this.run(
1780
1781
  () => {
1781
1782
  this._updateCurrentPageState({ editingShapeId: id });
1783
+ if (prevEditingShapeId) {
1784
+ const prevEditingShape = this.getShape(prevEditingShapeId);
1785
+ if (prevEditingShape) {
1786
+ this.getShapeUtil(prevEditingShape).onEditEnd?.(prevEditingShape);
1787
+ }
1788
+ }
1789
+ this.getShapeUtil(shape2).onEditStart?.(shape2);
1782
1790
  },
1783
1791
  { history: "ignore" }
1784
1792
  );
@@ -1789,6 +1797,12 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
1789
1797
  () => {
1790
1798
  this._updateCurrentPageState({ editingShapeId: null });
1791
1799
  this._currentRichTextEditor.set(null);
1800
+ if (prevEditingShapeId) {
1801
+ const prevEditingShape = this.getShape(prevEditingShapeId);
1802
+ if (prevEditingShape) {
1803
+ this.getShapeUtil(prevEditingShape).onEditEnd?.(prevEditingShape);
1804
+ }
1805
+ }
1792
1806
  },
1793
1807
  { history: "ignore" }
1794
1808
  );
@@ -1984,12 +1998,22 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
1984
1998
  }
1985
1999
  return baseCamera;
1986
2000
  }
2001
+ _getFollowingPresence(targetUserId) {
2002
+ const visited = [this.user.getId()];
2003
+ const collaborators = this.getCollaborators();
2004
+ let leaderPresence = null;
2005
+ while (targetUserId && !visited.includes(targetUserId)) {
2006
+ leaderPresence = collaborators.find((c) => c.userId === targetUserId) ?? null;
2007
+ targetUserId = leaderPresence?.followingUserId ?? null;
2008
+ if (leaderPresence) {
2009
+ visited.push(leaderPresence.userId);
2010
+ }
2011
+ }
2012
+ return leaderPresence;
2013
+ }
1987
2014
  getViewportPageBoundsForFollowing() {
1988
- const followingUserId = this.getInstanceState().followingUserId;
1989
- if (!followingUserId) return null;
1990
- const leaderPresence = this.getCollaborators().find((c) => c.userId === followingUserId);
1991
- if (!leaderPresence) return null;
1992
- if (!leaderPresence.camera || !leaderPresence.screenBounds) return null;
2015
+ const leaderPresence = this._getFollowingPresence(this.getInstanceState().followingUserId);
2016
+ if (!leaderPresence?.camera || !leaderPresence?.screenBounds) return null;
1993
2017
  const { w: lw, h: lh } = leaderPresence.screenBounds;
1994
2018
  const { x: lx, y: ly, z: lz } = leaderPresence.camera;
1995
2019
  const theirViewport = new Box(-lx, -ly, lw / lz, lh / lz);
@@ -2896,34 +2920,30 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
2896
2920
  */
2897
2921
  startFollowingUser(userId) {
2898
2922
  this.stopFollowingUser();
2899
- const leaderPresences = this._getCollaboratorsQuery().get().filter((p) => p.userId === userId);
2900
- if (!leaderPresences.length) {
2901
- console.warn("User not found");
2902
- return this;
2903
- }
2904
2923
  const thisUserId = this.user.getId();
2905
2924
  if (!thisUserId) {
2906
2925
  console.warn("You should set the userId for the current instance before following a user");
2907
2926
  }
2908
- if (leaderPresences.some((p) => p.followingUserId === thisUserId)) {
2927
+ const leaderPresence = this._getFollowingPresence(userId);
2928
+ if (!leaderPresence) {
2909
2929
  return this;
2910
2930
  }
2911
2931
  const latestLeaderPresence = computed("latestLeaderPresence", () => {
2912
- return this.getCollaborators().find((p) => p.userId === userId);
2932
+ return this._getFollowingPresence(userId);
2913
2933
  });
2914
2934
  transact(() => {
2915
2935
  this.updateInstanceState({ followingUserId: userId }, { history: "ignore" });
2916
2936
  const dispose = react("update current page", () => {
2917
- const leaderPresence = latestLeaderPresence.get();
2918
- if (!leaderPresence) {
2937
+ const leaderPresence2 = latestLeaderPresence.get();
2938
+ if (!leaderPresence2) {
2919
2939
  this.stopFollowingUser();
2920
2940
  return;
2921
2941
  }
2922
- if (leaderPresence.currentPageId !== this.getCurrentPageId() && this.getPage(leaderPresence.currentPageId)) {
2942
+ if (leaderPresence2.currentPageId !== this.getCurrentPageId() && this.getPage(leaderPresence2.currentPageId)) {
2923
2943
  this.run(
2924
2944
  () => {
2925
2945
  this.store.put([
2926
- { ...this.getInstanceState(), currentPageId: leaderPresence.currentPageId }
2946
+ { ...this.getInstanceState(), currentPageId: leaderPresence2.currentPageId }
2927
2947
  ]);
2928
2948
  this._isLockedOnFollowingUser.set(true);
2929
2949
  },
@@ -2938,8 +2958,8 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
2938
2958
  this.off("stop-following", cancel);
2939
2959
  };
2940
2960
  const moveTowardsUser = () => {
2941
- const leaderPresence = latestLeaderPresence.get();
2942
- if (!leaderPresence) {
2961
+ const leaderPresence2 = latestLeaderPresence.get();
2962
+ if (!leaderPresence2) {
2943
2963
  this.stopFollowingUser();
2944
2964
  return;
2945
2965
  }
@@ -3468,7 +3488,7 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
3468
3488
  this.fonts.trackFontsForShape(shape2);
3469
3489
  return this.getShapeUtil(shape2).getGeometry(shape2, opts);
3470
3490
  },
3471
- { areRecordsEqual: (a, b) => a.props === b.props }
3491
+ { areRecordsEqual: areShapesContentEqual }
3472
3492
  );
3473
3493
  }
3474
3494
  return this._shapeGeometryCaches[context].get(
@@ -3511,9 +3531,15 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
3511
3531
  );
3512
3532
  }
3513
3533
  _getShapeHandlesCache() {
3514
- return this.store.createComputedCache("handles", (shape) => {
3515
- return this.getShapeUtil(shape).getHandles?.(shape);
3516
- });
3534
+ return this.store.createComputedCache(
3535
+ "handles",
3536
+ (shape) => {
3537
+ return this.getShapeUtil(shape).getHandles?.(shape);
3538
+ },
3539
+ {
3540
+ areRecordsEqual: areShapesContentEqual
3541
+ }
3542
+ );
3517
3543
  }
3518
3544
  /**
3519
3545
  * Get the handles (if any) for a shape.
@@ -4397,9 +4423,15 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
4397
4423
  }
4398
4424
  _getBindingsIndexCache() {
4399
4425
  const index = bindingsIndex(this);
4400
- return this.store.createComputedCache("bindingsIndex", (shape) => {
4401
- return index.get().get(shape.id);
4402
- });
4426
+ return this.store.createComputedCache(
4427
+ "bindingsIndex",
4428
+ (shape) => {
4429
+ return index.get().get(shape.id);
4430
+ },
4431
+ // we can ignore the shape equality check here because the index is
4432
+ // computed incrementally based on what bindings are in the store
4433
+ { areRecordsEqual: () => true }
4434
+ );
4403
4435
  }
4404
4436
  /**
4405
4437
  * Get a binding from the store by its ID if it exists.
@@ -7474,7 +7506,7 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
7474
7506
  const { x: cx, y: cy, z: cz } = unsafe__withoutCapture(() => this.getCamera());
7475
7507
  const { x: dx, y: dy, z: dz = 0 } = info.delta;
7476
7508
  let behavior = wheelBehavior;
7477
- if (inputs.ctrlKey) behavior = wheelBehavior === "pan" ? "zoom" : "pan";
7509
+ if (info.ctrlKey) behavior = wheelBehavior === "pan" ? "zoom" : "pan";
7478
7510
  switch (behavior) {
7479
7511
  case "zoom": {
7480
7512
  const { x, y } = this.inputs.currentScreenPoint;
@@ -7555,12 +7587,10 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
7555
7587
  const { x: cx, y: cy, z: cz } = unsafe__withoutCapture(() => this.getCamera());
7556
7588
  if (this.inputs.isPanning && this.inputs.isPointing) {
7557
7589
  const { currentScreenPoint, previousScreenPoint } = this.inputs;
7558
- const { panSpeed } = cameraOptions;
7559
7590
  const offset = Vec.Sub(currentScreenPoint, previousScreenPoint);
7560
- this.setCamera(
7561
- new Vec(cx + offset.x * panSpeed / cz, cy + offset.y * panSpeed / cz, cz),
7562
- { immediate: true }
7563
- );
7591
+ this.setCamera(new Vec(cx + offset.x / cz, cy + offset.y / cz, cz), {
7592
+ immediate: true
7593
+ });
7564
7594
  this.maybeTrackPerformance("Panning");
7565
7595
  return;
7566
7596
  }