tldraw 4.2.0 → 4.2.2

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 (629) hide show
  1. package/dist-cjs/index.d.ts +311 -242
  2. package/dist-cjs/index.js +13 -5
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/bindings/arrow/ArrowBindingUtil.js.map +2 -2
  5. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +7 -4
  6. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
  7. package/dist-cjs/lib/defaultEmbedDefinitions.js +1 -1
  8. package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
  9. package/dist-cjs/lib/defaultExternalContentHandlers.js +5 -5
  10. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  11. package/dist-cjs/lib/defaultSideEffects.js +6 -1
  12. package/dist-cjs/lib/defaultSideEffects.js.map +2 -2
  13. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +14 -13
  14. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  15. package/dist-cjs/lib/shapes/arrow/arrow-types.js.map +1 -1
  16. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +1 -1
  17. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
  18. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  19. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  20. package/dist-cjs/lib/shapes/arrow/elbow/elbowArrowSnapLines.js.map +2 -2
  21. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js +1 -1
  22. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js.map +2 -2
  23. package/dist-cjs/lib/shapes/arrow/shared.js.map +2 -2
  24. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +4 -10
  25. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +2 -2
  26. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +7 -4
  27. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  28. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +1 -1
  29. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
  30. package/dist-cjs/lib/shapes/bookmark/bookmarks.js.map +2 -2
  31. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +24 -22
  32. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  33. package/dist-cjs/lib/shapes/draw/getPath.js +20 -11
  34. package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
  35. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +82 -86
  36. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +3 -3
  37. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +6 -0
  38. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
  39. package/dist-cjs/lib/shapes/frame/FrameShapeTool.js.map +1 -1
  40. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +6 -5
  41. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  42. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +146 -142
  43. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  44. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +5 -10
  45. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js.map +2 -2
  46. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +3 -3
  47. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
  48. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +23 -21
  49. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  50. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +3 -3
  51. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
  52. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -11
  53. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  54. package/dist-cjs/lib/shapes/note/noteHelpers.js.map +2 -2
  55. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +5 -10
  56. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
  57. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +3 -2
  58. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
  59. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +14 -2
  60. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +3 -3
  61. package/dist-cjs/lib/shapes/shared/RichTextLabel.js +12 -4
  62. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +3 -3
  63. package/dist-cjs/lib/shapes/shared/ShapeFill.js +2 -2
  64. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  65. package/dist-cjs/lib/shapes/shared/crop.js +1 -0
  66. package/dist-cjs/lib/shapes/shared/crop.js.map +2 -2
  67. package/dist-cjs/lib/shapes/shared/interpolate-props.js +3 -3
  68. package/dist-cjs/lib/shapes/shared/interpolate-props.js.map +2 -2
  69. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  70. package/dist-cjs/lib/shapes/shared/useEditableRichText.js.map +2 -2
  71. package/dist-cjs/lib/shapes/shared/{useForceSolid.js → useEfficientZoomThreshold.js} +10 -7
  72. package/dist-cjs/lib/shapes/shared/useEfficientZoomThreshold.js.map +7 -0
  73. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +1 -1
  74. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  75. package/dist-cjs/lib/shapes/text/RichTextArea.js +5 -0
  76. package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
  77. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +5 -2
  78. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  79. package/dist-cjs/lib/shapes/text/toolStates/Idle.js +4 -10
  80. package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +2 -2
  81. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +7 -5
  82. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
  83. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +1 -1
  84. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +2 -2
  85. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +4 -5
  86. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  87. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +2 -4
  88. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  89. package/dist-cjs/lib/tools/HandTool/HandTool.js +3 -5
  90. package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
  91. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +3 -2
  92. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +2 -2
  93. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js +1 -1
  94. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js.map +2 -2
  95. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js +1 -1
  96. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js.map +2 -2
  97. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +10 -11
  98. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
  99. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +6 -5
  100. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
  101. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js +4 -6
  102. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js.map +2 -2
  103. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +1 -1
  104. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
  105. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +1 -1
  106. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
  107. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js +1 -1
  108. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js.map +2 -2
  109. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js +2 -1
  110. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js.map +2 -2
  111. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js +1 -1
  112. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js.map +2 -2
  113. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +8 -6
  114. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  115. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +38 -11
  116. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
  117. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +42 -50
  118. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  119. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js +6 -6
  120. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
  121. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js +1 -1
  122. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js.map +2 -2
  123. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js +4 -14
  124. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
  125. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +1 -1
  126. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +2 -2
  127. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +1 -1
  128. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +2 -2
  129. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +2 -2
  130. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
  131. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +4 -13
  132. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
  133. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +5 -6
  134. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  135. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +2 -3
  136. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
  137. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +7 -6
  138. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
  139. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +13 -11
  140. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  141. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js +15 -4
  142. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js.map +2 -2
  143. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js +1 -1
  144. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js.map +2 -2
  145. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js +3 -3
  146. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js.map +2 -2
  147. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js +5 -6
  148. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js.map +2 -2
  149. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js +1 -3
  150. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
  151. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js +1 -1
  152. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js.map +2 -2
  153. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js +1 -1
  154. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js.map +2 -2
  155. package/dist-cjs/lib/ui/TldrawUi.js +2 -2
  156. package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
  157. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js +3 -9
  158. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js.map +2 -2
  159. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +1 -3
  160. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
  161. package/dist-cjs/lib/ui/components/CursorChatBubble.js +1 -1
  162. package/dist-cjs/lib/ui/components/CursorChatBubble.js.map +2 -2
  163. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js +1 -21
  164. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js.map +2 -2
  165. package/dist-cjs/lib/ui/components/EditLinkDialog.js +11 -1
  166. package/dist-cjs/lib/ui/components/EditLinkDialog.js.map +2 -2
  167. package/dist-cjs/lib/ui/components/HelperButtons/StopFollowing.js.map +2 -2
  168. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -1
  169. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
  170. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +2 -15
  171. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js.map +3 -3
  172. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js +3 -1
  173. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js.map +2 -2
  174. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js +6 -0
  175. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js.map +2 -2
  176. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  177. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +1 -1
  178. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +2 -2
  179. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js +1 -1
  180. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js.map +2 -2
  181. package/dist-cjs/lib/ui/components/TopPanel/CenteredTopPanelContainer.js.map +1 -1
  182. package/dist-cjs/lib/ui/components/menu-items.js +3 -1
  183. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  184. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +3 -1
  185. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  186. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -1
  187. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  188. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +149 -93
  189. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  190. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.js.map +2 -2
  191. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.js.map +2 -2
  192. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +1 -1
  193. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  194. package/dist-cjs/lib/ui/context/actions.js +7 -8
  195. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  196. package/dist-cjs/lib/ui/context/components.js +1 -2
  197. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  198. package/dist-cjs/lib/ui/hooks/menu-hooks.js.map +2 -2
  199. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +2 -2
  200. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
  201. package/dist-cjs/lib/ui/hooks/useFlatten.js.map +2 -2
  202. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
  203. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
  204. package/dist-cjs/lib/ui/hooks/useTools.js +4 -5
  205. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  206. package/dist-cjs/lib/ui/version.js +3 -3
  207. package/dist-cjs/lib/ui/version.js.map +1 -1
  208. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +16 -6
  209. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  210. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  211. package/dist-cjs/lib/utils/frames/frames.js.map +2 -2
  212. package/dist-cjs/lib/{tools/selection-logic/getShouldEnterCropModeOnPointerDown.js → utils/test-helpers.js} +21 -8
  213. package/dist-cjs/lib/utils/test-helpers.js.map +7 -0
  214. package/dist-cjs/lib/utils/text/richText.js +11 -19
  215. package/dist-cjs/lib/utils/text/richText.js.map +3 -3
  216. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +7 -2
  217. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  218. package/dist-esm/index.d.mts +311 -242
  219. package/dist-esm/index.mjs +14 -5
  220. package/dist-esm/index.mjs.map +2 -2
  221. package/dist-esm/lib/bindings/arrow/ArrowBindingUtil.mjs.map +2 -2
  222. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +8 -4
  223. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
  224. package/dist-esm/lib/defaultEmbedDefinitions.mjs +1 -1
  225. package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
  226. package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -5
  227. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  228. package/dist-esm/lib/defaultSideEffects.mjs +6 -1
  229. package/dist-esm/lib/defaultSideEffects.mjs.map +2 -2
  230. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +15 -15
  231. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  232. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +1 -1
  233. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  234. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  235. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  236. package/dist-esm/lib/shapes/arrow/elbow/elbowArrowSnapLines.mjs.map +2 -2
  237. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs +1 -1
  238. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs.map +2 -2
  239. package/dist-esm/lib/shapes/arrow/shared.mjs.map +2 -2
  240. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +4 -10
  241. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +2 -2
  242. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +7 -4
  243. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  244. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +1 -1
  245. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  246. package/dist-esm/lib/shapes/bookmark/bookmarks.mjs.map +2 -2
  247. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +29 -24
  248. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  249. package/dist-esm/lib/shapes/draw/getPath.mjs +21 -11
  250. package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
  251. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +83 -86
  252. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +3 -3
  253. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +6 -0
  254. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
  255. package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs.map +1 -1
  256. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +6 -5
  257. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  258. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +147 -142
  259. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  260. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +5 -10
  261. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs.map +2 -2
  262. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +3 -3
  263. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
  264. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +24 -22
  265. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  266. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +3 -3
  267. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
  268. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -12
  269. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  270. package/dist-esm/lib/shapes/note/noteHelpers.mjs.map +2 -2
  271. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +5 -10
  272. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
  273. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +4 -3
  274. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
  275. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +14 -2
  276. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  277. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +12 -4
  278. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  279. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +2 -2
  280. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  281. package/dist-esm/lib/shapes/shared/crop.mjs +1 -0
  282. package/dist-esm/lib/shapes/shared/crop.mjs.map +2 -2
  283. package/dist-esm/lib/shapes/shared/interpolate-props.mjs +4 -4
  284. package/dist-esm/lib/shapes/shared/interpolate-props.mjs.map +2 -2
  285. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  286. package/dist-esm/lib/shapes/shared/useEditableRichText.mjs.map +2 -2
  287. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs +12 -0
  288. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs.map +7 -0
  289. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +1 -1
  290. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  291. package/dist-esm/lib/shapes/text/RichTextArea.mjs +5 -0
  292. package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
  293. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +5 -2
  294. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  295. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +4 -10
  296. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +2 -2
  297. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +7 -5
  298. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
  299. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +1 -1
  300. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +2 -2
  301. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +4 -5
  302. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  303. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +3 -8
  304. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  305. package/dist-esm/lib/tools/HandTool/HandTool.mjs +3 -5
  306. package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
  307. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +3 -2
  308. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +2 -2
  309. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs +1 -1
  310. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs.map +2 -2
  311. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs +1 -1
  312. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs.map +2 -2
  313. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +10 -11
  314. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
  315. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +6 -5
  316. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
  317. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs +4 -6
  318. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs.map +2 -2
  319. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +1 -1
  320. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
  321. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +1 -1
  322. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
  323. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs +1 -1
  324. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs.map +2 -2
  325. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs +2 -1
  326. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs.map +2 -2
  327. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs +1 -1
  328. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs.map +2 -2
  329. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +8 -6
  330. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  331. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +38 -11
  332. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
  333. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +43 -51
  334. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  335. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs +6 -6
  336. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
  337. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs +1 -1
  338. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs.map +2 -2
  339. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +6 -19
  340. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
  341. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +1 -1
  342. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +2 -2
  343. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +1 -1
  344. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +2 -2
  345. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +2 -2
  346. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
  347. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +4 -13
  348. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
  349. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +5 -6
  350. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  351. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +2 -3
  352. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
  353. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +7 -6
  354. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
  355. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +13 -11
  356. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  357. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs +17 -4
  358. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs.map +2 -2
  359. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs +1 -1
  360. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs.map +2 -2
  361. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs +3 -3
  362. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs.map +2 -2
  363. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs +5 -6
  364. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs.map +2 -2
  365. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs +1 -3
  366. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
  367. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs +1 -1
  368. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs.map +2 -2
  369. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs +1 -1
  370. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs.map +2 -2
  371. package/dist-esm/lib/ui/TldrawUi.mjs +2 -2
  372. package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
  373. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs +2 -8
  374. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs.map +2 -2
  375. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +1 -3
  376. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
  377. package/dist-esm/lib/ui/components/CursorChatBubble.mjs +1 -1
  378. package/dist-esm/lib/ui/components/CursorChatBubble.mjs.map +2 -2
  379. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs +3 -30
  380. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs.map +2 -2
  381. package/dist-esm/lib/ui/components/EditLinkDialog.mjs +11 -1
  382. package/dist-esm/lib/ui/components/EditLinkDialog.mjs.map +2 -2
  383. package/dist-esm/lib/ui/components/HelperButtons/StopFollowing.mjs.map +2 -2
  384. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +1 -1
  385. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
  386. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs +3 -6
  387. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs.map +2 -2
  388. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs +3 -1
  389. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs.map +2 -2
  390. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs +6 -0
  391. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs.map +2 -2
  392. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  393. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +1 -1
  394. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +2 -2
  395. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs +1 -1
  396. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs.map +2 -2
  397. package/dist-esm/lib/ui/components/TopPanel/CenteredTopPanelContainer.mjs.map +1 -1
  398. package/dist-esm/lib/ui/components/menu-items.mjs +4 -5
  399. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  400. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +3 -1
  401. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  402. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +2 -2
  403. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  404. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +157 -95
  405. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  406. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.mjs.map +2 -2
  407. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.mjs.map +2 -2
  408. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +2 -2
  409. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  410. package/dist-esm/lib/ui/context/actions.mjs +7 -8
  411. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  412. package/dist-esm/lib/ui/context/components.mjs +1 -2
  413. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  414. package/dist-esm/lib/ui/hooks/menu-hooks.mjs +1 -4
  415. package/dist-esm/lib/ui/hooks/menu-hooks.mjs.map +2 -2
  416. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +2 -2
  417. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
  418. package/dist-esm/lib/ui/hooks/useFlatten.mjs.map +2 -2
  419. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
  420. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
  421. package/dist-esm/lib/ui/hooks/useTools.mjs +4 -5
  422. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  423. package/dist-esm/lib/ui/version.mjs +3 -3
  424. package/dist-esm/lib/ui/version.mjs.map +1 -1
  425. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +17 -6
  426. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  427. package/dist-esm/lib/utils/export/exportAs.mjs +1 -3
  428. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  429. package/dist-esm/lib/utils/frames/frames.mjs.map +2 -2
  430. package/dist-esm/lib/utils/test-helpers.mjs +21 -0
  431. package/dist-esm/lib/utils/test-helpers.mjs.map +7 -0
  432. package/dist-esm/lib/utils/text/richText.mjs +8 -5
  433. package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
  434. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +8 -2
  435. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  436. package/package.json +18 -16
  437. package/src/index.ts +6 -2
  438. package/src/lib/Tldraw.test.tsx +46 -1
  439. package/src/lib/bindings/arrow/ArrowBindingUtil.ts +1 -1
  440. package/src/lib/canvas/TldrawSelectionForeground.tsx +20 -9
  441. package/src/lib/defaultEmbedDefinitions.ts +2 -1
  442. package/src/lib/defaultExternalContentHandlers.ts +13 -14
  443. package/src/lib/defaultSideEffects.ts +6 -1
  444. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +40 -133
  445. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +8 -8
  446. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +2 -2
  447. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +16 -16
  448. package/src/lib/shapes/arrow/arrow-types.ts +2 -0
  449. package/src/lib/shapes/arrow/arrowLabel.ts +2 -2
  450. package/src/lib/shapes/arrow/arrowTargetState.ts +2 -2
  451. package/src/lib/shapes/arrow/elbow/elbowArrowSnapLines.tsx +3 -3
  452. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.test.ts +80 -0
  453. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.tsx +1 -1
  454. package/src/lib/shapes/arrow/shared.ts +4 -4
  455. package/src/lib/shapes/arrow/toolStates/Idle.tsx +4 -14
  456. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +8 -5
  457. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +1 -1
  458. package/src/lib/shapes/bookmark/bookmarks.ts +3 -3
  459. package/src/lib/shapes/draw/DrawShapeUtil.test.ts +146 -0
  460. package/src/lib/shapes/draw/DrawShapeUtil.tsx +30 -26
  461. package/src/lib/shapes/draw/getPath.ts +31 -10
  462. package/src/lib/shapes/draw/toolStates/Drawing.ts +100 -90
  463. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +8 -1
  464. package/src/lib/shapes/frame/FrameShapeTool.ts +1 -1
  465. package/src/lib/shapes/frame/FrameShapeUtil.tsx +10 -4
  466. package/src/lib/shapes/geo/GeoShapeUtil.test.tsx +10 -2
  467. package/src/lib/shapes/geo/GeoShapeUtil.tsx +228 -176
  468. package/src/lib/shapes/geo/toolStates/Idle.ts +5 -15
  469. package/src/lib/shapes/geo/toolStates/Pointing.ts +6 -6
  470. package/src/lib/shapes/highlight/HighlightShapeUtil.test.ts +146 -0
  471. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +25 -24
  472. package/src/lib/shapes/line/LineShapeTool.test.ts +6 -6
  473. package/src/lib/shapes/line/LineShapeUtil.test.tsx +5 -5
  474. package/src/lib/shapes/line/toolStates/Pointing.ts +4 -4
  475. package/src/lib/shapes/note/NoteShapeTool.test.ts +2 -1
  476. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -10
  477. package/src/lib/shapes/note/noteCloning.test.ts +3 -1
  478. package/src/lib/shapes/note/noteHelpers.ts +2 -2
  479. package/src/lib/shapes/note/toolStates/Pointing.ts +5 -10
  480. package/src/lib/shapes/shared/HyperlinkButton.tsx +4 -3
  481. package/src/lib/shapes/shared/PlainTextLabel.tsx +12 -2
  482. package/src/lib/shapes/shared/RichTextLabel.tsx +14 -4
  483. package/src/lib/shapes/shared/ShapeFill.tsx +2 -2
  484. package/src/lib/shapes/shared/crop.ts +1 -0
  485. package/src/lib/shapes/shared/interpolate-props.ts +4 -4
  486. package/src/lib/shapes/shared/useEditablePlainText.ts +7 -3
  487. package/src/lib/shapes/shared/useEditableRichText.ts +7 -3
  488. package/src/lib/shapes/shared/useEfficientZoomThreshold.ts +10 -0
  489. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +1 -1
  490. package/src/lib/shapes/text/RichTextArea.tsx +5 -0
  491. package/src/lib/shapes/text/TextShapeTool.test.ts +4 -4
  492. package/src/lib/shapes/text/TextShapeUtil.tsx +5 -0
  493. package/src/lib/shapes/text/toolStates/Idle.ts +4 -14
  494. package/src/lib/shapes/text/toolStates/Pointing.ts +8 -8
  495. package/src/lib/shapes/video/VideoShapeUtil.tsx +2 -1
  496. package/src/lib/tools/EraserTool/childStates/Erasing.ts +7 -10
  497. package/src/lib/tools/EraserTool/childStates/Pointing.ts +5 -20
  498. package/src/lib/tools/HandTool/HandTool.ts +3 -5
  499. package/src/lib/tools/HandTool/childStates/Dragging.ts +3 -2
  500. package/src/lib/tools/HandTool/childStates/Pointing.ts +1 -1
  501. package/src/lib/tools/LaserTool/childStates/Lasering.ts +1 -1
  502. package/src/lib/tools/SelectTool/DragAndDropManager.ts +14 -11
  503. package/src/lib/tools/SelectTool/childStates/Brushing.ts +8 -11
  504. package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +7 -6
  505. package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +3 -4
  506. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +1 -1
  507. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.ts +1 -1
  508. package/src/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.ts +2 -1
  509. package/src/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.ts +1 -1
  510. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +11 -12
  511. package/src/lib/tools/SelectTool/childStates/EditingShape.ts +57 -16
  512. package/src/lib/tools/SelectTool/childStates/Idle.ts +64 -81
  513. package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +7 -8
  514. package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +1 -1
  515. package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +9 -17
  516. package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +1 -1
  517. package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +1 -1
  518. package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +4 -4
  519. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +4 -14
  520. package/src/lib/tools/SelectTool/childStates/Resizing.ts +8 -10
  521. package/src/lib/tools/SelectTool/childStates/Rotating.ts +2 -3
  522. package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +9 -10
  523. package/src/lib/tools/SelectTool/childStates/Translating.ts +16 -15
  524. package/src/lib/tools/SelectTool/selectHelpers.ts +39 -4
  525. package/src/lib/tools/ZoomTool/ZoomTool.ts +1 -1
  526. package/src/lib/tools/ZoomTool/childStates/Pointing.ts +3 -3
  527. package/src/lib/tools/ZoomTool/childStates/ZoomBrushing.ts +5 -6
  528. package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -3
  529. package/src/lib/tools/selection-logic/selectOnCanvasPointerUp.ts +1 -1
  530. package/src/lib/tools/selection-logic/updateHoveredShapeId.ts +1 -1
  531. package/src/lib/ui/TldrawUi.tsx +5 -2
  532. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.tsx +1 -9
  533. package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +1 -3
  534. package/src/lib/ui/components/CursorChatBubble.tsx +2 -2
  535. package/src/lib/ui/components/DefaultDebugPanel.tsx +3 -42
  536. package/src/lib/ui/components/EditLinkDialog.tsx +16 -6
  537. package/src/lib/ui/components/HelperButtons/StopFollowing.tsx +2 -2
  538. package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +1 -1
  539. package/src/lib/ui/components/OfflineIndicator/OfflineIndicator.tsx +6 -5
  540. package/src/lib/ui/components/PageMenu/PageItemInput.tsx +3 -1
  541. package/src/lib/ui/components/SharePanel/PeopleMenu.tsx +8 -0
  542. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +2 -2
  543. package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +1 -1
  544. package/src/lib/ui/components/Toolbar/DefaultRichTextToolbar.tsx +1 -1
  545. package/src/lib/ui/components/TopPanel/CenteredTopPanelContainer.tsx +1 -1
  546. package/src/lib/ui/components/menu-items.tsx +9 -15
  547. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +5 -3
  548. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +2 -2
  549. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +208 -113
  550. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.tsx +1 -1
  551. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.tsx +1 -1
  552. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +2 -2
  553. package/src/lib/ui/context/actions.tsx +15 -19
  554. package/src/lib/ui/context/components.tsx +1 -2
  555. package/src/lib/ui/hooks/menu-hooks.ts +9 -19
  556. package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
  557. package/src/lib/ui/hooks/useFlatten.ts +1 -2
  558. package/src/lib/ui/hooks/useKeyboardShortcuts.ts +2 -2
  559. package/src/lib/ui/hooks/useTools.tsx +5 -7
  560. package/src/lib/ui/version.ts +3 -3
  561. package/src/lib/ui.css +31 -29
  562. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +12 -48
  563. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +19 -6
  564. package/src/lib/utils/export/exportAs.ts +2 -9
  565. package/src/lib/utils/frames/frames.ts +1 -1
  566. package/src/lib/utils/test-helpers.ts +60 -0
  567. package/src/lib/utils/text/richText.ts +9 -8
  568. package/src/lib/utils/tldr/buildFromV1Document.ts +21 -19
  569. package/src/test/Editor.test.tsx +78 -41
  570. package/src/test/EraserTool.test.ts +10 -12
  571. package/src/test/SelectTool.test.ts +11 -19
  572. package/src/test/TestEditor.ts +49 -51
  573. package/src/test/TldrawEditor.test.tsx +24 -20
  574. package/src/test/__snapshots__/drawing.test.ts.snap +3 -1257
  575. package/src/test/__snapshots__/resizing.test.ts.snap +3 -12
  576. package/src/test/arrows-megabus.test.tsx +1 -1
  577. package/src/test/bindings.test.tsx +29 -25
  578. package/src/test/bindingsIndex.test.tsx +4 -4
  579. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +10 -10
  580. package/src/test/commands/cameraState.test.ts +299 -0
  581. package/src/test/commands/createShape.test.ts +64 -0
  582. package/src/test/commands/createShapes.test.ts +15 -1
  583. package/src/test/commands/getSvgString.test.ts +2 -2
  584. package/src/test/commands/isShapeOfType.test.ts +44 -0
  585. package/src/test/commands/putContent.test.ts +80 -1
  586. package/src/test/commands/setCamera.test.ts +13 -11
  587. package/src/test/commands/stackShapes.test.ts +34 -8
  588. package/src/test/commands/updateShape.test.ts +67 -0
  589. package/src/test/commands/updateShapes.test.ts +21 -5
  590. package/src/test/commands/zoomToBounds.test.ts +19 -3
  591. package/src/test/commands/zoomToSelection.test.ts +14 -3
  592. package/src/test/custom-clipping.test.ts +52 -44
  593. package/src/test/customSnapping.test.tsx +77 -62
  594. package/src/test/drawing.test.ts +17 -10
  595. package/src/test/duplicate.test.ts +1 -1
  596. package/src/test/flipShapes.test.ts +33 -0
  597. package/src/test/frames.test.ts +94 -2
  598. package/src/test/getCulledShapes.test.tsx +11 -3
  599. package/src/test/getShapeAtPoint.test.ts +2 -2
  600. package/src/test/groups.test.tsx +7 -4
  601. package/src/test/modifiers.test.ts +6 -6
  602. package/src/test/resizing.test.ts +16 -22
  603. package/src/test/selection-omnibus.test.ts +13 -13
  604. package/src/test/shapeutils.test.ts +1 -1
  605. package/src/test/spacebarPanning.test.ts +28 -10
  606. package/src/test/styles2.test.tsx +1 -1
  607. package/src/test/styles3.test.ts +5 -5
  608. package/src/test/test-jsx.tsx +72 -57
  609. package/src/test/text.test.ts +15 -17
  610. package/src/test/translating.test.ts +6 -8
  611. package/tldraw.css +45 -41
  612. package/dist-cjs/lib/shapes/shared/useForceSolid.js.map +0 -7
  613. package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +0 -7
  614. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js +0 -32
  615. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js.map +0 -7
  616. package/dist-cjs/lib/utils/text/textDirection.js +0 -51
  617. package/dist-cjs/lib/utils/text/textDirection.js.map +0 -7
  618. package/dist-esm/lib/shapes/shared/useForceSolid.mjs +0 -9
  619. package/dist-esm/lib/shapes/shared/useForceSolid.mjs.map +0 -7
  620. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +0 -8
  621. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +0 -7
  622. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs +0 -12
  623. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs.map +0 -7
  624. package/dist-esm/lib/utils/text/textDirection.mjs +0 -31
  625. package/dist-esm/lib/utils/text/textDirection.mjs.map +0 -7
  626. package/src/lib/shapes/shared/useForceSolid.ts +0 -6
  627. package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +0 -10
  628. package/src/lib/ui/components/TopPanel/DefaultTopPanel.tsx +0 -10
  629. package/src/lib/utils/text/textDirection.ts +0 -32
