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

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 (65) hide show
  1. package/dist-cjs/index.d.ts +19 -13
  2. package/dist-cjs/index.js +1 -1
  3. package/dist-cjs/lib/TldrawEditor.js +2 -1
  4. package/dist-cjs/lib/TldrawEditor.js.map +2 -2
  5. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +6 -0
  6. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  7. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js +14 -12
  8. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js.map +2 -2
  9. package/dist-cjs/lib/components/default-components/DefaultSpinner.js +1 -1
  10. package/dist-cjs/lib/components/default-components/DefaultSpinner.js.map +2 -2
  11. package/dist-cjs/lib/editor/Editor.js +25 -20
  12. package/dist-cjs/lib/editor/Editor.js.map +3 -3
  13. package/dist-cjs/lib/hooks/useDocumentEvents.js +3 -2
  14. package/dist-cjs/lib/hooks/useDocumentEvents.js.map +2 -2
  15. package/dist-cjs/lib/hooks/useEditorComponents.js +16 -15
  16. package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
  17. package/dist-cjs/lib/license/LicenseManager.js +8 -1
  18. package/dist-cjs/lib/license/LicenseManager.js.map +2 -2
  19. package/dist-cjs/lib/options.js.map +2 -2
  20. package/dist-cjs/lib/utils/dom.js +3 -3
  21. package/dist-cjs/lib/utils/dom.js.map +2 -2
  22. package/dist-cjs/lib/utils/rotation.js +5 -5
  23. package/dist-cjs/lib/utils/rotation.js.map +2 -2
  24. package/dist-cjs/version.js +3 -3
  25. package/dist-cjs/version.js.map +1 -1
  26. package/dist-esm/index.d.mts +19 -13
  27. package/dist-esm/index.mjs +1 -1
  28. package/dist-esm/lib/TldrawEditor.mjs +2 -1
  29. package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
  30. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +6 -0
  31. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  32. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs +14 -12
  33. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs.map +2 -2
  34. package/dist-esm/lib/components/default-components/DefaultSpinner.mjs +1 -1
  35. package/dist-esm/lib/components/default-components/DefaultSpinner.mjs.map +2 -2
  36. package/dist-esm/lib/editor/Editor.mjs +25 -20
  37. package/dist-esm/lib/editor/Editor.mjs.map +3 -3
  38. package/dist-esm/lib/hooks/useDocumentEvents.mjs +3 -2
  39. package/dist-esm/lib/hooks/useDocumentEvents.mjs.map +2 -2
  40. package/dist-esm/lib/hooks/useEditorComponents.mjs +16 -15
  41. package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
  42. package/dist-esm/lib/license/LicenseManager.mjs +8 -1
  43. package/dist-esm/lib/license/LicenseManager.mjs.map +2 -2
  44. package/dist-esm/lib/options.mjs.map +2 -2
  45. package/dist-esm/lib/utils/dom.mjs +3 -3
  46. package/dist-esm/lib/utils/dom.mjs.map +2 -2
  47. package/dist-esm/lib/utils/rotation.mjs +5 -5
  48. package/dist-esm/lib/utils/rotation.mjs.map +2 -2
  49. package/dist-esm/version.mjs +3 -3
  50. package/dist-esm/version.mjs.map +1 -1
  51. package/editor.css +11 -0
  52. package/package.json +7 -7
  53. package/src/lib/TldrawEditor.tsx +6 -1
  54. package/src/lib/components/default-components/DefaultCanvas.tsx +11 -0
  55. package/src/lib/components/default-components/DefaultErrorFallback.tsx +25 -14
  56. package/src/lib/components/default-components/DefaultSpinner.tsx +1 -1
  57. package/src/lib/editor/Editor.ts +22 -19
  58. package/src/lib/hooks/useDocumentEvents.ts +7 -2
  59. package/src/lib/hooks/useEditorComponents.tsx +32 -28
  60. package/src/lib/license/LicenseManager.test.ts +40 -0
  61. package/src/lib/license/LicenseManager.ts +13 -1
  62. package/src/lib/options.ts +4 -0
  63. package/src/lib/utils/dom.ts +4 -4
  64. package/src/lib/utils/rotation.ts +8 -6
  65. package/src/version.ts +3 -3
@@ -1347,8 +1347,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1347
1347
  return this.getCurrentPageState().selectedShapeIds;
