@tldraw/editor 4.3.0-next.7f179bd04d6c → 4.3.0-next.842fb21476f2

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 (165) hide show
  1. package/dist-cjs/index.d.ts +441 -120
  2. package/dist-cjs/index.js +6 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/components/ErrorBoundary.js.map +1 -1
  5. package/dist-cjs/lib/components/GeometryDebuggingView.js +1 -17
  6. package/dist-cjs/lib/components/GeometryDebuggingView.js.map +2 -2
  7. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +3 -3
  8. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  9. package/dist-cjs/lib/constants.js +1 -3
  10. package/dist-cjs/lib/constants.js.map +2 -2
  11. package/dist-cjs/lib/editor/Editor.js +288 -275
  12. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  13. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js +18 -17
  14. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js.map +3 -3
  15. package/dist-cjs/lib/editor/derivations/parentsToChildren.js +12 -3
  16. package/dist-cjs/lib/editor/derivations/parentsToChildren.js.map +2 -2
  17. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js +1 -1
  18. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +2 -2
  19. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js +5 -6
  20. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +2 -2
  21. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js +591 -0
  22. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js.map +7 -0
  23. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js +1 -1
  24. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js.map +2 -2
  25. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js +1 -22
  26. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +2 -2
  27. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +31 -23
  28. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  29. package/dist-cjs/lib/editor/shapes/group/DashedOutlineBox.js +1 -1
  30. package/dist-cjs/lib/editor/shapes/group/DashedOutlineBox.js.map +2 -2
  31. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js +3 -3
  32. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js.map +2 -2
  33. package/dist-cjs/lib/exports/parseCss.js +1 -1
  34. package/dist-cjs/lib/exports/parseCss.js.map +2 -2
  35. package/dist-cjs/lib/globals/environment.js +45 -9
  36. package/dist-cjs/lib/globals/environment.js.map +2 -2
  37. package/dist-cjs/lib/hooks/useCoarsePointer.js +14 -29
  38. package/dist-cjs/lib/hooks/useCoarsePointer.js.map +2 -2
  39. package/dist-cjs/lib/hooks/useEvent.js +1 -1
  40. package/dist-cjs/lib/hooks/useEvent.js.map +2 -2
  41. package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js.map +2 -2
  42. package/dist-cjs/lib/hooks/useGestureEvents.js +1 -1
  43. package/dist-cjs/lib/hooks/useGestureEvents.js.map +2 -2
  44. package/dist-cjs/lib/hooks/usePassThroughMouseOverEvents.js.map +2 -2
  45. package/dist-cjs/lib/hooks/usePassThroughWheelEvents.js.map +2 -2
  46. package/dist-cjs/lib/hooks/useScreenBounds.js.map +2 -2
  47. package/dist-cjs/lib/hooks/useStateAttribute.js +4 -1
  48. package/dist-cjs/lib/hooks/useStateAttribute.js.map +2 -2
  49. package/dist-cjs/lib/hooks/useTransform.js.map +1 -1
  50. package/dist-cjs/lib/hooks/useZoomCss.js +4 -8
  51. package/dist-cjs/lib/hooks/useZoomCss.js.map +2 -2
  52. package/dist-cjs/lib/options.js +6 -1
  53. package/dist-cjs/lib/options.js.map +2 -2
  54. package/dist-cjs/lib/primitives/Box.js +3 -0
  55. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  56. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +1 -0
  57. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
  58. package/dist-cjs/lib/utils/rotation.js +1 -1
  59. package/dist-cjs/lib/utils/rotation.js.map +2 -2
  60. package/dist-cjs/version.js +3 -3
  61. package/dist-cjs/version.js.map +1 -1
  62. package/dist-esm/index.d.mts +441 -120
  63. package/dist-esm/index.mjs +7 -2
  64. package/dist-esm/index.mjs.map +2 -2
  65. package/dist-esm/lib/components/ErrorBoundary.mjs.map +1 -1
  66. package/dist-esm/lib/components/GeometryDebuggingView.mjs +1 -17
  67. package/dist-esm/lib/components/GeometryDebuggingView.mjs.map +2 -2
  68. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +3 -3
  69. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  70. package/dist-esm/lib/constants.mjs +1 -3
  71. package/dist-esm/lib/constants.mjs.map +2 -2
  72. package/dist-esm/lib/editor/Editor.mjs +289 -278
  73. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  74. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs +18 -17
  75. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs.map +3 -3
  76. package/dist-esm/lib/editor/derivations/parentsToChildren.mjs +13 -4
  77. package/dist-esm/lib/editor/derivations/parentsToChildren.mjs.map +2 -2
  78. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs +1 -1
  79. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +2 -2
  80. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs +5 -6
  81. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +2 -2
  82. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs +573 -0
  83. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +7 -0
  84. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs +1 -1
  85. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs.map +2 -2
  86. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs +1 -22
  87. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +2 -2
  88. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +31 -23
  89. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  90. package/dist-esm/lib/editor/shapes/group/DashedOutlineBox.mjs +1 -1
  91. package/dist-esm/lib/editor/shapes/group/DashedOutlineBox.mjs.map +2 -2
  92. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs +3 -3
  93. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs.map +2 -2
  94. package/dist-esm/lib/exports/parseCss.mjs +1 -1
  95. package/dist-esm/lib/exports/parseCss.mjs.map +2 -2
  96. package/dist-esm/lib/globals/environment.mjs +45 -9
  97. package/dist-esm/lib/globals/environment.mjs.map +2 -2
  98. package/dist-esm/lib/hooks/useCoarsePointer.mjs +15 -30
  99. package/dist-esm/lib/hooks/useCoarsePointer.mjs.map +2 -2
  100. package/dist-esm/lib/hooks/useEvent.mjs +1 -1
  101. package/dist-esm/lib/hooks/useEvent.mjs.map +2 -2
  102. package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs.map +2 -2
  103. package/dist-esm/lib/hooks/useGestureEvents.mjs +1 -1
  104. package/dist-esm/lib/hooks/useGestureEvents.mjs.map +2 -2
  105. package/dist-esm/lib/hooks/usePassThroughMouseOverEvents.mjs.map +2 -2
  106. package/dist-esm/lib/hooks/usePassThroughWheelEvents.mjs.map +2 -2
  107. package/dist-esm/lib/hooks/useScreenBounds.mjs.map +2 -2
  108. package/dist-esm/lib/hooks/useStateAttribute.mjs +4 -1
  109. package/dist-esm/lib/hooks/useStateAttribute.mjs.map +2 -2
  110. package/dist-esm/lib/hooks/useTransform.mjs.map +1 -1
  111. package/dist-esm/lib/hooks/useZoomCss.mjs +4 -8
  112. package/dist-esm/lib/hooks/useZoomCss.mjs.map +2 -2
  113. package/dist-esm/lib/options.mjs +6 -1
  114. package/dist-esm/lib/options.mjs.map +2 -2
  115. package/dist-esm/lib/primitives/Box.mjs +3 -0
  116. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  117. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +1 -0
  118. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
  119. package/dist-esm/lib/utils/rotation.mjs +1 -1
  120. package/dist-esm/lib/utils/rotation.mjs.map +2 -2
  121. package/dist-esm/version.mjs +3 -3
  122. package/dist-esm/version.mjs.map +1 -1
  123. package/editor.css +14 -12
  124. package/package.json +18 -16
  125. package/src/index.ts +4 -1
  126. package/src/lib/components/ErrorBoundary.tsx +1 -1
  127. package/src/lib/components/GeometryDebuggingView.tsx +1 -19
  128. package/src/lib/components/default-components/DefaultCanvas.tsx +3 -3
  129. package/src/lib/config/TLUserPreferences.test.ts +40 -0
  130. package/src/lib/constants.ts +0 -2
  131. package/src/lib/editor/Editor.test.ts +140 -0
  132. package/src/lib/editor/Editor.ts +374 -321
  133. package/src/lib/editor/derivations/notVisibleShapes.ts +37 -23
  134. package/src/lib/editor/derivations/parentsToChildren.ts +18 -7
  135. package/src/lib/editor/managers/ClickManager/ClickManager.test.ts +17 -31
  136. package/src/lib/editor/managers/ClickManager/ClickManager.ts +1 -1
  137. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.test.ts +129 -79
  138. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.ts +10 -6
  139. package/src/lib/editor/managers/InputsManager/InputsManager.ts +566 -0
  140. package/src/lib/editor/managers/ScribbleManager/ScribbleManager.test.ts +0 -4
  141. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +12 -0
  142. package/src/lib/editor/managers/SnapManager/SnapManager.ts +1 -1
  143. package/src/lib/editor/managers/TickManager/TickManager.test.ts +40 -107
  144. package/src/lib/editor/managers/TickManager/TickManager.ts +2 -32
  145. package/src/lib/editor/shapes/ShapeUtil.ts +67 -24
  146. package/src/lib/editor/shapes/group/DashedOutlineBox.tsx +1 -1
  147. package/src/lib/editor/tools/BaseBoxShapeTool/children/Pointing.ts +3 -3
  148. package/src/lib/exports/parseCss.test.ts +1 -0
  149. package/src/lib/exports/parseCss.ts +1 -1
  150. package/src/lib/globals/environment.ts +65 -10
  151. package/src/lib/hooks/useCoarsePointer.ts +16 -59
  152. package/src/lib/hooks/useEvent.tsx +1 -1
  153. package/src/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.ts +1 -1
  154. package/src/lib/hooks/useGestureEvents.ts +2 -2
  155. package/src/lib/hooks/usePassThroughMouseOverEvents.ts +1 -1
  156. package/src/lib/hooks/usePassThroughWheelEvents.ts +1 -1
  157. package/src/lib/hooks/useScreenBounds.ts +1 -1
  158. package/src/lib/hooks/useStateAttribute.ts +4 -1
  159. package/src/lib/hooks/useTransform.ts +1 -1
  160. package/src/lib/hooks/useZoomCss.ts +3 -8
  161. package/src/lib/options.ts +32 -0
  162. package/src/lib/primitives/Box.ts +9 -0
  163. package/src/lib/primitives/geometry/Geometry2d.ts +1 -0
  164. package/src/lib/utils/rotation.ts +1 -1
  165. package/src/version.ts +3 -3
