@tldraw/editor 4.6.0-internal.e29318c66fb0 → 4.6.0-next.0c36db38afea

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 (155) hide show
  1. package/dist-cjs/index.d.ts +184 -24
  2. package/dist-cjs/index.js +5 -4
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/TldrawEditor.js +4 -2
  5. package/dist-cjs/lib/TldrawEditor.js.map +2 -2
  6. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +1 -1
  7. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  8. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js +1 -1
  9. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js.map +2 -2
  10. package/dist-cjs/lib/config/{createTLUser.js → createTLCurrentUser.js} +9 -9
  11. package/dist-cjs/lib/config/createTLCurrentUser.js.map +7 -0
  12. package/dist-cjs/lib/config/createTLStore.js +24 -1
  13. package/dist-cjs/lib/config/createTLStore.js.map +2 -2
  14. package/dist-cjs/lib/config/defaultShapes.js.map +2 -2
  15. package/dist-cjs/lib/editor/Editor.js +115 -8
  16. package/dist-cjs/lib/editor/Editor.js.map +3 -3
  17. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js +1 -1
  18. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +2 -2
  19. package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js +1 -1
  20. package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js.map +2 -2
  21. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js.map +2 -2
  22. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js +4 -4
  23. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js.map +2 -2
  24. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js +102 -30
  25. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +2 -2
  26. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +2 -2
  27. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +10 -0
  28. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  29. package/dist-cjs/lib/editor/types/clipboard-types.js.map +1 -1
  30. package/dist-cjs/lib/exports/StyleEmbedder.js +1 -1
  31. package/dist-cjs/lib/exports/StyleEmbedder.js.map +2 -2
  32. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  33. package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
  34. package/dist-cjs/lib/hooks/useGestureEvents.js +171 -127
  35. package/dist-cjs/lib/hooks/useGestureEvents.js.map +3 -3
  36. package/dist-cjs/lib/hooks/useLocalStore.js.map +2 -2
  37. package/dist-cjs/lib/options.js +3 -0
  38. package/dist-cjs/lib/options.js.map +2 -2
  39. package/dist-cjs/lib/primitives/Box.js +1 -1
  40. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  41. package/dist-cjs/lib/primitives/geometry/Arc2d.js +2 -2
  42. package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
  43. package/dist-cjs/lib/primitives/geometry/Circle2d.js +2 -2
  44. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
  45. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +2 -2
  46. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
  47. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +4 -3
  48. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
  49. package/dist-cjs/lib/primitives/geometry/Polyline2d.js +1 -1
  50. package/dist-cjs/lib/primitives/geometry/Polyline2d.js.map +2 -2
  51. package/dist-cjs/lib/primitives/geometry/Stadium2d.js +1 -1
  52. package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +2 -2
  53. package/dist-cjs/lib/utils/getSvgPathFromPoints.js.map +2 -2
  54. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js +1 -1
  55. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js.map +2 -2
  56. package/dist-cjs/version.js +3 -3
  57. package/dist-cjs/version.js.map +1 -1
  58. package/dist-esm/index.d.mts +184 -24
  59. package/dist-esm/index.mjs +12 -5
  60. package/dist-esm/index.mjs.map +2 -2
  61. package/dist-esm/lib/TldrawEditor.mjs +4 -2
  62. package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
  63. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +1 -1
  64. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  65. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs +1 -1
  66. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs.map +2 -2
  67. package/dist-esm/lib/config/{createTLUser.mjs → createTLCurrentUser.mjs} +6 -6
  68. package/dist-esm/lib/config/createTLCurrentUser.mjs.map +7 -0
  69. package/dist-esm/lib/config/createTLStore.mjs +28 -2
  70. package/dist-esm/lib/config/createTLStore.mjs.map +2 -2
  71. package/dist-esm/lib/config/defaultShapes.mjs.map +2 -2
  72. package/dist-esm/lib/editor/Editor.mjs +118 -9
  73. package/dist-esm/lib/editor/Editor.mjs.map +3 -3
  74. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs +1 -1
  75. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +2 -2
  76. package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs +1 -1
  77. package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs.map +2 -2
  78. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs.map +2 -2
  79. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs +4 -4
  80. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs.map +2 -2
  81. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs +102 -30
  82. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +2 -2
  83. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +2 -2
  84. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +10 -0
  85. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  86. package/dist-esm/lib/exports/StyleEmbedder.mjs +1 -1
  87. package/dist-esm/lib/exports/StyleEmbedder.mjs.map +2 -2
  88. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  89. package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
  90. package/dist-esm/lib/hooks/useGestureEvents.mjs +171 -127
  91. package/dist-esm/lib/hooks/useGestureEvents.mjs.map +3 -3
  92. package/dist-esm/lib/hooks/useLocalStore.mjs.map +2 -2
  93. package/dist-esm/lib/options.mjs +3 -0
  94. package/dist-esm/lib/options.mjs.map +2 -2
  95. package/dist-esm/lib/primitives/Box.mjs +1 -1
  96. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  97. package/dist-esm/lib/primitives/geometry/Arc2d.mjs +2 -2
  98. package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
  99. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +2 -2
  100. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
  101. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +2 -2
  102. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
  103. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +4 -3
  104. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
  105. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs +1 -1
  106. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs.map +2 -2
  107. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs +1 -1
  108. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +2 -2
  109. package/dist-esm/lib/utils/getSvgPathFromPoints.mjs.map +2 -2
  110. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs +1 -1
  111. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs.map +2 -2
  112. package/dist-esm/version.mjs +3 -3
  113. package/dist-esm/version.mjs.map +1 -1
  114. package/editor.css +13 -0
  115. package/package.json +8 -9
  116. package/src/index.ts +14 -2
  117. package/src/lib/TldrawEditor.tsx +9 -7
  118. package/src/lib/components/default-components/DefaultCanvas.tsx +1 -1
  119. package/src/lib/components/default-components/DefaultCollaboratorHint.tsx +1 -1
  120. package/src/lib/config/TLEditorSnapshot.test.ts +1 -1
  121. package/src/lib/config/{createTLUser.ts → createTLCurrentUser.ts} +6 -6
  122. package/src/lib/config/createTLStore.ts +36 -2
  123. package/src/lib/config/defaultShapes.ts +1 -1
  124. package/src/lib/editor/Editor.ts +148 -10
  125. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.ts +1 -1
  126. package/src/lib/editor/managers/SnapManager/BoundsSnaps.ts +1 -1
  127. package/src/lib/editor/managers/SnapManager/HandleSnaps.ts +1 -1
  128. package/src/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.ts +5 -5
  129. package/src/lib/editor/managers/TextManager/TextManager.test.ts +18 -4
  130. package/src/lib/editor/managers/TextManager/TextManager.ts +140 -34
  131. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +2 -2
  132. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.ts +2 -2
  133. package/src/lib/editor/shapes/ShapeUtil.ts +13 -2
  134. package/src/lib/editor/types/clipboard-types.ts +2 -1
  135. package/src/lib/exports/StyleEmbedder.ts +1 -1
  136. package/src/lib/exports/getSvgJsx.tsx +1 -1
  137. package/src/lib/hooks/useEditorComponents.tsx +1 -1
  138. package/src/lib/hooks/useGestureEvents.ts +240 -168
  139. package/src/lib/hooks/useLocalStore.ts +1 -1
  140. package/src/lib/options.ts +108 -0
  141. package/src/lib/primitives/Box.test.ts +30 -0
  142. package/src/lib/primitives/Box.ts +1 -1
  143. package/src/lib/primitives/geometry/Arc2d.ts +2 -2
  144. package/src/lib/primitives/geometry/Circle2d.ts +2 -2
  145. package/src/lib/primitives/geometry/Ellipse2d.ts +2 -2
  146. package/src/lib/primitives/geometry/Geometry2d.test.ts +21 -0
  147. package/src/lib/primitives/geometry/Geometry2d.ts +4 -3
  148. package/src/lib/primitives/geometry/Polyline2d.ts +1 -1
  149. package/src/lib/primitives/geometry/Stadium2d.ts +1 -1
  150. package/src/lib/utils/getSvgPathFromPoints.ts +1 -1
  151. package/src/lib/utils/sync/TLLocalSyncClient.test.ts +1 -1
  152. package/src/lib/utils/sync/TLLocalSyncClient.ts +1 -1
  153. package/src/version.ts +3 -3
  154. package/dist-cjs/lib/config/createTLUser.js.map +0 -7
  155. package/dist-esm/lib/config/createTLUser.mjs.map +0 -7
