tldraw 5.2.0-next.e2b8d10bf10e → 5.2.0

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 (420) hide show
  1. package/DOCS.md +20294 -0
  2. package/README.md +13 -1
  3. package/RELEASE_NOTES.md +2908 -0
  4. package/dist-cjs/index.d.ts +110 -23
  5. package/dist-cjs/index.js +3 -3
  6. package/dist-cjs/index.js.map +2 -2
  7. package/dist-cjs/lib/TldrawImage.js +0 -1
  8. package/dist-cjs/lib/TldrawImage.js.map +2 -2
  9. package/dist-cjs/lib/bindings/arrow/ArrowBindingUtil.js +2 -1
  10. package/dist-cjs/lib/bindings/arrow/ArrowBindingUtil.js.map +2 -2
  11. package/dist-cjs/lib/defaultEmbedDefinitions.js +3 -2
  12. package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
  13. package/dist-cjs/lib/defaultOverlayUtils.js +11 -11
  14. package/dist-cjs/lib/defaultOverlayUtils.js.map +2 -2
  15. package/dist-cjs/lib/overlays/SelectionForegroundOverlayUtil.js +76 -64
  16. package/dist-cjs/lib/overlays/SelectionForegroundOverlayUtil.js.map +2 -2
  17. package/dist-cjs/lib/overlays/ShapeHandleOverlayUtil.js +1 -1
  18. package/dist-cjs/lib/overlays/ShapeHandleOverlayUtil.js.map +2 -2
  19. package/dist-cjs/lib/overlays/ShapeIndicatorOverlayUtil.js +107 -0
  20. package/dist-cjs/lib/overlays/ShapeIndicatorOverlayUtil.js.map +7 -0
  21. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +3 -0
  22. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  23. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +12 -3
  24. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
  25. package/dist-cjs/lib/shapes/bookmark/bookmarks.js +54 -6
  26. package/dist-cjs/lib/shapes/bookmark/bookmarks.js.map +2 -2
  27. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +2 -1
  28. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  29. package/dist-cjs/lib/shapes/draw/getPath.js +1 -1
  30. package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
  31. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +45 -47
  32. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +2 -2
  33. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +2 -1
  34. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
  35. package/dist-cjs/lib/shapes/frame/FrameShapeTool.js +23 -18
  36. package/dist-cjs/lib/shapes/frame/FrameShapeTool.js.map +2 -2
  37. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +1 -1
  38. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  39. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +3 -0
  40. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
  41. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +11 -7
  42. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  43. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +3 -11
  44. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
  45. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +5 -1
  46. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
  47. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +31 -41
  48. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  49. package/dist-cjs/lib/shapes/note/noteHelpers.js +1 -1
  50. package/dist-cjs/lib/shapes/note/noteHelpers.js.map +2 -2
  51. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +28 -6
  52. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
  53. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +3 -2
  54. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
  55. package/dist-cjs/lib/shapes/shared/RichTextLabel.js +3 -3
  56. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +2 -2
  57. package/dist-cjs/lib/shapes/shared/defaultStyleDefs.js +17 -3
  58. package/dist-cjs/lib/shapes/shared/defaultStyleDefs.js.map +2 -2
  59. package/dist-cjs/lib/shapes/shared/freehand/core.js +424 -0
  60. package/dist-cjs/lib/shapes/shared/freehand/core.js.map +7 -0
  61. package/dist-cjs/lib/shapes/shared/freehand/fmt.js +106 -0
  62. package/dist-cjs/lib/shapes/shared/freehand/fmt.js.map +7 -0
  63. package/dist-cjs/lib/shapes/shared/freehand/getStroke.js +6 -6
  64. package/dist-cjs/lib/shapes/shared/freehand/getStroke.js.map +2 -2
  65. package/dist-cjs/lib/shapes/shared/freehand/getStrokeOutlinePoints.js +320 -86
  66. package/dist-cjs/lib/shapes/shared/freehand/getStrokeOutlinePoints.js.map +3 -3
  67. package/dist-cjs/lib/shapes/shared/freehand/getStrokePoints.js +20 -96
  68. package/dist-cjs/lib/shapes/shared/freehand/getStrokePoints.js.map +3 -3
  69. package/dist-cjs/lib/shapes/shared/freehand/svg.js +55 -19
  70. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  71. package/dist-cjs/lib/shapes/shared/freehand/svgInk.js +189 -97
  72. package/dist-cjs/lib/shapes/shared/freehand/svgInk.js.map +3 -3
  73. package/dist-cjs/lib/shapes/shared/freehand/types.js.map +1 -1
  74. package/dist-cjs/lib/shapes/shared/interpolate-props.js +6 -2
  75. package/dist-cjs/lib/shapes/shared/interpolate-props.js.map +2 -2
  76. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +3 -0
  77. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
  78. package/dist-cjs/lib/tools/HandTool/HandTool.js +16 -6
  79. package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
  80. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +10 -1
  81. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +2 -2
  82. package/dist-cjs/lib/tools/HandTool/childStates/OneFingerZooming.js +84 -0
  83. package/dist-cjs/lib/tools/HandTool/childStates/OneFingerZooming.js.map +7 -0
  84. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +12 -0
  85. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  86. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +4 -0
  87. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
  88. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +107 -46
  89. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  90. package/dist-cjs/lib/ui/TldrawUi.js +4 -3
  91. package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
  92. package/dist-cjs/lib/ui/components/A11y.js +2 -0
  93. package/dist-cjs/lib/ui/components/A11y.js.map +2 -2
  94. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +14 -1
  95. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
  96. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenuContent.js +0 -6
  97. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenuContent.js.map +2 -2
  98. package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +2 -2
  99. package/dist-cjs/lib/ui/components/Dialogs.js +17 -37
  100. package/dist-cjs/lib/ui/components/Dialogs.js.map +2 -2
  101. package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js +19 -4
  102. package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js.map +2 -2
  103. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +12 -2
  104. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +2 -2
  105. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +47 -70
  106. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
  107. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +25 -46
  108. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  109. package/dist-cjs/lib/ui/components/SharePanel/DefaultPeopleMenuAvatar.js.map +2 -2
  110. package/dist-cjs/lib/ui/components/SharePanel/DefaultPeopleMenuContent.js.map +2 -2
  111. package/dist-cjs/lib/ui/components/SharePanel/DefaultPeopleMenuFacePile.js.map +2 -2
  112. package/dist-cjs/lib/ui/components/SharePanel/DefaultPeopleMenuItem.js +1 -1
  113. package/dist-cjs/lib/ui/components/SharePanel/DefaultPeopleMenuItem.js.map +2 -2
  114. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js +1 -0
  115. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js.map +2 -2
  116. package/dist-cjs/lib/ui/components/menu-items.js +7 -0
  117. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  118. package/dist-cjs/lib/ui/components/primitives/TldrawUiDropdownMenu.js +2 -1
  119. package/dist-cjs/lib/ui/components/primitives/TldrawUiDropdownMenu.js.map +2 -2
  120. package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js +14 -3
  121. package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js.map +2 -2
  122. package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js +2 -0
  123. package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js.map +2 -2
  124. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +2 -0
  125. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +2 -2
  126. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js +0 -2
  127. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js.map +2 -2
  128. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuSubmenu.js +1 -2
  129. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuSubmenu.js.map +2 -2
  130. package/dist-cjs/lib/ui/context/actions.js +70 -1
  131. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  132. package/dist-cjs/lib/ui/context/asset-urls.js +5 -8
  133. package/dist-cjs/lib/ui/context/asset-urls.js.map +2 -2
  134. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  135. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +13 -0
  136. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
  137. package/dist-cjs/lib/ui/hooks/useTools.js +1 -1
  138. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  139. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  140. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +2 -0
  141. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  142. package/dist-cjs/lib/ui/version.js +3 -3
  143. package/dist-cjs/lib/ui/version.js.map +1 -1
  144. package/dist-cjs/lib/utils/embeds/embeds.js +4 -4
  145. package/dist-cjs/lib/utils/embeds/embeds.js.map +2 -2
  146. package/dist-cjs/lib/utils/test-helpers.js +2 -2
  147. package/dist-cjs/lib/utils/test-helpers.js.map +2 -2
  148. package/dist-cjs/lib/utils/text/richText.js +3 -1
  149. package/dist-cjs/lib/utils/text/richText.js.map +2 -2
  150. package/dist-esm/index.d.mts +110 -23
  151. package/dist-esm/index.mjs +5 -3
  152. package/dist-esm/index.mjs.map +2 -2
  153. package/dist-esm/lib/TldrawImage.mjs +0 -1
  154. package/dist-esm/lib/TldrawImage.mjs.map +2 -2
  155. package/dist-esm/lib/bindings/arrow/ArrowBindingUtil.mjs +2 -1
  156. package/dist-esm/lib/bindings/arrow/ArrowBindingUtil.mjs.map +2 -2
  157. package/dist-esm/lib/defaultEmbedDefinitions.mjs +3 -2
  158. package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
  159. package/dist-esm/lib/defaultOverlayUtils.mjs +11 -11
  160. package/dist-esm/lib/defaultOverlayUtils.mjs.map +2 -2
  161. package/dist-esm/lib/overlays/SelectionForegroundOverlayUtil.mjs +77 -65
  162. package/dist-esm/lib/overlays/SelectionForegroundOverlayUtil.mjs.map +2 -2
  163. package/dist-esm/lib/overlays/ShapeHandleOverlayUtil.mjs +1 -1
  164. package/dist-esm/lib/overlays/ShapeHandleOverlayUtil.mjs.map +2 -2
  165. package/dist-esm/lib/overlays/ShapeIndicatorOverlayUtil.mjs +87 -0
  166. package/dist-esm/lib/overlays/ShapeIndicatorOverlayUtil.mjs.map +7 -0
  167. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +9 -1
  168. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  169. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +15 -3
  170. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  171. package/dist-esm/lib/shapes/bookmark/bookmarks.mjs +54 -6
  172. package/dist-esm/lib/shapes/bookmark/bookmarks.mjs.map +2 -2
  173. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +3 -1
  174. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  175. package/dist-esm/lib/shapes/draw/getPath.mjs +1 -1
  176. package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
  177. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +46 -47
  178. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +2 -2
  179. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +2 -1
  180. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
  181. package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs +23 -18
  182. package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs.map +2 -2
  183. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +2 -1
  184. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  185. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +4 -0
  186. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
  187. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +12 -7
  188. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  189. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +3 -11
  190. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
  191. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +6 -1
  192. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
  193. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +32 -42
  194. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  195. package/dist-esm/lib/shapes/note/noteHelpers.mjs +1 -1
  196. package/dist-esm/lib/shapes/note/noteHelpers.mjs.map +2 -2
  197. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +29 -6
  198. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
  199. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +3 -2
  200. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  201. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +4 -3
  202. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  203. package/dist-esm/lib/shapes/shared/defaultStyleDefs.mjs +17 -3
  204. package/dist-esm/lib/shapes/shared/defaultStyleDefs.mjs.map +2 -2
  205. package/dist-esm/lib/shapes/shared/freehand/core.mjs +404 -0
  206. package/dist-esm/lib/shapes/shared/freehand/core.mjs.map +7 -0
  207. package/dist-esm/lib/shapes/shared/freehand/fmt.mjs +86 -0
  208. package/dist-esm/lib/shapes/shared/freehand/fmt.mjs.map +7 -0
  209. package/dist-esm/lib/shapes/shared/freehand/getStroke.mjs +7 -7
  210. package/dist-esm/lib/shapes/shared/freehand/getStroke.mjs.map +2 -2
  211. package/dist-esm/lib/shapes/shared/freehand/getStrokeOutlinePoints.mjs +332 -86
  212. package/dist-esm/lib/shapes/shared/freehand/getStrokeOutlinePoints.mjs.map +3 -3
  213. package/dist-esm/lib/shapes/shared/freehand/getStrokePoints.mjs +31 -96
  214. package/dist-esm/lib/shapes/shared/freehand/getStrokePoints.mjs.map +3 -3
  215. package/dist-esm/lib/shapes/shared/freehand/svg.mjs +55 -19
  216. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  217. package/dist-esm/lib/shapes/shared/freehand/svgInk.mjs +214 -99
  218. package/dist-esm/lib/shapes/shared/freehand/svgInk.mjs.map +3 -3
  219. package/dist-esm/lib/shapes/shared/interpolate-props.mjs +6 -2
  220. package/dist-esm/lib/shapes/shared/interpolate-props.mjs.map +2 -2
  221. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +4 -0
  222. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
  223. package/dist-esm/lib/tools/HandTool/HandTool.mjs +16 -6
  224. package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
  225. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +10 -1
  226. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +2 -2
  227. package/dist-esm/lib/tools/HandTool/childStates/OneFingerZooming.mjs +64 -0
  228. package/dist-esm/lib/tools/HandTool/childStates/OneFingerZooming.mjs.map +7 -0
  229. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +12 -0
  230. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  231. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +4 -0
  232. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
  233. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +108 -46
  234. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  235. package/dist-esm/lib/ui/TldrawUi.mjs +4 -3
  236. package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
  237. package/dist-esm/lib/ui/components/A11y.mjs +2 -0
  238. package/dist-esm/lib/ui/components/A11y.mjs.map +2 -2
  239. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +21 -2
  240. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
  241. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenuContent.mjs +0 -6
  242. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenuContent.mjs.map +2 -2
  243. package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +2 -2
  244. package/dist-esm/lib/ui/components/Dialogs.mjs +19 -39
  245. package/dist-esm/lib/ui/components/Dialogs.mjs.map +2 -2
  246. package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs +20 -5
  247. package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs.map +2 -2
  248. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +12 -2
  249. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +2 -2
  250. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +47 -70
  251. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
  252. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +25 -46
  253. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  254. package/dist-esm/lib/ui/components/SharePanel/DefaultPeopleMenuAvatar.mjs.map +2 -2
  255. package/dist-esm/lib/ui/components/SharePanel/DefaultPeopleMenuContent.mjs.map +2 -2
  256. package/dist-esm/lib/ui/components/SharePanel/DefaultPeopleMenuFacePile.mjs.map +2 -2
  257. package/dist-esm/lib/ui/components/SharePanel/DefaultPeopleMenuItem.mjs +1 -1
  258. package/dist-esm/lib/ui/components/SharePanel/DefaultPeopleMenuItem.mjs.map +2 -2
  259. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs +1 -0
  260. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs.map +2 -2
  261. package/dist-esm/lib/ui/components/menu-items.mjs +7 -0
  262. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  263. package/dist-esm/lib/ui/components/primitives/TldrawUiDropdownMenu.mjs +2 -1
  264. package/dist-esm/lib/ui/components/primitives/TldrawUiDropdownMenu.mjs.map +2 -2
  265. package/dist-esm/lib/ui/components/primitives/TldrawUiIcon.mjs +14 -3
  266. package/dist-esm/lib/ui/components/primitives/TldrawUiIcon.mjs.map +2 -2
  267. package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs +2 -0
  268. package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs.map +2 -2
  269. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +2 -0
  270. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  271. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs +0 -2
  272. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs.map +2 -2
  273. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuSubmenu.mjs +1 -2
  274. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuSubmenu.mjs.map +2 -2
  275. package/dist-esm/lib/ui/context/actions.mjs +71 -1
  276. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  277. package/dist-esm/lib/ui/context/asset-urls.mjs +5 -8
  278. package/dist-esm/lib/ui/context/asset-urls.mjs.map +2 -2
  279. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  280. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +13 -0
  281. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
  282. package/dist-esm/lib/ui/hooks/useTools.mjs +1 -1
  283. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  284. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +2 -0
  285. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  286. package/dist-esm/lib/ui/version.mjs +3 -3
  287. package/dist-esm/lib/ui/version.mjs.map +1 -1
  288. package/dist-esm/lib/utils/embeds/embeds.mjs +4 -4
  289. package/dist-esm/lib/utils/embeds/embeds.mjs.map +2 -2
  290. package/dist-esm/lib/utils/test-helpers.mjs +2 -2
  291. package/dist-esm/lib/utils/test-helpers.mjs.map +2 -2
  292. package/dist-esm/lib/utils/text/richText.mjs +3 -1
  293. package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
  294. package/package.json +11 -6
  295. package/src/index.ts +6 -1
  296. package/src/lib/TldrawImage.tsx +2 -2
  297. package/src/lib/bindings/arrow/ArrowBindingUtil.ts +5 -1
  298. package/src/lib/defaultEmbedDefinitions.ts +28 -6
  299. package/src/lib/defaultOverlayUtils.ts +11 -11
  300. package/src/lib/overlays/SelectionForegroundOverlayUtil.ts +91 -72
  301. package/src/lib/overlays/ShapeHandleOverlayUtil.ts +3 -1
  302. package/src/lib/overlays/ShapeIndicatorOverlayUtil.ts +133 -0
  303. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +11 -1
  304. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +16 -3
  305. package/src/lib/shapes/bookmark/bookmarks.ts +105 -15
  306. package/src/lib/shapes/draw/DrawShapeUtil.tsx +7 -5
  307. package/src/lib/shapes/draw/getPath.ts +1 -1
  308. package/src/lib/shapes/draw/toolStates/Drawing.ts +55 -48
  309. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +14 -4
  310. package/src/lib/shapes/frame/FrameShapeTool.ts +35 -24
  311. package/src/lib/shapes/geo/GeoShapeUtil.test.tsx +46 -0
  312. package/src/lib/shapes/geo/GeoShapeUtil.tsx +2 -1
  313. package/src/lib/shapes/geo/toolStates/Pointing.ts +5 -0
  314. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +14 -11
  315. package/src/lib/shapes/image/ImageShapeUtil.tsx +7 -11
  316. package/src/lib/shapes/line/LineShapeTool.test.ts +41 -0
  317. package/src/lib/shapes/line/toolStates/Pointing.ts +12 -2
  318. package/src/lib/shapes/note/NoteShapeUtil.tsx +36 -51
  319. package/src/lib/shapes/note/noteCloning.test.ts +5 -5
  320. package/src/lib/shapes/note/noteHelpers.ts +1 -1
  321. package/src/lib/shapes/note/toolStates/Pointing.ts +40 -7
  322. package/src/lib/shapes/shared/PlainTextLabel.tsx +3 -3
  323. package/src/lib/shapes/shared/RichTextLabel.tsx +4 -3
  324. package/src/lib/shapes/shared/defaultStyleDefs.tsx +25 -3
  325. package/src/lib/shapes/shared/freehand/core.ts +547 -0
  326. package/src/lib/shapes/shared/freehand/fmt.ts +106 -0
  327. package/src/lib/shapes/shared/freehand/getStroke.ts +7 -7
  328. package/src/lib/shapes/shared/freehand/getStrokeOutlinePoints.ts +451 -139
  329. package/src/lib/shapes/shared/freehand/getStrokePoints.ts +33 -153
  330. package/src/lib/shapes/shared/freehand/svg.ts +72 -23
  331. package/src/lib/shapes/shared/freehand/svgInk.ts +281 -136
  332. package/src/lib/shapes/shared/freehand/types.ts +0 -1
  333. package/src/lib/shapes/shared/interpolate-props.ts +6 -2
  334. package/src/lib/shapes/text/toolStates/Pointing.ts +5 -0
  335. package/src/lib/tools/HandTool/HandTool.ts +19 -6
  336. package/src/lib/tools/HandTool/childStates/Dragging.ts +17 -1
  337. package/src/lib/tools/HandTool/childStates/OneFingerZooming.ts +79 -0
  338. package/src/lib/tools/SelectTool/childStates/Idle.ts +16 -2
  339. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +8 -0
  340. package/src/lib/tools/SelectTool/childStates/Resizing.ts +137 -49
  341. package/src/lib/ui/TldrawUi.tsx +3 -3
  342. package/src/lib/ui/components/A11y.tsx +2 -0
  343. package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +32 -2
  344. package/src/lib/ui/components/ContextMenu/DefaultContextMenuContent.tsx +5 -6
  345. package/src/lib/ui/components/DefaultFollowingIndicator.tsx +2 -2
  346. package/src/lib/ui/components/Dialogs.tsx +20 -23
  347. package/src/lib/ui/components/HelperButtons/BackToContent.tsx +32 -4
  348. package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +10 -0
  349. package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +60 -74
  350. package/src/lib/ui/components/Minimap/MinimapManager.ts +35 -57
  351. package/src/lib/ui/components/SharePanel/DefaultPeopleMenuAvatar.tsx +2 -2
  352. package/src/lib/ui/components/SharePanel/DefaultPeopleMenuContent.tsx +2 -1
  353. package/src/lib/ui/components/SharePanel/DefaultPeopleMenuFacePile.tsx +2 -1
  354. package/src/lib/ui/components/SharePanel/DefaultPeopleMenuItem.tsx +3 -3
  355. package/src/lib/ui/components/StylePanel/StylePanelButtonPicker.tsx +5 -0
  356. package/src/lib/ui/components/menu-items.tsx +9 -0
  357. package/src/lib/ui/components/primitives/TldrawUiDropdownMenu.tsx +3 -1
  358. package/src/lib/ui/components/primitives/TldrawUiIcon.tsx +15 -3
  359. package/src/lib/ui/components/primitives/TldrawUiInput.tsx +4 -0
  360. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +7 -0
  361. package/src/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.tsx +0 -2
  362. package/src/lib/ui/components/primitives/menus/TldrawUiMenuSubmenu.tsx +0 -1
  363. package/src/lib/ui/context/actions.tsx +88 -1
  364. package/src/lib/ui/context/asset-urls.tsx +9 -8
  365. package/src/lib/ui/context/events.tsx +2 -0
  366. package/src/lib/ui/hooks/useKeyboardShortcuts.ts +45 -7
  367. package/src/lib/ui/hooks/useTools.tsx +7 -1
  368. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +2 -0
  369. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +2 -0
  370. package/src/lib/ui/version.ts +3 -3
  371. package/src/lib/ui.css +20 -9
  372. package/src/lib/utils/embeds/embeds.test.ts +14 -12
  373. package/src/lib/utils/embeds/embeds.ts +10 -4
  374. package/src/lib/utils/test-helpers.ts +3 -3
  375. package/src/lib/utils/text/richText.test.ts +36 -0
  376. package/src/lib/utils/text/richText.ts +9 -1
  377. package/src/test/HandTool.test.ts +93 -0
  378. package/src/test/ImageShapeUtil.test.ts +88 -0
  379. package/src/test/SelectTool.test.ts +102 -1
  380. package/src/test/__snapshots__/drawing.test.ts.snap +2 -1
  381. package/src/test/attribution.test.ts +40 -29
  382. package/src/test/bookmark-shapes.test.ts +256 -28
  383. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +2 -2
  384. package/src/test/commands/clipboardCallbacks.test.ts +3 -1
  385. package/src/test/commands/getSvgString.test.ts +30 -0
  386. package/src/test/commands/penmode.test.ts +97 -1
  387. package/src/test/commands/setCamera.test.ts +12 -0
  388. package/src/test/dragFromToolbar.test.ts +67 -0
  389. package/src/test/drawing.test.ts +48 -7
  390. package/src/test/frames.test.ts +72 -0
  391. package/src/test/freehand/corpus/presets.ts +71 -0
  392. package/src/test/freehand/corpus/real.ts +370 -0
  393. package/src/test/freehand/corpus/strokes.ts +50 -0
  394. package/src/test/freehand/svg.test.ts +20 -0
  395. package/src/test/freehand/wellformed.test.ts +30 -0
  396. package/src/test/long-press-create.test.ts +102 -0
  397. package/src/test/overlays/CollaboratorBrushOverlayUtil.test.ts +4 -4
  398. package/src/test/overlays/CollaboratorCursorOverlayUtil.test.ts +18 -18
  399. package/src/test/overlays/CollaboratorHintOverlayUtil.test.ts +7 -7
  400. package/src/test/overlays/CollaboratorScribbleOverlayUtil.test.ts +3 -3
  401. package/src/test/overlays/OverlayManager.test.ts +1 -1
  402. package/src/test/overlays/SelectionForegroundOverlayUtil.test.ts +58 -0
  403. package/src/test/overlays/ShapeHandleOverlayUtil.test.ts +2 -2
  404. package/src/test/overlays/ShapeIndicatorOverlayUtil.test.ts +36 -0
  405. package/src/test/resizing.test.ts +250 -0
  406. package/src/test/right-click-context-menu.test.ts +90 -0
  407. package/src/test/rightClickPanning.test.ts +11 -0
  408. package/src/test/selection-omnibus.test.ts +15 -2
  409. package/src/test/spatialIndex.test.ts +132 -0
  410. package/src/test/translating.test.ts +0 -6
  411. package/src/test/ui/ContextMenu.test.tsx +146 -3
  412. package/src/test/ui/Dialogs.test.tsx +256 -0
  413. package/src/test/ui/copyHoveredStyles.test.tsx +154 -0
  414. package/src/test/ui/keyboardShortcuts.test.tsx +266 -0
  415. package/tldraw.css +35 -12
  416. package/dist-cjs/lib/shapes/shared/freehand/setStrokePointRadii.js +0 -100
  417. package/dist-cjs/lib/shapes/shared/freehand/setStrokePointRadii.js.map +0 -7
  418. package/dist-esm/lib/shapes/shared/freehand/setStrokePointRadii.mjs +0 -80
  419. package/dist-esm/lib/shapes/shared/freehand/setStrokePointRadii.mjs.map +0 -7
  420. package/src/lib/shapes/shared/freehand/setStrokePointRadii.ts +0 -127
