@tldraw/editor 3.16.0-internal.51e99e128bd4 → 3.16.0-internal.a478398270c6

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 (217) hide show
  1. package/dist-cjs/index.d.ts +16 -217
  2. package/dist-cjs/index.js +1 -8
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/TldrawEditor.js +1 -3
  5. package/dist-cjs/lib/TldrawEditor.js.map +2 -2
  6. package/dist-cjs/lib/components/MenuClickCapture.js +5 -0
  7. package/dist-cjs/lib/components/MenuClickCapture.js.map +2 -2
  8. package/dist-cjs/lib/components/SVGContainer.js +1 -1
  9. package/dist-cjs/lib/components/SVGContainer.js.map +2 -2
  10. package/dist-cjs/lib/components/Shape.js +26 -4
  11. package/dist-cjs/lib/components/Shape.js.map +2 -2
  12. package/dist-cjs/lib/components/default-components/DefaultBrush.js +1 -1
  13. package/dist-cjs/lib/components/default-components/DefaultBrush.js.map +2 -2
  14. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +1 -1
  15. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  16. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js +2 -2
  17. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js.map +2 -2
  18. package/dist-cjs/lib/components/default-components/DefaultCursor.js +1 -1
  19. package/dist-cjs/lib/components/default-components/DefaultCursor.js.map +2 -2
  20. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js +1 -1
  21. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js.map +2 -2
  22. package/dist-cjs/lib/components/default-components/DefaultGrid.js +1 -1
  23. package/dist-cjs/lib/components/default-components/DefaultGrid.js.map +2 -2
  24. package/dist-cjs/lib/components/default-components/DefaultHandles.js +1 -1
  25. package/dist-cjs/lib/components/default-components/DefaultHandles.js.map +2 -2
  26. package/dist-cjs/lib/components/default-components/DefaultScribble.js +1 -1
  27. package/dist-cjs/lib/components/default-components/DefaultScribble.js.map +2 -2
  28. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +1 -9
  29. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +2 -2
  30. package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js +1 -1
  31. package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js.map +2 -2
  32. package/dist-cjs/lib/components/default-components/DefaultSpinner.js +15 -27
  33. package/dist-cjs/lib/components/default-components/DefaultSpinner.js.map +3 -3
  34. package/dist-cjs/lib/config/TLUserPreferences.js +3 -15
  35. package/dist-cjs/lib/config/TLUserPreferences.js.map +2 -2
  36. package/dist-cjs/lib/editor/Editor.js +67 -134
  37. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  38. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +4 -14
  39. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +2 -2
  40. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  41. package/dist-cjs/lib/editor/tools/StateNode.js +1 -20
  42. package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
  43. package/dist-cjs/lib/editor/types/misc-types.js.map +1 -1
  44. package/dist-cjs/lib/exports/getSvgJsx.js +2 -1
  45. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  46. package/dist-cjs/lib/hooks/useCanvasEvents.js +20 -24
  47. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  48. package/dist-cjs/lib/hooks/useEditor.js +4 -1
  49. package/dist-cjs/lib/hooks/useEditor.js.map +2 -2
  50. package/dist-cjs/lib/hooks/useEditorComponents.js +0 -2
  51. package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
  52. package/dist-cjs/lib/license/Watermark.js +8 -8
  53. package/dist-cjs/lib/license/Watermark.js.map +2 -2
  54. package/dist-cjs/lib/options.js +0 -7
  55. package/dist-cjs/lib/options.js.map +2 -2
  56. package/dist-cjs/lib/primitives/geometry/Arc2d.js +1 -1
  57. package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
  58. package/dist-cjs/lib/primitives/geometry/Circle2d.js +1 -1
  59. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
  60. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +1 -3
  61. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
  62. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +1 -1
  63. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
  64. package/dist-cjs/lib/primitives/geometry/geometry-constants.js +2 -2
  65. package/dist-cjs/lib/primitives/geometry/geometry-constants.js.map +2 -2
  66. package/dist-cjs/lib/primitives/intersect.js +4 -4
  67. package/dist-cjs/lib/primitives/intersect.js.map +2 -2
  68. package/dist-cjs/lib/primitives/utils.js +0 -4
  69. package/dist-cjs/lib/primitives/utils.js.map +2 -2
  70. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js +1 -0
  71. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js.map +2 -2
  72. package/dist-cjs/version.js +3 -3
  73. package/dist-cjs/version.js.map +1 -1
  74. package/dist-esm/index.d.mts +16 -217
  75. package/dist-esm/index.mjs +2 -16
  76. package/dist-esm/index.mjs.map +2 -2
  77. package/dist-esm/lib/TldrawEditor.mjs +1 -3
  78. package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
  79. package/dist-esm/lib/components/MenuClickCapture.mjs +5 -0
  80. package/dist-esm/lib/components/MenuClickCapture.mjs.map +2 -2
  81. package/dist-esm/lib/components/SVGContainer.mjs +1 -1
  82. package/dist-esm/lib/components/SVGContainer.mjs.map +2 -2
  83. package/dist-esm/lib/components/Shape.mjs +26 -4
  84. package/dist-esm/lib/components/Shape.mjs.map +2 -2
  85. package/dist-esm/lib/components/default-components/DefaultBrush.mjs +1 -1
  86. package/dist-esm/lib/components/default-components/DefaultBrush.mjs.map +2 -2
  87. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +1 -1
  88. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  89. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs +2 -2
  90. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs.map +2 -2
  91. package/dist-esm/lib/components/default-components/DefaultCursor.mjs +1 -1
  92. package/dist-esm/lib/components/default-components/DefaultCursor.mjs.map +2 -2
  93. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs +1 -1
  94. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs.map +2 -2
  95. package/dist-esm/lib/components/default-components/DefaultGrid.mjs +1 -1
  96. package/dist-esm/lib/components/default-components/DefaultGrid.mjs.map +2 -2
  97. package/dist-esm/lib/components/default-components/DefaultHandles.mjs +1 -1
  98. package/dist-esm/lib/components/default-components/DefaultHandles.mjs.map +2 -2
  99. package/dist-esm/lib/components/default-components/DefaultScribble.mjs +1 -1
  100. package/dist-esm/lib/components/default-components/DefaultScribble.mjs.map +2 -2
  101. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +1 -9
  102. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +2 -2
  103. package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs +1 -1
  104. package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs.map +2 -2
  105. package/dist-esm/lib/components/default-components/DefaultSpinner.mjs +15 -17
  106. package/dist-esm/lib/components/default-components/DefaultSpinner.mjs.map +2 -2
  107. package/dist-esm/lib/config/TLUserPreferences.mjs +3 -15
  108. package/dist-esm/lib/config/TLUserPreferences.mjs.map +2 -2
  109. package/dist-esm/lib/editor/Editor.mjs +67 -134
  110. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  111. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +4 -14
  112. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +2 -2
  113. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  114. package/dist-esm/lib/editor/tools/StateNode.mjs +1 -20
  115. package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
  116. package/dist-esm/lib/exports/getSvgJsx.mjs +2 -2
  117. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  118. package/dist-esm/lib/hooks/useCanvasEvents.mjs +21 -25
  119. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  120. package/dist-esm/lib/hooks/useEditor.mjs +4 -1
  121. package/dist-esm/lib/hooks/useEditor.mjs.map +2 -2
  122. package/dist-esm/lib/hooks/useEditorComponents.mjs +0 -4
  123. package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
  124. package/dist-esm/lib/license/Watermark.mjs +8 -8
  125. package/dist-esm/lib/license/Watermark.mjs.map +2 -2
  126. package/dist-esm/lib/options.mjs +0 -7
  127. package/dist-esm/lib/options.mjs.map +2 -2
  128. package/dist-esm/lib/primitives/geometry/Arc2d.mjs +2 -2
  129. package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
  130. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +2 -2
  131. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
  132. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +1 -3
  133. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
  134. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +2 -2
  135. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
  136. package/dist-esm/lib/primitives/geometry/geometry-constants.mjs +2 -2
  137. package/dist-esm/lib/primitives/geometry/geometry-constants.mjs.map +2 -2
  138. package/dist-esm/lib/primitives/intersect.mjs +5 -5
  139. package/dist-esm/lib/primitives/intersect.mjs.map +2 -2
  140. package/dist-esm/lib/primitives/utils.mjs +0 -4
  141. package/dist-esm/lib/primitives/utils.mjs.map +2 -2
  142. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs +1 -0
  143. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs.map +2 -2
  144. package/dist-esm/version.mjs +3 -3
  145. package/dist-esm/version.mjs.map +1 -1
  146. package/editor.css +313 -312
  147. package/package.json +38 -16
  148. package/src/index.ts +1 -15
  149. package/src/lib/TldrawEditor.tsx +5 -7
  150. package/src/lib/components/MenuClickCapture.tsx +8 -0
  151. package/src/lib/components/SVGContainer.tsx +1 -1
  152. package/src/lib/components/Shape.tsx +21 -6
  153. package/src/lib/components/default-components/DefaultBrush.tsx +1 -1
  154. package/src/lib/components/default-components/DefaultCanvas.tsx +1 -1
  155. package/src/lib/components/default-components/DefaultCollaboratorHint.tsx +2 -2
  156. package/src/lib/components/default-components/DefaultCursor.tsx +1 -1
  157. package/src/lib/components/default-components/DefaultErrorFallback.tsx +1 -1
  158. package/src/lib/components/default-components/DefaultGrid.tsx +1 -1
  159. package/src/lib/components/default-components/DefaultHandles.tsx +1 -5
  160. package/src/lib/components/default-components/DefaultScribble.tsx +1 -1
  161. package/src/lib/components/default-components/DefaultShapeIndicator.tsx +2 -6
  162. package/src/lib/components/default-components/DefaultSnapIndictor.tsx +1 -1
  163. package/src/lib/components/default-components/DefaultSpinner.tsx +12 -12
  164. package/src/lib/config/TLUserPreferences.ts +1 -15
  165. package/src/lib/editor/Editor.test.ts +8 -416
  166. package/src/lib/editor/Editor.ts +92 -177
  167. package/src/lib/editor/managers/ClickManager/ClickManager.test.ts +14 -15
  168. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.test.ts +15 -16
  169. package/src/lib/editor/managers/FocusManager/FocusManager.test.ts +48 -49
  170. package/src/lib/editor/managers/FontManager/FontManager.test.ts +23 -24
  171. package/src/lib/editor/managers/HistoryManager/HistoryManager.test.ts +6 -7
  172. package/src/lib/editor/managers/ScribbleManager/ScribbleManager.test.ts +11 -12
  173. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +50 -57
  174. package/src/lib/editor/managers/TextManager/TextManager.test.ts +26 -51
  175. package/src/lib/editor/managers/TickManager/TickManager.test.ts +13 -14
  176. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +26 -55
  177. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.ts +1 -14
  178. package/src/lib/editor/shapes/ShapeUtil.ts +0 -57
  179. package/src/lib/editor/tools/StateNode.ts +1 -27
  180. package/src/lib/editor/types/misc-types.ts +1 -73
  181. package/src/lib/exports/getSvgJsx.tsx +2 -2
  182. package/src/lib/hooks/useCanvasEvents.ts +32 -39
  183. package/src/lib/hooks/useEditor.tsx +5 -6
  184. package/src/lib/hooks/useEditorComponents.tsx +2 -8
  185. package/src/lib/license/LicenseManager.test.ts +1 -3
  186. package/src/lib/license/Watermark.test.tsx +1 -2
  187. package/src/lib/license/Watermark.tsx +8 -8
  188. package/src/lib/options.ts +0 -8
  189. package/src/lib/primitives/geometry/Arc2d.ts +2 -2
  190. package/src/lib/primitives/geometry/Circle2d.ts +2 -2
  191. package/src/lib/primitives/geometry/CubicBezier2d.ts +1 -4
  192. package/src/lib/primitives/geometry/Ellipse2d.ts +2 -2
  193. package/src/lib/primitives/geometry/geometry-constants.ts +1 -2
  194. package/src/lib/primitives/intersect.ts +5 -12
  195. package/src/lib/primitives/utils.ts +0 -11
  196. package/src/lib/test/currentToolIdMask.test.ts +49 -0
  197. package/src/lib/utils/sync/LocalIndexedDb.test.ts +1 -2
  198. package/src/lib/utils/sync/TLLocalSyncClient.test.ts +15 -15
  199. package/src/lib/utils/sync/TLLocalSyncClient.ts +1 -0
  200. package/src/version.ts +3 -3
  201. package/dist-cjs/lib/components/default-components/DefaultShapeWrapper.js +0 -53
  202. package/dist-cjs/lib/components/default-components/DefaultShapeWrapper.js.map +0 -7
  203. package/dist-cjs/lib/hooks/useStateAttribute.js +0 -35
  204. package/dist-cjs/lib/hooks/useStateAttribute.js.map +0 -7
  205. package/dist-cjs/lib/utils/EditorAtom.js +0 -45
  206. package/dist-cjs/lib/utils/EditorAtom.js.map +0 -7
  207. package/dist-esm/lib/components/default-components/DefaultShapeWrapper.mjs +0 -23
  208. package/dist-esm/lib/components/default-components/DefaultShapeWrapper.mjs.map +0 -7
  209. package/dist-esm/lib/hooks/useStateAttribute.mjs +0 -15
  210. package/dist-esm/lib/hooks/useStateAttribute.mjs.map +0 -7
  211. package/dist-esm/lib/utils/EditorAtom.mjs +0 -25
  212. package/dist-esm/lib/utils/EditorAtom.mjs.map +0 -7
  213. package/src/lib/components/default-components/DefaultShapeWrapper.tsx +0 -35
  214. package/src/lib/editor/tools/StateNode.test.ts +0 -285
  215. package/src/lib/hooks/useStateAttribute.ts +0 -15
  216. package/src/lib/primitives/intersect.test.ts +0 -946
  217. package/src/lib/utils/EditorAtom.ts +0 -37