@@ -44,10 +44,10 @@ var import_store = require("@tldraw/store");
44
44
  var import_tlschema = require("@tldraw/tlschema");
45
45
  var import_utils = require("@tldraw/utils");
46
46
  var import_eventemitter3 = __toESM(require("eventemitter3"), 1);
47
- var import_TLEditorSnapshot = require("../config/TLEditorSnapshot");
48
- var import_createTLUser = require("../config/createTLUser");
47
+ var import_createTLCurrentUser = require("../config/createTLCurrentUser");
49
48
  var import_defaultBindings = require("../config/defaultBindings");
50
49
  var import_defaultShapes = require("../config/defaultShapes");
50
+ var import_TLEditorSnapshot = require("../config/TLEditorSnapshot");
51
51
  var import_constants = require("../constants");
52
52
  var import_domUtils = require("../exports/domUtils");
53
53
  var import_exportToSvg = require("../exports/exportToSvg");
@@ -56,13 +56,12 @@ var import_menus = require("../globals/menus");
56
56
  var import_time = require("../globals/time");
57
57
  var import_options = require("../options");
58
58
  var import_Box = require("../primitives/Box");
59
- var import_Mat = require("../primitives/Mat");
60
- var import_Vec = require("../primitives/Vec");
61
59
  var import_easings = require("../primitives/easings");
