tldraw 4.3.0-canary.9c474ef3fad5 → 4.3.0-canary.a2419250444e

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 (507) hide show
  1. package/dist-cjs/index.d.ts +285 -237
  2. package/dist-cjs/index.js +12 -5
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/defaultEmbedDefinitions.js +1 -1
  5. package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
  6. package/dist-cjs/lib/defaultExternalContentHandlers.js +5 -5
  7. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  8. package/dist-cjs/lib/defaultSideEffects.js +6 -1
  9. package/dist-cjs/lib/defaultSideEffects.js.map +2 -2
  10. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +6 -2
  11. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  12. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +1 -1
  13. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
  14. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  15. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  16. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js +1 -1
  17. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js.map +2 -2
  18. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +4 -10
  19. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +2 -2
  20. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +7 -4
  21. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  22. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +1 -1
  23. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
  24. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +22 -20
  25. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  26. package/dist-cjs/lib/shapes/draw/getPath.js +20 -11
  27. package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
  28. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +82 -86
  29. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +3 -3
  30. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +6 -0
  31. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
  32. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +5 -4
  33. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  34. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +136 -136
  35. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  36. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +5 -10
  37. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js.map +2 -2
  38. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +3 -3
  39. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
  40. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +22 -20
  41. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  42. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +3 -3
  43. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
  44. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +1 -6
  45. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  46. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +5 -10
  47. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
  48. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +1 -1
  49. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
  50. package/dist-cjs/lib/shapes/shared/RichTextLabel.js +1 -1
  51. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +2 -2
  52. package/dist-cjs/lib/shapes/shared/interpolate-props.js +3 -3
  53. package/dist-cjs/lib/shapes/shared/interpolate-props.js.map +2 -2
  54. package/dist-cjs/lib/shapes/text/RichTextArea.js +5 -0
  55. package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
  56. package/dist-cjs/lib/shapes/text/toolStates/Idle.js +4 -10
  57. package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +2 -2
  58. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +7 -5
  59. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
  60. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +4 -5
  61. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  62. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +2 -4
  63. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  64. package/dist-cjs/lib/tools/HandTool/HandTool.js +3 -5
  65. package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
  66. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +3 -2
  67. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +2 -2
  68. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js +1 -1
  69. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js.map +2 -2
  70. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js +1 -1
  71. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js.map +2 -2
  72. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +9 -7
  73. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
  74. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +6 -5
  75. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
  76. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js +4 -6
  77. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js.map +2 -2
  78. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +1 -1
  79. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
  80. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +1 -1
  81. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
  82. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js +1 -1
  83. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js.map +2 -2
  84. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js +2 -1
  85. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js.map +2 -2
  86. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js +1 -1
  87. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js.map +2 -2
  88. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +7 -5
  89. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  90. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +38 -11
  91. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
  92. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +42 -50
  93. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  94. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js +6 -6
  95. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
  96. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js +1 -1
  97. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js.map +2 -2
  98. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js +4 -14
  99. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
  100. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +1 -1
  101. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +2 -2
  102. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +1 -1
  103. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +2 -2
  104. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +2 -2
  105. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
  106. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +4 -13
  107. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
  108. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +5 -6
  109. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  110. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +2 -3
  111. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
  112. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +7 -6
  113. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
  114. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +13 -11
  115. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  116. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js +15 -4
  117. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js.map +2 -2
  118. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js +1 -1
  119. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js.map +2 -2
  120. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js +3 -3
  121. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js.map +2 -2
  122. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js +5 -6
  123. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js.map +2 -2
  124. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js +1 -3
  125. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
  126. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js +1 -1
  127. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js.map +2 -2
  128. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js +1 -1
  129. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js.map +2 -2
  130. package/dist-cjs/lib/ui/TldrawUi.js +2 -2
  131. package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
  132. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +1 -3
  133. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
  134. package/dist-cjs/lib/ui/components/CursorChatBubble.js +1 -1
  135. package/dist-cjs/lib/ui/components/CursorChatBubble.js.map +2 -2
  136. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js +1 -21
  137. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js.map +2 -2
  138. package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js +1 -1
  139. package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js.map +2 -2
  140. package/dist-cjs/lib/ui/components/HelperButtons/StopFollowing.js.map +2 -2
  141. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -1
  142. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
  143. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +2 -15
  144. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js.map +3 -3
  145. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js +3 -1
  146. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js.map +2 -2
  147. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js +6 -0
  148. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js.map +2 -2
  149. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +1 -1
  150. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +2 -2
  151. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js +1 -1
  152. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js.map +2 -2
  153. package/dist-cjs/lib/ui/components/TopPanel/CenteredTopPanelContainer.js.map +1 -1
  154. package/dist-cjs/lib/ui/components/ZoomMenu/DefaultZoomMenu.js +1 -1
  155. package/dist-cjs/lib/ui/components/ZoomMenu/DefaultZoomMenu.js.map +2 -2
  156. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +3 -1
  157. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  158. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +6 -5
  159. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  160. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.js.map +2 -2
  161. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.js.map +2 -2
  162. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +13 -6
  163. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  164. package/dist-cjs/lib/ui/context/actions.js +6 -6
  165. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  166. package/dist-cjs/lib/ui/context/components.js +1 -2
  167. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  168. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +2 -2
  169. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
  170. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
  171. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
  172. package/dist-cjs/lib/ui/hooks/useTools.js +4 -5
  173. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  174. package/dist-cjs/lib/ui/version.js +3 -3
  175. package/dist-cjs/lib/ui/version.js.map +1 -1
  176. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +8 -6
  177. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  178. package/dist-cjs/lib/{tools/selection-logic/getShouldEnterCropModeOnPointerDown.js → utils/test-helpers.js} +21 -8
  179. package/dist-cjs/lib/utils/test-helpers.js.map +7 -0
  180. package/dist-cjs/lib/utils/text/richText.js +4 -2
  181. package/dist-cjs/lib/utils/text/richText.js.map +2 -2
  182. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +7 -2
  183. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  184. package/dist-esm/index.d.mts +285 -237
  185. package/dist-esm/index.mjs +12 -5
  186. package/dist-esm/index.mjs.map +2 -2
  187. package/dist-esm/lib/defaultEmbedDefinitions.mjs +1 -1
  188. package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
  189. package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -5
  190. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  191. package/dist-esm/lib/defaultSideEffects.mjs +6 -1
  192. package/dist-esm/lib/defaultSideEffects.mjs.map +2 -2
  193. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +6 -2
  194. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  195. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +1 -1
  196. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  197. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  198. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  199. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs +1 -1
  200. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs.map +2 -2
  201. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +4 -10
  202. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +2 -2
  203. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +7 -4
  204. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  205. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +1 -1
  206. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  207. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +27 -22
  208. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  209. package/dist-esm/lib/shapes/draw/getPath.mjs +21 -11
  210. package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
  211. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +83 -86
  212. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +3 -3
  213. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +6 -0
  214. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
  215. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +5 -4
  216. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  217. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +137 -136
  218. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  219. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +5 -10
  220. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs.map +2 -2
  221. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +3 -3
  222. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
  223. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +23 -21
  224. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  225. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +3 -3
  226. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
  227. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +2 -7
  228. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  229. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +5 -10
  230. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
  231. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +1 -1
  232. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
  233. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +1 -1
  234. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  235. package/dist-esm/lib/shapes/shared/interpolate-props.mjs +4 -4
  236. package/dist-esm/lib/shapes/shared/interpolate-props.mjs.map +2 -2
  237. package/dist-esm/lib/shapes/text/RichTextArea.mjs +5 -0
  238. package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
  239. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +4 -10
  240. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +2 -2
  241. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +7 -5
  242. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
  243. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +4 -5
  244. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  245. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +2 -4
  246. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  247. package/dist-esm/lib/tools/HandTool/HandTool.mjs +3 -5
  248. package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
  249. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +3 -2
  250. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +2 -2
  251. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs +1 -1
  252. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs.map +2 -2
  253. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs +1 -1
  254. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs.map +2 -2
  255. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +9 -7
  256. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
  257. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +6 -5
  258. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
  259. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs +4 -6
  260. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs.map +2 -2
  261. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +1 -1
  262. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
  263. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +1 -1
  264. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
  265. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs +1 -1
  266. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs.map +2 -2
  267. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs +2 -1
  268. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs.map +2 -2
  269. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs +1 -1
  270. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs.map +2 -2
  271. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +7 -5
  272. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  273. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +38 -11
  274. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
  275. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +43 -51
  276. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  277. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs +6 -6
  278. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
  279. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs +1 -1
  280. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs.map +2 -2
  281. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +5 -15
  282. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
  283. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +1 -1
  284. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +2 -2
  285. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +1 -1
  286. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +2 -2
  287. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +2 -2
  288. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
  289. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +4 -13
  290. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
  291. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +5 -6
  292. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  293. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +2 -3
  294. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
  295. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +7 -6
  296. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
  297. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +13 -11
  298. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  299. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs +17 -4
  300. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs.map +2 -2
  301. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs +1 -1
  302. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs.map +2 -2
  303. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs +3 -3
  304. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs.map +2 -2
  305. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs +5 -6
  306. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs.map +2 -2
  307. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs +1 -3
  308. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
  309. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs +1 -1
  310. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs.map +2 -2
  311. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs +1 -1
  312. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs.map +2 -2
  313. package/dist-esm/lib/ui/TldrawUi.mjs +2 -2
  314. package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
  315. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +1 -3
  316. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
  317. package/dist-esm/lib/ui/components/CursorChatBubble.mjs +1 -1
  318. package/dist-esm/lib/ui/components/CursorChatBubble.mjs.map +2 -2
  319. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs +3 -30
  320. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs.map +2 -2
  321. package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs +1 -1
  322. package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs.map +2 -2
  323. package/dist-esm/lib/ui/components/HelperButtons/StopFollowing.mjs.map +2 -2
  324. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +1 -1
  325. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
  326. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs +3 -6
  327. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs.map +2 -2
  328. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs +3 -1
  329. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs.map +2 -2
  330. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs +6 -0
  331. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs.map +2 -2
  332. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +1 -1
  333. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +2 -2
  334. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs +1 -1
  335. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs.map +2 -2
  336. package/dist-esm/lib/ui/components/TopPanel/CenteredTopPanelContainer.mjs.map +1 -1
  337. package/dist-esm/lib/ui/components/ZoomMenu/DefaultZoomMenu.mjs +1 -1
  338. package/dist-esm/lib/ui/components/ZoomMenu/DefaultZoomMenu.mjs.map +2 -2
  339. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +3 -1
  340. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  341. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +6 -5
  342. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  343. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.mjs.map +2 -2
  344. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.mjs.map +2 -2
  345. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +13 -6
  346. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  347. package/dist-esm/lib/ui/context/actions.mjs +6 -6
  348. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  349. package/dist-esm/lib/ui/context/components.mjs +1 -2
  350. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  351. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +2 -2
  352. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
  353. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
  354. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
  355. package/dist-esm/lib/ui/hooks/useTools.mjs +4 -5
  356. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  357. package/dist-esm/lib/ui/version.mjs +3 -3
  358. package/dist-esm/lib/ui/version.mjs.map +1 -1
  359. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +9 -6
  360. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  361. package/dist-esm/lib/utils/test-helpers.mjs +21 -0
  362. package/dist-esm/lib/utils/test-helpers.mjs.map +7 -0
  363. package/dist-esm/lib/utils/text/richText.mjs +5 -2
  364. package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
  365. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +8 -2
  366. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  367. package/package.json +18 -16
  368. package/src/index.ts +5 -2
  369. package/src/lib/Tldraw.test.tsx +46 -1
  370. package/src/lib/defaultEmbedDefinitions.ts +2 -1
  371. package/src/lib/defaultExternalContentHandlers.ts +10 -10
  372. package/src/lib/defaultSideEffects.ts +6 -1
  373. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +40 -133
  374. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +8 -8
  375. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +6 -4
  376. package/src/lib/shapes/arrow/arrowLabel.ts +1 -1
  377. package/src/lib/shapes/arrow/arrowTargetState.ts +1 -1
  378. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.test.ts +80 -0
  379. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.tsx +1 -1
  380. package/src/lib/shapes/arrow/toolStates/Idle.tsx +4 -14
  381. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +7 -4
  382. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +1 -1
  383. package/src/lib/shapes/draw/DrawShapeUtil.test.ts +146 -0
  384. package/src/lib/shapes/draw/DrawShapeUtil.tsx +28 -24
  385. package/src/lib/shapes/draw/getPath.ts +31 -10
  386. package/src/lib/shapes/draw/toolStates/Drawing.ts +96 -86
  387. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +7 -0
  388. package/src/lib/shapes/frame/FrameShapeUtil.tsx +9 -3
  389. package/src/lib/shapes/geo/GeoShapeUtil.tsx +219 -172
  390. package/src/lib/shapes/geo/toolStates/Idle.ts +5 -15
  391. package/src/lib/shapes/geo/toolStates/Pointing.ts +3 -3
  392. package/src/lib/shapes/highlight/HighlightShapeUtil.test.ts +146 -0
  393. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +24 -23
  394. package/src/lib/shapes/line/toolStates/Pointing.ts +3 -3
  395. package/src/lib/shapes/note/NoteShapeUtil.tsx +2 -2
  396. package/src/lib/shapes/note/noteCloning.test.ts +3 -1
  397. package/src/lib/shapes/note/toolStates/Pointing.ts +5 -10
  398. package/src/lib/shapes/shared/HyperlinkButton.tsx +1 -1
  399. package/src/lib/shapes/shared/RichTextLabel.tsx +1 -1
  400. package/src/lib/shapes/shared/interpolate-props.ts +4 -4
  401. package/src/lib/shapes/text/RichTextArea.tsx +5 -0
  402. package/src/lib/shapes/text/toolStates/Idle.ts +4 -14
  403. package/src/lib/shapes/text/toolStates/Pointing.ts +7 -7
  404. package/src/lib/tools/EraserTool/childStates/Erasing.ts +4 -5
  405. package/src/lib/tools/EraserTool/childStates/Pointing.ts +2 -4
  406. package/src/lib/tools/HandTool/HandTool.ts +3 -5
  407. package/src/lib/tools/HandTool/childStates/Dragging.ts +3 -2
  408. package/src/lib/tools/HandTool/childStates/Pointing.ts +1 -1
  409. package/src/lib/tools/LaserTool/childStates/Lasering.ts +1 -1
  410. package/src/lib/tools/SelectTool/DragAndDropManager.ts +12 -7
  411. package/src/lib/tools/SelectTool/childStates/Brushing.ts +6 -5
  412. package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +7 -6
  413. package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +1 -1
  414. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +1 -1
  415. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.ts +1 -1
  416. package/src/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.ts +2 -1
  417. package/src/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.ts +1 -1
  418. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +7 -5
  419. package/src/lib/tools/SelectTool/childStates/EditingShape.ts +55 -12
  420. package/src/lib/tools/SelectTool/childStates/Idle.ts +58 -71
  421. package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +6 -7
  422. package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +1 -1
  423. package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +5 -5
  424. package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +1 -1
  425. package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +1 -1
  426. package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +2 -2
  427. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +4 -14
  428. package/src/lib/tools/SelectTool/childStates/Resizing.ts +6 -6
  429. package/src/lib/tools/SelectTool/childStates/Rotating.ts +2 -3
  430. package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +7 -6
  431. package/src/lib/tools/SelectTool/childStates/Translating.ts +15 -12
  432. package/src/lib/tools/SelectTool/selectHelpers.ts +39 -4
  433. package/src/lib/tools/ZoomTool/ZoomTool.ts +1 -1
  434. package/src/lib/tools/ZoomTool/childStates/Pointing.ts +3 -3
  435. package/src/lib/tools/ZoomTool/childStates/ZoomBrushing.ts +5 -6
  436. package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -3
  437. package/src/lib/tools/selection-logic/selectOnCanvasPointerUp.ts +1 -1
  438. package/src/lib/tools/selection-logic/updateHoveredShapeId.ts +1 -1
  439. package/src/lib/ui/TldrawUi.tsx +5 -2
  440. package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +1 -3
  441. package/src/lib/ui/components/CursorChatBubble.tsx +2 -2
  442. package/src/lib/ui/components/DefaultDebugPanel.tsx +3 -42
  443. package/src/lib/ui/components/HelperButtons/BackToContent.tsx +1 -1
  444. package/src/lib/ui/components/HelperButtons/StopFollowing.tsx +2 -2
  445. package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +1 -1
  446. package/src/lib/ui/components/OfflineIndicator/OfflineIndicator.tsx +6 -5
  447. package/src/lib/ui/components/PageMenu/PageItemInput.tsx +3 -1
  448. package/src/lib/ui/components/SharePanel/PeopleMenu.tsx +8 -0
  449. package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +1 -1
  450. package/src/lib/ui/components/Toolbar/DefaultRichTextToolbar.tsx +1 -1
  451. package/src/lib/ui/components/TopPanel/CenteredTopPanelContainer.tsx +1 -1
  452. package/src/lib/ui/components/ZoomMenu/DefaultZoomMenu.tsx +1 -1
  453. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +5 -3
  454. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +12 -5
  455. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.tsx +1 -1
  456. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.tsx +1 -1
  457. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +5 -2
  458. package/src/lib/ui/context/actions.tsx +6 -6
  459. package/src/lib/ui/context/components.tsx +1 -2
  460. package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
  461. package/src/lib/ui/hooks/useKeyboardShortcuts.ts +2 -2
  462. package/src/lib/ui/hooks/useTools.tsx +4 -5
  463. package/src/lib/ui/version.ts +3 -3
  464. package/src/lib/ui.css +27 -23
  465. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +12 -48
  466. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +11 -6
  467. package/src/lib/utils/test-helpers.ts +60 -0
  468. package/src/lib/utils/text/richText.ts +6 -5
  469. package/src/lib/utils/tldr/buildFromV1Document.ts +9 -2
  470. package/src/test/Editor.test.tsx +40 -29
  471. package/src/test/EraserTool.test.ts +10 -12
  472. package/src/test/TestEditor.ts +48 -47
  473. package/src/test/TldrawEditor.test.tsx +3 -2
  474. package/src/test/__snapshots__/drawing.test.ts.snap +3 -1257
  475. package/src/test/__snapshots__/resizing.test.ts.snap +3 -12
  476. package/src/test/arrows-megabus.test.tsx +1 -1
  477. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +8 -8
  478. package/src/test/commands/setCamera.test.ts +13 -11
  479. package/src/test/commands/stackShapes.test.ts +34 -8
  480. package/src/test/commands/zoomToBounds.test.ts +19 -3
  481. package/src/test/commands/zoomToSelection.test.ts +14 -3
  482. package/src/test/custom-clipping.test.ts +16 -9
  483. package/src/test/drawing.test.ts +17 -10
  484. package/src/test/flipShapes.test.ts +33 -0
  485. package/src/test/frames.test.ts +92 -0
  486. package/src/test/groups.test.tsx +1 -1
  487. package/src/test/modifiers.test.ts +6 -6
  488. package/src/test/resizing.test.ts +7 -9
  489. package/src/test/selection-omnibus.test.ts +2 -2
  490. package/src/test/spacebarPanning.test.ts +28 -10
  491. package/src/test/test-jsx.tsx +3 -0
  492. package/src/test/ui/BackToContent.test.tsx +111 -0
  493. package/tldraw.css +33 -31
  494. package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +0 -7
  495. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js +0 -32
  496. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js.map +0 -7
  497. package/dist-cjs/lib/utils/text/textDirection.js +0 -51
  498. package/dist-cjs/lib/utils/text/textDirection.js.map +0 -7
  499. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +0 -8
  500. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +0 -7
  501. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs +0 -12
  502. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs.map +0 -7
  503. package/dist-esm/lib/utils/text/textDirection.mjs +0 -31
  504. package/dist-esm/lib/utils/text/textDirection.mjs.map +0 -7
  505. package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +0 -10
  506. package/src/lib/ui/components/TopPanel/DefaultTopPanel.tsx +0 -10
  507. package/src/lib/utils/text/textDirection.ts +0 -32
