@tldraw/editor 5.5.4 → 5.6.0-canary.0091c91994d6

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 (101) hide show
  1. package/dist-cjs/index.d.ts +166 -1
  2. package/dist-cjs/index.js +7 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/TldrawEditor.js +18 -5
  5. package/dist-cjs/lib/TldrawEditor.js.map +3 -3
  6. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js +57 -15
  7. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js.map +2 -2
  8. package/dist-cjs/lib/config/TLI18n.js +64 -0
  9. package/dist-cjs/lib/config/TLI18n.js.map +7 -0
  10. package/dist-cjs/lib/editor/Editor.js +44 -16
  11. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  12. package/dist-cjs/lib/editor/derivations/shapeIdsInCurrentPage.js +10 -3
  13. package/dist-cjs/lib/editor/derivations/shapeIdsInCurrentPage.js.map +2 -2
  14. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js +1 -1
  15. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +2 -2
  16. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js +19 -2
  17. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +2 -2
  18. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js +3 -5
  19. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js.map +2 -2
  20. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js +7 -1
  21. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js.map +2 -2
  22. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +28 -0
  23. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  24. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +3 -0
  25. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
  26. package/dist-cjs/lib/editor/shapes/shared/resizeBox.js +21 -16
  27. package/dist-cjs/lib/editor/shapes/shared/resizeBox.js.map +2 -2
  28. package/dist-cjs/lib/hooks/useCursor.js +12 -8
  29. package/dist-cjs/lib/hooks/useCursor.js.map +2 -2
  30. package/dist-cjs/lib/hooks/useDocumentEvents.js +28 -3
  31. package/dist-cjs/lib/hooks/useDocumentEvents.js.map +2 -2
  32. package/dist-cjs/lib/license/LicenseManager.js +59 -0
  33. package/dist-cjs/lib/license/LicenseManager.js.map +2 -2
  34. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js +12 -5
  35. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js.map +2 -2
  36. package/dist-cjs/version.js +3 -3
  37. package/dist-cjs/version.js.map +1 -1
  38. package/dist-esm/index.d.mts +166 -1
  39. package/dist-esm/index.mjs +13 -1
  40. package/dist-esm/index.mjs.map +2 -2
  41. package/dist-esm/lib/TldrawEditor.mjs +18 -5
  42. package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
  43. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs +61 -16
  44. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs.map +2 -2
  45. package/dist-esm/lib/config/TLI18n.mjs +44 -0
  46. package/dist-esm/lib/config/TLI18n.mjs.map +7 -0
  47. package/dist-esm/lib/editor/Editor.mjs +46 -17
  48. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  49. package/dist-esm/lib/editor/derivations/shapeIdsInCurrentPage.mjs +10 -3
  50. package/dist-esm/lib/editor/derivations/shapeIdsInCurrentPage.mjs.map +2 -2
  51. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs +1 -1
  52. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +2 -2
  53. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs +20 -3
  54. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +2 -2
  55. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs +3 -5
  56. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs.map +2 -2
  57. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs +7 -1
  58. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs.map +2 -2
  59. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +28 -0
  60. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  61. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +3 -0
  62. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
  63. package/dist-esm/lib/editor/shapes/shared/resizeBox.mjs +21 -16
  64. package/dist-esm/lib/editor/shapes/shared/resizeBox.mjs.map +2 -2
  65. package/dist-esm/lib/hooks/useCursor.mjs +12 -8
  66. package/dist-esm/lib/hooks/useCursor.mjs.map +2 -2
  67. package/dist-esm/lib/hooks/useDocumentEvents.mjs +28 -3
  68. package/dist-esm/lib/hooks/useDocumentEvents.mjs.map +2 -2
  69. package/dist-esm/lib/license/LicenseManager.mjs +59 -0
  70. package/dist-esm/lib/license/LicenseManager.mjs.map +2 -2
  71. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs +13 -6
  72. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs.map +2 -2
  73. package/dist-esm/version.mjs +3 -3
  74. package/dist-esm/version.mjs.map +1 -1
  75. package/package.json +17 -19
  76. package/src/index.ts +14 -2
  77. package/src/lib/TldrawEditor.tsx +44 -4
  78. package/src/lib/components/default-components/DefaultErrorFallback.tsx +66 -18
  79. package/src/lib/config/TLI18n.test.ts +84 -0
  80. package/src/lib/config/TLI18n.ts +172 -0
  81. package/src/lib/editor/Editor.ts +90 -33
  82. package/src/lib/editor/derivations/shapeIdsInCurrentPage.ts +19 -3
  83. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.test.ts +17 -0
  84. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.ts +2 -2
  85. package/src/lib/editor/managers/FontManager/FontManager.test.ts +1 -0
  86. package/src/lib/editor/managers/FontManager/FontManager.ts +26 -3
  87. package/src/lib/editor/managers/HistoryManager/HistoryManager.test.ts +32 -0
  88. package/src/lib/editor/managers/ScribbleManager/ScribbleManager.ts +4 -6
  89. package/src/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.ts +16 -7
  90. package/src/lib/editor/shapes/ShapeUtil.ts +30 -0
  91. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +4 -0
  92. package/src/lib/editor/shapes/shared/resizeBox.ts +21 -16
  93. package/src/lib/hooks/useCursor.ts +14 -7
  94. package/src/lib/hooks/useDocumentEvents.ts +51 -3
  95. package/src/lib/license/LicenseManager.test.ts +156 -0
  96. package/src/lib/license/LicenseManager.ts +83 -0
  97. package/src/lib/test/useCursor.test.tsx +36 -0
  98. package/src/lib/test/useDocumentEvents.test.tsx +153 -22
  99. package/src/lib/utils/sync/TLLocalSyncClient.test.ts +73 -0
  100. package/src/lib/utils/sync/TLLocalSyncClient.ts +24 -8
  101. package/src/version.ts +3 -3
