tldraw 4.3.0-canary.e5f56251a468 → 4.3.0-canary.ea88b223b83a

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 (554) hide show
  1. package/dist-cjs/index.d.ts +297 -237
  2. package/dist-cjs/index.js +13 -5
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +2 -2
  5. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
  6. package/dist-cjs/lib/defaultEmbedDefinitions.js +1 -1
  7. package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
  8. package/dist-cjs/lib/defaultExternalContentHandlers.js +5 -5
  9. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  10. package/dist-cjs/lib/defaultSideEffects.js +6 -1
  11. package/dist-cjs/lib/defaultSideEffects.js.map +2 -2
  12. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +14 -13
  13. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  14. package/dist-cjs/lib/shapes/arrow/arrow-types.js.map +1 -1
  15. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +1 -1
  16. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
  17. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  18. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  19. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js +1 -1
  20. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js.map +2 -2
  21. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +4 -10
  22. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +2 -2
  23. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +7 -4
  24. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  25. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +1 -1
  26. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
  27. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +25 -23
  28. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  29. package/dist-cjs/lib/shapes/draw/getPath.js +20 -11
  30. package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
  31. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +82 -86
  32. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +3 -3
  33. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +6 -0
  34. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
  35. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +6 -5
  36. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  37. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +146 -142
  38. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  39. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +5 -10
  40. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js.map +2 -2
  41. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +3 -3
  42. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
  43. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +23 -21
  44. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  45. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +3 -3
  46. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
  47. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -11
  48. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  49. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +5 -10
  50. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
  51. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +3 -2
  52. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
  53. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +14 -2
  54. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +3 -3
  55. package/dist-cjs/lib/shapes/shared/RichTextLabel.js +12 -4
  56. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +3 -3
  57. package/dist-cjs/lib/shapes/shared/ShapeFill.js +2 -2
  58. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  59. package/dist-cjs/lib/shapes/shared/interpolate-props.js +3 -3
  60. package/dist-cjs/lib/shapes/shared/interpolate-props.js.map +2 -2
  61. package/dist-cjs/lib/shapes/shared/{useForceSolid.js → useEfficientZoomThreshold.js} +10 -7
  62. package/dist-cjs/lib/shapes/shared/useEfficientZoomThreshold.js.map +7 -0
  63. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +1 -1
  64. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  65. package/dist-cjs/lib/shapes/text/RichTextArea.js +5 -0
  66. package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
  67. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +5 -2
  68. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  69. package/dist-cjs/lib/shapes/text/toolStates/Idle.js +4 -10
  70. package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +2 -2
  71. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +7 -5
  72. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
  73. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +1 -1
  74. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +2 -2
  75. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +4 -5
  76. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  77. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +2 -4
  78. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  79. package/dist-cjs/lib/tools/HandTool/HandTool.js +3 -5
  80. package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
  81. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +3 -2
  82. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +2 -2
  83. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js +1 -1
  84. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js.map +2 -2
  85. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js +1 -1
  86. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js.map +2 -2
  87. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +9 -7
  88. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
  89. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +6 -5
  90. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
  91. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js +4 -6
  92. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js.map +2 -2
  93. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +1 -1
  94. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
  95. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +1 -1
  96. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
  97. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js +1 -1
  98. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js.map +2 -2
  99. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js +2 -1
  100. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js.map +2 -2
  101. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js +1 -1
  102. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js.map +2 -2
  103. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +7 -5
  104. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  105. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +38 -11
  106. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
  107. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +42 -50
  108. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  109. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js +6 -6
  110. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
  111. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js +1 -1
  112. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js.map +2 -2
  113. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js +4 -14
  114. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
  115. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +1 -1
  116. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +2 -2
  117. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +1 -1
  118. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +2 -2
  119. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +2 -2
  120. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
  121. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +4 -13
  122. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
  123. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +5 -6
  124. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  125. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +2 -3
  126. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
  127. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +7 -6
  128. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
  129. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +13 -11
  130. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  131. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js +15 -4
  132. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js.map +2 -2
  133. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js +1 -1
  134. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js.map +2 -2
  135. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js +3 -3
  136. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js.map +2 -2
  137. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js +5 -6
  138. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js.map +2 -2
  139. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js +1 -3
  140. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
  141. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js +1 -1
  142. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js.map +2 -2
  143. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js +1 -1
  144. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js.map +2 -2
  145. package/dist-cjs/lib/ui/TldrawUi.js +2 -2
  146. package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
  147. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js +3 -9
  148. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js.map +2 -2
  149. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +1 -3
  150. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
  151. package/dist-cjs/lib/ui/components/CursorChatBubble.js +1 -1
  152. package/dist-cjs/lib/ui/components/CursorChatBubble.js.map +2 -2
  153. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js +1 -21
  154. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js.map +2 -2
  155. package/dist-cjs/lib/ui/components/HelperButtons/StopFollowing.js.map +2 -2
  156. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -1
  157. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
  158. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +2 -15
  159. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js.map +3 -3
  160. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js +3 -1
  161. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js.map +2 -2
  162. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js +6 -0
  163. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js.map +2 -2
  164. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +1 -1
  165. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +2 -2
  166. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js +1 -1
  167. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js.map +2 -2
  168. package/dist-cjs/lib/ui/components/TopPanel/CenteredTopPanelContainer.js.map +1 -1
  169. package/dist-cjs/lib/ui/components/menu-items.js +3 -1
  170. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  171. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +3 -1
  172. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  173. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -1
  174. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  175. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +149 -93
  176. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  177. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.js.map +2 -2
  178. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.js.map +2 -2
  179. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +2 -3
  180. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  181. package/dist-cjs/lib/ui/context/actions.js +6 -6
  182. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  183. package/dist-cjs/lib/ui/context/components.js +1 -2
  184. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  185. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +2 -2
  186. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
  187. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
  188. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
  189. package/dist-cjs/lib/ui/hooks/useTools.js +4 -5
  190. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  191. package/dist-cjs/lib/ui/version.js +3 -3
  192. package/dist-cjs/lib/ui/version.js.map +1 -1
  193. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +8 -6
  194. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  195. package/dist-cjs/lib/{tools/selection-logic/getShouldEnterCropModeOnPointerDown.js → utils/test-helpers.js} +21 -8
  196. package/dist-cjs/lib/utils/test-helpers.js.map +7 -0
  197. package/dist-cjs/lib/utils/text/richText.js +11 -19
  198. package/dist-cjs/lib/utils/text/richText.js.map +3 -3
  199. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +7 -2
  200. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  201. package/dist-esm/index.d.mts +297 -237
  202. package/dist-esm/index.mjs +14 -5
  203. package/dist-esm/index.mjs.map +2 -2
  204. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +2 -2
  205. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
  206. package/dist-esm/lib/defaultEmbedDefinitions.mjs +1 -1
  207. package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
  208. package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -5
  209. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  210. package/dist-esm/lib/defaultSideEffects.mjs +6 -1
  211. package/dist-esm/lib/defaultSideEffects.mjs.map +2 -2
  212. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +15 -15
  213. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  214. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +1 -1
  215. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  216. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  217. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  218. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs +1 -1
  219. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs.map +2 -2
  220. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +4 -10
  221. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +2 -2
  222. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +7 -4
  223. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  224. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +1 -1
  225. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  226. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +30 -25
  227. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  228. package/dist-esm/lib/shapes/draw/getPath.mjs +21 -11
  229. package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
  230. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +83 -86
  231. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +3 -3
  232. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +6 -0
  233. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
  234. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +6 -5
  235. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  236. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +147 -142
  237. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  238. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +5 -10
  239. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs.map +2 -2
  240. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +3 -3
  241. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
  242. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +24 -22
  243. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  244. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +3 -3
  245. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
  246. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -12
  247. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  248. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +5 -10
  249. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
  250. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +4 -3
  251. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
  252. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +14 -2
  253. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  254. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +12 -4
  255. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  256. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +2 -2
  257. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  258. package/dist-esm/lib/shapes/shared/interpolate-props.mjs +4 -4
  259. package/dist-esm/lib/shapes/shared/interpolate-props.mjs.map +2 -2
  260. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs +12 -0
  261. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs.map +7 -0
  262. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +1 -1
  263. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  264. package/dist-esm/lib/shapes/text/RichTextArea.mjs +5 -0
  265. package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
  266. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +5 -2
  267. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  268. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +4 -10
  269. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +2 -2
  270. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +7 -5
  271. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
  272. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +1 -1
  273. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +2 -2
  274. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +4 -5
  275. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  276. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +2 -4
  277. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  278. package/dist-esm/lib/tools/HandTool/HandTool.mjs +3 -5
  279. package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
  280. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +3 -2
  281. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +2 -2
  282. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs +1 -1
  283. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs.map +2 -2
  284. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs +1 -1
  285. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs.map +2 -2
  286. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +9 -7
  287. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
  288. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +6 -5
  289. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
  290. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs +4 -6
  291. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs.map +2 -2
  292. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +1 -1
  293. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
  294. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +1 -1
  295. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
  296. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs +1 -1
  297. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs.map +2 -2
  298. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs +2 -1
  299. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs.map +2 -2
  300. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs +1 -1
  301. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs.map +2 -2
  302. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +7 -5
  303. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  304. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +38 -11
  305. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
  306. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +43 -51
  307. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  308. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs +6 -6
  309. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
  310. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs +1 -1
  311. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs.map +2 -2
  312. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +5 -15
  313. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
  314. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +1 -1
  315. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +2 -2
  316. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +1 -1
  317. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +2 -2
  318. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +2 -2
  319. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
  320. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +4 -13
  321. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
  322. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +5 -6
  323. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  324. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +2 -3
  325. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
  326. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +7 -6
  327. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
  328. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +13 -11
  329. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  330. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs +17 -4
  331. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs.map +2 -2
  332. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs +1 -1
  333. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs.map +2 -2
  334. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs +3 -3
  335. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs.map +2 -2
  336. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs +5 -6
  337. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs.map +2 -2
  338. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs +1 -3
  339. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
  340. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs +1 -1
  341. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs.map +2 -2
  342. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs +1 -1
  343. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs.map +2 -2
  344. package/dist-esm/lib/ui/TldrawUi.mjs +2 -2
  345. package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
  346. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs +2 -8
  347. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs.map +2 -2
  348. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +1 -3
  349. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
  350. package/dist-esm/lib/ui/components/CursorChatBubble.mjs +1 -1
  351. package/dist-esm/lib/ui/components/CursorChatBubble.mjs.map +2 -2
  352. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs +3 -30
  353. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs.map +2 -2
  354. package/dist-esm/lib/ui/components/HelperButtons/StopFollowing.mjs.map +2 -2
  355. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +1 -1
  356. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
  357. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs +3 -6
  358. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs.map +2 -2
  359. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs +3 -1
  360. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs.map +2 -2
  361. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs +6 -0
  362. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs.map +2 -2
  363. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +1 -1
  364. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +2 -2
  365. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs +1 -1
  366. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs.map +2 -2
  367. package/dist-esm/lib/ui/components/TopPanel/CenteredTopPanelContainer.mjs.map +1 -1
  368. package/dist-esm/lib/ui/components/menu-items.mjs +3 -1
  369. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  370. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +3 -1
  371. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  372. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +2 -2
  373. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  374. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +157 -95
  375. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  376. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.mjs.map +2 -2
  377. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.mjs.map +2 -2
  378. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +3 -4
  379. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  380. package/dist-esm/lib/ui/context/actions.mjs +6 -6
  381. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  382. package/dist-esm/lib/ui/context/components.mjs +1 -2
  383. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  384. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +2 -2
  385. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
  386. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
  387. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
  388. package/dist-esm/lib/ui/hooks/useTools.mjs +4 -5
  389. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  390. package/dist-esm/lib/ui/version.mjs +3 -3
  391. package/dist-esm/lib/ui/version.mjs.map +1 -1
  392. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +9 -6
  393. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  394. package/dist-esm/lib/utils/test-helpers.mjs +21 -0
  395. package/dist-esm/lib/utils/test-helpers.mjs.map +7 -0
  396. package/dist-esm/lib/utils/text/richText.mjs +8 -5
  397. package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
  398. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +8 -2
  399. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  400. package/package.json +18 -16
  401. package/src/index.ts +6 -2
  402. package/src/lib/Tldraw.test.tsx +46 -1
  403. package/src/lib/canvas/TldrawSelectionForeground.tsx +2 -2
  404. package/src/lib/defaultEmbedDefinitions.ts +2 -1
  405. package/src/lib/defaultExternalContentHandlers.ts +10 -10
  406. package/src/lib/defaultSideEffects.ts +6 -1
  407. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +40 -133
  408. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +8 -8
  409. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +15 -15
  410. package/src/lib/shapes/arrow/arrow-types.ts +2 -0
  411. package/src/lib/shapes/arrow/arrowLabel.ts +1 -1
  412. package/src/lib/shapes/arrow/arrowTargetState.ts +1 -1
  413. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.test.ts +80 -0
  414. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.tsx +1 -1
  415. package/src/lib/shapes/arrow/toolStates/Idle.tsx +4 -14
  416. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +7 -4
  417. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +1 -1
  418. package/src/lib/shapes/draw/DrawShapeUtil.test.ts +146 -0
  419. package/src/lib/shapes/draw/DrawShapeUtil.tsx +31 -27
  420. package/src/lib/shapes/draw/getPath.ts +31 -10
  421. package/src/lib/shapes/draw/toolStates/Drawing.ts +96 -86
  422. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +7 -0
  423. package/src/lib/shapes/frame/FrameShapeUtil.tsx +10 -4
  424. package/src/lib/shapes/geo/GeoShapeUtil.tsx +228 -176
  425. package/src/lib/shapes/geo/toolStates/Idle.ts +5 -15
  426. package/src/lib/shapes/geo/toolStates/Pointing.ts +3 -3
  427. package/src/lib/shapes/highlight/HighlightShapeUtil.test.ts +146 -0
  428. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +25 -24
  429. package/src/lib/shapes/line/toolStates/Pointing.ts +3 -3
  430. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -10
  431. package/src/lib/shapes/note/noteCloning.test.ts +3 -1
  432. package/src/lib/shapes/note/toolStates/Pointing.ts +5 -10
  433. package/src/lib/shapes/shared/HyperlinkButton.tsx +4 -3
  434. package/src/lib/shapes/shared/PlainTextLabel.tsx +10 -1
  435. package/src/lib/shapes/shared/RichTextLabel.tsx +12 -3
  436. package/src/lib/shapes/shared/ShapeFill.tsx +2 -2
  437. package/src/lib/shapes/shared/interpolate-props.ts +4 -4
  438. package/src/lib/shapes/shared/useEfficientZoomThreshold.ts +10 -0
  439. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +1 -1
  440. package/src/lib/shapes/text/RichTextArea.tsx +5 -0
  441. package/src/lib/shapes/text/TextShapeUtil.tsx +5 -0
  442. package/src/lib/shapes/text/toolStates/Idle.ts +4 -14
  443. package/src/lib/shapes/text/toolStates/Pointing.ts +7 -7
  444. package/src/lib/shapes/video/VideoShapeUtil.tsx +2 -1
  445. package/src/lib/tools/EraserTool/childStates/Erasing.ts +4 -5
  446. package/src/lib/tools/EraserTool/childStates/Pointing.ts +2 -4
  447. package/src/lib/tools/HandTool/HandTool.ts +3 -5
  448. package/src/lib/tools/HandTool/childStates/Dragging.ts +3 -2
  449. package/src/lib/tools/HandTool/childStates/Pointing.ts +1 -1
  450. package/src/lib/tools/LaserTool/childStates/Lasering.ts +1 -1
  451. package/src/lib/tools/SelectTool/DragAndDropManager.ts +12 -7
  452. package/src/lib/tools/SelectTool/childStates/Brushing.ts +6 -5
  453. package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +7 -6
  454. package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +1 -1
  455. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +1 -1
  456. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.ts +1 -1
  457. package/src/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.ts +2 -1
  458. package/src/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.ts +1 -1
  459. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +7 -5
  460. package/src/lib/tools/SelectTool/childStates/EditingShape.ts +55 -12
  461. package/src/lib/tools/SelectTool/childStates/Idle.ts +58 -71
  462. package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +6 -7
  463. package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +1 -1
  464. package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +5 -5
  465. package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +1 -1
  466. package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +1 -1
  467. package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +2 -2
  468. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +4 -14
  469. package/src/lib/tools/SelectTool/childStates/Resizing.ts +6 -6
  470. package/src/lib/tools/SelectTool/childStates/Rotating.ts +2 -3
  471. package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +7 -6
  472. package/src/lib/tools/SelectTool/childStates/Translating.ts +15 -12
  473. package/src/lib/tools/SelectTool/selectHelpers.ts +39 -4
  474. package/src/lib/tools/ZoomTool/ZoomTool.ts +1 -1
  475. package/src/lib/tools/ZoomTool/childStates/Pointing.ts +3 -3
  476. package/src/lib/tools/ZoomTool/childStates/ZoomBrushing.ts +5 -6
  477. package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -3
  478. package/src/lib/tools/selection-logic/selectOnCanvasPointerUp.ts +1 -1
  479. package/src/lib/tools/selection-logic/updateHoveredShapeId.ts +1 -1
  480. package/src/lib/ui/TldrawUi.tsx +5 -2
  481. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.tsx +1 -9
  482. package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +1 -3
  483. package/src/lib/ui/components/CursorChatBubble.tsx +2 -2
  484. package/src/lib/ui/components/DefaultDebugPanel.tsx +3 -42
  485. package/src/lib/ui/components/HelperButtons/StopFollowing.tsx +2 -2
  486. package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +1 -1
  487. package/src/lib/ui/components/OfflineIndicator/OfflineIndicator.tsx +6 -5
  488. package/src/lib/ui/components/PageMenu/PageItemInput.tsx +3 -1
  489. package/src/lib/ui/components/SharePanel/PeopleMenu.tsx +8 -0
  490. package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +1 -1
  491. package/src/lib/ui/components/Toolbar/DefaultRichTextToolbar.tsx +1 -1
  492. package/src/lib/ui/components/TopPanel/CenteredTopPanelContainer.tsx +1 -1
  493. package/src/lib/ui/components/menu-items.tsx +3 -1
  494. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +5 -3
  495. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +2 -2
  496. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +208 -113
  497. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.tsx +1 -1
  498. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.tsx +1 -1
  499. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +2 -3
  500. package/src/lib/ui/context/actions.tsx +6 -6
  501. package/src/lib/ui/context/components.tsx +1 -2
  502. package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
  503. package/src/lib/ui/hooks/useKeyboardShortcuts.ts +2 -2
  504. package/src/lib/ui/hooks/useTools.tsx +4 -5
  505. package/src/lib/ui/version.ts +3 -3
  506. package/src/lib/ui.css +27 -23
  507. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +12 -48
  508. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +11 -6
  509. package/src/lib/utils/test-helpers.ts +60 -0
  510. package/src/lib/utils/text/richText.ts +9 -8
  511. package/src/lib/utils/tldr/buildFromV1Document.ts +9 -2
  512. package/src/test/Editor.test.tsx +40 -29
  513. package/src/test/EraserTool.test.ts +10 -12
  514. package/src/test/TestEditor.ts +48 -47
  515. package/src/test/TldrawEditor.test.tsx +6 -4
  516. package/src/test/__snapshots__/drawing.test.ts.snap +3 -1257
  517. package/src/test/__snapshots__/resizing.test.ts.snap +3 -12
  518. package/src/test/arrows-megabus.test.tsx +1 -1
  519. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +10 -10
  520. package/src/test/commands/cameraState.test.ts +299 -0
  521. package/src/test/commands/putContent.test.ts +79 -1
  522. package/src/test/commands/setCamera.test.ts +13 -11
  523. package/src/test/commands/stackShapes.test.ts +34 -8
  524. package/src/test/commands/zoomToBounds.test.ts +19 -3
  525. package/src/test/commands/zoomToSelection.test.ts +14 -3
  526. package/src/test/custom-clipping.test.ts +16 -9
  527. package/src/test/drawing.test.ts +17 -10
  528. package/src/test/flipShapes.test.ts +33 -0
  529. package/src/test/frames.test.ts +92 -0
  530. package/src/test/groups.test.tsx +1 -1
  531. package/src/test/modifiers.test.ts +6 -6
  532. package/src/test/resizing.test.ts +7 -9
  533. package/src/test/selection-omnibus.test.ts +2 -2
  534. package/src/test/spacebarPanning.test.ts +28 -10
  535. package/src/test/test-jsx.tsx +3 -0
  536. package/tldraw.css +41 -35
  537. package/dist-cjs/lib/shapes/shared/useForceSolid.js.map +0 -7
  538. package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +0 -7
  539. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js +0 -32
  540. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js.map +0 -7
  541. package/dist-cjs/lib/utils/text/textDirection.js +0 -51
  542. package/dist-cjs/lib/utils/text/textDirection.js.map +0 -7
  543. package/dist-esm/lib/shapes/shared/useForceSolid.mjs +0 -9
  544. package/dist-esm/lib/shapes/shared/useForceSolid.mjs.map +0 -7
  545. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +0 -8
  546. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +0 -7
  547. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs +0 -12
  548. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs.map +0 -7
  549. package/dist-esm/lib/utils/text/textDirection.mjs +0 -31
  550. package/dist-esm/lib/utils/text/textDirection.mjs.map +0 -7
  551. package/src/lib/shapes/shared/useForceSolid.ts +0 -6
  552. package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +0 -10
  553. package/src/lib/ui/components/TopPanel/DefaultTopPanel.tsx +0 -10
  554. package/src/lib/utils/text/textDirection.ts +0 -32