@@ -16,20 +16,11 @@ exports[`When resizing a shape with children > Resizes a rotated draw shape > dr
16
16
  "isComplete": false,
17
17
  "isPen": false,
18
18
  "scale": 1,
19
+ "scaleX": 1.1,
20
+ "scaleY": 1.1,
19
21
  "segments": [
20
22
  {
21
- "points": [
22
- {
23
- "x": 0,
24
- "y": 0,
25
- "z": 0.5,
26
- },
27
- {
28
- "x": 110,
29
- "y": 110,
30
- "z": 0.5,
31
- },
32
- ],
23
+ "points": "AAAAAAA4QFZAVgA4",
33
24
  "type": "free",
34
25
  },
35
26
  ],
@@ -33,7 +33,7 @@ it('requires a move to begin drawing', () => {
33
33
  editor.pointerDown()
34
34
  editor.pointerMove(2, 0)
35
35
 
36
- expect(editor.inputs.isDragging).toBe(false)
36
+ expect(editor.inputs.getIsDragging()).toBe(false)
37
37
  })
38
38
 
39
39
  describe('Making an arrow on the page', () => {
@@ -16,7 +16,7 @@ exports[`Matches a snapshot > Basic SVG 1`] = `
16
16
  >
17
17
  <defs>
18
18
  <mask
19
- id="_export_4_rb_"
19
+ id="_export_4_r_b_"
20
20
  >
21
21
  <rect
22
22
  fill="white"
@@ -51,14 +51,14 @@ exports[`Matches a snapshot > Basic SVG 1`] = `
51
51
  </mask>
52
52
  <pattern
53
53
  height="8"
54
- id="_export_4_ra__hash_pattern_light_0"
54
+ id="_export_4_r_a__hash_pattern_light_0"
55
55
  patternUnits="userSpaceOnUse"
56
56
  width="8"
57
57
  >
58
58
  <rect
59
59
  fill="#fcfffe"
60
60
  height="8"
61
- mask="url(#_export_4_rb_)"
61
+ mask="url(#_export_4_r_b_)"
62
62
  width="8"
63
63
  x="0"
64
64
  y="0"
@@ -127,7 +127,7 @@ exports[`Matches a snapshot > Basic SVG 1`] = `
127
127
  />
128
128
  <path
129
129
  d="M 0 0 L 100 0 L 100 100 L 0 100 Z"
130
- fill="url(#_export_4_ra__hash_pattern_light_0)"
130
+ fill="url(#_export_4_r_a__hash_pattern_light_0)"
131
131
  />
132
132
  <path
133
133
  d="M 0 0 L 100 0 L 100 100 L 0 100 Z"
@@ -156,7 +156,7 @@ exports[`Returns all shapes when no ids are provided > All shapes 1`] = `
156
156
  >
157
157
  <defs>
158
158
  <mask
159
- id="_export_2_r5_"
159
+ id="_export_2_r_5_"
160
160
  >
161
161
  <rect
162
162
  fill="white"
@@ -191,14 +191,14 @@ exports[`Returns all shapes when no ids are provided > All shapes 1`] = `
191
191
  </mask>
192
192
  <pattern
193
193
  height="8"
194
- id="_export_2_r4__hash_pattern_light_0"
194
+ id="_export_2_r_4__hash_pattern_light_0"
195
195
  patternUnits="userSpaceOnUse"
196
196
  width="8"
197
197
  >
198
198
  <rect
199
199
  fill="#fcfffe"
200
200
  height="8"
201
- mask="url(#_export_2_r5_)"
201
+ mask="url(#_export_2_r_5_)"
202
202
  width="8"
203
203
  x="0"
204
204
  y="0"
@@ -267,7 +267,7 @@ exports[`Returns all shapes when no ids are provided > All shapes 1`] = `
267
267
  />
268
268
  <path
269
269
  d="M 0 0 L 100 0 L 100 100 L 0 100 Z"
270
- fill="url(#_export_2_r4__hash_pattern_light_0)"
270
+ fill="url(#_export_2_r_4__hash_pattern_light_0)"
271
271
  />
272
272
  <path
273
273
  d="M 0 0 L 100 0 L 100 100 L 0 100 Z"
@@ -13,6 +13,8 @@ beforeEach(() => {
13
13
  })
14
14
  editor.updateViewportScreenBounds(new Box(0, 0, 1600, 900))
15
15
  editor.user.updateUserPreferences({ inputMode: null })
16
+ editor._transformPointerDownSpy.mockRestore()
17
+ editor._transformPointerUpSpy.mockRestore()
16
18
  })
17
19
 
18
20
  const wheelEvent = {
@@ -255,8 +257,8 @@ describe('CameraOptions.panSpeed', () => {
255
257
 
256
258
  it('Does not affect hand tool panning', () => {
257
259
  editor.setCameraOptions({ ...DEFAULT_CAMERA_OPTIONS, panSpeed: 2 })
258
- editor.setCurrentTool('hand').pointerDown(0, 0).pointerMove(5, 10).forceTick()
259
- expect(editor.getCamera()).toMatchObject({ x: 5, y: 10, z: 1 })
260
+ editor.setCurrentTool('hand').pointerDown(0, 0).pointerMove(50, 50)
261
+ expect(editor.getCamera()).toMatchObject({ x: 50, y: 50, z: 1 })
260
262
  })
261
263
 
262
264
  it('Does not affect spacebar panning (2x)', () => {
@@ -288,12 +290,12 @@ describe('CameraOptions.panSpeed', () => {
288
290
  .createShape({ id: shapeId, type: 'geo', x: 10, y: 10 })
289
291
  .select(shapeId)
290
292
  const shape = editor.getSelectedShapes()[0]
291
- editor.selectNone()
292
293
  // Move shape far beyond bounds to trigger edge scrolling at maximum speed
293
294
  expect(editor.getCamera()).toMatchObject({ x: 0, y: 0, z: 1 })
294
- editor.pointerDown(shape.x, shape.y).pointerMove(-5000, -5000)
295
- // At maximum speed and a zoom level of 1, the camera should move by 40px per tick if the screen
296
- // is wider than 1000 pixels, or by 40 * 0.612px if it is smaller.
295
+ // pointerMove calls forceTick() internally, so we don't need an extra forceTick() call
296
+ editor.pointerDown(shape.x, shape.y, shapeId).forceTick().pointerMove(-5000, -5000)
297
+ // At maximum speed and a zoom level of 1, the camera should move by 25px per tick if the screen
298
+ // is wider than 1000 pixels, or by 25 * 0.612px if it is smaller.
297
299
  const newX = viewportScreenBounds.w < 1000 ? 25 * 0.612 : 25
298
300
  const newY = viewportScreenBounds.h < 1000 ? 25 * 0.612 : 25
299
301
  expect(editor.getCamera()).toMatchObject({ x: newX, y: newY, z: 1 })
@@ -557,11 +559,11 @@ describe('When constraints are free', () => {
557
559
 
558
560
  it('zooms onto mouse position', () => {
559
561
  editor.pointerMove(100, 100)
560
- expect(editor.inputs.currentPagePoint).toMatchObject({ x: 100, y: 100 })
561
- editor.zoomIn(editor.inputs.currentScreenPoint, { immediate: true })
562
- expect(editor.inputs.currentPagePoint).toMatchObject({ x: 100, y: 100 })
563
- editor.zoomOut(editor.inputs.currentScreenPoint, { immediate: true })
564
- expect(editor.inputs.currentPagePoint).toMatchObject({ x: 100, y: 100 })
562
+ expect(editor.inputs.getCurrentPagePoint()).toMatchObject({ x: 100, y: 100 })
563
+ editor.zoomIn(editor.inputs.getCurrentScreenPoint(), { immediate: true })
564
+ expect(editor.inputs.getCurrentPagePoint()).toMatchObject({ x: 100, y: 100 })
565
+ editor.zoomOut(editor.inputs.getCurrentScreenPoint(), { immediate: true })
566
+ expect(editor.inputs.getCurrentPagePoint()).toMatchObject({ x: 100, y: 100 })
565
567
  })
566
568
  })
567
569
 
@@ -62,28 +62,54 @@ describe('distributeShapes command', () => {
62
62
 
63
63
  describe('when stacking horizontally', () => {
64
64
  it('stacks the shapes based on the editors adjacentShapeMargin', () => {
65
- editor.setSelectedShapes([ids.boxA, ids.boxB, ids.boxC, ids.boxD])
66
- // @ts-expect-error
67
- editor.options.adjacentShapeMargin = 1
68
- editor.stackShapes(editor.getSelectedShapeIds(), 'horizontal')
65
+ // Create a new editor with custom adjacentShapeMargin option
66
+ const customEditor = new TestEditor({ options: { adjacentShapeMargin: 1 } })
67
+ customEditor.createShapes([
68
+ {
69
+ id: ids.boxA,
70
+ type: 'geo',
71
+ x: 0,
72
+ y: 0,
73
+ },
74
+ {
75
+ id: ids.boxB,
76
+ type: 'geo',
77
+ x: 100,
78
+ y: 100,
79
+ },
80
+ {
81
+ id: ids.boxC,
82
+ type: 'geo',
83
+ x: 400,
84
+ y: 400,
85
+ },
86
+ {
87
+ id: ids.boxD,
88
+ type: 'geo',
89
+ x: 700,
90
+ y: 700,
91
+ },
92
+ ])
93
+ customEditor.setSelectedShapes([ids.boxA, ids.boxB, ids.boxC, ids.boxD])
94
+ customEditor.stackShapes(customEditor.getSelectedShapeIds(), 'horizontal')
69
95
  vi.advanceTimersByTime(1000)
70
96
  // 200 distance gap between c and d
71
- editor.expectShapeToMatch({
97
+ customEditor.expectShapeToMatch({
72
98
  id: ids.boxA,
73
99
  x: 0,
74
100
  y: 0,
75
101
  })
76
- editor.expectShapeToMatch({
102
+ customEditor.expectShapeToMatch({
77
103
  id: ids.boxB,
78
104
  x: 101,
79
105
  y: 100,
80
106
  })
81
- editor.expectShapeToMatch({
107
+ customEditor.expectShapeToMatch({
82
108
  id: ids.boxC,
83
109
  x: 202,
84
110
  y: 400,
85
111
  })
86
- editor.expectShapeToMatch({
112
+ customEditor.expectShapeToMatch({
87
113
  id: ids.boxD,
88
114
  x: 303,
89
115
  y: 700,
@@ -24,10 +24,16 @@ describe('When zooming to bounds', () => {
24
24
  h: 1000,
25
25
  })
26
26
 
27
+ const padding = editor.options.zoomToFitPadding
28
+
27
29
  editor.zoomToBounds(new Box(200, 300, 300, 300))
28
- expect(editor.getCamera().z).toCloselyMatchObject((1000 - 128) / 300)
29
- expect(editor.getViewportPageBounds().width).toCloselyMatchObject(1000 / ((1000 - 128) / 300))
30
- expect(editor.getViewportPageBounds().height).toCloselyMatchObject(1000 / ((1000 - 128) / 300))
30
+ expect(editor.getCamera().z).toCloselyMatchObject((1000 - padding) / 300)
31
+ expect(editor.getViewportPageBounds().width).toCloselyMatchObject(
32
+ 1000 / ((1000 - padding) / 300)
33
+ )
34
+ expect(editor.getViewportPageBounds().height).toCloselyMatchObject(
35
+ 1000 / ((1000 - padding) / 300)
36
+ )
31
37
  })
32
38
  })
33
39
 
@@ -55,3 +61,13 @@ it('is ignored by undo/redo', () => {
55
61
  editor.undo()
56
62
  expect(editor.getViewportPageCenter().toJson()).toCloselyMatchObject({ x: 350, y: 450 })
57
63
  })
64
+
65
+ it('respects custom zoomToFitPadding option', () => {
66
+ const customPadding = 64
67
+ editor = new TestEditor({ options: { zoomToFitPadding: customPadding } })
68
+ editor.setScreenBounds({ x: 0, y: 0, w: 1000, h: 1000 })
69
+ editor.setCamera({ x: 0, y: 0, z: 1 })
70
+
71
+ editor.zoomToBounds(new Box(200, 300, 300, 300))
72
+ expect(editor.getCamera().z).toCloselyMatchObject((1000 - customPadding) / 300)
73
+ })
@@ -13,17 +13,28 @@ beforeEach(() => {
13
13
  editor.createShapes(createDefaultShapes())
14
14
  })
15
15
 
16
- it('zooms to selection bounds', () => {
16
+ it('zooms to 100% when not already at 100%', () => {
17
+ editor.zoomIn() // zoom to something other than 100%
17
18
  editor.setSelectedShapes([ids.box1, ids.box2])
18
19
  editor.zoomToSelection()
19
- editor.expectCameraToBe(354.64, 139.29, 1)
20
+ expect(editor.getZoomLevel()).toBeCloseTo(1)
21
+ })
22
+
23
+ it('zooms to fit selection when already at 100%', () => {
24
+ // Editor starts at 100%, so first call zooms to fit
25
+ editor.setSelectedShapes([ids.box1, ids.box2])
26
+ editor.zoomToSelection()
27
+ // Should now be zoomed to fit the selection bounds (greater than 100% for small selection)
28
+ expect(editor.getZoomLevel()).toBeGreaterThan(1)
20
29
  })
21
30
 
22
31
  it('does not zoom past max', () => {
23
32
  editor.updateShapes([{ id: ids.box1, type: 'geo', props: { w: 1, h: 1 } }])
24
33
  editor.select(ids.box1)
25
34
  editor.zoomToSelection()
26
- expect(editor.getZoomLevel()).toBe(1) // double check again when we're zooming in hard
35
+ // When at 100%, zooms to fit but respects camera max zoom
36
+ const { zoomSteps } = editor.getCameraOptions()
37
+ expect(editor.getZoomLevel()).toBe(zoomSteps[zoomSteps.length - 1])
27
38
  })
28
39
 
29
40
  it('does not zoom past min', () => {
@@ -31,6 +31,9 @@ export type CircleClipShape = TLShape<typeof CIRCLE_CLIP_TYPE>
31
31
 
32
32
  export const isClippingEnabled$ = atom('isClippingEnabled', true)
33
33
 
34
+ // The stroke width used when rendering the circle
35
+ const STROKE_WIDTH = 2
36
+
34
37
  export class CircleClipShapeUtil extends BaseBoxShapeUtil<CircleClipShape> {
35
38
  static override type = CIRCLE_CLIP_TYPE
36
39
  static override props: RecordProps<CircleClipShape> = {
@@ -64,17 +67,20 @@ export class CircleClipShapeUtil extends BaseBoxShapeUtil<CircleClipShape> {
64
67
  }
65
68
 
66
69
  override getClipPath(shape: CircleClipShape): Vec[] | undefined {
67
- // Generate a polygon approximation of the circle
70
+ // Generate a polygon approximation of the circle.
71
+ // We inset the clip path by half the stroke width so that children are
72
+ // clipped to the inner edge of the stroke, not the center line.
68
73
  const centerX = shape.props.w / 2
69
74
  const centerY = shape.props.h / 2
70
- const radius = Math.min(shape.props.w, shape.props.h) / 2
75
+ const outerRadius = Math.min(shape.props.w, shape.props.h) / 2
76
+ const clipRadius = outerRadius - STROKE_WIDTH / 2
71
77
  const segments = 48 // More segments = smoother circle
72
78
 
73
79
  const points: Vec[] = []
74
80
  for (let i = 0; i < segments; i++) {
75
81
  const angle = (i / segments) * Math.PI * 2
76
- const x = centerX + Math.cos(angle) * radius
77
- const y = centerY + Math.sin(angle) * radius
82
+ const x = centerX + Math.cos(angle) * clipRadius
83
+ const y = centerY + Math.sin(angle) * clipRadius
78
84
  points.push(new Vec(x, y))
79
85
  }
80
86
 
@@ -112,7 +118,7 @@ export class CircleClipShapeTool extends StateNode {
112
118
 
113
119
  override onPointerDown(info: Parameters<TLEventHandlers['onPointerDown']>[0]) {
114
120
  if (info.target === 'canvas') {
115
- const { originPagePoint } = this.editor.inputs
121
+ const originPagePoint = this.editor.inputs.getOriginPagePoint()
116
122
 
117
123
  this.editor.createShape({
118
124
  type: CIRCLE_CLIP_TYPE,
@@ -233,13 +239,14 @@ describe('CircleClipShapeUtil', () => {
233
239
 
234
240
  // Should be a polygon approximation of a circle
235
241
  // Check that points are roughly in a circle pattern
236
- const centerX = 100 // shape.x
237
- const centerY = 100 // shape.y
238
- const radius = 100 // min(w, h) / 2
242
+ // The clip path is inset by half the stroke width (STROKE_WIDTH / 2 = 1)
243
+ const centerX = 100 // shape.props.w / 2
244
+ const centerY = 100 // shape.props.h / 2
245
+ const clipRadius = 99 // min(w, h) / 2 - STROKE_WIDTH / 2 = 100 - 1
239
246
 
240
247
  clipPath.forEach((point) => {
241
248
  const distance = Math.sqrt(Math.pow(point.x - centerX, 2) + Math.pow(point.y - centerY, 2))
242
- expect(distance).toBeCloseTo(radius, 0)
249
+ expect(distance).toBeCloseTo(clipRadius, 0)
243
250
  })
244
251
  })
245
252
  })
@@ -1,7 +1,8 @@
1
1
  import { TLDrawShape, TLHighlightShape, last } from '@tldraw/editor'
2
2
  import { vi } from 'vitest'
3
- import { TestEditor } from './TestEditor'
4
3
  import { TEST_DRAW_SHAPE_SCREEN_POINTS } from './drawing.data'
4
+ import { base64ToPoints } from './test-jsx'
5
+ import { TestEditor } from './TestEditor'
5
6
 
6
7
  vi.useFakeTimers()
7
8
 
@@ -77,7 +78,7 @@ for (const toolType of ['draw', 'highlight'] as const) {
77
78
  const segment = shape.props.segments[0]
78
79
  expect(segment.type).toBe('straight')
79
80
 
80
- const points = segment.points
81
+ const points = base64ToPoints(segment.points)
81
82
  expect(points.length).toBe(2)
82
83
  })
83
84
 
@@ -176,8 +177,9 @@ for (const toolType of ['draw', 'highlight'] as const) {
176
177
 
177
178
  const shape = editor.getCurrentPageShapes()[0] as DrawableShape
178
179
  const segment = shape.props.segments[0]
179
- expect(segment.points[1].x).toBeCloseTo(snappedX)
180
- expect(segment.points[1].y).toBeCloseTo(snappedY)
180
+ const points = base64ToPoints(segment.points)
181
+ expect(points[1].x).toBeCloseTo(snappedX)
182
+ expect(points[1].y).toBeCloseTo(snappedY)
181
183
  })
182
184
 
183
185
  it('Doesnt snap to 15 degree angle when cmd is held', () => {
@@ -190,8 +192,9 @@ for (const toolType of ['draw', 'highlight'] as const) {
190
192
 
191
193
  const shape = editor.getCurrentPageShapes()[0] as DrawableShape
192
194
  const segment = shape.props.segments[0]
193
- expect(segment.points[1].x).toBeCloseTo(x)
194
- expect(segment.points[1].y).toBeCloseTo(y)
195
+ const points = base64ToPoints(segment.points)
196
+ expect(points[1].x).toBeCloseTo(x)
197
+ expect(points[1].y).toBeCloseTo(y)
195
198
  })
196
199
 
197
200
  it('Snaps to start or end of straight segments in self when shift + cmd is held', () => {
@@ -209,13 +212,15 @@ for (const toolType of ['draw', 'highlight'] as const) {
209
212
 
210
213
  const shape1 = editor.getCurrentPageShapes()[0] as DrawableShape
211
214
  const segment1 = last(shape1.props.segments)!
212
- const point1 = last(segment1.points)!
215
+ const points1 = base64ToPoints(segment1.points)
216
+ const point1 = last(points1)!
213
217
  expect(point1.x).toBe(1)
214
218
 
215
219
  editor.keyDown('Meta')
216
220
  const shape2 = editor.getCurrentPageShapes()[0] as DrawableShape
217
221
  const segment2 = last(shape2.props.segments)!
218
- const point2 = last(segment2.points)!
222
+ const points2 = base64ToPoints(segment2.points)
223
+ const point2 = last(points2)!
219
224
  expect(point2.x).toBe(0)
220
225
  })
221
226
 
@@ -234,13 +239,15 @@ for (const toolType of ['draw', 'highlight'] as const) {
234
239
 
235
240
  const shape1 = editor.getCurrentPageShapes()[0] as DrawableShape
236
241
  const segment1 = last(shape1.props.segments)!
237
- const point1 = last(segment1.points)!
242
+ const points1 = base64ToPoints(segment1.points)
243
+ const point1 = last(points1)!
238
244
  expect(point1.x).toBe(1)
239
245
 
240
246
  editor.keyDown('Meta')
241
247
  const shape2 = editor.getCurrentPageShapes()[0] as DrawableShape
242
248
  const segment2 = last(shape2.props.segments)!
243
- const point2 = last(segment2.points)!
249
+ const points2 = base64ToPoints(segment2.points)
250
+ const point2 = last(points2)!
244
251
  expect(point2.x).toBe(0)
245
252
  })
246
253
 
@@ -637,3 +637,36 @@ it('Updates the image shape flip properties when flipped', () => {
637
637
  editor.flipShapes(editor.getSelectedShapeIds(), 'vertical')
638
638
  expect(editor.getLastCreatedShape<TLImageShape>().props.flipY).toBe(true)
639
639
  })
640
+
641
+ it('Restores flipped shape positions when shape is rotated', () => {
642
+ editor.selectAll().rotateSelection(PI / 2.5)
643
+ const before = editor.getSelectedShapes()
644
+ editor.flipShapes(editor.getSelectedShapeIds(), 'horizontal')
645
+ editor.flipShapes(editor.getSelectedShapeIds(), 'horizontal')
646
+ const after = editor.getSelectedShapes()
647
+ expect(after.length).toBe(before.length)
648
+ for (let i = 0; i < before.length; i++) {
649
+ expect(after[i]).toCloselyMatchObject(before[i])
650
+ }
651
+ })
652
+
653
+ it('Restores flipped shape positions with draw shapes when shape is rotated', () => {
654
+ editor
655
+ .cancel()
656
+ .setCurrentTool('draw')
657
+ .pointerDown(0, 0)
658
+ .pointerMove(-100, -100)
659
+ .pointerMove(0, -100)
660
+ .pointerMove(100, 100)
661
+ .pointerUp()
662
+
663
+ editor.selectAll().rotateSelection(PI / 2.5)
664
+ const before = editor.getSelectedShapes()
665
+ editor.flipShapes(editor.getSelectedShapeIds(), 'horizontal')
666
+ editor.flipShapes(editor.getSelectedShapeIds(), 'horizontal')
667
+ const after = editor.getSelectedShapes()
668
+ expect(after.length).toBe(before.length)
669
+ for (let i = 0; i < before.length; i++) {
670
+ expect(after[i]).toCloselyMatchObject(before[i])
671
+ }
672
+ })
@@ -10,6 +10,7 @@ import {
10
10
  } from '@tldraw/editor'
11
11
  import { vi } from 'vitest'
12
12
  import { getArrowBindings } from '../lib/shapes/arrow/shared'
13
+ import { FrameShapeUtil } from '../lib/shapes/frame/FrameShapeUtil'
13
14
  import { DEFAULT_FRAME_PADDING, fitFrameToContent, removeFrame } from '../lib/utils/frames/frames'
14
15
  import { TestEditor } from './TestEditor'
15
16
 
@@ -639,9 +640,13 @@ describe('frame shapes', () => {
639
640
 
640
641
  editor.setCurrentTool('select')
641
642
 
643
+ // Not with enter key
642
644
  editor.keyDown('Enter')
643
645
  editor.keyUp('Enter')
646
+ expect(editor.getCurrentPageState().editingShapeId).toBe(null)
644
647
 
648
+ // Just with header click (tests against header's geometry)
649
+ editor.click(105, 95)
645
650
  expect(editor.getCurrentPageState().editingShapeId).toBe(frameId)
646
651
  })
647
652
 
@@ -850,6 +855,93 @@ describe('frame shapes', () => {
850
855
  expect(editor.getSortedChildIdsForParent(insideFrameId)).toStrictEqual([rectAId, rectBId])
851
856
  expect(editor.getSortedChildIdsForParent(outsideFrameId)).toStrictEqual([insideFrameId])
852
857
  })
858
+
859
+ describe('resizeChildren configuration option', () => {
860
+ it('has default canResizeChildren behavior as false', () => {
861
+ const frameUtil = editor.getShapeUtil<TLFrameShape>('frame') as FrameShapeUtil
862
+ expect(frameUtil.options.resizeChildren).toBe(false)
863
+ expect(frameUtil.canResizeChildren()).toBe(false)
864
+ })
865
+
866
+ it('can be configured to allow resizing children', () => {
867
+ const ConfiguredFrameShapeUtil = FrameShapeUtil.configure({ resizeChildren: true })
868
+ const configuredFrameUtil = new ConfiguredFrameShapeUtil(editor)
869
+ expect(configuredFrameUtil.options.resizeChildren).toBe(true)
870
+ expect(configuredFrameUtil.canResizeChildren()).toBe(true)
871
+ })
872
+
873
+ it('can be configured to disallow resizing children', () => {
874
+ const ConfiguredFrameShapeUtil = FrameShapeUtil.configure({ resizeChildren: false })
875
+ const configuredFrameUtil = new ConfiguredFrameShapeUtil(editor)
876
+ expect(configuredFrameUtil.options.resizeChildren).toBe(false)
877
+ expect(configuredFrameUtil.canResizeChildren()).toBe(false)
878
+ })
879
+
880
+ it('maintains other options when configuring resizeChildren', () => {
881
+ const ConfiguredFrameShapeUtil = FrameShapeUtil.configure({
882
+ resizeChildren: true,
883
+ showColors: true,
884
+ })
885
+ const configuredFrameUtil = new ConfiguredFrameShapeUtil(editor)
886
+ expect(configuredFrameUtil.options.resizeChildren).toBe(true)
887
+ expect(configuredFrameUtil.options.showColors).toBe(true)
888
+ })
889
+
890
+ it('resizes children when configured with resizeChildren: true', () => {
891
+ // Create a frame with a child shape using a configured frame util
892
+ editor.setCurrentTool('frame')
893
+ editor.pointerDown(100, 100).pointerMove(200, 200).pointerUp(200, 200)
894
+
895
+ const frameId = editor.getOnlySelectedShape()!.id
896
+
897
+ // Add a child shape
898
+ editor.setCurrentTool('geo')
899
+ editor.pointerDown(125, 125).pointerMove(175, 175).pointerUp(175, 175)
900
+
901
+ const childId = editor.getOnlySelectedShape()!.id
902
+
903
+ // Get initial bounds
904
+ const initialChildBounds = editor.getShapePageBounds(childId)!
905
+
906
+ // Create a new editor with configured frame util that allows resizing children
907
+ const configuredEditor = new TestEditor({
908
+ shapeUtils: [FrameShapeUtil.configure({ resizeChildren: true })],
909
+ })
910
+
911
+ // Create the same frame and child in the new editor
912
+ configuredEditor.createShapes([
913
+ { id: frameId, type: 'frame', x: 100, y: 100, props: { w: 100, h: 100 } },
914
+ {
915
+ id: childId,
916
+ type: 'geo',
917
+ parentId: frameId,
918
+ x: 125,
919
+ y: 125,
920
+ props: { w: 50, h: 50 },
921
+ },
922
+ ])
923
+
924
+ // Resize the frame to half size
925
+ configuredEditor.select(frameId)
926
+ configuredEditor.resizeSelection({ scaleX: 0.5, scaleY: 0.5 }, 'bottom_right')
927
+
928
+ // Verify the frame was resized
929
+ const resizedFrameBounds = configuredEditor.getShapePageBounds(frameId)!
930
+ expect(resizedFrameBounds).toCloselyMatchObject({
931
+ x: 100,
932
+ y: 100,
933
+ w: 50,
934
+ h: 50,
935
+ })
936
+
937
+ // Verify the child was also resized
938
+ const resizedChildBounds = configuredEditor.getShapePageBounds(childId)!
939
+ expect(resizedChildBounds.w).toBeCloseTo(initialChildBounds.w * 0.5)
940
+ expect(resizedChildBounds.h).toBeCloseTo(initialChildBounds.h * 0.5)
941
+
942
+ configuredEditor.dispose()
943
+ })
944
+ })
853
945
  })
854
946
 
855
947
  test('arrows bound to a shape within a group within a frame are reparented if the group is moved outside of the frame', () => {
@@ -1560,7 +1560,7 @@ describe('erasing', () => {
1560
1560
  // move to group B
1561
1561
  editor.pointerMove(65, 5)
1562
1562
 
1563
- expect(editor.getErasingShapeIds().length).toBe(2)
1563
+ expect(editor.getErasingShapeIds().length).toBe(3)
1564
1564
  })
1565
1565
  })
1566
1566
 
@@ -13,25 +13,25 @@ it('Shift Key', () => {
13
13
  editor.pointerDown(0, 0)
14
14
  editor.pointerMove(100, 100, { shiftKey: true })
15
15
  editor.pointerMove(100, 100, { shiftKey: false })
16
- expect(editor.inputs.shiftKey).toBe(true)
16
+ expect(editor.inputs.getShiftKey()).toBe(true)
17
17
  vi.advanceTimersByTime(200)
18
- expect(editor.inputs.shiftKey).toBe(false)
18
+ expect(editor.inputs.getShiftKey()).toBe(false)
19
19
  })
20
20
 
21
21
  it('Alt Key', () => {
22
22
  editor.pointerDown(0, 0)
23
23
  editor.pointerMove(100, 100, { altKey: true })
24
24
  editor.pointerMove(100, 100, { altKey: false })
25
- expect(editor.inputs.altKey).toBe(true)
25
+ expect(editor.inputs.getAltKey()).toBe(true)
26
26
  vi.advanceTimersByTime(200)
27
- expect(editor.inputs.altKey).toBe(false)
27
+ expect(editor.inputs.getAltKey()).toBe(false)
28
28
  })
29
29
 
30
30
  it('Ctrl Key', () => {
31
31
  editor.pointerDown(0, 0)
32
32
  editor.pointerMove(100, 100, { ctrlKey: true })
33
33
  editor.pointerMove(100, 100, { ctrlKey: false })
34
- expect(editor.inputs.ctrlKey).toBe(true)
34
+ expect(editor.inputs.getCtrlKey()).toBe(true)
35
35
  vi.advanceTimersByTime(200)
36
- expect(editor.inputs.ctrlKey).toBe(false)
36
+ expect(editor.inputs.getCtrlKey()).toBe(false)
37
37
  })
@@ -20,6 +20,7 @@ import { NoteShapeUtil } from '../lib/shapes/note/NoteShapeUtil'
20
20
  import { TestEditor } from './TestEditor'
21
21
  import { getSnapLines } from './getSnapLines'
22
22
  import { roundedBox } from './roundedBox'
23
+ import { createDrawSegments } from './test-jsx'
23
24
 
24
25
  vi.useFakeTimers()
25
26
 
@@ -904,15 +905,12 @@ describe('When resizing a shape with children', () => {
904
905
  x: 100,
905
906
  y: 100,
906
907
  props: {
907
- segments: [
908
- {
909
- type: 'free',
910
- points: [
911
- { x: 0, y: 0, z: 0.5 },
912
- { x: 100, y: 100, z: 0.5 },
913
- ],
914
- },
915
- ],
908
+ segments: createDrawSegments([
909
+ [
910
+ { x: 0, y: 0, z: 0.5 },
911
+ { x: 100, y: 100, z: 0.5 },
912
+ ],
913
+ ]),
916
914
  },
917
915
  },
918
916
  ])