@tldraw/editor 4.6.0-next.fecc64eee134 → 5.0.0

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,59 +0,0 @@
1
- import { VecModel } from '@tldraw/tlschema'
2
- import classNames from 'classnames'
3
- import { memo, useRef } from 'react'
4
- import { useSharedSafeId } from '../../hooks/useSafeId'
5
- import { useTransform } from '../../hooks/useTransform'
6
-
7
- /** @public */
8
- export interface TLCursorProps {
9
- userId: string
10
- className?: string
11
- point: VecModel | null
12
- zoom: number
13
- color?: string
14
- name: string | null
15
- chatMessage: string
16
- }
17
-
18
- /** @public @react */
19
- export const DefaultCursor = memo(function DefaultCursor({
20
- className,
21
- zoom,
22
- point,
23
- color,
24
- name,
25
- chatMessage,
26
- }: TLCursorProps) {
27
- const rCursor = useRef<HTMLDivElement>(null)
28
- useTransform(rCursor, point?.x, point?.y, 1 / zoom)
29
-
30
- const cursorId = useSharedSafeId('cursor')
31
-
32
- if (!point) return null
33
-
34
- return (
35
- <div ref={rCursor} className={classNames('tl-overlays__item', className)}>
36
- <svg className="tl-cursor" aria-hidden="true">
37
- <use href={`#${cursorId}`} color={color} />
38
- </svg>
39
- {chatMessage ? (
40
- <>
41
- {name && (
42
- <div className="tl-nametag-title" style={{ color }}>
43
- {name}
44
- </div>
45
- )}
46
- <div className="tl-nametag-chat" style={{ backgroundColor: color }}>
47
- {chatMessage}
48
- </div>
49
- </>
50
- ) : (
51
- name && (
52
- <div className="tl-nametag" style={{ backgroundColor: color }}>
53
- {name}
54
- </div>
55
- )
56
- )}
57
- </div>
58
- )
59
- })
@@ -1,42 +0,0 @@
1
- import { TLHandle, TLShapeId } from '@tldraw/tlschema'
2
- import classNames from 'classnames'
3
- import { SIDES } from '../../constants'
4
- import { useEditor } from '../../hooks/useEditor'
5
-
6
- /** @public */
7
- export interface TLHandleProps {
8
- shapeId: TLShapeId
9
- handle: TLHandle
10
- zoom: number
11
- isCoarse: boolean
12
- className?: string
13
- }
14
-
15
- /** @public @react */
16
- export function DefaultHandle({ handle, isCoarse, className, zoom }: TLHandleProps) {
17
- const editor = useEditor()
18
- const br = (isCoarse ? editor.options.coarseHandleRadius : editor.options.handleRadius) / zoom
19
-
20
- if (handle.type === 'clone') {
21
- // bouba
22
- const fr = 3 / zoom
23
- const path = `M0,${-fr} A${fr},${fr} 0 0,1 0,${fr}`
24
-
25
- const index = SIDES.indexOf(handle.id as (typeof SIDES)[number])
26
- return (
27
- <g className={classNames(`tl-handle tl-handle__${handle.type}`, className)}>
28
- <circle className="tl-handle__bg" r={br} />
29
- {/* Half circle */}
30
- <path className="tl-handle__fg" d={path} transform={`rotate(${-90 + 90 * index})`} />
31
- </g>
32
- )
33
- }
34
-
35
- const fr = (handle.type === 'create' && isCoarse ? 3 : 4) / Math.max(zoom, 0.25)
36
- return (
37
- <g className={classNames(`tl-handle tl-handle__${handle.type}`, className)}>
38
- <circle className="tl-handle__bg" r={br} />
39
- <circle className="tl-handle__fg" r={fr} />
40
- </g>
41
- )
42
- }
@@ -1,15 +0,0 @@
1
- import { ReactNode } from 'react'
2
-
3
- /** @public */
4
- export interface TLHandlesProps {
5
- children: ReactNode
6
- }
7
-
8
- /** @public @react */
9
- export const DefaultHandles = ({ children }: TLHandlesProps) => {
10
- return (
11
- <svg className="tl-user-handles tl-overlays__item" aria-hidden="true">
12
- {children}
13
- </svg>
14
- )
15
- }
@@ -1,31 +0,0 @@
1
- import { TLScribble } from '@tldraw/tlschema'
2
- import classNames from 'classnames'
3
- import { getSvgPathFromPoints } from '../../utils/getSvgPathFromPoints'
4
-
5
- /** @public */
6
- export interface TLScribbleProps {
7
- userId?: string
8
- scribble: TLScribble
9
- zoom: number
10
- color?: string
11
- opacity?: number
12
- className?: string
13
- }
14
-
15
- /** @public @react */
16
- export function DefaultScribble({ scribble, zoom, color, opacity, className }: TLScribbleProps) {
17
- if (!scribble.points.length) return null
18
-
19
- return (
20
- <svg className={className ? classNames('tl-overlays__item', className) : className}>
21
- <path
22
- className="tl-scribble"
23
- d={getSvgPathFromPoints(scribble.points, false)}
24
- stroke={color ?? `var(--tl-color-${scribble.color})`}
25
- fill="none"
26
- strokeWidth={8 / zoom}
27
- opacity={opacity ?? scribble.opacity}
28
- />
29
- </svg>
30
- )
31
- }
@@ -1,50 +0,0 @@
1
- import { useValue } from '@tldraw/state-react'
2
- import classNames from 'classnames'
3
- import { useRef } from 'react'
4
- import { useEditor } from '../../hooks/useEditor'
5
- import { useTransform } from '../../hooks/useTransform'
6
- import { Box } from '../../primitives/Box'
7
- import { toDomPrecision } from '../../primitives/utils'
8
-
9
- /** @public */
10
- export interface TLSelectionForegroundProps {
11
- bounds: Box
12
- rotation: number
13
- }
14
-
15
- /** @public @react */
16
- export function DefaultSelectionForeground({ bounds, rotation }: TLSelectionForegroundProps) {
17
- const editor = useEditor()
18
- const rSvg = useRef<SVGSVGElement>(null)
19
-
20
- const onlyShape = useValue('only selected shape', () => editor.getOnlySelectedShape(), [editor])
21
-
22
- // if all shapes have an expandBy for the selection outline, we can expand by the l
23
- const expandOutlineBy = onlyShape
24
- ? editor.getShapeUtil(onlyShape).expandSelectionOutlinePx(onlyShape)
25
- : 0
26
-
27
- useTransform(rSvg, bounds?.x, bounds?.y, 1, rotation, {
28
- x: -expandOutlineBy,
29
- y: -expandOutlineBy,
30
- })
31
-
32
- bounds =
33
- expandOutlineBy instanceof Box
34
- ? bounds.clone().expand(expandOutlineBy).zeroFix()
35
- : bounds.clone().expandBy(expandOutlineBy).zeroFix()
36
-
37
- return (
38
- <svg
39
- ref={rSvg}
40
- className="tl-overlays__item tl-selection__fg"
41
- data-testid="selection-foreground"
42
- >
43
- <rect
44
- className={classNames('tl-selection__fg__outline')}
45
- width={toDomPrecision(bounds.width)}
46
- height={toDomPrecision(bounds.height)}
47
- />
48
- </svg>
49
- )
50
- }
@@ -1,104 +0,0 @@
1
- import { useQuickReactor, useStateTracking, useValue } from '@tldraw/state-react'
2
- import { TLShape, TLShapeId } from '@tldraw/tlschema'
3
- import classNames from 'classnames'
4
- import { memo, useLayoutEffect, useRef } from 'react'
5
- import type { Editor } from '../../editor/Editor'
6
- import { ShapeUtil } from '../../editor/shapes/ShapeUtil'
7
- import { useEditorComponents } from '../../hooks/EditorComponentsContext'
8
- import { useEditor } from '../../hooks/useEditor'
9
- import { OptionalErrorBoundary } from '../ErrorBoundary'
10
-
11
- // need an extra layer of indirection here to allow hooks to be used inside the indicator render
12
- const EvenInnererIndicator = memo(
13
- ({ shape, util }: { shape: TLShape; util: ShapeUtil<any> }) => {
14
- return useStateTracking('Indicator: ' + shape.type, () =>
15
- // always fetch the latest shape from the store even if the props/meta have not changed, to avoid
16
- // calling the render method with stale data.
17
- util.indicator(util.editor.store.unsafeGetWithoutCapture(shape.id) as TLShape)
18
- )
19
- },
20
- (prevProps, nextProps) => {
21
- return (
22
- prevProps.shape.props === nextProps.shape.props &&
23
- prevProps.shape.meta === nextProps.shape.meta
24
- )
25
- }
26
- )
27
-
28
- const InnerIndicator = memo(({ editor, id }: { editor: Editor; id: TLShapeId }) => {
29
- const shape = useValue('shape for indicator', () => editor.store.get(id), [editor, id])
30
-
31
- const { ShapeIndicatorErrorFallback } = useEditorComponents()
32
-
33
- if (!shape || shape.isLocked) return null
34
-
35
- const util = editor.getShapeUtil(shape)
36
-
37
- // If the shape uses canvas indicators, it will be rendered by CanvasShapeIndicators
38
- if (!util.useLegacyIndicator()) return null
39
-
40
- return (
41
- <OptionalErrorBoundary
42
- fallback={ShapeIndicatorErrorFallback}
43
- onError={(error) =>
44
- editor.annotateError(error, { origin: 'react.shapeIndicator', willCrashApp: false })
45
- }
46
- >
47
- <EvenInnererIndicator key={shape.id} shape={shape} util={util} />
48
- </OptionalErrorBoundary>
49
- )
50
- })
51
-
52
- /** @public */
53
- export interface TLShapeIndicatorProps {
54
- userId?: string
55
- shapeId: TLShapeId
56
- color?: string | undefined
57
- opacity?: number
58
- className?: string
59
- hidden?: boolean
60
- }
61
-
62
- /** @public @react */
63
- export const DefaultShapeIndicator = memo(function DefaultShapeIndicator({
64
- shapeId,
65
- className,
66
- color,
67
- hidden,
68
- opacity,
69
- }: TLShapeIndicatorProps) {
70
- const editor = useEditor()
71
-
72
- const rIndicator = useRef<SVGSVGElement>(null)
73
-
74
- useQuickReactor(
75
- 'indicator transform',
76
- () => {
77
- if (hidden) return
78
- const elm = rIndicator.current
79
- if (!elm) return
80
- const pageTransform = editor.getShapePageTransform(shapeId)
81
- if (!pageTransform) return
82
- elm.style.setProperty('transform', pageTransform.toCssString())
83
- },
84
- [editor, shapeId, hidden]
85
- )
86
-
87
- useLayoutEffect(() => {
88
- const elm = rIndicator.current
89
- if (!elm) return
90
- elm.style.setProperty('display', hidden ? 'none' : 'block')
91
- }, [hidden])
92
-
93
- return (
94
- <svg ref={rIndicator} className={classNames('tl-overlays__item', className)} aria-hidden="true">
95
- <g
96
- className="tl-shape-indicator"
97
- stroke={color ?? 'var(--tl-color-selected)'}
98
- opacity={opacity}
99
- >
100
- <InnerIndicator editor={editor} id={shapeId} />
101
- </g>
102
- </svg>
103
- )
104
- })
@@ -1,9 +0,0 @@
1
- import { ComponentType } from 'react'
2
-
3
- /** @public */
4
- export type TLShapeIndicatorErrorFallbackComponent = ComponentType<{ error: unknown }>
5
-
6
- /** @internal */
7
- export const DefaultShapeIndicatorErrorFallback: TLShapeIndicatorErrorFallbackComponent = () => {
8
- return <circle cx={4} cy={4} r={8} strokeWidth="1" stroke="red" />
9
- }
@@ -1,116 +0,0 @@
1
- import { useValue } from '@tldraw/state-react'
2
- import { TLShapeId } from '@tldraw/tlschema'
3
- import { memo, useRef } from 'react'
4
- import { useEditorComponents } from '../../hooks/EditorComponentsContext'
5
- import { useEditor } from '../../hooks/useEditor'
6
-
7
- /** @public */
8
- export interface TLShapeIndicatorsProps {
9
- /** Whether to hide all of the indicators */
10
- hideAll?: boolean
11
- /** Whether to show all of the indicators */
12
- showAll?: boolean
13
- }
14
-
15
- /** @public @react */
16
- export const DefaultShapeIndicators = memo(function DefaultShapeIndicators({
17
- hideAll,
18
- showAll,
19
- }: TLShapeIndicatorsProps) {
20
- const editor = useEditor()
21
-
22
- if (hideAll && showAll)
23
- throw Error('You cannot set both hideAll and showAll props to true, cmon now')
24
-
25
- const rPreviousSelectedShapeIds = useRef<Set<TLShapeId>>(new Set())
26
-
27
- const idsToDisplay = useValue(
28
- 'should display selected ids',
29
- () => {
30
- const prev = rPreviousSelectedShapeIds.current
31
- const next = new Set<TLShapeId>()
32
-
33
- const instanceState = editor.getInstanceState()
34
-
35
- const isChangingStyle = instanceState.isChangingStyle
36
-
37
- // todo: this is tldraw specific and is duplicated at the tldraw layer. What should we do here instead?
38
-
39
- const isIdleOrEditing = editor.isInAny('select.idle', 'select.editing_shape')
40
-
41
- const isInSelectState = editor.isInAny(
42
- 'select.brushing',
43
- 'select.scribble_brushing',
44
- 'select.pointing_shape',
45
- 'select.pointing_selection',
46
- 'select.pointing_handle'
47
- )
48
-
49
- // We hide all indicators if we're changing style or in certain interactions
50
- // todo: move this to some kind of Tool.hideIndicators property
51
- if (isChangingStyle || !(isIdleOrEditing || isInSelectState)) {
52
- rPreviousSelectedShapeIds.current = next
53
- return next
54
- }
55
-
56
- // We always want to show indicators for the selected shapes, if any
57
- for (const id of editor.getSelectedShapeIds()) {
58
- next.add(id)
59
- }
60
-
61
- // If we're idle or editing a shape, we want to also show an indicator for the hovered shape, if any
62
- if (isIdleOrEditing && instanceState.isHoveringCanvas && !instanceState.isCoarsePointer) {
63
- const hovered = editor.getHoveredShapeId()
64
- if (hovered) next.add(hovered)
65
- }
66
-
67
- // Ok, has anything changed?
68
-
69
- // If the number of items in the set is different, then the selection has changed. This catches most changes.
70
- if (prev.size !== next.size) {
71
- rPreviousSelectedShapeIds.current = next
72
- return next
73
- }
74
-
75
- // Set difference check
76
- for (const id of next) {
77
- if (!prev.has(id)) {
78
- rPreviousSelectedShapeIds.current = next
79
- return next
80
- }
81
- }
82
-
83
- return prev
84
- },
85
- [editor]
86
- )
87
-
88
- // Show indicators only for the shapes that are currently being rendered (ie that are on screen)
89
- const renderingShapes = useValue('rendering shapes', () => editor.getRenderingShapes(), [editor])
90
-
91
- const { ShapeIndicator } = useEditorComponents()
92
-
93
- // Filter out shapes that have canvas indicator support - only render shapes that use legacy SVG indicators
94
- const shapesToRender = useValue(
95
- 'shapes to render for svg indicators',
96
- () => {
97
- return renderingShapes.filter(({ id }) => {
98
- const shape = editor.getShape(id)
99
- if (!shape) return false
100
- const util = editor.getShapeUtil(shape)
101
- return util.useLegacyIndicator()
102
- })
103
- },
104
- [editor, renderingShapes]
105
- )
106
-
107
- if (!ShapeIndicator) return null
108
-
109
- return shapesToRender.map(({ id }) => (
110
- <ShapeIndicator
111
- key={id + '_indicator'}
112
- shapeId={id}
113
- hidden={!showAll && (hideAll || !idsToDisplay.has(id))}
114
- />
115
- ))
116
- })
@@ -1,174 +0,0 @@
1
- import classNames from 'classnames'
2
- import * as React from 'react'
3
- import {
4
- type GapsSnapIndicator,
5
- type PointsSnapIndicator,
6
- type SnapIndicator,
7
- } from '../../editor/managers/SnapManager/SnapManager'
8
- import { rangeIntersection } from '../../primitives/utils'
9
-
10
- function PointsSnapIndicator({ points, zoom }: { zoom: number } & PointsSnapIndicator) {
11
- const l = 2.5 / zoom
12
-
13
- const minX = points.reduce((acc, p) => Math.min(acc, p.x), Infinity)
14
- const maxX = points.reduce((acc, p) => Math.max(acc, p.x), -Infinity)
15
- const minY = points.reduce((acc, p) => Math.min(acc, p.y), Infinity)
16
- const maxY = points.reduce((acc, p) => Math.max(acc, p.y), -Infinity)
17
-
18
- const useNWtoSEdireciton = points.some((p) => p.x === minX && p.y === minY)
19
- let firstX: number, firstY: number, secondX: number, secondY: number
20
- if (useNWtoSEdireciton) {
21
- firstX = minX
22
- firstY = minY
23
- secondX = maxX
24
- secondY = maxY
25
- } else {
26
- firstX = minX
27
- firstY = maxY
28
- secondX = maxX
29
- secondY = minY
30
- }
31
-
32
- return (
33
- <g className="tl-snap-indicator" stroke="lime">
34
- <line x1={firstX} y1={firstY} x2={secondX} y2={secondY} />
35
- {points.map((p, i) => (
36
- <g transform={`translate(${p.x},${p.y})`} key={i}>
37
- <path
38
- className="tl-snap-point"
39
- d={`M ${-l},${-l} L ${l},${l} M ${-l},${l} L ${l},${-l}`}
40
- />
41
- </g>
42
- ))}
43
- </g>
44
- )
45
- }
46
-
47
- function GapsSnapIndicator({ gaps, direction, zoom }: { zoom: number } & GapsSnapIndicator) {
48
- const l = 3.5 / zoom
49
-
50
- let edgeIntersection: number[] | null = [-Infinity, +Infinity]
51
- let nextEdgeIntersection: number[] | null = null
52
-
53
- const horizontal = direction === 'horizontal'
54
-
55
- // find intersection of all gaps so we can render a straight line through it;
56
- // some range intersections may return null, in which case we skip that gap.
57
- for (const gap of gaps) {
58
- nextEdgeIntersection = rangeIntersection(
59
- edgeIntersection[0],
60
- edgeIntersection[1],
61
- horizontal ? gap.startEdge[0].y : gap.startEdge[0].x,
62
- horizontal ? gap.startEdge[1].y : gap.startEdge[1].x
63
- )
64
-
65
- if (nextEdgeIntersection) {
66
- edgeIntersection = nextEdgeIntersection
67
- } else {
68
- continue
69
- }
70
-
71
- nextEdgeIntersection = rangeIntersection(
72
- edgeIntersection[0],
73
- edgeIntersection[1],
74
- horizontal ? gap.endEdge[0].y : gap.endEdge[0].x,
75
- horizontal ? gap.endEdge[1].y : gap.endEdge[1].x
76
- )
77
-
78
- if (nextEdgeIntersection) {
79
- edgeIntersection = nextEdgeIntersection
80
- } else {
81
- continue
82
- }
83
- }
84
-
85
- if (edgeIntersection === null) {
86
- return null
87
- }
88
-
89
- const midPoint = (edgeIntersection[0] + edgeIntersection[1]) / 2
90
-
91
- return (
92
- <g className="tl-snap-indicator" stroke="cyan">
93
- {gaps.map(({ startEdge, endEdge }, i) => (
94
- <React.Fragment key={i}>
95
- {horizontal ? (
96
- // horizontal gap
97
- <>
98
- {/* start edge */}
99
- <line
100
- x1={startEdge[0].x}
101
- y1={midPoint - 2 * l}
102
- x2={startEdge[1].x}
103
- y2={midPoint + 2 * l}
104
- />
105
- {/* end edge */}
106
- <line
107
- x1={endEdge[0].x}
108
- y1={midPoint - 2 * l}
109
- x2={endEdge[1].x}
110
- y2={midPoint + 2 * l}
111
- />
112
- {/* joining line */}
113
- <line x1={startEdge[0].x} y1={midPoint} x2={endEdge[0].x} y2={midPoint} />
114
- {/* center point marker */}
115
- <line
116
- x1={(startEdge[0].x + endEdge[0].x) / 2}
117
- y1={midPoint - l}
118
- x2={(startEdge[0].x + endEdge[0].x) / 2}
119
- y2={midPoint + l}
120
- />
121
- </>
122
- ) : (
123
- // vertical gap
124
- <>
125
- {/* start edge */}
126
- <line
127
- x1={midPoint - 2 * l}
128
- y1={startEdge[0].y}
129
- x2={midPoint + 2 * l}
130
- y2={startEdge[1].y}
131
- />
132
- {/* end edge */}
133
- <line
134
- x1={midPoint - 2 * l}
135
- y1={endEdge[0].y}
136
- x2={midPoint + 2 * l}
137
- y2={endEdge[1].y}
138
- />
139
- {/* joining line */}
140
- <line x1={midPoint} y1={startEdge[0].y} x2={midPoint} y2={endEdge[0].y} />
141
- {/* center point marker */}
142
- <line
143
- x1={midPoint - l}
144
- y1={(startEdge[0].y + endEdge[0].y) / 2}
145
- x2={midPoint + l}
146
- y2={(startEdge[0].y + endEdge[0].y) / 2}
147
- />
148
- </>
149
- )}
150
- </React.Fragment>
151
- ))}
152
- </g>
153
- )
154
- }
155
-
156
- /** @public */
157
- export interface TLSnapIndicatorProps {
158
- className?: string
159
- line: SnapIndicator
160
- zoom: number
161
- }
162
-
163
- /** @public @react */
164
- export function DefaultSnapIndicator({ className, line, zoom }: TLSnapIndicatorProps) {
165
- return (
166
- <svg className={classNames('tl-overlays__item', className)} aria-hidden="true">
167
- {line.type === 'points' ? (
168
- <PointsSnapIndicator {...line} zoom={zoom} />
169
- ) : line.type === 'gaps' ? (
170
- <GapsSnapIndicator {...line} zoom={zoom} />
171
- ) : null}
172
- </svg>
173
- )
174
- }
@@ -1,88 +0,0 @@
1
- import { TLArrowShape, TLLineShape, TLShapeId } from '@tldraw/tlschema'
2
- import * as React from 'react'
3
- import { Editor } from '../editor/Editor'
4
- import { loopToHtmlElement, releasePointerCapture, setPointerCapture } from '../utils/dom'
5
- import { getPointerInfo } from '../utils/getPointerInfo'
6
- import { useEditor } from './useEditor'
7
-
8
- function getHandle(editor: Editor, id: TLShapeId, handleId: string) {
9
- const shape = editor.getShape<TLArrowShape | TLLineShape>(id)!
10
- const handles = editor.getShapeHandles(shape)!
11
- return { shape, handle: handles.find((h) => h.id === handleId) }
12
- }
13
-
14
- export function useHandleEvents(id: TLShapeId, handleId: string) {
15
- const editor = useEditor()
16
-
17
- return React.useMemo(() => {
18
- const onPointerDown = (e: React.PointerEvent) => {
19
- if (editor.wasEventAlreadyHandled(e)) return
20
-
21
- // Must set pointer capture on an HTML element!
22
- const target = loopToHtmlElement(e.currentTarget)
23
- setPointerCapture(target, e)
24
-
25
- const { shape, handle } = getHandle(editor, id, handleId)
26
-
27
- if (!handle) return
28
-
29
- editor.dispatch({
30
- type: 'pointer',
31
- target: 'handle',
32
- handle,
33
- shape,
34
- name: 'pointer_down',
35
- ...getPointerInfo(editor, e),
36
- })
37
- }
38
-
39
- // Track the last screen point
40
- let lastX: number, lastY: number
41
-
42
- const onPointerMove = (e: React.PointerEvent) => {
43
- if (editor.wasEventAlreadyHandled(e)) return
44
- if (e.clientX === lastX && e.clientY === lastY) return
45
- lastX = e.clientX
46
- lastY = e.clientY
47
-
48
- const { shape, handle } = getHandle(editor, id, handleId)
49
-
50
- if (!handle) return
51
-
52
- editor.dispatch({
53
- type: 'pointer',
54
- target: 'handle',
55
- handle,
56
- shape,
57
- name: 'pointer_move',
58
- ...getPointerInfo(editor, e),
59
- })
60
- }
61
-
62
- const onPointerUp = (e: React.PointerEvent) => {
63
- if (editor.wasEventAlreadyHandled(e)) return
64
-
65
- const target = loopToHtmlElement(e.currentTarget)
66
- releasePointerCapture(target, e)
67
-
68
- const { shape, handle } = getHandle(editor, id, handleId)
69
-
70
- if (!handle) return
71
-
72
- editor.dispatch({
73
- type: 'pointer',
74
- target: 'handle',
75
- handle,
76
- shape,
77
- name: 'pointer_up',
78
- ...getPointerInfo(editor, e),
79
- })
80
- }
81
-
82
- return {
83
- onPointerDown,
84
- onPointerMove,
85
- onPointerUp,
86
- }
87
- }, [editor, id, handleId])
88
- }