@tldraw/editor 3.14.0-canary.fd2ad122b803 → 3.14.0-canary.fdbfe5bf2604

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 (252) hide show
  1. package/dist-cjs/index.d.ts +220 -117
  2. package/dist-cjs/index.js +11 -8
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/config/TLSessionStateSnapshot.js +1 -12
  5. package/dist-cjs/lib/config/TLSessionStateSnapshot.js.map +3 -3
  6. package/dist-cjs/lib/editor/Editor.js +133 -102
  7. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  8. package/dist-cjs/lib/editor/bindings/BindingUtil.js.map +2 -2
  9. package/dist-cjs/lib/editor/derivations/bindingsIndex.js +22 -22
  10. package/dist-cjs/lib/editor/derivations/bindingsIndex.js.map +2 -2
  11. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js +16 -20
  12. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js.map +3 -3
  13. package/dist-cjs/lib/editor/derivations/parentsToChildren.js +16 -16
  14. package/dist-cjs/lib/editor/derivations/parentsToChildren.js.map +2 -2
  15. package/dist-cjs/lib/editor/managers/{ClickManager.js → ClickManager/ClickManager.js} +1 -1
  16. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +7 -0
  17. package/dist-cjs/lib/editor/managers/{EdgeScrollManager.js → EdgeScrollManager/EdgeScrollManager.js} +2 -2
  18. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +7 -0
  19. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js.map +7 -0
  20. package/dist-cjs/lib/editor/managers/{FontManager.js → FontManager/FontManager.js} +4 -1
  21. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +7 -0
  22. package/dist-cjs/lib/editor/managers/{HistoryManager.js → HistoryManager/HistoryManager.js} +67 -7
  23. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js.map +7 -0
  24. package/dist-cjs/lib/editor/managers/{ScribbleManager.js → ScribbleManager/ScribbleManager.js} +1 -1
  25. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js.map +7 -0
  26. package/dist-cjs/lib/editor/managers/{TextManager.js → TextManager/TextManager.js} +73 -42
  27. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +7 -0
  28. package/dist-cjs/lib/editor/managers/{TickManager.js → TickManager/TickManager.js} +1 -1
  29. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +7 -0
  30. package/dist-cjs/lib/editor/managers/{UserPreferencesManager.js → UserPreferencesManager/UserPreferencesManager.js} +1 -1
  31. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +7 -0
  32. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +8 -10
  33. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  34. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +6 -0
  35. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
  36. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js +10 -6
  37. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js.map +3 -3
  38. package/dist-cjs/lib/editor/tools/StateNode.js +3 -3
  39. package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
  40. package/dist-cjs/lib/editor/types/emit-types.js.map +1 -1
  41. package/dist-cjs/lib/editor/types/external-content.js.map +1 -1
  42. package/dist-cjs/lib/exports/getSvgJsx.js.map +1 -1
  43. package/dist-cjs/lib/hooks/useCanvasEvents.js +1 -2
  44. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  45. package/dist-cjs/lib/primitives/Box.js +33 -33
  46. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  47. package/dist-cjs/lib/primitives/Vec.js +13 -8
  48. package/dist-cjs/lib/primitives/Vec.js.map +2 -2
  49. package/dist-cjs/lib/primitives/geometry/Arc2d.js +41 -21
  50. package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
  51. package/dist-cjs/lib/primitives/geometry/Circle2d.js +11 -11
  52. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
  53. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +13 -16
  54. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
  55. package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js +4 -4
  56. package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js.map +2 -2
  57. package/dist-cjs/lib/primitives/geometry/Edge2d.js +14 -17
  58. package/dist-cjs/lib/primitives/geometry/Edge2d.js.map +2 -2
  59. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +10 -10
  60. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
  61. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +6 -2
  62. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
  63. package/dist-cjs/lib/primitives/geometry/Group2d.js +11 -6
  64. package/dist-cjs/lib/primitives/geometry/Group2d.js.map +2 -2
  65. package/dist-cjs/lib/primitives/geometry/Point2d.js +6 -6
  66. package/dist-cjs/lib/primitives/geometry/Point2d.js.map +2 -2
  67. package/dist-cjs/lib/primitives/geometry/Polygon2d.js +3 -0
  68. package/dist-cjs/lib/primitives/geometry/Polygon2d.js.map +2 -2
  69. package/dist-cjs/lib/primitives/geometry/Polyline2d.js +8 -5
  70. package/dist-cjs/lib/primitives/geometry/Polyline2d.js.map +2 -2
  71. package/dist-cjs/lib/primitives/geometry/Rectangle2d.js +22 -11
  72. package/dist-cjs/lib/primitives/geometry/Rectangle2d.js.map +2 -2
  73. package/dist-cjs/lib/primitives/geometry/Stadium2d.js +22 -22
  74. package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +2 -2
  75. package/dist-cjs/lib/utils/dom.js +1 -1
  76. package/dist-cjs/lib/utils/dom.js.map +2 -2
  77. package/dist-cjs/lib/utils/reorderShapes.js +11 -10
  78. package/dist-cjs/lib/utils/reorderShapes.js.map +2 -2
  79. package/dist-cjs/lib/utils/reparenting.js +232 -0
  80. package/dist-cjs/lib/utils/reparenting.js.map +7 -0
  81. package/dist-cjs/lib/utils/richText.js +7 -2
  82. package/dist-cjs/lib/utils/richText.js.map +2 -2
  83. package/dist-cjs/version.js +3 -3
  84. package/dist-cjs/version.js.map +1 -1
  85. package/dist-esm/index.d.mts +220 -117
  86. package/dist-esm/index.mjs +15 -8
  87. package/dist-esm/index.mjs.map +2 -2
  88. package/dist-esm/lib/config/TLSessionStateSnapshot.mjs +1 -1
  89. package/dist-esm/lib/config/TLSessionStateSnapshot.mjs.map +2 -2
  90. package/dist-esm/lib/editor/Editor.mjs +133 -102
  91. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  92. package/dist-esm/lib/editor/bindings/BindingUtil.mjs.map +2 -2
  93. package/dist-esm/lib/editor/derivations/bindingsIndex.mjs +22 -22
  94. package/dist-esm/lib/editor/derivations/bindingsIndex.mjs.map +2 -2
  95. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs +16 -20
  96. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs.map +3 -3
  97. package/dist-esm/lib/editor/derivations/parentsToChildren.mjs +16 -16
  98. package/dist-esm/lib/editor/derivations/parentsToChildren.mjs.map +2 -2
  99. package/dist-esm/lib/editor/managers/{ClickManager.mjs → ClickManager/ClickManager.mjs} +1 -1
  100. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +7 -0
  101. package/dist-esm/lib/editor/managers/{EdgeScrollManager.mjs → EdgeScrollManager/EdgeScrollManager.mjs} +2 -2
  102. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +7 -0
  103. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs.map +7 -0
  104. package/dist-esm/lib/editor/managers/{FontManager.mjs → FontManager/FontManager.mjs} +4 -1
  105. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +7 -0
  106. package/dist-esm/lib/editor/managers/{HistoryManager.mjs → HistoryManager/HistoryManager.mjs} +63 -3
  107. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs.map +7 -0
  108. package/dist-esm/lib/editor/managers/{ScribbleManager.mjs → ScribbleManager/ScribbleManager.mjs} +1 -1
  109. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs.map +7 -0
  110. package/dist-esm/lib/editor/managers/{TextManager.mjs → TextManager/TextManager.mjs} +73 -42
  111. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +7 -0
  112. package/dist-esm/lib/editor/managers/{TickManager.mjs → TickManager/TickManager.mjs} +1 -1
  113. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +7 -0
  114. package/dist-esm/lib/editor/managers/{UserPreferencesManager.mjs → UserPreferencesManager/UserPreferencesManager.mjs} +1 -1
  115. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +7 -0
  116. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +8 -10
  117. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  118. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +6 -0
  119. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
  120. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs +10 -6
  121. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs.map +3 -3
  122. package/dist-esm/lib/editor/tools/StateNode.mjs +3 -3
  123. package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
  124. package/dist-esm/lib/exports/getSvgJsx.mjs.map +1 -1
  125. package/dist-esm/lib/hooks/useCanvasEvents.mjs +1 -2
  126. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  127. package/dist-esm/lib/primitives/Box.mjs +33 -33
  128. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  129. package/dist-esm/lib/primitives/Vec.mjs +13 -8
  130. package/dist-esm/lib/primitives/Vec.mjs.map +2 -2
  131. package/dist-esm/lib/primitives/geometry/Arc2d.mjs +41 -21
  132. package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
  133. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +11 -11
  134. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
  135. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +13 -16
  136. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
  137. package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs +4 -4
  138. package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs.map +2 -2
  139. package/dist-esm/lib/primitives/geometry/Edge2d.mjs +14 -17
  140. package/dist-esm/lib/primitives/geometry/Edge2d.mjs.map +2 -2
  141. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +11 -11
  142. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
  143. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +6 -2
  144. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
  145. package/dist-esm/lib/primitives/geometry/Group2d.mjs +11 -6
  146. package/dist-esm/lib/primitives/geometry/Group2d.mjs.map +2 -2
  147. package/dist-esm/lib/primitives/geometry/Point2d.mjs +6 -6
  148. package/dist-esm/lib/primitives/geometry/Point2d.mjs.map +2 -2
  149. package/dist-esm/lib/primitives/geometry/Polygon2d.mjs +3 -0
  150. package/dist-esm/lib/primitives/geometry/Polygon2d.mjs.map +2 -2
  151. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs +8 -5
  152. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs.map +2 -2
  153. package/dist-esm/lib/primitives/geometry/Rectangle2d.mjs +22 -11
  154. package/dist-esm/lib/primitives/geometry/Rectangle2d.mjs.map +2 -2
  155. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs +22 -22
  156. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +2 -2
  157. package/dist-esm/lib/utils/dom.mjs +1 -1
  158. package/dist-esm/lib/utils/dom.mjs.map +2 -2
  159. package/dist-esm/lib/utils/reorderShapes.mjs +11 -10
  160. package/dist-esm/lib/utils/reorderShapes.mjs.map +2 -2
  161. package/dist-esm/lib/utils/reparenting.mjs +216 -0
  162. package/dist-esm/lib/utils/reparenting.mjs.map +7 -0
  163. package/dist-esm/lib/utils/richText.mjs +8 -3
  164. package/dist-esm/lib/utils/richText.mjs.map +2 -2
  165. package/dist-esm/version.mjs +3 -3
  166. package/dist-esm/version.mjs.map +1 -1
  167. package/editor.css +446 -489
  168. package/package.json +8 -9
  169. package/src/index.ts +20 -7
  170. package/src/lib/config/TLSessionStateSnapshot.ts +1 -1
  171. package/src/lib/editor/Editor.test.ts +252 -3
  172. package/src/lib/editor/Editor.ts +152 -111
  173. package/src/lib/editor/bindings/BindingUtil.ts +6 -0
  174. package/src/lib/editor/derivations/bindingsIndex.ts +27 -26
  175. package/src/lib/editor/derivations/notVisibleShapes.ts +24 -25
  176. package/src/lib/editor/derivations/parentsToChildren.ts +28 -25
  177. package/src/lib/editor/managers/ClickManager/ClickManager.test.ts +442 -0
  178. package/src/lib/editor/managers/{ClickManager.ts → ClickManager/ClickManager.ts} +3 -3
  179. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.test.ts +374 -0
  180. package/src/lib/editor/managers/{EdgeScrollManager.ts → EdgeScrollManager/EdgeScrollManager.ts} +3 -3
  181. package/src/lib/editor/managers/FocusManager/FocusManager.test.ts +455 -0
  182. package/src/lib/editor/managers/{FocusManager.ts → FocusManager/FocusManager.ts} +1 -1
  183. package/src/lib/editor/managers/FontManager/FontManager.test.ts +263 -0
  184. package/src/lib/editor/managers/{FontManager.ts → FontManager/FontManager.ts} +5 -2
  185. package/src/lib/editor/managers/{HistoryManager.test.ts → HistoryManager/HistoryManager.test.ts} +388 -1
  186. package/src/lib/editor/managers/{HistoryManager.ts → HistoryManager/HistoryManager.ts} +76 -3
  187. package/src/lib/editor/managers/ScribbleManager/ScribbleManager.test.ts +624 -0
  188. package/src/lib/editor/managers/{ScribbleManager.ts → ScribbleManager/ScribbleManager.ts} +2 -2
  189. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +485 -0
  190. package/src/lib/editor/managers/TextManager/TextManager.test.ts +407 -0
  191. package/src/lib/editor/managers/{TextManager.ts → TextManager/TextManager.ts} +119 -87
  192. package/src/lib/editor/managers/TickManager/TickManager.test.ts +314 -0
  193. package/src/lib/editor/managers/{TickManager.ts → TickManager/TickManager.ts} +2 -2
  194. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +591 -0
  195. package/src/lib/editor/managers/{UserPreferencesManager.ts → UserPreferencesManager/UserPreferencesManager.ts} +2 -2
  196. package/src/lib/editor/shapes/ShapeUtil.ts +57 -16
  197. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +8 -0
  198. package/src/lib/editor/tools/BaseBoxShapeTool/children/Pointing.ts +22 -17
  199. package/src/lib/editor/tools/StateNode.ts +3 -3
  200. package/src/lib/editor/types/emit-types.ts +4 -0
  201. package/src/lib/editor/types/external-content.ts +11 -2
  202. package/src/lib/exports/getSvgJsx.tsx +1 -1
  203. package/src/lib/hooks/useCanvasEvents.ts +0 -1
  204. package/src/lib/primitives/Box.test.ts +588 -7
  205. package/src/lib/primitives/Box.ts +33 -33
  206. package/src/lib/primitives/Vec.test.ts +2 -2
  207. package/src/lib/primitives/Vec.ts +13 -8
  208. package/src/lib/primitives/geometry/Arc2d.ts +42 -23
  209. package/src/lib/primitives/geometry/Circle2d.ts +12 -12
  210. package/src/lib/primitives/geometry/CubicBezier2d.test.ts +5 -0
  211. package/src/lib/primitives/geometry/CubicBezier2d.ts +13 -17
  212. package/src/lib/primitives/geometry/CubicSpline2d.ts +5 -5
  213. package/src/lib/primitives/geometry/Edge2d.ts +14 -18
  214. package/src/lib/primitives/geometry/Ellipse2d.ts +12 -13
  215. package/src/lib/primitives/geometry/Geometry2d.ts +7 -2
  216. package/src/lib/primitives/geometry/Group2d.ts +11 -5
  217. package/src/lib/primitives/geometry/Point2d.ts +6 -6
  218. package/src/lib/primitives/geometry/Polygon2d.ts +4 -0
  219. package/src/lib/primitives/geometry/Polyline2d.ts +10 -7
  220. package/src/lib/primitives/geometry/Rectangle2d.ts +24 -11
  221. package/src/lib/primitives/geometry/Stadium2d.ts +22 -23
  222. package/src/lib/utils/dom.ts +1 -1
  223. package/src/lib/utils/reorderShapes.ts +10 -13
  224. package/src/lib/utils/reparenting.ts +383 -0
  225. package/src/lib/utils/richText.ts +10 -4
  226. package/src/version.ts +3 -3
  227. package/dist-cjs/lib/editor/managers/ClickManager.js.map +0 -7
  228. package/dist-cjs/lib/editor/managers/EdgeScrollManager.js.map +0 -7
  229. package/dist-cjs/lib/editor/managers/FocusManager.js.map +0 -7
  230. package/dist-cjs/lib/editor/managers/FontManager.js.map +0 -7
  231. package/dist-cjs/lib/editor/managers/HistoryManager.js.map +0 -7
  232. package/dist-cjs/lib/editor/managers/ScribbleManager.js.map +0 -7
  233. package/dist-cjs/lib/editor/managers/Stack.js +0 -82
  234. package/dist-cjs/lib/editor/managers/Stack.js.map +0 -7
  235. package/dist-cjs/lib/editor/managers/TextManager.js.map +0 -7
  236. package/dist-cjs/lib/editor/managers/TickManager.js.map +0 -7
  237. package/dist-cjs/lib/editor/managers/UserPreferencesManager.js.map +0 -7
  238. package/dist-esm/lib/editor/managers/ClickManager.mjs.map +0 -7
  239. package/dist-esm/lib/editor/managers/EdgeScrollManager.mjs.map +0 -7
  240. package/dist-esm/lib/editor/managers/FocusManager.mjs.map +0 -7
  241. package/dist-esm/lib/editor/managers/FontManager.mjs.map +0 -7
  242. package/dist-esm/lib/editor/managers/HistoryManager.mjs.map +0 -7
  243. package/dist-esm/lib/editor/managers/ScribbleManager.mjs.map +0 -7
  244. package/dist-esm/lib/editor/managers/Stack.mjs +0 -62
  245. package/dist-esm/lib/editor/managers/Stack.mjs.map +0 -7
  246. package/dist-esm/lib/editor/managers/TextManager.mjs.map +0 -7
  247. package/dist-esm/lib/editor/managers/TickManager.mjs.map +0 -7
  248. package/dist-esm/lib/editor/managers/UserPreferencesManager.mjs.map +0 -7
  249. package/src/lib/editor/managers/ScribbleManager.test.ts +0 -32
  250. package/src/lib/editor/managers/Stack.ts +0 -71
  251. /package/dist-cjs/lib/editor/managers/{FocusManager.js → FocusManager/FocusManager.js} +0 -0
  252. /package/dist-esm/lib/editor/managers/{FocusManager.mjs → FocusManager/FocusManager.mjs} +0 -0