@@ -0,0 +1,40 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { defaultUserPreferences, userTypeValidator } from './TLUserPreferences'
3
+
4
+ describe('TLUserPreferences consistency', () => {
5
+ // When adding a new user preference, add it to this list AND update:
6
+ // 1. TLUserPreferences interface
7
+ // 2. userTypeValidator
8
+ // 3. defaultUserPreferences
9
+ // 4. Versions enum and migrateSnapshot()
10
+ const interfaceKeys = [
11
+ 'name',
12
+ 'color',
13
+ 'locale',
14
+ 'animationSpeed',
15
+ 'areKeyboardShortcutsEnabled',
16
+ 'edgeScrollSpeed',
17
+ 'colorScheme',
18
+ 'isSnapMode',
19
+ 'isWrapMode',
20
+ 'isDynamicSizeMode',
21
+ 'isPasteAtCursorMode',
22
+ 'enhancedA11yMode',
23
+ 'inputMode',
24
+ ] as const
25
+
26
+ it('defaultUserPreferences contains all TLUserPreferences keys (except id)', () => {
27
+ const defaultKeys = Object.keys(defaultUserPreferences).sort()
28
+ const expected = [...interfaceKeys].sort()
29
+
30
+ expect(defaultKeys).toEqual(expected)
31
+ })
32
+
33
+ it('userTypeValidator validates all TLUserPreferences keys', () => {
34
+ // Access the internal config property to check which keys the validator covers
35
+ const validatorKeys = Object.keys((userTypeValidator as any).config).sort()
36
+ const expected = ['id', ...interfaceKeys].sort()
37
+
38
+ expect(validatorKeys).toEqual(expected)
39
+ })
40
+ })
@@ -31,5 +31,3 @@ export const LEFT_MOUSE_BUTTON = 0
31
31
  export const RIGHT_MOUSE_BUTTON = 2