@@ -78,7 +78,7 @@ for (const toolType of ['draw', 'highlight'] as const) {
78
78
  const segment = shape.props.segments[0]
79
79
  expect(segment.type).toBe('straight')
80
80
 
81
- const points = base64ToPoints(segment.path)
81
+ const points = base64ToPoints(segment.path, segment.dim)
82
82
  expect(points.length).toBe(2)
83
83
  })
84
84
 
@@ -177,7 +177,7 @@ for (const toolType of ['draw', 'highlight'] as const) {
177
177
 
178
178
  const shape = editor.getCurrentPageShapes()[0] as DrawableShape
179
179
  const segment = shape.props.segments[0]
180
- const points = base64ToPoints(segment.path)
180
+ const points = base64ToPoints(segment.path, segment.dim)
181
181
  expect(points[1].x).toBeCloseTo(snappedX)
182
182
  expect(points[1].y).toBeCloseTo(snappedY)
183
183
  })
@@ -201,7 +201,7 @@ for (const toolType of ['draw', 'highlight'] as const) {
201
201
 
202
202
  const shape = editor.getCurrentPageShapes()[0] as DrawableShape
203
203
  const segment = shape.props.segments[0]
204
- const points = base64ToPoints(segment.path)
204
+ const points = base64ToPoints(segment.path, segment.dim)
205
205
  expect(points[1].x).toBeCloseTo(x)
206
206
  expect(points[1].y).toBeCloseTo(y)
207
207
  })
