@tldraw/editor 5.5.0-next.b6a9f7cd7be2 → 5.5.0-next.c91b2de0a423

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 (96) hide show
  1. package/dist-cjs/index.d.ts +47 -23
  2. package/dist-cjs/index.js +1 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/TldrawEditor.js.map +2 -2
  5. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +5 -1
  6. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  7. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js +2 -5
  8. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js.map +3 -3
  9. package/dist-cjs/lib/components/default-components/DefaultSpinner.js.map +2 -2
  10. package/dist-cjs/lib/editor/Editor.js +24 -26
  11. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  12. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js +3 -2
  13. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +2 -2
  14. package/dist-cjs/lib/editor/managers/EditorManager.js +11 -2
  15. package/dist-cjs/lib/editor/managers/EditorManager.js.map +2 -2
  16. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceManager.js +49 -63
  17. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceManager.js.map +2 -2
  18. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js +1 -1
  19. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js.map +2 -2
  20. package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js +24 -24
  21. package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js.map +2 -2
  22. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js +7 -1
  23. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js.map +2 -2
  24. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js +4 -3
  25. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js.map +2 -2
  26. package/dist-cjs/lib/editor/types/external-content.js.map +1 -1
  27. package/dist-cjs/lib/hooks/EditorComponentsContext.js.map +2 -2
  28. package/dist-cjs/lib/utils/debug-flags.js +0 -6
  29. package/dist-cjs/lib/utils/debug-flags.js.map +2 -2
  30. package/dist-cjs/lib/utils/sync/LocalIndexedDb.js +19 -8
  31. package/dist-cjs/lib/utils/sync/LocalIndexedDb.js.map +2 -2
  32. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js +3 -0
  33. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js.map +2 -2
  34. package/dist-cjs/version.js +3 -3
  35. package/dist-cjs/version.js.map +1 -1
  36. package/dist-esm/index.d.mts +47 -23
  37. package/dist-esm/index.mjs +4 -2
  38. package/dist-esm/index.mjs.map +2 -2
  39. package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
  40. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +5 -1
  41. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  42. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs +2 -5
  43. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs.map +3 -3
  44. package/dist-esm/lib/components/default-components/DefaultSpinner.mjs.map +2 -2
  45. package/dist-esm/lib/editor/Editor.mjs +24 -26
  46. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  47. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs +3 -2
  48. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +2 -2
  49. package/dist-esm/lib/editor/managers/EditorManager.mjs +11 -2
  50. package/dist-esm/lib/editor/managers/EditorManager.mjs.map +2 -2
  51. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceManager.mjs +49 -63
  52. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceManager.mjs.map +2 -2
  53. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs +1 -1
  54. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs.map +2 -2
  55. package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs +24 -24
  56. package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs.map +2 -2
  57. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs +7 -1
  58. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs.map +2 -2
  59. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs +4 -3
  60. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs.map +2 -2
  61. package/dist-esm/lib/hooks/EditorComponentsContext.mjs.map +2 -2
  62. package/dist-esm/lib/utils/debug-flags.mjs +0 -6
  63. package/dist-esm/lib/utils/debug-flags.mjs.map +2 -2
  64. package/dist-esm/lib/utils/sync/LocalIndexedDb.mjs +19 -8
  65. package/dist-esm/lib/utils/sync/LocalIndexedDb.mjs.map +2 -2
  66. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs +3 -0
  67. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs.map +2 -2
  68. package/dist-esm/version.mjs +3 -3
  69. package/dist-esm/version.mjs.map +1 -1
  70. package/package.json +7 -7
  71. package/src/index.ts +5 -1
  72. package/src/lib/TldrawEditor.tsx +8 -6
  73. package/src/lib/components/default-components/DefaultCanvas.tsx +7 -1
  74. package/src/lib/components/default-components/DefaultErrorFallback.tsx +13 -5
  75. package/src/lib/components/default-components/DefaultSpinner.tsx +4 -1
  76. package/src/lib/editor/Editor.test.ts +45 -0
  77. package/src/lib/editor/Editor.ts +40 -35
  78. package/src/lib/editor/managers/ClickManager/ClickManager.test.ts +1 -0
  79. package/src/lib/editor/managers/ClickManager/ClickManager.ts +3 -2
  80. package/src/lib/editor/managers/EditorManager.test.ts +32 -1
  81. package/src/lib/editor/managers/EditorManager.ts +15 -3
  82. package/src/lib/editor/managers/PerformanceManager/PerformanceManager.test.ts +80 -0
  83. package/src/lib/editor/managers/PerformanceManager/PerformanceManager.ts +54 -81
  84. package/src/lib/editor/managers/ScribbleManager/ScribbleManager.ts +1 -1
  85. package/src/lib/editor/managers/SnapManager/BoundsSnaps.ts +32 -36
  86. package/src/lib/editor/managers/SnapManager/HandleSnaps.ts +13 -2
  87. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +13 -0
  88. package/src/lib/editor/managers/SnapManager/SnapManager.ts +6 -4
  89. package/src/lib/editor/types/external-content.ts +5 -0
  90. package/src/lib/hooks/EditorComponentsContext.tsx +2 -1
  91. package/src/lib/utils/debug-flags.ts +0 -6
  92. package/src/lib/utils/sync/LocalIndexedDb.test.ts +93 -1
  93. package/src/lib/utils/sync/LocalIndexedDb.ts +23 -8
  94. package/src/lib/utils/sync/TLLocalSyncClient.test.ts +21 -1
  95. package/src/lib/utils/sync/TLLocalSyncClient.ts +6 -0
  96. package/src/version.ts +3 -3
