@tldraw/editor 3.16.0-canary.c2c4563957ce → 3.16.0-canary.c360426d8b7a

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 (114) hide show
  1. package/dist-cjs/index.d.ts +59 -3
  2. package/dist-cjs/index.js +6 -2
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/TldrawEditor.js +2 -2
  5. package/dist-cjs/lib/TldrawEditor.js.map +2 -2
  6. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +11 -1
  7. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  8. package/dist-cjs/lib/editor/Editor.js +9 -4
  9. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  10. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js +4 -0
  11. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js.map +2 -2
  12. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js +4 -2
  13. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js.map +2 -2
  14. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +10 -0
  15. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  16. package/dist-cjs/lib/hooks/useCanvasEvents.js +15 -12
  17. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  18. package/dist-cjs/lib/hooks/useDocumentEvents.js +5 -5
  19. package/dist-cjs/lib/hooks/useDocumentEvents.js.map +2 -2
  20. package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js +1 -2
  21. package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js.map +2 -2
  22. package/dist-cjs/lib/hooks/useGestureEvents.js +1 -1
  23. package/dist-cjs/lib/hooks/useGestureEvents.js.map +2 -2
  24. package/dist-cjs/lib/hooks/useHandleEvents.js +3 -3
  25. package/dist-cjs/lib/hooks/useHandleEvents.js.map +2 -2
  26. package/dist-cjs/lib/hooks/useSelectionEvents.js +4 -4
  27. package/dist-cjs/lib/hooks/useSelectionEvents.js.map +2 -2
  28. package/dist-cjs/lib/license/LicenseManager.js +133 -38
  29. package/dist-cjs/lib/license/LicenseManager.js.map +2 -2
  30. package/dist-cjs/lib/license/LicenseProvider.js +36 -3
  31. package/dist-cjs/lib/license/LicenseProvider.js.map +2 -2
  32. package/dist-cjs/lib/license/Watermark.js +143 -75
  33. package/dist-cjs/lib/license/Watermark.js.map +3 -3
  34. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +24 -2
  35. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
  36. package/dist-cjs/lib/primitives/geometry/Group2d.js +5 -1
  37. package/dist-cjs/lib/primitives/geometry/Group2d.js.map +2 -2
  38. package/dist-cjs/lib/utils/dom.js +12 -1
  39. package/dist-cjs/lib/utils/dom.js.map +2 -2
  40. package/dist-cjs/lib/utils/getPointerInfo.js +2 -2
  41. package/dist-cjs/lib/utils/getPointerInfo.js.map +2 -2
  42. package/dist-cjs/version.js +3 -3
  43. package/dist-cjs/version.js.map +1 -1
  44. package/dist-esm/index.d.mts +59 -3
  45. package/dist-esm/index.mjs +9 -3
  46. package/dist-esm/index.mjs.map +2 -2
  47. package/dist-esm/lib/TldrawEditor.mjs +3 -3
  48. package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
  49. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +12 -2
  50. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  51. package/dist-esm/lib/editor/Editor.mjs +9 -4
  52. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  53. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs +4 -0
  54. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs.map +2 -2
  55. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs +4 -2
  56. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs.map +2 -2
  57. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +10 -0
  58. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  59. package/dist-esm/lib/hooks/useCanvasEvents.mjs +17 -13
  60. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  61. package/dist-esm/lib/hooks/useDocumentEvents.mjs +11 -6
  62. package/dist-esm/lib/hooks/useDocumentEvents.mjs.map +2 -2
  63. package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs +2 -3
  64. package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs.map +2 -2
  65. package/dist-esm/lib/hooks/useGestureEvents.mjs +2 -2
  66. package/dist-esm/lib/hooks/useGestureEvents.mjs.map +2 -2
  67. package/dist-esm/lib/hooks/useHandleEvents.mjs +9 -4
  68. package/dist-esm/lib/hooks/useHandleEvents.mjs.map +2 -2
  69. package/dist-esm/lib/hooks/useSelectionEvents.mjs +6 -5
  70. package/dist-esm/lib/hooks/useSelectionEvents.mjs.map +2 -2
  71. package/dist-esm/lib/license/LicenseManager.mjs +134 -39
  72. package/dist-esm/lib/license/LicenseManager.mjs.map +2 -2
  73. package/dist-esm/lib/license/LicenseProvider.mjs +36 -4
  74. package/dist-esm/lib/license/LicenseProvider.mjs.map +2 -2
  75. package/dist-esm/lib/license/Watermark.mjs +144 -76
  76. package/dist-esm/lib/license/Watermark.mjs.map +3 -3
  77. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +24 -2
  78. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
  79. package/dist-esm/lib/primitives/geometry/Group2d.mjs +5 -1
  80. package/dist-esm/lib/primitives/geometry/Group2d.mjs.map +2 -2
  81. package/dist-esm/lib/utils/dom.mjs +12 -1
  82. package/dist-esm/lib/utils/dom.mjs.map +2 -2
  83. package/dist-esm/lib/utils/getPointerInfo.mjs +2 -2
  84. package/dist-esm/lib/utils/getPointerInfo.mjs.map +2 -2
  85. package/dist-esm/version.mjs +3 -3
  86. package/dist-esm/version.mjs.map +1 -1
  87. package/editor.css +8 -3
  88. package/package.json +7 -7
  89. package/src/index.ts +3 -0
  90. package/src/lib/TldrawEditor.tsx +3 -4
  91. package/src/lib/components/default-components/DefaultCanvas.tsx +8 -2
  92. package/src/lib/editor/Editor.test.ts +90 -0
  93. package/src/lib/editor/Editor.ts +16 -4
  94. package/src/lib/editor/derivations/notVisibleShapes.ts +6 -0
  95. package/src/lib/editor/managers/FocusManager/FocusManager.ts +6 -2
  96. package/src/lib/editor/shapes/ShapeUtil.ts +11 -0
  97. package/src/lib/hooks/useCanvasEvents.ts +17 -11
  98. package/src/lib/hooks/useDocumentEvents.ts +11 -6
  99. package/src/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.ts +2 -2
  100. package/src/lib/hooks/useGestureEvents.ts +2 -2
  101. package/src/lib/hooks/useHandleEvents.ts +9 -4
  102. package/src/lib/hooks/useSelectionEvents.ts +6 -5
  103. package/src/lib/license/LicenseManager.test.ts +719 -387
  104. package/src/lib/license/LicenseManager.ts +187 -49
  105. package/src/lib/license/LicenseProvider.tsx +69 -5
  106. package/src/lib/license/Watermark.tsx +151 -77
  107. package/src/lib/primitives/geometry/Geometry2d.test.ts +420 -0
  108. package/src/lib/primitives/geometry/Geometry2d.ts +29 -2
  109. package/src/lib/primitives/geometry/Group2d.ts +6 -1
  110. package/src/lib/test/InFrontOfTheCanvas.test.tsx +187 -0
  111. package/src/lib/utils/dom.test.ts +94 -0
  112. package/src/lib/utils/dom.ts +38 -1
  113. package/src/lib/utils/getPointerInfo.ts +2 -1
  114. package/src/version.ts +3 -3