1348
1348
  }
1349
1349
  getSelectedShapes() {
1350
- const { selectedShapeIds } = this.getCurrentPageState();
1351
- return (0, import_utils.compact)(selectedShapeIds.map((id) => this.store.get(id)));
1350
+ return (0, import_utils.compact)(this.getSelectedShapeIds().map((id) => this.store.get(id)));
1352
1351
  }
1353
1352
  /**
1354
1353
  * Select one or more shapes.
@@ -1950,12 +1949,22 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1950
1949
  }
1951
1950
  return baseCamera;
1952
1951
  }
1952
+ _getFollowingPresence(targetUserId) {
1953
+ const visited = [this.user.getId()];
1954
+ const collaborators = this.getCollaborators();
1955
+ let leaderPresence = null;
1956
+ while (targetUserId && !visited.includes(targetUserId)) {
1957
+ leaderPresence = collaborators.find((c) => c.userId === targetUserId) ?? null;
1958
+ targetUserId = leaderPresence?.followingUserId ?? null;
1959
+ if (leaderPresence) {
1960
+ visited.push(leaderPresence.userId);
1961
+ }
1962
+ }
1963
+ return leaderPresence;
1964
+ }
1953
1965
  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;
1966
+ const leaderPresence = this._getFollowingPresence(this.getInstanceState().followingUserId);
1967
+ if (!leaderPresence?.camera || !leaderPresence?.screenBounds) return null;
1959
1968
  const { w: lw, h: lh } = leaderPresence.screenBounds;
1960
1969
  const { x: lx, y: ly, z: lz } = leaderPresence.camera;
1961
1970
  const theirViewport = new import_Box.Box(-lx, -ly, lw / lz, lh / lz);
@@ -2862,34 +2871,30 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
2862
2871
  */
2863
2872
  startFollowingUser(userId) {
2864
2873
  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
2874
  const thisUserId = this.user.getId();
2871
2875
  if (!thisUserId) {
2872
2876
  console.warn("You should set the userId for the current instance before following a user");
2873
2877
  }
2874
- if (leaderPresences.some((p) => p.followingUserId === thisUserId)) {
2878
+ const leaderPresence = this._getFollowingPresence(userId);
2879
+ if (!leaderPresence) {
2875
2880
  return this;
2876
2881
  }
2877
2882
  const latestLeaderPresence = (0, import_state.computed)("latestLeaderPresence", () => {
2878
- return this.getCollaborators().find((p) => p.userId === userId);
2883
+ return this._getFollowingPresence(userId);
2879
2884
  });
2880
2885
  (0, import_state.transact)(() => {
2881
2886
  this.updateInstanceState({ followingUserId: userId }, { history: "ignore" });
2882
2887
  const dispose = (0, import_state.react)("update current page", () => {
2883
- const leaderPresence = latestLeaderPresence.get();
2884
- if (!leaderPresence) {
2888
+ const leaderPresence2 = latestLeaderPresence.get();
2889
+ if (!leaderPresence2) {
2885
2890
  this.stopFollowingUser();
2886
2891
  return;
2887
2892
  }
2888
- if (leaderPresence.currentPageId !== this.getCurrentPageId() && this.getPage(leaderPresence.currentPageId)) {
2893
+ if (leaderPresence2.currentPageId !== this.getCurrentPageId() && this.getPage(leaderPresence2.currentPageId)) {
2889
2894
  this.run(
2890
2895
  () => {
2891
2896
  this.store.put([
2892
- { ...this.getInstanceState(), currentPageId: leaderPresence.currentPageId }
2897
+ { ...this.getInstanceState(), currentPageId: leaderPresence2.currentPageId }
2893
2898
  ]);
2894
2899
  this._isLockedOnFollowingUser.set(true);
2895
2900
  },
@@ -2904,8 +2909,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
2904
2909
  this.off("stop-following", cancel);
2905
2910
  };
2906
2911
  const moveTowardsUser = () => {
2907
- const leaderPresence = latestLeaderPresence.get();
2908
- if (!leaderPresence) {
2912
+ const leaderPresence2 = latestLeaderPresence.get();
2913
+ if (!leaderPresence2) {
2909
2914
  this.stopFollowingUser();
2910
2915
  return;
2911
2916
  }