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
@@ -30,6 +30,7 @@ var import_default_shape_constants = require("../shared/default-shape-constants"
30
30
  var import_defaultStyleDefs = require("../shared/defaultStyleDefs");
31
31
  var import_useDefaultColorTheme = require("../shared/useDefaultColorTheme");
32
32
  var import_useEditablePlainText = require("../shared/useEditablePlainText");
33
+ var import_useEfficientZoomThreshold = require("../shared/useEfficientZoomThreshold");
33
34
  var import_GeoShapeBody = require("./components/GeoShapeBody");
34
35
  var import_getGeoShapePath = require("./getGeoShapePath");
35
36
  const MIN_SIZE_WITH_LABEL = 17 * 3;
@@ -37,6 +38,9 @@ class GeoShapeUtil extends import_editor.BaseBoxShapeUtil {
37
38
  static type = "geo";
38
39
  static props = import_editor.geoShapeProps;
39
40
  static migrations = import_editor.geoShapeMigrations;
41
+ options = {
42
+ showTextOutline: true
43
+ };
40
44
  canEdit() {
41
45
  return true;
42
46
  }
@@ -61,37 +65,34 @@ class GeoShapeUtil extends import_editor.BaseBoxShapeUtil {
61
65
  };
62
66
  }
63
67
  getGeometry(shape) {
64
- const w = Math.max(1, shape.props.w);
65
- const h = Math.max(1, shape.props.h + shape.props.growY);
68
+ const { props } = shape;
69
+ const { scale } = props;
66
70
  const path = (0, import_getGeoShapePath.getGeoShapePath)(shape);
67
- const unscaledlabelSize = getUnscaledLabelSize(this.editor, shape);
68
- const unscaledW = w / shape.props.scale;
69
- const unscaledH = h / shape.props.scale;
70
- const unscaledminWidth = Math.min(100, unscaledW / 2);
71
- const unscaledMinHeight = Math.min(
72
- import_default_shape_constants.LABEL_FONT_SIZES[shape.props.size] * import_default_shape_constants.TEXT_PROPS.lineHeight + import_default_shape_constants.LABEL_PADDING * 2,
73
- unscaledH / 2
74
- );
75
- const unscaledLabelWidth = Math.min(
71
+ const pathGeometry = path.toGeometry();
72
+ const scaledW = Math.max(1, props.w);
73
+ const scaledH = Math.max(1, props.h + props.growY);
74
+ const unscaledW = scaledW / scale;
75
+ const unscaledH = scaledH / scale;
76
+ const isEmptyLabel = (0, import_richText.isEmptyRichText)(props.richText);
77
+ const unscaledLabelSize = isEmptyLabel ? EMPTY_LABEL_SIZE : getUnscaledLabelSize(this.editor, shape);
78
+ const labelBounds = getLabelBounds(
76
79
  unscaledW,
77
- Math.max(unscaledlabelSize.w, Math.min(unscaledminWidth, Math.max(1, unscaledW - 8)))
78
- );
79
- const unscaledLabelHeight = Math.min(
80
80
  unscaledH,
81
- Math.max(unscaledlabelSize.h, Math.min(unscaledMinHeight, Math.max(1, unscaledH - 8)))
81
+ unscaledLabelSize,
82
+ props.size,
83
+ props.align,
84
+ props.verticalAlign,
85
+ scale
82
86
  );
83
87
  return new import_editor.Group2d({
84
88
  children: [
85
- path.toGeometry(),
89
+ pathGeometry,
86
90
  new import_editor.Rectangle2d({
87
- x: shape.props.align === "start" ? 0 : shape.props.align === "end" ? (unscaledW - unscaledLabelWidth) * shape.props.scale : (unscaledW - unscaledLabelWidth) / 2 * shape.props.scale,
88
- y: shape.props.verticalAlign === "start" ? 0 : shape.props.verticalAlign === "end" ? (unscaledH - unscaledLabelHeight) * shape.props.scale : (unscaledH - unscaledLabelHeight) / 2 * shape.props.scale,
89
- width: unscaledLabelWidth * shape.props.scale,
90
- height: unscaledLabelHeight * shape.props.scale,
91
+ ...labelBounds,
91
92
  isFilled: true,
92
93
  isLabel: true,
93
94
  excludeFromShapeBounds: true,
94
- isEmptyLabel: (0, import_richText.isEmptyRichText)(shape.props.richText)
95
+ isEmptyLabel
95
96
  })
96
97
  ]
97
98
  });
@@ -152,7 +153,7 @@ class GeoShapeUtil extends import_editor.BaseBoxShapeUtil {
152
153
  const isReadyForEditing = (0, import_useEditablePlainText.useIsReadyForEditing)(editor, shape.id);
153
154
  const isEmpty = (0, import_richText.isEmptyRichText)(shape.props.richText);
154
155
  const showHtmlContainer = isReadyForEditing || !isEmpty;
155
- const isForceSolid = (0, import_editor.useValue)("force solid", () => editor.getZoomLevel() < 0.2, [editor]);
156
+ const isForceSolid = (0, import_useEfficientZoomThreshold.useEfficientZoomThreshold)(shape.props.scale * 0.25);
156
157
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
157
158
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_editor.SVGContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_GeoShapeBody.GeoShapeBody, { shape, shouldScale: true, forceSolid: isForceSolid }) }),
158
159
  showHtmlContainer && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -178,7 +179,8 @@ class GeoShapeUtil extends import_editor.BaseBoxShapeUtil {
178
179
  richText,
179
180
  isSelected: isOnlySelected,
180
181
  labelColor: (0, import_editor.getColorValue)(theme, props.labelColor, "solid"),
181
- wrap: true
182
+ wrap: true,
183
+ showTextOutline: this.options.showTextOutline
182
184
  }
183
185
  )
184
186
  }
@@ -187,9 +189,7 @@ class GeoShapeUtil extends import_editor.BaseBoxShapeUtil {
187
189
  ] });
188
190
  }
189
191
  indicator(shape) {
190
- const isZoomedOut = (0, import_editor.useValue)("isZoomedOut", () => this.editor.getZoomLevel() < 0.25, [
191
- this.editor
192
- ]);
192
+ const isZoomedOut = (0, import_useEfficientZoomThreshold.useEfficientZoomThreshold)(shape.props.scale * 0.25);
193
193
  const { size, dash, scale } = shape.props;
194
194
  const strokeWidth = import_default_shape_constants.STROKE_SIZES[size];
195
195
  const path = (0, import_getGeoShapePath.getGeoShapePath)(shape);
@@ -232,7 +232,8 @@ class GeoShapeUtil extends import_editor.BaseBoxShapeUtil {
232
232
  richText: props.richText,
233
233
  labelColor: (0, import_editor.getColorValue)(theme, props.labelColor, "solid"),
234
234
  bounds,
235
- padding: import_default_shape_constants.LABEL_PADDING
235
+ padding: import_default_shape_constants.LABEL_PADDING,
236
+ showTextOutline: this.options.showTextOutline
236
237
  }
237
238
  );
238
239
  }
@@ -245,33 +246,21 @@ class GeoShapeUtil extends import_editor.BaseBoxShapeUtil {
245
246
  return [(0, import_defaultStyleDefs.getFillDefForCanvas)()];
246
247
  }
247
248
  onResize(shape, { handle, newPoint, scaleX, scaleY, initialShape }) {
248
- const unscaledInitialW = initialShape.props.w / initialShape.props.scale;
249
- const unscaledInitialH = initialShape.props.h / initialShape.props.scale;
250
- const unscaledGrowY = initialShape.props.growY / initialShape.props.scale;
251
- let unscaledW = unscaledInitialW * scaleX;
252
- let unscaledH = (unscaledInitialH + unscaledGrowY) * scaleY;
249
+ const unscaledInitial = getUnscaledGeoProps(initialShape.props);
250
+ let unscaledW = unscaledInitial.w * scaleX;
251
+ let unscaledH = (unscaledInitial.h + unscaledInitial.growY) * scaleY;
253
252
  let overShrinkX = 0;
254
253
  let overShrinkY = 0;
255
- const min = MIN_SIZE_WITH_LABEL;
256
254
  if (!(0, import_richText.isEmptyRichText)(shape.props.richText)) {
257
- let newW = Math.max(Math.abs(unscaledW), min);
258
- let newH = Math.max(Math.abs(unscaledH), min);
259
- if (newW < min && newH === min) newW = min;
260
- if (newW === min && newH < min) newH = min;
261
- const unscaledLabelSize = getUnscaledLabelSize(this.editor, {
262
- ...shape,
263
- props: {
264
- ...shape.props,
265
- w: newW * shape.props.scale,
266
- h: newH * shape.props.scale
267
- }
268
- });
269
- const nextW = Math.max(Math.abs(unscaledW), unscaledLabelSize.w) * Math.sign(unscaledW);
270
- const nextH = Math.max(Math.abs(unscaledH), unscaledLabelSize.h) * Math.sign(unscaledH);
271
- overShrinkX = Math.abs(nextW) - Math.abs(unscaledW);
272
- overShrinkY = Math.abs(nextH) - Math.abs(unscaledH);
273
- unscaledW = nextW;
274
- unscaledH = nextH;
255
+ const unscaledLabelSize = getUnscaledLabelSize(this.editor, initialShape);
256
+ const absUnscaledW = Math.abs(unscaledW);
257
+ const absUnscaledH = Math.abs(unscaledH);
258
+ const constrainedW = Math.max(absUnscaledW, unscaledLabelSize.w, MIN_SIZE_WITH_LABEL);
259
+ const constrainedH = Math.max(absUnscaledH, unscaledLabelSize.h, MIN_SIZE_WITH_LABEL);
260
+ overShrinkX = constrainedW - absUnscaledW;
261
+ overShrinkY = constrainedH - absUnscaledH;
262
+ unscaledW = constrainedW * Math.sign(unscaledW || 1);
263
+ unscaledH = constrainedH * Math.sign(unscaledH || 1);
275
264
  }
276
265
  const scaledW = unscaledW * shape.props.scale;
277
266
  const scaledH = unscaledH * shape.props.scale;
@@ -300,113 +289,65 @@ class GeoShapeUtil extends import_editor.BaseBoxShapeUtil {
300
289
  };
301
290
  }