@@ -2,7 +2,12 @@ import { useValue } from '@tldraw/state-react'
2
2
  import { useEffect } from 'react'
3
3
  import { Editor } from '../editor/Editor'
4
4
  import { TLKeyboardEventInfo } from '../editor/types/event-types'
5
- import { activeElementShouldCaptureKeys, preventDefault, stopEventPropagation } from '../utils/dom'
5
+ import {
6
+ activeElementShouldCaptureKeys,
7
+ markEventAsHandled,
8
+ preventDefault,
9
+ wasEventAlreadyHandled,
10
+ } from '../utils/dom'
6
11
  import { isAccelKey } from '../utils/keyboard'
7
12
  import { useContainer } from './useContainer'
8
13
  import { useEditor } from './useEditor'
@@ -29,7 +34,7 @@ export function useDocumentEvents() {
29
34
  // re-dispatched, which would lead to an infinite loop.
30
35
  if ((e as any).isSpecialRedispatchedEvent) return
31
36
  preventDefault(e)
32
- stopEventPropagation(e)
37
+ e.stopPropagation()
33
38
  const cvs = container.querySelector('.tl-canvas')
34
39
  if (!cvs) return
35
40
  const newEvent = new DragEvent(e.type, e)
@@ -103,8 +108,8 @@ export function useDocumentEvents() {
103
108
  preventDefault(e)
104
109
  }
105
110
 
106
- if ((e as any).isKilled) return
107
- ;(e as any).isKilled = true
111
+ if (wasEventAlreadyHandled(e)) return
112
+ markEventAsHandled(e)
108
113
  const hasSelectedShapes = !!editor.getSelectedShapeIds().length
109
114
 
110
115
  switch (e.key) {
@@ -211,8 +216,8 @@ export function useDocumentEvents() {
211
216
  }
212
217
 
213
218
  const handleKeyUp = (e: KeyboardEvent) => {
214
- if ((e as any).isKilled) return
215
- ;(e as any).isKilled = true
219
+ if (wasEventAlreadyHandled(e)) return
220
+ markEventAsHandled(e)
216
221
 
217
222
  if (areShortcutsDisabled(editor)) {
218
223
  return
@@ -1,5 +1,5 @@
1
1
  import { useEffect } from 'react'
2
- import { preventDefault } from '../utils/dom'
2
+ import { markEventAsHandled, preventDefault } from '../utils/dom'
3
3
  import { useEditor } from './useEditor'
4
4
 
5
5
  const IGNORED_TAGS = ['textarea', 'input']
@@ -19,7 +19,7 @@ export function useFixSafariDoubleTapZoomPencilEvents(ref: React.RefObject<HTMLE
19
19
 
20
20
  const handleEvent = (e: PointerEvent | TouchEvent) => {
21
21
  if (e instanceof PointerEvent && e.pointerType === 'pen') {
22
- ;(e as any).isKilled = true
22
+ markEventAsHandled(e)
23
23
  const { target } = e
24
24
 
25
25
  // Allow events to propagate if the app is editing a shape, or if the event is occurring in a text area or input
@@ -3,7 +3,7 @@ import { createUseGesture, pinchAction, wheelAction } from '@use-gesture/react'
3
3
  import * as React from 'react'
4
4
  import { TLWheelEventInfo } from '../editor/types/event-types'
5
5
  import { Vec } from '../primitives/Vec'
6
- import { preventDefault, stopEventPropagation } from '../utils/dom'
6
+ import { preventDefault } from '../utils/dom'
7
7
  import { isAccelKey } from '../utils/keyboard'
8
8
  import { normalizeWheel } from '../utils/normalizeWheel'
9
9
  import { useEditor } from './useEditor'
@@ -113,7 +113,7 @@ export function useGestureEvents(ref: React.RefObject<HTMLDivElement>) {
113
113
  }
114
114
 
115
115
  preventDefault(event)
116
- stopEventPropagation(event)
116
+ event.stopPropagation()
117
117
  const delta = normalizeWheel(event)
118
118
 
119
119
  if (delta.x === 0 && delta.y === 0) return
@@ -1,7 +1,12 @@
1
1
  import { TLArrowShape, TLLineShape, TLShapeId } from '@tldraw/tlschema'
2
2
  import * as React from 'react'
3
3
  import { Editor } from '../editor/Editor'
4
- import { loopToHtmlElement, releasePointerCapture, setPointerCapture } from '../utils/dom'
4
+ import {
5
+ loopToHtmlElement,
6
+ releasePointerCapture,
7
+ setPointerCapture,
8
+ wasEventAlreadyHandled,
9
+ } from '../utils/dom'
5
10
  import { getPointerInfo } from '../utils/getPointerInfo'
6
11
  import { useEditor } from './useEditor'
7
12
 
@@ -16,7 +21,7 @@ export function useHandleEvents(id: TLShapeId, handleId: string) {
16
21
 
17
22
  return React.useMemo(() => {
18
23
  const onPointerDown = (e: React.PointerEvent) => {
19
- if ((e as any).isKilled) return
24
+ if (wasEventAlreadyHandled(e)) return
20
25
 
21
26
  // Must set pointer capture on an HTML element!
22
27
  const target = loopToHtmlElement(e.currentTarget)
@@ -40,7 +45,7 @@ export function useHandleEvents(id: TLShapeId, handleId: string) {
40
45
  let lastX: number, lastY: number
41
46
 
42
47
  const onPointerMove = (e: React.PointerEvent) => {
43
- if ((e as any).isKilled) return
48
+ if (wasEventAlreadyHandled(e)) return
44
49
  if (e.clientX === lastX && e.clientY === lastY) return
45
50
  lastX = e.clientX
46
51
  lastY = e.clientY
@@ -60,7 +65,7 @@ export function useHandleEvents(id: TLShapeId, handleId: string) {
60
65
  }
61
66
 
62
67
  const onPointerUp = (e: React.PointerEvent) => {
63
- if ((e as any).isKilled) return
68
+ if (wasEventAlreadyHandled(e)) return
64
69
 
65
70
  const target = loopToHtmlElement(e.currentTarget)
66
71
  releasePointerCapture(target, e)
@@ -3,9 +3,10 @@ import { RIGHT_MOUSE_BUTTON } from '../constants'
3
3
  import { TLSelectionHandle } from '../editor/types/selection-types'
4
4
  import {
5
5
  loopToHtmlElement,
6
+ markEventAsHandled,
6
7
  releasePointerCapture,
7
8
  setPointerCapture,
8
- stopEventPropagation,
9
+ wasEventAlreadyHandled,
9
10
  } from '../utils/dom'
10
11
  import { getPointerInfo } from '../utils/getPointerInfo'
11
12
  import { useEditor } from './useEditor'
@@ -17,7 +18,7 @@ export function useSelectionEvents(handle: TLSelectionHandle) {
17
18
  const events = useMemo(
18
19
  function selectionEvents() {
19
20
  const onPointerDown: React.PointerEventHandler = (e) => {
20
- if ((e as any).isKilled) return
21
+ if (wasEventAlreadyHandled(e)) return
21
22
 
22
23
  if (e.button === RIGHT_MOUSE_BUTTON) {
23
24
  editor.dispatch({
@@ -54,14 +55,14 @@ export function useSelectionEvents(handle: TLSelectionHandle) {
54
55
  handle,
55
56
  ...getPointerInfo(e),
56
57
  })
57
- stopEventPropagation(e)
58
+ markEventAsHandled(e)
58
59
  }
59
60
 
60
61
  // Track the last screen point
61
62
  let lastX: number, lastY: number
62
63
 
63
64
  function onPointerMove(e: React.PointerEvent) {
64
- if ((e as any).isKilled) return
65
+ if (wasEventAlreadyHandled(e)) return
65
66
  if (e.button !== 0) return
66
67
  if (e.clientX === lastX && e.clientY === lastY) return
67
68
  lastX = e.clientX
@@ -77,7 +78,7 @@ export function useSelectionEvents(handle: TLSelectionHandle) {
77
78
  }
78
79
 
79
80
  const onPointerUp: React.PointerEventHandler = (e) => {
80
- if ((e as any).isKilled) return
81
+ if (wasEventAlreadyHandled(e)) return
81
82
  if (e.button !== 0) return
82
83
 
83
84
  editor.dispatch({