@tldraw/editor 4.2.2 → 4.2.3

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 (200) hide show
  1. package/dist-cjs/index.d.ts +155 -498
  2. package/dist-cjs/index.js +1 -6
  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 +17 -1
  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 +3 -1
  10. package/dist-cjs/lib/constants.js.map +2 -2
  11. package/dist-cjs/lib/editor/Editor.js +286 -292
  12. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  13. package/dist-cjs/lib/editor/bindings/BindingUtil.js.map +2 -2
  14. package/dist-cjs/lib/editor/derivations/bindingsIndex.js.map +2 -2
  15. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js +17 -18
  16. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js.map +3 -3
  17. package/dist-cjs/lib/editor/derivations/parentsToChildren.js +3 -12
  18. package/dist-cjs/lib/editor/derivations/parentsToChildren.js.map +2 -2
  19. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js +1 -1
  20. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +2 -2
  21. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js +6 -5
  22. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +2 -2
  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 +22 -1
  26. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +2 -2
  27. package/dist-cjs/lib/editor/shapes/BaseBoxShapeUtil.js.map +1 -1
  28. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +23 -31
  29. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  30. package/dist-cjs/lib/editor/shapes/group/DashedOutlineBox.js +1 -1
  31. package/dist-cjs/lib/editor/shapes/group/DashedOutlineBox.js.map +2 -2
  32. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
  33. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/BaseBoxShapeTool.js.map +2 -2
  34. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js +3 -3
  35. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js.map +2 -2
  36. package/dist-cjs/lib/editor/types/emit-types.js.map +1 -1
  37. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  38. package/dist-cjs/lib/exports/parseCss.js +1 -1
  39. package/dist-cjs/lib/exports/parseCss.js.map +2 -2
  40. package/dist-cjs/lib/globals/environment.js +9 -45
  41. package/dist-cjs/lib/globals/environment.js.map +2 -2
  42. package/dist-cjs/lib/globals/menus.js +1 -1
  43. package/dist-cjs/lib/globals/menus.js.map +2 -2
  44. package/dist-cjs/lib/hooks/useCanvasEvents.js +3 -4
  45. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  46. package/dist-cjs/lib/hooks/useCoarsePointer.js +29 -14
  47. package/dist-cjs/lib/hooks/useCoarsePointer.js.map +2 -2
  48. package/dist-cjs/lib/hooks/useEvent.js +1 -1
  49. package/dist-cjs/lib/hooks/useEvent.js.map +2 -2
  50. package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js.map +2 -2
  51. package/dist-cjs/lib/hooks/useGestureEvents.js +1 -1
  52. package/dist-cjs/lib/hooks/useGestureEvents.js.map +2 -2
  53. package/dist-cjs/lib/hooks/usePassThroughMouseOverEvents.js.map +2 -2
  54. package/dist-cjs/lib/hooks/usePassThroughWheelEvents.js.map +2 -2
  55. package/dist-cjs/lib/hooks/useScreenBounds.js.map +2 -2
  56. package/dist-cjs/lib/hooks/useStateAttribute.js +1 -4
  57. package/dist-cjs/lib/hooks/useStateAttribute.js.map +2 -2
  58. package/dist-cjs/lib/hooks/useTransform.js.map +1 -1
  59. package/dist-cjs/lib/hooks/useZoomCss.js +8 -4
  60. package/dist-cjs/lib/hooks/useZoomCss.js.map +2 -2
  61. package/dist-cjs/lib/options.js +1 -6
  62. package/dist-cjs/lib/options.js.map +2 -2
  63. package/dist-cjs/lib/primitives/Box.js +0 -3
  64. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  65. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +0 -1
  66. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
  67. package/dist-cjs/lib/utils/reparenting.js.map +2 -2
  68. package/dist-cjs/lib/utils/rotation.js +1 -1
  69. package/dist-cjs/lib/utils/rotation.js.map +2 -2
  70. package/dist-cjs/version.js +3 -3
  71. package/dist-cjs/version.js.map +1 -1
  72. package/dist-esm/index.d.mts +155 -498
  73. package/dist-esm/index.mjs +2 -7
  74. package/dist-esm/index.mjs.map +2 -2
  75. package/dist-esm/lib/components/ErrorBoundary.mjs.map +1 -1
  76. package/dist-esm/lib/components/GeometryDebuggingView.mjs +17 -1
  77. package/dist-esm/lib/components/GeometryDebuggingView.mjs.map +2 -2
  78. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +3 -3
  79. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  80. package/dist-esm/lib/constants.mjs +3 -1
  81. package/dist-esm/lib/constants.mjs.map +2 -2
  82. package/dist-esm/lib/editor/Editor.mjs +289 -293
  83. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  84. package/dist-esm/lib/editor/bindings/BindingUtil.mjs.map +2 -2
  85. package/dist-esm/lib/editor/derivations/bindingsIndex.mjs.map +2 -2
  86. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs +17 -18
  87. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs.map +3 -3
  88. package/dist-esm/lib/editor/derivations/parentsToChildren.mjs +4 -13
  89. package/dist-esm/lib/editor/derivations/parentsToChildren.mjs.map +2 -2
  90. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs +1 -1
  91. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +2 -2
  92. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs +6 -5
  93. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +2 -2
  94. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs +1 -1
  95. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs.map +2 -2
  96. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs +22 -1
  97. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +2 -2
  98. package/dist-esm/lib/editor/shapes/BaseBoxShapeUtil.mjs.map +1 -1
  99. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +23 -31
  100. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  101. package/dist-esm/lib/editor/shapes/group/DashedOutlineBox.mjs +1 -1
  102. package/dist-esm/lib/editor/shapes/group/DashedOutlineBox.mjs.map +2 -2
  103. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
  104. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/BaseBoxShapeTool.mjs.map +2 -2
  105. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs +3 -3
  106. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs.map +2 -2
  107. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  108. package/dist-esm/lib/exports/parseCss.mjs +1 -1
  109. package/dist-esm/lib/exports/parseCss.mjs.map +2 -2
  110. package/dist-esm/lib/globals/environment.mjs +9 -45
  111. package/dist-esm/lib/globals/environment.mjs.map +2 -2
  112. package/dist-esm/lib/globals/menus.mjs +1 -1
  113. package/dist-esm/lib/globals/menus.mjs.map +2 -2
  114. package/dist-esm/lib/hooks/useCanvasEvents.mjs +3 -4
  115. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  116. package/dist-esm/lib/hooks/useCoarsePointer.mjs +30 -15
  117. package/dist-esm/lib/hooks/useCoarsePointer.mjs.map +2 -2
  118. package/dist-esm/lib/hooks/useEvent.mjs +1 -1
  119. package/dist-esm/lib/hooks/useEvent.mjs.map +2 -2
  120. package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs.map +2 -2
  121. package/dist-esm/lib/hooks/useGestureEvents.mjs +1 -1
  122. package/dist-esm/lib/hooks/useGestureEvents.mjs.map +2 -2
  123. package/dist-esm/lib/hooks/usePassThroughMouseOverEvents.mjs.map +2 -2
  124. package/dist-esm/lib/hooks/usePassThroughWheelEvents.mjs.map +2 -2
  125. package/dist-esm/lib/hooks/useScreenBounds.mjs.map +2 -2
  126. package/dist-esm/lib/hooks/useStateAttribute.mjs +1 -4
  127. package/dist-esm/lib/hooks/useStateAttribute.mjs.map +2 -2
  128. package/dist-esm/lib/hooks/useTransform.mjs.map +1 -1
  129. package/dist-esm/lib/hooks/useZoomCss.mjs +8 -4
  130. package/dist-esm/lib/hooks/useZoomCss.mjs.map +2 -2
  131. package/dist-esm/lib/options.mjs +1 -6
  132. package/dist-esm/lib/options.mjs.map +2 -2
  133. package/dist-esm/lib/primitives/Box.mjs +0 -3
  134. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  135. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +0 -1
  136. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
  137. package/dist-esm/lib/utils/reparenting.mjs.map +2 -2
  138. package/dist-esm/lib/utils/rotation.mjs +1 -1
  139. package/dist-esm/lib/utils/rotation.mjs.map +2 -2
  140. package/dist-esm/version.mjs +3 -3
  141. package/dist-esm/version.mjs.map +1 -1
  142. package/editor.css +12 -14
  143. package/package.json +16 -18
  144. package/src/index.ts +1 -4
  145. package/src/lib/components/ErrorBoundary.tsx +1 -1
  146. package/src/lib/components/GeometryDebuggingView.tsx +19 -1
  147. package/src/lib/components/default-components/DefaultCanvas.tsx +3 -4
  148. package/src/lib/constants.ts +2 -0
  149. package/src/lib/editor/Editor.test.ts +10 -150
  150. package/src/lib/editor/Editor.ts +379 -459
  151. package/src/lib/editor/bindings/BindingUtil.ts +9 -15
  152. package/src/lib/editor/derivations/bindingsIndex.ts +2 -2
  153. package/src/lib/editor/derivations/notVisibleShapes.ts +23 -37
  154. package/src/lib/editor/derivations/parentsToChildren.ts +7 -18
  155. package/src/lib/editor/managers/ClickManager/ClickManager.test.ts +31 -17
  156. package/src/lib/editor/managers/ClickManager/ClickManager.ts +1 -1
  157. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.test.ts +79 -129
  158. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.ts +6 -10
  159. package/src/lib/editor/managers/FontManager/FontManager.test.ts +4 -14
  160. package/src/lib/editor/managers/ScribbleManager/ScribbleManager.test.ts +4 -0
  161. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +0 -12
  162. package/src/lib/editor/managers/SnapManager/SnapManager.ts +4 -4
  163. package/src/lib/editor/managers/TickManager/TickManager.test.ts +107 -40
  164. package/src/lib/editor/managers/TickManager/TickManager.ts +32 -2
  165. package/src/lib/editor/shapes/BaseBoxShapeUtil.tsx +2 -2
  166. package/src/lib/editor/shapes/ShapeUtil.ts +32 -72
  167. package/src/lib/editor/shapes/group/DashedOutlineBox.tsx +1 -1
  168. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +3 -1
  169. package/src/lib/editor/tools/BaseBoxShapeTool/BaseBoxShapeTool.ts +1 -2
  170. package/src/lib/editor/tools/BaseBoxShapeTool/children/Pointing.ts +6 -6
  171. package/src/lib/editor/types/emit-types.ts +1 -3
  172. package/src/lib/exports/getSvgJsx.test.ts +19 -10
  173. package/src/lib/exports/getSvgJsx.tsx +5 -2
  174. package/src/lib/exports/parseCss.test.ts +0 -1
  175. package/src/lib/exports/parseCss.ts +1 -1
  176. package/src/lib/globals/environment.ts +10 -65
  177. package/src/lib/globals/menus.ts +1 -1
  178. package/src/lib/hooks/useCanvasEvents.ts +3 -4
  179. package/src/lib/hooks/useCoarsePointer.ts +59 -16
  180. package/src/lib/hooks/useEvent.tsx +1 -1
  181. package/src/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.ts +1 -1
  182. package/src/lib/hooks/useGestureEvents.ts +2 -2
  183. package/src/lib/hooks/usePassThroughMouseOverEvents.ts +1 -1
  184. package/src/lib/hooks/usePassThroughWheelEvents.ts +1 -1
  185. package/src/lib/hooks/useScreenBounds.ts +1 -1
  186. package/src/lib/hooks/useStateAttribute.ts +1 -4
  187. package/src/lib/hooks/useTransform.ts +1 -1
  188. package/src/lib/hooks/useZoomCss.ts +8 -3
  189. package/src/lib/options.ts +0 -32
  190. package/src/lib/primitives/Box.ts +0 -9
  191. package/src/lib/primitives/geometry/Geometry2d.ts +0 -1
  192. package/src/lib/utils/reparenting.ts +5 -5
  193. package/src/lib/utils/rotation.ts +1 -1
  194. package/src/version.ts +3 -3
  195. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js +0 -591
  196. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js.map +0 -7
  197. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs +0 -573
  198. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +0 -7
  199. package/src/lib/config/TLUserPreferences.test.ts +0 -40
  200. package/src/lib/editor/managers/InputsManager/InputsManager.ts +0 -566