@@ -221,14 +221,14 @@ for (const toolType of ['draw', 'highlight'] as const) {
221
221
 
222
222
  const shape1 = editor.getCurrentPageShapes()[0] as DrawableShape
223
223
  const segment1 = last(shape1.props.segments)!
224
- const points1 = base64ToPoints(segment1.path)
224
+ const points1 = base64ToPoints(segment1.path, segment1.dim)
225
225
  const point1 = last(points1)!
226
226
  expect(point1.x).toBe(1)
227
227
 
228
228
  editor.keyDown('Meta')
229
229
  const shape2 = editor.getCurrentPageShapes()[0] as DrawableShape
230
230
  const segment2 = last(shape2.props.segments)!
231
- const points2 = base64ToPoints(segment2.path)
231
+ const points2 = base64ToPoints(segment2.path, segment2.dim)
232
232
  const point2 = last(points2)!
233
233
  expect(point2.x).toBe(0)
234
234
  })
@@ -248,14 +248,14 @@ for (const toolType of ['draw', 'highlight'] as const) {
248
248
 
249
249
  const shape1 = editor.getCurrentPageShapes()[0] as DrawableShape
250
250
  const segment1 = last(shape1.props.segments)!
251
- const points1 = base64ToPoints(segment1.path)
251
+ const points1 = base64ToPoints(segment1.path, segment1.dim)
252
252
  const point1 = last(points1)!
253
253
  expect(point1.x).toBe(1)
254
254
 
255
255
  editor.keyDown('Meta')
256
256
  const shape2 = editor.getCurrentPageShapes()[0] as DrawableShape
257
257
  const segment2 = last(shape2.props.segments)!
258
- const points2 = base64ToPoints(segment2.path)
258
+ const points2 = base64ToPoints(segment2.path, segment2.dim)
259
259
  const point2 = last(points2)!
260
260
  expect(point2.x).toBe(0)
261
261
  })
@@ -276,6 +276,47 @@ for (const toolType of ['draw', 'highlight'] as const) {
276
276
  const shape = editor.getCurrentPageShapes()[0] as DrawableShape
277
277
  expect(shape.props.segments.length).toBe(1)
278
278
  })