@@ -1466,9 +1466,7 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
1466
1466
  return this;
1467
1467
  }
1468
1468
  /**
1469
- * Select all shapes. If the user has selected shapes that share a parent,
1470
- * select all shapes within that parent. If the user has not selected any shapes,
1471
- * or if the shapes shapes are only on select all shapes on the current page.
1469
+ * Select all direct children of the current page.
1472
1470
  *
1473
1471
  * @example
1474
1472
  * ```ts
@@ -1478,23 +1476,7 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
1478
1476
  * @public
1479
1477
  */
1480
1478
  selectAll() {
1481
- let parentToSelectWithinId = null;
1482
- const selectedShapeIds = this.getSelectedShapeIds();
1483
- if (selectedShapeIds.length > 0) {
1484
- for (const id of selectedShapeIds) {
1485
- const shape = this.getShape(id);
1486
- if (!shape) continue;
1487
- if (parentToSelectWithinId === null) {
1488
- parentToSelectWithinId = shape.parentId;
1489
- } else if (parentToSelectWithinId !== shape.parentId) {
1490
- return this;
1491
- }
1492
- }
1493
- }
1494
- if (!parentToSelectWithinId) {
1495
- parentToSelectWithinId = this.getCurrentPageId();
1496
- }
1497
- const ids = this.getSortedChildIdsForParent(parentToSelectWithinId);
1479
+ const ids = this.getSortedChildIdsForParent(this.getCurrentPageId());
1498
1480
  if (ids.length <= 0) return this;
1499
1481
  this.setSelectedShapes(this._getUnlockedShapeIds(ids));
1500
1482
  return this;
@@ -1513,8 +1495,9 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
1513
1495
  const selectedShapeIds = this.getSelectedShapeIds();
1514
1496
  const firstParentId = selectedShapeIds[0] ? this.getShape(selectedShapeIds[0])?.parentId : null;
1515
1497
  const isSelectedWithinContainer = firstParentId && selectedShapeIds.every((shapeId) => this.getShape(shapeId)?.parentId === firstParentId) && !isPageId(firstParentId);
1516
- const filteredShapes = isSelectedWithinContainer ? this.getCurrentPageShapes().filter((shape2) => shape2.parentId === firstParentId) : this.getCurrentPageShapes().filter((shape2) => isPageId(shape2.parentId));
1517
- const readingOrderShapes = isSelectedWithinContainer ? this._getShapesInReadingOrder(filteredShapes) : this.getCurrentPageShapesInReadingOrder();
1498
+ const readingOrderShapes = isSelectedWithinContainer ? this._getShapesInReadingOrder(
1499
+ this.getCurrentPageShapes().filter((shape2) => shape2.parentId === firstParentId)
1500
+ ) : this.getCurrentPageShapesInReadingOrder();
1518
1501
  const currentShapeId = selectedShapeIds.length === 1 ? selectedShapeIds[0] : readingOrderShapes.find((shape2) => selectedShapeIds.includes(shape2.id))?.id;
1519
1502
  let adjacentShapeId;
1520
1503
  if (direction === "next" || direction === "prev") {
@@ -1524,7 +1507,7 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
1524
1507
  adjacentShapeId = shapeIds[adjacentIndex];
1525
1508
  } else {
1526
1509
  if (!currentShapeId) return;
1527
- adjacentShapeId = this.getNearestAdjacentShape(filteredShapes, currentShapeId, direction);
1510
+ adjacentShapeId = this.getNearestAdjacentShape(currentShapeId, direction);
1528
1511
  }
1529
1512
  const shape = this.getShape(adjacentShapeId);
1530
1513
  if (!shape) return;
@@ -1590,10 +1573,11 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
1590
1573
  *
1591
1574
  * @public
1592
1575
  */
1593
- getNearestAdjacentShape(shapes, currentShapeId, direction) {
1576
+ getNearestAdjacentShape(currentShapeId, direction) {
1594
1577
  const directionToAngle = { right: 0, left: 180, down: 90, up: 270 };
1595
1578
  const currentShape = this.getShape(currentShapeId);
1596
1579
  if (!currentShape) return currentShapeId;
1580
+ const shapes = this.getCurrentPageShapes();
1597
1581
  const tabbableShapes = shapes.filter(
1598
1582
  (shape) => this.getShapeUtil(shape).canTabTo(shape) && shape.id !== currentShapeId
1599
1583
  );
@@ -2357,11 +2341,28 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
2357
2341
  { history: "ignore" }
2358
2342
  );
2359
2343
  const { currentScreenPoint, currentPagePoint } = this.inputs;
2344
+ const { screenBounds } = this.store.unsafeGetWithoutCapture(TLINSTANCE_ID);
2360
2345
  if (currentScreenPoint.x / z - x !== currentPagePoint.x || currentScreenPoint.y / z - y !== currentPagePoint.y) {
2361
- this.updatePointer({
2362
- immediate: opts?.immediate,
2363
- pointerId: INTERNAL_POINTER_IDS.CAMERA_MOVE
2364
- });
2346
+ const event = {
2347
+ type: "pointer",
2348
+ target: "canvas",
2349
+ name: "pointer_move",
2350
+ // weird but true: we need to put the screen point back into client space
2351
+ point: Vec.AddXY(currentScreenPoint, screenBounds.x, screenBounds.y),
2352
+ pointerId: INTERNAL_POINTER_IDS.CAMERA_MOVE,
2353
+ ctrlKey: this.inputs.ctrlKey,
2354
+ altKey: this.inputs.altKey,
2355
+ shiftKey: this.inputs.shiftKey,
2356
+ metaKey: this.inputs.metaKey,
2357
+ accelKey: isAccelKey(this.inputs),
2358
+ button: 0,
2359
+ isPen: this.getInstanceState().isPenMode ?? false
2360
+ };
2361
+ if (opts?.immediate) {
2362
+ this._flushEventForTick(event);
2363
+ } else {
2364
+ this.dispatch(event);
2365
+ }
2365
2366
  }
2366
2367
  this._tickCameraState();
2367
2368
  });
