@tldraw/editor 5.2.0-next.e2b8d10bf10e → 5.2.0

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 (172) hide show
  1. package/README.md +7 -1
  2. package/dist-cjs/index.d.ts +112 -53
  3. package/dist-cjs/index.js +7 -8
  4. package/dist-cjs/index.js.map +2 -2
  5. package/dist-cjs/lib/components/MenuClickCapture.js +8 -5
  6. package/dist-cjs/lib/components/MenuClickCapture.js.map +2 -2
  7. package/dist-cjs/lib/components/Shape.js +47 -1
  8. package/dist-cjs/lib/components/Shape.js.map +3 -3
  9. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +1 -16
  10. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  11. package/dist-cjs/lib/editor/Editor.js +97 -45
  12. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  13. package/dist-cjs/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.js +3 -3
  14. package/dist-cjs/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.js.map +2 -2
  15. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js +28 -4
  16. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +3 -3
  17. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js +24 -2
  18. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js.map +2 -2
  19. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js +14 -3
  20. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js.map +2 -2
  21. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js +4 -2
  22. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js.map +2 -2
  23. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js +7 -3
  24. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +2 -2
  25. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js +0 -1
  26. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +2 -2
  27. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +15 -2
  28. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +2 -2
  29. package/dist-cjs/lib/editor/overlays/strokeShapeIndicators.js +79 -0
  30. package/dist-cjs/lib/editor/overlays/strokeShapeIndicators.js.map +7 -0
  31. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  32. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js +4 -0
  33. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js.map +2 -2
  34. package/dist-cjs/lib/{hooks/useTransform.js → editor/tools/cancelShapeCreationOnLongPress.js} +8 -23
  35. package/dist-cjs/lib/editor/tools/cancelShapeCreationOnLongPress.js.map +7 -0
  36. package/dist-cjs/lib/editor/types/event-types.js.map +2 -2
  37. package/dist-cjs/lib/globals/environment.js +6 -1
  38. package/dist-cjs/lib/globals/environment.js.map +2 -2
  39. package/dist-cjs/lib/hooks/EditorComponentsContext.js.map +2 -2
  40. package/dist-cjs/lib/hooks/useCanvasEvents.js +17 -8
  41. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  42. package/dist-cjs/lib/hooks/useEditorComponents.js +0 -1
  43. package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
  44. package/dist-cjs/lib/hooks/usePresence.js.map +2 -2
  45. package/dist-cjs/lib/hooks/useScreenBounds.js +1 -0
  46. package/dist-cjs/lib/hooks/useScreenBounds.js.map +2 -2
  47. package/dist-cjs/lib/license/LicenseManager.js +5 -1
  48. package/dist-cjs/lib/license/LicenseManager.js.map +2 -2
  49. package/dist-cjs/lib/primitives/Vec.js +3 -2
  50. package/dist-cjs/lib/primitives/Vec.js.map +2 -2
  51. package/dist-cjs/lib/utils/dom.js +12 -0
  52. package/dist-cjs/lib/utils/dom.js.map +2 -2
  53. package/dist-cjs/lib/utils/getPointerInfo.js +2 -1
  54. package/dist-cjs/lib/utils/getPointerInfo.js.map +2 -2
  55. package/dist-cjs/lib/utils/pointer.js +37 -0
  56. package/dist-cjs/lib/utils/pointer.js.map +7 -0
  57. package/dist-cjs/version.js +3 -3
  58. package/dist-cjs/version.js.map +1 -1
  59. package/dist-esm/index.d.mts +112 -53
  60. package/dist-esm/index.mjs +9 -13
  61. package/dist-esm/index.mjs.map +2 -2
  62. package/dist-esm/lib/components/MenuClickCapture.mjs +8 -5
  63. package/dist-esm/lib/components/MenuClickCapture.mjs.map +2 -2
  64. package/dist-esm/lib/components/Shape.mjs +48 -2
  65. package/dist-esm/lib/components/Shape.mjs.map +3 -3
  66. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +1 -16
  67. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  68. package/dist-esm/lib/editor/Editor.mjs +97 -45
  69. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  70. package/dist-esm/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.mjs +3 -3
  71. package/dist-esm/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.mjs.map +2 -2
  72. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs +28 -4
  73. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +3 -3
  74. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs +24 -2
  75. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs.map +2 -2
  76. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs +14 -3
  77. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +2 -2
  78. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs +4 -2
  79. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs.map +2 -2
  80. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs +7 -3
  81. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +2 -2
  82. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs +0 -1
  83. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +2 -2
  84. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +15 -2
  85. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +2 -2
  86. package/dist-esm/lib/editor/overlays/strokeShapeIndicators.mjs +59 -0
  87. package/dist-esm/lib/editor/overlays/strokeShapeIndicators.mjs.map +7 -0
  88. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  89. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs +4 -0
  90. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs.map +2 -2
  91. package/dist-esm/lib/editor/tools/cancelShapeCreationOnLongPress.mjs +8 -0
  92. package/dist-esm/lib/editor/tools/cancelShapeCreationOnLongPress.mjs.map +7 -0
  93. package/dist-esm/lib/editor/types/event-types.mjs.map +2 -2
  94. package/dist-esm/lib/globals/environment.mjs +6 -1
  95. package/dist-esm/lib/globals/environment.mjs.map +2 -2
  96. package/dist-esm/lib/hooks/EditorComponentsContext.mjs.map +2 -2
  97. package/dist-esm/lib/hooks/useCanvasEvents.mjs +17 -8
  98. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  99. package/dist-esm/lib/hooks/useEditorComponents.mjs +0 -1
  100. package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
  101. package/dist-esm/lib/hooks/usePresence.mjs.map +2 -2
  102. package/dist-esm/lib/hooks/useScreenBounds.mjs +1 -0
  103. package/dist-esm/lib/hooks/useScreenBounds.mjs.map +2 -2
  104. package/dist-esm/lib/license/LicenseManager.mjs +5 -1
  105. package/dist-esm/lib/license/LicenseManager.mjs.map +2 -2
  106. package/dist-esm/lib/primitives/Vec.mjs +3 -2
  107. package/dist-esm/lib/primitives/Vec.mjs.map +2 -2
  108. package/dist-esm/lib/utils/dom.mjs +12 -0
  109. package/dist-esm/lib/utils/dom.mjs.map +2 -2
  110. package/dist-esm/lib/utils/getPointerInfo.mjs +2 -1
  111. package/dist-esm/lib/utils/getPointerInfo.mjs.map +2 -2
  112. package/dist-esm/lib/utils/pointer.mjs +17 -0
  113. package/dist-esm/lib/utils/pointer.mjs.map +7 -0
  114. package/dist-esm/version.mjs +3 -3
  115. package/dist-esm/version.mjs.map +1 -1
  116. package/editor.css +15 -3
  117. package/package.json +11 -8
  118. package/src/index.ts +4 -10
  119. package/src/lib/components/MenuClickCapture.tsx +8 -4
  120. package/src/lib/components/Shape.tsx +88 -1
  121. package/src/lib/components/default-components/DefaultCanvas.tsx +1 -17
  122. package/src/lib/editor/Editor.test.ts +36 -0
  123. package/src/lib/editor/Editor.ts +145 -55
  124. package/src/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.test.ts +43 -16
  125. package/src/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.ts +8 -5
  126. package/src/lib/editor/managers/FontManager/FontManager.test.ts +37 -10
  127. package/src/lib/editor/managers/FontManager/FontManager.ts +46 -1
  128. package/src/lib/editor/managers/HistoryManager/HistoryManager.test.ts +32 -0
  129. package/src/lib/editor/managers/HistoryManager/HistoryManager.ts +34 -4
  130. package/src/lib/editor/managers/InputsManager/InputsManager.test.ts +61 -0
  131. package/src/lib/editor/managers/InputsManager/InputsManager.ts +16 -4
  132. package/src/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.ts +9 -2
  133. package/src/lib/editor/managers/TextManager/TextManager.test.ts +16 -14
  134. package/src/lib/editor/managers/TextManager/TextManager.ts +17 -2
  135. package/src/lib/editor/managers/TickManager/TickManager.test.ts +0 -40
  136. package/src/lib/editor/managers/TickManager/TickManager.ts +0 -1
  137. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +12 -2
  138. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.ts +27 -2
  139. package/src/lib/editor/overlays/strokeShapeIndicators.ts +86 -0
  140. package/src/lib/editor/shapes/ShapeUtil.ts +41 -0
  141. package/src/lib/editor/tools/BaseBoxShapeTool/children/Pointing.ts +5 -0
  142. package/src/lib/editor/tools/cancelShapeCreationOnLongPress.ts +31 -0
  143. package/src/lib/editor/types/event-types.ts +7 -0
  144. package/src/lib/globals/environment.ts +7 -0
  145. package/src/lib/hooks/EditorComponentsContext.tsx +0 -2
  146. package/src/lib/hooks/useCanvasEvents.ts +24 -12
  147. package/src/lib/hooks/useEditorComponents.tsx +0 -1
  148. package/src/lib/hooks/usePresence.ts +2 -2
  149. package/src/lib/hooks/useScreenBounds.ts +3 -0
  150. package/src/lib/license/LicenseManager.test.ts +24 -16
  151. package/src/lib/license/LicenseManager.ts +8 -2
  152. package/src/lib/primitives/Vec.ts +5 -2
  153. package/src/lib/test/ContentElementSlot.test.tsx +201 -0
  154. package/src/lib/utils/dom.ts +34 -0
  155. package/src/lib/utils/getPointerInfo.ts +2 -1
  156. package/src/lib/utils/pointer.test.ts +76 -0
  157. package/src/lib/utils/pointer.ts +42 -0
  158. package/src/version.ts +3 -3
  159. package/dist-cjs/lib/components/default-components/DefaultSelectionBackground.js +0 -49
  160. package/dist-cjs/lib/components/default-components/DefaultSelectionBackground.js.map +0 -7
  161. package/dist-cjs/lib/editor/overlays/ShapeIndicatorOverlayUtil.js +0 -161
  162. package/dist-cjs/lib/editor/overlays/ShapeIndicatorOverlayUtil.js.map +0 -7
  163. package/dist-cjs/lib/hooks/useTransform.js.map +0 -7
  164. package/dist-esm/lib/components/default-components/DefaultSelectionBackground.mjs +0 -19
  165. package/dist-esm/lib/components/default-components/DefaultSelectionBackground.mjs.map +0 -7
  166. package/dist-esm/lib/editor/overlays/ShapeIndicatorOverlayUtil.mjs +0 -141
  167. package/dist-esm/lib/editor/overlays/ShapeIndicatorOverlayUtil.mjs.map +0 -7
  168. package/dist-esm/lib/hooks/useTransform.mjs +0 -23
  169. package/dist-esm/lib/hooks/useTransform.mjs.map +0 -7
  170. package/src/lib/components/default-components/DefaultSelectionBackground.tsx +0 -25
  171. package/src/lib/editor/overlays/ShapeIndicatorOverlayUtil.ts +0 -216
  172. package/src/lib/hooks/useTransform.ts +0 -30
