@bigbluebutton/tldraw 2.0.0-alpha.19

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 (1357) hide show
  1. package/LICENSE +190 -0
  2. package/dist-cjs/index.d.ts +2954 -0
  3. package/dist-cjs/index.js +216 -0
  4. package/dist-cjs/index.js.map +7 -0
  5. package/dist-cjs/lib/Tldraw.js +136 -0
  6. package/dist-cjs/lib/Tldraw.js.map +7 -0
  7. package/dist-cjs/lib/canvas/TldrawCropHandles.js +164 -0
  8. package/dist-cjs/lib/canvas/TldrawCropHandles.js.map +7 -0
  9. package/dist-cjs/lib/canvas/TldrawHandles.js +37 -0
  10. package/dist-cjs/lib/canvas/TldrawHandles.js.map +7 -0
  11. package/dist-cjs/lib/canvas/TldrawHoveredShapeIndicator.js +42 -0
  12. package/dist-cjs/lib/canvas/TldrawHoveredShapeIndicator.js.map +7 -0
  13. package/dist-cjs/lib/canvas/TldrawScribble.js +72 -0
  14. package/dist-cjs/lib/canvas/TldrawScribble.js.map +7 -0
  15. package/dist-cjs/lib/canvas/TldrawSelectionBackground.js +44 -0
  16. package/dist-cjs/lib/canvas/TldrawSelectionBackground.js.map +7 -0
  17. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +509 -0
  18. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +7 -0
  19. package/dist-cjs/lib/defaultExternalContentHandlers.js +400 -0
  20. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +7 -0
  21. package/dist-cjs/lib/defaultShapeTools.js +42 -0
  22. package/dist-cjs/lib/defaultShapeTools.js.map +7 -0
  23. package/dist-cjs/lib/defaultShapeUtils.js +50 -0
  24. package/dist-cjs/lib/defaultShapeUtils.js.map +7 -0
  25. package/dist-cjs/lib/defaultSideEffects.js +69 -0
  26. package/dist-cjs/lib/defaultSideEffects.js.map +7 -0
  27. package/dist-cjs/lib/defaultTools.js +30 -0
  28. package/dist-cjs/lib/defaultTools.js.map +7 -0
  29. package/dist-cjs/lib/shapes/arrow/ArrowShapeTool.js +33 -0
  30. package/dist-cjs/lib/shapes/arrow/ArrowShapeTool.js.map +7 -0
  31. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +805 -0
  32. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +7 -0
  33. package/dist-cjs/lib/shapes/arrow/components/ArrowTextLabel.js +114 -0
  34. package/dist-cjs/lib/shapes/arrow/components/ArrowTextLabel.js.map +7 -0
  35. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +53 -0
  36. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +7 -0
  37. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +182 -0
  38. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +7 -0
  39. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +163 -0
  40. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +7 -0
  41. package/dist-cjs/lib/shapes/draw/DrawShapeTool.js +37 -0
  42. package/dist-cjs/lib/shapes/draw/DrawShapeTool.js.map +7 -0
  43. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +243 -0
  44. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +7 -0
  45. package/dist-cjs/lib/shapes/draw/getPath.js +102 -0
  46. package/dist-cjs/lib/shapes/draw/getPath.js.map +7 -0
  47. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +556 -0
  48. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +7 -0
  49. package/dist-cjs/lib/shapes/draw/toolStates/Idle.js +37 -0
  50. package/dist-cjs/lib/shapes/draw/toolStates/Idle.js.map +7 -0
  51. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +192 -0
  52. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +7 -0
  53. package/dist-cjs/lib/shapes/frame/FrameShapeTool.js +66 -0
  54. package/dist-cjs/lib/shapes/frame/FrameShapeTool.js.map +7 -0
  55. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +234 -0
  56. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +7 -0
  57. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +106 -0
  58. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +7 -0
  59. package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js +101 -0
  60. package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js.map +7 -0
  61. package/dist-cjs/lib/shapes/geo/GeoShapeTool.js +33 -0
  62. package/dist-cjs/lib/shapes/geo/GeoShapeTool.js.map +7 -0
  63. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +999 -0
  64. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +7 -0
  65. package/dist-cjs/lib/shapes/geo/cloudOutline.js +288 -0
  66. package/dist-cjs/lib/shapes/geo/cloudOutline.js.map +7 -0
  67. package/dist-cjs/lib/shapes/geo/components/DashStyleCloud.js +124 -0
  68. package/dist-cjs/lib/shapes/geo/components/DashStyleCloud.js.map +7 -0
  69. package/dist-cjs/lib/shapes/geo/components/DashStyleEllipse.js +123 -0
  70. package/dist-cjs/lib/shapes/geo/components/DashStyleEllipse.js.map +7 -0
  71. package/dist-cjs/lib/shapes/geo/components/DashStyleOval.js +118 -0
  72. package/dist-cjs/lib/shapes/geo/components/DashStyleOval.js.map +7 -0
  73. package/dist-cjs/lib/shapes/geo/components/DashStylePolygon.js +155 -0
  74. package/dist-cjs/lib/shapes/geo/components/DashStylePolygon.js.map +7 -0
  75. package/dist-cjs/lib/shapes/geo/components/DrawStyleCloud.js +79 -0
  76. package/dist-cjs/lib/shapes/geo/components/DrawStyleCloud.js.map +7 -0
  77. package/dist-cjs/lib/shapes/geo/components/DrawStyleEllipse.js +133 -0
  78. package/dist-cjs/lib/shapes/geo/components/DrawStyleEllipse.js.map +7 -0
  79. package/dist-cjs/lib/shapes/geo/components/DrawStylePolygon.js +93 -0
  80. package/dist-cjs/lib/shapes/geo/components/DrawStylePolygon.js.map +7 -0
  81. package/dist-cjs/lib/shapes/geo/components/SolidStyleCloud.js +79 -0
  82. package/dist-cjs/lib/shapes/geo/components/SolidStyleCloud.js.map +7 -0
  83. package/dist-cjs/lib/shapes/geo/components/SolidStyleEllipse.js +84 -0
  84. package/dist-cjs/lib/shapes/geo/components/SolidStyleEllipse.js.map +7 -0
  85. package/dist-cjs/lib/shapes/geo/components/SolidStyleOval.js +99 -0
  86. package/dist-cjs/lib/shapes/geo/components/SolidStyleOval.js.map +7 -0
  87. package/dist-cjs/lib/shapes/geo/components/SolidStylePolygon.js +86 -0
  88. package/dist-cjs/lib/shapes/geo/components/SolidStylePolygon.js.map +7 -0
  89. package/dist-cjs/lib/shapes/geo/helpers.js +53 -0
  90. package/dist-cjs/lib/shapes/geo/helpers.js.map +7 -0
  91. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +53 -0
  92. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js.map +7 -0
  93. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +118 -0
  94. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +7 -0
  95. package/dist-cjs/lib/shapes/highlight/HighlightShapeTool.js +37 -0
  96. package/dist-cjs/lib/shapes/highlight/HighlightShapeTool.js.map +7 -0
  97. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +208 -0
  98. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +7 -0
  99. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +262 -0
  100. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +7 -0
  101. package/dist-cjs/lib/shapes/line/LineShapeTool.js +33 -0
  102. package/dist-cjs/lib/shapes/line/LineShapeTool.js.map +7 -0
  103. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +359 -0
  104. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +7 -0
  105. package/dist-cjs/lib/shapes/line/components/getLinePath.js +88 -0
  106. package/dist-cjs/lib/shapes/line/components/getLinePath.js.map +7 -0
  107. package/dist-cjs/lib/shapes/line/components/svg.js +73 -0
  108. package/dist-cjs/lib/shapes/line/components/svg.js.map +7 -0
  109. package/dist-cjs/lib/shapes/line/toolStates/Idle.js +39 -0
  110. package/dist-cjs/lib/shapes/line/toolStates/Idle.js.map +7 -0
  111. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +145 -0
  112. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +7 -0
  113. package/dist-cjs/lib/shapes/note/NoteShapeTool.js +33 -0
  114. package/dist-cjs/lib/shapes/note/NoteShapeTool.js.map +7 -0
  115. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +205 -0
  116. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +7 -0
  117. package/dist-cjs/lib/shapes/note/toolStates/Idle.js +37 -0
  118. package/dist-cjs/lib/shapes/note/toolStates/Idle.js.map +7 -0
  119. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +114 -0
  120. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +7 -0
  121. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +65 -0
  122. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +7 -0
  123. package/dist-cjs/lib/shapes/shared/ShapeFill.js +117 -0
  124. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +7 -0
  125. package/dist-cjs/lib/shapes/shared/TextHelpers.js +228 -0
  126. package/dist-cjs/lib/shapes/shared/TextHelpers.js.map +7 -0
  127. package/dist-cjs/lib/shapes/shared/TextLabel.js +138 -0
  128. package/dist-cjs/lib/shapes/shared/TextLabel.js.map +7 -0
  129. package/dist-cjs/lib/shapes/shared/createTextSvgElementFromSpans.js +75 -0
  130. package/dist-cjs/lib/shapes/shared/createTextSvgElementFromSpans.js.map +7 -0
  131. package/dist-cjs/lib/shapes/shared/default-shape-constants.js +72 -0
  132. package/dist-cjs/lib/shapes/shared/default-shape-constants.js.map +7 -0
  133. package/dist-cjs/lib/shapes/shared/defaultStyleDefs.js +252 -0
  134. package/dist-cjs/lib/shapes/shared/defaultStyleDefs.js.map +7 -0
  135. package/dist-cjs/lib/shapes/shared/freehand/getStroke.js +33 -0
  136. package/dist-cjs/lib/shapes/shared/freehand/getStroke.js.map +7 -0
  137. package/dist-cjs/lib/shapes/shared/freehand/getStrokeOutlinePoints.js +175 -0
  138. package/dist-cjs/lib/shapes/shared/freehand/getStrokeOutlinePoints.js.map +7 -0
  139. package/dist-cjs/lib/shapes/shared/freehand/getStrokePoints.js +144 -0
  140. package/dist-cjs/lib/shapes/shared/freehand/getStrokePoints.js.map +7 -0
  141. package/dist-cjs/lib/shapes/shared/freehand/getStrokeRadius.js +27 -0
  142. package/dist-cjs/lib/shapes/shared/freehand/getStrokeRadius.js.map +7 -0
  143. package/dist-cjs/lib/shapes/shared/freehand/setStrokePointRadii.js +101 -0
  144. package/dist-cjs/lib/shapes/shared/freehand/setStrokePointRadii.js.map +7 -0
  145. package/dist-cjs/lib/shapes/shared/freehand/svg.js +56 -0
  146. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +7 -0
  147. package/dist-cjs/lib/shapes/shared/freehand/svgInk.js +163 -0
  148. package/dist-cjs/lib/shapes/shared/freehand/svgInk.js.map +7 -0
  149. package/dist-cjs/lib/shapes/shared/freehand/types.js +17 -0
  150. package/dist-cjs/lib/shapes/shared/freehand/types.js.map +7 -0
  151. package/dist-cjs/lib/shapes/shared/getBrowserCanvasMaxSize.js +52 -0
  152. package/dist-cjs/lib/shapes/shared/getBrowserCanvasMaxSize.js.map +7 -0
  153. package/dist-cjs/lib/shapes/shared/getPerfectDashProps.js +96 -0
  154. package/dist-cjs/lib/shapes/shared/getPerfectDashProps.js.map +7 -0
  155. package/dist-cjs/lib/shapes/shared/getTextLabelSvgElement.js +56 -0
  156. package/dist-cjs/lib/shapes/shared/getTextLabelSvgElement.js.map +7 -0
  157. package/dist-cjs/lib/shapes/shared/legacyProps.js +42 -0
  158. package/dist-cjs/lib/shapes/shared/legacyProps.js.map +7 -0
  159. package/dist-cjs/lib/shapes/shared/polygon-helpers.js +116 -0
  160. package/dist-cjs/lib/shapes/shared/polygon-helpers.js.map +7 -0
  161. package/dist-cjs/lib/shapes/shared/resizeBox.js +117 -0
  162. package/dist-cjs/lib/shapes/shared/resizeBox.js.map +7 -0
  163. package/dist-cjs/lib/shapes/shared/resizeScaled.js +48 -0
  164. package/dist-cjs/lib/shapes/shared/resizeScaled.js.map +7 -0
  165. package/dist-cjs/lib/shapes/shared/rotated-box-shadow.js +50 -0
  166. package/dist-cjs/lib/shapes/shared/rotated-box-shadow.js.map +7 -0
  167. package/dist-cjs/lib/shapes/shared/useColorSpace.js +39 -0
  168. package/dist-cjs/lib/shapes/shared/useColorSpace.js.map +7 -0
  169. package/dist-cjs/lib/shapes/shared/useEditableText.js +179 -0
  170. package/dist-cjs/lib/shapes/shared/useEditableText.js.map +7 -0
  171. package/dist-cjs/lib/shapes/shared/useForceSolid.js +29 -0
  172. package/dist-cjs/lib/shapes/shared/useForceSolid.js.map +7 -0
  173. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js +38 -0
  174. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js.map +7 -0
  175. package/dist-cjs/lib/shapes/text/TextShapeTool.js +33 -0
  176. package/dist-cjs/lib/shapes/text/TextShapeTool.js.map +7 -0
  177. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +341 -0
  178. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +7 -0
  179. package/dist-cjs/lib/shapes/text/toolStates/Idle.js +62 -0
  180. package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +7 -0
  181. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +109 -0
  182. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +7 -0
  183. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +202 -0
  184. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +7 -0
  185. package/dist-cjs/lib/tools/EraserTool/EraserTool.js +36 -0
  186. package/dist-cjs/lib/tools/EraserTool/EraserTool.js.map +7 -0
  187. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +111 -0
  188. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +7 -0
  189. package/dist-cjs/lib/tools/EraserTool/childStates/Idle.js +34 -0
  190. package/dist-cjs/lib/tools/EraserTool/childStates/Idle.js.map +7 -0
  191. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +84 -0
  192. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +7 -0
  193. package/dist-cjs/lib/tools/HandTool/HandTool.js +58 -0
  194. package/dist-cjs/lib/tools/HandTool/HandTool.js.map +7 -0
  195. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +58 -0
  196. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +7 -0
  197. package/dist-cjs/lib/tools/HandTool/childStates/Idle.js +37 -0
  198. package/dist-cjs/lib/tools/HandTool/childStates/Idle.js.map +7 -0
  199. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js +55 -0
  200. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js.map +7 -0
  201. package/dist-cjs/lib/tools/LaserTool/LaserTool.js +35 -0
  202. package/dist-cjs/lib/tools/LaserTool/LaserTool.js.map +7 -0
  203. package/dist-cjs/lib/tools/LaserTool/childStates/Idle.js +31 -0
  204. package/dist-cjs/lib/tools/LaserTool/childStates/Idle.js.map +7 -0
  205. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js +66 -0
  206. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js.map +7 -0
  207. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +100 -0
  208. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +7 -0
  209. package/dist-cjs/lib/tools/SelectTool/SelectTool.js +70 -0
  210. package/dist-cjs/lib/tools/SelectTool/SelectTool.js.map +7 -0
  211. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +145 -0
  212. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +7 -0
  213. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/Crop.js +33 -0
  214. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/Crop.js.map +7 -0
  215. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +204 -0
  216. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +7 -0
  217. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +39 -0
  218. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +7 -0
  219. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js +101 -0
  220. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js.map +7 -0
  221. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js +58 -0
  222. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js.map +7 -0
  223. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/crop-constants.js +25 -0
  224. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/crop-constants.js.map +7 -0
  225. package/dist-cjs/lib/tools/SelectTool/childStates/Cropping.js +210 -0
  226. package/dist-cjs/lib/tools/SelectTool/childStates/Cropping.js.map +7 -0
  227. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +230 -0
  228. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +7 -0
  229. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +121 -0
  230. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +7 -0
  231. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +461 -0
  232. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +7 -0
  233. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js +56 -0
  234. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js.map +7 -0
  235. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCropHandle.js +89 -0
  236. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCropHandle.js.map +7 -0
  237. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js +67 -0
  238. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +7 -0
  239. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +91 -0
  240. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +7 -0
  241. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +83 -0
  242. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +7 -0
  243. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +73 -0
  244. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +7 -0
  245. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +176 -0
  246. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +7 -0
  247. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +371 -0
  248. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +7 -0
  249. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +148 -0
  250. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +7 -0
  251. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +140 -0
  252. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +7 -0
  253. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +315 -0
  254. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +7 -0
  255. package/dist-cjs/lib/tools/SelectTool/children/DraggingHandle.js +230 -0
  256. package/dist-cjs/lib/tools/SelectTool/children/DraggingHandle.js.map +7 -0
  257. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js +79 -0
  258. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js.map +7 -0
  259. package/dist-cjs/lib/tools/ZoomTool/childStates/Idle.js +35 -0
  260. package/dist-cjs/lib/tools/ZoomTool/childStates/Idle.js.map +7 -0
  261. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js +55 -0
  262. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js.map +7 -0
  263. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js +72 -0
  264. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js.map +7 -0
  265. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js +41 -0
  266. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +7 -0
  267. package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js +28 -0
  268. package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +7 -0
  269. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js +80 -0
  270. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js.map +7 -0
  271. package/dist-cjs/lib/tools/selection-logic/updateHoveredId.js +47 -0
  272. package/dist-cjs/lib/tools/selection-logic/updateHoveredId.js.map +7 -0
  273. package/dist-cjs/lib/ui/TldrawUi.js +155 -0
  274. package/dist-cjs/lib/ui/TldrawUi.js.map +7 -0
  275. package/dist-cjs/lib/ui/TldrawUiContextProvider.js +57 -0
  276. package/dist-cjs/lib/ui/TldrawUiContextProvider.js.map +7 -0
  277. package/dist-cjs/lib/ui/assetUrls.js +67 -0
  278. package/dist-cjs/lib/ui/assetUrls.js.map +7 -0
  279. package/dist-cjs/lib/ui/components/ActionsMenu.js +96 -0
  280. package/dist-cjs/lib/ui/components/ActionsMenu.js.map +7 -0
  281. package/dist-cjs/lib/ui/components/BackToContent.js +67 -0
  282. package/dist-cjs/lib/ui/components/BackToContent.js.map +7 -0
  283. package/dist-cjs/lib/ui/components/ContextMenu.js +214 -0
  284. package/dist-cjs/lib/ui/components/ContextMenu.js.map +7 -0
  285. package/dist-cjs/lib/ui/components/DebugPanel.js +334 -0
  286. package/dist-cjs/lib/ui/components/DebugPanel.js.map +7 -0
  287. package/dist-cjs/lib/ui/components/Dialogs.js +64 -0
  288. package/dist-cjs/lib/ui/components/Dialogs.js.map +7 -0
  289. package/dist-cjs/lib/ui/components/DuplicateButton.js +47 -0
  290. package/dist-cjs/lib/ui/components/DuplicateButton.js.map +7 -0
  291. package/dist-cjs/lib/ui/components/EditLinkDialog.js +161 -0
  292. package/dist-cjs/lib/ui/components/EditLinkDialog.js.map +7 -0
  293. package/dist-cjs/lib/ui/components/EmbedDialog.js +152 -0
  294. package/dist-cjs/lib/ui/components/EmbedDialog.js.map +7 -0
  295. package/dist-cjs/lib/ui/components/FollowingIndicator.js +41 -0
  296. package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +7 -0
  297. package/dist-cjs/lib/ui/components/HTMLCanvas.js +66 -0
  298. package/dist-cjs/lib/ui/components/HTMLCanvas.js.map +7 -0
  299. package/dist-cjs/lib/ui/components/HelpMenu.js +116 -0
  300. package/dist-cjs/lib/ui/components/HelpMenu.js.map +7 -0
  301. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog.js +74 -0
  302. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog.js.map +7 -0
  303. package/dist-cjs/lib/ui/components/LanguageMenu.js +60 -0
  304. package/dist-cjs/lib/ui/components/LanguageMenu.js.map +7 -0
  305. package/dist-cjs/lib/ui/components/Menu.js +139 -0
  306. package/dist-cjs/lib/ui/components/Menu.js.map +7 -0
  307. package/dist-cjs/lib/ui/components/MenuZone.js +51 -0
  308. package/dist-cjs/lib/ui/components/MenuZone.js.map +7 -0
  309. package/dist-cjs/lib/ui/components/MobileStylePanel.js +69 -0
  310. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +7 -0
  311. package/dist-cjs/lib/ui/components/MoveToPageMenu.js +142 -0
  312. package/dist-cjs/lib/ui/components/MoveToPageMenu.js.map +7 -0
  313. package/dist-cjs/lib/ui/components/NavigationZone/Minimap.js +208 -0
  314. package/dist-cjs/lib/ui/components/NavigationZone/Minimap.js.map +7 -0
  315. package/dist-cjs/lib/ui/components/NavigationZone/MinimapManager.js +293 -0
  316. package/dist-cjs/lib/ui/components/NavigationZone/MinimapManager.js.map +7 -0
  317. package/dist-cjs/lib/ui/components/NavigationZone/NavigationZone.js +103 -0
  318. package/dist-cjs/lib/ui/components/NavigationZone/NavigationZone.js.map +7 -0
  319. package/dist-cjs/lib/ui/components/NavigationZone/ZoomMenu.js +118 -0
  320. package/dist-cjs/lib/ui/components/NavigationZone/ZoomMenu.js.map +7 -0
  321. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +47 -0
  322. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js.map +7 -0
  323. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js +63 -0
  324. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js.map +7 -0
  325. package/dist-cjs/lib/ui/components/PageMenu/PageItemSubmenu.js +88 -0
  326. package/dist-cjs/lib/ui/components/PageMenu/PageItemSubmenu.js.map +7 -0
  327. package/dist-cjs/lib/ui/components/PageMenu/PageMenu.js +395 -0
  328. package/dist-cjs/lib/ui/components/PageMenu/PageMenu.js.map +7 -0
  329. package/dist-cjs/lib/ui/components/PageMenu/edit-pages-shared.js +45 -0
  330. package/dist-cjs/lib/ui/components/PageMenu/edit-pages-shared.js.map +7 -0
  331. package/dist-cjs/lib/ui/components/PenModeToggle.js +45 -0
  332. package/dist-cjs/lib/ui/components/PenModeToggle.js.map +7 -0
  333. package/dist-cjs/lib/ui/components/RedoButton.js +49 -0
  334. package/dist-cjs/lib/ui/components/RedoButton.js.map +7 -0
  335. package/dist-cjs/lib/ui/components/Spinner.js +41 -0
  336. package/dist-cjs/lib/ui/components/Spinner.js.map +7 -0
  337. package/dist-cjs/lib/ui/components/StopFollowing.js +45 -0
  338. package/dist-cjs/lib/ui/components/StopFollowing.js.map +7 -0
  339. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js +138 -0
  340. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +7 -0
  341. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js +89 -0
  342. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +7 -0
  343. package/dist-cjs/lib/ui/components/StylePanel/StylePanel.js +313 -0
  344. package/dist-cjs/lib/ui/components/StylePanel/StylePanel.js.map +7 -0
  345. package/dist-cjs/lib/ui/components/StylePanel/styles.js +119 -0
  346. package/dist-cjs/lib/ui/components/StylePanel/styles.js.map +7 -0
  347. package/dist-cjs/lib/ui/components/Toasts.js +101 -0
  348. package/dist-cjs/lib/ui/components/Toasts.js.map +7 -0
  349. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +73 -0
  350. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +7 -0
  351. package/dist-cjs/lib/ui/components/Toolbar/Toolbar.js +247 -0
  352. package/dist-cjs/lib/ui/components/Toolbar/Toolbar.js.map +7 -0
  353. package/dist-cjs/lib/ui/components/TrashButton.js +51 -0
  354. package/dist-cjs/lib/ui/components/TrashButton.js.map +7 -0
  355. package/dist-cjs/lib/ui/components/UndoButton.js +49 -0
  356. package/dist-cjs/lib/ui/components/UndoButton.js.map +7 -0
  357. package/dist-cjs/lib/ui/components/primitives/Button.js +79 -0
  358. package/dist-cjs/lib/ui/components/primitives/Button.js.map +7 -0
  359. package/dist-cjs/lib/ui/components/primitives/ButtonPicker.js +121 -0
  360. package/dist-cjs/lib/ui/components/primitives/ButtonPicker.js.map +7 -0
  361. package/dist-cjs/lib/ui/components/primitives/Dialog.js +70 -0
  362. package/dist-cjs/lib/ui/components/primitives/Dialog.js.map +7 -0
  363. package/dist-cjs/lib/ui/components/primitives/DropdownMenu.js +187 -0
  364. package/dist-cjs/lib/ui/components/primitives/DropdownMenu.js.map +7 -0
  365. package/dist-cjs/lib/ui/components/primitives/Icon.js +71 -0
  366. package/dist-cjs/lib/ui/components/primitives/Icon.js.map +7 -0
  367. package/dist-cjs/lib/ui/components/primitives/Input.js +155 -0
  368. package/dist-cjs/lib/ui/components/primitives/Input.js.map +7 -0
  369. package/dist-cjs/lib/ui/components/primitives/Kbd.js +29 -0
  370. package/dist-cjs/lib/ui/components/primitives/Kbd.js.map +7 -0
  371. package/dist-cjs/lib/ui/components/primitives/Popover.js +69 -0
  372. package/dist-cjs/lib/ui/components/primitives/Popover.js.map +7 -0
  373. package/dist-cjs/lib/ui/components/primitives/Slider.js +69 -0
  374. package/dist-cjs/lib/ui/components/primitives/Slider.js.map +7 -0
  375. package/dist-cjs/lib/ui/components/primitives/shared.js +44 -0
  376. package/dist-cjs/lib/ui/components/primitives/shared.js.map +7 -0
  377. package/dist-cjs/lib/ui/constants.js +25 -0
  378. package/dist-cjs/lib/ui/constants.js.map +7 -0
  379. package/dist-cjs/lib/ui/hooks/clipboard/pasteExcalidrawContent.js +454 -0
  380. package/dist-cjs/lib/ui/hooks/clipboard/pasteExcalidrawContent.js.map +7 -0
  381. package/dist-cjs/lib/ui/hooks/clipboard/pasteFiles.js +37 -0
  382. package/dist-cjs/lib/ui/hooks/clipboard/pasteFiles.js.map +7 -0
  383. package/dist-cjs/lib/ui/hooks/clipboard/pasteTldrawContent.js +32 -0
  384. package/dist-cjs/lib/ui/hooks/clipboard/pasteTldrawContent.js.map +7 -0
  385. package/dist-cjs/lib/ui/hooks/clipboard/pasteUrl.js +48 -0
  386. package/dist-cjs/lib/ui/hooks/clipboard/pasteUrl.js.map +7 -0
  387. package/dist-cjs/lib/ui/hooks/menuHelpers.js +172 -0
  388. package/dist-cjs/lib/ui/hooks/menuHelpers.js.map +7 -0
  389. package/dist-cjs/lib/ui/hooks/useActions.js +1152 -0
  390. package/dist-cjs/lib/ui/hooks/useActions.js.map +7 -0
  391. package/dist-cjs/lib/ui/hooks/useActionsMenuSchema.js +112 -0
  392. package/dist-cjs/lib/ui/hooks/useActionsMenuSchema.js.map +7 -0
  393. package/dist-cjs/lib/ui/hooks/useAssetUrls.js +41 -0
  394. package/dist-cjs/lib/ui/hooks/useAssetUrls.js.map +7 -0
  395. package/dist-cjs/lib/ui/hooks/useBreakpoint.js +64 -0
  396. package/dist-cjs/lib/ui/hooks/useBreakpoint.js.map +7 -0
  397. package/dist-cjs/lib/ui/hooks/useCanRedo.js +29 -0
  398. package/dist-cjs/lib/ui/hooks/useCanRedo.js.map +7 -0
  399. package/dist-cjs/lib/ui/hooks/useCanUndo.js +29 -0
  400. package/dist-cjs/lib/ui/hooks/useCanUndo.js.map +7 -0
  401. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +463 -0
  402. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +7 -0
  403. package/dist-cjs/lib/ui/hooks/useContextMenuSchema.js +228 -0
  404. package/dist-cjs/lib/ui/hooks/useContextMenuSchema.js.map +7 -0
  405. package/dist-cjs/lib/ui/hooks/useCopyAs.js +47 -0
  406. package/dist-cjs/lib/ui/hooks/useCopyAs.js.map +7 -0
  407. package/dist-cjs/lib/ui/hooks/useDialogsProvider.js +108 -0
  408. package/dist-cjs/lib/ui/hooks/useDialogsProvider.js.map +7 -0
  409. package/dist-cjs/lib/ui/hooks/useEditorEvents.js +43 -0
  410. package/dist-cjs/lib/ui/hooks/useEditorEvents.js.map +7 -0
  411. package/dist-cjs/lib/ui/hooks/useEventsProvider.js +47 -0
  412. package/dist-cjs/lib/ui/hooks/useEventsProvider.js.map +7 -0
  413. package/dist-cjs/lib/ui/hooks/useExportAs.js +51 -0
  414. package/dist-cjs/lib/ui/hooks/useExportAs.js.map +7 -0
  415. package/dist-cjs/lib/ui/hooks/useHasLinkShapeSelected.js +36 -0
  416. package/dist-cjs/lib/ui/hooks/useHasLinkShapeSelected.js.map +7 -0
  417. package/dist-cjs/lib/ui/hooks/useHelpMenuSchema.js +103 -0
  418. package/dist-cjs/lib/ui/hooks/useHelpMenuSchema.js.map +7 -0
  419. package/dist-cjs/lib/ui/hooks/useHighDpiCanvas.js +35 -0
  420. package/dist-cjs/lib/ui/hooks/useHighDpiCanvas.js.map +7 -0
  421. package/dist-cjs/lib/ui/hooks/useInsertMedia.js +57 -0
  422. package/dist-cjs/lib/ui/hooks/useInsertMedia.js.map +7 -0
  423. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +138 -0
  424. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +7 -0
  425. package/dist-cjs/lib/ui/hooks/useKeyboardShortcutsSchema.js +134 -0
  426. package/dist-cjs/lib/ui/hooks/useKeyboardShortcutsSchema.js.map +7 -0
  427. package/dist-cjs/lib/ui/hooks/useLocalStorageState.js +59 -0
  428. package/dist-cjs/lib/ui/hooks/useLocalStorageState.js.map +7 -0
  429. package/dist-cjs/lib/ui/hooks/useMenuIsOpen.js +74 -0
  430. package/dist-cjs/lib/ui/hooks/useMenuIsOpen.js.map +7 -0
  431. package/dist-cjs/lib/ui/hooks/useMenuSchema.js +260 -0
  432. package/dist-cjs/lib/ui/hooks/useMenuSchema.js.map +7 -0
  433. package/dist-cjs/lib/ui/hooks/useOnlyFlippableShape.js +38 -0
  434. package/dist-cjs/lib/ui/hooks/useOnlyFlippableShape.js.map +7 -0
  435. package/dist-cjs/lib/ui/hooks/usePreloadAssets.js +106 -0
  436. package/dist-cjs/lib/ui/hooks/usePreloadAssets.js.map +7 -0
  437. package/dist-cjs/lib/ui/hooks/usePreloadIcons.js +51 -0
  438. package/dist-cjs/lib/ui/hooks/usePreloadIcons.js.map +7 -0
  439. package/dist-cjs/lib/ui/hooks/usePrint.js +220 -0
  440. package/dist-cjs/lib/ui/hooks/usePrint.js.map +7 -0
  441. package/dist-cjs/lib/ui/hooks/useReadonly.js +29 -0
  442. package/dist-cjs/lib/ui/hooks/useReadonly.js.map +7 -0
  443. package/dist-cjs/lib/ui/hooks/useRevelantStyles.js +45 -0
  444. package/dist-cjs/lib/ui/hooks/useRevelantStyles.js.map +7 -0
  445. package/dist-cjs/lib/ui/hooks/useShowAutoSizeToggle.js +36 -0
  446. package/dist-cjs/lib/ui/hooks/useShowAutoSizeToggle.js.map +7 -0
  447. package/dist-cjs/lib/ui/hooks/useToastsProvider.js +53 -0
  448. package/dist-cjs/lib/ui/hooks/useToastsProvider.js.map +7 -0
  449. package/dist-cjs/lib/ui/hooks/useToolbarSchema.js +99 -0
  450. package/dist-cjs/lib/ui/hooks/useToolbarSchema.js.map +7 -0
  451. package/dist-cjs/lib/ui/hooks/useTools.js +235 -0
  452. package/dist-cjs/lib/ui/hooks/useTools.js.map +7 -0
  453. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js +17 -0
  454. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +7 -0
  455. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +377 -0
  456. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +7 -0
  457. package/dist-cjs/lib/ui/hooks/useTranslation/translations.js +67 -0
  458. package/dist-cjs/lib/ui/hooks/useTranslation/translations.js.map +7 -0
  459. package/dist-cjs/lib/ui/hooks/useTranslation/useLanguages.js +32 -0
  460. package/dist-cjs/lib/ui/hooks/useTranslation/useLanguages.js.map +7 -0
  461. package/dist-cjs/lib/ui/hooks/useTranslation/useTranslation.js +101 -0
  462. package/dist-cjs/lib/ui/hooks/useTranslation/useTranslation.js.map +7 -0
  463. package/dist-cjs/lib/ui/icon-types.js +190 -0
  464. package/dist-cjs/lib/ui/icon-types.js.map +7 -0
  465. package/dist-cjs/lib/ui/overrides.js +178 -0
  466. package/dist-cjs/lib/ui/overrides.js.map +7 -0
  467. package/dist-cjs/lib/ui/version.js +25 -0
  468. package/dist-cjs/lib/ui/version.js.map +7 -0
  469. package/dist-cjs/lib/utils/assets/assets.js +91 -0
  470. package/dist-cjs/lib/utils/assets/assets.js.map +7 -0
  471. package/dist-cjs/lib/utils/assets/is-gif-animated.js +74 -0
  472. package/dist-cjs/lib/utils/assets/is-gif-animated.js.map +7 -0
  473. package/dist-cjs/lib/utils/assets.js +91 -0
  474. package/dist-cjs/lib/utils/assets.js.map +7 -0
  475. package/dist-cjs/lib/utils/embeds/embeds.js +85 -0
  476. package/dist-cjs/lib/utils/embeds/embeds.js.map +7 -0
  477. package/dist-cjs/lib/utils/export/copyAs.js +116 -0
  478. package/dist-cjs/lib/utils/export/copyAs.js.map +7 -0
  479. package/dist-cjs/lib/utils/export/export.js +117 -0
  480. package/dist-cjs/lib/utils/export/export.js.map +7 -0
  481. package/dist-cjs/lib/utils/export/exportAs.js +88 -0
  482. package/dist-cjs/lib/utils/export/exportAs.js.map +7 -0
  483. package/dist-cjs/lib/utils/frames/frames.js +92 -0
  484. package/dist-cjs/lib/utils/frames/frames.js.map +7 -0
  485. package/dist-cjs/lib/utils/static-assets/assetUrls.js +48 -0
  486. package/dist-cjs/lib/utils/static-assets/assetUrls.js.map +7 -0
  487. package/dist-cjs/lib/utils/text/text.js +57 -0
  488. package/dist-cjs/lib/utils/text/text.js.map +7 -0
  489. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +792 -0
  490. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +7 -0
  491. package/dist-cjs/lib/utils/tldr/file.js +230 -0
  492. package/dist-cjs/lib/utils/tldr/file.js.map +7 -0
  493. package/dist-esm/index.d.mts +2954 -0
  494. package/dist-esm/index.mjs +234 -0
  495. package/dist-esm/index.mjs.map +7 -0
  496. package/dist-esm/lib/Tldraw.mjs +127 -0
  497. package/dist-esm/lib/Tldraw.mjs.map +7 -0
  498. package/dist-esm/lib/canvas/TldrawCropHandles.mjs +134 -0
  499. package/dist-esm/lib/canvas/TldrawCropHandles.mjs.map +7 -0
  500. package/dist-esm/lib/canvas/TldrawHandles.mjs +17 -0
  501. package/dist-esm/lib/canvas/TldrawHandles.mjs.map +7 -0
  502. package/dist-esm/lib/canvas/TldrawHoveredShapeIndicator.mjs +26 -0
  503. package/dist-esm/lib/canvas/TldrawHoveredShapeIndicator.mjs.map +7 -0
  504. package/dist-esm/lib/canvas/TldrawScribble.mjs +42 -0
  505. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +7 -0
  506. package/dist-esm/lib/canvas/TldrawSelectionBackground.mjs +28 -0
  507. package/dist-esm/lib/canvas/TldrawSelectionBackground.mjs.map +7 -0
  508. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +487 -0
  509. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +7 -0
  510. package/dist-esm/lib/defaultExternalContentHandlers.mjs +387 -0
  511. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +7 -0
  512. package/dist-esm/lib/defaultShapeTools.mjs +22 -0
  513. package/dist-esm/lib/defaultShapeTools.mjs.map +7 -0
  514. package/dist-esm/lib/defaultShapeUtils.mjs +30 -0
  515. package/dist-esm/lib/defaultShapeUtils.mjs.map +7 -0
  516. package/dist-esm/lib/defaultSideEffects.mjs +49 -0
  517. package/dist-esm/lib/defaultSideEffects.mjs.map +7 -0
  518. package/dist-esm/lib/defaultTools.mjs +10 -0
  519. package/dist-esm/lib/defaultTools.mjs.map +7 -0
  520. package/dist-esm/lib/shapes/arrow/ArrowShapeTool.mjs +13 -0
  521. package/dist-esm/lib/shapes/arrow/ArrowShapeTool.mjs.map +7 -0
  522. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +808 -0
  523. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +7 -0
  524. package/dist-esm/lib/shapes/arrow/components/ArrowTextLabel.mjs +84 -0
  525. package/dist-esm/lib/shapes/arrow/components/ArrowTextLabel.mjs.map +7 -0
  526. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +33 -0
  527. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +7 -0
  528. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +162 -0
  529. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +7 -0
  530. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +154 -0
  531. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +7 -0
  532. package/dist-esm/lib/shapes/draw/DrawShapeTool.mjs +17 -0
  533. package/dist-esm/lib/shapes/draw/DrawShapeTool.mjs.map +7 -0
  534. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +237 -0
  535. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +7 -0
  536. package/dist-esm/lib/shapes/draw/getPath.mjs +87 -0
  537. package/dist-esm/lib/shapes/draw/getPath.mjs.map +7 -0
  538. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +546 -0
  539. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +7 -0
  540. package/dist-esm/lib/shapes/draw/toolStates/Idle.mjs +17 -0
  541. package/dist-esm/lib/shapes/draw/toolStates/Idle.mjs.map +7 -0
  542. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +181 -0
  543. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +7 -0
  544. package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs +46 -0
  545. package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs.map +7 -0
  546. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +216 -0
  547. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +7 -0
  548. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +93 -0
  549. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +7 -0
  550. package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs +81 -0
  551. package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs.map +7 -0
  552. package/dist-esm/lib/shapes/geo/GeoShapeTool.mjs +13 -0
  553. package/dist-esm/lib/shapes/geo/GeoShapeTool.mjs.map +7 -0
  554. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +1010 -0
  555. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +7 -0
  556. package/dist-esm/lib/shapes/geo/cloudOutline.mjs +275 -0
  557. package/dist-esm/lib/shapes/geo/cloudOutline.mjs.map +7 -0
  558. package/dist-esm/lib/shapes/geo/components/DashStyleCloud.mjs +102 -0
  559. package/dist-esm/lib/shapes/geo/components/DashStyleCloud.mjs.map +7 -0
  560. package/dist-esm/lib/shapes/geo/components/DashStyleEllipse.mjs +101 -0
  561. package/dist-esm/lib/shapes/geo/components/DashStyleEllipse.mjs.map +7 -0
  562. package/dist-esm/lib/shapes/geo/components/DashStyleOval.mjs +93 -0
  563. package/dist-esm/lib/shapes/geo/components/DashStyleOval.mjs.map +7 -0
  564. package/dist-esm/lib/shapes/geo/components/DashStylePolygon.mjs +130 -0
  565. package/dist-esm/lib/shapes/geo/components/DashStylePolygon.mjs.map +7 -0
  566. package/dist-esm/lib/shapes/geo/components/DrawStyleCloud.mjs +54 -0
  567. package/dist-esm/lib/shapes/geo/components/DrawStyleCloud.mjs.map +7 -0
  568. package/dist-esm/lib/shapes/geo/components/DrawStyleEllipse.mjs +116 -0
  569. package/dist-esm/lib/shapes/geo/components/DrawStyleEllipse.mjs.map +7 -0
  570. package/dist-esm/lib/shapes/geo/components/DrawStylePolygon.mjs +68 -0
  571. package/dist-esm/lib/shapes/geo/components/DrawStylePolygon.mjs.map +7 -0
  572. package/dist-esm/lib/shapes/geo/components/SolidStyleCloud.mjs +54 -0
  573. package/dist-esm/lib/shapes/geo/components/SolidStyleCloud.mjs.map +7 -0
  574. package/dist-esm/lib/shapes/geo/components/SolidStyleEllipse.mjs +59 -0
  575. package/dist-esm/lib/shapes/geo/components/SolidStyleEllipse.mjs.map +7 -0
  576. package/dist-esm/lib/shapes/geo/components/SolidStyleOval.mjs +74 -0
  577. package/dist-esm/lib/shapes/geo/components/SolidStyleOval.mjs.map +7 -0
  578. package/dist-esm/lib/shapes/geo/components/SolidStylePolygon.mjs +61 -0
  579. package/dist-esm/lib/shapes/geo/components/SolidStylePolygon.mjs.map +7 -0
  580. package/dist-esm/lib/shapes/geo/helpers.mjs +33 -0
  581. package/dist-esm/lib/shapes/geo/helpers.mjs.map +7 -0
  582. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +33 -0
  583. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs.map +7 -0
  584. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +104 -0
  585. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +7 -0
  586. package/dist-esm/lib/shapes/highlight/HighlightShapeTool.mjs +17 -0
  587. package/dist-esm/lib/shapes/highlight/HighlightShapeTool.mjs.map +7 -0
  588. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +198 -0
  589. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +7 -0
  590. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +252 -0
  591. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +7 -0
  592. package/dist-esm/lib/shapes/line/LineShapeTool.mjs +13 -0
  593. package/dist-esm/lib/shapes/line/LineShapeTool.mjs.map +7 -0
  594. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +357 -0
  595. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +7 -0
  596. package/dist-esm/lib/shapes/line/components/getLinePath.mjs +68 -0
  597. package/dist-esm/lib/shapes/line/components/getLinePath.mjs.map +7 -0
  598. package/dist-esm/lib/shapes/line/components/svg.mjs +57 -0
  599. package/dist-esm/lib/shapes/line/components/svg.mjs.map +7 -0
  600. package/dist-esm/lib/shapes/line/toolStates/Idle.mjs +19 -0
  601. package/dist-esm/lib/shapes/line/toolStates/Idle.mjs.map +7 -0
  602. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +134 -0
  603. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +7 -0
  604. package/dist-esm/lib/shapes/note/NoteShapeTool.mjs +13 -0
  605. package/dist-esm/lib/shapes/note/NoteShapeTool.mjs.map +7 -0
  606. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +193 -0
  607. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +7 -0
  608. package/dist-esm/lib/shapes/note/toolStates/Idle.mjs +17 -0
  609. package/dist-esm/lib/shapes/note/toolStates/Idle.mjs.map +7 -0
  610. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +97 -0
  611. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +7 -0
  612. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +35 -0
  613. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +7 -0
  614. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +93 -0
  615. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +7 -0
  616. package/dist-esm/lib/shapes/shared/TextHelpers.mjs +208 -0
  617. package/dist-esm/lib/shapes/shared/TextHelpers.mjs.map +7 -0
  618. package/dist-esm/lib/shapes/shared/TextLabel.mjs +112 -0
  619. package/dist-esm/lib/shapes/shared/TextLabel.mjs.map +7 -0
  620. package/dist-esm/lib/shapes/shared/createTextSvgElementFromSpans.mjs +57 -0
  621. package/dist-esm/lib/shapes/shared/createTextSvgElementFromSpans.mjs.map +7 -0
  622. package/dist-esm/lib/shapes/shared/default-shape-constants.mjs +52 -0
  623. package/dist-esm/lib/shapes/shared/default-shape-constants.mjs.map +7 -0
  624. package/dist-esm/lib/shapes/shared/defaultStyleDefs.mjs +240 -0
  625. package/dist-esm/lib/shapes/shared/defaultStyleDefs.mjs.map +7 -0
  626. package/dist-esm/lib/shapes/shared/freehand/getStroke.mjs +13 -0
  627. package/dist-esm/lib/shapes/shared/freehand/getStroke.mjs.map +7 -0
  628. package/dist-esm/lib/shapes/shared/freehand/getStrokeOutlinePoints.mjs +155 -0
  629. package/dist-esm/lib/shapes/shared/freehand/getStrokeOutlinePoints.mjs.map +7 -0
  630. package/dist-esm/lib/shapes/shared/freehand/getStrokePoints.mjs +124 -0
  631. package/dist-esm/lib/shapes/shared/freehand/getStrokePoints.mjs.map +7 -0
  632. package/dist-esm/lib/shapes/shared/freehand/getStrokeRadius.mjs +7 -0
  633. package/dist-esm/lib/shapes/shared/freehand/getStrokeRadius.mjs.map +7 -0
  634. package/dist-esm/lib/shapes/shared/freehand/setStrokePointRadii.mjs +81 -0
  635. package/dist-esm/lib/shapes/shared/freehand/setStrokePointRadii.mjs.map +7 -0
  636. package/dist-esm/lib/shapes/shared/freehand/svg.mjs +36 -0
  637. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +7 -0
  638. package/dist-esm/lib/shapes/shared/freehand/svgInk.mjs +150 -0
  639. package/dist-esm/lib/shapes/shared/freehand/svgInk.mjs.map +7 -0
  640. package/dist-esm/lib/shapes/shared/freehand/types.mjs +1 -0
  641. package/dist-esm/lib/shapes/shared/freehand/types.mjs.map +7 -0
  642. package/dist-esm/lib/shapes/shared/getBrowserCanvasMaxSize.mjs +22 -0
  643. package/dist-esm/lib/shapes/shared/getBrowserCanvasMaxSize.mjs.map +7 -0
  644. package/dist-esm/lib/shapes/shared/getPerfectDashProps.mjs +76 -0
  645. package/dist-esm/lib/shapes/shared/getPerfectDashProps.mjs.map +7 -0
  646. package/dist-esm/lib/shapes/shared/getTextLabelSvgElement.mjs +36 -0
  647. package/dist-esm/lib/shapes/shared/getTextLabelSvgElement.mjs.map +7 -0
  648. package/dist-esm/lib/shapes/shared/legacyProps.mjs +22 -0
  649. package/dist-esm/lib/shapes/shared/legacyProps.mjs.map +7 -0
  650. package/dist-esm/lib/shapes/shared/polygon-helpers.mjs +96 -0
  651. package/dist-esm/lib/shapes/shared/polygon-helpers.mjs.map +7 -0
  652. package/dist-esm/lib/shapes/shared/resizeBox.mjs +99 -0
  653. package/dist-esm/lib/shapes/shared/resizeBox.mjs.map +7 -0
  654. package/dist-esm/lib/shapes/shared/resizeScaled.mjs +28 -0
  655. package/dist-esm/lib/shapes/shared/resizeScaled.mjs.map +7 -0
  656. package/dist-esm/lib/shapes/shared/rotated-box-shadow.mjs +30 -0
  657. package/dist-esm/lib/shapes/shared/rotated-box-shadow.mjs.map +7 -0
  658. package/dist-esm/lib/shapes/shared/useColorSpace.mjs +19 -0
  659. package/dist-esm/lib/shapes/shared/useColorSpace.mjs.map +7 -0
  660. package/dist-esm/lib/shapes/shared/useEditableText.mjs +165 -0
  661. package/dist-esm/lib/shapes/shared/useEditableText.mjs.map +7 -0
  662. package/dist-esm/lib/shapes/shared/useForceSolid.mjs +9 -0
  663. package/dist-esm/lib/shapes/shared/useForceSolid.mjs.map +7 -0
  664. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs +18 -0
  665. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs.map +7 -0
  666. package/dist-esm/lib/shapes/text/TextShapeTool.mjs +13 -0
  667. package/dist-esm/lib/shapes/text/TextShapeTool.mjs.map +7 -0
  668. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +334 -0
  669. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +7 -0
  670. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +42 -0
  671. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +7 -0
  672. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +89 -0
  673. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +7 -0
  674. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +180 -0
  675. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +7 -0
  676. package/dist-esm/lib/tools/EraserTool/EraserTool.mjs +16 -0
  677. package/dist-esm/lib/tools/EraserTool/EraserTool.mjs.map +7 -0
  678. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +95 -0
  679. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +7 -0
  680. package/dist-esm/lib/tools/EraserTool/childStates/Idle.mjs +14 -0
  681. package/dist-esm/lib/tools/EraserTool/childStates/Idle.mjs.map +7 -0
  682. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +67 -0
  683. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +7 -0
  684. package/dist-esm/lib/tools/HandTool/HandTool.mjs +38 -0
  685. package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +7 -0
  686. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +38 -0
  687. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +7 -0
  688. package/dist-esm/lib/tools/HandTool/childStates/Idle.mjs +17 -0
  689. package/dist-esm/lib/tools/HandTool/childStates/Idle.mjs.map +7 -0
  690. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs +35 -0
  691. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs.map +7 -0
  692. package/dist-esm/lib/tools/LaserTool/LaserTool.mjs +15 -0
  693. package/dist-esm/lib/tools/LaserTool/LaserTool.mjs.map +7 -0
  694. package/dist-esm/lib/tools/LaserTool/childStates/Idle.mjs +11 -0
  695. package/dist-esm/lib/tools/LaserTool/childStates/Idle.mjs.map +7 -0
  696. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs +46 -0
  697. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs.map +7 -0
  698. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +80 -0
  699. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +7 -0
  700. package/dist-esm/lib/tools/SelectTool/SelectTool.mjs +50 -0
  701. package/dist-esm/lib/tools/SelectTool/SelectTool.mjs.map +7 -0
  702. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +131 -0
  703. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +7 -0
  704. package/dist-esm/lib/tools/SelectTool/childStates/Crop/Crop.mjs +13 -0
  705. package/dist-esm/lib/tools/SelectTool/childStates/Crop/Crop.mjs.map +7 -0
  706. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +187 -0
  707. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +7 -0
  708. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +19 -0
  709. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +7 -0
  710. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs +81 -0
  711. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs.map +7 -0
  712. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs +40 -0
  713. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs.map +7 -0
  714. package/dist-esm/lib/tools/SelectTool/childStates/Crop/crop-constants.mjs +5 -0
  715. package/dist-esm/lib/tools/SelectTool/childStates/Crop/crop-constants.mjs.map +7 -0
  716. package/dist-esm/lib/tools/SelectTool/childStates/Cropping.mjs +194 -0
  717. package/dist-esm/lib/tools/SelectTool/childStates/Cropping.mjs.map +7 -0
  718. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +217 -0
  719. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +7 -0
  720. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +103 -0
  721. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +7 -0
  722. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +447 -0
  723. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +7 -0
  724. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs +36 -0
  725. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs.map +7 -0
  726. package/dist-esm/lib/tools/SelectTool/childStates/PointingCropHandle.mjs +69 -0
  727. package/dist-esm/lib/tools/SelectTool/childStates/PointingCropHandle.mjs.map +7 -0
  728. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +47 -0
  729. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +7 -0
  730. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +73 -0
  731. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +7 -0
  732. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +63 -0
  733. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +7 -0
  734. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +55 -0
  735. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +7 -0
  736. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +159 -0
  737. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +7 -0
  738. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +360 -0
  739. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +7 -0
  740. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +136 -0
  741. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +7 -0
  742. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +125 -0
  743. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +7 -0
  744. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +302 -0
  745. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +7 -0
  746. package/dist-esm/lib/tools/SelectTool/children/DraggingHandle.mjs +217 -0
  747. package/dist-esm/lib/tools/SelectTool/children/DraggingHandle.mjs.map +7 -0
  748. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs +61 -0
  749. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs.map +7 -0
  750. package/dist-esm/lib/tools/ZoomTool/childStates/Idle.mjs +15 -0
  751. package/dist-esm/lib/tools/ZoomTool/childStates/Idle.mjs.map +7 -0
  752. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs +35 -0
  753. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs.map +7 -0
  754. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs +52 -0
  755. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs.map +7 -0
  756. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs +21 -0
  757. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +7 -0
  758. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +8 -0
  759. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +7 -0
  760. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs +60 -0
  761. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs.map +7 -0
  762. package/dist-esm/lib/tools/selection-logic/updateHoveredId.mjs +27 -0
  763. package/dist-esm/lib/tools/selection-logic/updateHoveredId.mjs.map +7 -0
  764. package/dist-esm/lib/ui/TldrawUi.mjs +125 -0
  765. package/dist-esm/lib/ui/TldrawUi.mjs.map +7 -0
  766. package/dist-esm/lib/ui/TldrawUiContextProvider.mjs +37 -0
  767. package/dist-esm/lib/ui/TldrawUiContextProvider.mjs.map +7 -0
  768. package/dist-esm/lib/ui/assetUrls.mjs +47 -0
  769. package/dist-esm/lib/ui/assetUrls.mjs.map +7 -0
  770. package/dist-esm/lib/ui/components/ActionsMenu.mjs +66 -0
  771. package/dist-esm/lib/ui/components/ActionsMenu.mjs.map +7 -0
  772. package/dist-esm/lib/ui/components/BackToContent.mjs +47 -0
  773. package/dist-esm/lib/ui/components/BackToContent.mjs.map +7 -0
  774. package/dist-esm/lib/ui/components/ContextMenu.mjs +184 -0
  775. package/dist-esm/lib/ui/components/ContextMenu.mjs.map +7 -0
  776. package/dist-esm/lib/ui/components/DebugPanel.mjs +315 -0
  777. package/dist-esm/lib/ui/components/DebugPanel.mjs.map +7 -0
  778. package/dist-esm/lib/ui/components/Dialogs.mjs +34 -0
  779. package/dist-esm/lib/ui/components/Dialogs.mjs.map +7 -0
  780. package/dist-esm/lib/ui/components/DuplicateButton.mjs +27 -0
  781. package/dist-esm/lib/ui/components/DuplicateButton.mjs.map +7 -0
  782. package/dist-esm/lib/ui/components/EditLinkDialog.mjs +131 -0
  783. package/dist-esm/lib/ui/components/EditLinkDialog.mjs.map +7 -0
  784. package/dist-esm/lib/ui/components/EmbedDialog.mjs +122 -0
  785. package/dist-esm/lib/ui/components/EmbedDialog.mjs.map +7 -0
  786. package/dist-esm/lib/ui/components/FollowingIndicator.mjs +21 -0
  787. package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +7 -0
  788. package/dist-esm/lib/ui/components/HTMLCanvas.mjs +36 -0
  789. package/dist-esm/lib/ui/components/HTMLCanvas.mjs.map +7 -0
  790. package/dist-esm/lib/ui/components/HelpMenu.mjs +86 -0
  791. package/dist-esm/lib/ui/components/HelpMenu.mjs.map +7 -0
  792. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog.mjs +44 -0
  793. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog.mjs.map +7 -0
  794. package/dist-esm/lib/ui/components/LanguageMenu.mjs +30 -0
  795. package/dist-esm/lib/ui/components/LanguageMenu.mjs.map +7 -0
  796. package/dist-esm/lib/ui/components/Menu.mjs +109 -0
  797. package/dist-esm/lib/ui/components/Menu.mjs.map +7 -0
  798. package/dist-esm/lib/ui/components/MenuZone.mjs +31 -0
  799. package/dist-esm/lib/ui/components/MenuZone.mjs.map +7 -0
  800. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +54 -0
  801. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +7 -0
  802. package/dist-esm/lib/ui/components/MoveToPageMenu.mjs +112 -0
  803. package/dist-esm/lib/ui/components/MoveToPageMenu.mjs.map +7 -0
  804. package/dist-esm/lib/ui/components/NavigationZone/Minimap.mjs +191 -0
  805. package/dist-esm/lib/ui/components/NavigationZone/Minimap.mjs.map +7 -0
  806. package/dist-esm/lib/ui/components/NavigationZone/MinimapManager.mjs +279 -0
  807. package/dist-esm/lib/ui/components/NavigationZone/MinimapManager.mjs.map +7 -0
  808. package/dist-esm/lib/ui/components/NavigationZone/NavigationZone.mjs +83 -0
  809. package/dist-esm/lib/ui/components/NavigationZone/NavigationZone.mjs.map +7 -0
  810. package/dist-esm/lib/ui/components/NavigationZone/ZoomMenu.mjs +88 -0
  811. package/dist-esm/lib/ui/components/NavigationZone/ZoomMenu.mjs.map +7 -0
  812. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs +17 -0
  813. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs.map +7 -0
  814. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs +43 -0
  815. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs.map +7 -0
  816. package/dist-esm/lib/ui/components/PageMenu/PageItemSubmenu.mjs +58 -0
  817. package/dist-esm/lib/ui/components/PageMenu/PageItemSubmenu.mjs.map +7 -0
  818. package/dist-esm/lib/ui/components/PageMenu/PageMenu.mjs +381 -0
  819. package/dist-esm/lib/ui/components/PageMenu/PageMenu.mjs.map +7 -0
  820. package/dist-esm/lib/ui/components/PageMenu/edit-pages-shared.mjs +29 -0
  821. package/dist-esm/lib/ui/components/PageMenu/edit-pages-shared.mjs.map +7 -0
  822. package/dist-esm/lib/ui/components/PenModeToggle.mjs +25 -0
  823. package/dist-esm/lib/ui/components/PenModeToggle.mjs.map +7 -0
  824. package/dist-esm/lib/ui/components/RedoButton.mjs +29 -0
  825. package/dist-esm/lib/ui/components/RedoButton.mjs.map +7 -0
  826. package/dist-esm/lib/ui/components/Spinner.mjs +21 -0
  827. package/dist-esm/lib/ui/components/Spinner.mjs.map +7 -0
  828. package/dist-esm/lib/ui/components/StopFollowing.mjs +25 -0
  829. package/dist-esm/lib/ui/components/StopFollowing.mjs.map +7 -0
  830. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs +108 -0
  831. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +7 -0
  832. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs +59 -0
  833. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +7 -0
  834. package/dist-esm/lib/ui/components/StylePanel/StylePanel.mjs +297 -0
  835. package/dist-esm/lib/ui/components/StylePanel/StylePanel.mjs.map +7 -0
  836. package/dist-esm/lib/ui/components/StylePanel/styles.mjs +99 -0
  837. package/dist-esm/lib/ui/components/StylePanel/styles.mjs.map +7 -0
  838. package/dist-esm/lib/ui/components/Toasts.mjs +71 -0
  839. package/dist-esm/lib/ui/components/Toasts.mjs.map +7 -0
  840. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +43 -0
  841. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +7 -0
  842. package/dist-esm/lib/ui/components/Toolbar/Toolbar.mjs +217 -0
  843. package/dist-esm/lib/ui/components/Toolbar/Toolbar.mjs.map +7 -0
  844. package/dist-esm/lib/ui/components/TrashButton.mjs +31 -0
  845. package/dist-esm/lib/ui/components/TrashButton.mjs.map +7 -0
  846. package/dist-esm/lib/ui/components/UndoButton.mjs +29 -0
  847. package/dist-esm/lib/ui/components/UndoButton.mjs.map +7 -0
  848. package/dist-esm/lib/ui/components/primitives/Button.mjs +49 -0
  849. package/dist-esm/lib/ui/components/primitives/Button.mjs.map +7 -0
  850. package/dist-esm/lib/ui/components/primitives/ButtonPicker.mjs +96 -0
  851. package/dist-esm/lib/ui/components/primitives/ButtonPicker.mjs.map +7 -0
  852. package/dist-esm/lib/ui/components/primitives/Dialog.mjs +40 -0
  853. package/dist-esm/lib/ui/components/primitives/Dialog.mjs.map +7 -0
  854. package/dist-esm/lib/ui/components/primitives/DropdownMenu.mjs +157 -0
  855. package/dist-esm/lib/ui/components/primitives/DropdownMenu.mjs.map +7 -0
  856. package/dist-esm/lib/ui/components/primitives/Icon.mjs +41 -0
  857. package/dist-esm/lib/ui/components/primitives/Icon.mjs.map +7 -0
  858. package/dist-esm/lib/ui/components/primitives/Input.mjs +125 -0
  859. package/dist-esm/lib/ui/components/primitives/Input.mjs.map +7 -0
  860. package/dist-esm/lib/ui/components/primitives/Kbd.mjs +9 -0
  861. package/dist-esm/lib/ui/components/primitives/Kbd.mjs.map +7 -0
  862. package/dist-esm/lib/ui/components/primitives/Popover.mjs +39 -0
  863. package/dist-esm/lib/ui/components/primitives/Popover.mjs.map +7 -0
  864. package/dist-esm/lib/ui/components/primitives/Slider.mjs +49 -0
  865. package/dist-esm/lib/ui/components/primitives/Slider.mjs.map +7 -0
  866. package/dist-esm/lib/ui/components/primitives/shared.mjs +24 -0
  867. package/dist-esm/lib/ui/components/primitives/shared.mjs.map +7 -0
  868. package/dist-esm/lib/ui/constants.mjs +5 -0
  869. package/dist-esm/lib/ui/constants.mjs.map +7 -0
  870. package/dist-esm/lib/ui/hooks/clipboard/pasteExcalidrawContent.mjs +444 -0
  871. package/dist-esm/lib/ui/hooks/clipboard/pasteExcalidrawContent.mjs.map +7 -0
  872. package/dist-esm/lib/ui/hooks/clipboard/pasteFiles.mjs +17 -0
  873. package/dist-esm/lib/ui/hooks/clipboard/pasteFiles.mjs.map +7 -0
  874. package/dist-esm/lib/ui/hooks/clipboard/pasteTldrawContent.mjs +12 -0
  875. package/dist-esm/lib/ui/hooks/clipboard/pasteTldrawContent.mjs.map +7 -0
  876. package/dist-esm/lib/ui/hooks/clipboard/pasteUrl.mjs +28 -0
  877. package/dist-esm/lib/ui/hooks/clipboard/pasteUrl.mjs.map +7 -0
  878. package/dist-esm/lib/ui/hooks/menuHelpers.mjs +157 -0
  879. package/dist-esm/lib/ui/hooks/menuHelpers.mjs.map +7 -0
  880. package/dist-esm/lib/ui/hooks/useActions.mjs +1132 -0
  881. package/dist-esm/lib/ui/hooks/useActions.mjs.map +7 -0
  882. package/dist-esm/lib/ui/hooks/useActionsMenuSchema.mjs +87 -0
  883. package/dist-esm/lib/ui/hooks/useActionsMenuSchema.mjs.map +7 -0
  884. package/dist-esm/lib/ui/hooks/useAssetUrls.mjs +21 -0
  885. package/dist-esm/lib/ui/hooks/useAssetUrls.mjs.map +7 -0
  886. package/dist-esm/lib/ui/hooks/useBreakpoint.mjs +34 -0
  887. package/dist-esm/lib/ui/hooks/useBreakpoint.mjs.map +7 -0
  888. package/dist-esm/lib/ui/hooks/useCanRedo.mjs +9 -0
  889. package/dist-esm/lib/ui/hooks/useCanRedo.mjs.map +7 -0
  890. package/dist-esm/lib/ui/hooks/useCanUndo.mjs +9 -0
  891. package/dist-esm/lib/ui/hooks/useCanUndo.mjs.map +7 -0
  892. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +448 -0
  893. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +7 -0
  894. package/dist-esm/lib/ui/hooks/useContextMenuSchema.mjs +208 -0
  895. package/dist-esm/lib/ui/hooks/useContextMenuSchema.mjs.map +7 -0
  896. package/dist-esm/lib/ui/hooks/useCopyAs.mjs +27 -0
  897. package/dist-esm/lib/ui/hooks/useCopyAs.mjs.map +7 -0
  898. package/dist-esm/lib/ui/hooks/useDialogsProvider.mjs +88 -0
  899. package/dist-esm/lib/ui/hooks/useDialogsProvider.mjs.map +7 -0
  900. package/dist-esm/lib/ui/hooks/useEditorEvents.mjs +23 -0
  901. package/dist-esm/lib/ui/hooks/useEditorEvents.mjs.map +7 -0
  902. package/dist-esm/lib/ui/hooks/useEventsProvider.mjs +17 -0
  903. package/dist-esm/lib/ui/hooks/useEventsProvider.mjs.map +7 -0
  904. package/dist-esm/lib/ui/hooks/useExportAs.mjs +31 -0
  905. package/dist-esm/lib/ui/hooks/useExportAs.mjs.map +7 -0
  906. package/dist-esm/lib/ui/hooks/useHasLinkShapeSelected.mjs +16 -0
  907. package/dist-esm/lib/ui/hooks/useHasLinkShapeSelected.mjs.map +7 -0
  908. package/dist-esm/lib/ui/hooks/useHelpMenuSchema.mjs +73 -0
  909. package/dist-esm/lib/ui/hooks/useHelpMenuSchema.mjs.map +7 -0
  910. package/dist-esm/lib/ui/hooks/useHighDpiCanvas.mjs +15 -0
  911. package/dist-esm/lib/ui/hooks/useHighDpiCanvas.mjs.map +7 -0
  912. package/dist-esm/lib/ui/hooks/useInsertMedia.mjs +37 -0
  913. package/dist-esm/lib/ui/hooks/useInsertMedia.mjs.map +7 -0
  914. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +108 -0
  915. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +7 -0
  916. package/dist-esm/lib/ui/hooks/useKeyboardShortcutsSchema.mjs +104 -0
  917. package/dist-esm/lib/ui/hooks/useKeyboardShortcutsSchema.mjs.map +7 -0
  918. package/dist-esm/lib/ui/hooks/useLocalStorageState.mjs +29 -0
  919. package/dist-esm/lib/ui/hooks/useLocalStorageState.mjs.map +7 -0
  920. package/dist-esm/lib/ui/hooks/useMenuIsOpen.mjs +54 -0
  921. package/dist-esm/lib/ui/hooks/useMenuIsOpen.mjs.map +7 -0
  922. package/dist-esm/lib/ui/hooks/useMenuSchema.mjs +239 -0
  923. package/dist-esm/lib/ui/hooks/useMenuSchema.mjs.map +7 -0
  924. package/dist-esm/lib/ui/hooks/useOnlyFlippableShape.mjs +21 -0
  925. package/dist-esm/lib/ui/hooks/useOnlyFlippableShape.mjs.map +7 -0
  926. package/dist-esm/lib/ui/hooks/usePreloadAssets.mjs +86 -0
  927. package/dist-esm/lib/ui/hooks/usePreloadAssets.mjs.map +7 -0
  928. package/dist-esm/lib/ui/hooks/usePreloadIcons.mjs +31 -0
  929. package/dist-esm/lib/ui/hooks/usePreloadIcons.mjs.map +7 -0
  930. package/dist-esm/lib/ui/hooks/usePrint.mjs +200 -0
  931. package/dist-esm/lib/ui/hooks/usePrint.mjs.map +7 -0
  932. package/dist-esm/lib/ui/hooks/useReadonly.mjs +9 -0
  933. package/dist-esm/lib/ui/hooks/useReadonly.mjs.map +7 -0
  934. package/dist-esm/lib/ui/hooks/useRevelantStyles.mjs +33 -0
  935. package/dist-esm/lib/ui/hooks/useRevelantStyles.mjs.map +7 -0
  936. package/dist-esm/lib/ui/hooks/useShowAutoSizeToggle.mjs +16 -0
  937. package/dist-esm/lib/ui/hooks/useShowAutoSizeToggle.mjs.map +7 -0
  938. package/dist-esm/lib/ui/hooks/useToastsProvider.mjs +33 -0
  939. package/dist-esm/lib/ui/hooks/useToastsProvider.mjs.map +7 -0
  940. package/dist-esm/lib/ui/hooks/useToolbarSchema.mjs +69 -0
  941. package/dist-esm/lib/ui/hooks/useToolbarSchema.mjs.map +7 -0
  942. package/dist-esm/lib/ui/hooks/useTools.mjs +205 -0
  943. package/dist-esm/lib/ui/hooks/useTools.mjs.map +7 -0
  944. package/dist-esm/lib/ui/hooks/useTranslation/TLUiTranslationKey.mjs +1 -0
  945. package/dist-esm/lib/ui/hooks/useTranslation/TLUiTranslationKey.mjs.map +7 -0
  946. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +357 -0
  947. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +7 -0
  948. package/dist-esm/lib/ui/hooks/useTranslation/translations.mjs +47 -0
  949. package/dist-esm/lib/ui/hooks/useTranslation/translations.mjs.map +7 -0
  950. package/dist-esm/lib/ui/hooks/useTranslation/useLanguages.mjs +12 -0
  951. package/dist-esm/lib/ui/hooks/useTranslation/useLanguages.mjs.map +7 -0
  952. package/dist-esm/lib/ui/hooks/useTranslation/useTranslation.mjs +71 -0
  953. package/dist-esm/lib/ui/hooks/useTranslation/useTranslation.mjs.map +7 -0
  954. package/dist-esm/lib/ui/icon-types.mjs +170 -0
  955. package/dist-esm/lib/ui/icon-types.mjs.map +7 -0
  956. package/dist-esm/lib/ui/overrides.mjs +158 -0
  957. package/dist-esm/lib/ui/overrides.mjs.map +7 -0
  958. package/dist-esm/lib/ui/version.mjs +5 -0
  959. package/dist-esm/lib/ui/version.mjs.map +7 -0
  960. package/dist-esm/lib/utils/assets/assets.mjs +61 -0
  961. package/dist-esm/lib/utils/assets/assets.mjs.map +7 -0
  962. package/dist-esm/lib/utils/assets/is-gif-animated.mjs +54 -0
  963. package/dist-esm/lib/utils/assets/is-gif-animated.mjs.map +7 -0
  964. package/dist-esm/lib/utils/assets.mjs +61 -0
  965. package/dist-esm/lib/utils/assets.mjs.map +7 -0
  966. package/dist-esm/lib/utils/embeds/embeds.mjs +65 -0
  967. package/dist-esm/lib/utils/embeds/embeds.mjs.map +7 -0
  968. package/dist-esm/lib/utils/export/copyAs.mjs +96 -0
  969. package/dist-esm/lib/utils/export/copyAs.mjs.map +7 -0
  970. package/dist-esm/lib/utils/export/export.mjs +97 -0
  971. package/dist-esm/lib/utils/export/export.mjs.map +7 -0
  972. package/dist-esm/lib/utils/export/exportAs.mjs +68 -0
  973. package/dist-esm/lib/utils/export/exportAs.mjs.map +7 -0
  974. package/dist-esm/lib/utils/frames/frames.mjs +76 -0
  975. package/dist-esm/lib/utils/frames/frames.mjs.map +7 -0
  976. package/dist-esm/lib/utils/static-assets/assetUrls.mjs +28 -0
  977. package/dist-esm/lib/utils/static-assets/assetUrls.mjs.map +7 -0
  978. package/dist-esm/lib/utils/text/text.mjs +37 -0
  979. package/dist-esm/lib/utils/text/text.mjs.map +7 -0
  980. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +779 -0
  981. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +7 -0
  982. package/dist-esm/lib/utils/tldr/file.mjs +219 -0
  983. package/dist-esm/lib/utils/tldr/file.mjs.map +7 -0
  984. package/package.json +105 -0
  985. package/src/index.ts +174 -0
  986. package/src/lib/Tldraw.test.tsx +78 -0
  987. package/src/lib/Tldraw.tsx +179 -0
  988. package/src/lib/canvas/TldrawCropHandles.tsx +126 -0
  989. package/src/lib/canvas/TldrawHandles.tsx +15 -0
  990. package/src/lib/canvas/TldrawHoveredShapeIndicator.tsx +30 -0
  991. package/src/lib/canvas/TldrawScribble.tsx +45 -0
  992. package/src/lib/canvas/TldrawSelectionBackground.tsx +29 -0
  993. package/src/lib/canvas/TldrawSelectionForeground.tsx +526 -0
  994. package/src/lib/defaultExternalContentHandlers.ts +533 -0
  995. package/src/lib/defaultShapeTools.ts +20 -0
  996. package/src/lib/defaultShapeUtils.ts +29 -0
  997. package/src/lib/defaultSideEffects.ts +48 -0
  998. package/src/lib/defaultTools.ts +8 -0
  999. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +558 -0
  1000. package/src/lib/shapes/arrow/ArrowShapeTool.ts +12 -0
  1001. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +595 -0
  1002. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +1036 -0
  1003. package/src/lib/shapes/arrow/components/ArrowTextLabel.tsx +87 -0
  1004. package/src/lib/shapes/arrow/toolStates/Idle.ts +37 -0
  1005. package/src/lib/shapes/arrow/toolStates/Pointing.ts +190 -0
  1006. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +196 -0
  1007. package/src/lib/shapes/draw/DrawShapeTool.test.ts +52 -0
  1008. package/src/lib/shapes/draw/DrawShapeTool.ts +17 -0
  1009. package/src/lib/shapes/draw/DrawShapeUtil.tsx +298 -0
  1010. package/src/lib/shapes/draw/getPath.ts +108 -0
  1011. package/src/lib/shapes/draw/toolStates/Drawing.ts +722 -0
  1012. package/src/lib/shapes/draw/toolStates/Idle.ts +17 -0
  1013. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +218 -0
  1014. package/src/lib/shapes/frame/FrameShapeTool.test.ts +169 -0
  1015. package/src/lib/shapes/frame/FrameShapeTool.ts +53 -0
  1016. package/src/lib/shapes/frame/FrameShapeUtil.tsx +258 -0
  1017. package/src/lib/shapes/frame/components/FrameHeading.tsx +115 -0
  1018. package/src/lib/shapes/frame/components/FrameLabelInput.tsx +85 -0
  1019. package/src/lib/shapes/geo/GeoShapeTool.test.ts +191 -0
  1020. package/src/lib/shapes/geo/GeoShapeTool.ts +11 -0
  1021. package/src/lib/shapes/geo/GeoShapeUtil.tsx +1153 -0
  1022. package/src/lib/shapes/geo/cloudOutline.ts +391 -0
  1023. package/src/lib/shapes/geo/components/DashStyleCloud.tsx +135 -0
  1024. package/src/lib/shapes/geo/components/DashStyleEllipse.tsx +117 -0
  1025. package/src/lib/shapes/geo/components/DashStyleOval.tsx +102 -0
  1026. package/src/lib/shapes/geo/components/DashStylePolygon.tsx +152 -0
  1027. package/src/lib/shapes/geo/components/DrawStyleCloud.tsx +65 -0
  1028. package/src/lib/shapes/geo/components/DrawStyleEllipse.tsx +145 -0
  1029. package/src/lib/shapes/geo/components/DrawStylePolygon.tsx +263 -0
  1030. package/src/lib/shapes/geo/components/SolidStyleCloud.tsx +65 -0
  1031. package/src/lib/shapes/geo/components/SolidStyleEllipse.tsx +68 -0
  1032. package/src/lib/shapes/geo/components/SolidStyleOval.tsx +83 -0
  1033. package/src/lib/shapes/geo/components/SolidStylePolygon.tsx +77 -0
  1034. package/src/lib/shapes/geo/helpers.ts +34 -0
  1035. package/src/lib/shapes/geo/toolStates/Idle.ts +38 -0
  1036. package/src/lib/shapes/geo/toolStates/Pointing.ts +131 -0
  1037. package/src/lib/shapes/highlight/HighlightShapeTool.test.ts +3 -0
  1038. package/src/lib/shapes/highlight/HighlightShapeTool.ts +17 -0
  1039. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +255 -0
  1040. package/src/lib/shapes/image/ImageShapeUtil.tsx +313 -0
  1041. package/src/lib/shapes/line/LineShapeTool.test.ts +228 -0
  1042. package/src/lib/shapes/line/LineShapeTool.ts +12 -0
  1043. package/src/lib/shapes/line/LineShapeUtil.test.ts +222 -0
  1044. package/src/lib/shapes/line/LineShapeUtil.tsx +421 -0
  1045. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.ts.snap +41 -0
  1046. package/src/lib/shapes/line/components/getLinePath.ts +91 -0
  1047. package/src/lib/shapes/line/components/svg.ts +62 -0
  1048. package/src/lib/shapes/line/toolStates/Idle.ts +20 -0
  1049. package/src/lib/shapes/line/toolStates/Pointing.ts +165 -0
  1050. package/src/lib/shapes/note/NoteShapeTool.test.ts +146 -0
  1051. package/src/lib/shapes/note/NoteShapeTool.ts +11 -0
  1052. package/src/lib/shapes/note/NoteShapeUtil.tsx +221 -0
  1053. package/src/lib/shapes/note/toolStates/Idle.ts +17 -0
  1054. package/src/lib/shapes/note/toolStates/Pointing.ts +121 -0
  1055. package/src/lib/shapes/shared/HyperlinkButton.tsx +30 -0
  1056. package/src/lib/shapes/shared/ShapeFill.tsx +113 -0
  1057. package/src/lib/shapes/shared/TextHelpers.ts +289 -0
  1058. package/src/lib/shapes/shared/TextLabel.tsx +131 -0
  1059. package/src/lib/shapes/shared/createTextSvgElementFromSpans.ts +101 -0
  1060. package/src/lib/shapes/shared/default-shape-constants.ts +57 -0
  1061. package/src/lib/shapes/shared/defaultStyleDefs.tsx +276 -0
  1062. package/src/lib/shapes/shared/freehand/getStroke.ts +23 -0
  1063. package/src/lib/shapes/shared/freehand/getStrokeOutlinePoints.ts +333 -0
  1064. package/src/lib/shapes/shared/freehand/getStrokePoints.ts +187 -0
  1065. package/src/lib/shapes/shared/freehand/getStrokeRadius.ts +13 -0
  1066. package/src/lib/shapes/shared/freehand/setStrokePointRadii.ts +127 -0
  1067. package/src/lib/shapes/shared/freehand/svg.ts +50 -0
  1068. package/src/lib/shapes/shared/freehand/svgInk.ts +195 -0
  1069. package/src/lib/shapes/shared/freehand/types.ts +49 -0
  1070. package/src/lib/shapes/shared/getBrowserCanvasMaxSize.tsx +28 -0
  1071. package/src/lib/shapes/shared/getPerfectDashProps.ts +96 -0
  1072. package/src/lib/shapes/shared/getTextLabelSvgElement.ts +42 -0
  1073. package/src/lib/shapes/shared/legacyProps.ts +25 -0
  1074. package/src/lib/shapes/shared/polygon-helpers.ts +131 -0
  1075. package/src/lib/shapes/shared/resizeBox.ts +130 -0
  1076. package/src/lib/shapes/shared/resizeScaled.ts +40 -0
  1077. package/src/lib/shapes/shared/rotated-box-shadow.ts +29 -0
  1078. package/src/lib/shapes/shared/useColorSpace.tsx +21 -0
  1079. package/src/lib/shapes/shared/useEditableText.ts +211 -0
  1080. package/src/lib/shapes/shared/useForceSolid.ts +6 -0
  1081. package/src/lib/shapes/shared/usePrefersReducedMotion.tsx +18 -0
  1082. package/src/lib/shapes/text/TextShapeTool.test.ts +157 -0
  1083. package/src/lib/shapes/text/TextShapeTool.ts +11 -0
  1084. package/src/lib/shapes/text/TextShapeUtil.tsx +401 -0
  1085. package/src/lib/shapes/text/toolStates/Idle.ts +47 -0
  1086. package/src/lib/shapes/text/toolStates/Pointing.ts +105 -0
  1087. package/src/lib/shapes/video/VideoShapeUtil.tsx +215 -0
  1088. package/src/lib/tools/EraserTool/EraserTool.ts +15 -0
  1089. package/src/lib/tools/EraserTool/childStates/Erasing.ts +131 -0
  1090. package/src/lib/tools/EraserTool/childStates/Idle.ts +13 -0
  1091. package/src/lib/tools/EraserTool/childStates/Pointing.ts +93 -0
  1092. package/src/lib/tools/HandTool/HandTool.ts +40 -0
  1093. package/src/lib/tools/HandTool/childStates/Dragging.ts +45 -0
  1094. package/src/lib/tools/HandTool/childStates/Idle.ts +17 -0
  1095. package/src/lib/tools/HandTool/childStates/Pointing.ts +39 -0
  1096. package/src/lib/tools/LaserTool/LaserTool.ts +14 -0
  1097. package/src/lib/tools/LaserTool/childStates/Idle.ts +9 -0
  1098. package/src/lib/tools/LaserTool/childStates/Lasering.ts +53 -0
  1099. package/src/lib/tools/SelectTool/DragAndDropManager.ts +112 -0
  1100. package/src/lib/tools/SelectTool/SelectTool.ts +49 -0
  1101. package/src/lib/tools/SelectTool/childStates/Brushing.ts +206 -0
  1102. package/src/lib/tools/SelectTool/childStates/Crop/Crop.ts +10 -0
  1103. package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +217 -0
  1104. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +19 -0
  1105. package/src/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.ts +108 -0
  1106. package/src/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.ts +64 -0
  1107. package/src/lib/tools/SelectTool/childStates/Crop/crop-constants.ts +2 -0
  1108. package/src/lib/tools/SelectTool/childStates/Cropping.ts +249 -0
  1109. package/src/lib/tools/SelectTool/childStates/DraggingHandle.ts +308 -0
  1110. package/src/lib/tools/SelectTool/childStates/EditingShape.ts +130 -0
  1111. package/src/lib/tools/SelectTool/childStates/Idle.ts +575 -0
  1112. package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +41 -0
  1113. package/src/lib/tools/SelectTool/childStates/PointingCropHandle.ts +83 -0
  1114. package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +56 -0
  1115. package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +90 -0
  1116. package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +76 -0
  1117. package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +71 -0
  1118. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +218 -0
  1119. package/src/lib/tools/SelectTool/childStates/Resizing.ts +511 -0
  1120. package/src/lib/tools/SelectTool/childStates/Rotating.ts +175 -0
  1121. package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +167 -0
  1122. package/src/lib/tools/SelectTool/childStates/Translating.ts +418 -0
  1123. package/src/lib/tools/SelectTool/children/DraggingHandle.ts +308 -0
  1124. package/src/lib/tools/ZoomTool/ZoomTool.ts +72 -0
  1125. package/src/lib/tools/ZoomTool/childStates/Idle.ts +15 -0
  1126. package/src/lib/tools/ZoomTool/childStates/Pointing.ts +39 -0
  1127. package/src/lib/tools/ZoomTool/childStates/ZoomBrushing.ts +62 -0
  1128. package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +20 -0
  1129. package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +10 -0
  1130. package/src/lib/tools/selection-logic/selectOnCanvasPointerUp.ts +94 -0
  1131. package/src/lib/tools/selection-logic/selection.tldr +1041 -0
  1132. package/src/lib/tools/selection-logic/updateHoveredId.ts +32 -0
  1133. package/src/lib/ui/TldrawUi.tsx +195 -0
  1134. package/src/lib/ui/TldrawUiContextProvider.tsx +99 -0
  1135. package/src/lib/ui/assetUrls.ts +57 -0
  1136. package/src/lib/ui/components/ActionsMenu.tsx +75 -0
  1137. package/src/lib/ui/components/BackToContent.tsx +55 -0
  1138. package/src/lib/ui/components/ContextMenu.tsx +234 -0
  1139. package/src/lib/ui/components/DebugPanel.tsx +355 -0
  1140. package/src/lib/ui/components/Dialogs.tsx +52 -0
  1141. package/src/lib/ui/components/DuplicateButton.tsx +23 -0
  1142. package/src/lib/ui/components/EditLinkDialog.tsx +180 -0
  1143. package/src/lib/ui/components/EmbedDialog.tsx +143 -0
  1144. package/src/lib/ui/components/FollowingIndicator.tsx +16 -0
  1145. package/src/lib/ui/components/HTMLCanvas.tsx +54 -0
  1146. package/src/lib/ui/components/HelpMenu.tsx +109 -0
  1147. package/src/lib/ui/components/KeyboardShortcutsDialog.tsx +62 -0
  1148. package/src/lib/ui/components/LanguageMenu.tsx +38 -0
  1149. package/src/lib/ui/components/Menu.tsx +129 -0
  1150. package/src/lib/ui/components/MenuZone.tsx +35 -0
  1151. package/src/lib/ui/components/MobileStylePanel.tsx +61 -0
  1152. package/src/lib/ui/components/MoveToPageMenu.tsx +104 -0
  1153. package/src/lib/ui/components/NavigationZone/Minimap.tsx +245 -0
  1154. package/src/lib/ui/components/NavigationZone/MinimapManager.ts +382 -0
  1155. package/src/lib/ui/components/NavigationZone/NavigationZone.tsx +81 -0
  1156. package/src/lib/ui/components/NavigationZone/ZoomMenu.tsx +87 -0
  1157. package/src/lib/ui/components/OfflineIndicator/OfflineIndicator.tsx +17 -0
  1158. package/src/lib/ui/components/PageMenu/PageItemInput.tsx +46 -0
  1159. package/src/lib/ui/components/PageMenu/PageItemSubmenu.tsx +86 -0
  1160. package/src/lib/ui/components/PageMenu/PageMenu.tsx +415 -0
  1161. package/src/lib/ui/components/PageMenu/edit-pages-shared.ts +32 -0
  1162. package/src/lib/ui/components/PenModeToggle.tsx +24 -0
  1163. package/src/lib/ui/components/RedoButton.tsx +26 -0
  1164. package/src/lib/ui/components/Spinner.tsx +22 -0
  1165. package/src/lib/ui/components/StopFollowing.tsx +23 -0
  1166. package/src/lib/ui/components/StylePanel/DoubleDropdownPicker.tsx +150 -0
  1167. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +76 -0
  1168. package/src/lib/ui/components/StylePanel/StylePanel.tsx +332 -0
  1169. package/src/lib/ui/components/StylePanel/styles.tsx +100 -0
  1170. package/src/lib/ui/components/Toasts.tsx +104 -0
  1171. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +45 -0
  1172. package/src/lib/ui/components/Toolbar/Toolbar.tsx +281 -0
  1173. package/src/lib/ui/components/TrashButton.tsx +28 -0
  1174. package/src/lib/ui/components/UndoButton.tsx +26 -0
  1175. package/src/lib/ui/components/primitives/Button.tsx +69 -0
  1176. package/src/lib/ui/components/primitives/ButtonPicker.tsx +128 -0
  1177. package/src/lib/ui/components/primitives/Dialog.tsx +57 -0
  1178. package/src/lib/ui/components/primitives/DropdownMenu.tsx +229 -0
  1179. package/src/lib/ui/components/primitives/Icon.tsx +55 -0
  1180. package/src/lib/ui/components/primitives/Input.tsx +165 -0
  1181. package/src/lib/ui/components/primitives/Kbd.tsx +17 -0
  1182. package/src/lib/ui/components/primitives/Popover.tsx +61 -0
  1183. package/src/lib/ui/components/primitives/Slider.tsx +62 -0
  1184. package/src/lib/ui/components/primitives/shared.ts +40 -0
  1185. package/src/lib/ui/constants.ts +2 -0
  1186. package/src/lib/ui/hooks/clipboard/pasteExcalidrawContent.ts +514 -0
  1187. package/src/lib/ui/hooks/clipboard/pasteFiles.ts +31 -0
  1188. package/src/lib/ui/hooks/clipboard/pasteTldrawContent.ts +19 -0
  1189. package/src/lib/ui/hooks/clipboard/pasteUrl.ts +44 -0
  1190. package/src/lib/ui/hooks/menuHelpers.ts +247 -0
  1191. package/src/lib/ui/hooks/useActions.tsx +1180 -0
  1192. package/src/lib/ui/hooks/useActionsMenuSchema.tsx +123 -0
  1193. package/src/lib/ui/hooks/useAssetUrls.tsx +28 -0
  1194. package/src/lib/ui/hooks/useBreakpoint.tsx +42 -0
  1195. package/src/lib/ui/hooks/useCanRedo.ts +7 -0
  1196. package/src/lib/ui/hooks/useCanUndo.ts +7 -0
  1197. package/src/lib/ui/hooks/useClipboardEvents.ts +705 -0
  1198. package/src/lib/ui/hooks/useContextMenuSchema.tsx +260 -0
  1199. package/src/lib/ui/hooks/useCopyAs.ts +26 -0
  1200. package/src/lib/ui/hooks/useDialogsProvider.tsx +128 -0
  1201. package/src/lib/ui/hooks/useEditorEvents.ts +23 -0
  1202. package/src/lib/ui/hooks/useEventsProvider.tsx +129 -0
  1203. package/src/lib/ui/hooks/useExportAs.ts +30 -0
  1204. package/src/lib/ui/hooks/useHasLinkShapeSelected.ts +17 -0
  1205. package/src/lib/ui/hooks/useHelpMenuSchema.tsx +105 -0
  1206. package/src/lib/ui/hooks/useHighDpiCanvas.ts +14 -0
  1207. package/src/lib/ui/hooks/useInsertMedia.ts +35 -0
  1208. package/src/lib/ui/hooks/useKeyboardShortcuts.ts +121 -0
  1209. package/src/lib/ui/hooks/useKeyboardShortcutsSchema.tsx +127 -0
  1210. package/src/lib/ui/hooks/useLocalStorageState.ts +30 -0
  1211. package/src/lib/ui/hooks/useMenuIsOpen.ts +73 -0
  1212. package/src/lib/ui/hooks/useMenuSchema.tsx +280 -0
  1213. package/src/lib/ui/hooks/useOnlyFlippableShape.ts +29 -0
  1214. package/src/lib/ui/hooks/usePreloadAssets.ts +120 -0
  1215. package/src/lib/ui/hooks/usePreloadIcons.ts +38 -0
  1216. package/src/lib/ui/hooks/usePrint.ts +223 -0
  1217. package/src/lib/ui/hooks/useReadonly.ts +7 -0
  1218. package/src/lib/ui/hooks/useRevelantStyles.ts +38 -0
  1219. package/src/lib/ui/hooks/useShowAutoSizeToggle.ts +17 -0
  1220. package/src/lib/ui/hooks/useToastsProvider.tsx +75 -0
  1221. package/src/lib/ui/hooks/useToolbarSchema.tsx +99 -0
  1222. package/src/lib/ui/hooks/useTools.tsx +245 -0
  1223. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +356 -0
  1224. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +367 -0
  1225. package/src/lib/ui/hooks/useTranslation/translations.ts +74 -0
  1226. package/src/lib/ui/hooks/useTranslation/useLanguages.tsx +10 -0
  1227. package/src/lib/ui/hooks/useTranslation/useTranslation.tsx +117 -0
  1228. package/src/lib/ui/icon-types.ts +337 -0
  1229. package/src/lib/ui/overrides.ts +211 -0
  1230. package/src/lib/ui/version.ts +1 -0
  1231. package/src/lib/ui.css +1603 -0
  1232. package/src/lib/utils/assets/assets.ts +103 -0
  1233. package/src/lib/utils/assets/is-gif-animated.ts +106 -0
  1234. package/src/lib/utils/assets.ts +103 -0
  1235. package/src/lib/utils/embeds/embeds.test.ts +612 -0
  1236. package/src/lib/utils/embeds/embeds.ts +99 -0
  1237. package/src/lib/utils/export/copyAs.ts +139 -0
  1238. package/src/lib/utils/export/export.ts +128 -0
  1239. package/src/lib/utils/export/exportAs.ts +94 -0
  1240. package/src/lib/utils/frames/frames.ts +101 -0
  1241. package/src/lib/utils/static-assets/assetUrls.ts +41 -0
  1242. package/src/lib/utils/text/text.test.ts +11 -0
  1243. package/src/lib/utils/text/text.ts +59 -0
  1244. package/src/lib/utils/tldr/buildFromV1Document.ts +1171 -0
  1245. package/src/lib/utils/tldr/file.ts +303 -0
  1246. package/src/test/ClickManager.test.ts +258 -0
  1247. package/src/test/Editor.test.tsx +647 -0
  1248. package/src/test/EraserTool.test.ts +446 -0
  1249. package/src/test/HandTool.test.ts +191 -0
  1250. package/src/test/HighlightShape.test.ts +24 -0
  1251. package/src/test/LaserTool.test.ts +3 -0
  1252. package/src/test/SelectTool.test.ts +445 -0
  1253. package/src/test/TLSessionStateSnapshot.test.ts +152 -0
  1254. package/src/test/TLUserPreferences.test.ts +123 -0
  1255. package/src/test/TestEditor.test.ts +7 -0
  1256. package/src/test/TestEditor.ts +661 -0
  1257. package/src/test/TldrawEditor.test.tsx +377 -0
  1258. package/src/test/ZoomTool.test.ts +210 -0
  1259. package/src/test/__snapshots__/groups.test.ts.snap +46 -0
  1260. package/src/test/__snapshots__/resizing.test.ts.snap +43 -0
  1261. package/src/test/arrowBindingsIndex.test.tsx +295 -0
  1262. package/src/test/arrows-megabus.test.ts +652 -0
  1263. package/src/test/assets.test.ts +38 -0
  1264. package/src/test/bookmark-shapes.test.ts +141 -0
  1265. package/src/test/cleanup.test.ts +127 -0
  1266. package/src/test/commands/__snapshots__/getSvg.test.ts.snap +174 -0
  1267. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +185 -0
  1268. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +12 -0
  1269. package/src/test/commands/alignShapes.test.tsx +388 -0
  1270. package/src/test/commands/allShapesCommonBounds.test.ts +91 -0
  1271. package/src/test/commands/animateShapes.test.ts +3 -0
  1272. package/src/test/commands/animateToShape.test.ts +3 -0
  1273. package/src/test/commands/animationSpeed.test.ts +38 -0
  1274. package/src/test/commands/blur.test.ts +3 -0
  1275. package/src/test/commands/cancel.test.ts +3 -0
  1276. package/src/test/commands/centerOnPoint.test.ts +21 -0
  1277. package/src/test/commands/clipboard.test.ts +481 -0
  1278. package/src/test/commands/complete.test.ts +3 -0
  1279. package/src/test/commands/createPage.test.ts +65 -0
  1280. package/src/test/commands/createShapes.test.ts +141 -0
  1281. package/src/test/commands/deletePage.test.ts +79 -0
  1282. package/src/test/commands/deleteShapes.test.ts +113 -0
  1283. package/src/test/commands/distributeShapes.test.ts +232 -0
  1284. package/src/test/commands/duplicatePage.test.ts +55 -0
  1285. package/src/test/commands/getContent.test.ts +9 -0
  1286. package/src/test/commands/getInitialMetaForShape.test.ts +21 -0
  1287. package/src/test/commands/getSvg.test.ts +110 -0
  1288. package/src/test/commands/groupShapes.test.ts +42 -0
  1289. package/src/test/commands/guide.md +12 -0
  1290. package/src/test/commands/interrupt.test.ts +3 -0
  1291. package/src/test/commands/lockShapes.test.ts +176 -0
  1292. package/src/test/commands/moveShapesToPage.test.ts +254 -0
  1293. package/src/test/commands/nudge.test.ts +292 -0
  1294. package/src/test/commands/packShapes.test.ts +62 -0
  1295. package/src/test/commands/pageToScreen.test.ts +25 -0
  1296. package/src/test/commands/pan.test.ts +32 -0
  1297. package/src/test/commands/penmode.test.ts +27 -0
  1298. package/src/test/commands/pinch.test.ts +11 -0
  1299. package/src/test/commands/putContent.test.ts +39 -0
  1300. package/src/test/commands/reorderShapes.test.ts +950 -0
  1301. package/src/test/commands/reparentShapesById.test.ts +162 -0
  1302. package/src/test/commands/resetZoom.test.ts +30 -0
  1303. package/src/test/commands/resizeShape.test.ts +58 -0
  1304. package/src/test/commands/rotateShapes.test.ts +82 -0
  1305. package/src/test/commands/screenToPage.test.ts +246 -0
  1306. package/src/test/commands/setAppState.test.ts +9 -0
  1307. package/src/test/commands/setBrush.test.ts +38 -0
  1308. package/src/test/commands/setCurrentPage.test.ts +88 -0
  1309. package/src/test/commands/setPageState.test.ts +9 -0
  1310. package/src/test/commands/setSelectedIds.test.ts +57 -0
  1311. package/src/test/commands/setSelectedTool.test.ts +23 -0
  1312. package/src/test/commands/setSettings.test.ts +9 -0
  1313. package/src/test/commands/setStyle.test.ts +11 -0
  1314. package/src/test/commands/squash.test.ts +13 -0
  1315. package/src/test/commands/stackShapes.test.ts +227 -0
  1316. package/src/test/commands/stretch.test.tsx +245 -0
  1317. package/src/test/commands/ungroup.test.ts +17 -0
  1318. package/src/test/commands/updateShapes.test.ts +192 -0
  1319. package/src/test/commands/updateViewportPageBounds.test.ts +123 -0
  1320. package/src/test/commands/zoomIn.test.ts +43 -0
  1321. package/src/test/commands/zoomOut.test.ts +31 -0
  1322. package/src/test/commands/zoomToBounds.test.ts +50 -0
  1323. package/src/test/commands/zoomToFit.test.ts +20 -0
  1324. package/src/test/commands/zoomToSelection.test.ts +42 -0
  1325. package/src/test/cropping.test.ts +1033 -0
  1326. package/src/test/drawing.test.ts +262 -0
  1327. package/src/test/duplicate.test.ts +217 -0
  1328. package/src/test/flipShapes.test.ts +581 -0
  1329. package/src/test/frames.test.ts +995 -0
  1330. package/src/test/getShapeAtPoint.test.ts +168 -0
  1331. package/src/test/getSnapLines.ts +25 -0
  1332. package/src/test/groups.test.ts +2005 -0
  1333. package/src/test/middleMouseButtonPanning.test.ts +31 -0
  1334. package/src/test/modifiers.test.ts +36 -0
  1335. package/src/test/panning.test.ts +25 -0
  1336. package/src/test/parentsToChildrenWithIndexes.test.ts +117 -0
  1337. package/src/test/paste.test.ts +494 -0
  1338. package/src/test/renderingShapes.test.tsx +223 -0
  1339. package/src/test/resizeBox.test.ts +106 -0
  1340. package/src/test/resizing.test.ts +3901 -0
  1341. package/src/test/rotating.test.ts +321 -0
  1342. package/src/test/roundedBox.ts +13 -0
  1343. package/src/test/select.test.tsx +172 -0
  1344. package/src/test/selection-omnibus.test.ts +1710 -0
  1345. package/src/test/shapeIdsInCurrentPage.test.ts +75 -0
  1346. package/src/test/shapeutils.test.ts +204 -0
  1347. package/src/test/spacebarPanning.test.ts +50 -0
  1348. package/src/test/styles2.test.tsx +199 -0
  1349. package/src/test/styles3.test.ts +70 -0
  1350. package/src/test/test-jsx.tsx +134 -0
  1351. package/src/test/testutils/getSnapLines.ts +25 -0
  1352. package/src/test/testutils/roundedBox.ts +13 -0
  1353. package/src/test/text.test.ts +269 -0
  1354. package/src/test/translating-snapping.test.ts +584 -0
  1355. package/src/test/translating.test.ts +1829 -0
  1356. package/src/test/viewport-following.test.ts +18 -0
  1357. package/tldraw.css +3264 -0