package/editor.css CHANGED
@@ -607,6 +607,7 @@ input,
607
607
  pointer-events: all;
608
608
  white-space: pre-wrap;
609
609
  overflow-wrap: break-word;
610
+ text-shadow: var(--tl-text-outline);
610
611
  }
611
612
 
612
613
  .tl-text-wrapper[data-font='draw'] {
@@ -708,7 +709,7 @@ input,
708
709
  resize: none;
709
710
  border: none;
710
711
  user-select: none;
711
- contain: layout style paint;
712
+ contain: style paint;
712
713
  /* N.B. This property, while discouraged ("intended for Document Type Definition (DTD) designers") is necessary for ensuring correct mixed RTL/LTR behavior when exporting SVGs. */
713
714
  unicode-bidi: plaintext;
714
715
  -webkit-user-select: none;
@@ -769,6 +770,7 @@ input,
769
770
  justify-content: center;
770
771
  align-items: center;
771
772
  color: var(--tl-color-text);
773
+ text-shadow: var(--tl-text-outline);
772
774
  line-height: inherit;
773
775
  position: absolute;
774
776
  inset: 0px;
@@ -968,14 +970,6 @@ input,
968
970
  display: block;
969
971
  }
970
972
 
971
- .tl-text__outline {
972
- text-shadow: var(--tl-text-outline);
973
- }
974
-
975
- .tl-text__no-outline {
976
- text-shadow: none;
977
- }
978
-
979
973
  /* --------------------- Loading -------------------- */
