@tldraw/editor 3.16.0-internal.a478398270c6 → 3.16.0-internal.f8b97f0c414f

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 (325) hide show
  1. package/dist-cjs/index.d.ts +350 -142
  2. package/dist-cjs/index.js +13 -6
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/TldrawEditor.js +10 -8
  5. package/dist-cjs/lib/TldrawEditor.js.map +2 -2
  6. package/dist-cjs/lib/components/MenuClickCapture.js +0 -5
  7. package/dist-cjs/lib/components/MenuClickCapture.js.map +2 -2
  8. package/dist-cjs/lib/components/SVGContainer.js +1 -1
  9. package/dist-cjs/lib/components/SVGContainer.js.map +2 -2
  10. package/dist-cjs/lib/components/Shape.js +11 -36
  11. package/dist-cjs/lib/components/Shape.js.map +2 -2
  12. package/dist-cjs/lib/components/default-components/DefaultBrush.js +1 -1
  13. package/dist-cjs/lib/components/default-components/DefaultBrush.js.map +2 -2
  14. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +15 -24
  15. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  16. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js +2 -2
  17. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js.map +2 -2
  18. package/dist-cjs/lib/components/default-components/DefaultCursor.js +1 -1
  19. package/dist-cjs/lib/components/default-components/DefaultCursor.js.map +2 -2
  20. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js +1 -1
  21. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js.map +2 -2
  22. package/dist-cjs/lib/components/default-components/DefaultGrid.js +1 -1
  23. package/dist-cjs/lib/components/default-components/DefaultGrid.js.map +2 -2
  24. package/dist-cjs/lib/components/default-components/DefaultHandles.js +1 -1
  25. package/dist-cjs/lib/components/default-components/DefaultHandles.js.map +2 -2
  26. package/dist-cjs/lib/components/default-components/DefaultScribble.js +1 -1
  27. package/dist-cjs/lib/components/default-components/DefaultScribble.js.map +2 -2
  28. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +9 -1
  29. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +2 -2
  30. package/dist-cjs/lib/components/default-components/DefaultShapeWrapper.js +53 -0
  31. package/dist-cjs/lib/components/default-components/DefaultShapeWrapper.js.map +7 -0
  32. package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js +1 -1
  33. package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js.map +2 -2
  34. package/dist-cjs/lib/components/default-components/DefaultSpinner.js +27 -15
  35. package/dist-cjs/lib/components/default-components/DefaultSpinner.js.map +3 -3
  36. package/dist-cjs/lib/config/TLUserPreferences.js +15 -3
  37. package/dist-cjs/lib/config/TLUserPreferences.js.map +2 -2
  38. package/dist-cjs/lib/editor/Editor.js +174 -180
  39. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  40. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js +4 -0
  41. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js.map +2 -2
  42. package/dist-cjs/lib/editor/derivations/parentsToChildren.js.map +2 -2
  43. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +14 -4
  44. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +2 -2
  45. package/dist-cjs/lib/editor/shapes/BaseBoxShapeUtil.js.map +1 -1
  46. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +23 -0
  47. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  48. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/BaseBoxShapeTool.js.map +2 -2
  49. package/dist-cjs/lib/editor/tools/StateNode.js +20 -1
  50. package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
  51. package/dist-cjs/lib/editor/types/misc-types.js.map +1 -1
  52. package/dist-cjs/lib/exports/getSvgJsx.js +35 -16
  53. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  54. package/dist-cjs/lib/hooks/useCanvasEvents.js +44 -35
  55. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  56. package/dist-cjs/lib/hooks/useDocumentEvents.js +5 -5
  57. package/dist-cjs/lib/hooks/useDocumentEvents.js.map +2 -2
  58. package/dist-cjs/lib/hooks/useEditor.js +1 -4
  59. package/dist-cjs/lib/hooks/useEditor.js.map +2 -2
  60. package/dist-cjs/lib/hooks/useEditorComponents.js +2 -0
  61. package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
  62. package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js +1 -2
  63. package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js.map +2 -2
  64. package/dist-cjs/lib/hooks/useGestureEvents.js +1 -1
  65. package/dist-cjs/lib/hooks/useGestureEvents.js.map +2 -2
  66. package/dist-cjs/lib/hooks/useHandleEvents.js +3 -3
  67. package/dist-cjs/lib/hooks/useHandleEvents.js.map +2 -2
  68. package/dist-cjs/lib/hooks/usePassThroughMouseOverEvents.js +4 -1
  69. package/dist-cjs/lib/hooks/usePassThroughMouseOverEvents.js.map +2 -2
  70. package/dist-cjs/lib/hooks/usePassThroughWheelEvents.js +4 -1
  71. package/dist-cjs/lib/hooks/usePassThroughWheelEvents.js.map +2 -2
  72. package/dist-cjs/lib/hooks/useSelectionEvents.js +4 -4
  73. package/dist-cjs/lib/hooks/useSelectionEvents.js.map +2 -2
  74. package/dist-cjs/lib/{utils/nearestMultiple.js → hooks/useStateAttribute.js} +15 -14
  75. package/dist-cjs/lib/hooks/useStateAttribute.js.map +7 -0
  76. package/dist-cjs/lib/license/LicenseManager.js +140 -53
  77. package/dist-cjs/lib/license/LicenseManager.js.map +2 -2
  78. package/dist-cjs/lib/license/LicenseProvider.js +39 -1
  79. package/dist-cjs/lib/license/LicenseProvider.js.map +2 -2
  80. package/dist-cjs/lib/license/Watermark.js +75 -13
  81. package/dist-cjs/lib/license/Watermark.js.map +3 -3
  82. package/dist-cjs/lib/license/useLicenseManagerState.js.map +2 -2
  83. package/dist-cjs/lib/options.js +7 -0
  84. package/dist-cjs/lib/options.js.map +2 -2
  85. package/dist-cjs/lib/primitives/Box.js +3 -0
  86. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  87. package/dist-cjs/lib/primitives/Vec.js +0 -4
  88. package/dist-cjs/lib/primitives/Vec.js.map +2 -2
  89. package/dist-cjs/lib/primitives/geometry/Arc2d.js +1 -1
  90. package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
  91. package/dist-cjs/lib/primitives/geometry/Circle2d.js +1 -1
  92. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
  93. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +3 -1
  94. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
  95. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +1 -1
  96. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
  97. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +50 -20
  98. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
  99. package/dist-cjs/lib/primitives/geometry/Group2d.js +8 -1
  100. package/dist-cjs/lib/primitives/geometry/Group2d.js.map +2 -2
  101. package/dist-cjs/lib/primitives/geometry/geometry-constants.js +2 -2
  102. package/dist-cjs/lib/primitives/geometry/geometry-constants.js.map +2 -2
  103. package/dist-cjs/lib/primitives/intersect.js +4 -4
  104. package/dist-cjs/lib/primitives/intersect.js.map +2 -2
  105. package/dist-cjs/lib/primitives/utils.js +4 -0
  106. package/dist-cjs/lib/primitives/utils.js.map +2 -2
  107. package/dist-cjs/lib/utils/EditorAtom.js +45 -0
  108. package/dist-cjs/lib/utils/EditorAtom.js.map +7 -0
  109. package/dist-cjs/lib/utils/dom.js +12 -1
  110. package/dist-cjs/lib/utils/dom.js.map +2 -2
  111. package/dist-cjs/lib/utils/getPointerInfo.js +2 -2
  112. package/dist-cjs/lib/utils/getPointerInfo.js.map +2 -2
  113. package/dist-cjs/lib/utils/reparenting.js +2 -35
  114. package/dist-cjs/lib/utils/reparenting.js.map +3 -3
  115. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js +0 -1
  116. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js.map +2 -2
  117. package/dist-cjs/version.js +3 -3
  118. package/dist-cjs/version.js.map +1 -1
  119. package/dist-esm/index.d.mts +350 -142
  120. package/dist-esm/index.mjs +24 -8
  121. package/dist-esm/index.mjs.map +2 -2
  122. package/dist-esm/lib/TldrawEditor.mjs +11 -9
  123. package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
  124. package/dist-esm/lib/components/MenuClickCapture.mjs +0 -5
  125. package/dist-esm/lib/components/MenuClickCapture.mjs.map +2 -2
  126. package/dist-esm/lib/components/SVGContainer.mjs +1 -1
  127. package/dist-esm/lib/components/SVGContainer.mjs.map +2 -2
  128. package/dist-esm/lib/components/Shape.mjs +11 -36
  129. package/dist-esm/lib/components/Shape.mjs.map +2 -2
  130. package/dist-esm/lib/components/default-components/DefaultBrush.mjs +1 -1
  131. package/dist-esm/lib/components/default-components/DefaultBrush.mjs.map +2 -2
  132. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +16 -25
  133. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  134. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs +2 -2
  135. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs.map +2 -2
  136. package/dist-esm/lib/components/default-components/DefaultCursor.mjs +1 -1
  137. package/dist-esm/lib/components/default-components/DefaultCursor.mjs.map +2 -2
  138. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs +1 -1
  139. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs.map +2 -2
  140. package/dist-esm/lib/components/default-components/DefaultGrid.mjs +1 -1
  141. package/dist-esm/lib/components/default-components/DefaultGrid.mjs.map +2 -2
  142. package/dist-esm/lib/components/default-components/DefaultHandles.mjs +1 -1
  143. package/dist-esm/lib/components/default-components/DefaultHandles.mjs.map +2 -2
  144. package/dist-esm/lib/components/default-components/DefaultScribble.mjs +1 -1
  145. package/dist-esm/lib/components/default-components/DefaultScribble.mjs.map +2 -2
  146. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +9 -1
  147. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +2 -2
  148. package/dist-esm/lib/components/default-components/DefaultShapeWrapper.mjs +23 -0
  149. package/dist-esm/lib/components/default-components/DefaultShapeWrapper.mjs.map +7 -0
  150. package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs +1 -1
  151. package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs.map +2 -2
  152. package/dist-esm/lib/components/default-components/DefaultSpinner.mjs +17 -15
  153. package/dist-esm/lib/components/default-components/DefaultSpinner.mjs.map +2 -2
  154. package/dist-esm/lib/config/TLUserPreferences.mjs +15 -3
  155. package/dist-esm/lib/config/TLUserPreferences.mjs.map +2 -2
  156. package/dist-esm/lib/editor/Editor.mjs +174 -180
  157. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  158. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs +4 -0
  159. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs.map +2 -2
  160. package/dist-esm/lib/editor/derivations/parentsToChildren.mjs.map +2 -2
  161. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +14 -4
  162. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +2 -2
  163. package/dist-esm/lib/editor/shapes/BaseBoxShapeUtil.mjs.map +1 -1
  164. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +23 -0
  165. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  166. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/BaseBoxShapeTool.mjs.map +2 -2
  167. package/dist-esm/lib/editor/tools/StateNode.mjs +20 -1
  168. package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
  169. package/dist-esm/lib/exports/getSvgJsx.mjs +36 -16
  170. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  171. package/dist-esm/lib/hooks/useCanvasEvents.mjs +47 -37
  172. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  173. package/dist-esm/lib/hooks/useDocumentEvents.mjs +11 -6
  174. package/dist-esm/lib/hooks/useDocumentEvents.mjs.map +2 -2
  175. package/dist-esm/lib/hooks/useEditor.mjs +1 -4
  176. package/dist-esm/lib/hooks/useEditor.mjs.map +2 -2
  177. package/dist-esm/lib/hooks/useEditorComponents.mjs +4 -0
  178. package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
  179. package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs +2 -3
  180. package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs.map +2 -2
  181. package/dist-esm/lib/hooks/useGestureEvents.mjs +2 -2
  182. package/dist-esm/lib/hooks/useGestureEvents.mjs.map +2 -2
  183. package/dist-esm/lib/hooks/useHandleEvents.mjs +9 -4
  184. package/dist-esm/lib/hooks/useHandleEvents.mjs.map +2 -2
  185. package/dist-esm/lib/hooks/usePassThroughMouseOverEvents.mjs +4 -1
  186. package/dist-esm/lib/hooks/usePassThroughMouseOverEvents.mjs.map +2 -2
  187. package/dist-esm/lib/hooks/usePassThroughWheelEvents.mjs +4 -1
  188. package/dist-esm/lib/hooks/usePassThroughWheelEvents.mjs.map +2 -2
  189. package/dist-esm/lib/hooks/useSelectionEvents.mjs +6 -5
  190. package/dist-esm/lib/hooks/useSelectionEvents.mjs.map +2 -2
  191. package/dist-esm/lib/hooks/useStateAttribute.mjs +15 -0
  192. package/dist-esm/lib/hooks/useStateAttribute.mjs.map +7 -0
  193. package/dist-esm/lib/license/LicenseManager.mjs +141 -54
  194. package/dist-esm/lib/license/LicenseManager.mjs.map +2 -2
  195. package/dist-esm/lib/license/LicenseProvider.mjs +39 -2
  196. package/dist-esm/lib/license/LicenseProvider.mjs.map +2 -2
  197. package/dist-esm/lib/license/Watermark.mjs +76 -14
  198. package/dist-esm/lib/license/Watermark.mjs.map +3 -3
  199. package/dist-esm/lib/license/useLicenseManagerState.mjs.map +2 -2
  200. package/dist-esm/lib/options.mjs +7 -0
  201. package/dist-esm/lib/options.mjs.map +2 -2
  202. package/dist-esm/lib/primitives/Box.mjs +4 -1
  203. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  204. package/dist-esm/lib/primitives/Vec.mjs +0 -4
  205. package/dist-esm/lib/primitives/Vec.mjs.map +2 -2
  206. package/dist-esm/lib/primitives/geometry/Arc2d.mjs +2 -2
  207. package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
  208. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +2 -2
  209. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
  210. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +3 -1
  211. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
  212. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +2 -2
  213. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
  214. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +53 -21
  215. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
  216. package/dist-esm/lib/primitives/geometry/Group2d.mjs +8 -1
  217. package/dist-esm/lib/primitives/geometry/Group2d.mjs.map +2 -2
  218. package/dist-esm/lib/primitives/geometry/geometry-constants.mjs +2 -2
  219. package/dist-esm/lib/primitives/geometry/geometry-constants.mjs.map +2 -2
  220. package/dist-esm/lib/primitives/intersect.mjs +5 -5
  221. package/dist-esm/lib/primitives/intersect.mjs.map +2 -2
  222. package/dist-esm/lib/primitives/utils.mjs +4 -0
  223. package/dist-esm/lib/primitives/utils.mjs.map +2 -2
  224. package/dist-esm/lib/utils/EditorAtom.mjs +25 -0
  225. package/dist-esm/lib/utils/EditorAtom.mjs.map +7 -0
  226. package/dist-esm/lib/utils/dom.mjs +12 -1
  227. package/dist-esm/lib/utils/dom.mjs.map +2 -2
  228. package/dist-esm/lib/utils/getPointerInfo.mjs +2 -2
  229. package/dist-esm/lib/utils/getPointerInfo.mjs.map +2 -2
  230. package/dist-esm/lib/utils/reparenting.mjs +3 -40
  231. package/dist-esm/lib/utils/reparenting.mjs.map +2 -2
  232. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs +0 -1
  233. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs.map +2 -2
  234. package/dist-esm/version.mjs +3 -3
  235. package/dist-esm/version.mjs.map +1 -1
  236. package/editor.css +327 -315
  237. package/package.json +16 -38
  238. package/src/index.ts +19 -10
  239. package/src/lib/TldrawEditor.tsx +16 -21
  240. package/src/lib/components/MenuClickCapture.tsx +0 -8
  241. package/src/lib/components/SVGContainer.tsx +1 -1
  242. package/src/lib/components/Shape.tsx +12 -33
  243. package/src/lib/components/default-components/DefaultBrush.tsx +1 -1
  244. package/src/lib/components/default-components/DefaultCanvas.tsx +13 -24
  245. package/src/lib/components/default-components/DefaultCollaboratorHint.tsx +2 -2
  246. package/src/lib/components/default-components/DefaultCursor.tsx +1 -1
  247. package/src/lib/components/default-components/DefaultErrorFallback.tsx +1 -1
  248. package/src/lib/components/default-components/DefaultGrid.tsx +1 -1
  249. package/src/lib/components/default-components/DefaultHandles.tsx +5 -1
  250. package/src/lib/components/default-components/DefaultScribble.tsx +1 -1
  251. package/src/lib/components/default-components/DefaultShapeIndicator.tsx +6 -2
  252. package/src/lib/components/default-components/DefaultShapeWrapper.tsx +35 -0
  253. package/src/lib/components/default-components/DefaultSnapIndictor.tsx +1 -1
  254. package/src/lib/components/default-components/DefaultSpinner.tsx +12 -12
  255. package/src/lib/config/TLUserPreferences.ts +15 -1
  256. package/src/lib/editor/Editor.test.ts +512 -8
  257. package/src/lib/editor/Editor.ts +252 -267
  258. package/src/lib/editor/derivations/notVisibleShapes.ts +6 -0
  259. package/src/lib/editor/derivations/parentsToChildren.ts +1 -1
  260. package/src/lib/editor/managers/ClickManager/ClickManager.test.ts +15 -14
  261. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.test.ts +16 -15
  262. package/src/lib/editor/managers/FocusManager/FocusManager.test.ts +49 -48
  263. package/src/lib/editor/managers/FontManager/FontManager.test.ts +38 -27
  264. package/src/lib/editor/managers/HistoryManager/HistoryManager.test.ts +7 -6
  265. package/src/lib/editor/managers/ScribbleManager/ScribbleManager.test.ts +12 -11
  266. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +57 -50
  267. package/src/lib/editor/managers/TextManager/TextManager.test.ts +51 -26
  268. package/src/lib/editor/managers/TickManager/TickManager.test.ts +14 -13
  269. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +55 -26
  270. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.ts +14 -1
  271. package/src/lib/editor/shapes/BaseBoxShapeUtil.tsx +2 -2
  272. package/src/lib/editor/shapes/ShapeUtil.ts +108 -8
  273. package/src/lib/editor/tools/BaseBoxShapeTool/BaseBoxShapeTool.ts +2 -1
  274. package/src/lib/editor/tools/StateNode.test.ts +285 -0
  275. package/src/lib/editor/tools/StateNode.ts +27 -1
  276. package/src/lib/editor/types/misc-types.ts +73 -7
  277. package/src/lib/exports/getSvgJsx.test.ts +874 -0
  278. package/src/lib/exports/getSvgJsx.tsx +78 -21
  279. package/src/lib/hooks/useCanvasEvents.ts +60 -47
  280. package/src/lib/hooks/useDocumentEvents.ts +11 -6
  281. package/src/lib/hooks/useEditor.tsx +6 -5
  282. package/src/lib/hooks/useEditorComponents.tsx +8 -2
  283. package/src/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.ts +2 -2
  284. package/src/lib/hooks/useGestureEvents.ts +2 -2
  285. package/src/lib/hooks/useHandleEvents.ts +9 -4
  286. package/src/lib/hooks/usePassThroughMouseOverEvents.ts +4 -1
  287. package/src/lib/hooks/usePassThroughWheelEvents.ts +6 -1
  288. package/src/lib/hooks/useSelectionEvents.ts +6 -5
  289. package/src/lib/hooks/useStateAttribute.ts +15 -0
  290. package/src/lib/license/LicenseManager.test.ts +724 -383
  291. package/src/lib/license/LicenseManager.ts +201 -58
  292. package/src/lib/license/LicenseProvider.tsx +74 -2
  293. package/src/lib/license/Watermark.test.tsx +2 -1
  294. package/src/lib/license/Watermark.tsx +81 -14
  295. package/src/lib/license/useLicenseManagerState.ts +2 -2
  296. package/src/lib/options.ts +8 -0
  297. package/src/lib/primitives/Box.test.ts +126 -0
  298. package/src/lib/primitives/Box.ts +10 -1
  299. package/src/lib/primitives/Vec.ts +0 -5
  300. package/src/lib/primitives/geometry/Arc2d.ts +2 -2
  301. package/src/lib/primitives/geometry/Circle2d.ts +2 -2
  302. package/src/lib/primitives/geometry/CubicBezier2d.ts +4 -1
  303. package/src/lib/primitives/geometry/Ellipse2d.ts +2 -2
  304. package/src/lib/primitives/geometry/Geometry2d.test.ts +420 -0
  305. package/src/lib/primitives/geometry/Geometry2d.ts +78 -21
  306. package/src/lib/primitives/geometry/Group2d.ts +10 -1
  307. package/src/lib/primitives/geometry/geometry-constants.ts +2 -1
  308. package/src/lib/primitives/intersect.test.ts +946 -0
  309. package/src/lib/primitives/intersect.ts +12 -5
  310. package/src/lib/primitives/utils.ts +11 -0
  311. package/src/lib/test/InFrontOfTheCanvas.test.tsx +187 -0
  312. package/src/lib/utils/EditorAtom.ts +37 -0
  313. package/src/lib/utils/dom.test.ts +94 -0
  314. package/src/lib/utils/dom.ts +38 -1
  315. package/src/lib/utils/getPointerInfo.ts +2 -1
  316. package/src/lib/utils/reparenting.ts +3 -69
  317. package/src/lib/utils/sync/LocalIndexedDb.test.ts +2 -1
  318. package/src/lib/utils/sync/TLLocalSyncClient.test.ts +15 -15
  319. package/src/lib/utils/sync/TLLocalSyncClient.ts +0 -1
  320. package/src/version.ts +3 -3
  321. package/dist-cjs/lib/utils/nearestMultiple.js.map +0 -7
  322. package/dist-esm/lib/utils/nearestMultiple.mjs +0 -14
  323. package/dist-esm/lib/utils/nearestMultiple.mjs.map +0 -7
  324. package/src/lib/test/currentToolIdMask.test.ts +0 -49
  325. package/src/lib/utils/nearestMultiple.ts +0 -13