@@ -3330,24 +3331,19 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
3330
3331
  */
3331
3332
  deletePage(page) {
3332
3333
  const id = typeof page === "string" ? page : page.id;
3333
- this.run(
3334
- () => {
3335
- if (this.getIsReadonly()) return;
3336
- const pages = this.getPages();
3337
- if (pages.length === 1) return;
3338
- const deletedPage = this.getPage(id);
3339
- if (!deletedPage) return;
3340
- if (id === this.getCurrentPageId()) {
3341
- const index = pages.findIndex((page2) => page2.id === id);
3342
- const next = pages[index - 1] ?? pages[index + 1];
3343
- this.setCurrentPage(next.id);
3344
- }
3345
- const shapes = this.getSortedChildIdsForParent(deletedPage.id);
3346
- this.deleteShapes(shapes);
3347
- this.store.remove([deletedPage.id]);
3348
- },
3349
- { ignoreShapeLock: true }
3350
- );
3334
+ this.run(() => {
3335
+ if (this.getIsReadonly()) return;
3336
+ const pages = this.getPages();
3337
+ if (pages.length === 1) return;
3338
+ const deletedPage = this.getPage(id);
3339
+ if (!deletedPage) return;
3340
+ if (id === this.getCurrentPageId()) {
3341
+ const index = pages.findIndex((page2) => page2.id === id);
3342
+ const next = pages[index - 1] ?? pages[index + 1];
3343
+ this.setCurrentPage(next.id);
3344
+ }
3345
+ this.store.remove([deletedPage.id]);
3346
+ });
3351
3347
  return this;
3352
3348
  }