980
974
 
981
975
  .tl-loading {
@@ -1140,12 +1134,14 @@ input,
1140
1134
  fill: none;
1141
1135
  }
1142
1136
 
1143
- .tl-container[data-coarse='true'] .tl-handle__bg:active {
1144
- fill: var(--tl-color-selection-fill);
1145
- }
1137
+ @media (pointer: coarse) {
1138
+ .tl-handle__bg:active {
1139
+ fill: var(--tl-color-selection-fill);
1140
+ }
1146
1141
 
1147
- .tl-container[data-coarse='true'] .tl-handle__create {
1148
- opacity: 1;
1142
+ .tl-handle__create {
1143
+ opacity: 1;
1144
+ }
1149
1145
  }
1150
1146
 
1151
1147
  .tl-rotate-corner:not(:hover),
@@ -1221,6 +1217,7 @@ input,
1221
1217
  align-items: center;
1222
1218
  text-align: center;
1223
1219
  color: var(--tl-color-text);
1220
+ text-shadow: var(--tl-text-outline);
1224
1221
  }
1225
1222
 
1226
1223
  .tl-shape[data-shape-type='arrow'] .tl-text-label__inner {
@@ -1449,6 +1446,7 @@ input,
1449
1446
  }
1450
1447
 
1451
1448
  .tl-note__container > .tl-text-label {
1449
+ text-shadow: none;
1452
1450
  color: currentColor;
1453
1451
  }