279
+
280
+ describe('chooses the segment encoding from the input device', () => {
281
+ const getFirstSegment = () => {
282
+ const shape = editor.getCurrentPageShapes()[0] as DrawableShape
283
+ return shape.props.segments[0]
284
+ }
285
+
286
+ it('drops pressure (2D) for a non-pressure device like a mouse', () => {
287
+ editor.setCurrentTool(toolType).pointerDown(0, 0).pointerMove(10, 10).pointerMove(20, 5)
288
+
289
+ const segment = getFirstSegment()
290
+ expect(segment.dim).toBe(2)
291
+
292
+ const zs = base64ToPoints(segment.path, segment.dim).map((p) => p.z!)
293
+ expect(zs.every((z) => Math.abs(z - 0.5) < 0.01)).toBe(true)
294
+ })
295
+
296
+ it('keeps full 3D and preserves varying pressure for a pen', () => {
297
+ editor
298
+ .setCurrentTool(toolType)
299
+ .pointerDown(0, 0, { isPen: true, point: { x: 0, y: 0, z: 0.3 } })
300
+ .pointerMove(10, 10, { isPen: true, point: { x: 10, y: 10, z: 0.6 } })
301
+ .pointerMove(20, 5, { isPen: true, point: { x: 20, y: 5, z: 0.9 } })
302
+
303
+ const segment = getFirstSegment()
304
+ expect(segment.dim).toBeUndefined()
305
+
306
+ const zs = base64ToPoints(segment.path, segment.dim).map((p) => p.z!)
307
+ expect(zs.some((z) => Math.abs(z - 0.5) > 0.01)).toBe(true)
308
+ expect(new Set(zs.map((z) => z.toFixed(2))).size).toBeGreaterThan(1)
309
+ })
310
+
311
+ it('keeps 3D for a stylus that reports as a mouse (pressure that is not the fabricated 0.5)', () => {
312
+ editor
313
+ .setCurrentTool(toolType)
314
+ .pointerDown(0, 0, { point: { x: 0, y: 0, z: 0.7 } })
315
+ .pointerMove(10, 10, { point: { x: 10, y: 10, z: 0.7 } })
316
+
317
+ expect(getFirstSegment().dim).toBeUndefined()
318
+ })
319
+ })
279
320
  })
280
321
  }
281
322
 
@@ -156,6 +156,78 @@ describe('creating frames', () => {
156
156
  expect(parent).toBe('page:page')
157
157
  })
158
158
 
