@tldraw/editor 5.4.0 → 5.5.0-canary.022e164c8709

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 (67) hide show
  1. package/dist-cjs/index.d.ts +5 -2
  2. package/dist-cjs/index.js +1 -1
  3. package/dist-cjs/lib/constants.js +2 -0
  4. package/dist-cjs/lib/constants.js.map +2 -2
  5. package/dist-cjs/lib/editor/Editor.js +13 -9
  6. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  7. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js +10 -6
  8. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +2 -2
  9. package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js +7 -3
  10. package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js.map +2 -2
  11. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +14 -6
  12. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +3 -3
  13. package/dist-cjs/lib/primitives/geometry/Arc2d.js +1 -1
  14. package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
  15. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +1 -1
  16. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
  17. package/dist-cjs/lib/primitives/geometry/Edge2d.js +1 -1
  18. package/dist-cjs/lib/primitives/geometry/Edge2d.js.map +2 -2
  19. package/dist-cjs/lib/primitives/geometry/Group2d.js +8 -5
  20. package/dist-cjs/lib/primitives/geometry/Group2d.js.map +2 -2
  21. package/dist-cjs/lib/primitives/geometry/Point2d.js +1 -1
  22. package/dist-cjs/lib/primitives/geometry/Point2d.js.map +2 -2
  23. package/dist-cjs/version.js +3 -3
  24. package/dist-cjs/version.js.map +1 -1
  25. package/dist-esm/index.d.mts +5 -2
  26. package/dist-esm/index.mjs +1 -1
  27. package/dist-esm/lib/constants.mjs +2 -0
  28. package/dist-esm/lib/constants.mjs.map +2 -2
  29. package/dist-esm/lib/editor/Editor.mjs +14 -9
  30. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  31. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs +10 -6
  32. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +2 -2
  33. package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs +7 -3
  34. package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs.map +2 -2
  35. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +14 -6
  36. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +3 -3
  37. package/dist-esm/lib/primitives/geometry/Arc2d.mjs +1 -1
  38. package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
  39. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +1 -1
  40. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
  41. package/dist-esm/lib/primitives/geometry/Edge2d.mjs +1 -1
  42. package/dist-esm/lib/primitives/geometry/Edge2d.mjs.map +2 -2
  43. package/dist-esm/lib/primitives/geometry/Group2d.mjs +12 -6
  44. package/dist-esm/lib/primitives/geometry/Group2d.mjs.map +2 -2
  45. package/dist-esm/lib/primitives/geometry/Point2d.mjs +1 -1
  46. package/dist-esm/lib/primitives/geometry/Point2d.mjs.map +2 -2
  47. package/dist-esm/version.mjs +3 -3
  48. package/dist-esm/version.mjs.map +1 -1
  49. package/package.json +7 -7
  50. package/src/lib/constants.ts +8 -0
  51. package/src/lib/editor/Editor.ts +28 -13
  52. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.test.ts +35 -4
  53. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.ts +13 -7
  54. package/src/lib/editor/managers/ThemeManager/ThemeManager.test.ts +53 -0
  55. package/src/lib/editor/managers/ThemeManager/ThemeManager.ts +9 -3
  56. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +23 -8
  57. package/src/lib/primitives/geometry/Arc2d.test.ts +9 -0
  58. package/src/lib/primitives/geometry/Arc2d.ts +1 -1
  59. package/src/lib/primitives/geometry/CubicBezier2d.test.ts +13 -0
  60. package/src/lib/primitives/geometry/CubicBezier2d.ts +1 -1
  61. package/src/lib/primitives/geometry/Edge2d.test.ts +21 -3
  62. package/src/lib/primitives/geometry/Edge2d.ts +1 -1
  63. package/src/lib/primitives/geometry/Group2d.test.ts +26 -5
  64. package/src/lib/primitives/geometry/Group2d.ts +18 -7
  65. package/src/lib/primitives/geometry/Point2d.test.ts +14 -3
  66. package/src/lib/primitives/geometry/Point2d.ts +1 -1
  67. package/src/version.ts +3 -3