1454
1452
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tldraw/editor",
3
3
  "description": "tldraw infinite canvas SDK (editor).",
4
- "version": "4.2.2",
4
+ "version": "4.2.3",
5
5
  "author": {
6
6
  "name": "tldraw Inc.",
7
7
  "email": "hello@tldraw.com"
@@ -47,15 +47,15 @@
47
47
  "context": "yarn run -T tsx ../../internal/scripts/context.ts"
48
48
  },
49
49
  "dependencies": {
50
- "@tiptap/core": "^3.12.1",
51
- "@tiptap/pm": "^3.12.1",
52
- "@tiptap/react": "^3.12.1",
53
- "@tldraw/state": "4.2.2",
54
- "@tldraw/state-react": "4.2.2",
55
- "@tldraw/store": "4.2.2",
56
- "@tldraw/tlschema": "4.2.2",
57
- "@tldraw/utils": "4.2.2",
58
- "@tldraw/validate": "4.2.2",
50
+ "@tiptap/core": "3.6.2",
51
+ "@tiptap/pm": "3.6.2",
52
+ "@tiptap/react": "3.6.2",
53
+ "@tldraw/state": "4.2.3",
54
+ "@tldraw/state-react": "4.2.3",
55
+ "@tldraw/store": "4.2.3",
56
+ "@tldraw/tlschema": "4.2.3",
57
+ "@tldraw/utils": "4.2.3",
58
+ "@tldraw/validate": "4.2.3",
59
59
  "@types/core-js": "^2.5.8",
60
60
  "@use-gesture/react": "^10.3.1",
61
61
  "classnames": "^2.5.1",
@@ -65,22 +65,20 @@
65
65
  "is-plain-object": "^5.0.0"
66
66
  },
67
67
  "peerDependencies": {
68
- "react": "^18.2.0 || ^19.2.1",
69
- "react-dom": "^18.2.0 || ^19.2.1"
68
+ "react": "^18.2.0 || ^19.0.0",
69
+ "react-dom": "^18.2.0 || ^19.0.0"
70
70
  },