@@ -188,12 +188,12 @@ class Editor extends EventEmitter {
188
188
  this._tickManager = new TickManager(this);
189
189
  this.disposables.add(() => this._tickManager.dispose());
190
190
  this.disposables.add(() => {
191
- this.off("tick", this._decayCameraStateTimeout);
192
191
  this._setCameraState("idle");
193
192
  });
194
193
  this.fonts = new FontManager(this, fontAssetUrls);
195
194
  this.disposables.add(() => this.fonts.dispose());
196
195
  this.inputs = new InputsManager(this);
196
+ this.disposables.add(() => this.inputs.dispose());
197
197
  this.performance = new PerformanceManager(this);
198
198
  this.disposables.add(() => this.performance.dispose());
199
199
  this.collaborators = new CollaboratorsManager(this);
@@ -822,6 +822,7 @@ class Editor extends EventEmitter {
822
822
  this.store.dispose();
823
823
  this.isDisposed = true;
824
824
  this.emit("dispose");
825
+ this.removeAllListeners();
825
826
  }
826
827
  /* ------------------ Themes (shadowing the theme manager) ------------------ */
827
828
  /**
@@ -1091,6 +1092,14 @@ class Editor extends EventEmitter {
1091
1092
  getMarkIdMatching(idSubstring) {
1092
1093
  return this.history.getMarkIdMatching(idSubstring);
1093
1094
  }
1095
+ /**
1096
+ * Whether the editor is currently replaying history (i.e. an undo or redo is being applied).
1097
+ *
1098
+ * @internal
1099
+ */
1100
+ isReplayingHistory() {
1101
+ return this.history.isReplaying();
1102
+ }
1094
1103
  /**
1095
1104
  * Coalesces all changes since the given mark into a single change, removing any intermediate marks.
1096
1105
  *
@@ -2185,7 +2194,7 @@ class Editor extends EventEmitter {
2185
2194
  return baseCamera;
2186
2195
  }
2187
2196
  _getFollowingPresence(targetUserId) {
2188
- const visited = [this.user.getId()];
2197
+ const visited = [this.user.getRecordId()];
2189
2198
  const collaborators = this.getCollaborators();
2190
2199
  let leaderPresence = null;
2191
2200
  while (targetUserId && !visited.includes(targetUserId)) {
@@ -2895,14 +2904,25 @@ class Editor extends EventEmitter {
2895
2904
  this.off("stop-camera-animation", cancel);
2896
2905
  };
2897
2906
  this.once("stop-camera-animation", cancel);
2907
+ const dirZ = direction.z ?? 0;
2898
2908
  const moveCamera = (elapsed) => {
2899
2909
  const { x: cx, y: cy, z: cz } = this.getCamera();
2900
- const movementVec = Vec.Mul(direction, currentSpeed * elapsed / cz);
2910
+ const dx = direction.x * (currentSpeed * elapsed) / cz;
2911
+ const dy = direction.y * (currentSpeed * elapsed) / cz;
2912
+ let newCx = cx + dx;
2913
+ let newCy = cy + dy;
2914
+ let newCz = cz;
2915
+ if (dirZ !== 0) {
2916
+ newCz = cz * (1 + dirZ * currentSpeed * elapsed);
2917
+ const center = this.getViewportScreenCenter();
2918
+ newCx += center.x / newCz - center.x / cz;
2919
+ newCy += center.y / newCz - center.y / cz;
2920
+ }
2901
2921
  currentSpeed *= 1 - friction;
2902
2922
  if (currentSpeed < speedThreshold) {
2903
2923
  cancel();
2904
2924
  } else {
2905
- this._setCamera(new Vec(cx + movementVec.x, cy + movementVec.y, cz));
2925
+ this._setCamera(new Vec(newCx, newCy, newCz));
2906
2926
  }
2907
2927
  };
2908
2928
  this.on("tick", moveCamera);
@@ -2982,6 +3002,7 @@ class Editor extends EventEmitter {
2982
3002
  screenBounds.height = Math.max(screenBounds.height, 1);
2983
3003
  }
2984
3004
  const doc = this.getContainerDocument();
3005
+ if (!doc.body) return this;
2985
3006
  const insets = [
2986
3007
  // top
2987
3008
  screenBounds.minY !== 0,
@@ -3191,7 +3212,7 @@ class Editor extends EventEmitter {
3191
3212
  }
3192
3213
  /**
3193
3214
  * Collect user IDs referenced by a set of shapes via shape-specific props
3194
- * (e.g. `textFirstEditedBy` on notes).
3215
+ * (e.g. `textLastEditedBy` on notes).
3195
3216
  *
3196
3217
  * @internal
3197
3218
  */
@@ -3222,7 +3243,7 @@ class Editor extends EventEmitter {
3222
3243
  */
3223
3244
  startFollowingUser(userId) {
3224
3245
  this.stopFollowingUser();
3225
- const thisUserId = this.user.getId();
3246
+ const thisUserId = this.user.getExternalId();
3226
3247
  if (!thisUserId) {
3227
3248
  console.warn("You should set the userId for the current instance before following a user");
3228
3249
  }
@@ -5926,24 +5947,40 @@ class Editor extends EventEmitter {
5926
5947
  * @public
5927
5948
  */
5928
5949
  resizeShape(shape, scale, opts = {}) {
5950
+ const partial = this.getResizeShapePartial(shape, scale, opts);
5951
+ if (partial) this.updateShapes([partial]);
5952
+ return this;
5953
+ }
5954
+ /**
5955
+ * Get the update for a resized shape without committing it to the store. Interactions that
5956
+ * resize many shapes at once use this to collect all of the updates and commit them in a
5957
+ * single batch. Returns null when there is nothing to update.
5958
+ *
5959
+ * Shapes that are rotated out of alignment with the scale axis cannot be resized with a
5960
+ * single update; those shapes are resized immediately (as `resizeShape` would do) and null
5961
+ * is returned.
5962
+ *
5963
+ * @internal
5964
+ */
5965
+ getResizeShapePartial(shape, scale, opts = {}) {
5929
5966
  const id = typeof shape === "string" ? shape : shape.id;
5930
- if (this.getIsReadonly()) return this;
5967
+ if (this.getIsReadonly()) return null;
5931
5968
  if (!Number.isFinite(scale.x)) scale = new Vec(1, scale.y);
5932
5969
  if (!Number.isFinite(scale.y)) scale = new Vec(scale.x, 1);
5933
5970
  const initialShape = opts.initialShape ?? this.getShape(id);
5934
- if (!initialShape) return this;
5971
+ if (!initialShape) return null;
5935
5972
  const scaleOrigin = opts.scaleOrigin ?? this.getShapePageBounds(id)?.center;
5936
- if (!scaleOrigin) return this;
5973
+ if (!scaleOrigin) return null;
5937
5974
  const pageTransform = opts.initialPageTransform ? Mat.Cast(opts.initialPageTransform) : this.getShapePageTransform(id);
5938
- if (!pageTransform) return this;
5975
+ if (!pageTransform) return null;
5939
5976
  const pageRotation = pageTransform.rotation();
5940
- if (pageRotation == null) return this;
5977
+ if (pageRotation == null) return null;
5941
5978
  const scaleAxisRotation = opts.scaleAxisRotation ?? pageRotation;
5942
5979
  const initialBounds = opts.initialBounds ?? this.getShapeGeometry(id).bounds;
5943
- if (!initialBounds) return this;
5980
+ if (!initialBounds) return null;
5944
5981
  const isAspectRatioLocked = opts.isAspectRatioLocked ?? this.getShapeUtil(initialShape).isAspectRatioLocked(initialShape);
5945
5982
  if (!areAnglesCompatible(pageRotation, scaleAxisRotation)) {
5946
- return this._resizeUnalignedShape(id, scale, {
5983
+ this._resizeUnalignedShape(id, scale, {
5947
5984
  ...opts,
5948
5985
  initialBounds,
5949
5986
  scaleOrigin,
@@ -5952,6 +5989,7 @@ class Editor extends EventEmitter {
5952
5989
  isAspectRatioLocked,
5953
5990
  initialShape
5954
5991
  });
5992
+ return null;
5955
5993
  }
5956
5994
  const util = this.getShapeUtil(initialShape);
5957
5995
  if (isAspectRatioLocked) {
@@ -5961,7 +5999,7 @@ class Editor extends EventEmitter {
5961
5999
  scale = new Vec(Math.sign(scale.x) * Math.abs(scale.y), scale.y);
5962
6000
  }
5963
6001
  }
5964
- let didResize = false;
6002
+ let workingShape = null;
5965
6003
  if (util.onResize && util.canResize(initialShape)) {
5966
6004
  const newPagePoint = this._scalePagePoint(
5967
6005
  Mat.applyToPoint(pageTransform, new Vec(0, 0)),
@@ -5979,7 +6017,7 @@ class Editor extends EventEmitter {
5979
6017
  myScale.y = areWidthAndHeightAlignedWithCorrectAxis ? scale.y : scale.x;
5980
6018
  const initialPagePoint = Mat.applyToPoint(pageTransform, new Vec());
5981
6019
  const { x, y } = this.getPointInParentSpace(initialShape.id, initialPagePoint);
5982
- let workingShape = initialShape;
6020
+ workingShape = initialShape;
5983
6021
  if (!opts.skipStartAndEndCallbacks) {
5984
6022
  workingShape = applyPartialToRecordWithProps(
5985
6023
  initialShape,
@@ -5999,9 +6037,6 @@ class Editor extends EventEmitter {
5999
6037
  initialShape
6000
6038
  }
6001
6039
  );
6002
- if (resizedShape) {
6003
- didResize = true;
6004
- }
6005
6040
  workingShape = applyPartialToRecordWithProps(workingShape, {
6006
6041
  id,
6007
6042
  type: initialShape.type,
@@ -6015,32 +6050,36 @@ class Editor extends EventEmitter {
6015
6050
  util.onResizeEnd?.(initialShape, workingShape) ?? void 0
6016
6051
  );
6017
6052
  }
6018
- this.updateShapes([workingShape]);
6053
+ if (resizedShape) {
6054
+ return workingShape;
6055
+ }
6019
6056
  }
6020
- if (!didResize) {
6021
- const initialPageCenter = Mat.applyToPoint(pageTransform, initialBounds.center);
6022
- const newPageCenter = this._scalePagePoint(
6023
- initialPageCenter,
6024
- scaleOrigin,
6025
- scale,
6026
- scaleAxisRotation
6027
- );
6028
- const initialPageCenterInParentSpace = this.getPointInParentSpace(
6029
- initialShape.id,
6030
- initialPageCenter
6031
- );
6032
- const newPageCenterInParentSpace = this.getPointInParentSpace(initialShape.id, newPageCenter);
6033
- const delta = Vec.Sub(newPageCenterInParentSpace, initialPageCenterInParentSpace);
6034
- this.updateShapes([
6035
- {
6036
- id,
6037
- type: initialShape.type,
6038
- x: initialShape.x + delta.x,
6039
- y: initialShape.y + delta.y
6040
- }
6041
- ]);
6057
+ const initialPageCenter = Mat.applyToPoint(pageTransform, initialBounds.center);
6058
+ const newPageCenter = this._scalePagePoint(
6059
+ initialPageCenter,
6060
+ scaleOrigin,
6061
+ scale,
6062
+ scaleAxisRotation
6063
+ );
6064
+ const initialPageCenterInParentSpace = this.getPointInParentSpace(
6065
+ initialShape.id,
6066
+ initialPageCenter
6067
+ );
6068
+ const newPageCenterInParentSpace = this.getPointInParentSpace(initialShape.id, newPageCenter);
6069
+ const delta = Vec.Sub(newPageCenterInParentSpace, initialPageCenterInParentSpace);
6070
+ if (workingShape) {
6071
+ return {
6072
+ ...workingShape,
6073
+ x: initialShape.x + delta.x,
6074
+ y: initialShape.y + delta.y
6075
+ };
6042
6076
  }
6043
- return this;
6077
+ return {
6078
+ id,
6079
+ type: initialShape.type,
6080
+ x: initialShape.x + delta.x,
6081
+ y: initialShape.y + delta.y
6082
+ };
6044
6083
  }
6045
6084
  /** @internal */
6046
6085
  _scalePagePoint(point, scaleOrigin, scale, scaleAxisRotation) {
@@ -7294,6 +7333,7 @@ class Editor extends EventEmitter {
7294
7333
  async getSvgElement(shapes, opts = {}) {
7295
7334
  const ids = shapes.length === 0 ? this.getCurrentPageShapeIdsSorted() : typeof shapes[0] === "string" ? shapes : shapes.map((s) => s.id);
7296
7335
  if (ids.length === 0) return void 0;
7336
+ await this.fonts.loadRequiredFontsForCurrentPage(this.options.maxFontsToLoadBeforeRender);
7297
7337
  return exportToSvg(this, ids, opts);
7298
7338
  }
7299
7339
  /**
@@ -8159,7 +8199,10 @@ class Editor extends EventEmitter {
8159
8199
  inputs.buttons.add(info.button);
8160
8200
  inputs.setIsPointing(true);
8161
8201
  inputs.setIsDragging(false);
8162
- if (!isPenMode && isPen) this.updateInstanceState({ isPenMode: true });
8202
+ if (!isPenMode && info.isPenDirect) {
8203
+ this.updateInstanceState({ isPenMode: true });
8204
+ this.interrupt();
8205
+ }
8163
8206
  if (info.button === STYLUS_ERASER_BUTTON) {
8164
8207
  this._restoreToolId = this.getCurrentToolId();
8165
8208
  this.complete();
@@ -8262,7 +8305,10 @@ class Editor extends EventEmitter {
8262
8305
  this.setCursor({ type: this._prevCursor, rotation: 0 });
8263
8306
  }
8264
8307
  if (slideSpeed > 0) {
8265
- this.slideCamera({ speed: slideSpeed, direction: slideDirection });
8308
+ this.slideCamera({
8309
+ speed: slideSpeed,
8310
+ direction: { x: slideDirection.x, y: slideDirection.y, z: 0 }
8311
+ });
8266
8312
  }
8267
8313
  this._selectedShapeIdsAtPointerDown = [];
8268
8314
  this._didCaptureSelectionAtPointerDown = false;
@@ -8270,7 +8316,10 @@ class Editor extends EventEmitter {
8270
8316
  }
8271
8317
  }
8272
8318
  if (slideSpeed > 0) {
8273
- this.slideCamera({ speed: slideSpeed, direction: slideDirection });
8319
+ this.slideCamera({
8320
+ speed: slideSpeed,
8321
+ direction: { x: slideDirection.x, y: slideDirection.y, z: 0 }
8322
+ });
8274
8323
  }
8275
8324
  } else {
8276
8325
  if (info.button === STYLUS_ERASER_BUTTON) {
@@ -8362,6 +8411,9 @@ class Editor extends EventEmitter {
8362
8411
  } else if (info.button === RIGHT_MOUSE_BUTTON) {
8363
8412
  info.name = "right_click";
8364
8413
  }
8414
+ if (info.name === "right_click" && this.getCurrentToolId() !== "select" && this.getStateDescendant("select")) {
8415
+ this.setCurrentTool("select");
8416
+ }
8365
8417
  const { isPenMode } = this.store.unsafeGetWithoutCapture(TLINSTANCE_ID);
8366
8418
  if (info.isPen === isPenMode) {
8367
8419
  const clickInfo = this._clickManager.handlePointerEvent(info);