@@ -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
  ])
@@ -2194,7 +2194,7 @@ describe('long press', () => {
2194
2194
  it('works correctly with screenbounds offset', () => {
2195
2195
  editor.updateViewportScreenBounds(new Box(100, 100, 800, 600))
2196
2196
  editor.pointerDown(201, 202)
2197
- expect(editor.inputs.currentScreenPoint).toMatchObject({ x: 101, y: 102 })
2197
+ expect(editor.inputs.getCurrentScreenPoint()).toMatchObject({ x: 101, y: 102 })
2198
2198
  })
2199
2199
 
2200
2200
  it('works correctly with screenbounds offset', () => {
@@ -2202,7 +2202,7 @@ describe('long press', () => {
2202
2202
  editor.pointerDown(201, 202)
2203
2203
  vi.advanceTimersByTime(1000)
2204
2204
  // without the fix added in this PR, it would have been 1, 2
2205
- expect(editor.inputs.currentScreenPoint).toMatchObject({ x: 101, y: 102 })
2205
+ expect(editor.inputs.getCurrentScreenPoint()).toMatchObject({ x: 101, y: 102 })
2206
2206
  })
2207
2207
  })
2208
2208
 
@@ -16,16 +16,16 @@ beforeEach(() => {
16
16
 
17
17
  it('Sets cursor and state correctly', () => {
18
18
  expect(editor.getInstanceState().cursor.type).toBe('default')
19
- expect(editor.inputs.isPanning).toBe(false)
19
+ expect(editor.inputs.getIsPanning()).toBe(false)
20
20
  editor.keyDown(' ')
21
- expect(editor.inputs.isPanning).toBe(true)
21
+ expect(editor.inputs.getIsPanning()).toBe(true)
22
22
  expect(editor.getInstanceState().cursor.type).toBe('grab')
23
23
  editor.pointerDown(0, 0)
24
24
  expect(editor.getInstanceState().cursor.type).toBe('grabbing')
25
25
  editor.pointerUp(0, 0)
26
26
  expect(editor.getInstanceState().cursor.type).toBe('grab')
27
27
  editor.keyUp(' ')
28
- expect(editor.inputs.isPanning).toBe(false)
28
+ expect(editor.inputs.getIsPanning()).toBe(false)
29
29
  expect(editor.getInstanceState().cursor.type).toBe('default')
30
30
  })
31
31
 
@@ -37,16 +37,34 @@ it('When holding spacebar and clicking and dragging, it pans the camera', () =>
37
37
  editor.keyUp(' ')
38
38
  })
39
39
 
40
- it('When holding spacebar, it updates cursor and does not send events to the state or change statecharts current active state', () => {
41
- editor.pointerDown(150, 150, { target: 'canvas' })
42
- editor.pointerMove(100, 100)
43
- editor.expectShapeToMatch({ id: ids.box1, x: 50, y: 50 })
40
+ it('When spacebar is held during pointer interaction, it activates panning', () => {
41
+ // This test verifies that holding spacebar prevents pointer events from
42
+ // being sent to the state chart, and instead activates panning mode.
43
+ editor.select(ids.box1)
44
+
45
+ // Start with pointer down on the shape
46
+ editor.pointerDown(150, 150, ids.box1)
44
47
 
48
+ // Hold spacebar before moving - should activate panning
45
49
  editor.keyDown(' ')
46
- editor.pointerMove(200, 200)
47
- editor.expectCameraToBe(100, 100, 1)
48
- editor.expectShapeToMatch({ id: ids.box1, x: 50, y: 50 })
50
+ expect(editor.inputs.getIsPanning()).toBe(true)
51
+ expect(editor.getInstanceState().cursor.type).toBe('grabbing') // 'grabbing' because pointer is down
52
+
53
+ // Moving the pointer should pan the camera, not translate the shape
54
+ const initialCamera = editor.getCamera()
55
+ editor.pointerMove(100, 100)
56
+
57
+ // Camera should have moved (panning)
58
+ const newCamera = editor.getCamera()
59
+ expect(newCamera.x).not.toBe(initialCamera.x)
60
+ expect(newCamera.y).not.toBe(initialCamera.y)
61
+
62
+ // Shape should not have moved (not translating)
63
+ editor.expectShapeToMatch({ id: ids.box1, x: 100, y: 100 })
64
+
65
+ editor.pointerUp()
49
66
  editor.keyUp(' ')
67
+ expect(editor.inputs.getIsPanning()).toBe(false)
50
68
  })
51
69
 
52
70
  it('When holding spacebar, pressing the arrow keys moves over by one viewport', () => {
@@ -19,6 +19,9 @@ import {
19
19
  } from '@tldraw/editor'
20
20
  import React, { Fragment } from 'react'
21
21
 
22
+ // Re-export test helpers from their new location
23
+ export { base64ToPoints, createDrawSegments, pointsToBase64 } from '../lib/utils/test-helpers'
24
+
22
25
  const shapeTypeSymbol = Symbol('shapeJsx')
23
26
  const assetTypeSymbol = Symbol('assetJsx')
24
27
  const bindingTypeSymbol = Symbol('bindingJsx')
package/tldraw.css CHANGED
@@ -611,7 +611,6 @@ input,
611
611
  pointer-events: all;
612
612
  white-space: pre-wrap;
613
613
  overflow-wrap: break-word;
614
- text-shadow: var(--tl-text-outline);
615
614
  }
616
615
 
617
616
  .tl-text-wrapper[data-font='draw'] {
@@ -713,7 +712,7 @@ input,
713
712
  resize: none;
714
713
  border: none;
715
714
  user-select: none;
716
- contain: style paint;
715
+ contain: layout style paint;
717
716
  /* N.B. This property, while discouraged ("intended for Document Type Definition (DTD) designers") is necessary for ensuring correct mixed RTL/LTR behavior when exporting SVGs. */
718
717
  unicode-bidi: plaintext;
719
718
  -webkit-user-select: none;
@@ -774,7 +773,6 @@ input,
774
773
  justify-content: center;
775
774
  align-items: center;
776
775
  color: var(--tl-color-text);
777
- text-shadow: var(--tl-text-outline);
778
776
  line-height: inherit;
779
777
  position: absolute;
780
778
  inset: 0px;
@@ -974,6 +972,14 @@ input,
974
972
  display: block;
975
973
  }
976
974
 
975
+ .tl-text__outline {
976
+ text-shadow: var(--tl-text-outline);
977
+ }
978
+
979
+ .tl-text__no-outline {
980
+ text-shadow: none;
981
+ }
982
+
977
983
  /* --------------------- Loading -------------------- */
978
984
 
979
985
  .tl-loading {
@@ -1138,14 +1144,12 @@ input,
1138
1144
  fill: none;
1139
1145
  }
1140
1146
 
1141
- @media (pointer: coarse) {
1142
- .tl-handle__bg:active {
1143
- fill: var(--tl-color-selection-fill);
1144
- }
1147
+ .tl-container[data-coarse='true'] .tl-handle__bg:active {
1148
+ fill: var(--tl-color-selection-fill);
1149
+ }
1145
1150
 
1146
- .tl-handle__create {
1147
- opacity: 1;
1148
- }
1151
+ .tl-container[data-coarse='true'] .tl-handle__create {
1152
+ opacity: 1;
1149
1153
  }
1150
1154
 
1151
1155
  .tl-rotate-corner:not(:hover),
@@ -1221,7 +1225,6 @@ input,
1221
1225
  align-items: center;
1222
1226
  text-align: center;
1223
1227
  color: var(--tl-color-text);
1224
- text-shadow: var(--tl-text-outline);
1225
1228
  }
1226
1229
 
1227
1230
  .tl-shape[data-shape-type='arrow'] .tl-text-label__inner {
@@ -1450,7 +1453,6 @@ input,
1450
1453
  }
1451
1454
 
1452
1455
  .tl-note__container > .tl-text-label {
1453
- text-shadow: none;
1454
1456
  color: currentColor;
1455
1457
  }
1456
1458
 
@@ -2410,25 +2412,31 @@ it from receiving any pointer events or affecting the cursor. */
2410
2412
 
2411
2413
  /* Submenu triggers */
2412
2414
 
2413
- .tlui-menu__submenu__trigger[data-state='open']::after {
2414
- opacity: 1;
2415
- background: linear-gradient(90deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
2415
+ .tlui-menu__submenu__trigger {
2416
+ --gradient-angle: 90deg;
2417
+ }
2418
+
2419
+ .tlui-menu__submenu__trigger[data-direction='left'] {
2420
+ --gradient-angle: 270deg;
2416
2421
  }
2417
2422
 
2418
- .tlui-menu__submenu__trigger[data-direction='left'][data-state='open']::after {
2423
+ .tlui-menu__submenu__trigger[data-state='open']::after {
2419
2424
  opacity: 1;
2420
- background: linear-gradient(270deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
2425
+ background: linear-gradient(
2426
+ var(--gradient-angle),
2427
+ rgba(144, 144, 144, 0) 0%,
2428
+ var(--tl-color-muted-2) 100%
2429
+ );
2421
2430
  }
2422
2431
 
2423
2432
  @media (hover: hover) {
2424
- .tlui-menu__submenu__trigger[data-state='open']:not(:hover)::after {
2433
+ .tlui-menu__submenu__trigger:is(:hover, [data-state='open'])::after {
2425
2434
  opacity: 1;
2426
- background: linear-gradient(90deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
2427
- }
2428
-
2429
- .tlui-menu__submenu__trigger[data-direction='left'][data-state='open']:not(:hover)::after {
2430
- opacity: 1;
2431
- background: linear-gradient(270deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
2435
+ background: linear-gradient(
2436
+ var(--gradient-angle),
2437
+ rgba(144, 144, 144, 0) 0%,
2438
+ var(--tl-color-muted-2) 100%
2439
+ );
2432
2440
  }
2433
2441
  }
2434
2442
 
@@ -2707,10 +2715,8 @@ it from receiving any pointer events or affecting the cursor. */
2707
2715
  }
2708
2716
  }
2709
2717
 
2710
- @media (any-pointer: coarse) {
2711
- .tlui-page_menu__item__submenu > .tlui-button {
2712
- opacity: 1;
2713
- }
2718
+ .tl-container[data-coarse='true'] .tlui-page_menu__item__submenu > .tlui-button {
2719
+ opacity: 1;
2714
2720
  }
2715
2721
 
2716
2722
  .tlui-button__icon {
@@ -2749,16 +2755,15 @@ it from receiving any pointer events or affecting the cursor. */
2749
2755
 
2750
2756
  .tlui-offline-indicator {
2751
2757
  display: flex;
2752
- flex-direction: row;
2753
- gap: var(--tl-space-3);
2754
- color: var(--tl-color-text);
2755
- background-color: var(--tl-color-low);
2756
- border: 3px solid var(--tl-color-background);
2757
- padding: 0px var(--tl-space-5);
2758
- height: 42px;
2758
+ color: var(--tl-color-background);
2759
+ background-color: var(--tl-color-text);
2760
+ border: none;
2761
+ width: 32px;
2762
+ height: 32px;
2759
2763
  align-items: center;
2760
2764
  justify-content: center;
2761
2765
  border-radius: 99px;
2766
+ cursor: default;
2762
2767
  opacity: 0;
2763
2768
  animation: tl-fade-in;
2764
2769
  animation-duration: 0.12s;
@@ -3076,6 +3081,7 @@ tldraw? probably.
3076
3081
  position: relative;
3077
3082
  background: var(--tl-color-panel);
3078
3083
  box-shadow: var(--tl-shadow-2);
3084
+ contain: layout style paint;
3079
3085
  }
3080
3086
 
3081
3087
  .tlui-main-toolbar--horizontal .tlui-main-toolbar__mobile-style-panel {
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/lib/shapes/shared/useForceSolid.ts"],
4
- "sourcesContent": ["import { useEditor, useValue } from '@tldraw/editor'\n\nexport function useForceSolid() {\n\tconst editor = useEditor()\n\treturn useValue('zoom', () => editor.getZoomLevel() < 0.35, [editor])\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAoC;AAE7B,SAAS,gBAAgB;AAC/B,QAAM,aAAS,yBAAU;AACzB,aAAO,wBAAS,QAAQ,MAAM,OAAO,aAAa,IAAI,MAAM,CAAC,MAAM,CAAC;AACrE;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts"],
4
- "sourcesContent": ["import { Editor } from '@tldraw/editor'\n\nexport function getShouldEnterCropMode(editor: Editor): boolean {\n\tconst onlySelectedShape = editor.getOnlySelectedShape()\n\treturn !!(\n\t\tonlySelectedShape &&\n\t\t!editor.isShapeOrAncestorLocked(onlySelectedShape) &&\n\t\teditor.getShapeUtil(onlySelectedShape).canCrop(onlySelectedShape)\n\t)\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,SAAS,uBAAuB,QAAyB;AAC/D,QAAM,oBAAoB,OAAO,qBAAqB;AACtD,SAAO,CAAC,EACP,qBACA,CAAC,OAAO,wBAAwB,iBAAiB,KACjD,OAAO,aAAa,iBAAiB,EAAE,QAAQ,iBAAiB;AAElE;",
6
- "names": []
7
- }
@@ -1,32 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var DefaultTopPanel_exports = {};
20
- __export(DefaultTopPanel_exports, {
21
- DefaultTopPanel: () => DefaultTopPanel
22
- });
23
- module.exports = __toCommonJS(DefaultTopPanel_exports);
24
- var import_jsx_runtime = require("react/jsx-runtime");
25
- var import_useCollaborationStatus = require("../../hooks/useCollaborationStatus");
26
- var import_OfflineIndicator = require("../OfflineIndicator/OfflineIndicator");
27
- var import_CenteredTopPanelContainer = require("./CenteredTopPanelContainer");
28
- function DefaultTopPanel() {
29
- const isOffline = (0, import_useCollaborationStatus.useCollaborationStatus)() === "offline";
30
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_CenteredTopPanelContainer.CenteredTopPanelContainer, { children: isOffline && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_OfflineIndicator.OfflineIndicator, {}) });
31
- }
32
- //# sourceMappingURL=DefaultTopPanel.js.map