tldraw 4.2.0-next.f100cedfc45b → 4.3.0-canary.03ae87dcc44b

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 (268) hide show
  1. package/dist-cjs/index.d.ts +17 -7
  2. package/dist-cjs/index.js +1 -1
  3. package/dist-cjs/lib/bindings/arrow/ArrowBindingUtil.js.map +2 -2
  4. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +5 -2
  5. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
  6. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  7. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  8. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
  9. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  10. package/dist-cjs/lib/shapes/arrow/elbow/elbowArrowSnapLines.js.map +2 -2
  11. package/dist-cjs/lib/shapes/arrow/shared.js.map +2 -2
  12. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  13. package/dist-cjs/lib/shapes/bookmark/bookmarks.js.map +2 -2
  14. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +2 -2
  15. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
  16. package/dist-cjs/lib/shapes/frame/FrameShapeTool.js.map +1 -1
  17. package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js +63 -36
  18. package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js.map +2 -2
  19. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
  20. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
  21. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +3 -3
  22. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  23. package/dist-cjs/lib/shapes/note/noteHelpers.js.map +2 -2
  24. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
  25. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +2 -2
  26. package/dist-cjs/lib/shapes/shared/ShapeFill.js +3 -0
  27. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  28. package/dist-cjs/lib/shapes/shared/crop.js +1 -0
  29. package/dist-cjs/lib/shapes/shared/crop.js.map +2 -2
  30. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  31. package/dist-cjs/lib/shapes/shared/useEditableRichText.js.map +2 -2
  32. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
  33. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  34. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  35. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +1 -4
  36. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
  37. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
  38. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
  39. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +15 -7
  40. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  41. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
  42. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +2 -2
  43. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  44. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
  45. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
  46. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
  47. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  48. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
  49. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  50. package/dist-cjs/lib/ui/components/Dialogs.js +2 -14
  51. package/dist-cjs/lib/ui/components/Dialogs.js.map +2 -2
  52. package/dist-cjs/lib/ui/components/EditLinkDialog.js +11 -1
  53. package/dist-cjs/lib/ui/components/EditLinkDialog.js.map +2 -2
  54. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +5 -4
  55. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  56. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  57. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbarContent.js +2 -1
  58. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbarContent.js.map +2 -2
  59. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  60. package/dist-cjs/lib/ui/components/primitives/Button/TldrawUiButton.js +2 -2
  61. package/dist-cjs/lib/ui/components/primitives/Button/TldrawUiButton.js.map +2 -2
  62. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +2 -1
  63. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  64. package/dist-cjs/lib/ui/context/actions.js +17 -2
  65. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  66. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  67. package/dist-cjs/lib/ui/hooks/menu-hooks.js.map +2 -2
  68. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +18 -16
  69. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +3 -3
  70. package/dist-cjs/lib/ui/hooks/useFlatten.js.map +2 -2
  71. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  72. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  73. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +1 -0
  74. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  75. package/dist-cjs/lib/ui/hooks/useTranslation/useTranslation.js +1 -0
  76. package/dist-cjs/lib/ui/hooks/useTranslation/useTranslation.js.map +2 -2
  77. package/dist-cjs/lib/ui/version.js +3 -3
  78. package/dist-cjs/lib/ui/version.js.map +1 -1
  79. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +8 -0
  80. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  81. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  82. package/dist-cjs/lib/utils/frames/frames.js.map +2 -2
  83. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  84. package/dist-esm/index.d.mts +17 -7
  85. package/dist-esm/index.mjs +1 -1
  86. package/dist-esm/lib/bindings/arrow/ArrowBindingUtil.mjs.map +2 -2
  87. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +6 -2
  88. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
  89. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  90. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  91. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  92. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  93. package/dist-esm/lib/shapes/arrow/elbow/elbowArrowSnapLines.mjs.map +2 -2
  94. package/dist-esm/lib/shapes/arrow/shared.mjs.map +2 -2
  95. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  96. package/dist-esm/lib/shapes/bookmark/bookmarks.mjs.map +2 -2
  97. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +2 -2
  98. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
  99. package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs.map +1 -1
  100. package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs +65 -38
  101. package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs.map +2 -2
  102. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
  103. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
  104. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +5 -5
  105. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  106. package/dist-esm/lib/shapes/note/noteHelpers.mjs.map +2 -2
  107. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  108. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  109. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +3 -0
  110. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  111. package/dist-esm/lib/shapes/shared/crop.mjs +1 -0
  112. package/dist-esm/lib/shapes/shared/crop.mjs.map +2 -2
  113. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  114. package/dist-esm/lib/shapes/shared/useEditableRichText.mjs.map +2 -2
  115. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
  116. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  117. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +1 -4
  118. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  119. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +1 -4
  120. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
  121. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
  122. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
  123. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +15 -7
  124. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  125. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
  126. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +2 -2
  127. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  128. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
  129. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +1 -4
  130. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
  131. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
  132. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  133. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
  134. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  135. package/dist-esm/lib/ui/components/Dialogs.mjs +2 -14
  136. package/dist-esm/lib/ui/components/Dialogs.mjs.map +2 -2
  137. package/dist-esm/lib/ui/components/EditLinkDialog.mjs +11 -1
  138. package/dist-esm/lib/ui/components/EditLinkDialog.mjs.map +2 -2
  139. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +5 -5
  140. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  141. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  142. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbarContent.mjs +2 -1
  143. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbarContent.mjs.map +2 -2
  144. package/dist-esm/lib/ui/components/menu-items.mjs +1 -4
  145. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  146. package/dist-esm/lib/ui/components/primitives/Button/TldrawUiButton.mjs +2 -2
  147. package/dist-esm/lib/ui/components/primitives/Button/TldrawUiButton.mjs.map +2 -2
  148. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +2 -1
  149. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  150. package/dist-esm/lib/ui/context/actions.mjs +17 -2
  151. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  152. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  153. package/dist-esm/lib/ui/hooks/menu-hooks.mjs +1 -4
  154. package/dist-esm/lib/ui/hooks/menu-hooks.mjs.map +2 -2
  155. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +18 -16
  156. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +3 -3
  157. package/dist-esm/lib/ui/hooks/useFlatten.mjs.map +2 -2
  158. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  159. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +1 -0
  160. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  161. package/dist-esm/lib/ui/hooks/useTranslation/useTranslation.mjs +1 -0
  162. package/dist-esm/lib/ui/hooks/useTranslation/useTranslation.mjs.map +2 -2
  163. package/dist-esm/lib/ui/version.mjs +3 -3
  164. package/dist-esm/lib/ui/version.mjs.map +1 -1
  165. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +8 -0
  166. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  167. package/dist-esm/lib/utils/export/exportAs.mjs +1 -3
  168. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  169. package/dist-esm/lib/utils/frames/frames.mjs.map +2 -2
  170. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  171. package/package.json +10 -10
  172. package/src/lib/bindings/arrow/ArrowBindingUtil.ts +1 -1
  173. package/src/lib/canvas/TldrawSelectionForeground.tsx +18 -7
  174. package/src/lib/defaultExternalContentHandlers.ts +3 -4
  175. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +2 -2
  176. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +1 -1
  177. package/src/lib/shapes/arrow/arrowLabel.ts +1 -1
  178. package/src/lib/shapes/arrow/arrowTargetState.ts +1 -1
  179. package/src/lib/shapes/arrow/elbow/elbowArrowSnapLines.tsx +3 -3
  180. package/src/lib/shapes/arrow/shared.ts +4 -4
  181. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +1 -1
  182. package/src/lib/shapes/bookmark/bookmarks.ts +3 -3
  183. package/src/lib/shapes/draw/toolStates/Drawing.ts +4 -4
  184. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  185. package/src/lib/shapes/frame/FrameShapeTool.ts +1 -1
  186. package/src/lib/shapes/frame/components/FrameLabelInput.tsx +48 -24
  187. package/src/lib/shapes/geo/GeoShapeUtil.test.tsx +10 -2
  188. package/src/lib/shapes/geo/toolStates/Pointing.ts +3 -3
  189. package/src/lib/shapes/line/LineShapeTool.test.ts +6 -6
  190. package/src/lib/shapes/line/LineShapeUtil.test.tsx +5 -5
  191. package/src/lib/shapes/line/toolStates/Pointing.ts +1 -1
  192. package/src/lib/shapes/note/NoteShapeTool.test.ts +2 -1
  193. package/src/lib/shapes/note/NoteShapeUtil.tsx +6 -5
  194. package/src/lib/shapes/note/noteHelpers.ts +2 -2
  195. package/src/lib/shapes/shared/PlainTextLabel.tsx +2 -1
  196. package/src/lib/shapes/shared/RichTextLabel.tsx +2 -1
  197. package/src/lib/shapes/shared/ShapeFill.tsx +3 -0
  198. package/src/lib/shapes/shared/crop.ts +1 -0
  199. package/src/lib/shapes/shared/useEditablePlainText.ts +7 -3
  200. package/src/lib/shapes/shared/useEditableRichText.ts +7 -3
  201. package/src/lib/shapes/text/TextShapeTool.test.ts +4 -4
  202. package/src/lib/shapes/text/toolStates/Pointing.ts +1 -1
  203. package/src/lib/tools/EraserTool/childStates/Erasing.ts +3 -5
  204. package/src/lib/tools/EraserTool/childStates/Pointing.ts +3 -16
  205. package/src/lib/tools/SelectTool/DragAndDropManager.ts +2 -4
  206. package/src/lib/tools/SelectTool/childStates/Brushing.ts +2 -6
  207. package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +2 -3
  208. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +23 -15
  209. package/src/lib/tools/SelectTool/childStates/EditingShape.ts +2 -4
  210. package/src/lib/tools/SelectTool/childStates/Idle.ts +8 -12
  211. package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +1 -1
  212. package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +4 -12
  213. package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +2 -2
  214. package/src/lib/tools/SelectTool/childStates/Resizing.ts +2 -4
  215. package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +2 -4
  216. package/src/lib/tools/SelectTool/childStates/Translating.ts +1 -3
  217. package/src/lib/ui/components/Dialogs.tsx +2 -14
  218. package/src/lib/ui/components/EditLinkDialog.tsx +16 -6
  219. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +6 -5
  220. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +2 -2
  221. package/src/lib/ui/components/Toolbar/DefaultRichTextToolbarContent.tsx +4 -1
  222. package/src/lib/ui/components/menu-items.tsx +6 -14
  223. package/src/lib/ui/components/primitives/Button/TldrawUiButton.tsx +3 -2
  224. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +1 -0
  225. package/src/lib/ui/context/actions.tsx +25 -13
  226. package/src/lib/ui/context/events.tsx +1 -0
  227. package/src/lib/ui/hooks/menu-hooks.ts +9 -19
  228. package/src/lib/ui/hooks/useClipboardEvents.ts +12 -9
  229. package/src/lib/ui/hooks/useFlatten.ts +1 -2
  230. package/src/lib/ui/hooks/useTools.tsx +1 -2
  231. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +1 -0
  232. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +1 -0
  233. package/src/lib/ui/hooks/useTranslation/useTranslation.tsx +2 -1
  234. package/src/lib/ui/version.ts +3 -3
  235. package/src/lib/ui.css +4 -6
  236. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +8 -0
  237. package/src/lib/utils/export/exportAs.ts +2 -9
  238. package/src/lib/utils/frames/frames.ts +1 -1
  239. package/src/lib/utils/tldr/buildFromV1Document.ts +12 -17
  240. package/src/test/Editor.test.tsx +38 -12
  241. package/src/test/SelectTool.test.ts +11 -19
  242. package/src/test/TestEditor.ts +1 -4
  243. package/src/test/TldrawEditor.test.tsx +87 -40
  244. package/src/test/bindings.test.tsx +29 -25
  245. package/src/test/bindingsIndex.test.tsx +4 -4
  246. package/src/test/commands/createShape.test.ts +64 -0
  247. package/src/test/commands/createShapes.test.ts +15 -1
  248. package/src/test/commands/getSvgString.test.ts +2 -2
  249. package/src/test/commands/isShapeOfType.test.ts +44 -0
  250. package/src/test/commands/putContent.test.ts +1 -0
  251. package/src/test/commands/updateShape.test.ts +67 -0
  252. package/src/test/commands/updateShapes.test.ts +21 -5
  253. package/src/test/custom-clipping.test.ts +36 -35
  254. package/src/test/customSnapping.test.tsx +254 -54
  255. package/src/test/duplicate.test.ts +1 -1
  256. package/src/test/frames.test.ts +2 -2
  257. package/src/test/getCulledShapes.test.tsx +11 -3
  258. package/src/test/getShapeAtPoint.test.ts +2 -2
  259. package/src/test/groups.test.tsx +6 -3
  260. package/src/test/resizing.test.ts +9 -13
  261. package/src/test/selection-omnibus.test.ts +11 -11
  262. package/src/test/shapeutils.test.ts +1 -1
  263. package/src/test/styles2.test.tsx +1 -1
  264. package/src/test/styles3.test.ts +5 -5
  265. package/src/test/test-jsx.tsx +69 -57
  266. package/src/test/text.test.ts +15 -17
  267. package/src/test/translating.test.ts +6 -8
  268. package/tldraw.css +4 -6