@@ -1,49 +1,48 @@
1
1
  import { computed, isUninitialized } from '@tldraw/state'
2
2
  import { TLShapeId } from '@tldraw/tlschema'
3
- import { Box } from '../../primitives/Box'
4
3
  import { Editor } from '../Editor'
5
4
 
6
- function isShapeNotVisible(editor: Editor, id: TLShapeId, viewportPageBounds: Box): boolean {
7
- const maskedPageBounds = editor.getShapeMaskedPageBounds(id)
8
- // if the shape is fully outside of its parent's clipping bounds...
9
- if (maskedPageBounds === undefined) return true
10
-
11
- // if the shape is fully outside of the viewport page bounds...
12
- return !viewportPageBounds.includes(maskedPageBounds)
5
+ function fromScratch(editor: Editor): Set<TLShapeId> {
6
+ const shapesIds = editor.getCurrentPageShapeIds()
7
+ const viewportPageBounds = editor.getViewportPageBounds()
8
+ const notVisibleShapes = new Set<TLShapeId>()
9
+ shapesIds.forEach((id) => {
10
+ // If the shape is fully outside of the viewport page bounds, add it to the set.
11
+ // We'll ignore masks here, since they're more expensive to compute and the overhead is not worth it.
12
+ const pageBounds = editor.getShapePageBounds(id)
13
+ if (pageBounds === undefined || !viewportPageBounds.includes(pageBounds)) {
14
+ notVisibleShapes.add(id)
15
+ }
16
+ })
17
+ return notVisibleShapes
13
18
  }
14
19
 
15
20
  /**
16
21
  * Incremental derivation of not visible shapes.
17
- * Non visible shapes are shapes outside of the viewport page bounds and shapes outside of parent's clipping bounds.
22
+ * Non visible shapes are shapes outside of the viewport page bounds.
18
23
  *
19
24
  * @param editor - Instance of the tldraw Editor.
20
25
  * @returns Incremental derivation of non visible shapes.
21
26
  */
22
- export const notVisibleShapes = (editor: Editor) => {
23
- function fromScratch(editor: Editor): Set<TLShapeId> {
24
- const shapes = editor.getCurrentPageShapeIds()
25
- const viewportPageBounds = editor.getViewportPageBounds()
26
- const notVisibleShapes = new Set<TLShapeId>()
27
- shapes.forEach((id) => {
28
- if (isShapeNotVisible(editor, id, viewportPageBounds)) {
29
- notVisibleShapes.add(id)
30
- }
31
- })
32
- return notVisibleShapes
33
- }
34
- return computed<Set<TLShapeId>>('notVisibleShapes', (prevValue) => {
27
+ export function notVisibleShapes(editor: Editor) {
28
+ return computed<Set<TLShapeId>>('notVisibleShapes', function updateNotVisibleShapes(prevValue) {
29
+ const nextValue = fromScratch(editor)
30
+
35
31
  if (isUninitialized(prevValue)) {
36
- return fromScratch(editor)
32
+ return nextValue
37
33
  }
38
34
 
39
- const nextValue = fromScratch(editor)
40
-
35
+ // If there are more or less shapes, we know there's a change
41
36
  if (prevValue.size !== nextValue.size) return nextValue
37
+
38
+ // If any of the old shapes are not in the new set, we know there's a change
42
39
  for (const prev of prevValue) {
43
40
  if (!nextValue.has(prev)) {
44
41
  return nextValue
45
42
  }
46
43
  }
44
+
45
+ // If we've made it here, we know that the set is the same
47
46
  return prevValue
48
47
  })
49
48
  }
@@ -1,45 +1,48 @@
1
- import { computed, isUninitialized, RESET_VALUE } from '@tldraw/state'
2
- import { RecordsDiff } from '@tldraw/store'
1
+ import { Computed, computed, isUninitialized, RESET_VALUE } from '@tldraw/state'
2
+ import { CollectionDiff, RecordsDiff } from '@tldraw/store'
3
3
  import { isShape, TLParentId, TLRecord, TLShape, TLShapeId, TLStore } from '@tldraw/tlschema'
4
4
  import { compact, sortByIndex } from '@tldraw/utils'
5
5
 
6
- type Parents2Children = Record<TLParentId, TLShapeId[]>
6
+ type ParentShapeIdsToChildShapeIds = Record<TLParentId, TLShapeId[]>
7
7
 
8
- export const parentsToChildren = (store: TLStore) => {
9
- const shapeIdsQuery = store.query.ids<'shape'>('shape')
10
- const shapeHistory = store.query.filterHistory('shape')
8
+ function fromScratch(
9
+ shapeIdsQuery: Computed<Set<TLShapeId>, CollectionDiff<TLShapeId>>,
10
+ store: TLStore
11
+ ) {
12
+ const result: ParentShapeIdsToChildShapeIds = {}
13
+ const shapeIds = shapeIdsQuery.get()
14
+ const shapes = Array(shapeIds.size) as TLShape[]
15
+ shapeIds.forEach((id) => shapes.push(store.get(id)!))
11
16
 
12
- function fromScratch() {
13
- const result: Parents2Children = {}
14
- const shapeIds = shapeIdsQuery.get()
15
- const shapes = Array(shapeIds.size) as TLShape[]
16
- shapeIds.forEach((id) => shapes.push(store.get(id)!))
17
+ // Sort the shapes by index
18
+ shapes.sort(sortByIndex)
17
19
 
18
- // Sort the shapes by index
19
- shapes.sort(sortByIndex)
20
+ // Populate the result object with an array for each parent.
21
+ shapes.forEach((shape) => {
22
+ if (!result[shape.parentId]) {
23
+ result[shape.parentId] = []
24
+ }
25
+ result[shape.parentId].push(shape.id)
26
+ })
20
27
 
21
- // Populate the result object with an array for each parent.
22
- shapes.forEach((shape) => {
23
- if (!result[shape.parentId]) {
24
- result[shape.parentId] = []
25
- }
26
- result[shape.parentId].push(shape.id)
27
- })
28
+ return result
29
+ }
28
30
 
29
- return result
30
- }
31
+ export const parentsToChildren = (store: TLStore) => {
32
+ const shapeIdsQuery = store.query.ids<'shape'>('shape')
33
+ const shapeHistory = store.query.filterHistory('shape')
31
34
 
32
- return computed<Parents2Children>(
35
+ return computed<ParentShapeIdsToChildShapeIds>(
33
36
  'parentsToChildrenWithIndexes',
34
37
  (lastValue, lastComputedEpoch) => {
35
38
  if (isUninitialized(lastValue)) {
36
- return fromScratch()
39
+ return fromScratch(shapeIdsQuery, store)
37
40
  }
38
41
 
39
42
  const diff = shapeHistory.getDiffSince(lastComputedEpoch)
40
43
 
41
44
  if (diff === RESET_VALUE) {
42
- return fromScratch()
45
+ return fromScratch(shapeIdsQuery, store)
43
46
  }
44
47
 
45
48
  if (diff.length === 0) return lastValue
@@ -0,0 +1,442 @@
1
+ import { Editor } from '../../Editor'
2
+ import { TLClickEventInfo, TLPointerEventInfo } from '../../types/event-types'
3
+ import { ClickManager } from './ClickManager'
4
+
5
+ // Mock the Editor class
6
+ jest.mock('../../Editor')
7
+
8
+ describe('ClickManager', () => {
9
+ let editor: jest.Mocked<Editor>
10
+ let clickManager: ClickManager
11
+ let mockTimers: any
12
+
13
+ const createPointerEvent = (
14
+ name: 'pointer_down' | 'pointer_up' | 'pointer_move',
15
+ point: { x: number; y: number } = { x: 0, y: 0 }
16
+ ): TLPointerEventInfo => ({
17
+ type: 'pointer',
18
+ name,
19
+ point,
20
+ pointerId: 1,
21
+ button: 0,
22
+ isPen: false,
23
+ target: 'canvas',
24
+ shiftKey: false,
25
+ altKey: false,
26
+ ctrlKey: false,
27
+ metaKey: false,
28
+ accelKey: false,
29
+ })
30
+
31
+ beforeEach(() => {
32
+ jest.useFakeTimers()
33
+ mockTimers = {
34
+ setTimeout: jest.fn((fn, delay) => setTimeout(fn, delay)),
35
+ }
36
+
37
+ editor = {
38
+ timers: mockTimers,
39
+ dispatch: jest.fn(),
40
+ options: {
41
+ doubleClickDurationMs: 300,
42
+ multiClickDurationMs: 300,
43
+ dragDistanceSquared: 16,
44
+ coarseDragDistanceSquared: 36,
45
+ },
46
+ inputs: {
47
+ currentScreenPoint: { x: 0, y: 0 },
48
+ },
49
+ getInstanceState: jest.fn(() => ({
50
+ isCoarsePointer: false,
51
+ })),
52
+ } as any
53
+
54
+ clickManager = new ClickManager(editor)
55
+ })
56
+
57
+ afterEach(() => {
58
+ jest.useRealTimers()
59
+ jest.clearAllMocks()
60
+ })
61
+
62
+ describe('constructor and initial state', () => {
63
+ it('should initialize with idle state', () => {
64
+ expect(clickManager.clickState).toBe('idle')
65
+ })
66
+
67
+ it('should store reference to editor', () => {
68
+ expect(clickManager.editor).toBe(editor)
69
+ })
70
+
71
+ it('should initialize lastPointerInfo as empty object', () => {
72
+ expect(clickManager.lastPointerInfo).toEqual({})
73
+ })
74
+ })
75
+
76
+ describe('single click behavior', () => {
77
+ it('should handle pointer_down in idle state', () => {
78
+ const pointerEvent = createPointerEvent('pointer_down', { x: 100, y: 100 })
79
+
80
+ const result = clickManager.handlePointerEvent(pointerEvent)
81
+
82
+ expect(result).toBe(pointerEvent)
83
+ expect(clickManager.clickState).toBe('pendingDouble')
84
+ expect(clickManager.lastPointerInfo).toBe(pointerEvent)
85
+ })
86
+
87
+ it('should handle pointer_up without generating click events in pending state', () => {
88
+ const downEvent = createPointerEvent('pointer_down', { x: 100, y: 100 })
89
+ const upEvent = createPointerEvent('pointer_up', { x: 100, y: 100 })
90
+
91
+ clickManager.handlePointerEvent(downEvent)
92
+ clickManager.handlePointerEvent(upEvent)
93
+
94
+ expect(clickManager.clickState).toBe('pendingDouble')
95
+ })
96
+
97
+ it('should return to idle state after timeout in pendingDouble', () => {
98
+ const pointerEvent = createPointerEvent('pointer_down', { x: 100, y: 100 })
99
+
100
+ clickManager.handlePointerEvent(pointerEvent)
101
+ expect(clickManager.clickState).toBe('pendingDouble')
102
+
103
+ jest.advanceTimersByTime(350)
104
+
105
+ expect(clickManager.clickState).toBe('idle')
106
+ })
107
+ })
108
+
109
+ describe('double click detection', () => {
110
+ it('should detect double click on second pointer_down', () => {
111
+ const firstDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
112
+ const secondDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
113
+
114
+ clickManager.handlePointerEvent(firstDown)
115
+ const result = clickManager.handlePointerEvent(secondDown) as TLClickEventInfo
116
+
117
+ expect(result.type).toBe('click')
118
+ expect(result.name).toBe('double_click')
119
+ expect(result.phase).toBe('down')
120
+ expect(clickManager.clickState).toBe('pendingTriple')
121
+ })
122
+
123
+ it('should generate double_click up event on pointer_up after double_click down', () => {
124
+ const firstDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
125
+ const secondDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
126
+ const secondUp = createPointerEvent('pointer_up', { x: 100, y: 100 })
127
+
128
+ clickManager.handlePointerEvent(firstDown)
129
+ clickManager.handlePointerEvent(secondDown)
130
+ const result = clickManager.handlePointerEvent(secondUp) as TLClickEventInfo
131
+
132
+ expect(result.type).toBe('click')
133
+ expect(result.name).toBe('double_click')
134
+ expect(result.phase).toBe('up')
135
+ })
136
+
137
+ it('should dispatch double_click settle event after timeout in pendingTriple', () => {
138
+ const firstDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
139
+ const secondDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
140
+
141
+ clickManager.handlePointerEvent(firstDown)
142
+ clickManager.handlePointerEvent(secondDown)
143
+
144
+ jest.advanceTimersByTime(350)
145
+
146
+ expect(editor.dispatch).toHaveBeenCalledWith(
147
+ expect.objectContaining({
148
+ type: 'click',
149
+ name: 'double_click',
150
+ phase: 'settle',
151
+ })
152
+ )
153
+ expect(clickManager.clickState).toBe('idle')
154
+ })
155
+ })
156
+
157
+ describe('triple and quadruple click detection', () => {
158
+ it('should detect triple click on third pointer_down', () => {
159
+ const firstDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
160
+ const secondDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
161
+ const thirdDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
162
+
163
+ clickManager.handlePointerEvent(firstDown)
164
+ clickManager.handlePointerEvent(secondDown)
165
+ const result = clickManager.handlePointerEvent(thirdDown) as TLClickEventInfo
166
+
167
+ expect(result.type).toBe('click')
168
+ expect(result.name).toBe('triple_click')
169
+ expect(result.phase).toBe('down')
170
+ expect(clickManager.clickState).toBe('pendingQuadruple')
171
+ })
172
+
173
+ it('should detect quadruple click on fourth pointer_down', () => {
174
+ const pointerDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
175
+
176
+ clickManager.handlePointerEvent(pointerDown) // first
177
+ clickManager.handlePointerEvent(pointerDown) // second (double_click)
178
+ clickManager.handlePointerEvent(pointerDown) // third (triple_click)
179
+ const result = clickManager.handlePointerEvent(pointerDown) as TLClickEventInfo // fourth
180
+
181
+ expect(result.type).toBe('click')
182
+ expect(result.name).toBe('quadruple_click')
183
+ expect(result.phase).toBe('down')
184
+ expect(clickManager.clickState).toBe('pendingOverflow')
185
+ })
186
+
187
+ it('should handle overflow state after quadruple click', () => {
188
+ const pointerDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
189
+
190
+ clickManager.handlePointerEvent(pointerDown) // first
191
+ clickManager.handlePointerEvent(pointerDown) // second
192
+ clickManager.handlePointerEvent(pointerDown) // third
193
+ clickManager.handlePointerEvent(pointerDown) // fourth
194
+ const result = clickManager.handlePointerEvent(pointerDown) // fifth
195
+
196
+ expect(result).toBe(pointerDown)
197
+ expect(clickManager.clickState).toBe('overflow')
198
+ })
199
+
200
+ it('should generate triple_click up event on pointer_up after triple_click down', () => {
201
+ const pointerDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
202
+ const pointerUp = createPointerEvent('pointer_up', { x: 100, y: 100 })
203
+
204
+ clickManager.handlePointerEvent(pointerDown) // first
205
+ clickManager.handlePointerEvent(pointerDown) // second
206
+ clickManager.handlePointerEvent(pointerDown) // third
207
+ const result = clickManager.handlePointerEvent(pointerUp) as TLClickEventInfo
208
+
209
+ expect(result.type).toBe('click')
210
+ expect(result.name).toBe('triple_click')
211
+ expect(result.phase).toBe('up')
212
+ })
213
+
214
+ it('should generate quadruple_click up event on pointer_up after quadruple_click down', () => {
215
+ const pointerDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
216
+ const pointerUp = createPointerEvent('pointer_up', { x: 100, y: 100 })
217
+
218
+ clickManager.handlePointerEvent(pointerDown) // first
219
+ clickManager.handlePointerEvent(pointerDown) // second
220
+ clickManager.handlePointerEvent(pointerDown) // third
221
+ clickManager.handlePointerEvent(pointerDown) // fourth
222
+ const result = clickManager.handlePointerEvent(pointerUp) as TLClickEventInfo
223
+
224
+ expect(result.type).toBe('click')
225
+ expect(result.name).toBe('quadruple_click')
226
+ expect(result.phase).toBe('up')
227
+ })
228
+ })
229
+
230
+ describe('timeout behavior and settle events', () => {
231
+ it('should dispatch triple_click settle event after timeout in pendingQuadruple', () => {
232
+ const pointerDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
233
+
234
+ clickManager.handlePointerEvent(pointerDown) // first
235
+ clickManager.handlePointerEvent(pointerDown) // second
236
+ clickManager.handlePointerEvent(pointerDown) // third
237
+
238
+ jest.advanceTimersByTime(350)
239
+
240
+ expect(editor.dispatch).toHaveBeenCalledWith(
241
+ expect.objectContaining({
242
+ type: 'click',
243
+ name: 'triple_click',
244
+ phase: 'settle',
245
+ })
246
+ )
247
+ expect(clickManager.clickState).toBe('idle')
248
+ })
249
+
250
+ it('should dispatch quadruple_click settle event after timeout in pendingOverflow', () => {
251
+ const pointerDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
252
+
253
+ clickManager.handlePointerEvent(pointerDown) // first
254
+ clickManager.handlePointerEvent(pointerDown) // second
255
+ clickManager.handlePointerEvent(pointerDown) // third
256
+ clickManager.handlePointerEvent(pointerDown) // fourth
257
+
258
+ jest.advanceTimersByTime(350)
259
+
260
+ expect(editor.dispatch).toHaveBeenCalledWith(
261
+ expect.objectContaining({
262
+ type: 'click',
263
+ name: 'quadruple_click',
264
+ phase: 'settle',
265
+ })
266
+ )
267
+ expect(clickManager.clickState).toBe('idle')
268
+ })
269
+
270
+ it('should use different timeout durations for different states', () => {
271
+ const pointerDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
272
+
273
+ // First click - should use doubleClickDurationMs
274
+ clickManager.handlePointerEvent(pointerDown)
275
+ expect(mockTimers.setTimeout).toHaveBeenCalledWith(
276
+ expect.any(Function),
277
+ editor.options.doubleClickDurationMs
278
+ )
279
+
280
+ jest.clearAllMocks()
281
+
282
+ // Second click - should use multiClickDurationMs
283
+ clickManager.handlePointerEvent(pointerDown)
284
+ expect(mockTimers.setTimeout).toHaveBeenCalledWith(
285
+ expect.any(Function),
286
+ editor.options.multiClickDurationMs
287
+ )
288
+ })
289
+ })
290
+
291
+ describe('distance-based click cancellation', () => {
292
+ it('should reset to idle if clicks are too far apart', () => {
293
+ const firstDown = createPointerEvent('pointer_down', { x: 0, y: 0 })
294
+ const secondDown = createPointerEvent('pointer_down', { x: 50, y: 50 }) // > 40px distance
295
+
296
+ clickManager.handlePointerEvent(firstDown)
297
+ expect(clickManager.clickState).toBe('pendingDouble')
298
+
299
+ const result = clickManager.handlePointerEvent(secondDown)
300
+
301
+ expect(result).toBe(secondDown)
302
+ expect(clickManager.clickState).toBe('pendingDouble') // Reset and started new sequence
303
+ })
304
+
305
+ it('should continue sequence if clicks are close enough', () => {
306
+ const firstDown = createPointerEvent('pointer_down', { x: 0, y: 0 })
307
+ const secondDown = createPointerEvent('pointer_down', { x: 5, y: 5 }) // < 40px distance
308
+
309
+ clickManager.handlePointerEvent(firstDown)
310
+ const result = clickManager.handlePointerEvent(secondDown) as TLClickEventInfo
311
+
312
+ expect(result.type).toBe('click')
313
+ expect(result.name).toBe('double_click')
314
+ expect(clickManager.clickState).toBe('pendingTriple')
315
+ })
316
+ })
317
+
318
+ describe('pointer move cancellation behavior', () => {
319
+ it('should cancel click sequence on significant pointer move', () => {
320
+ const downEvent = createPointerEvent('pointer_down', { x: 0, y: 0 })
321
+ const moveEvent = createPointerEvent('pointer_move', { x: 10, y: 10 })
322
+
323
+ editor.inputs.currentScreenPoint.x = 10
324
+ editor.inputs.currentScreenPoint.y = 10
325
+
326
+ clickManager.handlePointerEvent(downEvent)
327
+ expect(clickManager.clickState).toBe('pendingDouble')
328
+
329
+ const result = clickManager.handlePointerEvent(moveEvent)
330
+
331
+ expect(result).toBe(moveEvent)
332
+ expect(clickManager.clickState).toBe('idle')
333
+ })
334
+
335
+ it('should use coarse drag distance for coarse pointers', () => {
336
+ editor.getInstanceState.mockReturnValue({
337
+ ...editor.getInstanceState(),
338
+ isCoarsePointer: true,
339
+ })
340
+
341
+ const downEvent = createPointerEvent('pointer_down', { x: 0, y: 0 })
342
+ const moveEvent1 = createPointerEvent('pointer_move', { x: 1, y: 1 })
343
+ const moveEvent2 = createPointerEvent('pointer_move', { x: 5, y: 5 }) // 50
344
+
345
+ clickManager.handlePointerEvent(downEvent)
346
+ expect(clickManager.clickState).toBe('pendingDouble')
347
+
348
+ // Should not cancel for coarse pointer with small movement
349
+ editor.inputs.currentScreenPoint.x = 1
350
+ editor.inputs.currentScreenPoint.y = 1
351
+ clickManager.handlePointerEvent(moveEvent1)
352
+ expect(clickManager.clickState).toBe('pendingDouble')
353
+
354
+ editor.inputs.currentScreenPoint.x = 5
355
+ editor.inputs.currentScreenPoint.y = 5
356
+ clickManager.handlePointerEvent(moveEvent2)
357
+
358
+ expect(clickManager.clickState).toBe('idle')
359
+ })
360
+
361
+ it('should not cancel in idle state', () => {
362
+ const moveEvent = createPointerEvent('pointer_move', { x: 100, y: 100 })
363
+
364
+ editor.inputs.currentScreenPoint.x = 100
365
+ editor.inputs.currentScreenPoint.y = 100
366
+
367
+ clickManager.handlePointerEvent(moveEvent)
368
+
369
+ expect(clickManager.clickState).toBe('idle')
370
+ })
371
+ })
372
+
373
+ describe('cancelDoubleClickTimeout method', () => {
374
+ it('should clear timeout and reset state to idle', () => {
375
+ const pointerDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
376
+
377
+ clickManager.handlePointerEvent(pointerDown)
378
+ expect(clickManager.clickState).toBe('pendingDouble')
379
+
380
+ clickManager.cancelDoubleClickTimeout()
381
+
382
+ expect(clickManager.clickState).toBe('idle')
383
+ })
384
+
385
+ it('should prevent timeout callback from executing after cancellation', () => {
386
+ const pointerDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
387
+
388
+ clickManager.handlePointerEvent(pointerDown)
389
+ clickManager.handlePointerEvent(pointerDown) // double click
390
+ expect(clickManager.clickState).toBe('pendingTriple')
391
+
392
+ clickManager.cancelDoubleClickTimeout()
393
+
394
+ // Advance time - should not dispatch settle event
395
+ jest.advanceTimersByTime(350)
396
+
397
+ expect(editor.dispatch).not.toHaveBeenCalled()
398
+ expect(clickManager.clickState).toBe('idle')
399
+ })
400
+ })
401
+
402
+ describe('edge cases', () => {
403
+ it('should handle null click state gracefully', () => {
404
+ // Force null state
405
+ ;(clickManager as any)._clickState = null
406
+
407
+ const pointerEvent = createPointerEvent('pointer_down', { x: 100, y: 100 })
408
+ const result = clickManager.handlePointerEvent(pointerEvent)
409
+
410
+ expect(result).toBe(pointerEvent)
411
+ })
412
+
413
+ it('should handle missing previous screen point', () => {
414
+ const firstDown = createPointerEvent('pointer_down', { x: 0, y: 0 })
415
+
416
+ // Clear previous point
417
+ ;(clickManager as any)._previousScreenPoint = undefined
418
+
419
+ const result = clickManager.handlePointerEvent(firstDown)
420
+
421
+ expect(result).toBe(firstDown)
422
+ expect(clickManager.clickState).toBe('pendingDouble')
423
+ })
424
+
425
+ it('should handle overflow state correctly', () => {
426
+ const pointerDown = createPointerEvent('pointer_down', { x: 100, y: 100 })
427
+ const pointerUp = createPointerEvent('pointer_up', { x: 100, y: 100 })
428
+
429
+ // Get to overflow state
430
+ clickManager.handlePointerEvent(pointerDown) // 1
431
+ clickManager.handlePointerEvent(pointerDown) // 2
432
+ clickManager.handlePointerEvent(pointerDown) // 3
433
+ clickManager.handlePointerEvent(pointerDown) // 4
434
+ clickManager.handlePointerEvent(pointerDown) // 5 -> overflow
435
+
436
+ expect(clickManager.clickState).toBe('overflow')
437
+
438
+ // pointer_up in overflow should just return the event
439
+ clickManager.handlePointerEvent(pointerUp)
440
+ })
441
+ })
442
+ })
@@ -1,7 +1,7 @@
1
1
  import { bind, uniqueId } from '@tldraw/utils'
2
- import { Vec } from '../../primitives/Vec'
3
- import type { Editor } from '../Editor'
4
- import { TLClickEventInfo, TLPointerEventInfo } from '../types/event-types'
2
+ import { Vec } from '../../../primitives/Vec'
3
+ import type { Editor } from '../../Editor'
4
+ import { TLClickEventInfo, TLPointerEventInfo } from '../../types/event-types'
5
5
 
6
6
  /** @public */
7
7
  export type TLClickState =