@@ -5,8 +5,7 @@ import {
5
5
  TLBinding,
6
6
  TLBindingCreate,
7
7
  TLBindingId,
8
- TLDefaultBinding,
9
- TLDefaultShape,
8
+ TLShape,
10
9
  TLShapeId,
11
10
  TLShapePartial,
12
11
  ZERO_INDEX_KEY,
@@ -20,9 +19,13 @@ import {
20
19
  } from '@tldraw/editor'
21
20
  import React, { Fragment } from 'react'
22
21
 
22
+ // Re-export test helpers from their new location
23
+ export { base64ToPoints, createDrawSegments, pointsToBase64 } from '../lib/utils/test-helpers'
24
+
23
25
  const shapeTypeSymbol = Symbol('shapeJsx')
24
26
  const assetTypeSymbol = Symbol('assetJsx')
25
27
  const bindingTypeSymbol = Symbol('bindingJsx')
28
+
26
29
  interface CommonShapeProps {
27
30
  x?: number
28
31
  y?: number
@@ -34,7 +37,6 @@ interface CommonShapeProps {
34
37
  opacity?: number
35
38
  }
36
39
 
37
- type ShapeByType<Type extends TLDefaultShape['type']> = Extract<TLDefaultShape, { type: Type }>
38
40
  type FormatShapeProps<Props extends object> = {
39
41
  [K in keyof Props]?: Props[K] extends TLAssetId
40
42
  ? TLAssetId | React.JSX.Element
@@ -42,24 +44,39 @@ type FormatShapeProps<Props extends object> = {
42
44
  ? TLAssetId | React.JSX.Element | null
43
45
  : Props[K]
44
46
  }
45
- type PropsForShape<Type extends string> = Type extends TLDefaultShape['type']
46
- ? CommonShapeProps & FormatShapeProps<ShapeByType<Type>['props']>
47
- : CommonShapeProps & Record<string, unknown>
47
+ type PropsForShape<Type extends TLShape['type']> = CommonShapeProps &
48
+ FormatShapeProps<TLShape<Type>['props']>
48
49
 
49
50
  type AssetByType<Type extends TLAsset['type']> = Extract<TLAsset, { type: Type }>
50
51
  type PropsForAsset<Type extends string> = Type extends TLAsset['type']
51
52
  ? Partial<AssetByType<Type>['props']>
52
53
  : Record<string, unknown>
53
54
 
54
- interface CommonBindingProps {
55
+ interface BindingReactConnections {
55
56
  from?: string | TLShapeId
56
57
  to: string | TLShapeId
57
58
  }
58
59
 
59
- type BindingByType<Type extends TLBinding['type']> = Extract<TLBinding, { type: Type }>
60
- type PropsForBinding<Type extends string> = Type extends TLBinding['type']
61
- ? CommonBindingProps & Partial<BindingByType<Type>['props']>
62
- : CommonBindingProps & Record<string, unknown>
60
+ interface CommonBindingReactProps extends BindingReactConnections {
61
+ ref?: string
62
+ id?: TLBindingId
63
+ }
64
+
65
+ type ReactPropsForBinding<Type extends TLBinding['type']> = CommonBindingReactProps &
66
+ Partial<TLBinding<Type>['props']>
67
+
68
+ type BindingToCreate = TLBinding extends infer E
69
+ ? E extends TLBinding
70
+ ? {
71
+ type: E['type']
72
+ props: Partial<TLBinding<E['type']>['props']>
73
+ id: TLBindingId | undefined
74
+ parentId: TLShapeId | undefined
75
+ ref: string | undefined
76
+ connections: BindingReactConnections
77
+ }
78
+ : never
79
+ : never
63
80
 
64
81
  const createElement = (
65
82
  type: typeof shapeTypeSymbol | typeof assetTypeSymbol | typeof bindingTypeSymbol,
@@ -90,10 +107,9 @@ const tlBinding = new Proxy(
90
107
  return createElement(bindingTypeSymbol, key as string)
91
108
  },
92
109
  }
93
- ) as { [K in TLDefaultBinding['type']]: (props: PropsForBinding<K>) => null } & Record<
94
- string,
95
- (props: PropsForBinding<string>) => null
96
- >
110
+ ) as {
111
+ [K in TLBinding['type']]: (props: ReactPropsForBinding<K>) => null
112
+ }
97
113
 
98
114
  /**
99
115
  * TL - jsx helpers for creating tldraw shapes in test cases
@@ -112,8 +128,8 @@ export const TL = new Proxy(
112
128
  },
113
129
  }
114
130
  ) as { asset: typeof tlAsset; binding: typeof tlBinding } & {
115
- [K in TLDefaultShape['type']]: (props: PropsForShape<K>) => null
116
- } & Record<string, (props: PropsForShape<string>) => null>
131
+ [K in TLShape['type']]: (props: PropsForShape<K>) => null
132
+ }
117
133
 
118
134
  export function shapesFromJsx(shapes: React.JSX.Element | Array<React.JSX.Element>, idPrefix = '') {
119
135
  const ids = { bindings: {} } as Record<string, TLShapeId> & {
@@ -122,12 +138,7 @@ export function shapesFromJsx(shapes: React.JSX.Element | Array<React.JSX.Elemen
122
138
  const currentPageShapes: Array<TLShapePartial> = []
123
139
  const assets: Array<TLAsset> = []
124
140
 
125
- const bindingsToCreate: Array<{
126
- type: string
127
- props: Record<string, unknown>
128
- parentId: TLShapeId | undefined
129
- ref: string | undefined
130
- }> = []
141
+ const bindingsToCreate: Array<BindingToCreate> = []
131
142
 
132
143
  function addChildren(
133
144
  children: React.JSX.Element | Array<React.JSX.Element>,
@@ -152,10 +163,21 @@ export function shapesFromJsx(shapes: React.JSX.Element | Array<React.JSX.Elemen
152
163
  }
153
164
 
154
165
  if (el.type[bindingTypeSymbol]) {
155
- const bindingType = (el.type as any)[bindingTypeSymbol] as string
156
- const ref = ((el as any).ref || el.props.ref) as string | undefined
157
- assert(ref === undefined || typeof ref === 'string', 'ref must be string or undefined')
158
- bindingsToCreate.push({ type: bindingType, props: el.props, parentId, ref })
166
+ const bindingType = (el.type as any)[bindingTypeSymbol] as TLBinding['type']
167
+ const { id, from, to, ref, ...props } = el.props
168
+ const bindingRef: unknown = (el as any).ref || ref
169
+ assert(
170
+ bindingRef === undefined || typeof bindingRef === 'string',
171
+ 'ref must be string or undefined'
172
+ )
173
+ bindingsToCreate.push({
174
+ type: bindingType,
175
+ props,
176
+ id,
177
+ parentId,
178
+ ref: bindingRef,
179
+ connections: { from, to },
180
+ })
159
181
  } else {
160
182
  const shapeType = (el.type as any)[shapeTypeSymbol] as string
161
183
  if (!shapeType) {
@@ -239,55 +261,48 @@ export function shapesFromJsx(shapes: React.JSX.Element | Array<React.JSX.Elemen
239
261
  addChildren(shapes)
240
262
 
241
263
  const bindings: TLBindingCreate[] = []
242
- for (const binding of bindingsToCreate) {
264
+ for (const { id, parentId, ref, connections, ...binding } of bindingsToCreate) {
243
265
  let fromId: TLShapeId, toId: TLShapeId
244
- if (binding.props.from) {
245
- assert(typeof binding.props.from === 'string', 'from must be a ref string or a shape id')
246
- if (isShapeId(binding.props.from)) {
247
- fromId = binding.props.from
266
+ if (connections.from) {
267
+ assert(typeof connections.from === 'string', 'from must be a ref string or a shape id')
268
+ if (isShapeId(connections.from)) {
269
+ fromId = connections.from
248
270
  } else {
249
- assert(ids[binding.props.from], `Ref not found: ${binding.props.from}`)
250
- fromId = ids[binding.props.from]
271
+ assert(ids[connections.from], `Ref not found: ${connections.from}`)
272
+ fromId = ids[connections.from]
251
273
  }
252
- } else if (binding.parentId) {
253
- fromId = binding.parentId
274
+ } else if (parentId) {
275
+ fromId = parentId
254
276
  } else {
255
277
  throw new Error('from must be specified, or binding must be a child of a shape')
256
278
  }
257
279
 
258
- assert(binding.props.to, 'to must be specified')
259
- assert(typeof binding.props.to === 'string', 'to must be a ref string or a shape id')
260
- if (isShapeId(binding.props.to)) {
261
- toId = binding.props.to
280
+ assert(connections.to, 'to must be specified')
281
+ assert(typeof connections.to === 'string', 'to must be a ref string or a shape id')
282
+ if (isShapeId(connections.to)) {
283
+ toId = connections.to
262
284
  } else {
263
- assert(ids[binding.props.to], `Ref not found: ${binding.props.to}`)
264
- toId = ids[binding.props.to]
285
+ assert(ids[connections.to], `Ref not found: ${connections.to}`)
286
+ toId = ids[connections.to]
265
287
  }
266
288
 
267
- let bindingId: TLBindingId = binding.props.id as TLBindingId
268
- if (binding.ref) {
269
- assert(typeof binding.ref === 'string', 'binding ref must be string')
270
- assert(!ids.bindings[binding.ref], `Duplicate ref: ${binding.ref}`)
271
- assert(!bindingId, `Cannot use both ref and id on binding: ${binding.ref}`)
272
- bindingId = createBindingId(`${idPrefix}${binding.ref}`)
273
- ids.bindings[binding.ref] = bindingId
289
+ let bindingId = id
290
+ if (ref) {
291
+ assert(typeof ref === 'string', 'binding ref must be string')
292
+ assert(!ids.bindings[ref], `Duplicate ref: ${ref}`)
293
+ assert(!bindingId, `Cannot use both ref and id on binding: ${ref}`)
294
+ bindingId = createBindingId(`${idPrefix}${ref}`)
295
+ ids.bindings[ref] = bindingId
274
296
  }
275
297
  if (!bindingId) {
276
298
  bindingId = createBindingId()
277
299
  }
278
300
 
279
- const props = { ...binding.props }
280
- delete props.ref
281
- delete props.id
282
- delete props.from
283
- delete props.to
284
-
285
301
  bindings.push({
302
+ ...binding,
286
303
  id: bindingId,
287
- type: binding.type,
288
304
  fromId,
289
305
  toId,
290
- props,
291
306
  })
292
307
  }
293
308
 
@@ -1,4 +1,4 @@
1
- import { TLTextShape, createShapeId, toRichText } from '@tldraw/editor'
1
+ import { createShapeId, toRichText } from '@tldraw/editor'
2
2
  import { TestEditor } from './TestEditor'
3
3
 
4
4
  let editor: TestEditor
@@ -13,7 +13,7 @@ afterEach(() => {
13
13
  describe('When editing text', () => {
14
14
  it('preserves the top center when center aligned', () => {
15
15
  const id = createShapeId()
16
- editor.createShapes<TLTextShape>([
16
+ editor.createShapes([
17
17
  {
18
18
  id,
19
19
  type: 'text',
@@ -27,7 +27,7 @@ describe('When editing text', () => {
27
27
  },
28
28
  ])
29
29
  const boundsA = editor.getShapePageBounds(id)
30
- editor.updateShapes<TLTextShape>([
30
+ editor.updateShapes([
31
31
  {
32
32
  id,
33
33
  type: 'text',
@@ -47,7 +47,7 @@ describe('When editing text', () => {
47
47
 
48
48
  it('preserved the right center when center aligned and rotated 90deg', () => {
49
49
  const id = createShapeId()
50
- editor.createShapes<TLTextShape>([
50
+ editor.createShapes([
51
51
  {
52
52
  id,
53
53
  type: 'text',
@@ -63,9 +63,7 @@ describe('When editing text', () => {
63
63
  ])
64
64
 
65
65
  const boundsA = editor.getShapePageBounds(id)!
66
- editor.updateShapes<TLTextShape>([
67
- { id, type: 'text', props: { richText: toRichText('Hello, world!') } },
68
- ])
66
+ editor.updateShapes([{ id, type: 'text', props: { richText: toRichText('Hello, world!') } }])
69
67
  const boundsB = editor.getShapePageBounds(id)!
70
68
  expect(boundsA.x).toBeCloseTo(boundsB.x)
71
69
  expect(boundsA.y).not.toBeCloseTo(boundsB.y)
@@ -75,7 +73,7 @@ describe('When editing text', () => {
75
73
 
76
74
  it('preserves the top left corner when start aligned', () => {
77
75
  const id = createShapeId()
78
- editor.createShapes<TLTextShape>([
76
+ editor.createShapes([
79
77
  {
80
78
  id,
81
79
  type: 'text',
@@ -89,7 +87,7 @@ describe('When editing text', () => {
89
87
  },
90
88
  ])
91
89
  const boundsA = editor.getShapePageBounds(id)
92
- editor.updateShapes<TLTextShape>([
90
+ editor.updateShapes([
93
91
  {
94
92
  id,
95
93
  type: 'text',
@@ -109,7 +107,7 @@ describe('When editing text', () => {
109
107
 
110
108
  it('preserves the top right edge when end aligned', () => {
111
109
  const id = createShapeId()
112
- editor.createShapes<TLTextShape>([
110
+ editor.createShapes([
113
111
  {
114
112
  id,
115
113
  type: 'text',
@@ -123,7 +121,7 @@ describe('When editing text', () => {
123
121
  },
124
122
  ])
125
123
  const boundsA = editor.getShapePageBounds(id)
126
- editor.updateShapes<TLTextShape>([
124
+ editor.updateShapes([
127
125
  {
128
126
  id,
129
127
  type: 'text',
@@ -145,7 +143,7 @@ describe('When editing text', () => {
145
143
  describe('When changing text size', () => {
146
144
  it('preserves the center when center aligned', () => {
147
145
  const id = createShapeId()
148
- editor.createShapes<TLTextShape>([
146
+ editor.createShapes([
149
147
  {
150
148
  id,
151
149
  type: 'text',
@@ -160,7 +158,7 @@ describe('When changing text size', () => {
160
158
  },
161
159
  ])
162
160
  const boundsA = editor.getShapePageBounds(id)
163
- editor.updateShapes<TLTextShape>([
161
+ editor.updateShapes([
164
162
  {
165
163
  id,
166
164
  type: 'text',
@@ -180,7 +178,7 @@ describe('When changing text size', () => {
180
178
 
181
179
  it('preserves the center left point when start aligned', () => {
182
180
  const id = createShapeId()
183
- editor.createShapes<TLTextShape>([
181
+ editor.createShapes([
184
182
  {
185
183
  id,
186
184
  type: 'text',
@@ -195,7 +193,7 @@ describe('When changing text size', () => {
195
193
  },
196
194
  ])
197
195
  const boundsA = editor.getShapePageBounds(id)
198
- editor.updateShapes<TLTextShape>([
196
+ editor.updateShapes([
199
197
  {
200
198
  id,
201
199
  type: 'text',
@@ -215,7 +213,7 @@ describe('When changing text size', () => {
215
213
 
216
214
  it('preserves the top right edge when end aligned', () => {
217
215
  const id = createShapeId()
218
- editor.createShapes<TLTextShape>([
216
+ editor.createShapes([
219
217
  {
220
218
  id,
221
219
  type: 'text',
@@ -230,7 +228,7 @@ describe('When changing text size', () => {
230
228
  },
231
229
  ])
232
230
  const boundsA = editor.getShapePageBounds(id)
233
- editor.updateShapes<TLTextShape>([
231
+ editor.updateShapes([
234
232
  {
235
233
  id,
236
234
  type: 'text',
@@ -1749,9 +1749,7 @@ describe('translating a shape with a bound shape', () => {
1749
1749
 
1750
1750
  const newArrow = editor
1751
1751
  .getCurrentPageShapes()
1752
- .find(
1753
- (s) => editor.isShapeOfType<TLArrowShape>(s, 'arrow') && s.id !== arrow1
1754
- )! as TLArrowShape
1752
+ .find((s) => editor.isShapeOfType(s, 'arrow') && s.id !== arrow1)! as TLArrowShape
1755
1753
  expect(getArrowBindings(editor, newArrow)).toMatchObject({
1756
1754
  start: { type: 'arrow' },
1757
1755
  end: undefined,
@@ -2061,7 +2059,7 @@ describe('Note shape grid helper positions / pits', () => {
2061
2059
  editor
2062
2060
  .createShape({ type: 'note' })
2063
2061
  .createShape({ type: 'note', x: 500, y: 500 })
2064
- .updateShape({ ...editor.getLastCreatedShape(), props: { growY: 100 } })
2062
+ .updateShape({ ...editor.getLastCreatedShape<TLNoteShape>(), props: { growY: 100 } })
2065
2063
  .pointerMove(600, 600)
2066
2064
  // start translating
2067
2065
  .pointerDown()
@@ -2080,7 +2078,7 @@ describe('Note shape grid helper positions / pits', () => {
2080
2078
  it('Snaps correctly to the bottom when the not-translating shape has growY', () => {
2081
2079
  editor
2082
2080
  .createShape({ type: 'note' })
2083
- .updateShape({ ...editor.getLastCreatedShape(), props: { growY: 100 } })
2081
+ .updateShape({ ...editor.getLastCreatedShape<TLNoteShape>(), props: { growY: 100 } })
2084
2082
  .createShape({ type: 'note', x: 500, y: 500 })
2085
2083
  .pointerMove(600, 600)
2086
2084
  // start translating
@@ -2183,7 +2181,7 @@ describe('Note shape grid helper positions / pits', () => {
2183
2181
 
2184
2182
  describe('cancelling a translate operation', () => {
2185
2183
  it('undoes any changes since the start of the translate operation', () => {
2186
- editor.createShape<TLGeoShape>({
2184
+ editor.createShape({
2187
2185
  type: 'geo',
2188
2186
  x: 0,
2189
2187
  y: 0,
@@ -2220,7 +2218,7 @@ describe('cancelling a translate operation', () => {
2220
2218
  const shapeId = createShapeId()
2221
2219
 
2222
2220
  editor
2223
- .createShape<TLGeoShape>({
2221
+ .createShape({
2224
2222
  id: shapeId,
2225
2223
  type: 'geo',
2226
2224
  x: 0,
@@ -2268,7 +2266,7 @@ describe('cancelling a translate operation', () => {
2268
2266
  const shapeId = createShapeId()
2269
2267
 
2270
2268
  editor
2271
- .createShape<TLGeoShape>({
2269
+ .createShape({
2272
2270
  id: shapeId,
2273
2271
  type: 'geo',
2274
2272
  x: 0,
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
 
@@ -2315,12 +2317,10 @@ it from receiving any pointer events or affecting the cursor. */
2315
2317
  /* If mobile use 16px as font size */
2316
2318
  /* On iOS, font size under 16px in an input will make the page zoom into the input 🤦‍♂️ */
2317
2319
  /* https://css-tricks.com/16px-or-larger-text-prevents-ios-form-zoom/ */
2318
- @media (max-width: 600px) {
2319
- @supports (-webkit-touch-callout: none) {
2320
- /* CSS specific to iOS devices */
2321
- .tlui-input {
2322
- font-size: 16px;
2323
- }
2320
+ @supports (-webkit-touch-callout: none) {
2321
+ /* CSS specific to iOS devices */
2322
+ .tlui-input {
2323
+ font-size: 16px;
2324
2324
  }
2325
2325
  }
2326
2326
 
@@ -2412,25 +2412,31 @@ it from receiving any pointer events or affecting the cursor. */
2412
2412
 
2413
2413
  /* Submenu triggers */
2414
2414
 
2415
- .tlui-menu__submenu__trigger[data-state='open']::after {
2416
- opacity: 1;
2417
- 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;
2418
2417
  }
2419
2418
 
2420
- .tlui-menu__submenu__trigger[data-direction='left'][data-state='open']::after {
2419
+ .tlui-menu__submenu__trigger[data-direction='left'] {
2420
+ --gradient-angle: 270deg;
2421
+ }
2422
+
2423
+ .tlui-menu__submenu__trigger[data-state='open']::after {
2421
2424
  opacity: 1;
2422
- 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
+ );
2423
2430
  }
2424
2431
 
2425
2432
  @media (hover: hover) {
2426
- .tlui-menu__submenu__trigger[data-state='open']:not(:hover)::after {
2433
+ .tlui-menu__submenu__trigger:is(:hover, [data-state='open'])::after {
2427
2434
  opacity: 1;
2428
- background: linear-gradient(90deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
2429
- }
2430
-
2431
- .tlui-menu__submenu__trigger[data-direction='left'][data-state='open']:not(:hover)::after {
2432
- opacity: 1;
2433
- 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
+ );
2434
2440
  }
2435
2441
  }
2436
2442
 
@@ -2709,10 +2715,8 @@ it from receiving any pointer events or affecting the cursor. */
2709
2715
  }
2710
2716
  }
2711
2717
 
2712
- @media (any-pointer: coarse) {
2713
- .tlui-page_menu__item__submenu > .tlui-button {
2714
- opacity: 1;
2715
- }
2718
+ .tl-container[data-coarse='true'] .tlui-page_menu__item__submenu > .tlui-button {
2719
+ opacity: 1;
2716
2720
  }
2717
2721
 
2718
2722
  .tlui-button__icon {
@@ -2751,16 +2755,15 @@ it from receiving any pointer events or affecting the cursor. */
2751
2755
 
2752
2756
  .tlui-offline-indicator {
2753
2757
  display: flex;
2754
- flex-direction: row;
2755
- gap: var(--tl-space-3);
2756
- color: var(--tl-color-text);
2757
- background-color: var(--tl-color-low);
2758
- border: 3px solid var(--tl-color-background);
2759
- padding: 0px var(--tl-space-5);
2760
- height: 42px;
2758
+ color: var(--tl-color-background);
2759
+ background-color: var(--tl-color-text);
2760
+ border: none;
2761
+ width: 32px;
2762
+ height: 32px;
2761
2763
  align-items: center;
2762
2764
  justify-content: center;
2763
2765
  border-radius: 99px;
2766
+ cursor: default;
2764
2767
  opacity: 0;
2765
2768
  animation: tl-fade-in;
2766
2769
  animation-duration: 0.12s;
@@ -3078,6 +3081,7 @@ tldraw? probably.
3078
3081
  position: relative;
3079
3082
  background: var(--tl-color-panel);
3080
3083
  box-shadow: var(--tl-shadow-2);
3084
+ contain: layout style paint;
3081
3085
  }
3082
3086
 
3083
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
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/lib/ui/components/TopPanel/DefaultTopPanel.tsx"],
4
- "sourcesContent": ["import { useCollaborationStatus } from '../../hooks/useCollaborationStatus'\nimport { OfflineIndicator } from '../OfflineIndicator/OfflineIndicator'\nimport { CenteredTopPanelContainer } from './CenteredTopPanelContainer'\n\n/** @public @react */\nexport function DefaultTopPanel() {\n\tconst isOffline = useCollaborationStatus() === 'offline'\n\n\treturn <CenteredTopPanelContainer>{isOffline && <OfflineIndicator />}</CenteredTopPanelContainer>\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQiD;AARjD,oCAAuC;AACvC,8BAAiC;AACjC,uCAA0C;AAGnC,SAAS,kBAAkB;AACjC,QAAM,gBAAY,sDAAuB,MAAM;AAE/C,SAAO,4CAAC,8DAA2B,uBAAa,4CAAC,4CAAiB,GAAG;AACtE;",
6
- "names": []
7
- }