@@ -6,10 +6,7 @@ import {
6
6
  HALF_PI,
7
7
  PageRecordType,
8
8
  Result,
9
- TLBookmarkShape,
10
9
  TLEmbedShape,
11
- TLFrameShape,
12
- TLGroupShape,
13
10
  TLImageShape,
14
11
  TLShape,
15
12
  TLShapeId,
@@ -327,7 +324,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
327
324
  .getSelectedShapes()
328
325
  .filter(
329
326
  (shape): shape is TLTextShape =>
330
- editor.isShapeOfType<TLTextShape>(shape, 'text') && shape.props.autoSize === false
327
+ editor.isShapeOfType(shape, 'text') && shape.props.autoSize === false
331
328
  )
332
329
  editor.updateShapes(
333
330
  shapes.map((shape) => {
@@ -362,7 +359,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
362
359
  return
363
360
  }
364
361
  const shape = editor.getShape(ids[0])
365
- if (!shape || !editor.isShapeOfType<TLEmbedShape>(shape, 'embed')) {
362
+ if (!shape || !editor.isShapeOfType(shape, 'embed')) {
366
363
  console.error(warnMsg)
367
364
  return
368
365
  }
@@ -401,8 +398,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
401
398
  const creationPromises: Promise<Result<any, any>>[] = []
402
399
 
403
400
  for (const shape of shapes) {
404
- if (!shape || !editor.isShapeOfType<TLEmbedShape>(shape, 'embed') || !shape.props.url)
405
- continue
401
+ if (!shape || !editor.isShapeOfType(shape, 'embed') || !shape.props.url) continue
406
402
 
407
403
  const center = editor.getShapePageBounds(shape)?.center
408
404
 
@@ -441,7 +437,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
441
437
  const createList: TLShapePartial[] = []
442
438
  const deleteList: TLShapeId[] = []
443
439
  for (const shape of shapes) {
444
- if (!editor.isShapeOfType<TLBookmarkShape>(shape, 'bookmark')) continue
440
+ if (!editor.isShapeOfType(shape, 'bookmark')) continue
445
441
 
446
442
  const { url } = shape.props
447
443
 
@@ -552,7 +548,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
552
548
 
553
549
  trackEvent('group-shapes', { source })
554
550
  const onlySelectedShape = editor.getOnlySelectedShape()
555
- if (onlySelectedShape && editor.isShapeOfType<TLGroupShape>(onlySelectedShape, 'group')) {
551
+ if (onlySelectedShape && editor.isShapeOfType(onlySelectedShape, 'group')) {
556
552
  editor.markHistoryStoppingPoint('ungroup')
557
553
  editor.ungroupShapes(editor.getSelectedShapeIds())
558
554
  } else {
@@ -572,7 +568,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
572
568
  const selectedShapes = editor.getSelectedShapes()
573
569
  if (
574
570
  selectedShapes.length > 0 &&
575
- selectedShapes.every((shape) => editor.isShapeOfType<TLFrameShape>(shape, 'frame'))
571
+ selectedShapes.every((shape) => editor.isShapeOfType(shape, 'frame'))
576
572
  ) {
577
573
  editor.markHistoryStoppingPoint('remove-frame')
578
574
  removeFrame(
@@ -590,7 +586,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
590
586
 
591
587
  trackEvent('fit-frame-to-content', { source })
592
588
  const onlySelectedShape = editor.getOnlySelectedShape()
593
- if (onlySelectedShape && editor.isShapeOfType<TLFrameShape>(onlySelectedShape, 'frame')) {
589
+ if (onlySelectedShape && editor.isShapeOfType(onlySelectedShape, 'frame')) {
594
590
  editor.markHistoryStoppingPoint('fit-frame-to-content')
595
591
  fitFrameToContent(editor, onlySelectedShape.id)
596
592
  }
@@ -1495,6 +1491,22 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
1495
1491
  trackEvent('set-style', { source, id: style.id, value: 'fill' })
1496
1492
  },
1497
1493
  },
1494
+ {
1495
+ id: 'select-fill-lined-fill',
1496
+ label: 'fill-style.lined-fill',
1497
+ kbd: 'alt+shift+f',
1498
+ onSelect(source) {
1499
+ const style = DefaultFillStyle
1500
+ editor.run(() => {
1501
+ editor.markHistoryStoppingPoint('change-fill')
1502
+ if (editor.isIn('select')) {
1503
+ editor.setStyleForSelectedShapes(style, 'lined-fill')
1504
+ }
1505
+ editor.setStyleForNextShapes(style, 'lined-fill')
1506
+ })
1507
+ trackEvent('set-style', { source, id: style.id, value: 'lined-fill' })
1508
+ },
1509
+ },
1498
1510
  {
1499
1511
  id: 'flatten-to-image',
1500
1512
  label: 'action.flatten-to-image',
@@ -1583,8 +1595,8 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
1583
1595
  const onlySelectedShape = editor.getOnlySelectedShape()
1584
1596
  if (
1585
1597
  onlySelectedShape &&
1586
- (editor.isShapeOfType<TLImageShape>(onlySelectedShape, 'image') ||
1587
- editor.isShapeOfType<TLVideoShape>(onlySelectedShape, 'video'))
1598
+ (editor.isShapeOfType(onlySelectedShape, 'image') ||
1599
+ editor.isShapeOfType(onlySelectedShape, 'video'))
1588
1600
  ) {
1589
1601
  const firstToolbarButton = editor
1590
1602
  .getContainer()
@@ -24,6 +24,7 @@ export type TLUiEventSource =
24
24
  | 'rich-text-menu'
25
25
  | 'image-toolbar'
26
26
  | 'video-toolbar'
27
+ | 'fairy-panel'
27
28
  | 'unknown'
28
29
 
29
30
  /** @public */
@@ -1,14 +1,4 @@
1
- import {
2
- Editor,
3
- TLArrowShape,
4
- TLDrawShape,
5
- TLGroupShape,
6
- TLImageShape,
7
- TLLineShape,
8
- TLTextShape,
9
- useEditor,
10
- useValue,
11
- } from '@tldraw/editor'
1
+ import { Editor, useEditor, useValue } from '@tldraw/editor'
12
2
  import { getArrowBindings } from '../../shapes/arrow/shared'
13
3
 
14
4
  function shapesWithUnboundArrows(editor: Editor) {
@@ -19,7 +9,7 @@ function shapesWithUnboundArrows(editor: Editor) {
19
9
 
20
10
  return selectedShapes.filter((shape) => {
21
11
  if (!shape) return false
22
- if (editor.isShapeOfType<TLArrowShape>(shape, 'arrow')) {
12
+ if (editor.isShapeOfType(shape, 'arrow')) {
23
13
  const bindings = getArrowBindings(editor, shape)
24
14
  if (bindings.start || bindings.end) return false
25
15
  }
@@ -52,7 +42,7 @@ export const useAllowGroup = () => {
52
42
  if (selectedShapes.length < 2) return false
53
43
 
54
44
  for (const shape of selectedShapes) {
55
- if (editor.isShapeOfType<TLArrowShape>(shape, 'arrow')) {
45
+ if (editor.isShapeOfType(shape, 'arrow')) {
56
46
  const bindings = getArrowBindings(editor, shape)
57
47
  if (bindings.start) {
58
48
  // if the other shape is not among the selected shapes...
@@ -163,7 +153,7 @@ export function useShowAutoSizeToggle() {
163
153
  const selectedShapes = editor.getSelectedShapes()
164
154
  return (
165
155
  selectedShapes.length === 1 &&
166
- editor.isShapeOfType<TLTextShape>(selectedShapes[0], 'text') &&
156
+ editor.isShapeOfType(selectedShapes[0], 'text') &&
167
157
  selectedShapes[0].props.autoSize === false
168
158
  )
169
159
  },
@@ -196,11 +186,11 @@ export function useOnlyFlippableShape() {
196
186
  const shape = editor.getOnlySelectedShape()
197
187
  return (
198
188
  shape &&
199
- (editor.isShapeOfType<TLGroupShape>(shape, 'group') ||
200
- editor.isShapeOfType<TLImageShape>(shape, 'image') ||
201
- editor.isShapeOfType<TLArrowShape>(shape, 'arrow') ||
202
- editor.isShapeOfType<TLLineShape>(shape, 'line') ||
203
- editor.isShapeOfType<TLDrawShape>(shape, 'draw'))
189
+ (editor.isShapeOfType(shape, 'group') ||
190
+ editor.isShapeOfType(shape, 'image') ||
191
+ editor.isShapeOfType(shape, 'arrow') ||
192
+ editor.isShapeOfType(shape, 'line') ||
193
+ editor.isShapeOfType(shape, 'draw'))
204
194
  )
205
195
  },
206
196
  [editor]
@@ -586,6 +586,8 @@ async function handleClipboardThings(editor: Editor, things: ClipboardThing[], p
586
586
  * @public
587
587
  */
588
588
  const handleNativeOrMenuCopy = async (editor: Editor) => {
589
+ const navigator =
590
+ editor.getContainer().ownerDocument?.defaultView?.navigator ?? globalThis.navigator
589
591
  const content = await editor.resolveAssetsInContent(
590
592
  editor.getContentFromCurrentPage(editor.getSelectedShapeIds())
591
593
  )
@@ -713,6 +715,7 @@ export function useMenuClipboardEvents() {
713
715
  /** @public */
714
716
  export function useNativeClipboardEvents() {
715
717
  const editor = useEditor()
718
+ const ownerDocument = editor.getContainer().ownerDocument
716
719
  const trackEvent = useUiEvents()
717
720
 
718
721
  const appIsFocused = useValue('editor.isFocused', () => editor.getInstanceState().isFocused, [
@@ -817,16 +820,16 @@ export function useNativeClipboardEvents() {
817
820
  trackEvent('paste', { source: 'kbd' })
818
821
  }
819
822
 
820
- document.addEventListener('copy', copy)
821
- document.addEventListener('cut', cut)
822
- document.addEventListener('paste', paste)
823
- document.addEventListener('pointerup', pointerUpHandler)
823
+ ownerDocument?.addEventListener('copy', copy)
824
+ ownerDocument?.addEventListener('cut', cut)
825
+ ownerDocument?.addEventListener('paste', paste)
826
+ ownerDocument?.addEventListener('pointerup', pointerUpHandler)
824
827
 
825
828
  return () => {
826
- document.removeEventListener('copy', copy)
827
- document.removeEventListener('cut', cut)
828
- document.removeEventListener('paste', paste)
829
- document.removeEventListener('pointerup', pointerUpHandler)
829
+ ownerDocument?.removeEventListener('copy', copy)
830
+ ownerDocument?.removeEventListener('cut', cut)
831
+ ownerDocument?.removeEventListener('paste', paste)
832
+ ownerDocument?.removeEventListener('pointerup', pointerUpHandler)
830
833
  }
831
- }, [editor, trackEvent, appIsFocused])
834
+ }, [editor, trackEvent, appIsFocused, ownerDocument])
832
835
  }
@@ -3,7 +3,6 @@ import {
3
3
  Editor,
4
4
  IndexKey,
5
5
  TLImageAsset,
6
- TLImageShape,
7
6
  TLShape,
8
7
  TLShapeId,
9
8
  Vec,
@@ -166,7 +165,7 @@ export async function flattenShapesToImages(
166
165
  const shapeId = createShapeId()
167
166
 
168
167
  // create an image shape in the same place as the shapes
169
- editor.createShape<TLImageShape>({
168
+ editor.createShape({
170
169
  id: shapeId,
171
170
  type: 'image',
172
171
  index,
@@ -4,7 +4,6 @@ import {
4
4
  Editor,
5
5
  GeoShapeGeoStyle,
6
6
  getIndicesBetween,
7
- TLLineShape,
8
7
  TLPointerEventInfo,
9
8
  TLShapeId,
10
9
  toRichText,
@@ -195,7 +194,7 @@ export function ToolsProvider({ overrides, children }: TLUiToolsProviderProps) {
195
194
  onDragFromToolbarToCreateShape(editor, info, {
196
195
  createShape: (id) => {
197
196
  const [start, end] = getIndicesBetween(null, null, 2)
198
- editor.createShape<TLLineShape>({
197
+ editor.createShape({
199
198
  id,
200
199
  type: 'line',
201
200
  props: {
@@ -154,6 +154,7 @@ export type TLUiTranslationKey =
154
154
  | 'fill-style.solid'
155
155
  | 'fill-style.pattern'
156
156
  | 'fill-style.fill'
157
+ | 'fill-style.lined-fill'
157
158
  | 'dash-style.dashed'
158
159
  | 'dash-style.dotted'
159
160
  | 'dash-style.draw'
@@ -155,6 +155,7 @@ export const DEFAULT_TRANSLATION = {
155
155
  'fill-style.solid': 'Solid',
156
156
  'fill-style.pattern': 'Pattern',
157
157
  'fill-style.fill': 'Fill',
158
+ 'fill-style.lined-fill': 'Lined fill',
158
159
  'dash-style.dashed': 'Dashed',
159
160
  'dash-style.dotted': 'Dotted',
160
161
  'dash-style.draw': 'Draw',
@@ -23,7 +23,8 @@ export interface TLUiTranslationProviderProps {
23
23
  /** @public */
24
24
  export type TLUiTranslationContextType = TLUiTranslation
25
25
 
26
- const TranslationsContext = React.createContext<TLUiTranslationContextType | null>(null)
26
+ /** @internal */
27
+ export const TranslationsContext = React.createContext<TLUiTranslationContextType | null>(null)
27
28
 
28
29
  /** @public */
29
30
  export function useCurrentTranslation() {
@@ -1,9 +1,9 @@
1
1
  // This file is automatically generated by internal/scripts/refresh-assets.ts.
2
2
  // Do not edit manually. Or do, I'm a comment, not a cop.
3
3
 
4
- export const version = '4.2.0-next.f100cedfc45b'
4
+ export const version = '4.3.0-canary.03ae87dcc44b'
5
5
  export const publishDates = {
6
6
  major: '2025-09-18T14:39:22.803Z',
7
- minor: '2025-10-29T17:33:15.385Z',
8
- patch: '2025-10-29T17:33:15.385Z',
7
+ minor: '2025-11-25T07:20:55.099Z',
8
+ patch: '2025-11-25T07:20:55.099Z',
9
9
  }
package/src/lib/ui.css CHANGED
@@ -514,12 +514,10 @@
514
514
  /* If mobile use 16px as font size */
515
515
  /* On iOS, font size under 16px in an input will make the page zoom into the input 🤦‍♂️ */
516
516
  /* https://css-tricks.com/16px-or-larger-text-prevents-ios-form-zoom/ */
517
- @media (max-width: 600px) {
518
- @supports (-webkit-touch-callout: none) {
519
- /* CSS specific to iOS devices */
520
- .tlui-input {
521
- font-size: 16px;
522
- }
517
+ @supports (-webkit-touch-callout: none) {
518
+ /* CSS specific to iOS devices */
519
+ .tlui-input {
520
+ font-size: 16px;
523
521
  }
524
522
  }
525
523
 
@@ -133,6 +133,7 @@ export async function putExcalidrawContent(
133
133
  ...base,
134
134
  type: 'geo',
135
135
  props: {
136
+ ...editor.getShapeUtil('geo').getDefaultProps(),
136
137
  geo: element.type,
137
138
  url: element.link ?? '',
138
139
  w: element.width,
@@ -152,6 +153,7 @@ export async function putExcalidrawContent(
152
153
  ...base,
153
154
  type: 'draw',
154
155
  props: {
156
+ ...editor.getShapeUtil('draw').getDefaultProps(),
155
157
  dash: getDash(element),
156
158
  size: strokeWidthsToSizes[element.strokeWidth],
157
159
  color: colorsToColors[element.strokeColor] ?? 'black',
@@ -180,6 +182,7 @@ export async function putExcalidrawContent(
180
182
  ...base,
181
183
  type: 'line',
182
184
  props: {
185
+ ...editor.getShapeUtil('line').getDefaultProps(),
183
186
  dash: getDash(element),
184
187
  size: strokeWidthsToSizes[element.strokeWidth],
185
188
  color: colorsToColors[element.strokeColor] ?? 'black',
@@ -221,6 +224,7 @@ export async function putExcalidrawContent(
221
224
  ...base,
222
225
  type: 'arrow',
223
226
  props: {
227
+ ...editor.getShapeUtil('arrow').getDefaultProps(),
224
228
  richText: toRichText(text),
225
229
  kind: element.elbowed ? 'elbow' : 'arc',
226
230
  bend: getBend(element, start, end),
@@ -243,6 +247,7 @@ export async function putExcalidrawContent(
243
247
  toId: startTargetId,
244
248
  props: {
245
249
  terminal: 'start',
250
+ snap: 'none',
246
251
  normalizedAnchor: { x: 0.5, y: 0.5 },
247
252
  isPrecise: false,
248
253
  isExact: false,
@@ -259,6 +264,7 @@ export async function putExcalidrawContent(
259
264
  toId: endTargetId,
260
265
  props: {
261
266
  terminal: 'end',
267
+ snap: 'none',
262
268
  normalizedAnchor: { x: 0.5, y: 0.5 },
263
269
  isPrecise: false,
264
270
  isExact: false,
@@ -275,6 +281,7 @@ export async function putExcalidrawContent(
275
281
  ...base,
276
282
  type: 'text',
277
283
  props: {
284
+ ...editor.getShapeUtil('text').getDefaultProps(),
278
285
  size,
279
286
  scale,
280
287
  font: fontFamilyToFontType[element.fontFamily] ?? 'draw',
@@ -310,6 +317,7 @@ export async function putExcalidrawContent(
310
317
  ...base,
311
318
  type: 'image',
312
319
  props: {
320
+ ...editor.getShapeUtil('image').getDefaultProps(),
313
321
  w: element.width,
314
322
  h: element.height,
315
323
  assetId,
@@ -1,11 +1,4 @@
1
- import {
2
- Editor,
3
- sanitizeId,
4
- TLExportType,
5
- TLFrameShape,
6
- TLImageExportOptions,
7
- TLShapeId,
8
- } from '@tldraw/editor'
1
+ import { Editor, sanitizeId, TLExportType, TLImageExportOptions, TLShapeId } from '@tldraw/editor'
9
2
 
10
3
  /** @public */
11
4
  export interface ExportAsOptions extends TLImageExportOptions {
@@ -35,7 +28,7 @@ export async function exportAs(
35
28
  name = `shapes at ${getTimestamp()}`
36
29
  if (ids.length === 1) {
37
30
  const first = editor.getShape(ids[0])!
38
- if (editor.isShapeOfType<TLFrameShape>(first, 'frame')) {
31
+ if (editor.isShapeOfType(first, 'frame')) {
39
32
  name = first.props.name || 'frame'
40
33
  } else {
41
34
  name = `${sanitizeId(first.id)} at ${getTimestamp()}`
@@ -22,7 +22,7 @@ export function removeFrame(editor: Editor, ids: TLShapeId[]) {
22
22
  const frames = compact(
23
23
  ids
24
24
  .map((id) => editor.getShape<TLFrameShape>(id))
25
- .filter((f) => f && editor.isShapeOfType<TLFrameShape>(f, 'frame'))
25
+ .filter((f) => f && editor.isShapeOfType(f, 'frame'))
26
26
  )
27
27
  if (!frames.length) return
28
28
 
@@ -12,14 +12,9 @@ import {
12
12
  TLDefaultHorizontalAlignStyle,
13
13
  TLDefaultSizeStyle,
14
14
  TLDefaultTextAlignStyle,
15
- TLDrawShape,
16
15
  TLGeoShape,
17
- TLImageShape,
18
- TLNoteShape,
19
16
  TLPageId,
20
17
  TLShapeId,
21
- TLTextShape,
22
- TLVideoShape,
23
18
  Vec,
24
19
  VecModel,
25
20
  clamp,
@@ -187,7 +182,7 @@ export function buildFromV1Document(editor: Editor, _document: unknown) {
187
182
 
188
183
  switch (v1Shape.type) {
189
184
  case TLV1ShapeType.Sticky: {
190
- editor.createShapes<TLNoteShape>([
185
+ editor.createShapes([
191
186
  {
192
187
  ...inCommon,
193
188
  type: 'note',
@@ -203,7 +198,7 @@ export function buildFromV1Document(editor: Editor, _document: unknown) {
203
198
  break
204
199
  }
205
200
  case TLV1ShapeType.Rectangle: {
206
- editor.createShapes<TLGeoShape>([
201
+ editor.createShapes([
207
202
  {
208
203
  ...inCommon,
209
204
  type: 'geo',
@@ -225,7 +220,7 @@ export function buildFromV1Document(editor: Editor, _document: unknown) {
225
220
 
226
221
  const pageBoundsBeforeLabel = editor.getShapePageBounds(inCommon.id)!
227
222
 
228
- editor.updateShapes<TLGeoShape>([
223
+ editor.updateShapes([
229
224
  {
230
225
  id: inCommon.id,
231
226
  type: 'geo',
@@ -259,7 +254,7 @@ export function buildFromV1Document(editor: Editor, _document: unknown) {
259
254
  break
260
255
  }
261
256
  case TLV1ShapeType.Triangle: {
262
- editor.createShapes<TLGeoShape>([
257
+ editor.createShapes([
263
258
  {
264
259
  ...inCommon,
265
260
  type: 'geo',
@@ -280,7 +275,7 @@ export function buildFromV1Document(editor: Editor, _document: unknown) {
280
275
 
281
276
  const pageBoundsBeforeLabel = editor.getShapePageBounds(inCommon.id)!
282
277
 
283
- editor.updateShapes<TLGeoShape>([
278
+ editor.updateShapes([
284
279
  {
285
280
  id: inCommon.id,
286
281
  type: 'geo',
@@ -314,7 +309,7 @@ export function buildFromV1Document(editor: Editor, _document: unknown) {
314
309
  break
315
310
  }
316
311
  case TLV1ShapeType.Ellipse: {
317
- editor.createShapes<TLGeoShape>([
312
+ editor.createShapes([
318
313
  {
319
314
  ...inCommon,
320
315
  type: 'geo',
@@ -335,7 +330,7 @@ export function buildFromV1Document(editor: Editor, _document: unknown) {
335
330
 
336
331
  const pageBoundsBeforeLabel = editor.getShapePageBounds(inCommon.id)!
337
332
 
338
- editor.updateShapes<TLGeoShape>([
333
+ editor.updateShapes([
339
334
  {
340
335
  id: inCommon.id,
341
336
  type: 'geo',
@@ -375,7 +370,7 @@ export function buildFromV1Document(editor: Editor, _document: unknown) {
375
370
  break
376
371
  }
377
372
 
378
- editor.createShapes<TLDrawShape>([
373
+ editor.createShapes([
379
374
  {
380
375
  ...inCommon,
381
376
  type: 'draw',
@@ -400,7 +395,7 @@ export function buildFromV1Document(editor: Editor, _document: unknown) {
400
395
  const v2Bend = (dist * -v1Bend) / 2
401
396
 
402
397
  // Could also be a line... but we'll use it as an arrow anyway
403
- editor.createShapes<TLArrowShape>([
398
+ editor.createShapes([
404
399
  {
405
400
  ...inCommon,
406
401
  type: 'arrow',
@@ -429,7 +424,7 @@ export function buildFromV1Document(editor: Editor, _document: unknown) {
429
424
  break
430
425
  }
431
426
  case TLV1ShapeType.Text: {
432
- editor.createShapes<TLTextShape>([
427
+ editor.createShapes([
433
428
  {
434
429
  ...inCommon,
435
430
  type: 'text',
@@ -453,7 +448,7 @@ export function buildFromV1Document(editor: Editor, _document: unknown) {
453
448
  return
454
449
  }
455
450
 
456
- editor.createShapes<TLImageShape>([
451
+ editor.createShapes([
457
452
  {
458
453
  ...inCommon,
459
454
  type: 'image',
@@ -474,7 +469,7 @@ export function buildFromV1Document(editor: Editor, _document: unknown) {
474
469
  return
475
470
  }
476
471
 
477
- editor.createShapes<TLVideoShape>([
472
+ editor.createShapes([
478
473
  {
479
474
  ...inCommon,
480
475
  type: 'video',
@@ -472,12 +472,20 @@ describe('isFocused', () => {
472
472
  })
473
473
  })
474
474
 
475
+ const BLORG_TYPE = 'blorg'
476
+
477
+ declare module '@tldraw/tlschema' {
478
+ export interface TLGlobalShapePropsMap {
479
+ [BLORG_TYPE]: { w: number; h: number }
480
+ }
481
+ }
482
+
475
483
  describe('getShapeUtil', () => {
476
484
  let myUtil: any
477
485
 
478
486
  beforeEach(() => {
479
487
  class _MyFakeShapeUtil extends BaseBoxShapeUtil<any> {
480
- static override type = 'blorg'
488
+ static override type = BLORG_TYPE
481
489
 
482
490
  getDefaultProps() {
483
491
  return {
@@ -519,16 +527,22 @@ describe('getShapeUtil', () => {
519
527
  })
520
528
 
521
529
  it('throws if that shape type isnt registered', () => {
522
- const myMissingShape = { type: 'missing' } as TLShape
523
- expect(() => editor.getShapeUtil(myMissingShape)).toThrowErrorMatchingInlineSnapshot(
524
- `[Error: No shape util found for type "missing"]`
525
- )
530
+ const myMissingShape = { type: 'missing' }
531
+ expect(() =>
532
+ editor.getShapeUtil(
533
+ // @ts-expect-error
534
+ myMissingShape
535
+ )
536
+ ).toThrowErrorMatchingInlineSnapshot(`[Error: No shape util found for type "missing"]`)
526
537
  })
527
538
 
528
539
  it('throws if that type isnt registered', () => {
529
- expect(() => editor.getShapeUtil('missing')).toThrowErrorMatchingInlineSnapshot(
530
- `[Error: No shape util found for type "missing"]`
531
- )
540
+ expect(() =>
541
+ editor.getShapeUtil(
542
+ // @ts-expect-error
543
+ 'missing'
544
+ )
545
+ ).toThrowErrorMatchingInlineSnapshot(`[Error: No shape util found for type "missing"]`)
532
546
  })
533
547
  })
534
548
 
@@ -866,9 +880,19 @@ describe('instance.isReadonly', () => {
866
880
  })
867
881
  })
868
882
 
883
+ const MY_CUSTOM_SHAPE_TYPE = 'myCustomShape'
884
+
885
+ type MyCustomShape = TLShape<typeof MY_CUSTOM_SHAPE_TYPE>
886
+
887
+ declare module '@tldraw/tlschema' {
888
+ export interface TLGlobalShapePropsMap {
889
+ [MY_CUSTOM_SHAPE_TYPE]: { w: number; h: number }
890
+ }
891
+ }
892
+
869
893
  describe('the geometry cache', () => {
870
- class CustomShapeUtil extends BaseBoxShapeUtil<any> {
871
- static override type = 'custom'
894
+ class CustomShapeUtil extends BaseBoxShapeUtil<MyCustomShape> {
895
+ static override type = MY_CUSTOM_SHAPE_TYPE
872
896
 
873
897
  getDefaultProps() {
874
898
  return {
@@ -894,9 +918,11 @@ describe('the geometry cache', () => {
894
918
  editor = new TestEditor({
895
919
  shapeUtils: [CustomShapeUtil],
896
920
  })
897
- const { A } = editor.createShapesFromJsx([<TL.custom ref="A" x={0} y={0} w={100} h={100} />])
921
+ const { A } = editor.createShapesFromJsx([
922
+ <TL.myCustomShape ref="A" x={0} y={0} w={100} h={100} />,
923
+ ])
898
924
  expect(editor.getShapePageBounds(A)!.width).toBe(100)
899
- editor.updateShape({ id: A, type: 'custom', meta: { double: true } })
925
+ editor.updateShape({ id: A, type: 'myCustomShape', meta: { double: true } })
900
926
  expect(editor.getShapePageBounds(A)!.width).toBe(200)
901
927
  })
902
928
  })