32
32
  export const MIDDLE_MOUSE_BUTTON = 1
33
33
  export const STYLUS_ERASER_BUTTON = 5
34
-
35
- export const ZOOM_TO_FIT_PADDING = 128
@@ -925,6 +925,146 @@ describe('replaceExternalContent', () => {
925
925
  })
926
926
  })
927
927
 
928
+ describe('dispatch event emission', () => {
929
+ let testEditor: Editor
930
+
931
+ beforeEach(() => {
932
+ testEditor = new Editor({
933
+ shapeUtils: [CustomShape],
934
+ bindingUtils: [],
935
+ tools: [],
936
+ store: createTLStore({ shapeUtils: [CustomShape], bindingUtils: [] }),
937
+ getContainer: () => document.body,
938
+ })
939
+ // Ensure camera is unlocked so events are processed
940
+ testEditor.setCameraOptions({ isLocked: false })
941
+ })
942
+
943
+ it('emits wheel events through the event emitter', () => {
944
+ const eventHandler = vi.fn()
945
+ testEditor.on('event', eventHandler)
946
+
947
+ const wheelEvent = {
948
+ type: 'wheel' as const,
949
+ name: 'wheel' as const,
950
+ delta: { x: 0, y: 10, z: 0 },
951
+ point: { x: 100, y: 100, z: 1 },
952
+ shiftKey: false,
953
+ altKey: false,
954
+ ctrlKey: false,
955
+ metaKey: false,
956
+ accelKey: false,
957
+ }
958
+
959
+ testEditor.dispatch(wheelEvent)
960
+ // Wheel events are batched for the next tick, so emit a tick to flush them
961
+ testEditor.emit('tick', 16)
962
+
963
+ expect(eventHandler).toHaveBeenCalledWith(wheelEvent)
964
+ })
965
+
966
+ it('emits pinch_start events through the event emitter', () => {
967
+ const eventHandler = vi.fn()
968
+ testEditor.on('event', eventHandler)
969
+
970
+ const pinchStartEvent = {
971
+ type: 'pinch' as const,
972
+ name: 'pinch_start' as const,
973
+ point: { x: 100, y: 100, z: 1 },
974
+ delta: { x: 0, y: 0, z: 0 },
975
+ shiftKey: false,
976
+ altKey: false,
977
+ ctrlKey: false,
978
+ metaKey: false,
979
+ accelKey: false,
980
+ }
981
+
982
+ testEditor.dispatch(pinchStartEvent)
983
+ // Pinch events are batched for the next tick, so emit a tick to flush them
984
+ testEditor.emit('tick', 16)
985
+
986
+ expect(eventHandler).toHaveBeenCalledWith(pinchStartEvent)
987
+ })
988
+
989
+ it('emits pinch events through the event emitter', () => {
990
+ const eventHandler = vi.fn()
991
+ testEditor.on('event', eventHandler)
992
+
993
+ // First dispatch pinch_start to set isPinching
994
+ const pinchStartEvent = {
995
+ type: 'pinch' as const,
996
+ name: 'pinch_start' as const,
997
+ point: { x: 100, y: 100, z: 1 },
998
+ delta: { x: 0, y: 0, z: 0 },
999
+ shiftKey: false,
1000
+ altKey: false,
1001
+ ctrlKey: false,
1002
+ metaKey: false,
1003
+ accelKey: false,
1004
+ }
1005
+ testEditor.dispatch(pinchStartEvent)
1006
+ testEditor.emit('tick', 16)
1007
+
1008
+ eventHandler.mockClear()
1009
+
1010
+ const pinchEvent = {
1011
+ type: 'pinch' as const,
1012
+ name: 'pinch' as const,
1013
+ point: { x: 100, y: 100, z: 1.5 },
1014
+ delta: { x: 10, y: 10, z: 0 },
1015
+ shiftKey: false,
1016
+ altKey: false,
1017
+ ctrlKey: false,
1018
+ metaKey: false,
1019
+ accelKey: false,
1020
+ }
1021
+
1022
+ testEditor.dispatch(pinchEvent)
1023
+ testEditor.emit('tick', 16)
1024
+
1025
+ expect(eventHandler).toHaveBeenCalledWith(pinchEvent)
1026
+ })
1027
+
1028
+ it('emits pinch_end events through the event emitter', () => {
1029
+ const eventHandler = vi.fn()
1030
+ testEditor.on('event', eventHandler)
1031
+
1032
+ // First dispatch pinch_start to set isPinching
1033
+ const pinchStartEvent = {
1034
+ type: 'pinch' as const,
1035
+ name: 'pinch_start' as const,
1036
+ point: { x: 100, y: 100, z: 1 },
1037
+ delta: { x: 0, y: 0, z: 0 },
1038
+ shiftKey: false,
1039
+ altKey: false,
1040
+ ctrlKey: false,
1041
+ metaKey: false,
1042
+ accelKey: false,
1043
+ }
1044
+ testEditor.dispatch(pinchStartEvent)
1045
+ testEditor.emit('tick', 16)
1046
+
1047
+ eventHandler.mockClear()
1048
+
1049
+ const pinchEndEvent = {
1050
+ type: 'pinch' as const,
1051
+ name: 'pinch_end' as const,
1052
+ point: { x: 100, y: 100, z: 1.5 },
1053
+ delta: { x: 0, y: 0, z: 0 },
1054
+ shiftKey: false,
1055
+ altKey: false,
1056
+ ctrlKey: false,
1057
+ metaKey: false,
1058
+ accelKey: false,
1059
+ }
1060
+
1061
+ testEditor.dispatch(pinchEndEvent)
1062
+ testEditor.emit('tick', 16)
1063
+
1064
+ expect(eventHandler).toHaveBeenCalledWith(pinchEndEvent)
1065
+ })
1066
+ })
1067
+
928
1068
  describe('setTool', () => {
929
1069
  class CustomToolA extends StateNode {
930
1070
  static override id = 'custom-tool-a'