@tldraw/editor 4.6.0-next.fecc64eee134 → 5.0.1

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 (324) hide show
  1. package/dist-cjs/index.d.ts +493 -170
  2. package/dist-cjs/index.js +14 -23
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/TldrawEditor.js +3 -0
  5. package/dist-cjs/lib/TldrawEditor.js.map +2 -2
  6. package/dist-cjs/lib/components/MenuClickCapture.js +93 -47
  7. package/dist-cjs/lib/components/MenuClickCapture.js.map +2 -2
  8. package/dist-cjs/lib/components/default-components/CanvasOverlays.js +180 -0
  9. package/dist-cjs/lib/components/default-components/CanvasOverlays.js.map +7 -0
  10. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +46 -248
  11. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +3 -3
  12. package/dist-cjs/lib/editor/Editor.js +142 -33
  13. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  14. package/dist-cjs/lib/editor/assets/AssetUtil.js +1 -0
  15. package/dist-cjs/lib/editor/assets/AssetUtil.js.map +1 -1
  16. package/dist-cjs/lib/editor/bindings/BindingUtil.js +1 -0
  17. package/dist-cjs/lib/editor/bindings/BindingUtil.js.map +1 -1
  18. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js +1 -0
  19. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +1 -1
  20. package/dist-cjs/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.js +98 -0
  21. package/dist-cjs/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.js.map +7 -0
  22. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js +1 -0
  23. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +1 -1
  24. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js +1 -0
  25. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js.map +1 -1
  26. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js +2 -0
  27. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +1 -1
  28. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js +2 -0
  29. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js.map +1 -1
  30. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js +12 -0
  31. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js.map +2 -2
  32. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js +1 -0
  33. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js.map +1 -1
  34. package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js +1 -0
  35. package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js.map +1 -1
  36. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js +1 -0
  37. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js.map +1 -1
  38. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js +2 -1
  39. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js.map +2 -2
  40. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js +1 -0
  41. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js.map +1 -1
  42. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js +1 -0
  43. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +1 -1
  44. package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js +1 -0
  45. package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js.map +1 -1
  46. package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js +14 -0
  47. package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js.map +2 -2
  48. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js +1 -0
  49. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +1 -1
  50. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +2 -0
  51. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +1 -1
  52. package/dist-cjs/lib/editor/overlays/OverlayManager.js +154 -0
  53. package/dist-cjs/lib/editor/overlays/OverlayManager.js.map +7 -0
  54. package/dist-cjs/lib/editor/overlays/OverlayUtil.js +92 -0
  55. package/dist-cjs/lib/editor/overlays/OverlayUtil.js.map +7 -0
  56. package/dist-cjs/lib/editor/overlays/ShapeIndicatorOverlayUtil.js +161 -0
  57. package/dist-cjs/lib/editor/overlays/ShapeIndicatorOverlayUtil.js.map +7 -0
  58. package/dist-cjs/lib/editor/overlays/getOverlayDisplayValues.js +39 -0
  59. package/dist-cjs/lib/editor/overlays/getOverlayDisplayValues.js.map +7 -0
  60. package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js +79 -0
  61. package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js.map +7 -0
  62. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +36 -23
  63. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  64. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +32 -2
  65. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
  66. package/dist-cjs/lib/editor/tools/StateNode.js +1 -0
  67. package/dist-cjs/lib/editor/tools/StateNode.js.map +1 -1
  68. package/dist-cjs/lib/editor/types/event-types.js.map +2 -2
  69. package/dist-cjs/lib/exports/ExportDelay.js +1 -0
  70. package/dist-cjs/lib/exports/ExportDelay.js.map +1 -1
  71. package/dist-cjs/lib/exports/StyleEmbedder.js +1 -0
  72. package/dist-cjs/lib/exports/StyleEmbedder.js.map +1 -1
  73. package/dist-cjs/lib/exports/fetchCache.js +1 -1
  74. package/dist-cjs/lib/exports/fetchCache.js.map +2 -2
  75. package/dist-cjs/lib/exports/getSvgJsx.js +2 -1
  76. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  77. package/dist-cjs/lib/hooks/EditorComponentsContext.js.map +2 -2
  78. package/dist-cjs/lib/hooks/useCanvasEvents.js +25 -4
  79. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  80. package/dist-cjs/lib/hooks/useEditorComponents.js +0 -28
  81. package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
  82. package/dist-cjs/lib/hooks/usePeerIds.js +1 -36
  83. package/dist-cjs/lib/hooks/usePeerIds.js.map +2 -2
  84. package/dist-cjs/lib/hooks/useShapeCulling.js +2 -1
  85. package/dist-cjs/lib/hooks/useShapeCulling.js.map +2 -2
  86. package/dist-cjs/lib/options.js +1 -0
  87. package/dist-cjs/lib/options.js.map +2 -2
  88. package/dist-cjs/lib/primitives/Vec.js +3 -0
  89. package/dist-cjs/lib/primitives/Vec.js.map +1 -1
  90. package/dist-cjs/lib/primitives/geometry/Circle2d.js +1 -0
  91. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +1 -1
  92. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +1 -0
  93. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +1 -1
  94. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +2 -0
  95. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +1 -1
  96. package/dist-cjs/lib/primitives/geometry/Stadium2d.js +1 -0
  97. package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +1 -1
  98. package/dist-cjs/lib/utils/EditorAtom.js +2 -0
  99. package/dist-cjs/lib/utils/EditorAtom.js.map +1 -1
  100. package/dist-cjs/lib/utils/reparenting.js +20 -7
  101. package/dist-cjs/lib/utils/reparenting.js.map +2 -2
  102. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js +5 -0
  103. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js.map +2 -2
  104. package/dist-cjs/version.js +4 -4
  105. package/dist-cjs/version.js.map +1 -1
  106. package/dist-esm/index.d.mts +493 -170
  107. package/dist-esm/index.mjs +21 -41
  108. package/dist-esm/index.mjs.map +2 -2
  109. package/dist-esm/lib/TldrawEditor.mjs +3 -0
  110. package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
  111. package/dist-esm/lib/components/MenuClickCapture.mjs +94 -48
  112. package/dist-esm/lib/components/MenuClickCapture.mjs.map +2 -2
  113. package/dist-esm/lib/components/default-components/CanvasOverlays.mjs +160 -0
  114. package/dist-esm/lib/components/default-components/CanvasOverlays.mjs.map +7 -0
  115. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +47 -249
  116. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +3 -3
  117. package/dist-esm/lib/editor/Editor.mjs +143 -35
  118. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  119. package/dist-esm/lib/editor/assets/AssetUtil.mjs +1 -0
  120. package/dist-esm/lib/editor/assets/AssetUtil.mjs.map +1 -1
  121. package/dist-esm/lib/editor/bindings/BindingUtil.mjs +1 -0
  122. package/dist-esm/lib/editor/bindings/BindingUtil.mjs.map +1 -1
  123. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs +1 -0
  124. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +1 -1
  125. package/dist-esm/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.mjs +83 -0
  126. package/dist-esm/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.mjs.map +7 -0
  127. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs +1 -0
  128. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +1 -1
  129. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs +1 -0
  130. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs.map +1 -1
  131. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs +2 -0
  132. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +1 -1
  133. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs +2 -0
  134. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs.map +1 -1
  135. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs +12 -0
  136. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +2 -2
  137. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs +1 -0
  138. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs.map +1 -1
  139. package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs +1 -0
  140. package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs.map +1 -1
  141. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs +1 -0
  142. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs.map +1 -1
  143. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs +2 -1
  144. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs.map +2 -2
  145. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs +1 -0
  146. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs.map +1 -1
  147. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs +1 -0
  148. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +1 -1
  149. package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs +1 -0
  150. package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs.map +1 -1
  151. package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs +14 -0
  152. package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs.map +2 -2
  153. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs +1 -0
  154. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +1 -1
  155. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +2 -0
  156. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +1 -1
  157. package/dist-esm/lib/editor/overlays/OverlayManager.mjs +136 -0
  158. package/dist-esm/lib/editor/overlays/OverlayManager.mjs.map +7 -0
  159. package/dist-esm/lib/editor/overlays/OverlayUtil.mjs +72 -0
  160. package/dist-esm/lib/editor/overlays/OverlayUtil.mjs.map +7 -0
  161. package/dist-esm/lib/editor/overlays/ShapeIndicatorOverlayUtil.mjs +141 -0
  162. package/dist-esm/lib/editor/overlays/ShapeIndicatorOverlayUtil.mjs.map +7 -0
  163. package/dist-esm/lib/editor/overlays/getOverlayDisplayValues.mjs +19 -0
  164. package/dist-esm/lib/editor/overlays/getOverlayDisplayValues.mjs.map +7 -0
  165. package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs +59 -0
  166. package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs.map +7 -0
  167. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +36 -23
  168. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  169. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +32 -2
  170. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
  171. package/dist-esm/lib/editor/tools/StateNode.mjs +1 -0
  172. package/dist-esm/lib/editor/tools/StateNode.mjs.map +1 -1
  173. package/dist-esm/lib/editor/types/event-types.mjs.map +2 -2
  174. package/dist-esm/lib/exports/ExportDelay.mjs +1 -0
  175. package/dist-esm/lib/exports/ExportDelay.mjs.map +1 -1
  176. package/dist-esm/lib/exports/StyleEmbedder.mjs +1 -0
  177. package/dist-esm/lib/exports/StyleEmbedder.mjs.map +1 -1
  178. package/dist-esm/lib/exports/fetchCache.mjs +2 -2
  179. package/dist-esm/lib/exports/fetchCache.mjs.map +2 -2
  180. package/dist-esm/lib/exports/getSvgJsx.mjs +2 -1
  181. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  182. package/dist-esm/lib/hooks/EditorComponentsContext.mjs.map +2 -2
  183. package/dist-esm/lib/hooks/useCanvasEvents.mjs +25 -4
  184. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  185. package/dist-esm/lib/hooks/useEditorComponents.mjs +0 -28
  186. package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
  187. package/dist-esm/lib/hooks/usePeerIds.mjs +2 -40
  188. package/dist-esm/lib/hooks/usePeerIds.mjs.map +2 -2
  189. package/dist-esm/lib/hooks/useShapeCulling.mjs +2 -1
  190. package/dist-esm/lib/hooks/useShapeCulling.mjs.map +2 -2
  191. package/dist-esm/lib/options.mjs +1 -0
  192. package/dist-esm/lib/options.mjs.map +2 -2
  193. package/dist-esm/lib/primitives/Vec.mjs +3 -0
  194. package/dist-esm/lib/primitives/Vec.mjs.map +1 -1
  195. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +1 -0
  196. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +1 -1
  197. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +1 -0
  198. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +1 -1
  199. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +2 -0
  200. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +1 -1
  201. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs +1 -0
  202. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +1 -1
  203. package/dist-esm/lib/utils/EditorAtom.mjs +2 -0
  204. package/dist-esm/lib/utils/EditorAtom.mjs.map +1 -1
  205. package/dist-esm/lib/utils/reparenting.mjs +20 -7
  206. package/dist-esm/lib/utils/reparenting.mjs.map +2 -2
  207. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs +5 -0
  208. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs.map +2 -2
  209. package/dist-esm/version.mjs +4 -4
  210. package/dist-esm/version.mjs.map +1 -1
  211. package/editor.css +4 -243
  212. package/package.json +7 -7
  213. package/src/index.ts +18 -39
  214. package/src/lib/TldrawEditor.tsx +9 -0
  215. package/src/lib/components/MenuClickCapture.tsx +124 -64
  216. package/src/lib/components/default-components/CanvasOverlays.tsx +208 -0
  217. package/src/lib/components/default-components/DefaultCanvas.tsx +51 -322
  218. package/src/lib/editor/Editor.test.ts +3 -1
  219. package/src/lib/editor/Editor.ts +167 -38
  220. package/src/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.ts +98 -0
  221. package/src/lib/editor/managers/InputsManager/InputsManager.ts +12 -0
  222. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +13 -2
  223. package/src/lib/editor/managers/SnapManager/SnapManager.ts +1 -1
  224. package/src/lib/editor/managers/ThemeManager/defaultThemes.ts +14 -0
  225. package/src/lib/editor/overlays/OverlayManager.ts +183 -0
  226. package/src/lib/editor/overlays/OverlayUtil.ts +143 -0
  227. package/src/lib/editor/overlays/ShapeIndicatorOverlayUtil.ts +216 -0
  228. package/src/lib/editor/overlays/getOverlayDisplayValues.ts +51 -0
  229. package/src/lib/editor/shapes/BaseFrameLikeShapeUtil.tsx +128 -0
  230. package/src/lib/editor/shapes/ShapeUtil.ts +45 -26
  231. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +40 -3
  232. package/src/lib/editor/types/event-types.ts +2 -0
  233. package/src/lib/exports/fetchCache.ts +2 -4
  234. package/src/lib/exports/getSvgJsx.test.ts +3 -1
  235. package/src/lib/exports/getSvgJsx.tsx +2 -1
  236. package/src/lib/hooks/EditorComponentsContext.tsx +0 -27
  237. package/src/lib/hooks/useCanvasEvents.ts +45 -3
  238. package/src/lib/hooks/useEditorComponents.tsx +0 -28
  239. package/src/lib/hooks/usePeerIds.ts +6 -55
  240. package/src/lib/hooks/useShapeCulling.tsx +3 -1
  241. package/src/lib/options.ts +7 -0
  242. package/src/lib/utils/reparenting.ts +22 -9
  243. package/src/lib/utils/sync/TLLocalSyncClient.ts +3 -0
  244. package/src/version.ts +4 -4
  245. package/dist-cjs/lib/components/GeometryDebuggingView.js +0 -115
  246. package/dist-cjs/lib/components/GeometryDebuggingView.js.map +0 -7
  247. package/dist-cjs/lib/components/LiveCollaborators.js +0 -151
  248. package/dist-cjs/lib/components/LiveCollaborators.js.map +0 -7
  249. package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js +0 -227
  250. package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js.map +0 -7
  251. package/dist-cjs/lib/components/default-components/DefaultBrush.js +0 -38
  252. package/dist-cjs/lib/components/default-components/DefaultBrush.js.map +0 -7
  253. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js +0 -71
  254. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js.map +0 -7
  255. package/dist-cjs/lib/components/default-components/DefaultCursor.js +0 -59
  256. package/dist-cjs/lib/components/default-components/DefaultCursor.js.map +0 -7
  257. package/dist-cjs/lib/components/default-components/DefaultHandle.js +0 -56
  258. package/dist-cjs/lib/components/default-components/DefaultHandle.js.map +0 -7
  259. package/dist-cjs/lib/components/default-components/DefaultHandles.js +0 -28
  260. package/dist-cjs/lib/components/default-components/DefaultHandles.js.map +0 -7
  261. package/dist-cjs/lib/components/default-components/DefaultScribble.js +0 -51
  262. package/dist-cjs/lib/components/default-components/DefaultScribble.js.map +0 -7
  263. package/dist-cjs/lib/components/default-components/DefaultSelectionForeground.js +0 -69
  264. package/dist-cjs/lib/components/default-components/DefaultSelectionForeground.js.map +0 -7
  265. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +0 -107
  266. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +0 -7
  267. package/dist-cjs/lib/components/default-components/DefaultShapeIndicatorErrorFallback.js +0 -28
  268. package/dist-cjs/lib/components/default-components/DefaultShapeIndicatorErrorFallback.js.map +0 -7
  269. package/dist-cjs/lib/components/default-components/DefaultShapeIndicators.js +0 -101
  270. package/dist-cjs/lib/components/default-components/DefaultShapeIndicators.js.map +0 -7
  271. package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js +0 -170
  272. package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js.map +0 -7
  273. package/dist-cjs/lib/hooks/useHandleEvents.js +0 -100
  274. package/dist-cjs/lib/hooks/useHandleEvents.js.map +0 -7
  275. package/dist-cjs/lib/hooks/useSelectionEvents.js +0 -98
  276. package/dist-cjs/lib/hooks/useSelectionEvents.js.map +0 -7
  277. package/dist-esm/lib/components/GeometryDebuggingView.mjs +0 -95
  278. package/dist-esm/lib/components/GeometryDebuggingView.mjs.map +0 -7
  279. package/dist-esm/lib/components/LiveCollaborators.mjs +0 -134
  280. package/dist-esm/lib/components/LiveCollaborators.mjs.map +0 -7
  281. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs +0 -207
  282. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs.map +0 -7
  283. package/dist-esm/lib/components/default-components/DefaultBrush.mjs +0 -18
  284. package/dist-esm/lib/components/default-components/DefaultBrush.mjs.map +0 -7
  285. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs +0 -41
  286. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs.map +0 -7
  287. package/dist-esm/lib/components/default-components/DefaultCursor.mjs +0 -29
  288. package/dist-esm/lib/components/default-components/DefaultCursor.mjs.map +0 -7
  289. package/dist-esm/lib/components/default-components/DefaultHandle.mjs +0 -26
  290. package/dist-esm/lib/components/default-components/DefaultHandle.mjs.map +0 -7
  291. package/dist-esm/lib/components/default-components/DefaultHandles.mjs +0 -8
  292. package/dist-esm/lib/components/default-components/DefaultHandles.mjs.map +0 -7
  293. package/dist-esm/lib/components/default-components/DefaultScribble.mjs +0 -21
  294. package/dist-esm/lib/components/default-components/DefaultScribble.mjs.map +0 -7
  295. package/dist-esm/lib/components/default-components/DefaultSelectionForeground.mjs +0 -39
  296. package/dist-esm/lib/components/default-components/DefaultSelectionForeground.mjs.map +0 -7
  297. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +0 -77
  298. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +0 -7
  299. package/dist-esm/lib/components/default-components/DefaultShapeIndicatorErrorFallback.mjs +0 -8
  300. package/dist-esm/lib/components/default-components/DefaultShapeIndicatorErrorFallback.mjs.map +0 -7
  301. package/dist-esm/lib/components/default-components/DefaultShapeIndicators.mjs +0 -81
  302. package/dist-esm/lib/components/default-components/DefaultShapeIndicators.mjs.map +0 -7
  303. package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs +0 -142
  304. package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs.map +0 -7
  305. package/dist-esm/lib/hooks/useHandleEvents.mjs +0 -70
  306. package/dist-esm/lib/hooks/useHandleEvents.mjs.map +0 -7
  307. package/dist-esm/lib/hooks/useSelectionEvents.mjs +0 -78
  308. package/dist-esm/lib/hooks/useSelectionEvents.mjs.map +0 -7
  309. package/src/lib/components/GeometryDebuggingView.tsx +0 -108
  310. package/src/lib/components/LiveCollaborators.tsx +0 -174
  311. package/src/lib/components/default-components/CanvasShapeIndicators.tsx +0 -289
  312. package/src/lib/components/default-components/DefaultBrush.tsx +0 -35
  313. package/src/lib/components/default-components/DefaultCollaboratorHint.tsx +0 -52
  314. package/src/lib/components/default-components/DefaultCursor.tsx +0 -59
  315. package/src/lib/components/default-components/DefaultHandle.tsx +0 -42
  316. package/src/lib/components/default-components/DefaultHandles.tsx +0 -15
  317. package/src/lib/components/default-components/DefaultScribble.tsx +0 -31
  318. package/src/lib/components/default-components/DefaultSelectionForeground.tsx +0 -50
  319. package/src/lib/components/default-components/DefaultShapeIndicator.tsx +0 -104
  320. package/src/lib/components/default-components/DefaultShapeIndicatorErrorFallback.tsx +0 -9
  321. package/src/lib/components/default-components/DefaultShapeIndicators.tsx +0 -116
  322. package/src/lib/components/default-components/DefaultSnapIndictor.tsx +0 -174
  323. package/src/lib/hooks/useHandleEvents.ts +0 -88
  324. package/src/lib/hooks/useSelectionEvents.ts +0 -97