71
71
  "devDependencies": {
72
72
  "@peculiar/webcrypto": "^1.5.0",
73
- "@testing-library/dom": "^10.0.0",
74
- "@testing-library/react": "^16.0.0",
73
+ "@testing-library/react": "^15.0.7",
75
74
  "@types/benchmark": "^2.1.5",
76
- "@types/react": "^19.2.7",
77
- "@types/react-dom": "^19.2.3",
75
+ "@types/react": "^18.3.18",
78
76
  "@types/wicg-file-system-access": "^2020.9.8",
79
77
  "benchmark": "^2.1.4",
80
78
  "fake-indexeddb": "^4.0.2",
81
79
  "lazyrepo": "0.0.0-alpha.27",
82
- "react": "^19.2.1",
83
- "react-dom": "^19.2.1",
80
+ "react": "^18.3.1",
81
+ "react-dom": "^18.3.1",
84
82
  "resize-observer-polyfill": "^1.5.1",
85
83
  "vitest": "^3.2.4"
86
84
  },
package/src/index.ts CHANGED
@@ -146,7 +146,6 @@ export {
146
146
  type TLFontFaceSource,
147
147
  } from './lib/editor/managers/FontManager/FontManager'
148
148
  export { HistoryManager } from './lib/editor/managers/HistoryManager/HistoryManager'