@@ -0,0 +1,2005 @@
1
+ import {
2
+ Box2d,
3
+ GroupShapeUtil,
4
+ TLArrowShape,
5
+ TLGroupShape,
6
+ TLLineShape,
7
+ TLShape,
8
+ TLShapeId,
9
+ TLShapePartial,
10
+ VecLike,
11
+ approximately,
12
+ assert,
13
+ compact,
14
+ createShapeId,
15
+ sortByIndex,
16
+ } from '@bigbluebutton/editor'
17
+ import { TestEditor } from './TestEditor'
18
+
19
+ jest.mock('nanoid', () => {
20
+ let i = 0
21
+ return { nanoid: () => 'id' + i++ }
22
+ })
23
+
24
+ const ids = {
25
+ boxA: createShapeId('boxA'),
26
+ boxB: createShapeId('boxB'),
27
+ boxC: createShapeId('boxC'),
28
+ boxD: createShapeId('boxD'),
29
+ boxE: createShapeId('boxE'),
30
+ boxF: createShapeId('boxF'),
31
+ boxX: createShapeId('boxX'),
32
+ lineA: createShapeId('lineA'),
33
+ groupA: createShapeId('groupA'),
34
+ }
35
+
36
+ const box = (
37
+ id: TLShapeId,
38
+ x: number,
39
+ y: number,
40
+ w = 10,
41
+ h = 10,
42
+ fill = 'solid'
43
+ ): TLShapePartial => ({
44
+ type: 'geo',
45
+ id,
46
+ x,
47
+ y,
48
+ // index: bumpIndex(),
49
+ props: {
50
+ w,
51
+ h,
52
+ fill,
53
+ },
54
+ })
55
+ const arrow = (id: TLShapeId, start: VecLike, end: VecLike): TLShapePartial => ({
56
+ type: 'arrow',
57
+ id,
58
+ // index: bumpIndex(),
59
+ props: {
60
+ start: {
61
+ type: 'point',
62
+ x: start.x,
63
+ y: start.y,
64
+ },
65
+ end: {
66
+ type: 'point',
67
+ x: end.x,
68
+ y: end.y,
69
+ },
70
+ },
71
+ })
72
+ const randomRotation = () => Math.random() * Math.PI * 2
73
+ const randomCoord = () => Math.random() * 100 - 50
74
+ const randomSize = () => Math.random() * 99 + 1
75
+
76
+ let editor: TestEditor
77
+
78
+ beforeEach(() => {
79
+ editor = new TestEditor()
80
+ })
81
+ afterEach(() => {
82
+ editor?.dispose()
83
+ })
84
+
85
+ const getAllShapes = () => editor.getCurrentPageShapes()
86
+
87
+ const onlySelectedId = () => {
88
+ expect(editor.getSelectedShapeIds()).toHaveLength(1)
89
+ return editor.getSelectedShapeIds()[0]
90
+ }
91
+
92
+ const onlySelectedShape = () => {
93
+ const id = onlySelectedId()
94
+ return editor.getShape(id)!
95
+ }
96
+
97
+ const children = (shape: TLShape) => {
98
+ return new Set(
99
+ compact(editor.getSortedChildIdsForParent(shape.id).map((id) => editor.getShape(id)))
100
+ )
101
+ }
102
+
103
+ const isRemoved = (shape: TLShape) => {
104
+ return !editor.getShape(shape.id)
105
+ }
106
+
107
+ describe('creating groups', () => {
108
+ it('works if there are multiple shapes in the selection', () => {
109
+ // 0 10 20 30 40 50
110
+ // ┌───┐ ┌───┐ ┌───┐
111
+ // │ A │ │ B │ │ C │
112
+ // └───┘ └───┘ └───┘
113
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 20, 0), box(ids.boxC, 40, 0)])
114
+
115
+ editor.select(ids.boxA, ids.boxB)
116
+ expect(getAllShapes()).toHaveLength(3)
117
+ expect(editor.getSelectedShapeIds().length).toBe(2)
118
+
119
+ editor.groupShapes(editor.getSelectedShapeIds())
120
+
121
+ expect(getAllShapes()).toHaveLength(4)
122
+ expect(editor.getSelectedShapeIds().length).toBe(1)
123
+ expect(editor.getShape(ids.boxA)).toBeTruthy()
124
+ expect(editor.getShape(ids.boxB)).toBeTruthy()
125
+
126
+ const group = onlySelectedShape()
127
+ expect(group.type).toBe(GroupShapeUtil.type)
128
+ expect(editor.getShapePageBounds(group.id)!).toCloselyMatchObject({
129
+ x: 0,
130
+ y: 0,
131
+ w: 30,
132
+ h: 10,
133
+ })
134
+ expect(children(group).has(editor.getShape(ids.boxA)!)).toBe(true)
135
+ expect(children(group).has(editor.getShape(ids.boxB)!)).toBe(true)
136
+ expect(children(group).has(editor.getShape(ids.boxC)!)).toBe(false)
137
+ })
138
+ it('does not work if there are zero or one shape in the selection ', () => {
139
+ // 0 10 20 30 40 50
140
+ // ┌───┐ ┌───┐ ┌───┐
141
+ // │ A │ │ B │ │ C │
142
+ // └───┘ └───┘ └───┘
143
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 20, 0), box(ids.boxC, 40, 0)])
144
+ expect(getAllShapes()).toHaveLength(3)
145
+ editor.groupShapes(editor.getSelectedShapeIds())
146
+ expect(getAllShapes()).toHaveLength(3)
147
+ editor.select(ids.boxA)
148
+ editor.groupShapes(editor.getSelectedShapeIds())
149
+ expect(getAllShapes()).toHaveLength(3)
150
+ expect(onlySelectedId()).toBe(ids.boxA)
151
+ })
152
+
153
+ it('preserves the page positions and rotations of the grouped shapes', () => {
154
+ for (let i = 0; i < 100; i++) {
155
+ const shapes = [
156
+ {
157
+ ...box(ids.boxA, randomCoord(), randomCoord(), randomSize(), randomSize()),
158
+ rotation: randomRotation(),
159
+ },
160
+ {
161
+ ...box(ids.boxB, randomCoord(), randomCoord(), randomSize(), randomSize()),
162
+ rotation: randomRotation(),
163
+ },
164
+ {
165
+ ...box(ids.boxC, randomCoord(), randomCoord(), randomSize(), randomSize()),
166
+ rotation: randomRotation(),
167
+ },
168
+ ]
169
+ editor.createShapes(shapes)
170
+
171
+ const initialPageBounds = {
172
+ A: editor.getShapePageBounds(ids.boxA)!.clone(),
173
+ B: editor.getShapePageBounds(ids.boxB)!.clone(),
174
+ C: editor.getShapePageBounds(ids.boxC)!.clone(),
175
+ }
176
+
177
+ const initialPageRotations = {
178
+ A: editor.getPageRotationById(ids.boxA),
179
+ B: editor.getPageRotationById(ids.boxB),
180
+ C: editor.getPageRotationById(ids.boxC),
181
+ }
182
+
183
+ editor.select(ids.boxA, ids.boxB, ids.boxC)
184
+ editor.groupShapes(editor.getSelectedShapeIds())
185
+
186
+ try {
187
+ expect({
188
+ A: editor.getShapePageBounds(ids.boxA)!.clone(),
189
+ B: editor.getShapePageBounds(ids.boxB)!.clone(),
190
+ C: editor.getShapePageBounds(ids.boxC)!.clone(),
191
+ }).toCloselyMatchObject(initialPageBounds)
192
+ expect({
193
+ A: editor.getPageRotationById(ids.boxA),
194
+ B: editor.getPageRotationById(ids.boxB),
195
+ C: editor.getPageRotationById(ids.boxC),
196
+ }).toCloselyMatchObject(initialPageRotations)
197
+ } catch (e) {
198
+ console.error('Failing nodes', JSON.stringify(shapes))
199
+ throw e
200
+ }
201
+ }
202
+ })
203
+ it('works with nested groups', () => {
204
+ // 0 10 20 30 40 50 60 70
205
+ // ┌───┐ ┌───┐ ┌───┐ ┌───┐
206
+ // │ A │ │ B │ │ C │ │ D │
207
+ // └───┘ └───┘ └───┘ └───┘
208
+ editor.createShapes([
209
+ box(ids.boxA, 0, 0),
210
+ box(ids.boxB, 20, 0),
211
+ box(ids.boxC, 40, 0),
212
+ box(ids.boxD, 60, 0),
213
+ ])
214
+
215
+ editor.select(ids.boxA, ids.boxB)
216
+ editor.groupShapes(editor.getSelectedShapeIds())
217
+
218
+ const groupAId = onlySelectedId()
219
+
220
+ editor.select(ids.boxC, ids.boxD)
221
+ editor.groupShapes(editor.getSelectedShapeIds())
222
+
223
+ const groupBId = onlySelectedId()
224
+
225
+ editor.select(groupAId, groupBId)
226
+ editor.groupShapes(editor.getSelectedShapeIds())
227
+
228
+ const uberGroup = onlySelectedShape()
229
+ expect(uberGroup.type).toBe(GroupShapeUtil.type)
230
+ expect(editor.getShapePageBounds(uberGroup.id)!).toCloselyMatchObject({
231
+ x: 0,
232
+ y: 0,
233
+ w: 70,
234
+ h: 10,
235
+ })
236
+
237
+ expect(children(uberGroup).size).toBe(2)
238
+ expect(children(uberGroup).has(editor.getShape(groupAId)!)).toBe(true)
239
+ expect(children(uberGroup).has(editor.getShape(groupBId)!)).toBe(true)
240
+ })
241
+ it('works with shapes inside individual nested groups', () => {
242
+ // 0 10 20 30 40 50 60 70 80 90 100 110
243
+ //
244
+ // ┌───┐ ┌───┐ ┌───┐ ┌───┐
245
+ // │ A │ │ C │ │ D │ │ F │
246
+ // 10 └───┘ └───┘ └───┘ └───┘
247
+ //
248
+ // 20 ┌───┐ ┌───┐
249
+ // │ B │ │ E │
250
+ // 30 └───┘ └───┘
251
+ editor.createShapes([
252
+ box(ids.boxA, 0, 0),
253
+ box(ids.boxB, 20, 20),
254
+ box(ids.boxC, 40, 0),
255
+ box(ids.boxD, 60, 0),
256
+ box(ids.boxE, 80, 20),
257
+ box(ids.boxF, 100, 0),
258
+ ])
259
+
260
+ editor.select(ids.boxA, ids.boxB, ids.boxC)
261
+ editor.groupShapes(editor.getSelectedShapeIds())
262
+ const groupA = onlySelectedShape()
263
+ editor.select(ids.boxD, ids.boxE, ids.boxF)
264
+ editor.groupShapes(editor.getSelectedShapeIds())
265
+ const groupB = onlySelectedShape()
266
+
267
+ editor.select(ids.boxB, ids.boxE)
268
+ editor.groupShapes(editor.getSelectedShapeIds())
269
+ const groupC = onlySelectedShape()
270
+
271
+ expect(children(groupA).size).toBe(2)
272
+ expect(children(groupB).size).toBe(2)
273
+ expect(children(groupC).size).toBe(2)
274
+
275
+ expect(groupA.parentId).toBe(editor.getCurrentPageId())
276
+ expect(groupB.parentId).toBe(editor.getCurrentPageId())
277
+ expect(groupC.parentId).toBe(editor.getCurrentPageId())
278
+
279
+ expect(editor.getShape(ids.boxA)!.parentId).toBe(groupA.id)
280
+ expect(editor.getShape(ids.boxC)!.parentId).toBe(groupA.id)
281
+
282
+ expect(editor.getShape(ids.boxB)!.parentId).toBe(groupC.id)
283
+ expect(editor.getShape(ids.boxE)!.parentId).toBe(groupC.id)
284
+
285
+ expect(editor.getShape(ids.boxD)!.parentId).toBe(groupB.id)
286
+ expect(editor.getShape(ids.boxF)!.parentId).toBe(groupB.id)
287
+ })
288
+ it('does not work if the scene is in readonly mode', () => {
289
+ // 0 10 20 30 40 50
290
+ // ┌───┐ ┌───┐ ┌───┐
291
+ // │ A │ │ B │ │ C │
292
+ // └───┘ └───┘ └───┘
293
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 20, 0), box(ids.boxC, 40, 0)])
294
+ editor.updateInstanceState({ isReadonly: true })
295
+ editor.setCurrentTool('hand')
296
+ editor.selectAll()
297
+ expect(editor.getSelectedShapeIds().length).toBe(3)
298
+ editor.groupShapes(editor.getSelectedShapeIds())
299
+ expect(editor.getSelectedShapeIds().length).toBe(3)
300
+ })
301
+ it('keeps order correct simple', () => {
302
+ // 0 10 20 30 40 50 60 70
303
+ // ┌───┐ ┌───┐ ┌───┐ ┌───┐
304
+ // │ A │ │ B │ │ C │ │ D │
305
+ // └───┘ └───┘ └───┘ └───┘
306
+ editor.createShapes([
307
+ box(ids.boxA, 0, 0),
308
+ box(ids.boxB, 20, 0),
309
+ box(ids.boxC, 40, 0),
310
+ box(ids.boxD, 60, 0),
311
+ ])
312
+
313
+ editor.select(ids.boxC, ids.boxB)
314
+ editor.groupShapes(editor.getSelectedShapeIds())
315
+
316
+ const groupAId = onlySelectedId()
317
+ const sortedGroupChildrenIds = editor
318
+ .getSortedChildIdsForParent(groupAId)
319
+ .map((id) => editor.getShape(id)!)
320
+ .sort(sortByIndex)
321
+ .map((shape) => shape.id)
322
+
323
+ const sortedIds = editor.getSortedChildIdsForParent(editor.getCurrentPageId())
324
+ expect(sortedIds.length).toBe(3)
325
+ expect(sortedIds[0]).toBe(ids.boxA)
326
+ expect(sortedIds[1]).toBe(groupAId)
327
+ expect(sortedIds[2]).toBe(ids.boxD)
328
+
329
+ expect(sortedGroupChildrenIds.length).toBe(2)
330
+ expect(sortedGroupChildrenIds[0]).toBe(ids.boxB)
331
+ expect(sortedGroupChildrenIds[1]).toBe(ids.boxC)
332
+ })
333
+
334
+ it('keeps order correct complex', () => {
335
+ // 0 10 20 30 40 50 60 70
336
+ // ┌───┐ ┌───┐ ┌───┐ ┌───┐
337
+ // │ A │ │ B │ │ C │ │ D │
338
+ // └───┘ └───┘ └───┘ └───┘
339
+ editor.createShapes([
340
+ box(ids.boxA, 0, 0),
341
+ box(ids.boxB, 20, 0),
342
+ box(ids.boxC, 40, 0),
343
+ box(ids.boxD, 60, 0),
344
+ ])
345
+
346
+ editor.select(ids.boxC, ids.boxA)
347
+ editor.groupShapes(editor.getSelectedShapeIds())
348
+
349
+ const groupAId = onlySelectedId()
350
+
351
+ const sortedGroupChildrenIds = editor
352
+ .getSortedChildIdsForParent(groupAId)
353
+ .map((id) => editor.getShape(id)!)
354
+ .sort(sortByIndex)
355
+ .map((shape) => shape.id)
356
+
357
+ const sortedIds = editor.getSortedChildIdsForParent(editor.getCurrentPageId())
358
+ expect(sortedIds.length).toBe(3)
359
+ expect(sortedIds[0]).toBe(ids.boxB)
360
+ expect(sortedIds[1]).toBe(groupAId)
361
+ expect(sortedIds[2]).toBe(ids.boxD)
362
+
363
+ expect(sortedGroupChildrenIds.length).toBe(2)
364
+ expect(sortedGroupChildrenIds[0]).toBe(ids.boxA)
365
+ expect(sortedGroupChildrenIds[1]).toBe(ids.boxC)
366
+ })
367
+ })
368
+
369
+ describe('ungrouping shapes', () => {
370
+ it('works if there is one selected shape and that shape is a group', () => {
371
+ // 0 10 20 30 40 50
372
+ // ┌───┐ ┌───┐ ┌───┐
373
+ // │ A │ │ B │ │ C │
374
+ // └───┘ └───┘ └───┘
375
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 20, 0), box(ids.boxC, 40, 0)])
376
+
377
+ editor.select(ids.boxA, ids.boxB)
378
+ editor.groupShapes(editor.getSelectedShapeIds())
379
+
380
+ const groupA = onlySelectedShape()
381
+
382
+ editor.ungroupShapes(editor.getSelectedShapeIds())
383
+
384
+ expect(isRemoved(groupA)).toBe(true)
385
+ expect(new Set(editor.getSelectedShapeIds())).toEqual(new Set([ids.boxA, ids.boxB]))
386
+
387
+ expect(editor.getShapePageBounds(ids.boxA)!).toCloselyMatchObject({
388
+ x: 0,
389
+ y: 0,
390
+ w: 10,
391
+ h: 10,
392
+ })
393
+
394
+ expect(editor.getShapePageBounds(ids.boxB)!).toCloselyMatchObject({
395
+ x: 20,
396
+ y: 0,
397
+ w: 10,
398
+ h: 10,
399
+ })
400
+ })
401
+ it('selects the groups children and other non-group shapes on ungroup', () => {
402
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 20, 0), box(ids.boxC, 40, 0)])
403
+ editor.select(ids.boxA, ids.boxB)
404
+ editor.groupShapes(editor.getSelectedShapeIds())
405
+
406
+ const groupA = onlySelectedShape()
407
+
408
+ editor.select(groupA.id, ids.boxC)
409
+ editor.ungroupShapes(editor.getSelectedShapeIds())
410
+
411
+ expect(new Set(editor.getSelectedShapeIds())).toMatchObject(
412
+ new Set([ids.boxA, ids.boxB, ids.boxC])
413
+ )
414
+ })
415
+ it('preserves the page positions and rotations of the ungrouped shapes', () => {
416
+ for (let i = 0; i < 100; i++) {
417
+ const shapes = [
418
+ {
419
+ ...box(ids.boxA, randomCoord(), randomCoord(), randomSize(), randomSize()),
420
+ rotation: randomRotation(),
421
+ },
422
+ {
423
+ ...box(ids.boxB, randomCoord(), randomCoord(), randomSize(), randomSize()),
424
+ rotation: randomRotation(),
425
+ },
426
+ {
427
+ ...box(ids.boxC, randomCoord(), randomCoord(), randomSize(), randomSize()),
428
+ rotation: randomRotation(),
429
+ },
430
+ ]
431
+
432
+ editor.createShapes(shapes)
433
+
434
+ const initialPageBounds = {
435
+ A: editor.getShapePageBounds(ids.boxA)!.clone(),
436
+ B: editor.getShapePageBounds(ids.boxB)!.clone(),
437
+ C: editor.getShapePageBounds(ids.boxC)!.clone(),
438
+ }
439
+
440
+ const initialPageRotations = {
441
+ A: editor.getPageRotationById(ids.boxA),
442
+ B: editor.getPageRotationById(ids.boxB),
443
+ C: editor.getPageRotationById(ids.boxC),
444
+ }
445
+
446
+ editor.select(ids.boxA, ids.boxB, ids.boxC)
447
+ editor.groupShapes(editor.getSelectedShapeIds())
448
+ editor.ungroupShapes(editor.getSelectedShapeIds())
449
+ expect(editor.getSelectedShapeIds().length).toBe(3)
450
+
451
+ try {
452
+ expect({
453
+ A: editor.getShapePageBounds(ids.boxA)!.clone(),
454
+ B: editor.getShapePageBounds(ids.boxB)!.clone(),
455
+ C: editor.getShapePageBounds(ids.boxC)!.clone(),
456
+ }).toCloselyMatchObject(initialPageBounds)
457
+ expect({
458
+ A: editor.getPageRotationById(ids.boxA),
459
+ B: editor.getPageRotationById(ids.boxB),
460
+ C: editor.getPageRotationById(ids.boxC),
461
+ }).toCloselyMatchObject(initialPageRotations)
462
+ } catch (e) {
463
+ console.error('Failing shapes', JSON.stringify(shapes))
464
+ throw e
465
+ }
466
+ }
467
+ })
468
+ it('does not ungroup nested groups', () => {
469
+ // 0 10 20 30 40 50 60 70
470
+ // ┌───┐ ┌───┐ ┌───┐ ┌───┐
471
+ // │ A │ │ B │ │ C │ │ D │
472
+ // └───┘ └───┘ └───┘ └───┘
473
+ editor.createShapes([
474
+ box(ids.boxA, 0, 0),
475
+ box(ids.boxB, 20, 0),
476
+ box(ids.boxC, 40, 0),
477
+ box(ids.boxD, 60, 0),
478
+ ])
479
+
480
+ editor.select(ids.boxA, ids.boxB)
481
+ editor.groupShapes(editor.getSelectedShapeIds())
482
+
483
+ const groupAId = onlySelectedId()
484
+
485
+ editor.select(ids.boxC, ids.boxD)
486
+ editor.groupShapes(editor.getSelectedShapeIds())
487
+
488
+ const groupBId = onlySelectedId()
489
+
490
+ editor.select(groupAId, groupBId)
491
+ editor.groupShapes(editor.getSelectedShapeIds())
492
+ expect(editor.getSelectedShapeIds().length).toBe(1)
493
+ editor.ungroupShapes(editor.getSelectedShapeIds())
494
+ expect(editor.getSelectedShapeIds().length).toBe(2)
495
+ expect(editor.getShape(groupAId)).not.toBe(undefined)
496
+ expect(editor.getShape(groupBId)).not.toBe(undefined)
497
+ })
498
+ it('does not work if the scene is in readonly mode', () => {
499
+ // 0 10 20 30 40 50
500
+ // ┌───┐ ┌───┐ ┌───┐
501
+ // │ A │ │ B │ │ C │
502
+ // └───┘ └───┘ └───┘
503
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 20, 0), box(ids.boxC, 40, 0)])
504
+ editor.selectAll()
505
+ expect(editor.getSelectedShapeIds().length).toBe(3)
506
+ editor.groupShapes(editor.getSelectedShapeIds())
507
+ expect(editor.getSelectedShapeIds().length).toBe(1)
508
+ editor.updateInstanceState({ isReadonly: true })
509
+ editor.setCurrentTool('hand')
510
+
511
+ editor.ungroupShapes(editor.getSelectedShapeIds())
512
+ expect(editor.getSelectedShapeIds().length).toBe(1)
513
+ expect(onlySelectedShape().type).toBe(GroupShapeUtil.type)
514
+ })
515
+ it('keeps order correct simple', () => {
516
+ // 0 10 20 30 40 50 60 70
517
+ // ┌───┐ ┌───┐ ┌───┐ ┌───┐
518
+ // │ A │ │ B │ │ C │ │ D │
519
+ // └───┘ └───┘ └───┘ └───┘
520
+ editor.createShapes([
521
+ box(ids.boxA, 0, 0),
522
+ box(ids.boxB, 20, 0),
523
+ box(ids.boxC, 40, 0),
524
+ box(ids.boxD, 60, 0),
525
+ ])
526
+
527
+ editor.select(ids.boxC, ids.boxB)
528
+ editor.groupShapes(editor.getSelectedShapeIds())
529
+ editor.ungroupShapes(editor.getSelectedShapeIds())
530
+
531
+ const sortedShapesOnCurrentPage = editor
532
+ .getCurrentPageShapes()
533
+ .sort(sortByIndex)
534
+ .map((shape) => shape.id)
535
+ expect(sortedShapesOnCurrentPage.length).toBe(4)
536
+ expect(sortedShapesOnCurrentPage[0]).toBe(ids.boxA)
537
+ expect(sortedShapesOnCurrentPage[1]).toBe(ids.boxB)
538
+ expect(sortedShapesOnCurrentPage[2]).toBe(ids.boxC)
539
+ expect(sortedShapesOnCurrentPage[3]).toBe(ids.boxD)
540
+ })
541
+ it('keeps order correct complex', () => {
542
+ // 0 10 20 30 40 50 60 70
543
+ // ┌───┐ ┌───┐ ┌───┐ ┌───┐
544
+ // │ A │ │ B │ │ C │ │ D │
545
+ // └───┘ └───┘ └───┘ └───┘
546
+ editor.createShapes([
547
+ box(ids.boxA, 0, 0),
548
+ box(ids.boxB, 20, 0),
549
+ box(ids.boxC, 40, 0),
550
+ box(ids.boxD, 60, 0),
551
+ ])
552
+
553
+ editor.select(ids.boxC, ids.boxA)
554
+ editor.groupShapes(editor.getSelectedShapeIds())
555
+ editor.ungroupShapes(editor.getSelectedShapeIds())
556
+
557
+ const sortedShapesOnCurrentPage = editor
558
+ .getCurrentPageShapes()
559
+ .sort(sortByIndex)
560
+ .map((shape) => shape.id)
561
+ expect(sortedShapesOnCurrentPage.length).toBe(4)
562
+ expect(sortedShapesOnCurrentPage[0]).toBe(ids.boxB)
563
+ expect(sortedShapesOnCurrentPage[1]).toBe(ids.boxA)
564
+ expect(sortedShapesOnCurrentPage[2]).toBe(ids.boxC)
565
+ expect(sortedShapesOnCurrentPage[3]).toBe(ids.boxD)
566
+ })
567
+ })
568
+
569
+ describe('the bounds of a group', () => {
570
+ it('changes when the children rotate', () => {
571
+ editor.createShapes([
572
+ box(ids.boxA, 0, 0, 100, 100),
573
+ {
574
+ id: ids.boxB,
575
+ type: 'geo',
576
+ x: 200,
577
+ y: 200,
578
+ props: {
579
+ geo: 'ellipse',
580
+ w: 100,
581
+ h: 100,
582
+ },
583
+ },
584
+ ])
585
+
586
+ editor.select(ids.boxA, ids.boxB)
587
+ editor.groupShapes(editor.getSelectedShapeIds())
588
+ const group = onlySelectedShape()
589
+
590
+ expect(editor.getShapePageBounds(group.id)!.minX).toBe(0)
591
+
592
+ editor.select(ids.boxA).rotateSelection(Math.PI / 4)
593
+
594
+ // pythagoras to the rescue
595
+ const expectedLeftBound = 50 - Math.sqrt(2 * (100 * 100)) / 2
596
+ expect(editor.getShapePageBounds(group.id)!.minX).toBeCloseTo(expectedLeftBound)
597
+
598
+ // rotating the circle doesn't move the right edge because it's outline doesn't change
599
+ expect(editor.getShapePageBounds(group.id)!.maxX).toBe(300)
600
+ editor.select(ids.boxB).rotateSelection(Math.PI / 4)
601
+ expect(approximately(editor.getShapePageBounds(group.id)!.maxX, 300, 1)).toBe(true)
602
+ })
603
+
604
+ it('changes when shapes translate', () => {
605
+ // 0 10 20 30 40 50
606
+ // ┌───┐ ┌───┐ ┌───┐
607
+ // │ A │ │ B │ │ C │
608
+ // └───┘ └───┘ └───┘
609
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 20, 0), box(ids.boxC, 40, 0)])
610
+
611
+ editor.select(ids.boxA, ids.boxB, ids.boxC)
612
+ editor.groupShapes(editor.getSelectedShapeIds())
613
+ const group = onlySelectedShape()
614
+
615
+ expect(editor.getShapePageBounds(group.id)!).toCloselyMatchObject({
616
+ x: 0,
617
+ y: 0,
618
+ w: 50,
619
+ h: 10,
620
+ })
621
+
622
+ // move A to the left
623
+ editor.select(ids.boxA).translateSelection(-10, 0)
624
+ expect(editor.getShapePageBounds(group.id)!).toCloselyMatchObject({
625
+ x: -10,
626
+ y: 0,
627
+ w: 60,
628
+ h: 10,
629
+ })
630
+ // move C up and to the right
631
+ editor.select(ids.boxC).translateSelection(10, -10)
632
+ expect(editor.getShapePageBounds(group.id)!).toCloselyMatchObject({
633
+ x: -10,
634
+ y: -10,
635
+ w: 70,
636
+ h: 20,
637
+ })
638
+ })
639
+
640
+ it('changes when shapes resize', () => {
641
+ // 0 10 20 30 40 50
642
+ // ┌───┐ ┌───┐ ┌───┐
643
+ // │ A │ │ B │ │ C │
644
+ // └───┘ └───┘ └───┘
645
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 20, 0), box(ids.boxC, 40, 0)])
646
+
647
+ editor.select(ids.boxA, ids.boxB, ids.boxC)
648
+ editor.groupShapes(editor.getSelectedShapeIds())
649
+ const group = onlySelectedShape()
650
+
651
+ expect(editor.getShapePageBounds(group.id)!).toCloselyMatchObject({
652
+ x: 0,
653
+ y: 0,
654
+ w: 50,
655
+ h: 10,
656
+ })
657
+
658
+ // resize A to the left
659
+ editor.select(ids.boxA).resizeSelection({ scaleX: 2 }, 'left')
660
+ expect(editor.getShapePageBounds(group.id)!).toCloselyMatchObject({
661
+ x: -10,
662
+ y: 0,
663
+ w: 60,
664
+ h: 10,
665
+ })
666
+ // resize C up and to the right
667
+ editor.select(ids.boxC).resizeSelection({ scaleY: 2, scaleX: 2 }, 'top_right')
668
+ expect(editor.getShapePageBounds(group.id)!).toCloselyMatchObject({
669
+ x: -10,
670
+ y: -10,
671
+ w: 70,
672
+ h: 20,
673
+ })
674
+ })
675
+ })
676
+
677
+ describe('the bounds of a rotated group', () => {
678
+ it('changes when the children rotate', () => {
679
+ editor.createShapes([
680
+ box(ids.boxA, 0, 0, 100, 100),
681
+ {
682
+ id: ids.boxB,
683
+ type: 'geo',
684
+ x: 200,
685
+ y: 200,
686
+ props: {
687
+ geo: 'ellipse',
688
+ w: 100,
689
+ h: 100,
690
+ },
691
+ },
692
+ ])
693
+
694
+ editor.select(ids.boxA, ids.boxB)
695
+ editor.groupShapes(editor.getSelectedShapeIds())
696
+ const group = onlySelectedShape()
697
+
698
+ editor.rotateSelection(Math.PI / 2)
699
+
700
+ expect(editor.getShapePageBounds(group.id)!).toCloselyMatchObject({
701
+ x: 0,
702
+ y: 0,
703
+ w: 300,
704
+ h: 300,
705
+ })
706
+
707
+ editor.select(ids.boxA).rotateSelection(Math.PI / 4)
708
+
709
+ // pythagoras to the rescue
710
+ const expectedTopBound = 50 - Math.sqrt(2 * (100 * 100)) / 2
711
+ expect(editor.getShapePageBounds(group.id)!.minY).toBeCloseTo(expectedTopBound)
712
+
713
+ // rotating the circle doesn't move the right edge because it's outline doesn't change
714
+ expect(editor.getShapePageBounds(group.id)!.maxY).toBe(300)
715
+ editor.select(ids.boxB).rotateSelection(Math.PI / 4)
716
+ expect(approximately(editor.getShapePageBounds(group.id)!.maxY, 300, 1)).toBe(true)
717
+ })
718
+
719
+ it('changes when shapes translate', () => {
720
+ // 0 10 20 30 40 50
721
+ // ┌───┐ ┌───┐ ┌───┐
722
+ // │ A │ │ B │ │ C │
723
+ // └───┘ └───┘ └───┘
724
+ // rotate this all 90 degrees
725
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 20, 0), box(ids.boxC, 40, 0)])
726
+
727
+ editor.select(ids.boxA, ids.boxB, ids.boxC)
728
+ editor.groupShapes(editor.getSelectedShapeIds())
729
+ const group = onlySelectedShape()
730
+ editor.updateShapes([{ id: group.id, type: 'group', rotation: Math.PI / 2, x: 10, y: 0 }])
731
+
732
+ expect(editor.getShapePageBounds(group.id)!).toCloselyMatchObject({
733
+ x: 0,
734
+ y: 0,
735
+ w: 10,
736
+ h: 50,
737
+ })
738
+
739
+ // move A up and to the left
740
+ editor.select(ids.boxA).translateSelection(-10, -10)
741
+ expect(editor.getShapePageBounds(group.id)!).toCloselyMatchObject({
742
+ x: -10,
743
+ y: -10,
744
+ w: 20,
745
+ h: 60,
746
+ })
747
+ // move C up and to the right
748
+ editor.select(ids.boxC).translateSelection(10, -10)
749
+ expect(editor.getShapePageBounds(group.id)!).toCloselyMatchObject({
750
+ x: -10,
751
+ y: -10,
752
+ w: 30,
753
+ h: 50,
754
+ })
755
+ })
756
+
757
+ it('changes when shapes resize', () => {
758
+ // 0 10 20 30 40 50
759
+ // ┌───┐ ┌───┐ ┌───┐
760
+ // │ A │ │ B │ │ C │
761
+ // └───┘ └───┘ └───┘
762
+ // rotate this all 90 degrees
763
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 20, 0), box(ids.boxC, 40, 0)])
764
+
765
+ expect(editor.getShapeGeometry(ids.boxA)!.bounds).toMatchObject({ x: 0, y: 0, w: 10, h: 10 })
766
+
767
+ editor.select(ids.boxA, ids.boxB, ids.boxC)
768
+ editor.groupShapes(editor.getSelectedShapeIds())
769
+ const group = onlySelectedShape()
770
+ editor.updateShapes([{ id: group.id, type: 'group', rotation: Math.PI / 2, x: 10, y: 0 }])
771
+
772
+ expect(editor.getShapePageBounds(group.id)!).toCloselyMatchObject({
773
+ x: 0,
774
+ y: 0,
775
+ w: 10,
776
+ h: 50,
777
+ })
778
+
779
+ // resize A to up
780
+ editor.select(ids.boxA).resizeSelection({ scaleX: 2 }, 'left')
781
+ expect(editor.getShapePageBounds(group.id)!).toCloselyMatchObject({
782
+ x: 0,
783
+ y: -10,
784
+ w: 10,
785
+ h: 60,
786
+ })
787
+ // resize C up and to the right
788
+ editor.select(ids.boxC).resizeSelection({ scaleY: 2, scaleX: 2 }, 'top_right')
789
+ expect(editor.getShapePageBounds(group.id)!).toCloselyMatchObject({
790
+ x: 0,
791
+ y: -10,
792
+ w: 20,
793
+ h: 70,
794
+ })
795
+ })
796
+ })
797
+
798
+ describe('focus layers', () => {
799
+ let groupAId: TLShapeId
800
+ let groupBId: TLShapeId
801
+ let groupCId: TLShapeId
802
+ beforeEach(() => {
803
+ // group C
804
+ // ┌─────────────────────────────────────────────────────────┐
805
+ // │ group A group B │
806
+ // │ ┌────────────────────────┐ ┌──────────────────────┐ │
807
+ // │ │ ┌───┐ ┌───┐ │ │ ┌───┐ ┌───┐ │ │
808
+ // │ │ │ A │ │ B │ │ │ │ C │ │ D │ │ │
809
+ // │ │ └───┘ └───┘ │ │ └───┘ └───┘ │ │
810
+ // │ └────────────────────────┘ └──────────────────────┘ │
811
+ // └─────────────────────────────────────────────────────────┘
812
+ editor.createShapes([
813
+ box(ids.boxA, 0, 0),
814
+ box(ids.boxB, 20, 0),
815
+ box(ids.boxC, 40, 0),
816
+ box(ids.boxD, 60, 0),
817
+ ])
818
+ editor.select(ids.boxA, ids.boxB)
819
+ editor.groupShapes(editor.getSelectedShapeIds())
820
+ groupAId = onlySelectedId()
821
+ editor.select(ids.boxC, ids.boxD)
822
+ editor.groupShapes(editor.getSelectedShapeIds())
823
+ groupBId = onlySelectedId()
824
+ editor.select(groupAId, groupBId)
825
+ editor.groupShapes(editor.getSelectedShapeIds())
826
+ groupCId = onlySelectedId()
827
+ editor.selectNone()
828
+ })
829
+ it('should adjust to the parent layer of any selected shape', () => {
830
+ expect(editor.getFocusedGroupId()).toBe(editor.getCurrentPageId())
831
+ editor.select(ids.boxA)
832
+ expect(editor.getFocusedGroupId()).toBe(groupAId)
833
+ editor.select(ids.boxB)
834
+ expect(editor.getFocusedGroupId()).toBe(groupAId)
835
+ editor.select(ids.boxC)
836
+ expect(editor.getFocusedGroupId()).toBe(groupBId)
837
+ editor.select(ids.boxD)
838
+ expect(editor.getFocusedGroupId()).toBe(groupBId)
839
+ editor.select(groupAId)
840
+ expect(editor.getFocusedGroupId()).toBe(groupCId)
841
+ })
842
+ it('should adjust to the common ancestor of selected shapes in multiple groups', () => {
843
+ expect(editor.getFocusedGroupId()).toBe(editor.getCurrentPageId())
844
+ editor.select(ids.boxA)
845
+ expect(editor.getFocusedGroupId()).toBe(groupAId)
846
+ editor.setSelectedShapes([...editor.getSelectedShapeIds(), ids.boxC])
847
+ expect(editor.getFocusedGroupId()).toBe(groupCId)
848
+ editor.deselect(ids.boxA)
849
+ expect(editor.getFocusedGroupId()).toBe(groupBId)
850
+ editor.setSelectedShapes([...editor.getSelectedShapeIds(), ids.boxB])
851
+ expect(editor.getFocusedGroupId()).toBe(groupCId)
852
+ })
853
+ it('should not adjust the focus layer when clearing the selection', () => {
854
+ expect(editor.getFocusedGroupId()).toBe(editor.getCurrentPageId())
855
+ editor.select(ids.boxA)
856
+ expect(editor.getFocusedGroupId()).toBe(groupAId)
857
+ editor.deselect(ids.boxA)
858
+ expect(editor.getFocusedGroupId()).toBe(groupAId)
859
+ editor.select(ids.boxB, ids.boxC)
860
+ expect(editor.getFocusedGroupId()).toBe(groupCId)
861
+ editor.selectNone()
862
+ expect(editor.getFocusedGroupId()).toBe(groupCId)
863
+ })
864
+ })
865
+
866
+ describe('right clicking in detail', () => {
867
+ const groupId = createShapeId('groupA')
868
+ beforeEach(() => {
869
+ // A - fill: none
870
+ // B - fill: solid
871
+ // C - fill: none
872
+ // ┌──────────────────┐
873
+ // │ 0 20 │
874
+ // │ ┌───┐ ┌───┐ │
875
+ // │ │ A │ │ B │ │
876
+ // │ └───┘ └───┘ │
877
+ // └──────────────────┘
878
+ // ┌───┐
879
+ // | C |
880
+ // └───┘
881
+ editor.createShapes([
882
+ box(ids.boxA, 0, 0, 10, 10, 'none'),
883
+ box(ids.boxB, 20, 0, 10, 10, 'solid'),
884
+ box(ids.boxC, 0, 50, 10, 10, 'none'),
885
+ ])
886
+ editor.groupShapes([ids.boxA, ids.boxB], groupId)
887
+ editor.selectNone()
888
+ })
889
+
890
+ // TODO: fix this
891
+ it('should select the group by right-clicking the margin of a hollow shape', () => {
892
+ editor.pointerMove(4, 4).pointerDown(4, 4, { target: 'canvas', button: 2 }).pointerUp()
893
+ expect(onlySelectedId()).toBe(groupId)
894
+ })
895
+ })
896
+
897
+ describe('the select tool', () => {
898
+ const groupAId = createShapeId('groupA')
899
+ const groupBId = createShapeId('groupB')
900
+ const groupCId = createShapeId('groupC')
901
+ beforeEach(() => {
902
+ // group C
903
+ // ┌─────────────────────────────────────────────────────────┐
904
+ // │ group A group B │
905
+ // │ ┌────────────────────────┐ ┌──────────────────────┐ │
906
+ // │ │ 0 20 │ │ 40 60 │ │
907
+ // │ │ ┌───┐ ┌───┐ │ │ ┌───┐ ┌───┐ │ │
908
+ // │ │ │ A │ │ B │ │ │ │ C │ │ D │ │ │
909
+ // │ │ └───┘ └───┘ │ │ └───┘ └───┘ │ │
910
+ // │ └────────────────────────┘ └──────────────────────┘ │
911
+ // └─────────────────────────────────────────────────────────┘
912
+ editor.createShapes([
913
+ box(ids.boxA, 0, 0, 10, 10),
914
+ box(ids.boxB, 30, 0, 10, 10),
915
+ box(ids.boxC, 60, 0, 10, 10),
916
+ box(ids.boxD, 90, 0, 10, 10),
917
+ ])
918
+ editor.groupShapes([ids.boxA, ids.boxB], groupAId)
919
+ editor.groupShapes([ids.boxC, ids.boxD], groupBId)
920
+ editor.groupShapes([groupAId, groupBId], groupCId)
921
+ editor.selectNone()
922
+ })
923
+
924
+ it('should select the outermost non-selected group when you click on one of the shapes in that group', () => {
925
+ editor.pointerDown(0, 0, ids.boxA).pointerUp(0, 0)
926
+ expect(onlySelectedId()).toBe(groupCId)
927
+ expect(editor.getFocusedGroupId()).toBe(editor.getCurrentPageId())
928
+ editor.pointerDown(0, 0, ids.boxA)
929
+ editor.pointerUp(0, 0, ids.boxA)
930
+ expect(onlySelectedId()).toBe(groupAId)
931
+ expect(editor.getFocusedGroupId()).toBe(groupCId)
932
+ editor.pointerDown(0, 0, ids.boxA).pointerUp(0, 0, ids.boxA)
933
+ expect(onlySelectedId()).toBe(ids.boxA)
934
+ expect(editor.getFocusedGroupId()).toBe(groupAId)
935
+ })
936
+
937
+ it('should select the outermost non-selected group when you right-click on one of the shapes in that group', () => {
938
+ const boxA = editor.getShape(ids.boxA)
939
+
940
+ editor
941
+ .pointerDown(0, 0, { target: 'shape', shape: boxA, button: 2 })
942
+ .pointerUp(0, 0, { button: 2 })
943
+ expect(onlySelectedId()).toBe(groupCId)
944
+ expect(editor.getFocusedGroupId()).toBe(editor.getCurrentPageId())
945
+ editor
946
+ .pointerDown(0, 0, { target: 'shape', shape: boxA, button: 2 })
947
+ .pointerUp(0, 0, { button: 2 })
948
+ expect(onlySelectedId()).toBe(groupAId)
949
+ expect(editor.getFocusedGroupId()).toBe(groupCId)
950
+ editor
951
+ .pointerDown(0, 0, { target: 'shape', shape: boxA, button: 2 })
952
+ .pointerUp(0, 0, { button: 2 })
953
+ expect(onlySelectedId()).toBe(ids.boxA)
954
+ expect(editor.getFocusedGroupId()).toBe(groupAId)
955
+ })
956
+
957
+ it('should allow to shift-select other shapes outside of the current focus layer', () => {
958
+ editor.pointerDown(0, 0, ids.boxA).pointerUp(0, 0)
959
+ editor.pointerDown(0, 0, ids.boxA).pointerUp(0, 0)
960
+ editor.pointerDown(0, 0, ids.boxA).pointerUp(0, 0)
961
+ expect(onlySelectedId()).toBe(ids.boxA)
962
+ expect(editor.getFocusedGroupId()).toBe(groupAId)
963
+
964
+ editor
965
+ .pointerDown(60, 0, ids.boxC, { shiftKey: true })
966
+ .pointerUp(0, 0, ids.boxC, { shiftKey: true })
967
+ expect(editor.getSelectedShapeIds().includes(ids.boxA)).toBe(true)
968
+ expect(editor.getSelectedShapeIds().includes(groupBId)).toBe(true)
969
+ expect(editor.getFocusedGroupId()).toBe(groupCId)
970
+
971
+ editor.pointerDown(60, 0, ids.boxC, { shiftKey: true }).pointerUp()
972
+ expect(editor.getSelectedShapeIds().includes(ids.boxA)).toBe(true)
973
+ expect(editor.getSelectedShapeIds().includes(groupBId)).toBe(false)
974
+ expect(editor.getSelectedShapeIds().includes(ids.boxC)).toBe(true)
975
+ expect(editor.getFocusedGroupId()).toBe(groupCId)
976
+ })
977
+
978
+ it('if a shape inside a focused group is selected and you click outside the group it should clear the selection and focus the page', () => {
979
+ editor.select(ids.boxA)
980
+ expect(editor.getFocusedGroupId()).toBe(groupAId)
981
+
982
+ // click outside the focused group, but inside another group
983
+ editor.pointerDown(-235, 5, { target: 'canvas' }).pointerUp(-235, 5)
984
+ expect(editor.getFocusedGroupId()).toBe(editor.getCurrentPageId())
985
+ expect(editor.getSelectedShapeIds()).toHaveLength(0)
986
+
987
+ editor.select(ids.boxA)
988
+ expect(editor.getFocusedGroupId()).toBe(groupAId)
989
+
990
+ // click the empty canvas
991
+ editor.pointerDown(-235, 50, { target: 'canvas' }).pointerUp(-235, 50)
992
+ expect(editor.getFocusedGroupId()).toBe(editor.getCurrentPageId())
993
+ expect(editor.getSelectedShapeIds()).toHaveLength(0)
994
+ })
995
+
996
+ // ! Removed with hollow shape clicking feature
997
+ // it('if a shape inside a focused group is selected and you click an empty space inside the group it should deselect the shape', () => {
998
+ // editor.select(ids.boxA)
999
+ // expect(editor.focusedGroupId).toBe(groupAId)
1000
+ // expect(editor.selectedShapeIds).toEqual([ids.boxA])
1001
+ // editor.pointerDown(20, 5)
1002
+ // editor.pointerUp(20, 5)
1003
+ // expect(editor.focusedGroupId).toBe(groupAId)
1004
+ // expect(editor.selectedShapeIds).toEqual([])
1005
+ // })
1006
+
1007
+ // ! Removed
1008
+ // it('if you click inside the empty space of a focused group while there are no selected shapes, it should pop the focus layer and select the group', () => {
1009
+ // editor.select(ids.boxA)
1010
+ // editor.pointerDown(15, 5, groupAId).pointerUp(15, 5, groupAId)
1011
+ // expect(editor.focusedGroupId).toBe(groupAId)
1012
+ // expect(editor.selectedShapeIds.length).toBe(0)
1013
+ // editor.pointerDown(15, 5, groupAId).pointerUp(15, 5, groupAId)
1014
+ // expect(editor.focusedGroupId).toBe(groupCId)
1015
+ // expect(onlySelectedId()).toBe(groupAId)
1016
+ // })
1017
+
1018
+ it('should pop the focus layer when escape is pressed in idle state', () => {
1019
+ editor.select(ids.boxA)
1020
+ expect(editor.getSelectedShapeIds()).toMatchObject([ids.boxA]) // box1
1021
+ expect(editor.getFocusedGroupId()).toBe(groupAId)
1022
+ // deselct
1023
+ editor.cancel()
1024
+ expect(editor.getSelectedShapeIds()).toMatchObject([groupAId]) // groupA
1025
+ expect(editor.getFocusedGroupId()).toBe(groupCId)
1026
+ // pop focus layer
1027
+ editor.cancel()
1028
+ expect(editor.getSelectedShapeIds().length).toBe(1) // Group C
1029
+ expect(editor.getFocusedGroupId()).toBe(editor.getCurrentPageId())
1030
+ editor.cancel()
1031
+ expect(editor.getSelectedShapeIds().length).toBe(0)
1032
+ expect(editor.getFocusedGroupId()).toBe(editor.getCurrentPageId())
1033
+ })
1034
+
1035
+ // ! Removed: pointing a group is impossible; you'd be pointing the selection instead.
1036
+ // it('should work while focused in a group if you start the drag from within the group', () => {
1037
+ // editor.select(ids.boxA)
1038
+ // editor.pointerDown(15, 5, groupAId).pointerMove(25, 9, ids.boxB)
1039
+ // expect(editor.getPath()).toBe(`select.brushing`)
1040
+ // expect(editor.selectedShapeIds.includes(ids.boxA)).toBe(false)
1041
+ // expect(editor.selectedShapeIds.includes(ids.boxB)).toBe(true)
1042
+
1043
+ // editor.keyDown('Shift')
1044
+ // expect(editor.selectedShapeIds.includes(ids.boxA)).toBe(true)
1045
+ // expect(editor.selectedShapeIds.includes(ids.boxB)).toBe(true)
1046
+ // })
1047
+
1048
+ it('should work while focused in a group if you start the drag from outside of the group', () => {
1049
+ editor.select(ids.boxA)
1050
+ expect(editor.getShapesAtPoint({ x: -305, y: -5 })).toMatchObject([])
1051
+ editor.pointerDown(-305, -5, { target: 'canvas' }).pointerMove(35, 9, ids.boxB)
1052
+
1053
+ editor.expectToBeIn(`select.brushing`)
1054
+ expect(editor.getSelectedShapeIds().includes(ids.boxA)).toBe(true)
1055
+ expect(editor.getSelectedShapeIds().includes(ids.boxB)).toBe(true)
1056
+
1057
+ // this one didn't make sense as written—the forced event on canvas won't work now
1058
+ // that we're doing hit testing manually—we'll catch that it was inside a shape
1059
+
1060
+ // editor.keyUp('Shift')
1061
+ // jest.advanceTimersByTime(200)
1062
+
1063
+ // expect(editor.selectedShapeIds.includes(ids.boxA)).toBe(false)
1064
+ // expect(editor.selectedShapeIds.includes(ids.boxB)).toBe(true)
1065
+ })
1066
+
1067
+ it('should not select the group until you hit one of its child shapes', () => {
1068
+ // ┌────┐
1069
+ // group C │ │
1070
+ // ┌───────────┼────┼────────────────────────────────────────┐
1071
+ // │ group A │ │ group B │
1072
+ // │ ┌─────────┼────┼─────────┐ ┌──────────────────────┐ │
1073
+ // │ │ ┌───┐ │ │ ┌───┐ │ │ ┌───┐ ┌───┐ │ │
1074
+ // │ │ │ A │ │ │ │ B │ │ │ │ C │ │ D │ │ │
1075
+ // │ │ └───┘ │ │ └───┘ │ │ └───┘ └───┘ │ │
1076
+ // │ └─────────┼────┼─────────┘ └──────────────────────┘ │
1077
+ // └───────────┼────┼────────────────────────────────────────┘
1078
+ // │ │
1079
+ // └────┘
1080
+ // ▲
1081
+ // │ mouse selection
1082
+ editor.pointerDown(12.5, -15, undefined).pointerMove(17.5, 15, ids.boxB)
1083
+ expect(editor.getSelectedShapeIds().length).toBe(0)
1084
+ editor.pointerMove(35, 15)
1085
+ expect(onlySelectedId()).toBe(groupCId)
1086
+ })
1087
+ })
1088
+
1089
+ describe("when a group's children are deleted", () => {
1090
+ let groupAId: TLShapeId
1091
+ let groupBId: TLShapeId
1092
+ let groupCId: TLShapeId
1093
+ beforeEach(() => {
1094
+ // group C
1095
+ // ┌─────────────────────────────────────────────────────────┐
1096
+ // │ group A group B │
1097
+ // │ ┌────────────────────────┐ ┌──────────────────────┐ │
1098
+ // │ │ 0 20 │ │ 40 60 │ │
1099
+ // │ │ ┌───┐ ┌───┐ │ │ ┌───┐ ┌───┐ │ │
1100
+ // │ │ │ A │ │ B │ │ │ │ C │ │ D │ │ │
1101
+ // │ │ └───┘ └───┘ │ │ └───┘ └───┘ │ │
1102
+ // │ └────────────────────────┘ └──────────────────────┘ │
1103
+ // └─────────────────────────────────────────────────────────┘
1104
+ editor.createShapes([
1105
+ box(ids.boxA, 0, 0),
1106
+ box(ids.boxB, 20, 0),
1107
+ box(ids.boxC, 40, 0),
1108
+ box(ids.boxD, 60, 0),
1109
+ ])
1110
+ editor.select(ids.boxA, ids.boxB)
1111
+ editor.groupShapes(editor.getSelectedShapeIds())
1112
+ groupAId = onlySelectedId()
1113
+ editor.select(ids.boxC, ids.boxD)
1114
+ editor.groupShapes(editor.getSelectedShapeIds())
1115
+ groupBId = onlySelectedId()
1116
+ editor.select(groupAId, groupBId)
1117
+ editor.groupShapes(editor.getSelectedShapeIds())
1118
+ groupCId = onlySelectedId()
1119
+ editor.selectNone()
1120
+ })
1121
+
1122
+ it('should ungroup if there is only one shape left', () => {
1123
+ editor.deleteShapes([ids.boxD])
1124
+ expect(editor.getShape(groupBId)).toBeUndefined()
1125
+ expect(editor.getShape(ids.boxC)?.parentId).toBe(groupCId)
1126
+ })
1127
+
1128
+ it('should remove the group if there are no shapes left', () => {
1129
+ editor.deleteShapes([ids.boxC, ids.boxD])
1130
+ expect(editor.getShape(groupBId)).toBeUndefined()
1131
+ expect(editor.getShape(groupCId)).toBeUndefined()
1132
+ expect(editor.getShape(groupAId)).not.toBeUndefined()
1133
+ })
1134
+ })
1135
+
1136
+ describe('creating new shapes', () => {
1137
+ let groupA: TLGroupShape
1138
+ beforeEach(() => {
1139
+ // group A
1140
+ // ┌──────────────────────────────┐
1141
+ // │ 0 10 90 100 │
1142
+ // │ ┌───┐ │
1143
+ // │ │ A │ │
1144
+ // │ 10 └───┘ │
1145
+ // │ │
1146
+ // │ │
1147
+ // │ │
1148
+ // │ │
1149
+ // │ 90 ┌───┐ │
1150
+ // │ │ B │ │
1151
+ // │ 100 └───┘ │
1152
+ // └──────────────────────────────┘
1153
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 90, 90)])
1154
+ editor.select(ids.boxA, ids.boxB)
1155
+ editor.groupShapes(editor.getSelectedShapeIds())
1156
+ groupA = onlySelectedShape() as TLGroupShape
1157
+ editor.selectNone()
1158
+ })
1159
+ describe('boxes', () => {
1160
+ it('does not create inside the group if the group is only selected and not focused', () => {
1161
+ editor.select(groupA.id)
1162
+ editor.setCurrentTool('geo')
1163
+ editor.pointerDown(20, 20).pointerMove(80, 80).pointerUp(80, 80)
1164
+ const boxC = onlySelectedShape()
1165
+
1166
+ expect(boxC.parentId).toBe(editor.getCurrentPageId())
1167
+ expect(editor.getShapePageBounds(boxC.id)).toCloselyMatchObject({
1168
+ x: 20,
1169
+ y: 20,
1170
+ w: 60,
1171
+ h: 60,
1172
+ })
1173
+ })
1174
+
1175
+ it('does create inside the group if the group is focused', () => {
1176
+ editor.select(ids.boxA)
1177
+ expect(editor.getFocusedGroupId() === groupA.id).toBe(true)
1178
+
1179
+ editor.setCurrentTool('geo')
1180
+ editor.pointerDown(20, 20).pointerMove(80, 80).pointerUp(80, 80)
1181
+ const boxC = onlySelectedShape()
1182
+
1183
+ expect(boxC.parentId).toBe(groupA.id)
1184
+ expect(editor.getShapePageBounds(boxC.id)).toCloselyMatchObject({
1185
+ x: 20,
1186
+ y: 20,
1187
+ w: 60,
1188
+ h: 60,
1189
+ })
1190
+ expect(editor.getFocusedGroupId() === groupA.id).toBe(true)
1191
+ })
1192
+
1193
+ it('will reisze the group appropriately if the new shape changes the group bounds', () => {
1194
+ editor.select(ids.boxA)
1195
+ expect(editor.getFocusedGroupId() === groupA.id).toBe(true)
1196
+
1197
+ editor.setCurrentTool('geo')
1198
+ editor.pointerDown(20, 20).pointerMove(-10, -10)
1199
+
1200
+ expect(editor.getShapePageBounds(groupA.id)).toCloselyMatchObject({
1201
+ x: -10,
1202
+ y: -10,
1203
+ w: 110,
1204
+ h: 110,
1205
+ })
1206
+ editor.pointerMove(-20, -20).pointerUp(-20, -20)
1207
+ expect(editor.getShapePageBounds(groupA.id)).toCloselyMatchObject({
1208
+ x: -20,
1209
+ y: -20,
1210
+ w: 120,
1211
+ h: 120,
1212
+ })
1213
+ const boxC = onlySelectedShape()
1214
+ expect(editor.getShapePageBounds(boxC.id)).toCloselyMatchObject({
1215
+ x: -20,
1216
+ y: -20,
1217
+ w: 40,
1218
+ h: 40,
1219
+ })
1220
+ })
1221
+
1222
+ it('works if the shape drawing begins outside of the current group bounds', () => {
1223
+ editor.select(ids.boxA)
1224
+ expect(editor.getFocusedGroupId() === groupA.id).toBe(true)
1225
+
1226
+ editor.setCurrentTool('geo')
1227
+ editor.pointerDown(-50, -50).pointerMove(-100, -100).pointerUp()
1228
+
1229
+ expect(editor.getShapePageBounds(groupA.id)).toCloselyMatchObject({
1230
+ x: -100,
1231
+ y: -100,
1232
+ w: 200,
1233
+ h: 200,
1234
+ })
1235
+
1236
+ const boxC = onlySelectedShape()
1237
+ expect(editor.getShapePageBounds(boxC.id)).toCloselyMatchObject({
1238
+ x: -100,
1239
+ y: -100,
1240
+ w: 50,
1241
+ h: 50,
1242
+ })
1243
+ })
1244
+ })
1245
+
1246
+ describe('pencil', () => {
1247
+ it('does not draw inside the group if the group is only selected and not focused', () => {
1248
+ editor.select(groupA.id)
1249
+
1250
+ editor.setCurrentTool('draw')
1251
+ editor.pointerDown(20, 20).pointerMove(80, 80).pointerUp(80, 80)
1252
+
1253
+ const lineC = onlySelectedShape()
1254
+ expect(lineC.parentId).toBe(editor.getCurrentPageId())
1255
+ })
1256
+
1257
+ it('does draw inside the group if the group is focused', () => {
1258
+ editor.select(ids.boxA)
1259
+ expect(editor.getFocusedGroupId() === groupA.id).toBe(true)
1260
+
1261
+ editor.setCurrentTool('draw')
1262
+ editor.pointerDown(20, 20).pointerMove(80, 80).pointerUp(80, 80)
1263
+
1264
+ const lineC = onlySelectedShape()
1265
+ expect(lineC.parentId).toBe(groupA.id)
1266
+ })
1267
+
1268
+ it('will resize the group appropriately if the new shape changes the group bounds', () => {
1269
+ editor.select(ids.boxA)
1270
+ expect(editor.getFocusedGroupId() === groupA.id).toBe(true)
1271
+
1272
+ editor.setCurrentTool('draw')
1273
+ editor.pointerDown(20, 20)
1274
+ for (let i = 20; i >= -20; i--) {
1275
+ editor.pointerMove(i, i)
1276
+ }
1277
+ editor.pointerUp()
1278
+
1279
+ const roundToNearestTen = (vals: Box2d) => {
1280
+ return {
1281
+ x: Math.round(vals.x / 10) * 10,
1282
+ y: Math.round(vals.y / 10) * 10,
1283
+ w: Math.round(vals.w / 10) * 10,
1284
+ h: Math.round(vals.h / 10) * 10,
1285
+ }
1286
+ }
1287
+
1288
+ expect(roundToNearestTen(editor.getShapePageBounds(groupA.id)!)).toCloselyMatchObject({
1289
+ x: -20,
1290
+ y: -20,
1291
+ w: 120,
1292
+ h: 120,
1293
+ })
1294
+ })
1295
+
1296
+ it('works if the shape drawing begins outside of the current group bounds', () => {
1297
+ editor.select(ids.boxA)
1298
+ expect(editor.getFocusedGroupId() === groupA.id).toBe(true)
1299
+
1300
+ editor.setCurrentTool('draw')
1301
+ editor.pointerDown(-20, -20)
1302
+ for (let i = -20; i >= -100; i--) {
1303
+ editor.pointerMove(i, i)
1304
+ }
1305
+ editor.pointerUp()
1306
+
1307
+ const roundToNearestTen = (vals: Box2d) => {
1308
+ return {
1309
+ x: Math.round(vals.x / 10) * 10,
1310
+ y: Math.round(vals.y / 10) * 10,
1311
+ w: Math.round(vals.w / 10) * 10,
1312
+ h: Math.round(vals.h / 10) * 10,
1313
+ }
1314
+ }
1315
+
1316
+ expect(roundToNearestTen(editor.getShapePageBounds(groupA.id)!)).toCloselyMatchObject({
1317
+ x: -100,
1318
+ y: -100,
1319
+ w: 200,
1320
+ h: 200,
1321
+ })
1322
+ })
1323
+
1324
+ describe('lines', () => {
1325
+ it('does not draw inside the group if the group is only selected and not focused', () => {
1326
+ editor.select(groupA.id)
1327
+
1328
+ editor.setCurrentTool('line')
1329
+ editor.pointerDown(20, 20)
1330
+ editor.pointerMove(80, 80)
1331
+ editor.pointerUp(80, 80)
1332
+
1333
+ const lineC = onlySelectedShape()
1334
+ expect(lineC.type).toBe('line')
1335
+ expect(lineC.parentId).toBe(editor.getCurrentPageId())
1336
+ })
1337
+
1338
+ it('does draw inside the group if the group is focused', () => {
1339
+ editor.select(ids.boxA)
1340
+ expect(editor.getFocusedGroupId() === groupA.id).toBe(true)
1341
+
1342
+ editor.setCurrentTool('line')
1343
+ editor.pointerDown(20, 20).pointerMove(80, 80).pointerUp(80, 80)
1344
+
1345
+ const lineC = onlySelectedShape() as TLLineShape
1346
+ expect(lineC.type).toBe('line')
1347
+ expect(lineC.parentId).toBe(groupA.id)
1348
+ })
1349
+
1350
+ it('will reisze the group appropriately if the new shape changes the group bounds', () => {
1351
+ editor.select(ids.boxA)
1352
+ expect(editor.getFocusedGroupId() === groupA.id).toBe(true)
1353
+
1354
+ editor.setCurrentTool('line')
1355
+ editor.pointerDown(20, 20).pointerMove(-10, -10)
1356
+
1357
+ expect(editor.getShapePageBounds(groupA.id)).toMatchSnapshot('group with line shape')
1358
+ editor.pointerMove(-20, -20).pointerUp(-20, -20)
1359
+ expect(editor.getShapePageBounds(groupA.id)).toMatchSnapshot(
1360
+ 'group shape after second resize'
1361
+ )
1362
+ const boxC = onlySelectedShape()
1363
+ expect(editor.getShapePageBounds(boxC.id)).toMatchSnapshot('box shape after second resize')
1364
+ })
1365
+
1366
+ it('works if the shape drawing begins outside of the current group bounds', () => {
1367
+ editor.select(ids.boxA)
1368
+ expect(editor.getFocusedGroupId() === groupA.id).toBe(true)
1369
+
1370
+ editor.setCurrentTool('line')
1371
+ editor.pointerDown(-50, -50).pointerMove(-100, -100).pointerUp()
1372
+
1373
+ expect(editor.getShapePageBounds(groupA.id)).toMatchSnapshot('group with line')
1374
+
1375
+ const boxC = onlySelectedShape()
1376
+ expect(editor.getShapePageBounds(boxC.id)).toMatchSnapshot('box shape after resize')
1377
+ })
1378
+ })
1379
+
1380
+ describe('sticky notes', () => {
1381
+ it('does not draw inside the group if the group is only selected and not focused', () => {
1382
+ editor.select(groupA.id)
1383
+ expect(editor.getFocusedGroupId() === editor.getCurrentPageId()).toBe(true)
1384
+
1385
+ editor.setCurrentTool('note')
1386
+ editor.pointerDown(20, 20).pointerUp()
1387
+
1388
+ const postit = onlySelectedShape()
1389
+ expect(postit.parentId).toBe(editor.getCurrentPageId())
1390
+ })
1391
+
1392
+ it('does draw inside the group if the group is focused', () => {
1393
+ editor.select(ids.boxA)
1394
+ expect(editor.getFocusedGroupId() === groupA.id).toBe(true)
1395
+
1396
+ editor.setCurrentTool('note')
1397
+ editor.pointerDown(20, 20).pointerUp()
1398
+
1399
+ const postit = onlySelectedShape()
1400
+ expect(postit.parentId).toBe(groupA.id)
1401
+ })
1402
+
1403
+ it('will reisze the group appropriately if the new shape changes the group bounds', () => {
1404
+ editor.select(ids.boxA)
1405
+ expect(editor.getFocusedGroupId() === groupA.id).toBe(true)
1406
+
1407
+ expect(editor.getShapePageBounds(groupA.id)).toCloselyMatchObject({
1408
+ x: 0,
1409
+ y: 0,
1410
+ w: 100,
1411
+ h: 100,
1412
+ })
1413
+
1414
+ editor.setCurrentTool('note')
1415
+ editor.pointerDown(80, 80)
1416
+ editor.pointerUp()
1417
+ // default size is 200x200, and it centers it, so add 100px around the pointer
1418
+ expect(editor.getShapePageBounds(groupA.id)).toCloselyMatchObject({
1419
+ x: -20,
1420
+ y: -20,
1421
+ w: 200,
1422
+ h: 200,
1423
+ })
1424
+
1425
+ editor.pointerMove(20, 20)
1426
+ editor.pointerUp(20, 20)
1427
+ expect(editor.getShapePageBounds(groupA.id)).toCloselyMatchObject({
1428
+ x: -20,
1429
+ y: -20,
1430
+ w: 200,
1431
+ h: 200,
1432
+ })
1433
+ })
1434
+
1435
+ it('works if the shape drawing begins outside of the current group bounds', () => {
1436
+ editor.select(ids.boxA)
1437
+ expect(editor.getFocusedGroupId() === groupA.id).toBe(true)
1438
+
1439
+ editor.setCurrentTool('note')
1440
+ expect(editor.getShapePageBounds(groupA.id)).toCloselyMatchObject({
1441
+ x: 0,
1442
+ y: 0,
1443
+ w: 100,
1444
+ h: 100,
1445
+ })
1446
+ editor.pointerDown(-20, -20).pointerUp(-20, -20)
1447
+ expect(editor.getShapePageBounds(groupA.id)).toCloselyMatchObject({
1448
+ x: -120,
1449
+ y: -120,
1450
+ w: 220,
1451
+ h: 220,
1452
+ })
1453
+ })
1454
+ })
1455
+ })
1456
+ })
1457
+
1458
+ describe('erasing', () => {
1459
+ let groupAId: TLShapeId
1460
+ let groupBId: TLShapeId
1461
+ let groupCId: TLShapeId
1462
+ beforeEach(() => {
1463
+ // group C
1464
+ // ┌─────────────────────────────────────────────────────────┐
1465
+ // │ group A group B │
1466
+ // │ ┌────────────────────────┐ ┌──────────────────────┐ │
1467
+ // │ │ 0 20 │ │ 40 60 │ │
1468
+ // │ │ ┌───┐ ┌───┐ │ │ ┌───┐ ┌───┐ │ │
1469
+ // │ │ │ A │ │ B │ │ │ │ C │ │ D │ │ │
1470
+ // │ │ └───┘ └───┘ │ │ └───┘ └───┘ │ │
1471
+ // │ └────────────────────────┘ └──────────────────────┘ │
1472
+ // └─────────────────────────────────────────────────────────┘
1473
+ //
1474
+ // 20 ┌───┐
1475
+ // │ E │
1476
+ // └───┘
1477
+ editor.createShapes([
1478
+ box(ids.boxA, 0, 0),
1479
+ box(ids.boxB, 20, 0),
1480
+ box(ids.boxC, 60, 0),
1481
+ box(ids.boxD, 80, 0),
1482
+ box(ids.boxE, 0, 20),
1483
+ ])
1484
+ editor.select(ids.boxA, ids.boxB)
1485
+ editor.groupShapes(editor.getSelectedShapeIds())
1486
+ groupAId = onlySelectedId()
1487
+ editor.select(ids.boxC, ids.boxD)
1488
+ editor.groupShapes(editor.getSelectedShapeIds())
1489
+ groupBId = onlySelectedId()
1490
+ editor.select(groupAId, groupBId)
1491
+ editor.groupShapes(editor.getSelectedShapeIds())
1492
+ groupCId = onlySelectedId()
1493
+ editor.selectNone()
1494
+ })
1495
+
1496
+ it('erases whole groups if you hit one of their shapes', () => {
1497
+ editor.setCurrentTool('eraser')
1498
+
1499
+ // erase D
1500
+ editor.pointerDown(65, 5, ids.boxD)
1501
+ expect(editor.getCurrentPageState().erasingShapeIds.length).toBe(1)
1502
+ expect(editor.getCurrentPageState().erasingShapeIds[0]).toBe(groupCId)
1503
+ editor.pointerUp()
1504
+ expect(editor.getShape(groupCId)).toBeFalsy()
1505
+ })
1506
+
1507
+ it('does not erase whole groups if you do not hit on one of their shapes', () => {
1508
+ editor.setCurrentTool('eraser')
1509
+ editor.pointerDown(40, 5)
1510
+ expect(editor.getErasingShapeIds()).toEqual([])
1511
+ })
1512
+
1513
+ it('works inside of groups', () => {
1514
+ editor.select(ids.boxA)
1515
+ expect(editor.getFocusedGroupId() === groupAId).toBe(true)
1516
+ const groupA = editor.getShape(groupAId)!
1517
+
1518
+ editor.setCurrentTool('eraser')
1519
+
1520
+ // erase B
1521
+ editor.pointerDown(25, 5, ids.boxB)
1522
+ expect(editor.getCurrentPageState().erasingShapeIds.length).toBe(1)
1523
+ expect(editor.getCurrentPageState().erasingShapeIds[0]).toBe(ids.boxB)
1524
+ editor.pointerUp()
1525
+
1526
+ // group A disappears
1527
+ expect(isRemoved(groupA)).toBe(true)
1528
+ })
1529
+
1530
+ it('works outside of the focus layer', () => {
1531
+ editor.select(ids.boxA)
1532
+ expect(editor.getFocusedGroupId() === groupAId).toBe(true)
1533
+
1534
+ editor.setCurrentTool('eraser')
1535
+
1536
+ // erase E
1537
+ editor.pointerDown(5, 25, ids.boxE)
1538
+ expect(editor.getCurrentPageState().erasingShapeIds.length).toBe(1)
1539
+ expect(editor.getCurrentPageState().erasingShapeIds[0]).toBe(ids.boxE)
1540
+
1541
+ // move to group B
1542
+ editor.pointerMove(65, 5)
1543
+
1544
+ expect(editor.getErasingShapeIds().length).toBe(2)
1545
+ })
1546
+ })
1547
+
1548
+ describe('binding bug', () => {
1549
+ beforeEach(() => {
1550
+ editor.createShapes([box(ids.boxA, 0, 0, 10, 10), box(ids.boxB, 50, 0, 10, 10)])
1551
+ editor.select(ids.boxA, ids.boxB)
1552
+ editor.groupShapes(editor.getSelectedShapeIds())
1553
+ editor.selectNone()
1554
+ })
1555
+
1556
+ it('can not be made from some child shape to a group shape', () => {
1557
+ editor.setCurrentTool('arrow')
1558
+ // go from A to group A
1559
+ editor.pointerDown(5, 5).pointerMove(25, 5).pointerUp()
1560
+ const arrow = onlySelectedShape() as TLArrowShape
1561
+ expect(arrow.props.start).toMatchObject({ boundShapeId: ids.boxA })
1562
+ expect(arrow.props.end).toMatchObject({ type: 'point' })
1563
+ })
1564
+ })
1565
+
1566
+ describe('bindings', () => {
1567
+ let groupAId: TLShapeId
1568
+ let groupBId: TLShapeId
1569
+ beforeEach(() => {
1570
+ // group C
1571
+ // ┌─────────────────────────────────────────────────────────┐
1572
+ // │ group A group B │
1573
+ // │ ┌────────────────────────┐ ┌──────────────────────┐ │
1574
+ // │ │ 0 20 │ │ 40 60 │ │
1575
+ // │ │ ┌───┐ ┌───┐ │ │ ┌───┐ ┌───┐ │ │
1576
+ // │ │ │ A │ │ B │ │ │ │ C │ │ D │ │ │
1577
+ // │ │ └───┘ └───┘ │ │ └───┘ └───┘ │ │
1578
+ // │ └────────────────────────┘ └──────────────────────┘ │
1579
+ // └─────────────────────────────────────────────────────────┘
1580
+ //
1581
+ // 20 ┌───┐
1582
+ // │ E │
1583
+ // └───┘
1584
+ editor.createShapes([
1585
+ box(ids.boxA, 0, 0),
1586
+ box(ids.boxB, 20, 0),
1587
+ box(ids.boxC, 40, 0),
1588
+ box(ids.boxD, 60, 0),
1589
+ box(ids.boxE, 0, 20),
1590
+ ])
1591
+ editor.select(ids.boxA, ids.boxB)
1592
+ editor.groupShapes(editor.getSelectedShapeIds())
1593
+ groupAId = onlySelectedId()
1594
+ editor.select(ids.boxC, ids.boxD)
1595
+ editor.groupShapes(editor.getSelectedShapeIds())
1596
+ groupBId = onlySelectedId()
1597
+ editor.select(groupAId, groupBId)
1598
+ editor.groupShapes(editor.getSelectedShapeIds())
1599
+ editor.selectNone()
1600
+ })
1601
+
1602
+ it('can not be made from some sibling shape to a group shape', () => {
1603
+ editor.setCurrentTool('arrow')
1604
+ // go from E to group C (not hovering over a leaf box)
1605
+ editor.pointerDown(5, 25).pointerMove(35, 5).pointerUp()
1606
+ const arrow = onlySelectedShape() as TLArrowShape
1607
+
1608
+ expect(arrow.props.start).toMatchObject({ boundShapeId: ids.boxE })
1609
+ expect(arrow.props.end).toMatchObject({ type: 'point' })
1610
+ })
1611
+
1612
+ it('can not be made from a group shape to some sibling shape', () => {
1613
+ editor.setCurrentTool('arrow')
1614
+ // go from group C (not hovering over a leaf box) to E
1615
+ editor.pointerDown(35, 5).pointerMove(5, 25).pointerUp()
1616
+
1617
+ const arrow = onlySelectedShape() as TLArrowShape
1618
+
1619
+ expect(arrow.props.start).toMatchObject({ type: 'point' })
1620
+ expect(arrow.props.end).toMatchObject({ boundShapeId: ids.boxE })
1621
+ })
1622
+ it('can be made from a shape within a group to some shape outside of the group', () => {
1623
+ editor.setCurrentTool('arrow')
1624
+ // go from A to E
1625
+ editor.pointerDown(5, 5).pointerMove(5, 25).pointerUp()
1626
+ const arrow = onlySelectedShape() as TLArrowShape
1627
+
1628
+ expect(arrow.parentId).toBe(editor.getCurrentPageId())
1629
+
1630
+ expect(arrow.props.start).toMatchObject({ boundShapeId: ids.boxA })
1631
+ expect(arrow.props.end).toMatchObject({ boundShapeId: ids.boxE })
1632
+ })
1633
+
1634
+ it('can be made from a shape within a group to another shape within the group', () => {
1635
+ editor.setCurrentTool('arrow')
1636
+ // go from A to B
1637
+ editor.pointerDown(5, 5).pointerMove(25, 5).pointerUp()
1638
+ const arrow = onlySelectedShape() as TLArrowShape
1639
+
1640
+ expect(arrow.parentId).toBe(groupAId)
1641
+ expect(arrow.props.start).toMatchObject({ boundShapeId: ids.boxA })
1642
+ expect(arrow.props.end).toMatchObject({ boundShapeId: ids.boxB })
1643
+ })
1644
+
1645
+ it('can be made from a shape outside of a group to a shape within the group', () => {
1646
+ editor.setCurrentTool('arrow')
1647
+ // go from E to B
1648
+ editor.pointerDown(5, 25).pointerMove(27, 7).pointerMove(25, 5).pointerUp()
1649
+ const arrow = onlySelectedShape() as TLArrowShape
1650
+
1651
+ expect(arrow.parentId).toBe(editor.getCurrentPageId())
1652
+ expect(arrow.props.start).toMatchObject({ boundShapeId: ids.boxE })
1653
+ expect(arrow.props.end).toMatchObject({ boundShapeId: ids.boxB })
1654
+ })
1655
+ })
1656
+
1657
+ describe('grouping arrows', () => {
1658
+ // Fix for <https://linear.app/tldraw/issue/TLD-887/cant-duplicate-arrows-in-group>
1659
+ it('grouping 2 arrows should not change indexes', () => {
1660
+ const arrowAId = createShapeId('arrowA')
1661
+ const arrowBId = createShapeId('arrowB')
1662
+
1663
+ editor.createShapes([
1664
+ arrow(arrowAId, { x: 0, y: 0 }, { x: 0, y: 10 }),
1665
+ arrow(arrowBId, { x: 10, y: 0 }, { x: 10, y: 10 }),
1666
+ ])
1667
+
1668
+ const arrowABefore = editor.getShape(arrowAId)!
1669
+ const arrowBBefore = editor.getShape(arrowBId)!
1670
+
1671
+ expect(arrowABefore.parentId).toMatch(/^page:/)
1672
+ expect(arrowABefore.index).toBe('a1')
1673
+ expect(arrowBBefore.parentId).toMatch(/^page:/)
1674
+ expect(arrowBBefore.index).toBe('a2')
1675
+
1676
+ editor.select(arrowAId, arrowBId)
1677
+ editor.groupShapes(editor.getSelectedShapeIds())
1678
+
1679
+ const arrowAAfter = editor.getShape(arrowAId)!
1680
+ const arrowBAfter = editor.getShape(arrowBId)!
1681
+
1682
+ expect(arrowAAfter.parentId).toMatch(/^shape:/)
1683
+ expect(arrowAAfter.index).toBe('a1')
1684
+
1685
+ expect(arrowBAfter.parentId).toMatch(/^shape:/)
1686
+ expect(arrowBAfter.index).toBe('a2')
1687
+ })
1688
+ })
1689
+
1690
+ describe('moving handles within a group', () => {
1691
+ let groupA: TLGroupShape
1692
+ beforeEach(() => {
1693
+ // group A
1694
+ // ┌──────────────────────────────┐
1695
+ // │ 0 10 90 100 │
1696
+ // │ ┌───┐ │
1697
+ // │ │ A │ │
1698
+ // │ 10 └───┘ │
1699
+ // │ │
1700
+ // │ │
1701
+ // │ │
1702
+ // │ │
1703
+ // │ 90 ┌───┐ │
1704
+ // │ │ B │ │
1705
+ // │ 100 └───┘ │
1706
+ // └──────────────────────────────┘
1707
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 90, 90)])
1708
+ editor.select(ids.boxA, ids.boxB)
1709
+ editor.groupShapes(editor.getSelectedShapeIds())
1710
+ groupA = onlySelectedShape() as TLGroupShape
1711
+ editor.selectNone()
1712
+ })
1713
+ it('resizes the group appropriately', () => {
1714
+ editor.select(ids.boxA)
1715
+ expect(editor.getFocusedGroupId()).toBe(groupA.id)
1716
+
1717
+ editor.setCurrentTool('arrow')
1718
+
1719
+ editor.pointerDown(50, 50).pointerMove(60, 60).pointerUp(60, 60)
1720
+
1721
+ let arrow = onlySelectedShape() as TLArrowShape
1722
+
1723
+ expect(arrow.parentId).toBe(groupA.id)
1724
+
1725
+ expect(arrow.props.start.type).toBe('point')
1726
+ if (arrow.props.start.type === 'point') {
1727
+ expect(arrow.props.start.x).toBe(0)
1728
+ expect(arrow.props.start.y).toBe(0)
1729
+ }
1730
+
1731
+ expect(arrow.props.end.type).toBe('point')
1732
+ if (arrow.props.end.type === 'point') {
1733
+ expect(arrow.props.end.x).toBe(10)
1734
+ expect(arrow.props.end.y).toBe(10)
1735
+ }
1736
+
1737
+ editor.expectToBeIn('select.idle')
1738
+
1739
+ expect(editor.getShapePageBounds(groupA.id)).toCloselyMatchObject({
1740
+ x: 0,
1741
+ y: 0,
1742
+ w: 100,
1743
+ h: 100,
1744
+ })
1745
+
1746
+ editor.pointerDown(60, 60, {
1747
+ target: 'handle',
1748
+ shape: arrow,
1749
+ handle: editor.getShapeHandles<TLArrowShape>(arrow)!.find((h) => h.id === 'end'),
1750
+ })
1751
+
1752
+ editor.expectToBeIn('select.pointing_handle')
1753
+ editor.pointerMove(60, -10)
1754
+ editor.expectToBeIn('select.dragging_handle')
1755
+ editor.pointerMove(60, -10)
1756
+
1757
+ arrow = editor.getShape(arrow.id)!
1758
+
1759
+ expect(arrow.parentId).toBe(groupA.id)
1760
+
1761
+ expect(arrow.props.start.type).toBe('point')
1762
+ if (arrow.props.start.type === 'point') {
1763
+ expect(arrow.props.start.x).toBe(0)
1764
+ expect(arrow.props.start.y).toBe(0)
1765
+ }
1766
+
1767
+ expect(arrow.props.end.type).toBe('point')
1768
+ if (arrow.props.end.type === 'point') {
1769
+ expect(arrow.props.end.x).toBe(10)
1770
+ expect(arrow.props.end.y).toBe(-60)
1771
+ }
1772
+
1773
+ expect(editor.getShapePageBounds(groupA.id)).toCloselyMatchObject({
1774
+ x: 0,
1775
+ y: -10,
1776
+ w: 100,
1777
+ h: 110,
1778
+ })
1779
+
1780
+ editor.pointerMove(50, -10)
1781
+ for (let i = -10; i >= -30; i--) {
1782
+ editor.pointerMove(i, i)
1783
+ }
1784
+
1785
+ editor.pointerUp()
1786
+
1787
+ expect(editor.getShapePageBounds(groupA.id)).toCloselyMatchObject({
1788
+ x: -30,
1789
+ y: -30,
1790
+ w: 130,
1791
+ h: 130,
1792
+ })
1793
+ })
1794
+ })
1795
+
1796
+ // ! Parked temporarily. This behavior has changed and may need to change back.
1797
+
1798
+ // describe('copy/pasting to/from groups', () => {
1799
+ // let groupAId: TLShapeId
1800
+ // let groupBId: TLShapeId
1801
+ // let groupCId: TLShapeId
1802
+ // beforeEach(() => {
1803
+ // // group C
1804
+ // // ┌─────────────────────────────────────────────────────────┐
1805
+ // // │ group A group B │
1806
+ // // │ ┌────────────────────────┐ ┌──────────────────────┐ │
1807
+ // // │ │ 0 20 │ │ 40 60 │ │
1808
+ // // │ │ ┌───┐ ┌───┐ │ │ ┌───┐ ┌───┐ │ │
1809
+ // // │ │ │ A │ │ B │ │ │ │ C │ │ D │ │ │
1810
+ // // │ │ └───┘ └───┘ │ │ └───┘ └───┘ │ │
1811
+ // // │ └────────────────────────┘ └──────────────────────┘ │
1812
+ // // └─────────────────────────────────────────────────────────┘
1813
+ // //
1814
+ // // 20 ┌───┐
1815
+ // // │ E │
1816
+ // // └───┘
1817
+ // editor.createShapes([
1818
+ // box(ids.boxA, 0, 0),
1819
+ // box(ids.boxB, 20, 0),
1820
+ // box(ids.boxC, 40, 0),
1821
+ // box(ids.boxD, 60, 0),
1822
+ // box(ids.boxE, 0, 20),
1823
+ // ])
1824
+ // editor.select(ids.boxA, ids.boxB)
1825
+ // editor.groupShapes(editor.selectedShapeIds)
1826
+ // groupAId = onlySelectedId()
1827
+ // editor.select(ids.boxC, ids.boxD)
1828
+ // editor.groupShapes(editor.selectedShapeIds)
1829
+ // groupBId = onlySelectedId()
1830
+ // editor.select(groupAId, groupBId)
1831
+ // editor.groupShapes(editor.selectedShapeIds)
1832
+ // groupCId = onlySelectedId()
1833
+ // editor.selectNone()
1834
+ // })
1835
+
1836
+ // it('should allow copying and pasting within the same focus layer', () => {
1837
+ // editor.select(groupAId)
1838
+ // expect(editor.focusedGroupId).toBe(groupCId)
1839
+ // editor.copy()
1840
+ // editor.paste()
1841
+ // expect(editor.focusedGroupId).toBe(groupCId)
1842
+ // expect(onlySelectedId()).not.toBe(groupAId)
1843
+ // expect(onlySelectedShape().type).toBe(GroupShapeUtil.type)
1844
+ // expect(
1845
+ // editor.getSortedChildIdsForParent(onlySelectedShape().id).map((id) => editor.getShape(id)!.type)
1846
+ // ).toEqual(['geo', 'geo'])
1847
+ // })
1848
+
1849
+ // it('should allow copying from within a group and pasting into a higher focus level', () => {
1850
+ // editor.select(groupAId)
1851
+ // expect(editor.focusedGroupId).toBe(groupCId)
1852
+ // editor.copy()
1853
+ // editor.select(groupCId)
1854
+ // expect(editor.focusedGroupId).toBe(editor.currentPageId)
1855
+ // editor.paste()
1856
+ // expect(editor.focusedGroupId).toBe(editor.currentPageId)
1857
+ // expect(onlySelectedId()).not.toBe(groupAId)
1858
+ // expect(onlySelectedShape().type).toBe(GroupShapeUtil.type)
1859
+ // expect(
1860
+ // editor.getSortedChildIdsForParent(onlySelectedShape().id).map((id) => editor.getShape(id)!.type)
1861
+ // ).toEqual(['geo', 'geo'])
1862
+ // expect(editor.getPageBounds(groupAId)).toCloselyMatchObject(
1863
+ // editor.getPageBounds(onlySelectedId())
1864
+ // )
1865
+ // })
1866
+ // it('should allow copying from a higher focus level and pasting into a group', () => {
1867
+ // editor.select(groupCId)
1868
+ // expect(editor.focusedGroupId).toBe(editor.currentPageId)
1869
+ // editor.copy()
1870
+ // editor.select(ids.boxA)
1871
+ // expect(editor.focusedGroupId).toBe(groupAId)
1872
+ // editor.paste()
1873
+ // expect(editor.focusedGroupId).toBe(groupAId)
1874
+ // expect(onlySelectedId()).not.toBe(groupCId)
1875
+ // expect(onlySelectedShape().parentId).toBe(groupAId)
1876
+ // expect(onlySelectedShape().type).toBe(GroupShapeUtil.type)
1877
+ // expect(editor.getSortedChildIdsForParent(onlySelectedId()).map((id) => editor.getShape(id)!.type)).toEqual(
1878
+ // [GroupShapeUtil.type, GroupShapeUtil.type]
1879
+ // )
1880
+ // })
1881
+ // })
1882
+
1883
+ describe('snapping', () => {
1884
+ let groupAId: TLShapeId
1885
+ let groupBId: TLShapeId
1886
+ let groupCId: TLShapeId
1887
+ beforeEach(() => {
1888
+ // group C
1889
+ // ┌─────────────────────────────────────────────────────────┐
1890
+ // │ group A group B │
1891
+ // │ ┌────────────────────────┐ ┌──────────────────────┐ │
1892
+ // │ │ 0 20 │ │ 40 60 │ │
1893
+ // │ │ ┌───┐ ┌───┐ │ │ ┌───┐ ┌───┐ │ │
1894
+ // │ │ │ A │ │ B │ │ │ │ C │ │ D │ │ │
1895
+ // │ │ └───┘ └───┘ │ │ └───┘ └───┘ │ │
1896
+ // │ └────────────────────────┘ └──────────────────────┘ │
1897
+ // └─────────────────────────────────────────────────────────┘
1898
+ //
1899
+ // 20 ┌───┐
1900
+ // │ E │
1901
+ // └───┘
1902
+ editor.createShapes([
1903
+ box(ids.boxA, 0, 0),
1904
+ box(ids.boxB, 20, 0),
1905
+ box(ids.boxC, 40, 0),
1906
+ box(ids.boxD, 60, 0),
1907
+ box(ids.boxE, 0, 20),
1908
+ ])
1909
+ editor.select(ids.boxA, ids.boxB)
1910
+ editor.groupShapes(editor.getSelectedShapeIds())
1911
+ groupAId = onlySelectedId()
1912
+ editor.select(ids.boxC, ids.boxD)
1913
+ editor.groupShapes(editor.getSelectedShapeIds())
1914
+ groupBId = onlySelectedId()
1915
+ editor.select(groupAId, groupBId)
1916
+ editor.groupShapes(editor.getSelectedShapeIds())
1917
+ groupCId = onlySelectedId()
1918
+ editor.selectNone()
1919
+ })
1920
+
1921
+ it('does not happen between groups and their children', () => {
1922
+ editor.select(groupCId)
1923
+ editor.pointerDown(10, 5, groupCId)
1924
+ editor.pointerMove(80, 5, groupCId, { ctrlKey: true })
1925
+ expect(editor.snaps.getLines().length).toBe(0)
1926
+ })
1927
+
1928
+ it('does not happen between children and thier group', () => {
1929
+ editor.select(ids.boxD)
1930
+ editor.pointerDown(65, 5, ids.boxD)
1931
+ editor.pointerMove(80, 105, ids.boxD, { ctrlKey: true })
1932
+ expect(editor.snaps.getLines().length).toBe(0)
1933
+ })
1934
+ })
1935
+
1936
+ describe('When pressing enter with selected group', () => {
1937
+ it('Should select the children of the group when enter is pressed', () => {
1938
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 20, 0), box(ids.boxC, 40, 0)])
1939
+ editor.select(ids.boxA, ids.boxB, ids.boxC)
1940
+ editor.groupShapes(editor.getSelectedShapeIds())
1941
+ editor.keyDown('Enter')
1942
+ editor.keyUp('Enter')
1943
+ expect(editor.getSelectedShapeIds()).toMatchObject([ids.boxA, ids.boxB, ids.boxC])
1944
+ })
1945
+ it('Should select the children of multiple groups when enter is pressed', () => {
1946
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 20, 0)])
1947
+ editor.createShapes([box(ids.boxC, 40, 0), box(ids.boxD, 70, 0)])
1948
+ editor.select(ids.boxA, ids.boxB)
1949
+ editor.groupShapes(editor.getSelectedShapeIds())
1950
+ editor.select(ids.boxC, ids.boxD)
1951
+ editor.groupShapes(editor.getSelectedShapeIds())
1952
+ editor.selectAll() // both groups
1953
+ editor.keyDown('Enter')
1954
+ editor.keyUp('Enter')
1955
+ expect(editor.getSelectedShapeIds()).toMatchObject([ids.boxA, ids.boxB, ids.boxC, ids.boxD])
1956
+ })
1957
+ })
1958
+
1959
+ describe('Group opacity', () => {
1960
+ it("should set the group's opacity to max even if the selected style panel opacity is lower", () => {
1961
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 20, 0)])
1962
+ editor.select(ids.boxA, ids.boxB)
1963
+ editor.setOpacityForSelectedShapes(0.5)
1964
+ editor.setOpacityForNextShapes(0.5)
1965
+ editor.groupShapes(editor.getSelectedShapeIds())
1966
+ const group = editor.getShape(onlySelectedId())!
1967
+ assert(editor.isShapeOfType<TLGroupShape>(group, 'group'))
1968
+ expect(group.opacity).toBe(1)
1969
+ })
1970
+ })
1971
+
1972
+ describe('Grouping / ungrouping locked shapes', () => {
1973
+ it('keeps locked shapes locked when grouped', () => {
1974
+ editor.createShapes([box(ids.boxA, 0, 0), box(ids.boxB, 200, 0)])
1975
+ editor.groupShapes([ids.boxA, ids.boxB], ids.groupA)
1976
+ editor.select(ids.boxA)
1977
+
1978
+ // Lock boxA
1979
+ editor.updateShape({ id: ids.boxA, type: 'geo', isLocked: true })
1980
+
1981
+ // Select the group; when we ungroup, the children should be selected
1982
+ editor.select(ids.groupA)
1983
+
1984
+ // Move the group shape; this should also move locked children
1985
+ editor.nudgeShapes([ids.groupA], { x: 100, y: 0 })
1986
+
1987
+ // When we ungroup, the locked children should...
1988
+ editor.ungroupShapes([ids.groupA])
1989
+
1990
+ // Still exist
1991
+ expect(editor.getShape(ids.boxA)).toBeTruthy()
1992
+ expect(editor.getShape(ids.boxB)).toBeTruthy()
1993
+
1994
+ // Both be selected
1995
+ expect(editor.getSelectedShapeIds()).toMatchObject([ids.boxA, ids.boxB])
1996
+
1997
+ // And be in the correct position
1998
+ expect(editor.getShape(ids.boxA)!.x).toBe(100)
1999
+ expect(editor.getShape(ids.boxB)!.x).toBe(300)
2000
+
2001
+ // And have the correct locked state
2002
+ expect(editor.getShape(ids.boxA)!.isLocked).toBe(true)
2003
+ expect(editor.getShape(ids.boxB)!.isLocked).toBe(false)
2004
+ })
2005
+ })