@@ -1,8 +1,10 @@
1
1
  import { useValue } from '@tldraw/state-react'
2
- import { PointerEvent, useCallback, useRef, useState } from 'react'
2
+ import { type PointerEvent, useCallback, useEffect, useRef, useState } from 'react'
3
+ import { flushSync } from 'react-dom'
3
4
  import { useCanvasEvents } from '../hooks/useCanvasEvents'
4
5
  import { useEditor } from '../hooks/useEditor'
5
6
  import { Vec } from '../primitives/Vec'
7
+ import { releasePointerCapture, setPointerCapture } from '../utils/dom'
6
8
  import { getPointerInfo } from '../utils/getPointerInfo'
7
9
 
8
10
  /**
@@ -13,115 +15,173 @@ import { getPointerInfo } from '../utils/getPointerInfo'
13
15
  export function MenuClickCapture() {
14
16
  const editor = useEditor()
15
17
 
16
- // Whether any menus are open
17
18
  const isMenuOpen = useValue('is menu open', () => editor.menus.hasAnyOpenMenus(), [editor])
18
19
 
19
- // Whether we're pointing or not—keep this component visible if we're pointing
20
+ // Keep this component mounted while the pointer is down so pointerup/move still
21
+ // land here after a synchronous clearOpenMenus() flips isMenuOpen to false.
20
22
  const [isPointing, setIsPointing] = useState(false)
21
-
22
23
  const showElement = isMenuOpen || isPointing
23
24
 
24
- // Get the same events that we use on the canvas
25
25
  const canvasEvents = useCanvasEvents()
26
26
 
27
- // Keep track of the pointer state
28
27
  const rPointerState = useRef({
29
28
  isDown: false,
30
29
  isDragging: false,
30
+ button: 0,
31
31
  start: new Vec(),
32
32
  })
33
33
 
34
+ // Swallow the native contextmenu that follows a right-click pointerdown. Without
35
+ // this, Radix's trigger catches the native event and opens a menu at the pointer-
36
+ // DOWN position — then our own synthetic contextmenu (fired on pointerup) opens it
37
+ // again at the release position, producing a visible flash.
38
+ const rCancelContextMenuSwallow = useRef<null | (() => void)>(null)
39
+ useEffect(
40
+ () => () => {
41
+ rCancelContextMenuSwallow.current?.()
42
+ rCancelContextMenuSwallow.current = null
43
+ },
44
+ []
45
+ )
46
+ const swallowNextNativeContextMenu = useCallback(() => {
47
+ rCancelContextMenuSwallow.current?.()
48
+ const doc = editor.getContainerDocument()
49
+ const onContextMenu = (event: MouseEvent) => {
50
+ // Skip our own synthetic contextmenu — only swallow the real browser one
51
+ if (!event.isTrusted) return
52
+ rCancelContextMenuSwallow.current?.()
53
+ rCancelContextMenuSwallow.current = null
54
+ event.preventDefault()
55
+ event.stopImmediatePropagation()
56
+ }
57
+ const cancel = () => doc.removeEventListener('contextmenu', onContextMenu, true)
58
+ rCancelContextMenuSwallow.current = cancel
59
+ doc.addEventListener('contextmenu', onContextMenu, true)
60
+ // Drop the listener on the next tick if it never fires (e.g. pointer moved off-screen)
61
+ doc.defaultView?.setTimeout(() => {
62
+ if (rCancelContextMenuSwallow.current === cancel) {
63
+ cancel()
64
+ rCancelContextMenuSwallow.current = null
65
+ }
66
+ }, 0)
67
+ }, [editor])
68
+
34
69
  const handlePointerDown = useCallback(
35
70
  (e: PointerEvent) => {
36
- if (e.button === 0) {
37
- setIsPointing(true)
38
- rPointerState.current = {
39
- isDown: true,
40
- isDragging: false,
41
- start: new Vec(e.clientX, e.clientY),
42
- }
43
- rDidAPointerDownAndDragWhileMenuWasOpen.current = false
71
+ if (e.button !== 0 && e.button !== 2) return
72
+
73
+ flushSync(() => setIsPointing(true))
74
+ setPointerCapture(e.currentTarget, e)
75
+ rPointerState.current = {
76
+ isDown: true,
77
+ isDragging: false,
78
+ button: e.button,
79
+ start: new Vec(e.clientX, e.clientY),
44
80
  }
81
+
45
82
  if (e.button === 2) {
46
- // Swallow the contextmenu event that follows this right-click pointerdown.
47
- // clearOpenMenus() below triggers a synchronous render that unmounts this
48
- // component, so our React onContextMenu handler won't be around to catch it.
49
- // Without this, the contextmenu event reaches the Radix Trigger and briefly
50
- // opens a new context menu (which then immediately dismisses — causing a flash).
51
- const ownerDocument = editor.getContainerDocument()
52
- ownerDocument.addEventListener(
53
- 'contextmenu',
54
- (event) => {
55
- event.preventDefault()
56
- event.stopImmediatePropagation()
57
- },
58
- { capture: true, once: true }
59
- )
83
+ if (!editor.options.rightClickPanning) {
84
+ // Right-click panning off: close the open menu and swallow the native
85
+ // contextmenu that would otherwise briefly open a new one (causing a flash).
86
+ swallowNextNativeContextMenu()
87
+ editor.menus.clearOpenMenus()
88
+ return
89
+ }
90
+ // Forward right-click pointerdown through the canvas's own handler so
91
+ // pointer capture is also set on the canvas (load-bearing: without this
92
+ // the context menu briefly flashes closed during consecutive right-clicks).
93
+ // We don't clearOpenMenus() — Radix's DismissableLayer closes the menu
94
+ // via outside-click detection, keeping its internal state in sync.
95
+ const canvas =
96
+ editor.getContainer().querySelector<HTMLDivElement>('.tl-canvas') ?? e.currentTarget
97
+ canvasEvents.onPointerDown?.({ ...e, currentTarget: canvas })
98
+ swallowNextNativeContextMenu()
99
+ return
60
100
  }
101
+
61
102
  editor.menus.clearOpenMenus()
62
103
  },
63
- [editor]
104
+ [canvasEvents, editor, swallowNextNativeContextMenu]
64
105
  )
65
106
 
66
- const rDidAPointerDownAndDragWhileMenuWasOpen = useRef(false)
67
-
68
107
  const handlePointerMove = useCallback(
69
108
  (e: PointerEvent) => {
70
- // Do nothing unless we're pointing
71
- if (!rPointerState.current.isDown) return
109
+ const state = rPointerState.current
110
+ if (!state.isDown) return
72
111
 
73
- // call the onPointerDown with the original pointer position
74
- const { x, y } = rPointerState.current.start
75
-
76
- if (!rDidAPointerDownAndDragWhileMenuWasOpen.current) {
112
+ // Left-click: wait for the drag threshold before forwarding anything, then
113
+ // replay pointerdown at the original start so the editor records the
114
+ // correct drag origin. Right-click forwards moves immediately (pointerdown
115
+ // was already dispatched in handlePointerDown).
116
+ if (state.button !== 2 && !state.isDragging) {
77
117
  if (
78
- // We're pointing, but are we dragging?
79
- Vec.Dist2(rPointerState.current.start, new Vec(e.clientX, e.clientY)) >
118
+ Vec.Dist2(state.start, new Vec(e.clientX, e.clientY)) <=
80
119
  editor.options.dragDistanceSquared
81
120
  ) {
82
- rDidAPointerDownAndDragWhileMenuWasOpen.current = true
83
- // Wehaddaeventitsadrag
84
- rPointerState.current = {
85
- ...rPointerState.current,
86
- isDown: true,
87
- isDragging: true,
88
- }
89
- canvasEvents.onPointerDown?.({
90
- ...e,
91
- clientX: x,
92
- clientY: y,
93
- button: 0,
94
- })
121
+ return
95
122
  }
96
- }
97
-
98
- if (rDidAPointerDownAndDragWhileMenuWasOpen.current) {
123
+ state.isDragging = true
99
124
  editor.dispatch({
100
125
  type: 'pointer',
101
126
  target: 'canvas',
102
- name: 'pointer_move',
103
- ...getPointerInfo(editor, e),
127
+ name: 'pointer_down',
128
+ ...getPointerInfo(editor, { ...e, clientX: state.start.x, clientY: state.start.y }),
104
129
  })
105
130
  }
131
+
132
+ editor.dispatch({
133
+ type: 'pointer',
134
+ target: 'canvas',
135
+ name: 'pointer_move',
136
+ ...getPointerInfo(editor, e),
137
+ })
106
138
  },
107
- [canvasEvents, editor]
139
+ [editor]
108
140
  )
109
141
 
110
142
  const handlePointerUp = useCallback(
111
143
  (e: PointerEvent) => {
112
- // Run the pointer up
113
- canvasEvents.onPointerUp?.(e)
114
- // Then turn off pointing
144
+ const isStaticRightClick = e.button === 2 && !rPointerState.current.isDragging
145
+
146
+ editor.dispatch({
147
+ type: 'pointer',
148
+ target: 'canvas',
149
+ name: 'pointer_up',
150
+ ...getPointerInfo(editor, e),
151
+ })
152
+
153
+ if (isStaticRightClick && editor.options.rightClickPanning) {
154
+ // Dispatch contextmenu on the canvas's parent (Radix's trigger) so the
155
+ // menu opens at the release position. Bypassing the canvas avoids its
156
+ // own onContextMenu handler, which preventDefaults non-synthesized events.
157
+ const canvas = editor.getContainer().querySelector<HTMLDivElement>('.tl-canvas')
158
+ const trigger = canvas?.parentElement ?? e.currentTarget
159
+ editor.timers.requestAnimationFrame(() => {
160
+ trigger.dispatchEvent(
161
+ new PointerEvent('contextmenu', {
162
+ bubbles: true,
163
+ clientX: e.clientX,
164
+ clientY: e.clientY,
165
+ button: 2,
166
+ buttons: 0,
167
+ pointerId: e.pointerId,
168
+ pointerType: e.pointerType,
169
+ isPrimary: e.isPrimary,
170
+ })
171
+ )
172
+ })
173
+ }
174
+
175
+ releasePointerCapture(e.currentTarget, e)
115
176
  setIsPointing(false)
116
- // Reset the pointer state
117
177
  rPointerState.current = {
118
178
  isDown: false,
119
179
  isDragging: false,
180
+ button: 0,
120
181
  start: new Vec(e.clientX, e.clientY),
121
182
  }
122
- rDidAPointerDownAndDragWhileMenuWasOpen.current = false
123
183
  },
124
- [canvasEvents]
184
+ [editor]
125
185
  )
126
186
 
127
187
  return (
@@ -0,0 +1,208 @@
1
+ import { EffectScheduler, computed } from '@tldraw/state'
2
+ import { memo, useEffect, useRef } from 'react'
3
+ import { useEditor } from '../../hooks/useEditor'
4
+ import { Geometry2d } from '../../primitives/geometry/Geometry2d'
5
+ import { Group2d } from '../../primitives/geometry/Group2d'
6
+ import { debugFlags } from '../../utils/debug-flags'
7
+
8
+ interface RenderInputs {
9
+ dpr: number
10
+ w: number
11
+ h: number
12
+ cx: number
13
+ cy: number
14
+ zoom: number
15
+ }
16
+
17
+ /** @internal @react */
18
+ export const CanvasOverlays = memo(function CanvasOverlays() {
19
+ const editor = useEditor()
20
+ const canvasRef = useRef<HTMLCanvasElement>(null)
21
+
22
+ useEffect(() => {
23
+ // Bundle the primitive scalars the renderer needs into one computed so the
24
+ // effect only refires on actual visual change. Reading the whole instance
25
+ // state directly would otherwise wake the renderer on every cursor move,
26
+ // brush update, etc.
27
+
28
+ const renderInputs$ = computed<RenderInputs>(
29
+ 'canvas overlays render inputs',
30
+ () => {
31
+ const instance = editor.getInstanceState()
32
+ const camera = editor.getCamera()
33
+ return {
34
+ dpr: instance.devicePixelRatio,
35
+ w: instance.screenBounds.w,
36
+ h: instance.screenBounds.h,
37
+ cx: camera.x,
38
+ cy: camera.y,
39
+ zoom: camera.z,
40
+ }
41
+ },
42
+ {
43
+ isEqual: (a, b) =>
44
+ a.dpr === b.dpr &&
45
+ a.w === b.w &&
46
+ a.h === b.h &&
47
+ a.cx === b.cx &&
48
+ a.cy === b.cy &&
49
+ a.zoom === b.zoom,
50
+ }
51
+ )
52
+
53
+ const scheduler = new EffectScheduler('canvas overlays render', () => {
54
+ const canvas = canvasRef.current
55
+ if (!canvas) return
56
+
57
+ const ctx = canvas.getContext('2d')
58
+ if (!ctx) return
59
+
60
+ const { dpr, w, h, cx, cy, zoom } = renderInputs$.get()
61
+
62
+ const canvasWidth = Math.ceil(w * dpr)
63
+ const canvasHeight = Math.ceil(h * dpr)
64
+
65
+ if (canvas.width !== canvasWidth || canvas.height !== canvasHeight) {
66
+ canvas.width = canvasWidth
67
+ canvas.height = canvasHeight
68
+ canvas.style.width = `${w}px`
69
+ canvas.style.height = `${h}px`
70
+ }
71
+
72
+ ctx.setTransform(1, 0, 0, 1, 0, 0)
73
+ ctx.clearRect(0, 0, canvas.width, canvas.height)
74
+
75
+ // One setTransform = DPR scale * zoom scale * camera translate, into page space.
76
+ const s = dpr * zoom
77
+ ctx.setTransform(s, 0, 0, s, s * cx, s * cy)
78
+
79
+ // Render all active overlay utils in zIndex order (low to high).
80
+ for (const { util, overlays } of editor.overlays.getActiveOverlayEntries()) {
81
+ ctx.save()
82
+ util.render(ctx, overlays)
83
+ ctx.restore()
84
+ }
85
+
86
+ // Debug: draw all geometry
87
+ if (debugFlags.debugGeometry.get()) {
88
+ const currentPagePoint = editor.inputs.getCurrentPagePoint()
89
+
90
+ // Shape geometries
91
+ const renderingShapes = editor.getRenderingShapes()
92
+ for (const result of renderingShapes) {
93
+ const shape = editor.getShape(result.id)
94
+ if (!shape || shape.type === 'group') continue
95
+
96
+ const geometry = editor.getShapeGeometry(shape)
97
+ const pageTransform = editor.getShapePageTransform(shape)
98
+ if (!pageTransform) continue
99
+
100
+ ctx.save()
101
+ const m = pageTransform
102
+ ctx.transform(m.a, m.b, m.c, m.d, m.e, m.f)
103
+
104
+ // Outline
105
+ ctx.strokeStyle = geometry.debugColor ?? 'red'
106
+ ctx.lineWidth = 2 / zoom
107
+ ctx.fillStyle = 'none'
108
+ drawGeometryStroke(ctx, geometry)
109
+
110
+ // Vertices
111
+ const { vertices } = geometry
112
+ for (let i = 0; i < vertices.length; i++) {
113
+ const v = vertices[i]
114
+ const hue = vertices.length > 1 ? 120 + ((200 - 120) * i) / (vertices.length - 1) : 160
115
+ ctx.fillStyle = `hsl(${hue}, 100%, 50%)`
116
+ ctx.strokeStyle = 'black'
117
+ ctx.lineWidth = 1 / zoom
118
+ ctx.beginPath()
119
+ ctx.arc(v.x, v.y, 2 / zoom, 0, Math.PI * 2)
120
+ ctx.fill()
121
+ ctx.stroke()
122
+ }
123
+
124
+ // Nearest point line
125
+ const pointInShapeSpace = editor.getPointInShapeSpace(shape, currentPagePoint)
126
+ const dist = Math.abs(geometry.distanceToPoint(pointInShapeSpace, true)) * zoom
127
+ if (dist < 150) {
128
+ const nearestPoint = geometry.nearestPoint(pointInShapeSpace)
129
+ const hitInside = geometry.distanceToPoint(pointInShapeSpace, true) < 0
130
+ ctx.strokeStyle = hitInside ? 'goldenrod' : 'dodgerblue'
131
+ ctx.lineWidth = 2 / zoom
132
+ ctx.globalAlpha = 1 - dist / 150
133
+ ctx.beginPath()
134
+ ctx.moveTo(nearestPoint.x, nearestPoint.y)
135
+ ctx.lineTo(pointInShapeSpace.x, pointInShapeSpace.y)
136
+ ctx.stroke()
137
+ ctx.globalAlpha = 1
138
+ }
139
+
140
+ ctx.restore()
141
+ }
142
+
143
+ // Overlay hit-test geometries
144
+ ctx.save()
145
+ ctx.strokeStyle = 'magenta'
146
+ ctx.fillStyle = 'rgba(255, 0, 255, 0.1)'
147
+ ctx.lineWidth = 1 / zoom
148
+ for (const { overlays } of editor.overlays.getActiveOverlayEntries()) {
149
+ for (const overlay of overlays) {
150
+ const geometry = editor.overlays.getOverlayGeometry(overlay)
151
+ if (!geometry) continue
152
+ const vertices = geometry.vertices
153
+ if (vertices.length < 2) continue
154
+ ctx.beginPath()
155
+ ctx.moveTo(vertices[0].x, vertices[0].y)
156
+ for (let i = 1; i < vertices.length; i++) {
157
+ ctx.lineTo(vertices[i].x, vertices[i].y)
158
+ }
159
+ if (geometry.isClosed) {
160
+ ctx.closePath()
161
+ ctx.fill()
162
+ }
163
+ ctx.stroke()
164
+ for (const v of vertices) {
165
+ ctx.beginPath()
166
+ ctx.arc(v.x, v.y, 2 / zoom, 0, Math.PI * 2)
167
+ ctx.fill()
168
+ }
169
+ }
170
+ }
171
+ ctx.restore()
172
+ }
173
+ })
174
+
175
+ scheduler.attach()
176
+ scheduler.execute()
177
+ return () => scheduler.detach()
178
+ }, [editor])
179
+
180
+ return <canvas ref={canvasRef} className="tl-canvas-overlays" />
181
+ })
182
+
183
+ function drawGeometryStroke(ctx: CanvasRenderingContext2D, geometry: Geometry2d) {
184
+ if (geometry instanceof Group2d) {
185
+ const prevStroke = ctx.strokeStyle
186
+ for (const child of geometry.children) {
187
+ if (child.debugColor) ctx.strokeStyle = child.debugColor
188
+ drawGeometryStroke(ctx, child)
189
+ ctx.strokeStyle = prevStroke
190
+ }
191
+ for (const child of geometry.ignoredChildren) {
192
+ if (child.debugColor) ctx.strokeStyle = child.debugColor
193
+ drawGeometryStroke(ctx, child)
194
+ ctx.strokeStyle = prevStroke
195
+ }
196
+ return
197
+ }
198
+
199
+ const vertices = geometry.vertices
200
+ if (vertices.length < 2) return
201
+ ctx.beginPath()
202
+ ctx.moveTo(vertices[0].x, vertices[0].y)
203
+ for (let i = 1; i < vertices.length; i++) {
204
+ ctx.lineTo(vertices[i].x, vertices[i].y)
205
+ }
206
+ if (geometry.isClosed) ctx.closePath()
207
+ ctx.stroke()
208
+ }