@@ -88,7 +88,6 @@ var import_defaultShapes = require("../config/defaultShapes");
88
88
  var import_constants = require("../constants");
89
89
  var import_exportToSvg = require("../exports/exportToSvg");
90
90
  var import_getSvgAsImage = require("../exports/getSvgAsImage");
91
- var import_environment = require("../globals/environment");
92
91
  var import_menus = require("../globals/menus");
93
92
  var import_time = require("../globals/time");
94
93
  var import_options = require("../options");
@@ -123,8 +122,8 @@ var import_TextManager = require("./managers/TextManager/TextManager");
123
122
  var import_TickManager = require("./managers/TickManager/TickManager");
124
123
  var import_UserPreferencesManager = require("./managers/UserPreferencesManager/UserPreferencesManager");
125
124
  var import_RootState = require("./tools/RootState");
126
- var __setMetaKeyTimeout_dec, __setCtrlKeyTimeout_dec, __setAltKeyTimeout_dec, __setShiftKeyTimeout_dec, _getIsReadonly_dec, _getIsFocused_dec, _getSharedOpacity_dec, _getSharedStyles_dec, __getSelectionSharedStyles_dec, __getBindingsIndexCache_dec, _getCurrentPageRenderingShapesSorted_dec, _getCurrentPageShapesSorted_dec, _getCurrentPageShapes_dec, _getCurrentPageBounds_dec, _getCulledShapes_dec, _getNotVisibleShapes_dec, __getShapeMaskedPageBoundsCache_dec, __getShapeMaskCache_dec, __getShapeClipPathCache_dec, __getShapePageBoundsCache_dec, __getShapePageTransformCache_dec, __getShapeHandlesCache_dec, __getAllAssetsQuery_dec, _getCurrentPageShapeIdsSorted_dec, _getCurrentPageId_dec, _getPages_dec, __getAllPagesQuery_dec, _getRenderingShapes_dec, _getCollaboratorsOnCurrentPage_dec, _getCollaborators_dec, __getCollaboratorsQuery_dec, _getViewportPageBounds_dec, _getViewportScreenCenter_dec, _getViewportScreenBounds_dec, _getZoomLevel_dec, _getCameraForFollowing_dec, _getViewportPageBoundsForFollowing_dec, _getCamera_dec, __unsafe_getCameraId_dec, _getErasingShapes_dec, _getErasingShapeIds_dec, _getHintingShape_dec, _getHintingShapeIds_dec, _getHoveredShape_dec, _getHoveredShapeId_dec, _getRichTextEditor_dec, _getEditingShape_dec, _getEditingShapeId_dec, _getFocusedGroup_dec, _getFocusedGroupId_dec, _getSelectionRotatedScreenBounds_dec, _getSelectionRotatedPageBounds_dec, _getSelectionRotation_dec, _getSelectionPageBounds_dec, _getOnlySelectedShape_dec, _getOnlySelectedShapeId_dec, _getCurrentPageShapesInReadingOrder_dec, _getSelectedShapes_dec, _getSelectedShapeIds_dec, __getCurrentPageStateId_dec, _getCurrentPageState_dec, __getPageStatesQuery_dec, _getPageStates_dec, _getIsMenuOpen_dec, _getOpenMenus_dec, _getInstanceState_dec, _getDocumentSettings_dec, _getCurrentToolId_dec, _getCurrentTool_dec, _getPath_dec, _getCanRedo_dec, _getCanUndo_dec, _getIsShapeHiddenCache_dec, _a, _init;
127
- class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_dec = [import_state.computed], _getCanUndo_dec = [import_state.computed], _getCanRedo_dec = [import_state.computed], _getPath_dec = [import_state.computed], _getCurrentTool_dec = [import_state.computed], _getCurrentToolId_dec = [import_state.computed], _getDocumentSettings_dec = [import_state.computed], _getInstanceState_dec = [import_state.computed], _getOpenMenus_dec = [import_state.computed], _getIsMenuOpen_dec = [import_state.computed], _getPageStates_dec = [import_state.computed], __getPageStatesQuery_dec = [import_state.computed], _getCurrentPageState_dec = [import_state.computed], __getCurrentPageStateId_dec = [import_state.computed], _getSelectedShapeIds_dec = [import_state.computed], _getSelectedShapes_dec = [import_state.computed], _getCurrentPageShapesInReadingOrder_dec = [import_state.computed], _getOnlySelectedShapeId_dec = [import_state.computed], _getOnlySelectedShape_dec = [import_state.computed], _getSelectionPageBounds_dec = [import_state.computed], _getSelectionRotation_dec = [import_state.computed], _getSelectionRotatedPageBounds_dec = [import_state.computed], _getSelectionRotatedScreenBounds_dec = [import_state.computed], _getFocusedGroupId_dec = [import_state.computed], _getFocusedGroup_dec = [import_state.computed], _getEditingShapeId_dec = [import_state.computed], _getEditingShape_dec = [import_state.computed], _getRichTextEditor_dec = [import_state.computed], _getHoveredShapeId_dec = [import_state.computed], _getHoveredShape_dec = [import_state.computed], _getHintingShapeIds_dec = [import_state.computed], _getHintingShape_dec = [import_state.computed], _getErasingShapeIds_dec = [import_state.computed], _getErasingShapes_dec = [import_state.computed], __unsafe_getCameraId_dec = [import_state.computed], _getCamera_dec = [import_state.computed], _getViewportPageBoundsForFollowing_dec = [import_state.computed], _getCameraForFollowing_dec = [import_state.computed], _getZoomLevel_dec = [import_state.computed], _getViewportScreenBounds_dec = [import_state.computed], _getViewportScreenCenter_dec = [import_state.computed], _getViewportPageBounds_dec = [import_state.computed], __getCollaboratorsQuery_dec = [import_state.computed], _getCollaborators_dec = [import_state.computed], _getCollaboratorsOnCurrentPage_dec = [import_state.computed], _getRenderingShapes_dec = [import_state.computed], __getAllPagesQuery_dec = [import_state.computed], _getPages_dec = [import_state.computed], _getCurrentPageId_dec = [import_state.computed], _getCurrentPageShapeIdsSorted_dec = [import_state.computed], __getAllAssetsQuery_dec = [import_state.computed], __getShapeHandlesCache_dec = [import_state.computed], __getShapePageTransformCache_dec = [import_state.computed], __getShapePageBoundsCache_dec = [import_state.computed], __getShapeClipPathCache_dec = [import_state.computed], __getShapeMaskCache_dec = [import_state.computed], __getShapeMaskedPageBoundsCache_dec = [import_state.computed], _getNotVisibleShapes_dec = [import_state.computed], _getCulledShapes_dec = [import_state.computed], _getCurrentPageBounds_dec = [import_state.computed], _getCurrentPageShapes_dec = [import_state.computed], _getCurrentPageShapesSorted_dec = [import_state.computed], _getCurrentPageRenderingShapesSorted_dec = [import_state.computed], __getBindingsIndexCache_dec = [import_state.computed], __getSelectionSharedStyles_dec = [import_state.computed], _getSharedStyles_dec = [(0, import_state.computed)({ isEqual: (a, b) => a.equals(b) })], _getSharedOpacity_dec = [import_state.computed], _getIsFocused_dec = [import_state.computed], _getIsReadonly_dec = [import_state.computed], __setShiftKeyTimeout_dec = [import_utils.bind], __setAltKeyTimeout_dec = [import_utils.bind], __setCtrlKeyTimeout_dec = [import_utils.bind], __setMetaKeyTimeout_dec = [import_utils.bind], _a) {
125
+ var __setMetaKeyTimeout_dec, __setCtrlKeyTimeout_dec, __setAltKeyTimeout_dec, __setShiftKeyTimeout_dec, _getIsReadonly_dec, _getIsFocused_dec, _getSharedOpacity_dec, _getSharedStyles_dec, __getSelectionSharedStyles_dec, __getBindingsIndexCache_dec, _getCurrentPageRenderingShapesSorted_dec, _getCurrentPageShapesSorted_dec, _getCurrentPageShapes_dec, _getCurrentPageBounds_dec, _getCulledShapes_dec, _getNotVisibleShapes_dec, __getShapeMaskedPageBoundsCache_dec, __getShapeMaskCache_dec, __getShapeClipPathCache_dec, __getShapePageBoundsCache_dec, __getShapePageTransformCache_dec, __getShapeHandlesCache_dec, __getAllAssetsQuery_dec, _getCurrentPageShapeIdsSorted_dec, _getCurrentPageId_dec, _getPages_dec, __getAllPagesQuery_dec, _getRenderingShapes_dec, _getCollaboratorsOnCurrentPage_dec, _getCollaborators_dec, __getCollaboratorsQuery_dec, _getViewportPageBounds_dec, _getViewportScreenCenter_dec, _getViewportScreenBounds_dec, _getZoomLevel_dec, _getCameraForFollowing_dec, _getViewportPageBoundsForFollowing_dec, _getCamera_dec, __unsafe_getCameraId_dec, _getErasingShapes_dec, _getErasingShapeIds_dec, _getHintingShape_dec, _getHintingShapeIds_dec, _getHoveredShape_dec, _getHoveredShapeId_dec, _getRichTextEditor_dec, _getEditingShape_dec, _getEditingShapeId_dec, _getFocusedGroup_dec, _getFocusedGroupId_dec, _getSelectionRotatedScreenBounds_dec, _getSelectionRotatedPageBounds_dec, _getSelectionRotation_dec, _getSelectionPageBounds_dec, _getOnlySelectedShape_dec, _getOnlySelectedShapeId_dec, _getCurrentPageShapesInReadingOrder_dec, _getSelectedShapes_dec, _getSelectedShapeIds_dec, __getCurrentPageStateId_dec, _getCurrentPageState_dec, __getPageStatesQuery_dec, _getPageStates_dec, _getInstanceState_dec, _getDocumentSettings_dec, _getCurrentToolId_dec, _getCurrentTool_dec, _getPath_dec, _getCanRedo_dec, _getCanUndo_dec, _getIsShapeHiddenCache_dec, _a, _init;
126
+ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_dec = [import_state.computed], _getCanUndo_dec = [import_state.computed], _getCanRedo_dec = [import_state.computed], _getPath_dec = [import_state.computed], _getCurrentTool_dec = [import_state.computed], _getCurrentToolId_dec = [import_state.computed], _getDocumentSettings_dec = [import_state.computed], _getInstanceState_dec = [import_state.computed], _getPageStates_dec = [import_state.computed], __getPageStatesQuery_dec = [import_state.computed], _getCurrentPageState_dec = [import_state.computed], __getCurrentPageStateId_dec = [import_state.computed], _getSelectedShapeIds_dec = [import_state.computed], _getSelectedShapes_dec = [import_state.computed], _getCurrentPageShapesInReadingOrder_dec = [import_state.computed], _getOnlySelectedShapeId_dec = [import_state.computed], _getOnlySelectedShape_dec = [import_state.computed], _getSelectionPageBounds_dec = [import_state.computed], _getSelectionRotation_dec = [import_state.computed], _getSelectionRotatedPageBounds_dec = [import_state.computed], _getSelectionRotatedScreenBounds_dec = [import_state.computed], _getFocusedGroupId_dec = [import_state.computed], _getFocusedGroup_dec = [import_state.computed], _getEditingShapeId_dec = [import_state.computed], _getEditingShape_dec = [import_state.computed], _getRichTextEditor_dec = [import_state.computed], _getHoveredShapeId_dec = [import_state.computed], _getHoveredShape_dec = [import_state.computed], _getHintingShapeIds_dec = [import_state.computed], _getHintingShape_dec = [import_state.computed], _getErasingShapeIds_dec = [import_state.computed], _getErasingShapes_dec = [import_state.computed], __unsafe_getCameraId_dec = [import_state.computed], _getCamera_dec = [import_state.computed], _getViewportPageBoundsForFollowing_dec = [import_state.computed], _getCameraForFollowing_dec = [import_state.computed], _getZoomLevel_dec = [import_state.computed], _getViewportScreenBounds_dec = [import_state.computed], _getViewportScreenCenter_dec = [import_state.computed], _getViewportPageBounds_dec = [import_state.computed], __getCollaboratorsQuery_dec = [import_state.computed], _getCollaborators_dec = [import_state.computed], _getCollaboratorsOnCurrentPage_dec = [import_state.computed], _getRenderingShapes_dec = [import_state.computed], __getAllPagesQuery_dec = [import_state.computed], _getPages_dec = [import_state.computed], _getCurrentPageId_dec = [import_state.computed], _getCurrentPageShapeIdsSorted_dec = [import_state.computed], __getAllAssetsQuery_dec = [import_state.computed], __getShapeHandlesCache_dec = [import_state.computed], __getShapePageTransformCache_dec = [import_state.computed], __getShapePageBoundsCache_dec = [import_state.computed], __getShapeClipPathCache_dec = [import_state.computed], __getShapeMaskCache_dec = [import_state.computed], __getShapeMaskedPageBoundsCache_dec = [import_state.computed], _getNotVisibleShapes_dec = [import_state.computed], _getCulledShapes_dec = [import_state.computed], _getCurrentPageBounds_dec = [import_state.computed], _getCurrentPageShapes_dec = [import_state.computed], _getCurrentPageShapesSorted_dec = [import_state.computed], _getCurrentPageRenderingShapesSorted_dec = [import_state.computed], __getBindingsIndexCache_dec = [import_state.computed], __getSelectionSharedStyles_dec = [import_state.computed], _getSharedStyles_dec = [(0, import_state.computed)({ isEqual: (a, b) => a.equals(b) })], _getSharedOpacity_dec = [import_state.computed], _getIsFocused_dec = [import_state.computed], _getIsReadonly_dec = [import_state.computed], __setShiftKeyTimeout_dec = [import_utils.bind], __setAltKeyTimeout_dec = [import_utils.bind], __setCtrlKeyTimeout_dec = [import_utils.bind], __setMetaKeyTimeout_dec = [import_utils.bind], _a) {
128
127
  constructor({
129
128
  store,
130
129
  user,
@@ -138,8 +137,6 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
138
137
  autoFocus,
139
138
  inferDarkMode,
140
139
  options,
141
- // eslint-disable-next-line @typescript-eslint/no-deprecated
142
- isShapeHidden,
143
140
  getShapeVisibility,
144
141
  fontAssetUrls
145
142
  }) {
@@ -206,13 +203,6 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
206
203
  * @public
207
204
  */
208
205
  __publicField(this, "fonts");
209
- /**
210
- * A manager for the editor's environment.
211
- *
212
- * @deprecated This is deprecated and will be removed in a future version. Use the `tlenv` global export instead.
213
- * @public
214
- */
215
- __publicField(this, "environment", import_environment.tlenv);
216
206
  /**
217
207
  * A manager for the editor's scribbles.
218
208
  *
@@ -415,14 +405,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
415
405
  /** @internal */
416
406
  __publicField(this, "performanceTrackerTimeout", -1);
417
407
  __publicField(this, "_pendingEventsForNextTick", []);
418
- (0, import_utils.assert)(
419
- !(isShapeHidden && getShapeVisibility),
420
- "Cannot use both isShapeHidden and getShapeVisibility"
421
- );
422
- this._getShapeVisibility = isShapeHidden ? (
423
- // eslint-disable-next-line @typescript-eslint/no-deprecated
424
- (shape, editor) => isShapeHidden(shape, editor) ? "hidden" : "inherit"
425
- ) : getShapeVisibility;
408
+ this._getShapeVisibility = getShapeVisibility;
426
409
  this.options = { ...import_options.defaultTldrawOptions, ...options };
427
410
  this.store = store;
428
411
  this.history = new import_HistoryManager.HistoryManager({
@@ -902,34 +885,6 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
902
885
  getCanRedo() {
903
886
  return this.history.getNumRedos() > 0;
904
887
  }
905
- /**
906
- * Create a new "mark", or stopping point, in the undo redo history. Creating a mark will clear
907
- * any redos.
908
- *
909
- * @example
910
- * ```ts
911
- * editor.mark()
912
- * editor.mark('flip shapes')
913
- * ```
914
- *
915
- * @param markId - The mark's id, usually the reason for adding the mark.
916
- *
917
- * @public
918
- * @deprecated use {@link Editor.markHistoryStoppingPoint} instead
919
- */
920
- mark(markId) {
921
- if (typeof markId === "string") {
922
- console.warn(
923
- `[tldraw] \`editor.history.mark("${markId}")\` is deprecated. Please use \`const myMarkId = editor.markHistoryStoppingPoint()\` instead.`
924
- );
925
- } else {
926
- console.warn(
927
- "[tldraw] `editor.mark()` is deprecated. Use `editor.markHistoryStoppingPoint()` instead."
928
- );
929
- }
930
- this.history._mark(markId ?? (0, import_utils.uniqueId)());
931
- return this;
932
- }
933
888
  /**
934
889
  * Create a new "mark", or stopping point, in the undo redo history. Creating a mark will clear
935
890
  * any redos. You typically want to do this just before a user interaction begins or is handled.
@@ -1045,12 +1000,6 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1045
1000
  }
1046
1001
  return this;
1047
1002
  }
1048
- /**
1049
- * @deprecated Use `Editor.run` instead.
1050
- */
1051
- batch(fn, opts) {
1052
- return this.run(fn, opts);
1053
- }
1054
1003
  /* --------------------- Errors --------------------- */
1055
1004
  /** @internal */
1056
1005
  annotateError(error, {
@@ -1272,39 +1221,6 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1272
1221
  ]);
1273
1222
  }, opts);
1274
1223
  }
1275
- getOpenMenus() {
1276
- return this.menus.getOpenMenus();
1277
- }
1278
- /**
1279
- * @deprecated Use `editor.menus.addOpenMenu` instead.
1280
- *
1281
- * @public
1282
- */
1283
- addOpenMenu(id) {
1284
- this.menus.addOpenMenu(id);
1285
- return this;
1286
- }
1287
- /**
1288
- * @deprecated Use `editor.menus.deleteOpenMenu` instead.
1289
- *
1290
- * @public
1291
- */
1292
- deleteOpenMenu(id) {
1293
- this.menus.deleteOpenMenu(id);
1294
- return this;
1295
- }
1296
- /**
1297
- * @deprecated Use `editor.menus.clearOpenMenus` instead.
1298
- *
1299
- * @public
1300
- */
1301
- clearOpenMenus() {
1302
- this.menus.clearOpenMenus();
1303
- return this;
1304
- }
1305
- getIsMenuOpen() {
1306
- return this.menus.hasAnyOpenMenus();
1307
- }
1308
1224
  /* --------------------- Cursor --------------------- */
1309
1225
  /**
1310
1226
  * Set the cursor.
@@ -1432,7 +1348,9 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1432
1348
  return this;
1433
1349
  }
1434
1350
  /**
1435
- * Select all direct children of the current page.
1351
+ * Select all shapes. If the user has selected shapes that share a parent,
1352
+ * select all shapes within that parent. If the user has not selected any shapes,
1353
+ * or if the shapes shapes are only on select all shapes on the current page.
1436
1354
  *
1437
1355
  * @example
1438
1356
  * ```ts
@@ -1442,7 +1360,23 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1442
1360
  * @public
1443
1361
  */
1444
1362
  selectAll() {
1445
- const ids = this.getSortedChildIdsForParent(this.getCurrentPageId());
1363
+ let parentToSelectWithinId = null;
1364
+ const selectedShapeIds = this.getSelectedShapeIds();
1365
+ if (selectedShapeIds.length > 0) {
1366
+ for (const id of selectedShapeIds) {
1367
+ const shape = this.getShape(id);
1368
+ if (!shape) continue;
1369
+ if (parentToSelectWithinId === null) {
1370
+ parentToSelectWithinId = shape.parentId;
1371
+ } else if (parentToSelectWithinId !== shape.parentId) {
1372
+ return this;
1373
+ }
1374
+ }
1375
+ }
1376
+ if (!parentToSelectWithinId) {
1377
+ parentToSelectWithinId = this.getCurrentPageId();
1378
+ }
1379
+ const ids = this.getSortedChildIdsForParent(parentToSelectWithinId);
1446
1380
  if (ids.length <= 0) return this;
1447
1381
  this.setSelectedShapes(this._getUnlockedShapeIds(ids));
1448
1382
  return this;
@@ -1461,9 +1395,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1461
1395
  const selectedShapeIds = this.getSelectedShapeIds();
1462
1396
  const firstParentId = selectedShapeIds[0] ? this.getShape(selectedShapeIds[0])?.parentId : null;
1463
1397
  const isSelectedWithinContainer = firstParentId && selectedShapeIds.every((shapeId) => this.getShape(shapeId)?.parentId === firstParentId) && !(0, import_tlschema.isPageId)(firstParentId);
1464
- const readingOrderShapes = isSelectedWithinContainer ? this._getShapesInReadingOrder(
1465
- this.getCurrentPageShapes().filter((shape2) => shape2.parentId === firstParentId)
1466
- ) : this.getCurrentPageShapesInReadingOrder();
1398
+ const filteredShapes = isSelectedWithinContainer ? this.getCurrentPageShapes().filter((shape2) => shape2.parentId === firstParentId) : this.getCurrentPageShapes().filter((shape2) => (0, import_tlschema.isPageId)(shape2.parentId));
1399
+ const readingOrderShapes = isSelectedWithinContainer ? this._getShapesInReadingOrder(filteredShapes) : this.getCurrentPageShapesInReadingOrder();
1467
1400
  const currentShapeId = selectedShapeIds.length === 1 ? selectedShapeIds[0] : readingOrderShapes.find((shape2) => selectedShapeIds.includes(shape2.id))?.id;
1468
1401
  let adjacentShapeId;
1469
1402
  if (direction === "next" || direction === "prev") {
@@ -1473,7 +1406,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1473
1406
  adjacentShapeId = shapeIds[adjacentIndex];
1474
1407
  } else {
1475
1408
  if (!currentShapeId) return;
1476
- adjacentShapeId = this.getNearestAdjacentShape(currentShapeId, direction);
1409
+ adjacentShapeId = this.getNearestAdjacentShape(filteredShapes, currentShapeId, direction);
1477
1410
  }
1478
1411
  const shape = this.getShape(adjacentShapeId);
1479
1412
  if (!shape) return;
@@ -1539,11 +1472,10 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1539
1472
  *
1540
1473
  * @public
1541
1474
  */
1542
- getNearestAdjacentShape(currentShapeId, direction) {
1475
+ getNearestAdjacentShape(shapes, currentShapeId, direction) {
1543
1476
  const directionToAngle = { right: 0, left: 180, down: 90, up: 270 };
1544
1477
  const currentShape = this.getShape(currentShapeId);
1545
1478
  if (!currentShape) return currentShapeId;
1546
- const shapes = this.getCurrentPageShapes();
1547
1479
  const tabbableShapes = shapes.filter(
1548
1480
  (shape) => this.getShapeUtil(shape).canTabTo(shape) && shape.id !== currentShapeId
1549
1481
  );
@@ -2307,28 +2239,11 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
2307
2239
  { history: "ignore" }
2308
2240
  );
2309
2241
  const { currentScreenPoint, currentPagePoint } = this.inputs;
2310
- const { screenBounds } = this.store.unsafeGetWithoutCapture(import_tlschema.TLINSTANCE_ID);
2311
2242
  if (currentScreenPoint.x / z - x !== currentPagePoint.x || currentScreenPoint.y / z - y !== currentPagePoint.y) {
2312
- const event = {
2313
- type: "pointer",
2314
- target: "canvas",
2315
- name: "pointer_move",
2316
- // weird but true: we need to put the screen point back into client space
2317
- point: import_Vec.Vec.AddXY(currentScreenPoint, screenBounds.x, screenBounds.y),
2318
- pointerId: import_constants.INTERNAL_POINTER_IDS.CAMERA_MOVE,
2319
- ctrlKey: this.inputs.ctrlKey,
2320
- altKey: this.inputs.altKey,
2321
- shiftKey: this.inputs.shiftKey,
2322
- metaKey: this.inputs.metaKey,
2323
- accelKey: (0, import_keyboard.isAccelKey)(this.inputs),
2324
- button: 0,
2325
- isPen: this.getInstanceState().isPenMode ?? false
2326
- };
2327
- if (opts?.immediate) {
2328
- this._flushEventForTick(event);
2329
- } else {
2330
- this.dispatch(event);
2331
- }
2243
+ this.updatePointer({
2244
+ immediate: opts?.immediate,
2245
+ pointerId: import_constants.INTERNAL_POINTER_IDS.CAMERA_MOVE
2246
+ });
2332
2247
  }
2333
2248
  this._tickCameraState();
2334
2249
  });
@@ -3297,19 +3212,24 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
3297
3212
  */
3298
3213
  deletePage(page) {
3299
3214
  const id = typeof page === "string" ? page : page.id;
3300
- this.run(() => {
3301
- if (this.getIsReadonly()) return;
3302
- const pages = this.getPages();
3303
- if (pages.length === 1) return;
3304
- const deletedPage = this.getPage(id);
3305
- if (!deletedPage) return;
3306
- if (id === this.getCurrentPageId()) {
3307
- const index = pages.findIndex((page2) => page2.id === id);
3308
- const next = pages[index - 1] ?? pages[index + 1];
3309
- this.setCurrentPage(next.id);
3310
- }
3311
- this.store.remove([deletedPage.id]);
3312
- });
3215
+ this.run(
3216
+ () => {
3217
+ if (this.getIsReadonly()) return;
3218
+ const pages = this.getPages();
3219
+ if (pages.length === 1) return;
3220
+ const deletedPage = this.getPage(id);
3221
+ if (!deletedPage) return;
3222
+ if (id === this.getCurrentPageId()) {
3223
+ const index = pages.findIndex((page2) => page2.id === id);
3224
+ const next = pages[index - 1] ?? pages[index + 1];
3225
+ this.setCurrentPage(next.id);
3226
+ }
3227
+ const shapes = this.getSortedChildIdsForParent(deletedPage.id);
3228
+ this.deleteShapes(shapes);
3229
+ this.store.remove([deletedPage.id]);
3230
+ },
3231
+ { ignoreShapeLock: true }
3232
+ );
3313
3233
  return this;
3314
3234
  }
3315
3235
  /**
@@ -3608,8 +3528,9 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
3608
3528
  return this.store.createComputedCache("pageBoundsCache", (shape) => {
3609
3529
  const pageTransform = this.getShapePageTransform(shape);
3610
3530
  if (!pageTransform) return void 0;
3611
- const geometry = this.getShapeGeometry(shape);
3612
- return import_Box.Box.FromPoints(pageTransform.applyToPoints(geometry.vertices));
3531
+ return import_Box.Box.FromPoints(
3532
+ pageTransform.applyToPoints(this.getShapeGeometry(shape).boundsVertices)
3533
+ );
3613
3534
  });
3614
3535
  }
3615
3536
  /**
@@ -3662,16 +3583,17 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
3662
3583
  _getShapeMaskCache() {
3663
3584
  return this.store.createComputedCache("pageMaskCache", (shape) => {
3664
3585
  if ((0, import_tlschema.isPageId)(shape.parentId)) return void 0;
3665
- const frameAncestors = this.getShapeAncestors(shape.id).filter(
3666
- (shape2) => this.isShapeOfType(shape2, "frame")
3667
- );
3668
- if (frameAncestors.length === 0) return void 0;
3669
- const pageMask = frameAncestors.map((s) => {
3670
- const geometry = this.getShapeGeometry(s.id);
3671
- const pageTransform = this.getShapePageTransform(s.id);
3672
- return pageTransform.applyToPoints(geometry.vertices);
3673
- }).reduce((acc, b) => {
3674
- if (!(b && acc)) return void 0;
3586
+ const clipPaths = [];
3587
+ for (const ancestor of this.getShapeAncestors(shape.id)) {
3588
+ const util = this.getShapeUtil(ancestor);
3589
+ const clipPath = util.getClipPath?.(ancestor);
3590
+ if (!clipPath) continue;
3591
+ if (util.shouldClipChild?.(shape) === false) continue;
3592
+ const pageTransform = this.getShapePageTransform(ancestor.id);
3593
+ clipPaths.push(pageTransform.applyToPoints(clipPath));
3594
+ }
3595
+ if (clipPaths.length === 0) return void 0;
3596
+ const pageMask = clipPaths.reduce((acc, b) => {
3675
3597
  const intersection = (0, import_intersect.intersectPolygonPolygon)(acc, b);
3676
3598
  if (intersection) {
3677
3599
  return intersection.map(import_Vec.Vec.Cast);
@@ -3906,6 +3828,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
3906
3828
  hitInside = false,
3907
3829
  hitFrameInside = false
3908
3830
  } = opts;
3831
+ const [innerMargin, outerMargin] = Array.isArray(margin) ? margin : [margin, margin];
3909
3832
  let inHollowSmallestArea = Infinity;
3910
3833
  let inHollowSmallestAreaHit = null;
3911
3834
  let inMarginClosestToEdgeDistance = Infinity;
@@ -3915,7 +3838,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
3915
3838
  return false;
3916
3839
  const pageMask = this.getShapeMask(shape);
3917
3840
  if (pageMask && !(0, import_utils2.pointInPolygon)(point, pageMask)) return false;
3918
- if (filter) return filter(shape);
3841
+ if (filter && !filter(shape)) return false;
3919
3842
  return true;
3920
3843
  });
3921
3844
  for (let i = shapesToCheck.length - 1; i >= 0; i--) {
@@ -3923,7 +3846,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
3923
3846
  const geometry = this.getShapeGeometry(shape);
3924
3847
  const isGroup = geometry instanceof import_Group2d.Group2d;
3925
3848
  const pointInShapeSpace = this.getPointInShapeSpace(shape, point);
3926
- if (this.isShapeOfType(shape, "frame") || this.isShapeOfType(shape, "arrow") && shape.props.text.trim() || (this.isShapeOfType(shape, "note") || this.isShapeOfType(shape, "geo") && shape.props.fill === "none") && this.getShapeUtil(shape).getText(shape)?.trim()) {
3849
+ if (this.isShapeOfType(shape, "frame") || (this.isShapeOfType(shape, "note") || this.isShapeOfType(shape, "arrow") || this.isShapeOfType(shape, "geo") && shape.props.fill === "none") && this.getShapeUtil(shape).getText(shape)?.trim()) {
3927
3850
  for (const childGeometry of geometry.children) {
3928
3851
  if (childGeometry.isLabel && childGeometry.isPointInBounds(pointInShapeSpace)) {
3929
3852
  return shape;
@@ -3931,8 +3854,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
3931
3854
  }
3932
3855
  }
3933
3856
  if (this.isShapeOfType(shape, "frame")) {
3934
- const distance2 = geometry.distanceToPoint(pointInShapeSpace, hitInside);
3935
- if (Math.abs(distance2) <= margin) {
3857
+ const distance2 = geometry.distanceToPoint(pointInShapeSpace, hitFrameInside);
3858
+ if (hitFrameInside ? distance2 > 0 && distance2 <= outerMargin || distance2 <= 0 && distance2 > -innerMargin : distance2 > 0 && distance2 <= outerMargin) {
3936
3859
  return inMarginClosestToEdgeHit || shape;
3937
3860
  }
3938
3861
  if (geometry.hitTestPoint(pointInShapeSpace, 0, true)) {
@@ -3952,10 +3875,10 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
3952
3875
  }
3953
3876
  distance = minDistance;
3954
3877
  } else {
3955
- if (margin === 0 && (geometry.bounds.w < 1 || geometry.bounds.h < 1)) {
3878
+ if (outerMargin === 0 && (geometry.bounds.w < 1 || geometry.bounds.h < 1)) {
3956
3879
  distance = geometry.distanceToPoint(pointInShapeSpace, hitInside);
3957
3880
  } else {
3958
- if (geometry.bounds.containsPoint(pointInShapeSpace, margin)) {
3881
+ if (geometry.bounds.containsPoint(pointInShapeSpace, outerMargin)) {
3959
3882
  distance = geometry.distanceToPoint(pointInShapeSpace, hitInside);
3960
3883
  } else {
3961
3884
  distance = Infinity;
@@ -3963,12 +3886,22 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
3963
3886
  }
3964
3887
  }
3965
3888
  if (geometry.isClosed) {
3966
- if (distance <= margin) {
3889
+ if (distance <= outerMargin || hitInside && distance <= 0 && distance > -innerMargin) {
3967
3890
  if (geometry.isFilled || isGroup && geometry.children[0].isFilled) {
3968
3891
  return inMarginClosestToEdgeHit || shape;
3969
3892
  } else {
3970
3893
  if (this.getShapePageBounds(shape).contains(viewportPageBounds)) continue;
3971
- if (Math.abs(distance) < margin) {
3894
+ if (hitInside ? (
3895
+ // On hitInside, the distance will be negative for hits inside
3896
+ // If the distance is positive, check against the outer margin
3897
+ distance > 0 && distance <= outerMargin || // If the distance is negative, check against the inner margin
3898
+ distance <= 0 && distance > -innerMargin
3899
+ ) : (
3900
+ // If hitInside is false, then sadly _we do not know_ whether the
3901
+ // point is inside or outside of the shape, so we check against
3902
+ // the max of the two margins
3903
+ Math.abs(distance) <= Math.max(innerMargin, outerMargin)
3904
+ )) {
3972
3905
  if (Math.abs(distance) < inMarginClosestToEdgeDistance) {
3973
3906
  inMarginClosestToEdgeDistance = Math.abs(distance);
3974
3907
  inMarginClosestToEdgeHit = shape;
@@ -4358,10 +4291,6 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
4358
4291
  }
4359
4292
  return shapeIds;
4360
4293
  }
4361
- /** @deprecated Use {@link Editor.getDraggingOverShape} instead */
4362
- getDroppingOverShape(point, droppingShapes) {
4363
- return this.getDraggingOverShape(point, droppingShapes);
4364
- }
4365
4294
  /**
4366
4295
  * Get the shape that some shapes should be dropped on at a given point.
4367
4296
  *
@@ -4733,7 +4662,16 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
4733
4662
  }
4734
4663
  this.createShapes(shapesToCreate);
4735
4664
  this.createBindings(bindingsToCreate);
4736
- this.setSelectedShapes((0, import_utils.compact)(ids.map((id) => shapeIds.get(id))));
4665
+ this.setSelectedShapes(
4666
+ (0, import_utils.compact)(
4667
+ ids.map((oldId) => {
4668
+ const newId = shapeIds.get(oldId);
4669
+ if (!newId) return null;
4670
+ if (!this.getShape(newId)) return null;
4671
+ return newId;
4672
+ })
4673
+ )
4674
+ );
4737
4675
  if (offset !== void 0) {
4738
4676
  const selectionPageBounds = this.getSelectionPageBounds();
4739
4677
  const viewportPageBounds = this.getViewportPageBounds();
@@ -5487,8 +5425,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
5487
5425
  const shapesMovingTogether = [shape];
5488
5426
  const boundsOfShapesMovingTogether = [shapePageBounds];
5489
5427
  if (!this.getShapeUtil(shape).canBeLaidOut?.(shape, {
5490
- type: "stretch",
5491
- shapes: shapesToStretchFirstPass
5428
+ type: "stretch"
5492
5429
  })) {
5493
5430
  continue;
5494
5431
  }
@@ -5813,21 +5750,24 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
5813
5750
  }
5814
5751
  if (!partial.parentId || !(this.store.has(partial.parentId) || shapes.some((p) => p.id === partial.parentId))) {
5815
5752
  let parentId = this.getFocusedGroupId();
5816
- for (let i = currentPageShapesSorted.length - 1; i >= 0; i--) {
5817
- const parent = currentPageShapesSorted[i];
5818
- const util = this.getShapeUtil(parent);
5819
- if (util.canReceiveNewChildrenOfType(parent, partial.type) && !this.isShapeHidden(parent) && this.isPointInShape(
5820
- parent,
5821
- // If no parent is provided, then we can treat the
5822
- // shape's provided x/y as being in the page's space.
5823
- { x: partial.x ?? 0, y: partial.y ?? 0 },
5824
- {
5825
- margin: 0,
5826
- hitInside: true
5753
+ const isPositioned = partial.x !== void 0 && partial.y !== void 0;
5754
+ if (isPositioned) {
5755
+ for (let i = currentPageShapesSorted.length - 1; i >= 0; i--) {
5756
+ const parent = currentPageShapesSorted[i];
5757
+ const util = this.getShapeUtil(parent);
5758
+ if (util.canReceiveNewChildrenOfType(parent, partial.type) && !this.isShapeHidden(parent) && this.isPointInShape(
5759
+ parent,
5760
+ // If no parent is provided, then we can treat the
5761
+ // shape's provided x/y as being in the page's space.
5762
+ { x: partial.x ?? 0, y: partial.y ?? 0 },
5763
+ {
5764
+ margin: 0,
5765
+ hitInside: true
5766
+ }
5767
+ )) {
5768
+ parentId = parent.id;
5769
+ break;
5827
5770
  }
5828
- )) {
5829
- parentId = parent.id;
5830
- break;
5831
5771
  }
5832
5772
  }
5833
5773
  const prevParentId = partial.parentId;
@@ -6498,16 +6438,20 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
6498
6438
  * Handle external content, such as files, urls, embeds, or plain text which has been put into the app, for example by pasting external text or dropping external images onto canvas.
6499
6439
  *
6500
6440
  * @param info - Info about the external content.
6441
+ * @param opts - Options for handling external content, including force flag to bypass readonly checks.
6501
6442
  */
6502
- async putExternalContent(info) {
6443
+ async putExternalContent(info, opts = {}) {
6444
+ if (!opts.force && this.getIsReadonly()) return;
6503
6445
  return this.externalContentHandlers[info.type]?.(info);
6504
6446
  }
6505
6447
  /**
6506
6448
  * Handle replacing external content.
6507
6449
  *
6508
6450
  * @param info - Info about the external content.
6451
+ * @param opts - Options for handling external content, including force flag to bypass readonly checks.
6509
6452
  */
6510
- async replaceExternalContent(info) {
6453
+ async replaceExternalContent(info, opts = {}) {
6454
+ if (!opts.force && this.getIsReadonly()) return;
6511
6455
  return this.externalContentHandlers[info.type]?.(info);
6512
6456
  }
6513
6457
  /**
@@ -6861,12 +6805,6 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
6861
6805
  height: result.height
6862
6806
  };
6863
6807
  }
6864
- /** @deprecated Use {@link Editor.getSvgString} or {@link Editor.getSvgElement} instead. */
6865
- async getSvg(shapes, opts = {}) {
6866
- const result = await this.getSvgElement(shapes, opts);
6867
- if (!result) return void 0;
6868
- return result.svg;
6869
- }
6870
6808
  /**
6871
6809
  * Get an exported image of the given shapes.
6872
6810
  *
@@ -6916,6 +6854,23 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
6916
6854
  }
6917
6855
  }
6918
6856
  }
6857
+ /**
6858
+ * Get an exported image of the given shapes as a data URL.
6859
+ *
6860
+ * @param shapes - The shapes (or shape ids) to export.
6861
+ * @param opts - Options for the export.
6862
+ *
6863
+ * @returns A data URL of the image.
6864
+ * @public
6865
+ */
6866
+ async toImageDataUrl(shapes, opts = {}) {
6867
+ const { blob, width, height } = await this.toImage(shapes, opts);
6868
+ return {
6869
+ url: await import_utils.FileHelpers.blobToDataUrl(blob),
6870
+ width,
6871
+ height
6872
+ };
6873
+ }
6919
6874
  /**
6920
6875
  * Update the input points from a pointer, pinch, or wheel event.
6921
6876
  *
@@ -7012,6 +6967,47 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7012
6967
  this.dispatch({ type: "misc", name: "complete" });
7013
6968
  return this;
7014
6969
  }
6970
+ /**
6971
+ * Dispatch a pointer move event in the current position of the pointer. This is useful when
6972
+ * external circumstances have changed (e.g. the camera moved or a shape was moved) and you want
6973
+ * the current interaction to respond to that change.
6974
+ *
6975
+ * @example
6976
+ * ```ts
6977
+ * editor.updatePointer()
6978
+ * ```
6979
+ *
6980
+ * @param options - The options for updating the pointer.
6981
+ * @returns The editor instance.
6982
+ * @public
6983
+ */
6984
+ updatePointer(options) {
6985
+ const event = {
6986
+ type: "pointer",
6987
+ target: "canvas",
6988
+ name: "pointer_move",
6989
+ point: options?.point ?? // weird but true: what `inputs` calls screen-space is actually viewport space. so
6990
+ // we need to convert back into true screen space first. we should fix this...
6991
+ import_Vec.Vec.Add(
6992
+ this.inputs.currentScreenPoint,
6993
+ this.store.unsafeGetWithoutCapture(import_tlschema.TLINSTANCE_ID).screenBounds
6994
+ ),
6995
+ pointerId: options?.pointerId ?? 0,
6996
+ button: options?.button ?? 0,
6997
+ isPen: options?.isPen ?? this.inputs.isPen,
6998
+ shiftKey: options?.shiftKey ?? this.inputs.shiftKey,
6999
+ altKey: options?.altKey ?? this.inputs.altKey,
7000
+ ctrlKey: options?.ctrlKey ?? this.inputs.ctrlKey,
7001
+ metaKey: options?.metaKey ?? this.inputs.metaKey,
7002
+ accelKey: options?.accelKey ?? (0, import_keyboard.isAccelKey)(this.inputs)
7003
+ };
7004
+ if (options?.immediate) {
7005
+ this._flushEventForTick(event);
7006
+ } else {
7007
+ this.dispatch(event);
7008
+ }
7009
+ return this;
7010
+ }
7015
7011
  /**
7016
7012
  * Puts the editor into focused mode.
7017
7013
  *
@@ -7789,8 +7785,6 @@ __decorateElement(_init, 1, "getCurrentTool", _getCurrentTool_dec, Editor);
7789
7785
  __decorateElement(_init, 1, "getCurrentToolId", _getCurrentToolId_dec, Editor);
7790
7786
  __decorateElement(_init, 1, "getDocumentSettings", _getDocumentSettings_dec, Editor);
7791
7787
  __decorateElement(_init, 1, "getInstanceState", _getInstanceState_dec, Editor);
7792
- __decorateElement(_init, 1, "getOpenMenus", _getOpenMenus_dec, Editor);
7793
- __decorateElement(_init, 1, "getIsMenuOpen", _getIsMenuOpen_dec, Editor);
7794
7788
  __decorateElement(_init, 1, "getPageStates", _getPageStates_dec, Editor);
7795
7789
  __decorateElement(_init, 1, "_getPageStatesQuery", __getPageStatesQuery_dec, Editor);
7796
7790
  __decorateElement(_init, 1, "getCurrentPageState", _getCurrentPageState_dec, Editor);