159
+ it('hints the shapes that would be enclosed while drag-creating a frame', () => {
160
+ const boxA = createRect({ pos: [10, 10], size: [20, 20] })
161
+ const boxB = createRect({ pos: [60, 60], size: [20, 20] })
162
+
163
+ editor.setCurrentTool('frame')
164
+ editor.pointerDown(0, 0)
165
+
166
+ // The drag rectangle encloses box A only
167
+ editor.pointerMove(40, 40)
168
+ expect(editor.getHintingShapeIds()).toEqual([boxA])
169
+
170
+ // Grown to enclose both boxes
171
+ editor.pointerMove(100, 100)
172
+ expect(editor.getHintingShapeIds()).toEqual([boxA, boxB])
173
+
174
+ // Shrunk back to enclose box A only
175
+ editor.pointerMove(40, 40)
176
+ expect(editor.getHintingShapeIds()).toEqual([boxA])
177
+
178
+ // On pointer up, the hints clear and the hinted shape becomes a child of the frame
179
+ editor.pointerUp(40, 40)
180
+ expect(editor.getHintingShapeIds()).toHaveLength(0)
181
+ const frameId = editor.getOnlySelectedShape()!.id
182
+ expect(editor.getShape(boxA)?.parentId).toBe(frameId)
183
+ expect(editor.getShape(boxB)?.parentId).toBe(editor.getCurrentPageId())
184
+ })
185
+
186
+ it('does not hint shapes that are only partially enclosed', () => {
187
+ createRect({ pos: [10, 10], size: [20, 20] })
188
+
189
+ editor.setCurrentTool('frame')
190
+ editor.pointerDown(0, 0)
191
+ editor.pointerMove(20, 20)
192
+ expect(editor.getHintingShapeIds()).toHaveLength(0)
193
+ })
194
+
195
+ it('does not hint locked shapes', () => {
196
+ const rectId = createRect({ pos: [10, 10], size: [20, 20] })
197
+ editor.updateShape({ id: rectId, type: 'geo', isLocked: true })
198
+
199
+ editor.setCurrentTool('frame')
200
+ editor.pointerDown(0, 0)
201
+ editor.pointerMove(100, 100)
202
+ expect(editor.getHintingShapeIds()).toHaveLength(0)
203
+ })
204
+
205
+ it('clears the hints when the drag is cancelled', () => {
206
+ createRect({ pos: [10, 10], size: [20, 20] })
207
+
208
+ editor.setCurrentTool('frame')
209
+ editor.pointerDown(0, 0)
210
+ editor.pointerMove(100, 100)
211
+ expect(editor.getHintingShapeIds()).toHaveLength(1)
212
+
213
+ editor.cancel()
214
+ expect(editor.getHintingShapeIds()).toHaveLength(0)
215
+ })
216
+
217
+ it('clears the hints between successive frame creations when tool locked', () => {
218
+ editor.updateInstanceState({ isToolLocked: true })
219
+ createRect({ pos: [10, 10], size: [20, 20] })
220
+
221
+ editor.setCurrentTool('frame')
222
+ editor.pointerDown(0, 0)
223
+ editor.pointerMove(100, 100)
224
+ expect(editor.getHintingShapeIds()).toHaveLength(1)
225
+ editor.pointerUp(100, 100)
226
+
227
+ expect(editor.getCurrentToolId()).toBe('frame')
228
+ expect(editor.getHintingShapeIds()).toHaveLength(0)
229
+ })
230
+
159
231
  it('can snap', () => {
160
232
  editor.createShapes([
161
233
  { type: 'geo', id: ids.boxA, x: 0, y: 0, props: { w: 50, h: 50, fill: 'solid' } },
@@ -0,0 +1,71 @@
1
+ import { StrokeOptions } from '../../../lib/shapes/shared/freehand/types'
2
+
3
+ // These presets mirror the StrokeOptions that tldraw actually passes to the
4
+ // freehand algorithm. See packages/tldraw/src/lib/shapes/draw/getPath.ts.
5
+
6
+ const PEN_EASING = (t: number) => t * 0.65 + Math.sin((t * Math.PI) / 2) * 0.35
7
+
8
+ // Mirrors `EASINGS.linear` and `EASINGS.easeOutSine` from `@tldraw/editor`.
9
+ const linear = (t: number) => t
10
+ const easeOutSine = (t: number) => Math.sin((t * Math.PI) / 2)
11
+
12
+ /** Mirrors `modulate` from `@tldraw/utils`. */
13
+ function modulate(value: number, rangeA: number[], rangeB: number[], clamp = false): number {
14
+ const [fromLow, fromHigh] = rangeA
15
+ const [v0, v1] = rangeB
16
+ const result = v0 + ((value - fromLow) / (fromHigh - fromLow)) * (v1 - v0)
17
+
18
+ return clamp
19
+ ? v0 < v1
20
+ ? Math.max(Math.min(result, v1), v0)
21
+ : Math.max(Math.min(result, v0), v1)
22
+ : result
23
+ }
24
+
25
+ /** The 'draw' dash style with a mouse or finger (pressure is simulated). */
26
+ export function simulatePressureSettings(strokeWidth: number): StrokeOptions {
27
+ return {
28
+ size: strokeWidth,
29
+ thinning: 0.5,
30
+ streamline: modulate(strokeWidth, [9, 16], [0.64, 0.74], true),
31
+ smoothing: 0.62,
32
+ easing: easeOutSine,
33
+ simulatePressure: true,
34
+ }
35
+ }
36
+
37
+ /** The 'draw' dash style with a stylus (real pressure). */
38
+ export function realPressureSettings(strokeWidth: number): StrokeOptions {
39
+ return {
40
+ size: 1 + strokeWidth * 1.2,
41
+ thinning: 0.62,
42
+ streamline: 0.62,
43
+ smoothing: 0.62,
44
+ simulatePressure: false,
45
+ easing: PEN_EASING,
46
+ }
47
+ }
48
+
49
+ /** The solid / dashed / dotted dash styles (constant width). */
50
+ export function solidSettings(strokeWidth: number): StrokeOptions {
51
+ return {
52
+ size: strokeWidth,
53
+ thinning: 0,
54
+ streamline: modulate(strokeWidth, [9, 16], [0.64, 0.74], true),
55
+ smoothing: 0.62,
56
+ simulatePressure: false,
57
+ easing: linear,
58
+ }
59
+ }
60
+
61
+ /** The highlighter shape. */
62
+ export function highlightSettings(strokeWidth: number): StrokeOptions {
63
+ return {
64
+ size: 1 + strokeWidth,
65
+ thinning: 0,
66
+ streamline: 0.5,
67
+ smoothing: 0.5,
68
+ simulatePressure: false,
69
+ easing: easeOutSine,
70
+ }
71
+ }
@@ -0,0 +1,370 @@
1
+ // Real hand-drawn strokes recorded in tldraw, decoded from a snapshot's
2
+ // delta-encoded base64 segment points (tlschema's b64Vecs format).
3
+ /* eslint-disable no-loss-of-precision -- the literals round-trip exactly; the rule false-positives on long decimals */
4
+ import { VecModel } from '@tldraw/editor'
5
+
6
+ function pts(flat: number[]): VecModel[] {
7
+ const points: VecModel[] = []
8
+ for (let i = 0; i < flat.length; i += 3) {
9
+ points.push({ x: flat[i], y: flat[i + 1], z: flat[i + 2] })
10
+ }
11
+ return points
12
+ }
13
+
14
+ /** Real hand-drawn strokes recorded in tldraw. */
15
+ export const REAL_STROKES: { id: string; points: VecModel[] }[] = [
16
+ {
17
+ id: '9zLcrhbpuU_geM3cfVPlS',
18
+ points: pts([
19
+ 0, 0, 0.5, 0, -0.1199951171875, 0.5, 0, -0.5599365234375, 0.5, 0, -2.5989990234375, 0.5,
20
+ 3.3203125, -18.9114990234375, 0.5, 26.2421875, -72.3489990234375, 0.5, 69.0546875,
21
+ -146.9114990234375, 0.5, 104.9609375, -199.3177490234375, 0.5, 125.2421875,
22
+ -224.7552490234375, 0.5, 140.9921875, -241.4427490234375, 0.5, 150.7734375,
23
+ -249.5989990234375, 0.5, 148.3125, -234.8099365234375, 0.5, 134.890625, -199.5286865234375,
24
+ 0.5, 116.9375, -160.2474365234375, 0.5, 102.9453125, -129.0130615234375, 0.5, 95.00390625,
25
+ -109.4036865234375, 0.5, 94.99390411376953, -103.0052490234375, 0.5, 117.46265411376953,
26
+ -129.8489990234375, 0.5, 159.52515411376953, -186.5989990234375, 0.5, 191.22827911376953,
27
+ -229.8802490234375, 0.5, 209.85327911376953, -253.5989990234375, 0.5, 223.40015411376953,
28
+ -268.5599365234375, 0.5, 220.98023223876953, -253.0911865234375, 0.5, 204.10523223876953,
29
+ -212.9974365234375, 0.5, 188.76148223876953, -181.0443115234375, 0.5, 179.68335723876953,
30
+ -160.9818115234375, 0.5, 174.50366973876953, -148.0911865234375, 0.5, 174.24365997314453,
31
+ -146.4613037109375, 0.5, 183.30615997314453, -159.6800537109375, 0.5, 196.14990997314453,
32
+ -177.0238037109375, 0.5, 205.55615997314453, -189.2816162109375, 0.5, 212.50537872314453,
33
+ -197.8597412109375, 0.5, 215.18506622314453, -199.4700927734375, 0.5, 214.76514434814453,
34
+ -194.1888427734375, 0.5, 213.01514434814453, -186.1888427734375, 0.5, 211.20557403564453,
35
+ -180.1302490234375, 0.5, 210.54541778564453, -176.9407958984375, 0.5, 210.54541778564453,
36
+ -175.8704833984375, 0.5, 210.70545196533203, -175.6304931640625, 0.5, 211.15540313720703,
37
+ -175.6304931640625, 0.5, 211.71546173095703, -175.6304931640625, 0.5, 212.16541290283203,
38
+ -175.1805419921875, 0.5, 212.55530548095703, -173.0906982421875, 0.5, 213.21546173095703,
39
+ -169.6610107421875, 0.5, 214.43518829345703, -166.3114013671875, 0.5, 216.53479766845703,
40
+ -164.0106201171875, 0.5, 219.62464141845703, -163.2406005859375, 0.5, 223.76526641845703,
41
+ -165.1204833984375, 0.5, 227.76526641845703, -169.4095458984375, 0.5, 230.93518829345703,
42
+ -173.8001708984375, 0.5, 233.01526641845703, -176.7806396484375, 0.5, 233.87512969970703,
43
+ -178.2005615234375, 0.5, 234.60511016845703, -178.7005615234375, 0.5, 242.52698516845703,
44
+ -178.72056579589844, 0.5, 287.93323516845703, -186.36119079589844, 0.5, 450.80823516845703,
45
+ -226.42369079589844, 0.5, 739.808235168457, -291.36119079589844, 0.5, 1027.558235168457,
46
+ -332.39244079589844, 0.5, 1264.683235168457, -342.20494079589844, 0.5, 1409.558235168457,
47
+ -343.02476501464844, 0.5, 1451.464485168457, -341.42515563964844, 0.5,
48
+ ]),
49
+ },
50
+ {
51
+ id: 'hvteNyCylNUNXmiUYIQ4B',
52
+ points: pts([
53
+ 0, 0, 0.5, 0, 0.7001953125, 0.5, 0, 1.2099609375, 0.5, 0, -1.4091796875, 0.5, 0,
54
+ -15.6201171875, 0.5, 0, -46.9169921875, 0.5, 0, -92.4482421875, 0.5, 0, -142.3544921875, 0.5,
55
+ -0.1500244140625, -178.5732421875, 0.5, -3.5699462890625, -199.7138671875, 0.5,
56
+ -11.5582275390625, -210.6826171875, 0.5, -22.9801025390625, -211.8623046875, 0.5,
57
+ -33.3785400390625, -196.5419921875, 0.5, -37.0894775390625, -161.0732421875, 0.5,
58
+ -26.9957275390625, -116.1044921875, 0.5, 39.0042724609375, -64.9794921875, 0.5,
59
+ 133.7542724609375, -41.1044921875, 0.5, 196.0980224609375, -58.1982421875, 0.5,
60
+ 239.7855224609375, -92.7919921875, 0.5, 263.1292724609375, -121.2138671875, 0.5,
61
+ 269.3988037109375, -136.1904296875, 0.5, 272.8382568359375, -146.5732421875, 0.5,
62
+ 270.0277099609375, -138.5654296875, 0.5, 262.4691162109375, -105.0966796875, 0.5,
63
+ 247.8988037109375, -48.0341796875, 0.5, 214.7738037109375, 28.9658203125, 0.5,
64
+ 172.5238037109375, 88.1533203125, 0.5, 126.3050537109375, 117.2470703125, 0.5,
65
+ 68.9300537109375, 132.6064453125, 0.5, 16.5238037109375, 128.8857421875, 0.5,
66
+ -17.1949462890625, 107.6513671875, 0.5, -30.9918212890625, 79.3857421875, 0.5,
67
+ -24.9605712890625, 52.5419921875, 0.5, 10.0706787109375, 27.9794921875, 0.5, 66.4456787109375,
68
+ 9.4482421875, 0.5, 127.5394287109375, -7.8642578125, 0.5, 180.5706787109375, -28.1611328125,
69
+ 0.5, 214.5394287109375, -47.7861328125, 0.5, 233.4456787109375, -71.2548828125, 0.5,
70
+ 237.8753662109375, -96.1611328125, 0.5, 226.6331787109375, -114.4423828125, 0.5,
71
+ 200.3050537109375, -122.7158203125, 0.5, 165.9925537109375, -110.3095703125, 0.5,
72
+ 142.2581787109375, -84.5751953125, 0.5, 129.7113037109375, -56.9814453125, 0.5,
73
+ 123.0394287109375, -32.8564453125, 0.5, 128.4378662109375, -20.6142578125, 0.5,
74
+ 147.9534912109375, -21.6943359375, 0.5, 173.1878662109375, -38.1318359375, 0.5,
75
+ 189.5003662109375, -58.4755859375, 0.5, 195.7698974609375, -71.8740234375, 0.5,
76
+ 198.0296630859375, -80.2021484375, 0.5, 198.4796142578125, -83.2412109375, 0.5,
77
+ 197.5894775390625, -81.4208984375, 0.5, 196.6392822265625, -75.3896484375, 0.5,
78
+ 196.4393310546875, -65.0693359375, 0.5, 200.6112060546875, -53.1630859375, 0.5,
79
+ 211.6424560546875, -42.2802734375, 0.5, 226.9158935546875, -35.1904296875, 0.5,
80
+ 241.0174560546875, -32.8798828125, 0.5, 249.3455810546875, -35.3896484375, 0.5,
81
+ 252.2850341796875, -40.5380859375, 0.5, 252.5750732421875, -45.2294921875, 0.5,
82
+ 251.6351318359375, -48.1494140625, 0.5, 249.5960693359375, -47.29931640625, 0.5,
83
+ 247.9564208984375, -40.28759765625, 0.5, 247.4163818359375, -31.63134765625, 0.5,
84
+ 247.8763427734375, -25.70947265625, 0.5, 249.5462646484375, -22.24853515625, 0.5,
85
+ 252.1068115234375, -21.388671875, 0.5, 254.3665771484375, -23.408203125, 0.5,
86
+ 256.0267333984375, -27.728515625, 0.5, 257.1868896484375, -31.658203125, 0.5,
87
+ 257.8968505859375, -33.888671875, 0.5, 258.6370849609375, -34.728515625, 0.5,
88
+ 262.7073974609375, -34.95849609375, 0.5, 275.6448974609375, -35.28857421875, 0.5,
89
+ 300.0511474609375, -37.57763671875, 0.5, 328.6605224609375, -41.67919921875, 0.5,
90
+ 356.6448974609375, -45.35888671875, 0.5, 376.8167724609375, -47.77880859375, 0.5,
91
+ ]),
92
+ },
93
+ {
94
+ id: 'v7tr-W6M0CbFG7feklXsT',
95
+ points: pts([
96
+ 0, 0, 0.5, 0, -0.7001953125, 0.5, 0, -0.93017578125, 0.5, 0.72998046875, 10.28076171875, 0.5,
97
+ 4.65966796875, 45.84326171875, 0.5, 10.37060546875, 105.62451171875, 0.5, 12.89013671875,
98
+ 182.18701171875, 0.5, 12.89013671875, 249.93701171875, 0.5, 12.89013671875, 292.49951171875,
99
+ 0.5, 12.89013671875, 318.84326171875, 0.5, 12.89013671875, 334.28076171875, 0.5,
100
+ 12.89013671875, 338.90185546875, 0.5, 14.15966796875, 330.17529296875, 0.5, 19.92919921875,
101
+ 293.92529296875, 0.5, 24.41748046875, 240.01904296875, 0.5, 23.06787109375, 187.64404296875,
102
+ 0.5, 10.39599609375, 142.86279296875, 0.5, -17.69775390625, 115.26904296875, 0.5,
103
+ -55.10400390625, 102.80810546875, 0.5, -96.16650390625, 101.42822265625, 0.5,
104
+ -133.88525390625, 113.46728515625, 0.5, -157.54150390625, 132.90478515625, 0.5,
105
+ -166.72900390625, 154.13916015625, 0.5, -163.87939453125, 175.82666015625, 0.5,
106
+ -136.50439453125, 189.29541015625, 0.5, -72.37939453125, 192.26611328125, 0.5, 26.62060546875,
107
+ 176.93798828125, 0.5, 143.12060546875, 142.25048828125, 0.5, 221.99560546875, 113.65673828125,
108
+ 0.5, 253.80810546875, 100.09423828125, 0.5, 275.41748046875, 90.80517578125, 0.5,
109
+ 286.19091796875, 85.94580078125, 0.5, 288.03076171875, 84.81591796875, 0.5, 287.03076171875,
110
+ 84.81591796875, 0.5, 284.08154296875, 84.86590576171875, 0.5, 278.21044921875,
111
+ 85.49578857421875, 0.5, 270.35888671875, 86.24578857421875, 0.5, 259.31982421875,
112
+ 85.75579833984375, 0.5, 242.19482421875, 78.97454833984375, 0.5, 222.52294921875,
113
+ 61.16204833984375, 0.5, 208.02294921875, 38.84954833984375, 0.5, 199.72607421875,
114
+ 19.19329833984375, 0.5, 195.12451171875, 4.95111083984375, 0.5, 193.26416015625,
115
+ -2.76763916015625, 0.5, 192.734375, -4.83795166015625, 0.5, 192.66436767578125,
116
+ 8.93548583984375, 0.5, 192.62435913085938, 44.99798583984375, 0.5, 192.62435913085938,
117
+ 99.18548583984375, 0.5, 192.62435913085938, 162.43548583984375, 0.5, 195.20443725585938,
118
+ 221.12298583984375, 0.5, 199.78256225585938, 262.84173583984375, 0.5, 203.37240600585938,
119
+ 287.10736083984375, 0.5, 205.97201538085938, 301.60736083984375, 0.5, 207.61166381835938,
120
+ 308.39642333984375, 0.5, 208.49154663085938, 310.15618896484375, 0.5, 208.74154663085938,
121
+ 310.1861877441406, 0.5, 208.62155151367188, 309.3863830566406, 0.5,
122
+ ]),
123
+ },
124
+ {
125
+ id: 'YsH0MKBW6muD3blTzXSf9',
126
+ points: pts([
127
+ 0, 0, 0.5, -0.2900390625, 0, 0.5, 0.35009765625, 0, 0.5, 3.42041015625, -0.199951171875, 0.5,
128
+ 7.81103515625, -2.510498046875, 0.5, 11.30126953125, -7.612060546875, 0.5, 12.68115234375,
129
+ -13.541748046875, 0.5, 12.8111572265625, -18.280029296875, 0.5, 12.8111572265625,
130
+ -21.490966796875, 0.5, 11.6109619140625, -23.551513671875, 0.5, 8.6304931640625,
131
+ -24.421630859375, 0.5, 4.3492431640625, -21.882568359375, 0.5, -1.2991943359375,
132
+ -12.093505859375, 0.5, -7.4476318359375, 4.718994140625, 0.5, -10.9671630859375,
133
+ 24.265869140625, 0.5, -11.4769287109375, 41.234619140625, 0.5, -8.6566162109375,
134
+ 51.695556640625, 0.5, 0.9136962890625, 55.176025390625, 0.5, 14.6324462890625,
135
+ 50.847900390625, 0.5, 26.3902587890625, 39.144775390625, 0.5, 34.3785400390625,
136
+ 24.676025390625, 0.5, 39.2183837890625, 9.324462890625, 0.5, 41.1187744140625,
137
+ -2.253662109375, 0.5, 41.158782958984375, -8.843505859375, 0.5, 40.478607177734375,
138
+ -12.833740234375, 0.5, 39.498626708984375, -14.003662109375, 0.5, 38.948822021484375,
139
+ -12.143310546875, 0.5, 38.878814697265625, -3.065185546875, 0.5, 38.878814697265625,
140
+ 13.106689453125, 0.5, 40.109283447265625, 27.677001953125, 0.5, 44.597564697265625,
141
+ 39.348876953125, 0.5, 51.038970947265625, 46.079345703125, 0.5, 57.437408447265625,
142
+ 45.039306640625, 0.5, 63.527252197265625, 37.211181640625, 0.5, 68.02725219726562,
143
+ 23.148681640625, 0.5, 69.66690063476562, 11.031494140625, 0.5, 69.68690490722656,
144
+ 3.320556640625, 0.5, 69.65690612792969, -1.577880859375, 0.5, 69.33683776855469,
145
+ -3.747802734375, 0.5, 69.13688659667969, -3.94775390625, 0.5, 72.73649597167969,
146
+ 0.55224609375, 0.5, 83.39274597167969, 14.15380859375, 0.5, 101.79899597167969,
147
+ 41.88818359375, 0.5, 126.28337097167969, 90.88818359375, 0.5, 142.1271209716797,
148
+ 152.04443359375, 0.5, 142.5570526123047, 213.16943359375, 0.5, 119.60392761230469,
149
+ 269.48193359375, 0.5, 76.10392761230469, 309.95068359375, 0.5, 39.97892761230469,
150
+ 329.18505859375, 0.5, 14.603927612304688, 334.35693359375, 0.5, -0.6851348876953125,
151
+ 315.88818359375, 0.5, 28.221115112304688, 242.95068359375, 0.5, 121.15861511230469,
152
+ 105.95068359375, 0.5, 226.0336151123047, -40.79931640625, 0.5, 289.5648651123047,
153
+ -143.98681640625, 0.5, 321.2523651123047, -244.42431640625, 0.5, 319.0121307373047,
154
+ -327.98681640625, 0.5, 277.1683807373047, -354.61181640625, 0.5, 213.2308807373047,
155
+ -347.56103515625, 0.5, 150.1996307373047, -320.65478515625, 0.5, 114.66838073730469,
156
+ -297.60791015625, 0.5, 95.41838073730469, -283.21728515625, 0.5, 83.16838073730469,
157
+ -273.19384765625, 0.5, 94.48869323730469, -279.06494140625, 0.5, 123.51994323730469,
158
+ -300.23681640625, 0.5, 145.4730682373047, -318.92431640625, 0.5, 158.1527557373047,
159
+ -331.76806640625, 0.5, 157.9528045654297, -337.56884765625, 0.5, 133.2653045654297,
160
+ -328.07666015625, 0.5, 104.67155456542969, -314.98291015625, 0.5, 87.65592956542969,
161
+ -307.01416015625, 0.5, 77.19499206542969, -301.92431640625, 0.5, 77.14500427246094,
162
+ -301.87432861328125, 0.5, 85.08641052246094, -307.01495361328125, 0.5, 92.68797302246094,
163
+ -313.06573486328125, 0.5, 97.24656677246094, -319.62432861328125, 0.5, 91.95750427246094,
164
+ -324.86260986328125, 0.5, 75.30125427246094, -326.66241455078125, 0.5, 57.30125427246094,
165
+ -327.54229736328125, 0.5, 43.37937927246094, -328.31231689453125, 0.5, 34.30906677246094,
166
+ -329.92266845703125, 0.5, 30.918441772460938, -334.48126220703125, 0.5, 32.07859802246094,
167
+ -341.39141845703125, 0.5, 35.54930114746094, -347.16094970703125, 0.5, 38.46922302246094,
168
+ -350.74102783203125, 0.5, 39.18943786621094, -352.75079345703125, 0.5, 35.87889099121094,
169
+ -353.31085205078125, 0.5, 28.289047241210938, -353.31085205078125, 0.5, 19.562484741210938,
170
+ -353.36083984375, 0.5, 13.050765991210938, -353.36083984375, 0.5, 9.871078491210938,
171
+ -353.36083984375, 0.5, 8.791000366210938, -353.36083984375, 0.5, 8.341049194335938,
172
+ -353.36083984375, 0.5, 5.6105804443359375, -353.640869140625, 0.5, -10.045669555664062,
173
+ -355.320556640625, 0.5,
174
+ ]),
175
+ },
176
+ {
177
+ id: 'z7I7jk0Ky6w7ob1oD3WC9',
178
+ points: pts([
179
+ 0, 0, 0.5, -0.18994140625, 0, 0.5, -4.01025390625, 0, 0.5, -13.30712890625, 0, 0.5,
180
+ -33.46337890625, 0, 0.5,
181
+ ]),
182
+ },
183
+ {
184
+ id: '3WYN5Fjm1Bp7ykdK4P8Sa',
185
+ points: pts([
186
+ 0, 0, 0.5, -0.47998046875, 0.1600341796875, 0.5, -0.75, 0.320068359375, 0.5, 0.8701171875,
187
+ 0.320068359375, 0.5, 10.5576171875, -3.410400390625, 0.5, 34.6669921875, -22.816650390625,
188
+ 0.5, 67.3857421875, -66.847900390625, 0.5, 97.8701171875, -134.847900390625, 0.5,
189
+ 117.9951171875, -224.222900390625, 0.5, 124.6435546875, -308.222900390625, 0.5,
190
+ 124.7435302734375, -366.972900390625, 0.5, 122.9837646484375, -402.254150390625, 0.5,
191
+ 115.5931396484375, -426.051025390625, 0.5, 102.3665771484375, -441.691650390625, 0.5,
192
+ 83.8040771484375, -439.601806640625, 0.5, 55.1009521484375, -410.664306640625, 0.5,
193
+ 24.6165771484375, -345.289306640625, 0.5, 7.9603271484375, -247.664306640625, 0.5,
194
+ 11.1107177734375, -134.726806640625, 0.5, 46.5169677734375, -33.726806640625, 0.5,
195
+ 100.9232177734375, 29.804443359375, 0.5, 150.5482177734375, 57.773193359375, 0.5,
196
+ 188.4232177734375, 67.296630859375, 0.5, 208.2982177734375, 67.3966064453125, 0.5,
197
+ 217.1966552734375, 64.6173095703125, 0.5, 220.5872802734375, 58.5587158203125, 0.5,
198
+ 207.7200927734375, 45.5665283203125, 0.5, 168.5950927734375, 24.5196533203125, 0.5,
199
+ 118.9388427734375, 7.3946533203125, 0.5, 75.9700927734375, 0.5352783203125, 0.5,
200
+ 40.4700927734375, -0.3646240234375, 0.5, 12.2513427734375, 12.4635009765625, 0.5,
201
+ -0.8189697265625, 41.7916259765625, 0.5, 5.6927490234375, 80.4478759765625, 0.5,
202
+ 27.2552490234375, 118.3541259765625, 0.5, 53.3489990234375, 141.0416259765625, 0.5,
203
+ 81.9271240234375, 149.2525634765625, 0.5, 107.0208740234375, 147.2525634765625, 0.5,
204
+ 118.4583740234375, 136.9322509765625, 0.5, 121.7279052734375, 124.1822509765625, 0.5,
205
+ 116.9271240234375, 113.5494384765625, 0.5, 100.3802490234375, 109.0377197265625, 0.5,
206
+ 78.4427490234375, 113.8189697265625, 0.5, 55.6614990234375, 131.3814697265625, 0.5,
207
+ 38.3802490234375, 157.7564697265625, 0.5, 33.0794677734375, 181.3970947265625, 0.5,
208
+ 34.2493896484375, 200.5845947265625, 0.5, 46.1322021484375, 216.0845947265625, 0.5,
209
+ 68.2415771484375, 220.7564697265625, 0.5, 93.4759521484375, 205.7955322265625, 0.5,
210
+ 111.9134521484375, 182.0142822265625, 0.5, 119.1243896484375, 161.1392822265625, 0.5,
211
+ 121.2044677734375, 144.9830322265625, 0.5, 119.3743896484375, 137.7213134765625, 0.5,
212
+ 114.9447021484375, 135.1822509765625, 0.5, 109.0931396484375, 134.1226806640625, 0.5,
213
+ 103.4642333984375, 137.1031494140625, 0.5, 99.6536865234375, 144.7047119140625, 0.5,
214
+ 97.8636474609375, 153.1031494140625, 0.5, 97.4136962890625, 160.7320556640625, 0.5,
215
+ 98.2037353515625, 166.8726806640625, 0.5, 102.3521728515625, 171.6734619140625, 0.5,
216
+ 110.1724853515625, 176.8453369140625, 0.5, 118.2349853515625, 181.6461181640625, 0.5,
217
+ 126.9459228515625, 184.8765869140625, 0.5, 136.7740478515625, 185.5865478515625, 0.5,
218
+ 149.6646728515625, 165.4615478515625, 0.5, 173.5084228515625, 83.0865478515625, 0.5,
219
+ 208.1334228515625, -67.9134521484375, 0.5, 267.1334228515625, -269.4134521484375, 0.5,
220
+ 331.3209228515625, -419.7884521484375, 0.5, 368.8209228515625, -475.2259521484375, 0.5,
221
+ 407.3521728515625, -527.6009521484375, 0.5, 431.4459228515625, -540.0384521484375, 0.5,
222
+ 405.8521728515625, -459.8509521484375, 0.5, 352.7271728515625, -331.3509521484375, 0.5,
223
+ 303.3209228515625, -201.1009521484375, 0.5, 272.2271728515625, -105.5384521484375, 0.5,
224
+ 259.1881103515625, -56.9447021484375, 0.5, 253.5787353515625, -29.6478271484375, 0.5,
225
+ 251.2388916015625, -14.6165771484375, 0.5, 264.5670166015625, -38.4915771484375, 0.5,
226
+ 294.2701416015625, -95.5540771484375, 0.5, 316.7232666015625, -137.8040771484375, 0.5,
227
+ 329.2623291015625, -160.1478271484375, 0.5, 338.8717041015625, -175.0853271484375, 0.5,
228
+ 339.2615966796875, -171.6654052734375, 0.5, 323.6444091796875, -138.4466552734375, 0.5,
229
+ 288.9256591796875, -68.7591552734375, 0.5, 257.9725341796875, -8.5091552734375, 0.5,
230
+ 242.6209716796875, 20.5220947265625, 0.5, 232.4412841796875, 43.3033447265625, 0.5,
231
+ 234.3016357421875, 46.7135009765625, 0.5, 248.0516357421875, 31.7838134765625, 0.5,
232
+ 265.6297607421875, 15.6588134765625, 0.5, 282.4110107421875, 2.0885009765625, 0.5,
233
+ 293.6688232421875, -4.6419677734375, 0.5, 298.3797607421875, -3.5716552734375, 0.5,
234
+ 292.7313232421875, 10.9205322265625, 0.5, 279.3094482421875, 32.4674072265625, 0.5,
235
+ 266.8328857421875, 49.4674072265625, 0.5, 259.0828857421875, 59.7955322265625, 0.5,
236
+ 255.1531982421875, 64.6158447265625, 0.5, 254.3133544921875, 65.4556884765625, 0.5,
237
+ 255.5731201171875, 64.0660400390625, 0.5, 257.7137451171875, 62.0963134765625, 0.5,
238
+ 259.0340576171875, 60.9664306640625, 0.5, 259.6439208984375, 60.6263427734375, 0.5,
239
+ 259.9239501953125, 60.496337890625, 0.5, 260.4439697265625, 59.776123046875, 0.5,
240
+ 267.7447509765625, 54.514404296875, 0.5, 295.1197509765625, 39.811279296875, 0.5,
241
+ 337.0572509765625, 23.467529296875, 0.5, 376.7447509765625, 15.545654296875, 0.5,
242
+ 410.3697509765625, 17.914794921875, 0.5, 427.9947509765625, 41.586669921875, 0.5,
243
+ 420.4244384765625, 93.617919921875, 0.5, 385.4556884765625, 159.805419921875, 0.5,
244
+ 339.5806884765625, 215.992919921875, 0.5, 302.3306884765625, 252.992919921875, 0.5,
245
+ 276.3775634765625, 274.680419921875, 0.5, 258.9400634765625, 285.524169921875, 0.5,
246
+ 248.9791259765625, 288.623779296875, 0.5, 263.1588134765625, 265.842529296875, 0.5,
247
+ 330.0338134765625, 211.561279296875, 0.5, 458.7838134765625, 156.498779296875, 0.5,
248
+ 620.0338134765625, 135.264404296875, 0.5, 743.9713134765625, 166.670654296875, 0.5,
249
+ 808.1588134765625, 229.108154296875, 0.5, 843.4088134765625, 299.733154296875, 0.5,
250
+ 855.7213134765625, 356.608154296875, 0.5, 853.0103759765625, 390.826904296875, 0.5,
251
+ ]),
252
+ },
253
+ {
254
+ id: 'vH252i2tkkEUoW3tL2aRm',
255
+ points: pts([
256
+ 0, 0, 0.5, 0.2900390625, -0.1400146484375, 0.5, 0.570068359375, -0.180023193359375, 0.5,
257
+ 0.570068359375, 0.249908447265625, 0.5, 0.570068359375, 1.509674072265625, 0.5,
258
+ 0.570068359375, 3.890533447265625, 0.5, 0.570068359375, 5.700103759765625, 0.5,
259
+ 0.199951171875, 6.519927978515625, 0.5, -2.399658203125, 6.349884033203125, 0.5,
260
+ -10.259033203125, -1.040740966796875, 0.5, -30.727783203125, -22.056365966796875, 0.5,
261
+ -73.196533203125, -52.259490966796875, 0.5, -132.165283203125, -73.91574096679688, 0.5,
262
+ -186.571533203125, -78.96652221679688, 0.5, -231.759033203125, -71.61495971679688, 0.5,
263
+ -267.852783203125, -56.185272216796875, 0.5, -292.743408203125, -35.857147216796875, 0.5,
264
+ -309.227783203125, -9.904022216796875, 0.5, -314.759033203125, 15.299102783203125, 0.5,
265
+ -310.278564453125, 40.549102783203125, 0.5, -292.622314453125, 61.814727783203125, 0.5,
266
+ -259.903564453125, 71.28347778320312, 0.5, -219.434814453125, 72.85379028320312, 0.5,
267
+ -185.903564453125, 65.46316528320312, 0.5, -161.700439453125, 49.431915283203125, 0.5,
268
+ -143.262939453125, 26.025665283203125, 0.5, -139.923095703125, -3.177459716796875, 0.5,
269
+ -157.985595703125, -30.599334716796875, 0.5, -194.860595703125, -53.833709716796875, 0.5,
270
+ -244.235595703125, -69.98995971679688, 0.5, -302.048095703125, -72.40011596679688, 0.5,
271
+ -358.360595703125, -56.946990966796875, 0.5, -412.860595703125, -16.196990966796875, 0.5,
272
+ -454.516845703125, 34.178009033203125, 0.5, -474.438720703125, 79.02175903320312, 0.5,
273
+ -482.290283203125, 113.36550903320312, 0.5, -482.1202392578125, 134.74050903320312, 0.5,
274
+ -478.5401611328125, 146.56863403320312, 0.5, -472.1690673828125, 150.36941528320312, 0.5,
275
+ -465.1300048828125, 149.73953247070312, 0.5, -459.3018798828125, 142.18093872070312, 0.5,
276
+ -456.2725830078125, 125.18093872070312, 0.5, -458.8624267578125, 101.91531372070312, 0.5,
277
+ -469.5811767578125, 81.29031372070312, 0.5, -486.6749267578125, 67.43875122070312, 0.5,
278
+ -507.4405517578125, 61.669219970703125, 0.5, -527.1436767578125, 71.64578247070312, 0.5,
279
+ -539.2921142578125, 94.20828247070312, 0.5, -544.2218017578125, 122.30203247070312, 0.5,
280
+ -542.4913330078125, 153.61453247070312, 0.5, -525.1632080078125, 177.02078247070312, 0.5,
281
+ -481.6632080078125, 188.05203247070312, 0.5, -434.0069580078125, 184.89187622070312, 0.5,
282
+ -397.8194580078125, 159.95437622070312, 0.5, -371.4288330078125, 110.39187622070312, 0.5,
283
+ -363.3350830078125, 47.079376220703125, 0.5, -379.9913330078125, -20.858123779296875, 0.5,
284
+ -421.3663330078125, -89.92062377929688, 0.5, -469.5225830078125, -147.82687377929688, 0.5,
285
+ -498.5850830078125, -177.49874877929688, 0.5, -512.5147705078125, -189.46749877929688, 0.5,
286
+ -524.3428955078125, -196.62765502929688, 0.5, -523.4527587890625, -168.33078002929688, 0.5,
287
+ -498.7183837890625, -91.95578002929688, 0.5, -466.0308837890625, -13.893280029296875, 0.5,
288
+ -448.0152587890625, 26.887969970703125, 0.5, -436.1246337890625, 49.700469970703125, 0.5,
289
+ -425.2340087890625, 66.84109497070312, 0.5, -419.9722900390625, 67.30105590820312, 0.5,
290
+ -418.4420166015625, 48.769805908203125, 0.5, -419.8023681640625, 14.988555908203125, 0.5,
291
+ -425.3726806640625, -17.042694091796875, 0.5, -432.0718994140625, -36.995819091796875, 0.5,
292
+ -436.6812744140625, -47.355194091796875, 0.5, -438.8121337890625, -47.635223388671875, 0.5,
293
+ -437.2720947265625, -34.111785888671875, 0.5, -429.9127197265625, -13.189910888671875, 0.5,
294
+ -419.3736572265625, 3.919464111328125, 0.5, -408.8658447265625, 14.817901611328125, 0.5,
295
+ -400.0064697265625, 19.767120361328125, 0.5, -394.6275634765625, 18.007354736328125, 0.5,
296
+ -390.5963134765625, 9.663604736328125, 0.5, -387.7662353515625, -2.609832763671875, 0.5,
297
+ -386.9864501953125, -12.039520263671875, 0.5, -386.9864501953125, -17.480926513671875, 0.5,
298
+ -386.9864501953125, -20.840301513671875, 0.5, -386.9864501953125, -21.970184326171875, 0.5,
299
+ -386.9864501953125, -22.320281982421875, 0.5, -386.7164306640625, -22.700164794921875, 0.5,
300
+ -385.3160400390625, -24.669891357421875, 0.5, -383.1265869140625, -29.271453857421875, 0.5,
301
+ -381.0758056640625, -34.662078857421875, 0.5, -379.4957275390625, -39.283172607421875, 0.5,
302
+ -378.6456298828125, -42.433563232421875, 0.5, -378.3756103515625, -43.993133544921875, 0.5,
303
+ -378.265625, -44.542938232421875, 0.5, -378.03564453125, -44.57293701171875, 0.5,
304
+ -377.645751953125, -44.612945556640625, 0.5, -377.2158203125, -44.612945556640625, 0.5,
305
+ ]),
306
+ },
307
+ {
308
+ id: '8XL4rYftYdjhjIEhCJ8x_',
309
+ points: pts([
310
+ 0, 0, 0.5, 0.409912109375, -2.0390625, 0.5, 0.829833984375, -4.068359375, 0.5,
311
+ 0.7198486328125, -4.068359375, 0.5, 3.3800048828125, -1.337890625, 0.5, 18.4815673828125,
312
+ 16.708984375, 0.5, 45.6065673828125, 55.146484375, 0.5, 75.2315673828125, 106.396484375, 0.5,
313
+ 99.2471923828125, 160.521484375, 0.5, 110.1300048828125, 202.302734375, 0.5,
314
+ 109.9400634765625, 233.115234375, 0.5, 99.3228759765625, 254.115234375, 0.5, 75.4791259765625,
315
+ 262.544921875, 0.5, 41.7603759765625, 265.07421875, 0.5, 5.0728759765625, 256.41796875, 0.5,
316
+ -26.0052490234375, 235.02734375, 0.5, -42.3802490234375, 210.16796875, 0.5, -48.0521240234375,
317
+ 179.10546875, 0.5, -42.9739990234375, 150.91796875, 0.5, -15.4583740234375, 139.52734375, 0.5,
318
+ 35.6666259765625, 153.98828125, 0.5, 89.6353759765625, 185.69140625, 0.5, 131.8853759765625,
319
+ 208.80078125, 0.5, 171.4166259765625, 217.05859375, 0.5, 200.7135009765625, 184.90234375, 0.5,
320
+ 210.2838134765625, 77.02734375, 0.5, 211.3433837890625, -69.47265625, 0.5, 205.8824462890625,
321
+ -204.22265625, 0.5, 188.7730712890625, -300.41015625, 0.5, 162.5855712890625, -353.44140625,
322
+ 0.5, 126.3668212890625, -379.37890625, 0.5, 81.9605712890625, -369.45703125, 0.5,
323
+ 41.0855712890625, -331.51953125, 0.5, 12.0386962890625, -279.86328125, 0.5, -1.9534912109375,
324
+ -223.51953125, 0.5, 1.1656494140625, -179.80078125, 0.5, 18.1656494140625, -157.67578125, 0.5,
325
+ 44.0093994140625, -152.14453125, 0.5, 76.8843994140625, -165.34765625, 0.5, 110.0718994140625,
326
+ -200.97265625, 0.5, 132.7125244140625, -253.56640625, 0.5, 143.1500244140625, -312.34765625,
327
+ 0.5, 141.0504150390625, -360.62890625, 0.5, 129.7769775390625, -389.23828125, 0.5,
328
+ 112.5738525390625, -403.81640625, 0.5, 93.4488525390625, -408.28515625, 0.5, 77.4957275390625,
329
+ -400.74609375, 0.5, 63.9957275390625, -387.03515625, 0.5, 54.9722900390625, -367.33203125,
330
+ 0.5, 53.2818603515625, -342.42578125, 0.5, 64.4224853515625, -315.44140625, 0.5,
331
+ 83.2193603515625, -294.39453125, 0.5, 102.7349853515625, -285.54296875, 0.5,
332
+ 118.6334228515625, -287.0732421875, 0.5, 125.0943603515625, -302.9326171875, 0.5,
333
+ 118.7037353515625, -339.5888671875, 0.5, 88.8287353515625, -389.3701171875, 0.5,
334
+ 31.7662353515625, -445.4013671875, 0.5, -51.6712646484375, -507.8701171875, 0.5,
335
+ -127.6712646484375, -545.4638671875, 0.5, -177.9525146484375, -545.5738525390625, 0.5,
336
+ -226.7025146484375, -521.6363525390625, 0.5, -266.1712646484375, -491.7769775390625, 0.5,
337
+ -287.2337646484375, -472.7769775390625, 0.5, -298.1634521484375, -461.8004150390625, 0.5,
338
+ -302.6751708984375, -456.8707275390625, 0.5, -303.9251708984375, -455.2203369140625, 0.5,
339
+ -304.4251708984375, -454.5401611328125, 0.5, -304.6951904296875, -454.380126953125, 0.5,
340
+ -304.9151611328125, -454.39012908935547, 0.5, -304.5352783203125, -454.3501205444336, 0.5,
341
+ -289.0665283203125, -458.8813705444336, 0.5, -220.0040283203125, -487.9751205444336, 0.5,
342
+ -82.7540283203125, -554.6626205444336, 0.5, 31.5584716796875, -610.4126205444336, 0.5,
343
+ 90.9334716796875, -634.3188705444336, 0.5, 133.2772216796875, -649.4516830444336, 0.5,
344
+ 155.4647216796875, -656.4204330444336, 0.5, 165.1834716796875, -658.7212142944336, 0.5,
345
+ 165.8133544921875, -658.2312240600586, 0.5, 153.2117919921875, -651.6804428100586, 0.5,
346
+ 113.2742919921875, -631.3835678100586, 0.5, 44.4617919921875, -595.2585678100586, 0.5,
347
+ -23.1632080078125, -557.5398178100586, 0.5, -62.6944580078125, -532.8523178100586, 0.5,
348
+ -85.3507080078125, -515.6960678100586, 0.5, -100.0694580078125, -500.3757553100586, 0.5,
349
+ -96.0499267578125, -492.3523178100586, 0.5, -57.2374267578125, -494.9929428100586, 0.5,
350
+ -1.7999267578125, -509.2663803100586, 0.5, 49.0125732421875, -534.2195053100586, 0.5,
351
+ 79.4188232421875, -552.8757553100586, 0.5, 90.2781982421875, -562.0320053100586, 0.5,
352
+ 98.4578857421875, -568.5827865600586, 0.5, 98.0679931640625, -565.5534896850586, 0.5,
353
+ 90.8687744140625, -552.0613021850586, 0.5, 82.9976806640625, -537.4675521850586, 0.5,
354
+ 77.5562744140625, -526.7409896850586, 0.5, 74.1968994140625, -518.4441146850586, 0.5,
355
+ 78.0172119140625, -516.4343490600586, 0.5, 100.1265869140625, -531.0124740600586, 0.5,
356
+ 138.0328369140625, -567.9499740600586, 0.5, 164.7047119140625, -600.1062240600586, 0.5,
357
+ 176.1265869140625, -615.7468490600586, 0.5, 184.4390869140625, -626.1530990600586, 0.5,
358
+ 183.9190673828125, -622.5124740600586, 0.5, 174.2471923828125, -604.5749740600586, 0.5,
359
+ 162.5675048828125, -584.3405990600586, 0.5, 153.7081298828125, -568.9499740600586, 0.5,
360
+ 149.0792236328125, -560.1296615600586, 0.5, 147.6788330078125, -556.1902084350586, 0.5,
361
+ 150.4893798828125, -554.8503646850586, 0.5, 165.0909423828125, -554.8103561401367, 0.5,
362
+ 197.1534423828125, -560.1306686401367, 0.5, 253.2784423828125, -577.9119186401367, 0.5,
363
+ 325.9659423828125, -608.1462936401367, 0.5, 388.0596923828125, -641.0212936401367, 0.5,
364
+ 433.9034423828125, -667.0681686401367, 0.5, 470.7471923828125, -682.1462936401367, 0.5,
365
+ 494.8096923828125, -684.9861373901367, 0.5, 504.6221923828125, -679.1462936401367, 0.5,
366
+ 508.6534423828125, -670.2791061401367, 0.5, 511.4034423828125, -662.9783248901367, 0.5,
367
+ 512.4434814453125, -658.9392623901367, 0.5, 512.8834228515625, -657.3289108276367, 0.5,
368
+ ]),
369
+ },
370
+ ]