@@ -5033,7 +5033,7 @@ export declare class Group2d extends Geometry2d {
5033
5033
  intersectPolyline(polyline: VecLike[], filters?: Geometry2dFilters): VecLike[];
5034
5034
  interpolateAlongEdge(t: number, filters?: Geometry2dFilters): Vec;
5035
5035
  uninterpolateAlongEdge(point: VecLike, filters?: Geometry2dFilters): number;
5036
- transform(transform: Mat): Geometry2d;
5036
+ transform(transform: MatModel, opts?: TransformedGeometry2dOptions): Geometry2d;
5037
5037
  getArea(): number;
5038
5038
  toSimpleSvgPath(): string;
5039
5039
  getLength(filters?: Geometry2dFilters): number;
@@ -7592,7 +7592,10 @@ export declare class ThemeManager {
7592
7592
  /** Get the id of the current theme. */
7593
7593
  getCurrentThemeId(): TLThemeId;
7594
7594
  getCurrentTheme(): TLTheme;
7595
- /** Set the current theme by id. The theme must have been previously registered. */
7595
+ /**
7596
+ * Set the current theme by id. The theme must have been previously registered; an
7597
+ * unregistered id is ignored and the current theme is kept.
7598
+ */
7596
7599
  setCurrentTheme(id: TLThemeId): void;
7597
7600
  /** Replace all theme definitions, or update them via a callback that receives a deep copy. */
7598
7601
  updateThemes(themes: ((themes: TLThemes) => TLThemes) | TLThemes): void;
package/dist-cjs/index.js CHANGED
@@ -392,7 +392,7 @@ var import_uniq = require("./lib/utils/uniq");
392
392
  var import_defaultThemes2 = require("./lib/editor/managers/ThemeManager/defaultThemes");
393
393
  (0, import_utils.registerTldrawLibraryVersion)(
394
394
  "@tldraw/editor",
395
- "5.4.0",
395
+ "5.5.0-canary.022e164c8709",
396
396
  "cjs"
397
397
  );
398
398
  //# sourceMappingURL=index.js.map
@@ -20,6 +20,7 @@ var constants_exports = {};
20
20
  __export(constants_exports, {
21
21
  DEFAULT_ANIMATION_OPTIONS: () => DEFAULT_ANIMATION_OPTIONS,
22
22
  DEFAULT_CAMERA_OPTIONS: () => DEFAULT_CAMERA_OPTIONS,
23
+ FRAME_MS_60HZ: () => FRAME_MS_60HZ,
23
24
  INTERNAL_POINTER_IDS: () => INTERNAL_POINTER_IDS,
24
25
  LEFT_MOUSE_BUTTON: () => LEFT_MOUSE_BUTTON,
25
26
  MIDDLE_MOUSE_BUTTON: () => MIDDLE_MOUSE_BUTTON,
@@ -43,6 +44,7 @@ const DEFAULT_ANIMATION_OPTIONS = {
43
44
  const INTERNAL_POINTER_IDS = {
44
45
  CAMERA_MOVE: -10
45
46
  };
47
+ const FRAME_MS_60HZ = 1e3 / 60;
46
48
  const SIDES = ["top", "right", "bottom", "left"];
47
49
  const LEFT_MOUSE_BUTTON = 0;
48
50
  const RIGHT_MOUSE_BUTTON = 2;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib/constants.ts"],
4
- "sourcesContent": ["import { TLCameraOptions } from './editor/types/misc-types'\nimport { EASINGS } from './primitives/easings'\n\n/** @internal */\nexport const DEFAULT_CAMERA_OPTIONS: TLCameraOptions = {\n\tisLocked: false,\n\twheelBehavior: 'pan',\n\tpanSpeed: 1,\n\tzoomSpeed: 1,\n\tzoomSteps: [0.05, 0.1, 0.25, 0.5, 1, 2, 4, 8],\n}\n\n/** @internal */\nexport const DEFAULT_ANIMATION_OPTIONS = {\n\tduration: 0,\n\teasing: EASINGS.easeInOutCubic,\n}\n\n/**\n * Negative pointer ids are reserved for internal use.\n *\n * @internal */\nexport const INTERNAL_POINTER_IDS = {\n\tCAMERA_MOVE: -10,\n} as const\n\n/** @public */\nexport const SIDES = ['top', 'right', 'bottom', 'left'] as const\n\nexport const LEFT_MOUSE_BUTTON = 0\nexport const RIGHT_MOUSE_BUTTON = 2\nexport const MIDDLE_MOUSE_BUTTON = 1\nexport const STYLUS_ERASER_BUTTON = 5\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAAwB;AAGjB,MAAM,yBAA0C;AAAA,EACtD,UAAU;AAAA,EACV,eAAe;AAAA,EACf,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW,CAAC,MAAM,KAAK,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC;AAC7C;AAGO,MAAM,4BAA4B;AAAA,EACxC,UAAU;AAAA,EACV,QAAQ,uBAAQ;AACjB;AAMO,MAAM,uBAAuB;AAAA,EACnC,aAAa;AACd;AAGO,MAAM,QAAQ,CAAC,OAAO,SAAS,UAAU,MAAM;AAE/C,MAAM,oBAAoB;AAC1B,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;AAC5B,MAAM,uBAAuB;",
4
+ "sourcesContent": ["import { TLCameraOptions } from './editor/types/misc-types'\nimport { EASINGS } from './primitives/easings'\n\n/** @internal */\nexport const DEFAULT_CAMERA_OPTIONS: TLCameraOptions = {\n\tisLocked: false,\n\twheelBehavior: 'pan',\n\tpanSpeed: 1,\n\tzoomSpeed: 1,\n\tzoomSteps: [0.05, 0.1, 0.25, 0.5, 1, 2, 4, 8],\n}\n\n/** @internal */\nexport const DEFAULT_ANIMATION_OPTIONS = {\n\tduration: 0,\n\teasing: EASINGS.easeInOutCubic,\n}\n\n/**\n * Negative pointer ids are reserved for internal use.\n *\n * @internal */\nexport const INTERNAL_POINTER_IDS = {\n\tCAMERA_MOVE: -10,\n} as const\n\n/**\n * Per-tick tuning constants (`cameraSlideFriction`, `edgeScrollSpeed`) assume a 60 Hz tick. Scaling\n * motion by `elapsed / FRAME_MS_60HZ` keeps that feel on displays with other refresh rates.\n *\n * @internal\n */\nexport const FRAME_MS_60HZ = 1000 / 60\n\n/** @public */\nexport const SIDES = ['top', 'right', 'bottom', 'left'] as const\n\nexport const LEFT_MOUSE_BUTTON = 0\nexport const RIGHT_MOUSE_BUTTON = 2\nexport const MIDDLE_MOUSE_BUTTON = 1\nexport const STYLUS_ERASER_BUTTON = 5\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAAwB;AAGjB,MAAM,yBAA0C;AAAA,EACtD,UAAU;AAAA,EACV,eAAe;AAAA,EACf,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW,CAAC,MAAM,KAAK,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC;AAC7C;AAGO,MAAM,4BAA4B;AAAA,EACxC,UAAU;AAAA,EACV,QAAQ,uBAAQ;AACjB;AAMO,MAAM,uBAAuB;AAAA,EACnC,aAAa;AACd;AAQO,MAAM,gBAAgB,MAAO;AAG7B,MAAM,QAAQ,CAAC,OAAO,SAAS,UAAU,MAAM;AAE/C,MAAM,oBAAoB;AAC1B,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;AAC5B,MAAM,uBAAuB;",
6
6
  "names": []
7
7
  }
@@ -1617,7 +1617,8 @@ class Editor extends import_eventemitter3.default {
1617
1617
  if (direction === "next" || direction === "prev") {
1618
1618
  const shapeIds = readingOrderShapes.map((shape2) => shape2.id);
1619
1619
  const currentIndex = currentShapeId ? shapeIds.indexOf(currentShapeId) : -1;
1620
- const adjacentIndex = (currentIndex + (direction === "next" ? 1 : -1) + shapeIds.length) % shapeIds.length;
1620
+ const startIndex = currentIndex === -1 && direction === "prev" ? 0 : currentIndex;
1621
+ const adjacentIndex = (startIndex + (direction === "next" ? 1 : -1) + shapeIds.length) % shapeIds.length;
1621
1622
  adjacentShapeId = shapeIds[adjacentIndex];
1622
1623
  } else {
1623
1624
  if (!currentShapeId) return;
@@ -2497,14 +2498,16 @@ class Editor extends import_eventemitter3.default {
2497
2498
  setCamera(point, opts) {
2498
2499
  const { isLocked } = this._cameraOptions.__unsafe__getWithoutCapture();
2499
2500
  if (isLocked && !opts?.force) return this;
2501
+ const _point = import_Vec.Vec.Cast(point);
2502
+ if (!Number.isFinite(_point.x) || !Number.isFinite(_point.y) || !Number.isFinite(_point.z)) {
2503
+ throw Error(
2504
+ `Editor.setCamera: expected finite values, got (${_point.x}, ${_point.y}, ${_point.z}).`
2505
+ );
2506
+ }
2500
2507
  this.stopCameraAnimation();
2501
2508
  if (this.getInstanceState().followingUserId) {
2502
2509
  this.stopFollowingUser();
2503
2510
  }
2504
- const _point = import_Vec.Vec.Cast(point);
2505
- if (!Number.isFinite(_point.x)) _point.x = 0;
2506
- if (!Number.isFinite(_point.y)) _point.y = 0;
2507
- if (_point.z === void 0 || !Number.isFinite(_point.z)) point.z = this.getZoomLevel();
2508
2511
  const camera = this.getConstrainedCamera(_point, opts);
2509
2512
  if (opts?.animation) {
2510
2513
  const { width, height } = this.getViewportScreenBounds();
@@ -2883,7 +2886,7 @@ class Editor extends import_eventemitter3.default {
2883
2886
  newCx += center.x / newCz - center.x / cz;
2884
2887
  newCy += center.y / newCz - center.y / cz;
2885
2888
  }
2886
- currentSpeed *= 1 - friction;
2889
+ currentSpeed *= (1 - friction) ** (elapsed / import_constants.FRAME_MS_60HZ);
2887
2890
  if (currentSpeed < speedThreshold) {
2888
2891
  cancel();
2889
2892
  } else {
@@ -2917,6 +2920,7 @@ class Editor extends import_eventemitter3.default {
2917
2920
  }
2918
2921
  const isOnSamePage = presence.currentPageId === this.getCurrentPageId();
2919
2922
  if (!isOnSamePage) {
2923
+ this.markHistoryStoppingPoint("change-page");
2920
2924
  this.setCurrentPage(presence.currentPageId);
2921
2925
  }
2922
2926
  if (opts && opts.animation && !isOnSamePage) {
@@ -5357,7 +5361,7 @@ class Editor extends import_eventemitter3.default {
5357
5361
  const shapesMovingTogether = [shape];
5358
5362
  const boundsOfShapesMovingTogether = [shapePageBounds];
5359
5363
  this.collectShapesViaArrowBindings({
5360
- bindings: this.getBindingsToShape(shape.id, "arrow"),
5364
+ bindings: this.getBindingsInvolvingShape(shape.id, "arrow"),
5361
5365
  initialShapes: freshShapes,
5362
5366
  resultShapes: shapesMovingTogether,
5363
5367
  resultBounds: boundsOfShapesMovingTogether,
@@ -8294,8 +8298,8 @@ class Editor extends import_eventemitter3.default {
8294
8298
  break;
8295
8299
  }
8296
8300
  case "keyboard": {
8297
- if (info.key === "ShiftRight") info.key = "ShiftLeft";
8298
- if (info.key === "AltRight") info.key = "AltLeft";
8301
+ if (info.code === "ShiftRight") info.code = "ShiftLeft";
8302
+ if (info.code === "AltRight") info.code = "AltLeft";
8299
8303
  if (info.code === "ControlRight") info.code = "ControlLeft";
8300
8304
  if (info.code === "MetaRight") info.code = "MetaLeft";
8301
8305
  switch (info.name) {