149
- export { InputsManager } from './lib/editor/managers/InputsManager/InputsManager'
150
149
  export {
151
150
  ScribbleManager,
152
151
  type ScribbleItem,
@@ -169,7 +168,6 @@ export {
169
168
  type TLMeasureTextOpts,
170
169
  type TLMeasureTextSpanOpts,
171
170
  } from './lib/editor/managers/TextManager/TextManager'
172
- export { TickManager } from './lib/editor/managers/TickManager/TickManager'
173
171
  export { UserPreferencesManager } from './lib/editor/managers/UserPreferencesManager/UserPreferencesManager'
174
172
  export { BaseBoxShapeUtil, type TLBaseBoxShape } from './lib/editor/shapes/BaseBoxShapeUtil'
175
173
  export { GroupShapeUtil } from './lib/editor/shapes/group/GroupShapeUtil'
@@ -180,7 +178,6 @@ export {
180
178
  type TLDragShapesOutInfo,
181
179
  type TLDragShapesOverInfo,
182
180
  type TLDropShapesOverInfo,
183
- type TLEditStartInfo,
184
181
  type TLGeometryOpts,
185
182
  type TLHandleDragInfo,
186
183
  type TLResizeInfo,
@@ -285,7 +282,7 @@ export {
285
282
  type SvgExportDef,
286
283
  } from './lib/editor/types/SvgExportContext'
287
284
  export { getSvgAsImage } from './lib/exports/getSvgAsImage'
288
- export { tlenv, tlenvReactive } from './lib/globals/environment'
285
+ export { tlenv } from './lib/globals/environment'
289
286
  export { tlmenus } from './lib/globals/menus'
290
287
  export { tltime } from './lib/globals/time'
291
288
  export {
@@ -12,7 +12,7 @@ const initialState = { error: null }
12
12
 
13
13
  /** @public */
14
14
  export class ErrorBoundary extends React.Component<
15
- React.PropsWithChildren<TLErrorBoundaryProps>,
15
+ React.PropsWithRef<React.PropsWithChildren<TLErrorBoundaryProps>>,
16
16
  { error: Error | null }
17
17
  > {
18
18
  static getDerivedStateFromError(error: Error) {
@@ -1,9 +1,23 @@
1
1
  import { track } from '@tldraw/state-react'
2
2
  import { modulate } from '@tldraw/utils'
3
+ import { useEffect, useState } from 'react'
3
4
  import { useEditor } from '../hooks/useEditor'
4
5
  import { Geometry2d } from '../primitives/geometry/Geometry2d'
5
6
  import { Group2d } from '../primitives/geometry/Group2d'
6
7
 
8
+ function useTick(isEnabled = true) {
9
+ const [_, setTick] = useState(0)
10
+ const editor = useEditor()
11
+ useEffect(() => {
12
+ if (!isEnabled) return
13
+ const update = () => setTick((tick) => tick + 1)
14
+ editor.on('tick', update)
15
+ return () => {
16
+ editor.off('tick', update)
17
+ }
18
+ }, [editor, isEnabled])
19
+ }
20
+
7
21
  export const GeometryDebuggingView = track(function GeometryDebuggingView({
8
22
  showStroke = true,
9
23
  showVertices = true,
@@ -15,9 +29,13 @@ export const GeometryDebuggingView = track(function GeometryDebuggingView({
15
29
  }) {
16
30
  const editor = useEditor()
17
31
 
32
+ useTick(showClosestPointOnOutline)
33
+
18
34
  const zoomLevel = editor.getZoomLevel()
19
35
  const renderingShapes = editor.getRenderingShapes()
20
- const currentPagePoint = editor.inputs.getCurrentPagePoint()
36
+ const {
37
+ inputs: { currentPagePoint },
38
+ } = editor
21
39
 
22
40
  return (
23
41
  <svg
@@ -86,7 +86,6 @@ export function DefaultCanvas({ className }: TLCanvasComponentProps) {
86
86
  const transform = `scale(${toDomPrecision(z)}) translate(${toDomPrecision(
87
87
  x + offset
88
88
  )}px,${toDomPrecision(y + offset)}px)`
89
-
90
89
  setStyleProperty(rHtmlLayer.current, 'transform', transform)
91
90
  setStyleProperty(rHtmlLayer2.current, 'transform', transform)
92
91
  },
@@ -210,7 +209,7 @@ function GridWrapper() {
210
209
  function ScribbleWrapper() {
211
210
  const editor = useEditor()
212
211
  const scribbles = useValue('scribbles', () => editor.getInstanceState().scribbles, [editor])
213
- const zoomLevel = useValue('zoomLevel', () => editor.getEfficientZoomLevel(), [editor])
212
+ const zoomLevel = useValue('zoomLevel', () => editor.getZoomLevel(), [editor])
214
213
  const { Scribble } = useEditorComponents()
215
214
 
216
215
  if (!(Scribble && scribbles.length)) return null
@@ -243,7 +242,7 @@ function ZoomBrushWrapper() {
243
242
  function SnapIndicatorWrapper() {
244
243
  const editor = useEditor()
245
244
  const lines = useValue('snapLines', () => editor.snaps.getIndicators(), [editor])
246
- const zoomLevel = useValue('zoomLevel', () => editor.getEfficientZoomLevel(), [editor])
245
+ const zoomLevel = useValue('zoomLevel', () => editor.getZoomLevel(), [editor])
247
246
  const { SnapIndicator } = useEditorComponents()
248
247
 
249
248
  if (!(SnapIndicator && lines.length > 0)) return null
@@ -284,7 +283,7 @@ function HandlesWrapperInner({ shapeId }: { shapeId: TLShapeId }) {
284
283
  const editor = useEditor()
285
284
  const { Handles } = useEditorComponents()
286
285
 
287
- const zoomLevel = useValue('zoomLevel', () => editor.getEfficientZoomLevel(), [editor])
286
+ const zoomLevel = useValue('zoomLevel', () => editor.getZoomLevel(), [editor])
288
287
 
289
288
  const isCoarse = useValue('coarse pointer', () => editor.getInstanceState().isCoarsePointer, [
290
289
  editor,
@@ -31,3 +31,5 @@ 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
@@ -6,25 +6,25 @@ import {
6
6
  Rectangle2d,
7
7
  ShapeUtil,
8
8
  T,
9
- TLShape,
9
+ TLBaseShape,
10
10
  createShapeId,
11
11
  createTLStore,
12
12
  } from '../..'
13
13
  import { Editor } from './Editor'
14
14
  import { StateNode } from './tools/StateNode'
15
15
 
16
- const MY_CUSTOM_SHAPE_TYPE = 'my-custom-shape'
17
-
18
- declare module '@tldraw/tlschema' {
19
- export interface TLGlobalShapePropsMap {
20
- [MY_CUSTOM_SHAPE_TYPE]: { w: number; h: number; text: string | undefined; isFilled: boolean }
16
+ type ICustomShape = TLBaseShape<
17
+ 'my-custom-shape',
18
+ {
19
+ w: number
20
+ h: number
21
+ text: string | undefined
22
+ isFilled: boolean
21
23
  }
22
- }
23
-
24
- type ICustomShape = TLShape<typeof MY_CUSTOM_SHAPE_TYPE>
24
+ >
25
25
 
26
26
  class CustomShape extends ShapeUtil<ICustomShape> {
27
- static override type = MY_CUSTOM_SHAPE_TYPE
27
+ static override type = 'my-custom-shape' as const
28
28
  static override props: RecordProps<ICustomShape> = {
29
29
  w: T.number,
30
30
  h: T.number,
@@ -925,146 +925,6 @@ 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
-
1068
928
  describe('setTool', () => {
1069
929
  class CustomToolA extends StateNode {
1070
930
  static override id = 'custom-tool-a'