62
60
  var import_Group2d = require("../primitives/geometry/Group2d");
63
61
  var import_intersect = require("../primitives/intersect");
62
+ var import_Mat = require("../primitives/Mat");
64
63
  var import_utils2 = require("../primitives/utils");
65
- var import_SharedStylesMap = require("../utils/SharedStylesMap");
64
+ var import_Vec = require("../primitives/Vec");
66
65
  var import_areShapesContentEqual = require("../utils/areShapesContentEqual");
67
66
  var import_assets = require("../utils/assets");
68
67
  var import_debug_flags = require("../utils/debug-flags");
@@ -71,6 +70,7 @@ var import_getIncrementedName = require("../utils/getIncrementedName");
71
70
  var import_reorderShapes = require("../utils/reorderShapes");
72
71
  var import_reparenting = require("../utils/reparenting");
73
72
  var import_rotation = require("../utils/rotation");
73
+ var import_SharedStylesMap = require("../utils/SharedStylesMap");
74
74
  var import_bindingsIndex = require("./derivations/bindingsIndex");
75
75
  var import_notVisibleShapes = require("./derivations/notVisibleShapes");
76
76
  var import_parentsToChildren = require("./derivations/parentsToChildren");
@@ -132,13 +132,17 @@ class Editor extends import_eventemitter3.default {
132
132
  ...options?.camera
133
133
  });
134
134
  this._textOptions = (0, import_state.atom)("text options", options?.text ?? null);
135
- this.user = new import_UserPreferencesManager.UserPreferencesManager(user ?? (0, import_createTLUser.createTLUser)(), inferDarkMode ?? false);
135
+ this.user = new import_UserPreferencesManager.UserPreferencesManager(user ?? (0, import_createTLCurrentUser.createTLCurrentUser)(), inferDarkMode ?? false);
136
136
  this.disposables.add(() => this.user.dispose());
137
137
  this.getContainer = getContainer;
138
138
  this.textMeasure = new import_TextManager.TextManager(this);
139
139
  this.disposables.add(() => this.textMeasure.dispose());
140
140
  this.fonts = new import_FontManager.FontManager(this, fontAssetUrls);
141
141
  this._tickManager = new import_TickManager.TickManager(this);
142
+ this.disposables.add(() => {
143
+ this.off("tick", this._decayCameraStateTimeout);
144
+ this._setCameraState("idle");
145
+ });
142
146
  this.inputs = new import_InputsManager.InputsManager(this);
143
147
  class NewRoot extends import_RootState.RootState {
144
148
  static initial = initialState ?? "";
@@ -515,6 +519,14 @@ class Editor extends import_eventemitter3.default {
515
519
  })
516
520
  );
517
521
  }
522
+ this.disposables.add(
523
+ (0, import_state.react)("sync current user record", () => {
524
+ const user2 = this.store.props.users.currentUser.get();
525
+ if (user2) {
526
+ this._ensureUserRecord(user2);
527
+ }
528
+ })
529
+ );
518
530
  }
519
531
  _getShapeVisibility;