3353
3349
  /**
@@ -3944,7 +3940,6 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
3944
3940
  hitInside = false,
3945
3941
  hitFrameInside = false
3946
3942
  } = opts;
3947
- const [innerMargin, outerMargin] = Array.isArray(margin) ? margin : [margin, margin];
3948
3943
  let inHollowSmallestArea = Infinity;
3949
3944
  let inHollowSmallestAreaHit = null;
3950
3945
  let inMarginClosestToEdgeDistance = Infinity;
@@ -3954,7 +3949,7 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
3954
3949
  return false;
3955
3950
  const pageMask = this.getShapeMask(shape);
3956
3951
  if (pageMask && !pointInPolygon(point, pageMask)) return false;
3957
- if (filter && !filter(shape)) return false;
3952
+ if (filter) return filter(shape);
3958
3953
  return true;
3959
3954
  });
3960
3955
  for (let i = shapesToCheck.length - 1; i >= 0; i--) {
@@ -3962,7 +3957,7 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
3962
3957
  const geometry = this.getShapeGeometry(shape);
3963
3958
  const isGroup = geometry instanceof Group2d;
3964
3959
  const pointInShapeSpace = this.getPointInShapeSpace(shape, point);
3965
- if (this.isShapeOfType(shape, "frame") || (this.isShapeOfType(shape, "note") || this.isShapeOfType(shape, "arrow") || this.isShapeOfType(shape, "geo") && shape.props.fill === "none") && this.getShapeUtil(shape).getText(shape)?.trim()) {
3960
+ if (this.isShapeOfType(shape, "frame") || this.isShapeOfType(shape, "arrow") && shape.props.text.trim() || (this.isShapeOfType(shape, "note") || this.isShapeOfType(shape, "geo") && shape.props.fill === "none") && this.getShapeUtil(shape).getText(shape)?.trim()) {
3966
3961
  for (const childGeometry of geometry.children) {
3967
3962
  if (childGeometry.isLabel && childGeometry.isPointInBounds(pointInShapeSpace)) {
3968
3963
  return shape;
@@ -3970,8 +3965,8 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
3970
3965
  }
3971
3966
  }
3972
3967
  if (this.isShapeOfType(shape, "frame")) {
3973
- const distance2 = geometry.distanceToPoint(pointInShapeSpace, hitFrameInside);
3974
- if (hitFrameInside ? distance2 > 0 && distance2 <= outerMargin || distance2 <= 0 && distance2 > -innerMargin : distance2 > 0 && distance2 <= outerMargin) {
3968
+ const distance2 = geometry.distanceToPoint(pointInShapeSpace, hitInside);
3969
+ if (Math.abs(distance2) <= margin) {
3975
3970
  return inMarginClosestToEdgeHit || shape;
3976
3971
  }
3977
3972
  if (geometry.hitTestPoint(pointInShapeSpace, 0, true)) {
@@ -3991,10 +3986,10 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
3991
3986
  }
3992
3987
  distance = minDistance;
3993
3988
  } else {
3994
- if (outerMargin === 0 && (geometry.bounds.w < 1 || geometry.bounds.h < 1)) {
3989
+ if (margin === 0 && (geometry.bounds.w < 1 || geometry.bounds.h < 1)) {
3995
3990
  distance = geometry.distanceToPoint(pointInShapeSpace, hitInside);
3996
3991
  } else {
3997
- if (geometry.bounds.containsPoint(pointInShapeSpace, outerMargin)) {
3992
+ if (geometry.bounds.containsPoint(pointInShapeSpace, margin)) {
3998
3993
  distance = geometry.distanceToPoint(pointInShapeSpace, hitInside);
3999
3994
  } else {
4000
3995
  distance = Infinity;
@@ -4002,22 +3997,12 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
4002
3997
  }
4003
3998
  }
4004
3999
  if (geometry.isClosed) {
4005
- if (distance <= outerMargin || hitInside && distance <= 0 && distance > -innerMargin) {
4000
+ if (distance <= margin) {
4006
4001
  if (geometry.isFilled || isGroup && geometry.children[0].isFilled) {
4007
4002
  return inMarginClosestToEdgeHit || shape;
4008
4003
  } else {
4009
4004
  if (this.getShapePageBounds(shape).contains(viewportPageBounds)) continue;
4010
- if (hitInside ? (
4011
- // On hitInside, the distance will be negative for hits inside
4012
- // If the distance is positive, check against the outer margin
4013
- (// If the distance is negative, check against the inner margin
4014
- distance > 0 && distance <= outerMargin || distance <= 0 && distance > -innerMargin)
4015
- ) : (
4016
- // If hitInside is false, then sadly _we do not know_ whether the
4017
- // point is inside or outside of the shape, so we check against
4018
- // the max of the two margins
4019
- (Math.abs(distance) <= Math.max(innerMargin, outerMargin))
4020
- )) {
4005
+ if (Math.abs(distance) < margin) {
4021
4006
  if (Math.abs(distance) < inMarginClosestToEdgeDistance) {
4022
4007
  inMarginClosestToEdgeDistance = Math.abs(distance);
4023
4008
  inMarginClosestToEdgeHit = shape;
@@ -4782,16 +4767,7 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
4782
4767
  }
4783
4768
  this.createShapes(shapesToCreate);
4784
4769
  this.createBindings(bindingsToCreate);
4785
- this.setSelectedShapes(
4786
- compact(
4787
- ids.map((oldId) => {
4788
- const newId = shapeIds.get(oldId);
4789
- if (!newId) return null;
4790
- if (!this.getShape(newId)) return null;
4791
- return newId;
4792
- })
4793
- )
4794
- );
4770
+ this.setSelectedShapes(compact(ids.map((id) => shapeIds.get(id))));
4795
4771
  if (offset !== void 0) {
4796
4772
  const selectionPageBounds = this.getSelectionPageBounds();
4797
4773
  const viewportPageBounds = this.getViewportPageBounds();
@@ -5545,7 +5521,8 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
5545
5521
  const shapesMovingTogether = [shape];
5546
5522
  const boundsOfShapesMovingTogether = [shapePageBounds];
5547
5523
  if (!this.getShapeUtil(shape).canBeLaidOut?.(shape, {
5548
- type: "stretch"
5524
+ type: "stretch",
5525
+ shapes: shapesToStretchFirstPass
5549
5526
  })) {
5550
5527
  continue;
5551
5528
  }
@@ -5870,24 +5847,21 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
5870
5847
  }
5871
5848
  if (!partial.parentId || !(this.store.has(partial.parentId) || shapes.some((p) => p.id === partial.parentId))) {
5872
5849
  let parentId = this.getFocusedGroupId();
5873
- const isPositioned = partial.x !== void 0 && partial.y !== void 0;
5874
- if (isPositioned) {
5875
- for (let i = currentPageShapesSorted.length - 1; i >= 0; i--) {
5876
- const parent = currentPageShapesSorted[i];
5877
- const util = this.getShapeUtil(parent);
5878
- if (util.canReceiveNewChildrenOfType(parent, partial.type) && !this.isShapeHidden(parent) && this.isPointInShape(
5879
- parent,
5880
- // If no parent is provided, then we can treat the
5881
- // shape's provided x/y as being in the page's space.
5882
- { x: partial.x ?? 0, y: partial.y ?? 0 },
5883
- {
5884
- margin: 0,
5885
- hitInside: true
5886
- }
5887
- )) {
5888
- parentId = parent.id;
5889
- break;
5850
+ for (let i = currentPageShapesSorted.length - 1; i >= 0; i--) {
5851
+ const parent = currentPageShapesSorted[i];
5852
+ const util = this.getShapeUtil(parent);
5853
+ if (util.canReceiveNewChildrenOfType(parent, partial.type) && !this.isShapeHidden(parent) && this.isPointInShape(
5854
+ parent,
5855
+ // If no parent is provided, then we can treat the
5856
+ // shape's provided x/y as being in the page's space.
5857
+ { x: partial.x ?? 0, y: partial.y ?? 0 },
5858
+ {
5859
+ margin: 0,
5860
+ hitInside: true
5890
5861
  }
5862
+ )) {
5863
+ parentId = parent.id;
5864
+ break;
5891
5865
  }
5892
5866
  }
5893
5867
  const prevParentId = partial.parentId;
@@ -7072,47 +7046,6 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
7072
7046
  this.dispatch({ type: "misc", name: "complete" });
7073
7047
  return this;
7074
7048
  }
7075
- /**
7076
- * Dispatch a pointer move event in the current position of the pointer. This is useful when
7077
- * external circumstances have changed (e.g. the camera moved or a shape was moved) and you want
7078
- * the current interaction to respond to that change.
7079
- *
7080
- * @example
7081
- * ```ts
7082
- * editor.updatePointer()
7083
- * ```
7084
- *
7085
- * @param options - The options for updating the pointer.
7086
- * @returns The editor instance.
7087
- * @public
7088
- */
7089
- updatePointer(options) {
7090
- const event = {
7091
- type: "pointer",
7092
- target: "canvas",
7093
- name: "pointer_move",
7094
- point: options?.point ?? // weird but true: what `inputs` calls screen-space is actually viewport space. so
7095
- // we need to convert back into true screen space first. we should fix this...
7096
- Vec.Add(
7097
- this.inputs.currentScreenPoint,
7098
- this.store.unsafeGetWithoutCapture(TLINSTANCE_ID).screenBounds
7099
- ),
7100
- pointerId: options?.pointerId ?? 0,
7101
- button: options?.button ?? 0,
7102
- isPen: options?.isPen ?? this.inputs.isPen,
7103
- shiftKey: options?.shiftKey ?? this.inputs.shiftKey,
7104
- altKey: options?.altKey ?? this.inputs.altKey,
7105
- ctrlKey: options?.ctrlKey ?? this.inputs.ctrlKey,
7106
- metaKey: options?.metaKey ?? this.inputs.metaKey,
7107
- accelKey: options?.accelKey ?? isAccelKey(this.inputs)
7108
- };
7109
- if (options?.immediate) {
7110
- this._flushEventForTick(event);
7111
- } else {
7112
- this.dispatch(event);
7113
- }
7114
- return this;
7115
- }
7116
7049
  /**
7117
7050
  * Puts the editor into focused mode.
7118
7051
  *