@@ -72,6 +72,7 @@ import {
72
72
  getSnapshot,
73
73
  loadSnapshot
74
74
  } from "../config/TLEditorSnapshot.mjs";
75
+ import { defaultI18n } from "../config/TLI18n.mjs";
75
76
  import {
76
77
  DEFAULT_ANIMATION_OPTIONS,
77
78
  DEFAULT_CAMERA_OPTIONS,
@@ -99,7 +100,8 @@ import {
99
100
  approximately,
100
101
  areAnglesCompatible,
101
102
  clamp,
102
- pointInPolygon
103
+ pointInPolygon,
104
+ shortAngleDist
103
105
  } from "../primitives/utils.mjs";
104
106
  import { Vec } from "../primitives/Vec.mjs";
105
107
  import { areShapesContentEqual } from "../utils/areShapesContentEqual.mjs";
@@ -164,9 +166,11 @@ class Editor extends EventEmitter {
164
166
  colorScheme,
165
167
  fontAssetUrls,
166
168
  themes,
167
- initialTheme
169
+ initialTheme,
170
+ i18n
168
171
  }) {
169
172
  super();
173
+ this.i18n = i18n ?? defaultI18n;
170
174
  this._getShapeVisibility = getShapeVisibility;
171
175
  const options = _textOptions ? { ..._options, text: _options?.text ?? _textOptions } : _options;
172
176
  this.options = { ...defaultTldrawOptions, ...options };
@@ -678,6 +682,12 @@ class Editor extends EventEmitter {
678
682
  */
679
683
  licenseManager;
680
684
  contextId = uniqueId();
685
+ /**
686
+ * The i18n adapter for translating strings.
687
+ *
688
+ * @public
689
+ */
690
+ i18n;
681
691
  /**
682
692
  * The editor's store
683
693
  *
@@ -1657,7 +1667,7 @@ class Editor extends EventEmitter {
1657
1667
  const firstParentId = selectedShapeIds[0] ? this.getShape(selectedShapeIds[0])?.parentId : null;
1658
1668
  const isSelectedWithinContainer = firstParentId && selectedShapeIds.every((shapeId) => this.getShape(shapeId)?.parentId === firstParentId) && !isPageId(firstParentId);
1659
1669
  const filteredShapes = this.getCurrentPageShapes().filter(
1660
- (shape2) => !this.isShapeOrAncestorLocked(shape2) && (isSelectedWithinContainer ? shape2.parentId === firstParentId : isPageId(shape2.parentId))
1670
+ (shape2) => isSelectedWithinContainer ? shape2.parentId === firstParentId : isPageId(shape2.parentId)
1661
1671
  );
1662
1672
  const readingOrderShapes = this._getShapesInReadingOrder(filteredShapes);
1663
1673
  const currentShapeId = selectedShapeIds.length === 1 ? selectedShapeIds[0] : readingOrderShapes.find((shape2) => selectedShapeIds.includes(shape2.id))?.id;
@@ -1800,6 +1810,11 @@ class Editor extends EventEmitter {
1800
1810
  this._selectShapesAndZoom([sortedChildren[0].id]);
1801
1811
  }
1802
1812
  _selectShapesAndZoom(ids) {
1813
+ const selectedShapeIds = this.getSelectedShapeIds();
1814
+ const isSelectionChanging = ids.length !== selectedShapeIds.length || ids.some((id) => !selectedShapeIds.includes(id));
1815
+ if (isSelectionChanging) {
1816
+ this.markHistoryStoppingPoint("selecting adjacent shape");
1817
+ }
1803
1818
  this.setSelectedShapes(ids);
1804
1819
  this.zoomToSelectionIfOffscreen(256, {
1805
1820
  animation: {
@@ -3698,7 +3713,9 @@ class Editor extends EventEmitter {
3698
3713
  const id = typeof page === "string" ? page : page.id;
3699
3714
  const freshPage = this.getPage(id);
3700
3715
  if (!freshPage) return this;
3701
- const prevCamera = { ...this.getCamera() };
3716
+ const prevCamera = {
3717
+ ...(this.store.get(CameraRecordType.createId(freshPage.id)) ?? this.getCamera())
3718
+ };
3702
3719
  const content = this.getContentFromCurrentPage(this.getSortedChildIdsForParent(freshPage.id));
3703
3720
  this.run(() => {
3704
3721
  const pages = this.getPages();
@@ -3707,7 +3724,7 @@ class Editor extends EventEmitter {
3707
3724
  this.setCurrentPage(createId);
3708
3725
  this.setCamera(prevCamera);
3709
3726
  if (content) {
3710
- return this.putContentOntoCurrentPage(content);
3727
+ return this.putContentOntoCurrentPage(content, { preservePosition: true });
3711
3728
  }
3712
3729
  });
3713
3730
  return this;
@@ -5967,9 +5984,10 @@ class Editor extends EventEmitter {
5967
5984
  }
5968
5985
  }
5969
5986
  let workingShape = null;
5987
+ const initialPagePoint = Mat.applyToPoint(pageTransform, new Vec());
5970
5988
  if (util.onResize && util.canResize(initialShape)) {
5971
5989
  const newPagePoint = this._scalePagePoint(
5972
- Mat.applyToPoint(pageTransform, new Vec(0, 0)),
5990
+ initialPagePoint,
5973
5991
  scaleOrigin,
5974
5992
  scale,
5975
5993
  scaleAxisRotation
@@ -5982,7 +6000,6 @@ class Editor extends EventEmitter {
5982
6000
  );
5983
6001
  myScale.x = areWidthAndHeightAlignedWithCorrectAxis ? scale.x : scale.y;
5984
6002
  myScale.y = areWidthAndHeightAlignedWithCorrectAxis ? scale.y : scale.x;
5985
- const initialPagePoint = Mat.applyToPoint(pageTransform, new Vec());
5986
6003
  const { x, y } = this.getPointInParentSpace(initialShape.id, initialPagePoint);
5987
6004
  workingShape = initialShape;
5988
6005
  if (!opts.skipStartAndEndCallbacks) {
@@ -6028,24 +6045,26 @@ class Editor extends EventEmitter {
6028
6045
  scale,
6029
6046
  scaleAxisRotation
6030
6047
  );
6031
- const initialPageCenterInParentSpace = this.getPointInParentSpace(
6048
+ const repositionedPagePoint = Vec.Add(
6049
+ newPageCenter,
6050
+ Vec.Sub(initialPagePoint, initialPageCenter)
6051
+ );
6052
+ const repositionedLocalPoint = this.getPointInParentSpace(
6032
6053
  initialShape.id,
6033
- initialPageCenter
6054
+ repositionedPagePoint
6034
6055
  );
6035
- const newPageCenterInParentSpace = this.getPointInParentSpace(initialShape.id, newPageCenter);
6036
- const delta = Vec.Sub(newPageCenterInParentSpace, initialPageCenterInParentSpace);
6037
6056
  if (workingShape) {
6038
6057
  return {
6039
6058
  ...workingShape,
6040
- x: initialShape.x + delta.x,
6041
- y: initialShape.y + delta.y
6059
+ x: repositionedLocalPoint.x,
6060
+ y: repositionedLocalPoint.y
6042
6061
  };
6043
6062
  }
6044
6063
  return {
6045
6064
  id,
6046
6065
  type: initialShape.type,
6047
- x: initialShape.x + delta.x,
6048
- y: initialShape.y + delta.y
6066
+ x: repositionedLocalPoint.x,
6067
+ y: repositionedLocalPoint.y
6049
6068
  };
6050
6069
  }
6051
6070
  /** @internal */
@@ -6071,11 +6090,20 @@ class Editor extends EventEmitter {
6071
6090
  initialShape: options.initialShape,
6072
6091
  initialBounds: options.initialBounds,
6073
6092
  isAspectRatioLocked: options.isAspectRatioLocked,
6074
- initialPageTransform: options.initialPageTransform
6093
+ initialPageTransform: options.initialPageTransform,
6094
+ dragHandle: options.dragHandle,
6095
+ mode: options.mode,
6096
+ // this is one frame of the same resize, not a new one, so don't fire start/end again
6097
+ skipStartAndEndCallbacks: options.skipStartAndEndCallbacks
6075
6098
  });
6076
6099
  if (Math.sign(scale.x) * Math.sign(scale.y) < 0) {
6077
6100
  const parentRotation = this.getShapeParentTransform(id).rotation();
6078
- const rotation = -options.initialShape.rotation - 2 * parentRotation;
6101
+ const parentDelta = shortAngleDist(
6102
+ Mat.Cast(options.initialPageTransform).rotation() - options.initialShape.rotation,
6103
+ parentRotation
6104
+ );
6105
+ const initialParentRotation = parentRotation - parentDelta;
6106
+ const rotation = 2 * options.scaleAxisRotation - options.initialShape.rotation - 2 * initialParentRotation - parentDelta;
6079
6107
  this.updateShapes([{ id, type, rotation }]);
6080
6108
  }
6081
6109
  const preScaleShapePageCenter = Mat.applyToPoint(
@@ -8384,6 +8412,7 @@ class Editor extends EventEmitter {
8384
8412
  break;
8385
8413
  }
8386
8414
  case "key_repeat": {
8415
+ inputs.keys.add(info.code);
8387
8416
  break;
8388
8417
  }
8389
8418
  }