520
532
  getIsShapeHiddenCache() {
@@ -2821,6 +2833,76 @@ class Editor extends import_eventemitter3.default {
2821
2833
  const currentPageId = this.getCurrentPageId();
2822
2834
  return this.getCollaborators().filter((c) => c.currentPageId === currentPageId);
2823
2835
  }
2836
+ // Attribution
2837
+ /**
2838
+ * Get the current user's ID for attribution purposes.
2839
+ * Also ensures a `user:` record exists in the store for the current user.
2840
+ * Returns `null` when the user store has no current user.
2841
+ *
2842
+ * @public
2843
+ */
2844
+ getAttributionUserId() {
2845
+ const user = this.store.props.users.currentUser.get();
2846
+ if (!user) return null;
2847
+ this._ensureUserRecord(user);
2848
+ return import_tlschema.UserRecordType.parseId(user.id);
2849
+ }
2850
+ /**
2851
+ * Ensure a user record exists in the store for the given user,
2852
+ * updating it if the data has changed.
2853
+ *
2854
+ * @internal
2855
+ */
2856
+ _ensureUserRecord(user) {
2857
+ const existing = this.store.get(user.id);
2858
+ if (existing && existing.name === user.name && existing.color === user.color && existing.imageUrl === user.imageUrl && existing.meta === user.meta) {
2859
+ return;
2860
+ }
2861
+ this.run(
2862
+ () => {
2863
+ this.store.put([user]);
2864
+ },
2865
+ { history: "ignore" }
2866
+ );
2867
+ }
2868
+ /**
2869
+ * Resolve a display name for a user ID. Asks the
2870
+ * {@link @tldraw/tlschema#TLUserStore} first (the app's source of truth),
2871
+ * falling back to the `user:` record in the store.
2872
+ *
2873
+ * @public
2874
+ */
2875
+ getAttributionDisplayName(userId) {
2876
+ if (!userId) return null;
2877
+ return this.store.props.users.resolve(userId).get()?.name ?? this.store.get((0, import_tlschema.createUserId)(userId))?.name ?? null;
2878
+ }
2879
+ /**
2880
+ * Resolve a user record by ID. Asks the
2881
+ * {@link @tldraw/tlschema#TLUserStore} first (the app's source of truth),
2882
+ * falling back to the `user:` record in the store.
2883
+ *
2884
+ * @public
2885
+ */
2886
+ getAttributionUser(userId) {
2887
+ if (!userId) return null;
2888
+ return this.store.props.users.resolve(userId).get() ?? this.store.get((0, import_tlschema.createUserId)(userId)) ?? null;
2889
+ }
2890
+ /**
2891
+ * Collect user IDs referenced by a set of shapes via shape-specific props
2892
+ * (e.g. `textFirstEditedBy` on notes).
2893
+ *
2894
+ * @internal
2895
+ */
2896
+ _getReferencedUserIds(shapes) {
2897
+ const userIds = /* @__PURE__ */ new Set();
2898
+ for (const shape of shapes) {
2899
+ const util = this.getShapeUtil(shape);
2900
+ for (const id of util.getReferencedUserIds(shape)) {
2901
+ userIds.add(id);
2902
+ }
2903
+ }
2904
+ return userIds;
2905
+ }
2824
2906
  // Following
2825
2907
  // When we are 'locked on' to a user, our camera is derived from their camera.
2826
2908
  _isLockedOnFollowingUser = (0, import_state.atom)("isLockedOnFollowingUser", false);
@@ -6534,12 +6616,22 @@ class Editor extends import_eventemitter3.default {
6534
6616
  if (!asset) continue;
6535
6617
  assets.push(asset);
6536
6618
  }
6619
+ const users = [];
6620
+ const seenUserIds = /* @__PURE__ */ new Set();
6621
+ for (const userId of this._getReferencedUserIds(shapes2)) {
6622
+ const recordId = (0, import_tlschema.createUserId)(userId);
6623
+ if (seenUserIds.has(recordId)) continue;
6624
+ seenUserIds.add(recordId);
6625
+ const user = this.store.get(recordId);
6626
+ if (user) users.push(user);
6627
+ }
6537
6628
  return {
6538
6629
  schema: this.store.schema.serialize(),
6539
6630
  shapes: shapes2,
6540
6631
  rootShapeIds,
6541
6632
  bindings,
6542
- assets
6633
+ assets,
6634
+ users
6543
6635
  };
6544
6636
  });
6545
6637
  }
@@ -6589,13 +6681,15 @@ class Editor extends import_eventemitter3.default {
6589
6681
  const assets = [];
6590
6682
  const shapes = [];
6591
6683
  const bindings = [];
6684
+ const users = [];
6592
6685
  const store = {
6593
6686
  store: {
6594
6687
  ...Object.fromEntries(content.assets.map((asset) => [asset.id, asset])),
6595
6688
  ...Object.fromEntries(content.shapes.map((shape) => [shape.id, shape])),
6596
6689
  ...Object.fromEntries(
6597
6690
  content.bindings?.map((bindings2) => [bindings2.id, bindings2]) ?? []
6598
- )
6691
+ ),
6692
+ ...Object.fromEntries(content.users?.map((user) => [user.id, user]) ?? [])
6599
6693
  },
6600
6694
  schema: content.schema
6601
6695
  };
@@ -6617,6 +6711,19 @@ class Editor extends import_eventemitter3.default {
6617
6711
  bindings.push(record);
6618
6712
  break;
6619
6713
  }
6714
+ case "user": {
6715
+ users.push(record);
6716
+ break;
6717
+ }
6718
+ }
6719
+ }
6720
+ if (users.length > 0) {
6721
+ const existingUserIds = new Set(
6722
+ this.store.allRecords().filter((r) => r.typeName === "user").map((r) => r.id)
6723
+ );
6724
+ const usersToCreate = users.filter((u) => !existingUserIds.has(u.id));
6725
+ if (usersToCreate.length > 0) {
6726
+ this.store.put(usersToCreate);
6620
6727
  }
6621
6728
  }
6622
6729
  const shapeIdMap = new Map(