@@ -1449,7 +1449,7 @@ class Editor extends EventEmitter {
1449
1449
  updateInstanceState(partial, historyOptions) {
1450
1450
  this._updateInstanceState(partial, { history: "ignore", ...historyOptions });
1451
1451
  if (partial.isChangingStyle !== void 0) {
1452
- clearTimeout(this._isChangingStyleTimeout);
1452
+ this.timers.clearTimeout(this._isChangingStyleTimeout);
1453
1453
  if (partial.isChangingStyle === true) {
1454
1454
  this._isChangingStyleTimeout = this.timers.setTimeout(() => {
1455
1455
  this._updateInstanceState({ isChangingStyle: false }, { history: "ignore" });
@@ -7863,22 +7863,22 @@ class Editor extends EventEmitter {
7863
7863
  const releaseCtrl = this._ctrlKeyTimeout !== -1;
7864
7864
  const releaseMeta = this._metaKeyTimeout !== -1;
7865
7865
  if (releaseShift) {
7866
- clearTimeout(this._shiftKeyTimeout);
7866
+ this.timers.clearTimeout(this._shiftKeyTimeout);
7867
7867
  this._shiftKeyTimeout = -1;
7868
7868
  this.inputs.setShiftKey(false);
7869
7869
  }
7870
7870
  if (releaseAlt) {
7871
- clearTimeout(this._altKeyTimeout);
7871
+ this.timers.clearTimeout(this._altKeyTimeout);
7872
7872
  this._altKeyTimeout = -1;
7873
7873
  this.inputs.setAltKey(false);
7874
7874
  }
7875
7875
  if (releaseCtrl) {
7876
- clearTimeout(this._ctrlKeyTimeout);
7876
+ this.timers.clearTimeout(this._ctrlKeyTimeout);
7877
7877
  this._ctrlKeyTimeout = -1;
7878
7878
  this.inputs.setCtrlKey(false);
7879
7879
  }
7880
7880
  if (releaseMeta) {
7881
- clearTimeout(this._metaKeyTimeout);
7881
+ this.timers.clearTimeout(this._metaKeyTimeout);
7882
7882
  this._metaKeyTimeout = -1;
7883
7883
  this.inputs.setMetaKey(false);
7884
7884
  }
@@ -7992,28 +7992,28 @@ class Editor extends EventEmitter {
7992
7992
  return;
7993
7993
  }
7994
7994
  if (info.shiftKey) {
7995
- clearTimeout(this._shiftKeyTimeout);
7995
+ this.timers.clearTimeout(this._shiftKeyTimeout);
7996
7996
  this._shiftKeyTimeout = -1;
7997
7997
  inputs.setShiftKey(true);
7998
7998
  } else if (!info.shiftKey && inputs.getShiftKey() && this._shiftKeyTimeout === -1) {
7999
7999
  this._shiftKeyTimeout = this.timers.setTimeout(this._releaseShiftKey, 150);
8000
8000
  }
8001
8001
  if (info.altKey) {
8002
- clearTimeout(this._altKeyTimeout);
8002
+ this.timers.clearTimeout(this._altKeyTimeout);
8003
8003
  this._altKeyTimeout = -1;
8004
8004
  inputs.setAltKey(true);
8005
8005
  } else if (!info.altKey && inputs.getAltKey() && this._altKeyTimeout === -1) {
8006
8006
  this._altKeyTimeout = this.timers.setTimeout(this._releaseAltKey, 150);
8007
8007
  }
8008
8008
  if (info.ctrlKey) {
8009
- clearTimeout(this._ctrlKeyTimeout);
8009
+ this.timers.clearTimeout(this._ctrlKeyTimeout);
8010
8010
  this._ctrlKeyTimeout = -1;
8011
8011
  inputs.setCtrlKey(true);
8012
8012
  } else if (!info.ctrlKey && inputs.getCtrlKey() && this._ctrlKeyTimeout === -1) {
8013
8013
  this._ctrlKeyTimeout = this.timers.setTimeout(this._releaseCtrlKey, 150);
8014
8014
  }
8015
8015
  if (info.metaKey && info.name !== "key_up") {
8016
- clearTimeout(this._metaKeyTimeout);
8016
+ this.timers.clearTimeout(this._metaKeyTimeout);
8017
8017
  this._metaKeyTimeout = -1;
8018
8018
  inputs.setMetaKey(true);
8019
8019
  } else if (!info.metaKey && inputs.getMetaKey() && this._metaKeyTimeout === -1) {
@@ -8027,8 +8027,7 @@ class Editor extends EventEmitter {
8027
8027
  const cameraOptions = this._cameraOptions.__unsafe__getWithoutCapture();
8028
8028
  switch (type) {
8029
8029
  case "pinch": {
8030
- if (cameraOptions.isLocked) return;
8031
- clearTimeout(this._longPressTimeout);
8030
+ this.timers.clearTimeout(this._longPressTimeout);
8032
8031
  this.inputs.updateFromEvent(info);
8033
8032
  switch (info.name) {
8034
8033
  case "pinch_start": {
@@ -8049,6 +8048,7 @@ class Editor extends EventEmitter {
8049
8048
  }
8050
8049
  case "pinch": {
8051
8050
  if (!inputs.getIsPinching()) return;
8051
+ if (cameraOptions.isLocked) return;
8052
8052
  const {
8053
8053
  point: { z = 1 },
8054
8054
  delta: { x: dx, y: dy }
@@ -8104,7 +8104,7 @@ class Editor extends EventEmitter {
8104
8104
  const { panSpeed, zoomSpeed } = cameraOptions;
8105
8105
  let wheelBehavior = cameraOptions.wheelBehavior;
8106
8106
  const inputMode = this.user.getUserPreferences().inputMode;
8107
- if (inputMode !== null) {
8107
+ if (inputMode !== null && wheelBehavior !== "none") {
8108
8108
  wheelBehavior = inputMode === "trackpad" ? "pan" : "zoom";
8109
8109
  }
8110
8110
  if (wheelBehavior !== "none") {
@@ -8156,12 +8156,12 @@ class Editor extends EventEmitter {
8156
8156
  }
8157
8157
  case "pointer": {
8158
8158
  if (inputs.getIsPinching()) return;
8159
- this.inputs.updateFromEvent(info);
8160
8159
  const { isPen } = info;
8161
8160
  const { isPenMode } = instanceState;
8161
+ if (isPenMode && !isPen) return;
8162
+ this.inputs.updateFromEvent(info);
8162
8163
  switch (info.name) {
8163
8164
  case "pointer_down": {
8164
- if (isPenMode && !isPen) return;
8165
8165
  this._releaseDebouncedModifiers();
8166
8166
  if (!this.inputs.getIsPanning()) {
8167
8167
  this._longPressTimeout = this.timers.setTimeout(() => {
@@ -8190,7 +8190,7 @@ class Editor extends EventEmitter {
8190
8190
  this.updateInstanceState({ isPenMode: true });
8191
8191
  this.interrupt();
8192
8192
  }
8193
- if (info.button === STYLUS_ERASER_BUTTON) {
8193
+ if (info.button === STYLUS_ERASER_BUTTON && this.getStateDescendant("eraser")) {
8194
8194
  this._restoreToolId = this.getCurrentToolId();
8195
8195
  this.complete();
8196
8196
  this.setCurrentTool("eraser");
@@ -8199,10 +8199,10 @@ class Editor extends EventEmitter {
8199
8199
  this._prevCursor = this.getInstanceState().cursor.type;
8200
8200
  }
8201
8201
  this.inputs.setIsPanning(true);
8202
- clearTimeout(this._longPressTimeout);
8202
+ this.timers.clearTimeout(this._longPressTimeout);
8203
8203
  } else if (info.button === RIGHT_MOUSE_BUTTON && this.options.rightClickPanning) {
8204
8204
  this.inputs.setIsRightPointing(true);
8205
- clearTimeout(this._longPressTimeout);
8205
+ this.timers.clearTimeout(this._longPressTimeout);
8206
8206
  return this;
8207
8207
  }
8208
8208
  if (this.inputs.getIsPanning()) {
@@ -8213,7 +8213,6 @@ class Editor extends EventEmitter {
8213
8213
  break;
8214
8214
  }
8215
8215
  case "pointer_move": {
8216
- if (!isPen && isPenMode) return;
8217
8216
  const { x: cx, y: cy, z: cz } = unsafe__withoutCapture(() => this.getCamera());
8218
8217
  if (this.inputs.getIsRightPointing() && !this.inputs.getIsPanning()) {
8219
8218
  const currentScreenPoint = this.inputs.getCurrentScreenPoint();
@@ -8244,16 +8243,15 @@ class Editor extends EventEmitter {
8244
8243
  }
8245
8244
  if (inputs.getIsPointing() && !inputs.getIsDragging() && Vec.Dist2(inputs.getOriginPagePoint(), inputs.getCurrentPagePoint()) * this.getZoomLevel() > (instanceState.isCoarsePointer ? this.options.coarseDragDistanceSquared : this.options.dragDistanceSquared) / cz) {
8246
8245
  inputs.setIsDragging(true);
8247
- clearTimeout(this._longPressTimeout);
8246
+ this.timers.clearTimeout(this._longPressTimeout);
8248
8247
  }
8249
8248
  break;
8250
8249
  }
8251
8250
  case "pointer_up": {
8252
8251
  inputs.setIsDragging(false);
8253
8252
  inputs.setIsPointing(false);
8254
- clearTimeout(this._longPressTimeout);
8253
+ this.timers.clearTimeout(this._longPressTimeout);
8255
8254
  inputs.buttons.delete(info.button);
8256
- if (instanceState.isPenMode && !isPen) return;
8257
8255
  if (this.inputs.getIsRightPointing() && !this.inputs.getIsPanning()) {
8258
8256
  this.inputs.setIsRightPointing(false);
8259
8257
  this._selectedShapeIdsAtPointerDown = [];
@@ -8309,7 +8307,7 @@ class Editor extends EventEmitter {
8309
8307
  });
8310
8308
  }
8311
8309
  } else {
8312
- if (info.button === STYLUS_ERASER_BUTTON) {
8310
+ if (info.button === STYLUS_ERASER_BUTTON && this.getStateDescendant("eraser")) {
8313
8311
  this.complete();
8314
8312
  this.setCurrentTool(this._restoreToolId);
8315
8313
  }
@@ -8336,7 +8334,7 @@ class Editor extends EventEmitter {
8336
8334
  }
8337
8335
  this.inputs.setIsPanning(true);
8338
8336
  this.inputs.setIsSpacebarPanning(true);
8339
- clearTimeout(this._longPressTimeout);
8337
+ this.timers.clearTimeout(this._longPressTimeout);
8340
8338
  this.setCursor({
8341
8339
  type: this.inputs.getIsPointing() ? "grabbing" : "grab",
8342
8340
  rotation: 0
@@ -8362,7 +8360,7 @@ class Editor extends EventEmitter {
8362
8360
  break;
8363
8361
  }
8364
8362
  }
8365
- if (offset) {
8363
+ if (offset && !cameraOptions.isLocked) {
8366
8364
  const bounds = this.getViewportPageBounds();
8367
8365
  const next = bounds.clone().translate(offset.mulV({ x: bounds.w, y: bounds.h }));
8368
8366
  this._animateToViewport(next, { animation: { duration: 320 } });
@@ -8402,7 +8400,7 @@ class Editor extends EventEmitter {
8402
8400
  this.setCurrentTool("select");
8403
8401
  }
8404
8402
  const { isPenMode } = this.store.unsafeGetWithoutCapture(TLINSTANCE_ID);
8405
- if (info.isPen === isPenMode) {
8403
+ if (!isPenMode || info.isPen) {
8406
8404
  const clickInfo = this._clickManager.handlePointerEvent(info);
8407
8405
  if (info.name !== clickInfo.name) {
8408
8406
  this.root.handleEvent(info);
@@ -8424,7 +8422,7 @@ class Editor extends EventEmitter {
8424
8422
  maybeTrackPerformance(name) {
8425
8423
  if (debugFlags.measurePerformance.get()) {
8426
8424
  if (this.performanceTracker.isStarted()) {
8427
- clearTimeout(this.performanceTrackerTimeout);
8425
+ this.timers.clearTimeout(this.performanceTrackerTimeout);
8428
8426
  } else {
8429
8427
  this.performanceTracker.start(name);
8430
8428
  }