302
291
  onBeforeCreate(shape) {
303
- if ((0, import_richText.isEmptyRichText)(shape.props.richText)) {
304
- if (shape.props.growY) {
305
- return {
306
- ...shape,
307
- props: {
308
- ...shape.props,
309
- growY: 0
310
- }
311
- };
312
- } else {
313
- return;
314
- }
315
- }
316
- const unscaledPrevHeight = shape.props.h / shape.props.scale;
317
- const unscaledNextHeight = getUnscaledLabelSize(this.editor, shape).h;
318
- let growY = null;
319
- if (unscaledNextHeight > unscaledPrevHeight) {
320
- growY = unscaledNextHeight - unscaledPrevHeight;
321
- } else {
322
- if (shape.props.growY) {
323
- growY = 0;
324
- }
292
+ const { props } = shape;
293
+ if ((0, import_richText.isEmptyRichText)(props.richText)) {
294
+ return props.growY !== 0 ? { ...shape, props: { ...props, growY: 0 } } : void 0;
325
295
  }
326
- if (growY !== null) {
296
+ const unscaledShapeH = props.h / props.scale;
297
+ const unscaledLabelH = getUnscaledLabelSize(this.editor, shape).h;
298
+ const unscaledGrowY = calculateGrowY(unscaledShapeH, unscaledLabelH, props.growY / props.scale);
299
+ if (unscaledGrowY !== null) {
327
300
  return {
328
301
  ...shape,
329
- props: {
330
- ...shape.props,
331
- // scale the growY
332
- growY: growY * shape.props.scale
333
- }
302
+ props: { ...props, growY: unscaledGrowY * props.scale }
334
303
  };
335
304
  }
336
305
  }
337
306
  onBeforeUpdate(prev, next) {
338
- if ((0, import_editor.isEqual)(prev.props.richText, next.props.richText) && prev.props.font === next.props.font && prev.props.size === next.props.size) {
307
+ const { props: prevProps } = prev;
308
+ const { props: nextProps } = next;
309
+ if ((0, import_editor.isEqual)(prevProps.richText, nextProps.richText) && prevProps.font === nextProps.font && prevProps.size === nextProps.size) {
339
310
  return;
340
311
  }
341
- const wasEmpty = (0, import_richText.isEmptyRichText)(prev.props.richText);
342
- const isEmpty = (0, import_richText.isEmptyRichText)(next.props.richText);
343
- if (!wasEmpty && isEmpty) {
344
- return {
345
- ...next,
346
- props: {
347
- ...next.props,
348
- growY: 0
349
- }
350
- };
351
- }
352
- const unscaledPrevWidth = prev.props.w / prev.props.scale;
353
- const unscaledPrevHeight = prev.props.h / prev.props.scale;
354
- const unscaledPrevGrowY = prev.props.growY / prev.props.scale;
355
- const unscaledNextLabelSize = getUnscaledLabelSize(this.editor, next);
356
- if (wasEmpty && !isEmpty && (0, import_richText.renderPlaintextFromRichText)(this.editor, next.props.richText)) {
357
- let unscaledW = Math.max(unscaledPrevWidth, unscaledNextLabelSize.w);
358
- let unscaledH = Math.max(unscaledPrevHeight, unscaledNextLabelSize.h);
359
- const min = MIN_SIZE_WITH_LABEL;
360
- if (unscaledPrevWidth < min && unscaledPrevHeight < min) {
361
- unscaledW = Math.max(unscaledW, min);
362
- unscaledH = Math.max(unscaledH, min);
363
- unscaledW = Math.max(unscaledW, unscaledH);
364
- unscaledH = Math.max(unscaledW, unscaledH);
365
- }
366
- return {
367
- ...next,
368
- props: {
369
- ...next.props,
370
- // Scale the results
371
- w: unscaledW * next.props.scale,
372
- h: unscaledH * next.props.scale,
373
- growY: 0
374
- }
375
- };
312
+ const wasEmpty = (0, import_richText.isEmptyRichText)(prevProps.richText);
313
+ const isEmpty = (0, import_richText.isEmptyRichText)(nextProps.richText);
314
+ if (wasEmpty && isEmpty) {
315
+ return;
376
316
  }
377
- let growY = null;
378
- if (unscaledNextLabelSize.h > unscaledPrevHeight) {
379
- growY = unscaledNextLabelSize.h - unscaledPrevHeight;
380
- } else {
381
- if (unscaledPrevGrowY) {
382
- growY = 0;
383
- }
317
+ if (isEmpty) {
318
+ return nextProps.growY !== 0 ? { ...next, props: { ...nextProps, growY: 0 } } : void 0;
384
319
  }
385
- if (growY !== null) {
386
- const unscaledNextWidth = next.props.w / next.props.scale;
320
+ const unscaledPrev = getUnscaledGeoProps(prevProps);
321
+ const unscaledLabelSize = getUnscaledLabelSize(this.editor, next);
322
+ const { scale } = nextProps;
323
+ if (wasEmpty && !isEmpty) {
324
+ const expanded = expandShapeForFirstLabel(unscaledPrev.w, unscaledPrev.h, unscaledLabelSize);
387
325
  return {
388
326
  ...next,
389
327
  props: {
390
- ...next.props,
391
- // Scale the results
392
- growY: growY * next.props.scale,
393
- w: Math.max(unscaledNextWidth, unscaledNextLabelSize.w) * next.props.scale
328
+ ...nextProps,
329
+ w: expanded.w * scale,
330
+ h: expanded.h * scale,
331
+ growY: 0
394
332
  }
395
333
  };
396
334
  }
397
- if (unscaledNextLabelSize.w > unscaledPrevWidth) {
335
+ const unscaledNextW = next.props.w / scale;
336
+ const needsWidthExpand = unscaledLabelSize.w > unscaledNextW;
337
+ const unscaledGrowY = calculateGrowY(unscaledPrev.h, unscaledLabelSize.h, unscaledPrev.growY);
338
+ if (unscaledGrowY !== null || needsWidthExpand) {
398
339
  return {
399
340
  ...next,
400
341
  props: {
401
- ...next.props,
402
- // Scale the results
403
- w: unscaledNextLabelSize.w * next.props.scale
342
+ ...nextProps,
343
+ growY: (unscaledGrowY ?? unscaledPrev.growY) * scale,
344
+ w: Math.max(unscaledNextW, unscaledLabelSize.w) * scale
404
345
  }
405
346
  };
406
347
  }
407
348
  }
408
349
  onDoubleClick(shape) {
409
- if (this.editor.inputs.altKey) {
350
+ if (this.editor.inputs.getAltKey()) {
410
351
  switch (shape.props.geo) {
411
352
  case "rectangle": {
412
353
  return {
@@ -437,24 +378,87 @@ class GeoShapeUtil extends import_editor.BaseBoxShapeUtil {
437
378
  };
438
379
  }
439
380
  }
440
- const minWidths = {
381
+ const MIN_WIDTHS = Object.freeze({
441
382
  s: 12,
442
383
  m: 14,
443
384
  l: 16,
444
385
  xl: 20
445
- };
446
- const extraPaddings = {
386
+ });
387
+ const EXTRA_PADDINGS = Object.freeze({
447
388
  s: 2,
448
389
  m: 3.5,
449
390
  l: 5,
450
391
  xl: 10
451
- };
392
+ });
393
+ const EMPTY_LABEL_SIZE = Object.freeze({ w: 0, h: 0 });
394
+ const LABEL_EDGE_MARGIN = 8;
395
+ function getLabelBounds(unscaledShapeW, unscaledShapeH, unscaledLabelSize, size, align, verticalAlign, scale) {
396
+ const unscaledMinWidth = Math.min(100, unscaledShapeW / 2);
397
+ const unscaledMinHeight = Math.min(
398
+ import_default_shape_constants.LABEL_FONT_SIZES[size] * import_default_shape_constants.TEXT_PROPS.lineHeight + import_default_shape_constants.LABEL_PADDING * 2,
399
+ unscaledShapeH / 2
400
+ );
401
+ const unscaledLabelW = Math.min(
402
+ unscaledShapeW,
403
+ Math.max(
404
+ unscaledLabelSize.w,
405
+ Math.min(unscaledMinWidth, Math.max(1, unscaledShapeW - LABEL_EDGE_MARGIN))
406
+ )
407
+ );
408
+ const unscaledLabelH = Math.min(
409
+ unscaledShapeH,
410
+ Math.max(
411
+ unscaledLabelSize.h,
412
+ Math.min(unscaledMinHeight, Math.max(1, unscaledShapeH - LABEL_EDGE_MARGIN))
413
+ )
414
+ );
415
+ const unscaledX = align === "start" ? 0 : align === "end" ? unscaledShapeW - unscaledLabelW : (unscaledShapeW - unscaledLabelW) / 2;
416
+ const unscaledY = verticalAlign === "start" ? 0 : verticalAlign === "end" ? unscaledShapeH - unscaledLabelH : (unscaledShapeH - unscaledLabelH) / 2;
417
+ return {
418
+ x: unscaledX * scale,
419
+ y: unscaledY * scale,
420
+ width: unscaledLabelW * scale,
421
+ height: unscaledLabelH * scale
422
+ };
423
+ }
424
+ function getUnscaledGeoProps(props) {
425
+ const { w, h, growY, scale } = props;
426
+ return {
427
+ w: w / scale,
428
+ h: h / scale,
429
+ growY: growY / scale
430
+ };
431
+ }
432
+ function calculateGrowY(unscaledShapeH, unscaledLabelH, unscaledCurrentGrowY) {
433
+ if (unscaledLabelH > unscaledShapeH) {
434
+ return unscaledLabelH - unscaledShapeH;
435
+ }
436
+ if (unscaledCurrentGrowY > 0) {
437
+ return 0;
438
+ }
439
+ return null;
440
+ }
441
+ function expandShapeForFirstLabel(unscaledW, unscaledH, unscaledLabelSize) {
442
+ let w = Math.max(unscaledW, unscaledLabelSize.w);
443
+ let h = Math.max(unscaledH, unscaledLabelSize.h);
444
+ if (unscaledW < MIN_SIZE_WITH_LABEL && unscaledH < MIN_SIZE_WITH_LABEL) {
445
+ w = Math.max(w, MIN_SIZE_WITH_LABEL);
446
+ h = Math.max(h, MIN_SIZE_WITH_LABEL);
447
+ const maxDim = Math.max(w, h);
448
+ w = maxDim;
449
+ h = maxDim;
450
+ }
451
+ return { w, h };
452
+ }
453
+ const labelSizesForGeo = new import_editor.WeakCache();
452
454
  function getUnscaledLabelSize(editor, shape) {
455
+ return labelSizesForGeo.get(shape, () => {
456
+ return measureUnscaledLabelSize(editor, shape);
457
+ });
458
+ }
459
+ function measureUnscaledLabelSize(editor, shape) {
453
460
  const { richText, font, size, w } = shape.props;
454
- if (!richText || (0, import_richText.isEmptyRichText)(richText)) {
455
- return { w: 0, h: 0 };
456
- }
457
- const minWidth = minWidths[size];
461
+ const minWidth = MIN_WIDTHS[size];
458
462
  const html = (0, import_richText.renderHtmlFromRichTextForMeasurement)(editor, richText);
459
463
  const textSize = editor.textMeasure.measureHtml(html, {
460
464
  ...import_default_shape_constants.TEXT_PROPS,
@@ -465,7 +469,7 @@ function getUnscaledLabelSize(editor, shape) {
465
469
  // Guard because a DOM nodes can't be less 0
466
470
  0,
467
471
  // A 'w' width that we're setting as the min-width
468
- Math.ceil(minWidth + extraPaddings[size]),
472
+ Math.ceil(minWidth + EXTRA_PADDINGS[size]),
469
473
  // The actual text size
470
474
  Math.ceil(w / shape.props.scale - import_default_shape_constants.LABEL_PADDING * 2)
471
475
  )
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/shapes/geo/GeoShapeUtil.tsx"],
4
- "sourcesContent": ["/* eslint-disable react-hooks/rules-of-hooks */\nimport {\n\tBaseBoxShapeUtil,\n\tBox,\n\tEMPTY_ARRAY,\n\tEditor,\n\tGroup2d,\n\tHTMLContainer,\n\tHandleSnapGeometry,\n\tRectangle2d,\n\tSVGContainer,\n\tSvgExportContext,\n\tTLGeoShape,\n\tTLGeoShapeProps,\n\tTLResizeInfo,\n\tTLShapeUtilCanvasSvgDef,\n\tVec,\n\texhaustiveSwitchError,\n\tgeoShapeMigrations,\n\tgeoShapeProps,\n\tgetColorValue,\n\tgetDefaultColorTheme,\n\tgetFontsFromRichText,\n\tisEqual,\n\tlerp,\n\ttoRichText,\n\tuseValue,\n} from '@tldraw/editor'\nimport {\n\tisEmptyRichText,\n\trenderHtmlFromRichTextForMeasurement,\n\trenderPlaintextFromRichText,\n} from '../../utils/text/richText'\nimport { HyperlinkButton } from '../shared/HyperlinkButton'\nimport { RichTextLabel, RichTextSVG } from '../shared/RichTextLabel'\nimport {\n\tFONT_FAMILIES,\n\tLABEL_FONT_SIZES,\n\tLABEL_PADDING,\n\tSTROKE_SIZES,\n\tTEXT_PROPS,\n} from '../shared/default-shape-constants'\nimport { getFillDefForCanvas, getFillDefForExport } from '../shared/defaultStyleDefs'\nimport { useDefaultColorTheme } from '../shared/useDefaultColorTheme'\nimport { useIsReadyForEditing } from '../shared/useEditablePlainText'\nimport { GeoShapeBody } from './components/GeoShapeBody'\nimport { getGeoShapePath } from './getGeoShapePath'\n\nconst MIN_SIZE_WITH_LABEL = 17 * 3\n\n/** @public */\nexport class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {\n\tstatic override type = 'geo' as const\n\tstatic override props = geoShapeProps\n\tstatic override migrations = geoShapeMigrations\n\n\toverride canEdit() {\n\t\treturn true\n\t}\n\n\toverride getDefaultProps(): TLGeoShape['props'] {\n\t\treturn {\n\t\t\tw: 100,\n\t\t\th: 100,\n\t\t\tgeo: 'rectangle',\n\t\t\tdash: 'draw',\n\t\t\tgrowY: 0,\n\t\t\turl: '',\n\t\t\tscale: 1,\n\n\t\t\t// Text properties\n\t\t\tcolor: 'black',\n\t\t\tlabelColor: 'black',\n\t\t\tfill: 'none',\n\t\t\tsize: 'm',\n\t\t\tfont: 'draw',\n\t\t\talign: 'middle',\n\t\t\tverticalAlign: 'middle',\n\t\t\trichText: toRichText(''),\n\t\t}\n\t}\n\n\toverride getGeometry(shape: TLGeoShape) {\n\t\tconst w = Math.max(1, shape.props.w)\n\t\tconst h = Math.max(1, shape.props.h + shape.props.growY)\n\n\t\tconst path = getGeoShapePath(shape)\n\t\tconst unscaledlabelSize = getUnscaledLabelSize(this.editor, shape)\n\t\t// unscaled w and h\n\t\tconst unscaledW = w / shape.props.scale\n\t\tconst unscaledH = h / shape.props.scale\n\t\tconst unscaledminWidth = Math.min(100, unscaledW / 2)\n\t\tconst unscaledMinHeight = Math.min(\n\t\t\tLABEL_FONT_SIZES[shape.props.size] * TEXT_PROPS.lineHeight + LABEL_PADDING * 2,\n\t\t\tunscaledH / 2\n\t\t)\n\n\t\tconst unscaledLabelWidth = Math.min(\n\t\t\tunscaledW,\n\t\t\tMath.max(unscaledlabelSize.w, Math.min(unscaledminWidth, Math.max(1, unscaledW - 8)))\n\t\t)\n\t\tconst unscaledLabelHeight = Math.min(\n\t\t\tunscaledH,\n\t\t\tMath.max(unscaledlabelSize.h, Math.min(unscaledMinHeight, Math.max(1, unscaledH - 8)))\n\t\t)\n\n\t\t// todo: use centroid for label position\n\n\t\treturn new Group2d({\n\t\t\tchildren: [\n\t\t\t\tpath.toGeometry(),\n\t\t\t\tnew Rectangle2d({\n\t\t\t\t\tx:\n\t\t\t\t\t\tshape.props.align === 'start'\n\t\t\t\t\t\t\t? 0\n\t\t\t\t\t\t\t: shape.props.align === 'end'\n\t\t\t\t\t\t\t\t? (unscaledW - unscaledLabelWidth) * shape.props.scale\n\t\t\t\t\t\t\t\t: ((unscaledW - unscaledLabelWidth) / 2) * shape.props.scale,\n\t\t\t\t\ty:\n\t\t\t\t\t\tshape.props.verticalAlign === 'start'\n\t\t\t\t\t\t\t? 0\n\t\t\t\t\t\t\t: shape.props.verticalAlign === 'end'\n\t\t\t\t\t\t\t\t? (unscaledH - unscaledLabelHeight) * shape.props.scale\n\t\t\t\t\t\t\t\t: ((unscaledH - unscaledLabelHeight) / 2) * shape.props.scale,\n\t\t\t\t\twidth: unscaledLabelWidth * shape.props.scale,\n\t\t\t\t\theight: unscaledLabelHeight * shape.props.scale,\n\t\t\t\t\tisFilled: true,\n\t\t\t\t\tisLabel: true,\n\t\t\t\t\texcludeFromShapeBounds: true,\n\t\t\t\t\tisEmptyLabel: isEmptyRichText(shape.props.richText),\n\t\t\t\t}),\n\t\t\t],\n\t\t})\n\t}\n\n\toverride getHandleSnapGeometry(shape: TLGeoShape): HandleSnapGeometry {\n\t\tconst geometry = this.getGeometry(shape)\n\t\t// we only want to snap handles to the outline of the shape - not to its label etc.\n\t\tconst outline = geometry.children[0]\n\t\tswitch (shape.props.geo) {\n\t\t\tcase 'arrow-down':\n\t\t\tcase 'arrow-left':\n\t\t\tcase 'arrow-right':\n\t\t\tcase 'arrow-up':\n\t\t\tcase 'check-box':\n\t\t\tcase 'diamond':\n\t\t\tcase 'hexagon':\n\t\t\tcase 'octagon':\n\t\t\tcase 'pentagon':\n\t\t\tcase 'rectangle':\n\t\t\tcase 'rhombus':\n\t\t\tcase 'rhombus-2':\n\t\t\tcase 'star':\n\t\t\tcase 'trapezoid':\n\t\t\tcase 'triangle':\n\t\t\tcase 'x-box':\n\t\t\t\t// poly-line type shapes hand snap points for each vertex & the center\n\t\t\t\treturn { outline: outline, points: [...outline.vertices, geometry.bounds.center] }\n\t\t\tcase 'cloud':\n\t\t\tcase 'ellipse':\n\t\t\tcase 'heart':\n\t\t\tcase 'oval':\n\t\t\t\t// blobby shapes only have a snap point in their center\n\t\t\t\treturn { outline: outline, points: [geometry.bounds.center] }\n\t\t\tdefault:\n\t\t\t\texhaustiveSwitchError(shape.props.geo)\n\t\t}\n\t}\n\n\toverride getText(shape: TLGeoShape) {\n\t\treturn renderPlaintextFromRichText(this.editor, shape.props.richText)\n\t}\n\n\toverride getFontFaces(shape: TLGeoShape) {\n\t\tif (isEmptyRichText(shape.props.richText)) {\n\t\t\treturn EMPTY_ARRAY\n\t\t}\n\t\treturn getFontsFromRichText(this.editor, shape.props.richText, {\n\t\t\tfamily: `tldraw_${shape.props.font}`,\n\t\t\tweight: 'normal',\n\t\t\tstyle: 'normal',\n\t\t})\n\t}\n\n\tcomponent(shape: TLGeoShape) {\n\t\tconst { id, type, props } = shape\n\t\tconst { fill, font, align, verticalAlign, size, richText } = props\n\t\tconst theme = useDefaultColorTheme()\n\t\tconst { editor } = this\n\t\tconst isOnlySelected = useValue(\n\t\t\t'isGeoOnlySelected',\n\t\t\t() => shape.id === editor.getOnlySelectedShapeId(),\n\t\t\t[editor]\n\t\t)\n\t\tconst isReadyForEditing = useIsReadyForEditing(editor, shape.id)\n\t\tconst isEmpty = isEmptyRichText(shape.props.richText)\n\t\tconst showHtmlContainer = isReadyForEditing || !isEmpty\n\t\tconst isForceSolid = useValue('force solid', () => editor.getZoomLevel() < 0.2, [editor])\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<SVGContainer>\n\t\t\t\t\t<GeoShapeBody shape={shape} shouldScale={true} forceSolid={isForceSolid} />\n\t\t\t\t</SVGContainer>\n\t\t\t\t{showHtmlContainer && (\n\t\t\t\t\t<HTMLContainer\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t\twidth: shape.props.w,\n\t\t\t\t\t\t\theight: shape.props.h + props.growY,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<RichTextLabel\n\t\t\t\t\t\t\tshapeId={id}\n\t\t\t\t\t\t\ttype={type}\n\t\t\t\t\t\t\tfont={font}\n\t\t\t\t\t\t\tfontSize={LABEL_FONT_SIZES[size] * shape.props.scale}\n\t\t\t\t\t\t\tlineHeight={TEXT_PROPS.lineHeight}\n\t\t\t\t\t\t\tpadding={LABEL_PADDING * shape.props.scale}\n\t\t\t\t\t\t\tfill={fill}\n\t\t\t\t\t\t\talign={align}\n\t\t\t\t\t\t\tverticalAlign={verticalAlign}\n\t\t\t\t\t\t\trichText={richText}\n\t\t\t\t\t\t\tisSelected={isOnlySelected}\n\t\t\t\t\t\t\tlabelColor={getColorValue(theme, props.labelColor, 'solid')}\n\t\t\t\t\t\t\twrap\n\t\t\t\t\t\t/>\n\t\t\t\t\t</HTMLContainer>\n\t\t\t\t)}\n\t\t\t\t{shape.props.url && <HyperlinkButton url={shape.props.url} />}\n\t\t\t</>\n\t\t)\n\t}\n\n\tindicator(shape: TLGeoShape) {\n\t\tconst isZoomedOut = useValue('isZoomedOut', () => this.editor.getZoomLevel() < 0.25, [\n\t\t\tthis.editor,\n\t\t])\n\n\t\tconst { size, dash, scale } = shape.props\n\t\tconst strokeWidth = STROKE_SIZES[size]\n\n\t\tconst path = getGeoShapePath(shape)\n\n\t\treturn path.toSvg({\n\t\t\tstyle: dash === 'draw' ? 'draw' : 'solid',\n\t\t\tstrokeWidth: 1,\n\t\t\tpasses: 1,\n\t\t\trandomSeed: shape.id,\n\t\t\toffset: 0,\n\t\t\troundness: strokeWidth * 2 * scale,\n\t\t\tprops: { strokeWidth: undefined },\n\t\t\tforceSolid: isZoomedOut,\n\t\t})\n\t}\n\n\toverride toSvg(shape: TLGeoShape, ctx: SvgExportContext) {\n\t\tconst scale = shape.props.scale\n\t\t// We need to scale the shape to 1x for export\n\t\tconst newShape = {\n\t\t\t...shape,\n\t\t\tprops: {\n\t\t\t\t...shape.props,\n\t\t\t\tw: shape.props.w / scale,\n\t\t\t\th: (shape.props.h + shape.props.growY) / scale,\n\t\t\t\tgrowY: 0, // growY throws off the path calculations, so we set it to 0\n\t\t\t},\n\t\t}\n\t\tconst props = newShape.props\n\t\tctx.addExportDef(getFillDefForExport(props.fill))\n\n\t\tlet textEl\n\t\tif (!isEmptyRichText(props.richText)) {\n\t\t\tconst theme = getDefaultColorTheme(ctx)\n\t\t\tconst bounds = new Box(0, 0, props.w, (shape.props.h + shape.props.growY) / scale)\n\t\t\ttextEl = (\n\t\t\t\t<RichTextSVG\n\t\t\t\t\tfontSize={LABEL_FONT_SIZES[props.size]}\n\t\t\t\t\tfont={props.font}\n\t\t\t\t\talign={props.align}\n\t\t\t\t\tverticalAlign={props.verticalAlign}\n\t\t\t\t\trichText={props.richText}\n\t\t\t\t\tlabelColor={getColorValue(theme, props.labelColor, 'solid')}\n\t\t\t\t\tbounds={bounds}\n\t\t\t\t\tpadding={LABEL_PADDING}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<GeoShapeBody shouldScale={false} shape={newShape} forceSolid={false} />\n\t\t\t\t{textEl}\n\t\t\t</>\n\t\t)\n\t}\n\n\toverride getCanvasSvgDefs(): TLShapeUtilCanvasSvgDef[] {\n\t\treturn [getFillDefForCanvas()]\n\t}\n\n\toverride onResize(\n\t\tshape: TLGeoShape,\n\t\t{ handle, newPoint, scaleX, scaleY, initialShape }: TLResizeInfo<TLGeoShape>\n\t) {\n\t\tconst unscaledInitialW = initialShape.props.w / initialShape.props.scale\n\t\tconst unscaledInitialH = initialShape.props.h / initialShape.props.scale\n\t\tconst unscaledGrowY = initialShape.props.growY / initialShape.props.scale\n\t\t// use the w/h from props here instead of the initialBounds here,\n\t\t// since cloud shapes calculated bounds can differ from the props w/h.\n\t\tlet unscaledW = unscaledInitialW * scaleX\n\t\tlet unscaledH = (unscaledInitialH + unscaledGrowY) * scaleY\n\t\tlet overShrinkX = 0\n\t\tlet overShrinkY = 0\n\n\t\tconst min = MIN_SIZE_WITH_LABEL\n\n\t\tif (!isEmptyRichText(shape.props.richText)) {\n\t\t\tlet newW = Math.max(Math.abs(unscaledW), min)\n\t\t\tlet newH = Math.max(Math.abs(unscaledH), min)\n\n\t\t\tif (newW < min && newH === min) newW = min\n\t\t\tif (newW === min && newH < min) newH = min\n\n\t\t\tconst unscaledLabelSize = getUnscaledLabelSize(this.editor, {\n\t\t\t\t...shape,\n\t\t\t\tprops: {\n\t\t\t\t\t...shape.props,\n\t\t\t\t\tw: newW * shape.props.scale,\n\t\t\t\t\th: newH * shape.props.scale,\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tconst nextW = Math.max(Math.abs(unscaledW), unscaledLabelSize.w) * Math.sign(unscaledW)\n\t\t\tconst nextH = Math.max(Math.abs(unscaledH), unscaledLabelSize.h) * Math.sign(unscaledH)\n\t\t\toverShrinkX = Math.abs(nextW) - Math.abs(unscaledW)\n\t\t\toverShrinkY = Math.abs(nextH) - Math.abs(unscaledH)\n\n\t\t\tunscaledW = nextW\n\t\t\tunscaledH = nextH\n\t\t}\n\n\t\tconst scaledW = unscaledW * shape.props.scale\n\t\tconst scaledH = unscaledH * shape.props.scale\n\n\t\tconst offset = new Vec(0, 0)\n\n\t\t// x offsets\n\n\t\tif (scaleX < 0) {\n\t\t\toffset.x += scaledW\n\t\t}\n\n\t\tif (handle === 'left' || handle === 'top_left' || handle === 'bottom_left') {\n\t\t\toffset.x += scaleX < 0 ? overShrinkX : -overShrinkX\n\t\t}\n\n\t\t// y offsets\n\n\t\tif (scaleY < 0) {\n\t\t\toffset.y += scaledH\n\t\t}\n\n\t\tif (handle === 'top' || handle === 'top_left' || handle === 'top_right') {\n\t\t\toffset.y += scaleY < 0 ? overShrinkY : -overShrinkY\n\t\t}\n\n\t\tconst { x, y } = offset.rot(shape.rotation).add(newPoint)\n\n\t\treturn {\n\t\t\tx,\n\t\t\ty,\n\t\t\tprops: {\n\t\t\t\tw: Math.max(Math.abs(scaledW), 1),\n\t\t\t\th: Math.max(Math.abs(scaledH), 1),\n\t\t\t\tgrowY: 0,\n\t\t\t},\n\t\t}\n\t}\n\n\toverride onBeforeCreate(shape: TLGeoShape) {\n\t\tif (isEmptyRichText(shape.props.richText)) {\n\t\t\tif (shape.props.growY) {\n\t\t\t\t// No text / some growY, set growY to 0\n\t\t\t\treturn {\n\t\t\t\t\t...shape,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...shape.props,\n\t\t\t\t\t\tgrowY: 0,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// No text / no growY, nothing to change\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tconst unscaledPrevHeight = shape.props.h / shape.props.scale\n\t\tconst unscaledNextHeight = getUnscaledLabelSize(this.editor, shape).h\n\n\t\tlet growY: number | null = null\n\n\t\tif (unscaledNextHeight > unscaledPrevHeight) {\n\t\t\tgrowY = unscaledNextHeight - unscaledPrevHeight\n\t\t} else {\n\t\t\tif (shape.props.growY) {\n\t\t\t\tgrowY = 0\n\t\t\t}\n\t\t}\n\n\t\tif (growY !== null) {\n\t\t\treturn {\n\t\t\t\t...shape,\n\t\t\t\tprops: {\n\t\t\t\t\t...shape.props,\n\t\t\t\t\t// scale the growY\n\t\t\t\t\tgrowY: growY * shape.props.scale,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n\n\toverride onBeforeUpdate(prev: TLGeoShape, next: TLGeoShape) {\n\t\t// No change to text, font, or size, no need to update update\n\t\tif (\n\t\t\tisEqual(prev.props.richText, next.props.richText) &&\n\t\t\tprev.props.font === next.props.font &&\n\t\t\tprev.props.size === next.props.size\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\t// If we got rid of the text, cancel out any growY from the prev text\n\t\tconst wasEmpty = isEmptyRichText(prev.props.richText)\n\t\tconst isEmpty = isEmptyRichText(next.props.richText)\n\t\tif (!wasEmpty && isEmpty) {\n\t\t\treturn {\n\t\t\t\t...next,\n\t\t\t\tprops: {\n\t\t\t\t\t...next.props,\n\t\t\t\t\tgrowY: 0,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\t// Get the prev width and height in unscaled values\n\t\tconst unscaledPrevWidth = prev.props.w / prev.props.scale\n\t\tconst unscaledPrevHeight = prev.props.h / prev.props.scale\n\t\tconst unscaledPrevGrowY = prev.props.growY / prev.props.scale\n\n\t\t// Get the next width and height in unscaled values\n\t\tconst unscaledNextLabelSize = getUnscaledLabelSize(this.editor, next)\n\n\t\t// When entering the first character in a label (not pasting in multiple characters...)\n\t\tif (wasEmpty && !isEmpty && renderPlaintextFromRichText(this.editor, next.props.richText)) {\n\t\t\tlet unscaledW = Math.max(unscaledPrevWidth, unscaledNextLabelSize.w)\n\t\t\tlet unscaledH = Math.max(unscaledPrevHeight, unscaledNextLabelSize.h)\n\n\t\t\tconst min = MIN_SIZE_WITH_LABEL\n\n\t\t\t// If both the width and height were less than the minimum size, make the shape square\n\t\t\tif (unscaledPrevWidth < min && unscaledPrevHeight < min) {\n\t\t\t\tunscaledW = Math.max(unscaledW, min)\n\t\t\t\tunscaledH = Math.max(unscaledH, min)\n\t\t\t\tunscaledW = Math.max(unscaledW, unscaledH)\n\t\t\t\tunscaledH = Math.max(unscaledW, unscaledH)\n\t\t\t}\n\n\t\t\t// Don't set a growY\u2014at least, not until we've implemented a growX property\n\t\t\treturn {\n\t\t\t\t...next,\n\t\t\t\tprops: {\n\t\t\t\t\t...next.props,\n\t\t\t\t\t// Scale the results\n\t\t\t\t\tw: unscaledW * next.props.scale,\n\t\t\t\t\th: unscaledH * next.props.scale,\n\t\t\t\t\tgrowY: 0,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tlet growY: number | null = null\n\n\t\tif (unscaledNextLabelSize.h > unscaledPrevHeight) {\n\t\t\tgrowY = unscaledNextLabelSize.h - unscaledPrevHeight\n\t\t} else {\n\t\t\tif (unscaledPrevGrowY) {\n\t\t\t\tgrowY = 0\n\t\t\t}\n\t\t}\n\n\t\tif (growY !== null) {\n\t\t\tconst unscaledNextWidth = next.props.w / next.props.scale\n\t\t\treturn {\n\t\t\t\t...next,\n\t\t\t\tprops: {\n\t\t\t\t\t...next.props,\n\t\t\t\t\t// Scale the results\n\t\t\t\t\tgrowY: growY * next.props.scale,\n\t\t\t\t\tw: Math.max(unscaledNextWidth, unscaledNextLabelSize.w) * next.props.scale,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tif (unscaledNextLabelSize.w > unscaledPrevWidth) {\n\t\t\treturn {\n\t\t\t\t...next,\n\t\t\t\tprops: {\n\t\t\t\t\t...next.props,\n\t\t\t\t\t// Scale the results\n\t\t\t\t\tw: unscaledNextLabelSize.w * next.props.scale,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\t// otherwise, no update needed\n\t}\n\n\toverride onDoubleClick(shape: TLGeoShape) {\n\t\t// Little easter egg: double-clicking a rectangle / checkbox while\n\t\t// holding alt will toggle between check-box and rectangle\n\t\tif (this.editor.inputs.altKey) {\n\t\t\tswitch (shape.props.geo) {\n\t\t\t\tcase 'rectangle': {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...shape,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tgeo: 'check-box' as const,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcase 'check-box': {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...shape,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tgeo: 'rectangle' as const,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn\n\t}\n\toverride getInterpolatedProps(\n\t\tstartShape: TLGeoShape,\n\t\tendShape: TLGeoShape,\n\t\tt: number\n\t): TLGeoShapeProps {\n\t\treturn {\n\t\t\t...(t > 0.5 ? endShape.props : startShape.props),\n\t\t\tw: lerp(startShape.props.w, endShape.props.w, t),\n\t\t\th: lerp(startShape.props.h, endShape.props.h, t),\n\t\t\tscale: lerp(startShape.props.scale, endShape.props.scale, t),\n\t\t}\n\t}\n}\n\n// imperfect but good enough, should be the width of the W in the font / size combo\nconst minWidths = {\n\ts: 12,\n\tm: 14,\n\tl: 16,\n\txl: 20,\n}\n\nconst extraPaddings = {\n\ts: 2,\n\tm: 3.5,\n\tl: 5,\n\txl: 10,\n}\n\nfunction getUnscaledLabelSize(editor: Editor, shape: TLGeoShape) {\n\tconst { richText, font, size, w } = shape.props\n\n\tif (!richText || isEmptyRichText(richText)) {\n\t\treturn { w: 0, h: 0 }\n\t}\n\n\t// way too expensive to be recomputing on every update\n\tconst minWidth = minWidths[size]\n\n\tconst html = renderHtmlFromRichTextForMeasurement(editor, richText)\n\tconst textSize = editor.textMeasure.measureHtml(html, {\n\t\t...TEXT_PROPS,\n\t\tfontFamily: FONT_FAMILIES[font],\n\t\tfontSize: LABEL_FONT_SIZES[size],\n\t\tminWidth: minWidth,\n\t\tmaxWidth: Math.max(\n\t\t\t// Guard because a DOM nodes can't be less 0\n\t\t\t0,\n\t\t\t// A 'w' width that we're setting as the min-width\n\t\t\tMath.ceil(minWidth + extraPaddings[size]),\n\t\t\t// The actual text size\n\t\t\tMath.ceil(w / shape.props.scale - LABEL_PADDING * 2)\n\t\t),\n\t})\n\n\treturn {\n\t\tw: textSize.w + LABEL_PADDING * 2,\n\t\th: textSize.h + LABEL_PADDING * 2,\n\t}\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable react-hooks/rules-of-hooks */\nimport {\n\tBaseBoxShapeUtil,\n\tBox,\n\tEMPTY_ARRAY,\n\tEditor,\n\tGroup2d,\n\tHTMLContainer,\n\tHandleSnapGeometry,\n\tRectangle2d,\n\tSVGContainer,\n\tSvgExportContext,\n\tTLGeoShape,\n\tTLGeoShapeProps,\n\tTLResizeInfo,\n\tTLShapeUtilCanvasSvgDef,\n\tVec,\n\tWeakCache,\n\texhaustiveSwitchError,\n\tgeoShapeMigrations,\n\tgeoShapeProps,\n\tgetColorValue,\n\tgetDefaultColorTheme,\n\tgetFontsFromRichText,\n\tisEqual,\n\tlerp,\n\ttoRichText,\n\tuseValue,\n} from '@tldraw/editor'\nimport {\n\tisEmptyRichText,\n\trenderHtmlFromRichTextForMeasurement,\n\trenderPlaintextFromRichText,\n} from '../../utils/text/richText'\nimport { HyperlinkButton } from '../shared/HyperlinkButton'\nimport { RichTextLabel, RichTextSVG } from '../shared/RichTextLabel'\nimport {\n\tFONT_FAMILIES,\n\tLABEL_FONT_SIZES,\n\tLABEL_PADDING,\n\tSTROKE_SIZES,\n\tTEXT_PROPS,\n} from '../shared/default-shape-constants'\nimport { getFillDefForCanvas, getFillDefForExport } from '../shared/defaultStyleDefs'\nimport { useDefaultColorTheme } from '../shared/useDefaultColorTheme'\nimport { useIsReadyForEditing } from '../shared/useEditablePlainText'\nimport { useEfficientZoomThreshold } from '../shared/useEfficientZoomThreshold'\nimport { GeoShapeBody } from './components/GeoShapeBody'\nimport { getGeoShapePath } from './getGeoShapePath'\n\nconst MIN_SIZE_WITH_LABEL = 17 * 3\n\n/** @public */\nexport class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {\n\tstatic override type = 'geo' as const\n\tstatic override props = geoShapeProps\n\tstatic override migrations = geoShapeMigrations\n\n\toverride options = {\n\t\tshowTextOutline: true,\n\t}\n\n\toverride canEdit() {\n\t\treturn true\n\t}\n\n\toverride getDefaultProps(): TLGeoShape['props'] {\n\t\treturn {\n\t\t\tw: 100,\n\t\t\th: 100,\n\t\t\tgeo: 'rectangle',\n\t\t\tdash: 'draw',\n\t\t\tgrowY: 0,\n\t\t\turl: '',\n\t\t\tscale: 1,\n\n\t\t\t// Text properties\n\t\t\tcolor: 'black',\n\t\t\tlabelColor: 'black',\n\t\t\tfill: 'none',\n\t\t\tsize: 'm',\n\t\t\tfont: 'draw',\n\t\t\talign: 'middle',\n\t\t\tverticalAlign: 'middle',\n\t\t\trichText: toRichText(''),\n\t\t}\n\t}\n\n\toverride getGeometry(shape: TLGeoShape) {\n\t\tconst { props } = shape\n\t\tconst { scale } = props\n\t\tconst path = getGeoShapePath(shape)\n\t\tconst pathGeometry = path.toGeometry()\n\n\t\tconst scaledW = Math.max(1, props.w)\n\t\tconst scaledH = Math.max(1, props.h + props.growY)\n\t\tconst unscaledW = scaledW / scale\n\t\tconst unscaledH = scaledH / scale\n\n\t\tconst isEmptyLabel = isEmptyRichText(props.richText)\n\t\tconst unscaledLabelSize = isEmptyLabel\n\t\t\t? EMPTY_LABEL_SIZE\n\t\t\t: getUnscaledLabelSize(this.editor, shape)\n\n\t\tconst labelBounds = getLabelBounds(\n\t\t\tunscaledW,\n\t\t\tunscaledH,\n\t\t\tunscaledLabelSize,\n\t\t\tprops.size,\n\t\t\tprops.align,\n\t\t\tprops.verticalAlign,\n\t\t\tscale\n\t\t)\n\n\t\treturn new Group2d({\n\t\t\tchildren: [\n\t\t\t\tpathGeometry,\n\t\t\t\tnew Rectangle2d({\n\t\t\t\t\t...labelBounds,\n\t\t\t\t\tisFilled: true,\n\t\t\t\t\tisLabel: true,\n\t\t\t\t\texcludeFromShapeBounds: true,\n\t\t\t\t\tisEmptyLabel: isEmptyLabel,\n\t\t\t\t}),\n\t\t\t],\n\t\t})\n\t}\n\n\toverride getHandleSnapGeometry(shape: TLGeoShape): HandleSnapGeometry {\n\t\tconst geometry = this.getGeometry(shape)\n\t\t// we only want to snap handles to the outline of the shape - not to its label etc.\n\t\tconst outline = geometry.children[0]\n\t\tswitch (shape.props.geo) {\n\t\t\tcase 'arrow-down':\n\t\t\tcase 'arrow-left':\n\t\t\tcase 'arrow-right':\n\t\t\tcase 'arrow-up':\n\t\t\tcase 'check-box':\n\t\t\tcase 'diamond':\n\t\t\tcase 'hexagon':\n\t\t\tcase 'octagon':\n\t\t\tcase 'pentagon':\n\t\t\tcase 'rectangle':\n\t\t\tcase 'rhombus':\n\t\t\tcase 'rhombus-2':\n\t\t\tcase 'star':\n\t\t\tcase 'trapezoid':\n\t\t\tcase 'triangle':\n\t\t\tcase 'x-box':\n\t\t\t\t// poly-line type shapes hand snap points for each vertex & the center\n\t\t\t\treturn { outline: outline, points: [...outline.vertices, geometry.bounds.center] }\n\t\t\tcase 'cloud':\n\t\t\tcase 'ellipse':\n\t\t\tcase 'heart':\n\t\t\tcase 'oval':\n\t\t\t\t// blobby shapes only have a snap point in their center\n\t\t\t\treturn { outline: outline, points: [geometry.bounds.center] }\n\t\t\tdefault:\n\t\t\t\texhaustiveSwitchError(shape.props.geo)\n\t\t}\n\t}\n\n\toverride getText(shape: TLGeoShape) {\n\t\treturn renderPlaintextFromRichText(this.editor, shape.props.richText)\n\t}\n\n\toverride getFontFaces(shape: TLGeoShape) {\n\t\tif (isEmptyRichText(shape.props.richText)) {\n\t\t\treturn EMPTY_ARRAY\n\t\t}\n\t\treturn getFontsFromRichText(this.editor, shape.props.richText, {\n\t\t\tfamily: `tldraw_${shape.props.font}`,\n\t\t\tweight: 'normal',\n\t\t\tstyle: 'normal',\n\t\t})\n\t}\n\n\tcomponent(shape: TLGeoShape) {\n\t\tconst { id, type, props } = shape\n\t\tconst { fill, font, align, verticalAlign, size, richText } = props\n\t\tconst theme = useDefaultColorTheme()\n\t\tconst { editor } = this\n\t\tconst isOnlySelected = useValue(\n\t\t\t'isGeoOnlySelected',\n\t\t\t() => shape.id === editor.getOnlySelectedShapeId(),\n\t\t\t[editor]\n\t\t)\n\t\tconst isReadyForEditing = useIsReadyForEditing(editor, shape.id)\n\t\tconst isEmpty = isEmptyRichText(shape.props.richText)\n\t\tconst showHtmlContainer = isReadyForEditing || !isEmpty\n\t\tconst isForceSolid = useEfficientZoomThreshold(shape.props.scale * 0.25)\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<SVGContainer>\n\t\t\t\t\t<GeoShapeBody shape={shape} shouldScale={true} forceSolid={isForceSolid} />\n\t\t\t\t</SVGContainer>\n\t\t\t\t{showHtmlContainer && (\n\t\t\t\t\t<HTMLContainer\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t\twidth: shape.props.w,\n\t\t\t\t\t\t\theight: shape.props.h + props.growY,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<RichTextLabel\n\t\t\t\t\t\t\tshapeId={id}\n\t\t\t\t\t\t\ttype={type}\n\t\t\t\t\t\t\tfont={font}\n\t\t\t\t\t\t\tfontSize={LABEL_FONT_SIZES[size] * shape.props.scale}\n\t\t\t\t\t\t\tlineHeight={TEXT_PROPS.lineHeight}\n\t\t\t\t\t\t\tpadding={LABEL_PADDING * shape.props.scale}\n\t\t\t\t\t\t\tfill={fill}\n\t\t\t\t\t\t\talign={align}\n\t\t\t\t\t\t\tverticalAlign={verticalAlign}\n\t\t\t\t\t\t\trichText={richText}\n\t\t\t\t\t\t\tisSelected={isOnlySelected}\n\t\t\t\t\t\t\tlabelColor={getColorValue(theme, props.labelColor, 'solid')}\n\t\t\t\t\t\t\twrap\n\t\t\t\t\t\t\tshowTextOutline={this.options.showTextOutline}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</HTMLContainer>\n\t\t\t\t)}\n\t\t\t\t{shape.props.url && <HyperlinkButton url={shape.props.url} />}\n\t\t\t</>\n\t\t)\n\t}\n\n\tindicator(shape: TLGeoShape) {\n\t\tconst isZoomedOut = useEfficientZoomThreshold(shape.props.scale * 0.25)\n\n\t\tconst { size, dash, scale } = shape.props\n\t\tconst strokeWidth = STROKE_SIZES[size]\n\n\t\tconst path = getGeoShapePath(shape)\n\n\t\treturn path.toSvg({\n\t\t\tstyle: dash === 'draw' ? 'draw' : 'solid',\n\t\t\tstrokeWidth: 1,\n\t\t\tpasses: 1,\n\t\t\trandomSeed: shape.id,\n\t\t\toffset: 0,\n\t\t\troundness: strokeWidth * 2 * scale,\n\t\t\tprops: { strokeWidth: undefined },\n\t\t\tforceSolid: isZoomedOut,\n\t\t})\n\t}\n\n\toverride toSvg(shape: TLGeoShape, ctx: SvgExportContext) {\n\t\tconst scale = shape.props.scale\n\t\t// We need to scale the shape to 1x for export\n\t\tconst newShape = {\n\t\t\t...shape,\n\t\t\tprops: {\n\t\t\t\t...shape.props,\n\t\t\t\tw: shape.props.w / scale,\n\t\t\t\th: (shape.props.h + shape.props.growY) / scale,\n\t\t\t\tgrowY: 0, // growY throws off the path calculations, so we set it to 0\n\t\t\t},\n\t\t}\n\t\tconst props = newShape.props\n\t\tctx.addExportDef(getFillDefForExport(props.fill))\n\n\t\tlet textEl\n\t\tif (!isEmptyRichText(props.richText)) {\n\t\t\tconst theme = getDefaultColorTheme(ctx)\n\t\t\tconst bounds = new Box(0, 0, props.w, (shape.props.h + shape.props.growY) / scale)\n\t\t\ttextEl = (\n\t\t\t\t<RichTextSVG\n\t\t\t\t\tfontSize={LABEL_FONT_SIZES[props.size]}\n\t\t\t\t\tfont={props.font}\n\t\t\t\t\talign={props.align}\n\t\t\t\t\tverticalAlign={props.verticalAlign}\n\t\t\t\t\trichText={props.richText}\n\t\t\t\t\tlabelColor={getColorValue(theme, props.labelColor, 'solid')}\n\t\t\t\t\tbounds={bounds}\n\t\t\t\t\tpadding={LABEL_PADDING}\n\t\t\t\t\tshowTextOutline={this.options.showTextOutline}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<GeoShapeBody shouldScale={false} shape={newShape} forceSolid={false} />\n\t\t\t\t{textEl}\n\t\t\t</>\n\t\t)\n\t}\n\n\toverride getCanvasSvgDefs(): TLShapeUtilCanvasSvgDef[] {\n\t\treturn [getFillDefForCanvas()]\n\t}\n\n\toverride onResize(\n\t\tshape: TLGeoShape,\n\t\t{ handle, newPoint, scaleX, scaleY, initialShape }: TLResizeInfo<TLGeoShape>\n\t) {\n\t\tconst unscaledInitial = getUnscaledGeoProps(initialShape.props)\n\t\t// use the w/h from props here instead of the initialBounds here,\n\t\t// since cloud shapes calculated bounds can differ from the props w/h.\n\t\tlet unscaledW = unscaledInitial.w * scaleX\n\t\tlet unscaledH = (unscaledInitial.h + unscaledInitial.growY) * scaleY\n\t\tlet overShrinkX = 0\n\t\tlet overShrinkY = 0\n\n\t\tif (!isEmptyRichText(shape.props.richText)) {\n\t\t\t// Use initialShape for label measurement to hit the cache.\n\t\t\t// Creating a temp shape with new dimensions would break WeakCache and cause\n\t\t\t// expensive measurements on every resize frame.\n\t\t\tconst unscaledLabelSize = getUnscaledLabelSize(this.editor, initialShape)\n\n\t\t\tconst absUnscaledW = Math.abs(unscaledW)\n\t\t\tconst absUnscaledH = Math.abs(unscaledH)\n\n\t\t\t// Constrain to label size (primary constraint) and min size with label (secondary)\n\t\t\tconst constrainedW = Math.max(absUnscaledW, unscaledLabelSize.w, MIN_SIZE_WITH_LABEL)\n\t\t\tconst constrainedH = Math.max(absUnscaledH, unscaledLabelSize.h, MIN_SIZE_WITH_LABEL)\n\n\t\t\toverShrinkX = constrainedW - absUnscaledW\n\t\t\toverShrinkY = constrainedH - absUnscaledH\n\n\t\t\tunscaledW = constrainedW * Math.sign(unscaledW || 1)\n\t\t\tunscaledH = constrainedH * Math.sign(unscaledH || 1)\n\t\t}\n\n\t\tconst scaledW = unscaledW * shape.props.scale\n\t\tconst scaledH = unscaledH * shape.props.scale\n\n\t\tconst offset = new Vec(0, 0)\n\n\t\t// x offsets\n\n\t\tif (scaleX < 0) {\n\t\t\toffset.x += scaledW\n\t\t}\n\n\t\tif (handle === 'left' || handle === 'top_left' || handle === 'bottom_left') {\n\t\t\toffset.x += scaleX < 0 ? overShrinkX : -overShrinkX\n\t\t}\n\n\t\t// y offsets\n\n\t\tif (scaleY < 0) {\n\t\t\toffset.y += scaledH\n\t\t}\n\n\t\tif (handle === 'top' || handle === 'top_left' || handle === 'top_right') {\n\t\t\toffset.y += scaleY < 0 ? overShrinkY : -overShrinkY\n\t\t}\n\n\t\tconst { x, y } = offset.rot(shape.rotation).add(newPoint)\n\n\t\treturn {\n\t\t\tx,\n\t\t\ty,\n\t\t\tprops: {\n\t\t\t\tw: Math.max(Math.abs(scaledW), 1),\n\t\t\t\th: Math.max(Math.abs(scaledH), 1),\n\t\t\t\tgrowY: 0,\n\t\t\t},\n\t\t}\n\t}\n\n\toverride onBeforeCreate(shape: TLGeoShape) {\n\t\tconst { props } = shape\n\n\t\t// No text - ensure growY is 0\n\t\tif (isEmptyRichText(props.richText)) {\n\t\t\treturn props.growY !== 0 ? { ...shape, props: { ...props, growY: 0 } } : undefined\n\t\t}\n\n\t\t// Has text - calculate growY needed to fit label\n\t\tconst unscaledShapeH = props.h / props.scale\n\t\tconst unscaledLabelH = getUnscaledLabelSize(this.editor, shape).h\n\t\tconst unscaledGrowY = calculateGrowY(unscaledShapeH, unscaledLabelH, props.growY / props.scale)\n\n\t\tif (unscaledGrowY !== null) {\n\t\t\treturn {\n\t\t\t\t...shape,\n\t\t\t\tprops: { ...props, growY: unscaledGrowY * props.scale },\n\t\t\t}\n\t\t}\n\t}\n\n\toverride onBeforeUpdate(prev: TLGeoShape, next: TLGeoShape) {\n\t\tconst { props: prevProps } = prev\n\t\tconst { props: nextProps } = next\n\n\t\t// No change to text, font, or size - no update needed\n\t\tif (\n\t\t\tisEqual(prevProps.richText, nextProps.richText) &&\n\t\t\tprevProps.font === nextProps.font &&\n\t\t\tprevProps.size === nextProps.size\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\tconst wasEmpty = isEmptyRichText(prevProps.richText)\n\t\tconst isEmpty = isEmptyRichText(nextProps.richText)\n\n\t\t// If label is empty and used to be empty, skip label measurement and dimension adjustment\n\t\tif (wasEmpty && isEmpty) {\n\t\t\treturn\n\t\t}\n\n\t\t// Text was removed - reset growY\n\t\tif (isEmpty) {\n\t\t\treturn nextProps.growY !== 0 ? { ...next, props: { ...nextProps, growY: 0 } } : undefined\n\t\t}\n\n\t\tconst unscaledPrev = getUnscaledGeoProps(prevProps)\n\t\tconst unscaledLabelSize = getUnscaledLabelSize(this.editor, next)\n\t\tconst { scale } = nextProps\n\n\t\t// Text was added for the first time - expand shape to fit (if wasEmpty and now there's text...\n\t\t// It might be just whitespace but it is faster to assume that it is NOT just whitespace and expand\n\t\t// the shape in either case (a label with just spaces text will be less performant but that's acceptable)\n\t\tif (wasEmpty && !isEmpty) {\n\t\t\tconst expanded = expandShapeForFirstLabel(unscaledPrev.w, unscaledPrev.h, unscaledLabelSize)\n\t\t\treturn {\n\t\t\t\t...next,\n\t\t\t\tprops: {\n\t\t\t\t\t...nextProps,\n\t\t\t\t\tw: expanded.w * scale,\n\t\t\t\t\th: expanded.h * scale,\n\t\t\t\t\tgrowY: 0,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\t// Text was modified - adjust dimensions to fit new label\n\t\tconst unscaledNextW = next.props.w / scale\n\t\tconst needsWidthExpand = unscaledLabelSize.w > unscaledNextW\n\t\tconst unscaledGrowY = calculateGrowY(unscaledPrev.h, unscaledLabelSize.h, unscaledPrev.growY)\n\n\t\tif (unscaledGrowY !== null || needsWidthExpand) {\n\t\t\treturn {\n\t\t\t\t...next,\n\t\t\t\tprops: {\n\t\t\t\t\t...nextProps,\n\t\t\t\t\tgrowY: (unscaledGrowY ?? unscaledPrev.growY) * scale,\n\t\t\t\t\tw: Math.max(unscaledNextW, unscaledLabelSize.w) * scale,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n\n\toverride onDoubleClick(shape: TLGeoShape) {\n\t\t// Little easter egg: double-clicking a rectangle / checkbox while\n\t\t// holding alt will toggle between check-box and rectangle\n\t\tif (this.editor.inputs.getAltKey()) {\n\t\t\tswitch (shape.props.geo) {\n\t\t\t\tcase 'rectangle': {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...shape,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tgeo: 'check-box' as const,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcase 'check-box': {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...shape,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tgeo: 'rectangle' as const,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn\n\t}\n\toverride getInterpolatedProps(\n\t\tstartShape: TLGeoShape,\n\t\tendShape: TLGeoShape,\n\t\tt: number\n\t): TLGeoShapeProps {\n\t\treturn {\n\t\t\t...(t > 0.5 ? endShape.props : startShape.props),\n\t\t\tw: lerp(startShape.props.w, endShape.props.w, t),\n\t\t\th: lerp(startShape.props.h, endShape.props.h, t),\n\t\t\tscale: lerp(startShape.props.scale, endShape.props.scale, t),\n\t\t}\n\t}\n}\n\n// imperfect but good enough, should be the width of the W in the font / size combo\nconst MIN_WIDTHS = Object.freeze({\n\ts: 12,\n\tm: 14,\n\tl: 16,\n\txl: 20,\n})\n\nconst EXTRA_PADDINGS = Object.freeze({\n\ts: 2,\n\tm: 3.5,\n\tl: 5,\n\txl: 10,\n})\n\nconst EMPTY_LABEL_SIZE = Object.freeze({ w: 0, h: 0 })\n\n// Margin between label edge and shape edge (in unscaled units)\nconst LABEL_EDGE_MARGIN = 8\n\n/** Calculate label bounds for hit testing */\nfunction getLabelBounds(\n\tunscaledShapeW: number,\n\tunscaledShapeH: number,\n\tunscaledLabelSize: { w: number; h: number },\n\tsize: TLGeoShapeProps['size'],\n\talign: TLGeoShapeProps['align'],\n\tverticalAlign: TLGeoShapeProps['verticalAlign'],\n\tscale: number\n): { x: number; y: number; width: number; height: number } {\n\t// Calculate minimum label dimensions based on font size and shape size\n\tconst unscaledMinWidth = Math.min(100, unscaledShapeW / 2)\n\tconst unscaledMinHeight = Math.min(\n\t\tLABEL_FONT_SIZES[size] * TEXT_PROPS.lineHeight + LABEL_PADDING * 2,\n\t\tunscaledShapeH / 2\n\t)\n\n\t// Label dimensions: at least the measured size, but constrained to shape bounds\n\tconst unscaledLabelW = Math.min(\n\t\tunscaledShapeW,\n\t\tMath.max(\n\t\t\tunscaledLabelSize.w,\n\t\t\tMath.min(unscaledMinWidth, Math.max(1, unscaledShapeW - LABEL_EDGE_MARGIN))\n\t\t)\n\t)\n\tconst unscaledLabelH = Math.min(\n\t\tunscaledShapeH,\n\t\tMath.max(\n\t\t\tunscaledLabelSize.h,\n\t\t\tMath.min(unscaledMinHeight, Math.max(1, unscaledShapeH - LABEL_EDGE_MARGIN))\n\t\t)\n\t)\n\n\t// Calculate position based on alignment\n\tconst unscaledX =\n\t\talign === 'start'\n\t\t\t? 0\n\t\t\t: align === 'end'\n\t\t\t\t? unscaledShapeW - unscaledLabelW\n\t\t\t\t: (unscaledShapeW - unscaledLabelW) / 2\n\n\tconst unscaledY =\n\t\tverticalAlign === 'start'\n\t\t\t? 0\n\t\t\t: verticalAlign === 'end'\n\t\t\t\t? unscaledShapeH - unscaledLabelH\n\t\t\t\t: (unscaledShapeH - unscaledLabelH) / 2\n\n\treturn {\n\t\tx: unscaledX * scale,\n\t\ty: unscaledY * scale,\n\t\twidth: unscaledLabelW * scale,\n\t\theight: unscaledLabelH * scale,\n\t}\n}\n\n/** Get the unscaled dimensions from a geo shape's props */\nfunction getUnscaledGeoProps(props: TLGeoShapeProps) {\n\tconst { w, h, growY, scale } = props\n\treturn {\n\t\tw: w / scale,\n\t\th: h / scale,\n\t\tgrowY: growY / scale,\n\t}\n}\n\n/**\n * Calculate the growY needed to fit a label within a shape.\n * Returns null if no change is needed, otherwise returns the new unscaled growY value.\n */\nfunction calculateGrowY(\n\tunscaledShapeH: number,\n\tunscaledLabelH: number,\n\tunscaledCurrentGrowY: number\n): number | null {\n\tif (unscaledLabelH > unscaledShapeH) {\n\t\t// Label is taller than shape - need to grow\n\t\treturn unscaledLabelH - unscaledShapeH\n\t}\n\tif (unscaledCurrentGrowY > 0) {\n\t\t// Label fits and we have existing growY - reset it\n\t\treturn 0\n\t}\n\t// No change needed\n\treturn null\n}\n\n/**\n * Calculate expanded dimensions when adding a label to a shape for the first time.\n * Ensures the shape meets minimum size requirements and is square if originally small.\n */\nfunction expandShapeForFirstLabel(\n\tunscaledW: number,\n\tunscaledH: number,\n\tunscaledLabelSize: { w: number; h: number }\n): { w: number; h: number } {\n\tlet w = Math.max(unscaledW, unscaledLabelSize.w)\n\tlet h = Math.max(unscaledH, unscaledLabelSize.h)\n\n\t// If shape was smaller than min size in both dimensions, make it square\n\tif (unscaledW < MIN_SIZE_WITH_LABEL && unscaledH < MIN_SIZE_WITH_LABEL) {\n\t\tw = Math.max(w, MIN_SIZE_WITH_LABEL)\n\t\th = Math.max(h, MIN_SIZE_WITH_LABEL)\n\t\t// Make square by using the larger dimension\n\t\tconst maxDim = Math.max(w, h)\n\t\tw = maxDim\n\t\th = maxDim\n\t}\n\n\treturn { w, h }\n}\n\nconst labelSizesForGeo = new WeakCache<TLGeoShape, { w: number; h: number }>()\n\n// Returns cached label size for the shape. Don't call with empty rich text.\nfunction getUnscaledLabelSize(editor: Editor, shape: TLGeoShape) {\n\treturn labelSizesForGeo.get(shape, () => {\n\t\treturn measureUnscaledLabelSize(editor, shape)\n\t})\n}\n\n// This is the expensive part of the code so we want to avoid calling it if we can\nfunction measureUnscaledLabelSize(editor: Editor, shape: TLGeoShape) {\n\tconst { richText, font, size, w } = shape.props\n\n\tconst minWidth = MIN_WIDTHS[size]\n\n\tconst html = renderHtmlFromRichTextForMeasurement(editor, richText)\n\tconst textSize = editor.textMeasure.measureHtml(html, {\n\t\t...TEXT_PROPS,\n\t\tfontFamily: FONT_FAMILIES[font],\n\t\tfontSize: LABEL_FONT_SIZES[size],\n\t\tminWidth: minWidth,\n\t\tmaxWidth: Math.max(\n\t\t\t// Guard because a DOM nodes can't be less 0\n\t\t\t0,\n\t\t\t// A 'w' width that we're setting as the min-width\n\t\t\tMath.ceil(minWidth + EXTRA_PADDINGS[size]),\n\t\t\t// The actual text size\n\t\t\tMath.ceil(w / shape.props.scale - LABEL_PADDING * 2)\n\t\t),\n\t})\n\n\treturn {\n\t\tw: textSize.w + LABEL_PADDING * 2,\n\t\th: textSize.h + LABEL_PADDING * 2,\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiMG;AAhMH,oBA2BO;AACP,sBAIO;AACP,6BAAgC;AAChC,2BAA2C;AAC3C,qCAMO;AACP,8BAAyD;AACzD,kCAAqC;AACrC,kCAAqC;AACrC,uCAA0C;AAC1C,0BAA6B;AAC7B,6BAAgC;AAEhC,MAAM,sBAAsB,KAAK;AAG1B,MAAM,qBAAqB,+BAA6B;AAAA,EAC9D,OAAgB,OAAO;AAAA,EACvB,OAAgB,QAAQ;AAAA,EACxB,OAAgB,aAAa;AAAA,EAEpB,UAAU;AAAA,IAClB,iBAAiB;AAAA,EAClB;AAAA,EAES,UAAU;AAClB,WAAO;AAAA,EACR;AAAA,EAES,kBAAuC;AAC/C,WAAO;AAAA,MACN,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,OAAO;AAAA;AAAA,MAGP,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,eAAe;AAAA,MACf,cAAU,0BAAW,EAAE;AAAA,IACxB;AAAA,EACD;AAAA,EAES,YAAY,OAAmB;AACvC,UAAM,EAAE,MAAM,IAAI;AAClB,UAAM,EAAE,MAAM,IAAI;AAClB,UAAM,WAAO,wCAAgB,KAAK;AAClC,UAAM,eAAe,KAAK,WAAW;AAErC,UAAM,UAAU,KAAK,IAAI,GAAG,MAAM,CAAC;AACnC,UAAM,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,MAAM,KAAK;AACjD,UAAM,YAAY,UAAU;AAC5B,UAAM,YAAY,UAAU;AAE5B,UAAM,mBAAe,iCAAgB,MAAM,QAAQ;AACnD,UAAM,oBAAoB,eACvB,mBACA,qBAAqB,KAAK,QAAQ,KAAK;AAE1C,UAAM,cAAc;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,IACD;AAEA,WAAO,IAAI,sBAAQ;AAAA,MAClB,UAAU;AAAA,QACT;AAAA,QACA,IAAI,0BAAY;AAAA,UACf,GAAG;AAAA,UACH,UAAU;AAAA,UACV,SAAS;AAAA,UACT,wBAAwB;AAAA,UACxB;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAES,sBAAsB,OAAuC;AACrE,UAAM,WAAW,KAAK,YAAY,KAAK;AAEvC,UAAM,UAAU,SAAS,SAAS,CAAC;AACnC,YAAQ,MAAM,MAAM,KAAK;AAAA,MACxB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAEJ,eAAO,EAAE,SAAkB,QAAQ,CAAC,GAAG,QAAQ,UAAU,SAAS,OAAO,MAAM,EAAE;AAAA,MAClF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAEJ,eAAO,EAAE,SAAkB,QAAQ,CAAC,SAAS,OAAO,MAAM,EAAE;AAAA,MAC7D;AACC,iDAAsB,MAAM,MAAM,GAAG;AAAA,IACvC;AAAA,EACD;AAAA,EAES,QAAQ,OAAmB;AACnC,eAAO,6CAA4B,KAAK,QAAQ,MAAM,MAAM,QAAQ;AAAA,EACrE;AAAA,EAES,aAAa,OAAmB;AACxC,YAAI,iCAAgB,MAAM,MAAM,QAAQ,GAAG;AAC1C,aAAO;AAAA,IACR;AACA,eAAO,oCAAqB,KAAK,QAAQ,MAAM,MAAM,UAAU;AAAA,MAC9D,QAAQ,UAAU,MAAM,MAAM,IAAI;AAAA,MAClC,QAAQ;AAAA,MACR,OAAO;AAAA,IACR,CAAC;AAAA,EACF;AAAA,EAEA,UAAU,OAAmB;AAC5B,UAAM,EAAE,IAAI,MAAM,MAAM,IAAI;AAC5B,UAAM,EAAE,MAAM,MAAM,OAAO,eAAe,MAAM,SAAS,IAAI;AAC7D,UAAM,YAAQ,kDAAqB;AACnC,UAAM,EAAE,OAAO,IAAI;AACnB,UAAM,qBAAiB;AAAA,MACtB;AAAA,MACA,MAAM,MAAM,OAAO,OAAO,uBAAuB;AAAA,MACjD,CAAC,MAAM;AAAA,IACR;AACA,UAAM,wBAAoB,kDAAqB,QAAQ,MAAM,EAAE;AAC/D,UAAM,cAAU,iCAAgB,MAAM,MAAM,QAAQ;AACpD,UAAM,oBAAoB,qBAAqB,CAAC;AAChD,UAAM,mBAAe,4DAA0B,MAAM,MAAM,QAAQ,IAAI;AAEvE,WACC,4EACC;AAAA,kDAAC,8BACA,sDAAC,oCAAa,OAAc,aAAa,MAAM,YAAY,cAAc,GAC1E;AAAA,MACC,qBACA;AAAA,QAAC;AAAA;AAAA,UACA,OAAO;AAAA,YACN,UAAU;AAAA,YACV,OAAO,MAAM,MAAM;AAAA,YACnB,QAAQ,MAAM,MAAM,IAAI,MAAM;AAAA,UAC/B;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACA,SAAS;AAAA,cACT;AAAA,cACA;AAAA,cACA,UAAU,gDAAiB,IAAI,IAAI,MAAM,MAAM;AAAA,cAC/C,YAAY,0CAAW;AAAA,cACvB,SAAS,+CAAgB,MAAM,MAAM;AAAA,cACrC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY;AAAA,cACZ,gBAAY,6BAAc,OAAO,MAAM,YAAY,OAAO;AAAA,cAC1D,MAAI;AAAA,cACJ,iBAAiB,KAAK,QAAQ;AAAA;AAAA,UAC/B;AAAA;AAAA,MACD;AAAA,MAEA,MAAM,MAAM,OAAO,4CAAC,0CAAgB,KAAK,MAAM,MAAM,KAAK;AAAA,OAC5D;AAAA,EAEF;AAAA,EAEA,UAAU,OAAmB;AAC5B,UAAM,kBAAc,4DAA0B,MAAM,MAAM,QAAQ,IAAI;AAEtE,UAAM,EAAE,MAAM,MAAM,MAAM,IAAI,MAAM;AACpC,UAAM,cAAc,4CAAa,IAAI;AAErC,UAAM,WAAO,wCAAgB,KAAK;AAElC,WAAO,KAAK,MAAM;AAAA,MACjB,OAAO,SAAS,SAAS,SAAS;AAAA,MAClC,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,YAAY,MAAM;AAAA,MAClB,QAAQ;AAAA,MACR,WAAW,cAAc,IAAI;AAAA,MAC7B,OAAO,EAAE,aAAa,OAAU;AAAA,MAChC,YAAY;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAES,MAAM,OAAmB,KAAuB;AACxD,UAAM,QAAQ,MAAM,MAAM;AAE1B,UAAM,WAAW;AAAA,MAChB,GAAG;AAAA,MACH,OAAO;AAAA,QACN,GAAG,MAAM;AAAA,QACT,GAAG,MAAM,MAAM,IAAI;AAAA,QACnB,IAAI,MAAM,MAAM,IAAI,MAAM,MAAM,SAAS;AAAA,QACzC,OAAO;AAAA;AAAA,MACR;AAAA,IACD;AACA,UAAM,QAAQ,SAAS;AACvB,QAAI,iBAAa,6CAAoB,MAAM,IAAI,CAAC;AAEhD,QAAI;AACJ,QAAI,KAAC,iCAAgB,MAAM,QAAQ,GAAG;AACrC,YAAM,YAAQ,oCAAqB,GAAG;AACtC,YAAM,SAAS,IAAI,kBAAI,GAAG,GAAG,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,MAAM,SAAS,KAAK;AACjF,eACC;AAAA,QAAC;AAAA;AAAA,UACA,UAAU,gDAAiB,MAAM,IAAI;AAAA,UACrC,MAAM,MAAM;AAAA,UACZ,OAAO,MAAM;AAAA,UACb,eAAe,MAAM;AAAA,UACrB,UAAU,MAAM;AAAA,UAChB,gBAAY,6BAAc,OAAO,MAAM,YAAY,OAAO;AAAA,UAC1D;AAAA,UACA,SAAS;AAAA,UACT,iBAAiB,KAAK,QAAQ;AAAA;AAAA,MAC/B;AAAA,IAEF;AAEA,WACC,4EACC;AAAA,kDAAC,oCAAa,aAAa,OAAO,OAAO,UAAU,YAAY,OAAO;AAAA,MACrE;AAAA,OACF;AAAA,EAEF;AAAA,EAES,mBAA8C;AACtD,WAAO,KAAC,6CAAoB,CAAC;AAAA,EAC9B;AAAA,EAES,SACR,OACA,EAAE,QAAQ,UAAU,QAAQ,QAAQ,aAAa,GAChD;AACD,UAAM,kBAAkB,oBAAoB,aAAa,KAAK;AAG9D,QAAI,YAAY,gBAAgB,IAAI;AACpC,QAAI,aAAa,gBAAgB,IAAI,gBAAgB,SAAS;AAC9D,QAAI,cAAc;AAClB,QAAI,cAAc;AAElB,QAAI,KAAC,iCAAgB,MAAM,MAAM,QAAQ,GAAG;AAI3C,YAAM,oBAAoB,qBAAqB,KAAK,QAAQ,YAAY;AAExE,YAAM,eAAe,KAAK,IAAI,SAAS;AACvC,YAAM,eAAe,KAAK,IAAI,SAAS;AAGvC,YAAM,eAAe,KAAK,IAAI,cAAc,kBAAkB,GAAG,mBAAmB;AACpF,YAAM,eAAe,KAAK,IAAI,cAAc,kBAAkB,GAAG,mBAAmB;AAEpF,oBAAc,eAAe;AAC7B,oBAAc,eAAe;AAE7B,kBAAY,eAAe,KAAK,KAAK,aAAa,CAAC;AACnD,kBAAY,eAAe,KAAK,KAAK,aAAa,CAAC;AAAA,IACpD;AAEA,UAAM,UAAU,YAAY,MAAM,MAAM;AACxC,UAAM,UAAU,YAAY,MAAM,MAAM;AAExC,UAAM,SAAS,IAAI,kBAAI,GAAG,CAAC;AAI3B,QAAI,SAAS,GAAG;AACf,aAAO,KAAK;AAAA,IACb;AAEA,QAAI,WAAW,UAAU,WAAW,cAAc,WAAW,eAAe;AAC3E,aAAO,KAAK,SAAS,IAAI,cAAc,CAAC;AAAA,IACzC;AAIA,QAAI,SAAS,GAAG;AACf,aAAO,KAAK;AAAA,IACb;AAEA,QAAI,WAAW,SAAS,WAAW,cAAc,WAAW,aAAa;AACxE,aAAO,KAAK,SAAS,IAAI,cAAc,CAAC;AAAA,IACzC;AAEA,UAAM,EAAE,GAAG,EAAE,IAAI,OAAO,IAAI,MAAM,QAAQ,EAAE,IAAI,QAAQ;AAExD,WAAO;AAAA,MACN;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACN,GAAG,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,CAAC;AAAA,QAChC,GAAG,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,CAAC;AAAA,QAChC,OAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD;AAAA,EAES,eAAe,OAAmB;AAC1C,UAAM,EAAE,MAAM,IAAI;AAGlB,YAAI,iCAAgB,MAAM,QAAQ,GAAG;AACpC,aAAO,MAAM,UAAU,IAAI,EAAE,GAAG,OAAO,OAAO,EAAE,GAAG,OAAO,OAAO,EAAE,EAAE,IAAI;AAAA,IAC1E;AAGA,UAAM,iBAAiB,MAAM,IAAI,MAAM;AACvC,UAAM,iBAAiB,qBAAqB,KAAK,QAAQ,KAAK,EAAE;AAChE,UAAM,gBAAgB,eAAe,gBAAgB,gBAAgB,MAAM,QAAQ,MAAM,KAAK;AAE9F,QAAI,kBAAkB,MAAM;AAC3B,aAAO;AAAA,QACN,GAAG;AAAA,QACH,OAAO,EAAE,GAAG,OAAO,OAAO,gBAAgB,MAAM,MAAM;AAAA,MACvD;AAAA,IACD;AAAA,EACD;AAAA,EAES,eAAe,MAAkB,MAAkB;AAC3D,UAAM,EAAE,OAAO,UAAU,IAAI;AAC7B,UAAM,EAAE,OAAO,UAAU,IAAI;AAG7B,YACC,uBAAQ,UAAU,UAAU,UAAU,QAAQ,KAC9C,UAAU,SAAS,UAAU,QAC7B,UAAU,SAAS,UAAU,MAC5B;AACD;AAAA,IACD;AAEA,UAAM,eAAW,iCAAgB,UAAU,QAAQ;AACnD,UAAM,cAAU,iCAAgB,UAAU,QAAQ;AAGlD,QAAI,YAAY,SAAS;AACxB;AAAA,IACD;AAGA,QAAI,SAAS;AACZ,aAAO,UAAU,UAAU,IAAI,EAAE,GAAG,MAAM,OAAO,EAAE,GAAG,WAAW,OAAO,EAAE,EAAE,IAAI;AAAA,IACjF;AAEA,UAAM,eAAe,oBAAoB,SAAS;AAClD,UAAM,oBAAoB,qBAAqB,KAAK,QAAQ,IAAI;AAChE,UAAM,EAAE,MAAM,IAAI;AAKlB,QAAI,YAAY,CAAC,SAAS;AACzB,YAAM,WAAW,yBAAyB,aAAa,GAAG,aAAa,GAAG,iBAAiB;AAC3F,aAAO;AAAA,QACN,GAAG;AAAA,QACH,OAAO;AAAA,UACN,GAAG;AAAA,UACH,GAAG,SAAS,IAAI;AAAA,UAChB,GAAG,SAAS,IAAI;AAAA,UAChB,OAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD;AAGA,UAAM,gBAAgB,KAAK,MAAM,IAAI;AACrC,UAAM,mBAAmB,kBAAkB,IAAI;AAC/C,UAAM,gBAAgB,eAAe,aAAa,GAAG,kBAAkB,GAAG,aAAa,KAAK;AAE5F,QAAI,kBAAkB,QAAQ,kBAAkB;AAC/C,aAAO;AAAA,QACN,GAAG;AAAA,QACH,OAAO;AAAA,UACN,GAAG;AAAA,UACH,QAAQ,iBAAiB,aAAa,SAAS;AAAA,UAC/C,GAAG,KAAK,IAAI,eAAe,kBAAkB,CAAC,IAAI;AAAA,QACnD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAES,cAAc,OAAmB;AAGzC,QAAI,KAAK,OAAO,OAAO,UAAU,GAAG;AACnC,cAAQ,MAAM,MAAM,KAAK;AAAA,QACxB,KAAK,aAAa;AACjB,iBAAO;AAAA,YACN,GAAG;AAAA,YACH,OAAO;AAAA,cACN,KAAK;AAAA,YACN;AAAA,UACD;AAAA,QACD;AAAA,QACA,KAAK,aAAa;AACjB,iBAAO;AAAA,YACN,GAAG;AAAA,YACH,OAAO;AAAA,cACN,KAAK;AAAA,YACN;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA;AAAA,EACD;AAAA,EACS,qBACR,YACA,UACA,GACkB;AAClB,WAAO;AAAA,MACN,GAAI,IAAI,MAAM,SAAS,QAAQ,WAAW;AAAA,MAC1C,OAAG,oBAAK,WAAW,MAAM,GAAG,SAAS,MAAM,GAAG,CAAC;AAAA,MAC/C,OAAG,oBAAK,WAAW,MAAM,GAAG,SAAS,MAAM,GAAG,CAAC;AAAA,MAC/C,WAAO,oBAAK,WAAW,MAAM,OAAO,SAAS,MAAM,OAAO,CAAC;AAAA,IAC5D;AAAA,EACD;AACD;AAGA,MAAM,aAAa,OAAO,OAAO;AAAA,EAChC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AACL,CAAC;AAED,MAAM,iBAAiB,OAAO,OAAO;AAAA,EACpC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AACL,CAAC;AAED,MAAM,mBAAmB,OAAO,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AAGrD,MAAM,oBAAoB;AAG1B,SAAS,eACR,gBACA,gBACA,mBACA,MACA,OACA,eACA,OAC0D;AAE1D,QAAM,mBAAmB,KAAK,IAAI,KAAK,iBAAiB,CAAC;AACzD,QAAM,oBAAoB,KAAK;AAAA,IAC9B,gDAAiB,IAAI,IAAI,0CAAW,aAAa,+CAAgB;AAAA,IACjE,iBAAiB;AAAA,EAClB;AAGA,QAAM,iBAAiB,KAAK;AAAA,IAC3B;AAAA,IACA,KAAK;AAAA,MACJ,kBAAkB;AAAA,MAClB,KAAK,IAAI,kBAAkB,KAAK,IAAI,GAAG,iBAAiB,iBAAiB,CAAC;AAAA,IAC3E;AAAA,EACD;AACA,QAAM,iBAAiB,KAAK;AAAA,IAC3B;AAAA,IACA,KAAK;AAAA,MACJ,kBAAkB;AAAA,MAClB,KAAK,IAAI,mBAAmB,KAAK,IAAI,GAAG,iBAAiB,iBAAiB,CAAC;AAAA,IAC5E;AAAA,EACD;AAGA,QAAM,YACL,UAAU,UACP,IACA,UAAU,QACT,iBAAiB,kBAChB,iBAAiB,kBAAkB;AAEzC,QAAM,YACL,kBAAkB,UACf,IACA,kBAAkB,QACjB,iBAAiB,kBAChB,iBAAiB,kBAAkB;AAEzC,SAAO;AAAA,IACN,GAAG,YAAY;AAAA,IACf,GAAG,YAAY;AAAA,IACf,OAAO,iBAAiB;AAAA,IACxB,QAAQ,iBAAiB;AAAA,EAC1B;AACD;AAGA,SAAS,oBAAoB,OAAwB;AACpD,QAAM,EAAE,GAAG,GAAG,OAAO,MAAM,IAAI;AAC/B,SAAO;AAAA,IACN,GAAG,IAAI;AAAA,IACP,GAAG,IAAI;AAAA,IACP,OAAO,QAAQ;AAAA,EAChB;AACD;AAMA,SAAS,eACR,gBACA,gBACA,sBACgB;AAChB,MAAI,iBAAiB,gBAAgB;AAEpC,WAAO,iBAAiB;AAAA,EACzB;AACA,MAAI,uBAAuB,GAAG;AAE7B,WAAO;AAAA,EACR;AAEA,SAAO;AACR;AAMA,SAAS,yBACR,WACA,WACA,mBAC2B;AAC3B,MAAI,IAAI,KAAK,IAAI,WAAW,kBAAkB,CAAC;AAC/C,MAAI,IAAI,KAAK,IAAI,WAAW,kBAAkB,CAAC;AAG/C,MAAI,YAAY,uBAAuB,YAAY,qBAAqB;AACvE,QAAI,KAAK,IAAI,GAAG,mBAAmB;AACnC,QAAI,KAAK,IAAI,GAAG,mBAAmB;AAEnC,UAAM,SAAS,KAAK,IAAI,GAAG,CAAC;AAC5B,QAAI;AACJ,QAAI;AAAA,EACL;AAEA,SAAO,EAAE,GAAG,EAAE;AACf;AAEA,MAAM,mBAAmB,IAAI,wBAAgD;AAG7E,SAAS,qBAAqB,QAAgB,OAAmB;AAChE,SAAO,iBAAiB,IAAI,OAAO,MAAM;AACxC,WAAO,yBAAyB,QAAQ,KAAK;AAAA,EAC9C,CAAC;AACF;AAGA,SAAS,yBAAyB,QAAgB,OAAmB;AACpE,QAAM,EAAE,UAAU,MAAM,MAAM,EAAE,IAAI,MAAM;AAE1C,QAAM,WAAW,WAAW,IAAI;AAEhC,QAAM,WAAO,sDAAqC,QAAQ,QAAQ;AAClE,QAAM,WAAW,OAAO,YAAY,YAAY,MAAM;AAAA,IACrD,GAAG;AAAA,IACH,YAAY,6CAAc,IAAI;AAAA,IAC9B,UAAU,gDAAiB,IAAI;AAAA,IAC/B;AAAA,IACA,UAAU,KAAK;AAAA;AAAA,MAEd;AAAA;AAAA,MAEA,KAAK,KAAK,WAAW,eAAe,IAAI,CAAC;AAAA;AAAA,MAEzC,KAAK,KAAK,IAAI,MAAM,MAAM,QAAQ,+CAAgB,CAAC;AAAA,IACpD;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN,GAAG,SAAS,IAAI,+CAAgB;AAAA,IAChC,GAAG,SAAS,IAAI,+CAAgB;AAAA,EACjC;AACD;",
6
6
  "names": []
7
7
  }
@@ -22,6 +22,7 @@ __export(Idle_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(Idle_exports);
24
24
  var import_editor = require("@tldraw/editor");
25
+ var import_selectHelpers = require("../../../tools/SelectTool/selectHelpers");
25
26
  class Idle extends import_editor.StateNode {
26
27
  static id = "idle";
27
28
  onPointerDown(info) {
@@ -31,17 +32,11 @@ class Idle extends import_editor.StateNode {
31
32
  this.editor.setCursor({ type: "cross", rotation: 0 });
32
33
  }
33
34
  onKeyUp(info) {
35
+ const { editor } = this;
34
36
  if (info.key === "Enter") {
35
- if (this.editor.getIsReadonly()) return null;
36
- const onlySelectedShape = this.editor.getOnlySelectedShape();
37
- if (onlySelectedShape && this.editor.getShapeUtil(onlySelectedShape).canEdit(onlySelectedShape)) {
38
- this.editor.setCurrentTool("select");
39
- this.editor.setEditingShape(onlySelectedShape.id);
40
- this.editor.root.getCurrent()?.transition("editing_shape", {
41
- ...info,
42
- target: "shape",
43
- shape: onlySelectedShape
44
- });
37
+ const onlySelectedShape = editor.getOnlySelectedShape();
38
+ if (editor.canEditShape(onlySelectedShape)) {
39
+ (0, import_selectHelpers.startEditingShapeWithRichText)(editor, onlySelectedShape, { selectAll: true });
45
40
  }
46
41
  }
47
42
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/shapes/geo/toolStates/Idle.ts"],
4
- "sourcesContent": ["import { StateNode, TLKeyboardEventInfo, TLPointerEventInfo } from '@tldraw/editor'\n\nexport class Idle extends StateNode {\n\tstatic override id = 'idle'\n\n\toverride onPointerDown(info: TLPointerEventInfo) {\n\t\tthis.parent.transition('pointing', info)\n\t}\n\n\toverride onEnter() {\n\t\tthis.editor.setCursor({ type: 'cross', rotation: 0 })\n\t}\n\n\toverride onKeyUp(info: TLKeyboardEventInfo) {\n\t\tif (info.key === 'Enter') {\n\t\t\tif (this.editor.getIsReadonly()) return null\n\n\t\t\tconst onlySelectedShape = this.editor.getOnlySelectedShape()\n\t\t\t// If the only selected shape is editable, start editing it\n\t\t\tif (\n\t\t\t\tonlySelectedShape &&\n\t\t\t\tthis.editor.getShapeUtil(onlySelectedShape).canEdit(onlySelectedShape)\n\t\t\t) {\n\t\t\t\tthis.editor.setCurrentTool('select')\n\t\t\t\tthis.editor.setEditingShape(onlySelectedShape.id)\n\t\t\t\tthis.editor.root.getCurrent()?.transition('editing_shape', {\n\t\t\t\t\t...info,\n\t\t\t\t\ttarget: 'shape',\n\t\t\t\t\tshape: onlySelectedShape,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\toverride onCancel() {\n\t\tthis.editor.setCurrentTool('select')\n\t}\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAmE;AAE5D,MAAM,aAAa,wBAAU;AAAA,EACnC,OAAgB,KAAK;AAAA,EAEZ,cAAc,MAA0B;AAChD,SAAK,OAAO,WAAW,YAAY,IAAI;AAAA,EACxC;AAAA,EAES,UAAU;AAClB,SAAK,OAAO,UAAU,EAAE,MAAM,SAAS,UAAU,EAAE,CAAC;AAAA,EACrD;AAAA,EAES,QAAQ,MAA2B;AAC3C,QAAI,KAAK,QAAQ,SAAS;AACzB,UAAI,KAAK,OAAO,cAAc,EAAG,QAAO;AAExC,YAAM,oBAAoB,KAAK,OAAO,qBAAqB;AAE3D,UACC,qBACA,KAAK,OAAO,aAAa,iBAAiB,EAAE,QAAQ,iBAAiB,GACpE;AACD,aAAK,OAAO,eAAe,QAAQ;AACnC,aAAK,OAAO,gBAAgB,kBAAkB,EAAE;AAChD,aAAK,OAAO,KAAK,WAAW,GAAG,WAAW,iBAAiB;AAAA,UAC1D,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,OAAO;AAAA,QACR,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAAA,EAES,WAAW;AACnB,SAAK,OAAO,eAAe,QAAQ;AAAA,EACpC;AACD;",
4
+ "sourcesContent": ["import { StateNode, TLKeyboardEventInfo, TLPointerEventInfo } from '@tldraw/editor'\nimport { startEditingShapeWithRichText } from '../../../tools/SelectTool/selectHelpers'\n\nexport class Idle extends StateNode {\n\tstatic override id = 'idle'\n\n\toverride onPointerDown(info: TLPointerEventInfo) {\n\t\tthis.parent.transition('pointing', info)\n\t}\n\n\toverride onEnter() {\n\t\tthis.editor.setCursor({ type: 'cross', rotation: 0 })\n\t}\n\n\toverride onKeyUp(info: TLKeyboardEventInfo) {\n\t\tconst { editor } = this\n\t\tif (info.key === 'Enter') {\n\t\t\tconst onlySelectedShape = editor.getOnlySelectedShape()\n\t\t\tif (editor.canEditShape(onlySelectedShape)) {\n\t\t\t\tstartEditingShapeWithRichText(editor, onlySelectedShape, { selectAll: true })\n\t\t\t}\n\t\t}\n\t}\n\n\toverride onCancel() {\n\t\tthis.editor.setCurrentTool('select')\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAmE;AACnE,2BAA8C;AAEvC,MAAM,aAAa,wBAAU;AAAA,EACnC,OAAgB,KAAK;AAAA,EAEZ,cAAc,MAA0B;AAChD,SAAK,OAAO,WAAW,YAAY,IAAI;AAAA,EACxC;AAAA,EAES,UAAU;AAClB,SAAK,OAAO,UAAU,EAAE,MAAM,SAAS,UAAU,EAAE,CAAC;AAAA,EACrD;AAAA,EAES,QAAQ,MAA2B;AAC3C,UAAM,EAAE,OAAO,IAAI;AACnB,QAAI,KAAK,QAAQ,SAAS;AACzB,YAAM,oBAAoB,OAAO,qBAAqB;AACtD,UAAI,OAAO,aAAa,iBAAiB,GAAG;AAC3C,gEAA8B,QAAQ,mBAAmB,EAAE,WAAW,KAAK,CAAC;AAAA,MAC7E;AAAA,IACD;AAAA,EACD;AAAA,EAES,WAAW;AACnB,SAAK,OAAO,eAAe,QAAQ;AAAA,EACpC;AACD;",
6
6
  "names": []
7
7
  }
@@ -28,8 +28,8 @@ class Pointing extends import_editor.StateNode {
28
28
  this.complete();
29
29
  }
30
30
  onPointerMove(info) {
31
- if (this.editor.inputs.isDragging) {
32
- const { originPagePoint } = this.editor.inputs;
31
+ if (this.editor.inputs.getIsDragging()) {
32
+ const originPagePoint = this.editor.inputs.getOriginPagePoint();
33
33
  const id = (0, import_editor.createShapeId)();
34
34
  const creatingMarkId = this.editor.markHistoryStoppingPoint(`creating_geo:${id}`);
35
35
  const newPoint = (0, import_editor.maybeSnapToGrid)(originPagePoint, this.editor);
@@ -73,7 +73,7 @@ class Pointing extends import_editor.StateNode {
73
73
  this.cancel();
74
74
  }
75
75
  complete() {
76
- const { originPagePoint } = this.editor.inputs;
76
+ const originPagePoint = this.editor.inputs.getOriginPagePoint();
77
77
  const id = (0, import_editor.createShapeId)();
78
78
  this.editor.markHistoryStoppingPoint(`creating_geo:${id}`);
79
79
  const scale = this.editor.user.getIsDynamicResizeMode() ? 1 / this.editor.getZoomLevel() : 1;