js-draw 0.25.0 → 1.0.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 (810) hide show
  1. package/README.md +60 -20
  2. package/build-config.json +22 -21
  3. package/dist/Editor.css +1281 -0
  4. package/dist/bundle.js +3 -3
  5. package/dist/bundledStyles.js +1 -1
  6. package/dist/cjs/Editor.d.ts +91 -12
  7. package/dist/cjs/Editor.js +619 -590
  8. package/dist/cjs/EditorImage.d.ts +5 -2
  9. package/dist/cjs/EditorImage.js +258 -297
  10. package/dist/cjs/EventDispatcher.js +17 -19
  11. package/dist/cjs/Pointer.d.ts +3 -1
  12. package/dist/cjs/Pointer.js +44 -45
  13. package/dist/cjs/SVGLoader.d.ts +7 -1
  14. package/dist/cjs/SVGLoader.js +373 -474
  15. package/dist/cjs/UndoRedoHistory.js +28 -40
  16. package/dist/cjs/Viewport.d.ts +1 -4
  17. package/dist/cjs/Viewport.js +150 -193
  18. package/dist/cjs/bundle/bundled.js +4 -1
  19. package/dist/cjs/commands/Command.js +22 -49
  20. package/dist/cjs/commands/Duplicate.js +28 -44
  21. package/dist/cjs/commands/Erase.js +36 -54
  22. package/dist/cjs/commands/SerializableCommand.js +20 -35
  23. package/dist/cjs/commands/UnresolvedCommand.js +14 -29
  24. package/dist/cjs/commands/invertCommand.js +29 -51
  25. package/dist/cjs/commands/lib.js +9 -6
  26. package/dist/cjs/commands/localization.d.ts +1 -1
  27. package/dist/cjs/commands/localization.js +9 -9
  28. package/dist/cjs/commands/uniteCommands.js +57 -87
  29. package/dist/cjs/components/AbstractComponent.d.ts +11 -3
  30. package/dist/cjs/components/AbstractComponent.js +141 -169
  31. package/dist/cjs/components/BackgroundComponent.d.ts +3 -6
  32. package/dist/cjs/components/BackgroundComponent.js +124 -149
  33. package/dist/cjs/components/ImageComponent.d.ts +3 -5
  34. package/dist/cjs/components/ImageComponent.js +95 -175
  35. package/dist/cjs/components/RestylableComponent.d.ts +1 -1
  36. package/dist/cjs/components/RestylableComponent.js +41 -56
  37. package/dist/cjs/components/SVGGlobalAttributesObject.d.ts +1 -3
  38. package/dist/cjs/components/SVGGlobalAttributesObject.js +34 -51
  39. package/dist/cjs/components/Stroke.d.ts +4 -6
  40. package/dist/cjs/components/Stroke.js +95 -121
  41. package/dist/cjs/components/TextComponent.d.ts +2 -4
  42. package/dist/cjs/components/TextComponent.js +189 -234
  43. package/dist/cjs/components/UnknownSVGObject.d.ts +1 -3
  44. package/dist/cjs/components/UnknownSVGObject.js +30 -43
  45. package/dist/cjs/components/builders/ArrowBuilder.d.ts +1 -1
  46. package/dist/cjs/components/builders/ArrowBuilder.js +43 -42
  47. package/dist/cjs/components/builders/CircleBuilder.js +43 -43
  48. package/dist/cjs/components/builders/FreehandLineBuilder.d.ts +3 -2
  49. package/dist/cjs/components/builders/FreehandLineBuilder.js +73 -86
  50. package/dist/cjs/components/builders/LineBuilder.d.ts +1 -1
  51. package/dist/cjs/components/builders/LineBuilder.js +38 -36
  52. package/dist/cjs/components/builders/PressureSensitiveFreehandLineBuilder.d.ts +1 -1
  53. package/dist/cjs/components/builders/PressureSensitiveFreehandLineBuilder.js +131 -139
  54. package/dist/cjs/components/builders/RectangleBuilder.d.ts +1 -1
  55. package/dist/cjs/components/builders/RectangleBuilder.js +31 -31
  56. package/dist/cjs/components/builders/types.d.ts +1 -1
  57. package/dist/cjs/components/lib.d.ts +3 -1
  58. package/dist/cjs/components/lib.js +10 -7
  59. package/dist/cjs/components/localization.js +4 -4
  60. package/dist/cjs/components/util/StrokeSmoother.d.ts +1 -2
  61. package/dist/cjs/components/util/StrokeSmoother.js +67 -72
  62. package/dist/cjs/components/util/describeComponentList.d.ts +1 -1
  63. package/dist/cjs/components/util/describeComponentList.js +4 -5
  64. package/dist/cjs/dialogs/makeAboutDialog.d.ts +15 -0
  65. package/dist/cjs/dialogs/makeAboutDialog.js +54 -0
  66. package/dist/cjs/inputEvents.d.ts +84 -0
  67. package/dist/cjs/inputEvents.js +40 -0
  68. package/dist/cjs/lib.d.ts +29 -13
  69. package/dist/cjs/lib.js +38 -23
  70. package/dist/cjs/localization.js +19 -18
  71. package/dist/cjs/localizations/de.js +117 -13
  72. package/dist/cjs/localizations/en.js +4 -13
  73. package/dist/cjs/localizations/es.js +62 -23
  74. package/dist/cjs/localizations/getLocalizationTable.js +15 -13
  75. package/dist/cjs/rendering/Display.d.ts +1 -2
  76. package/dist/cjs/rendering/Display.js +70 -83
  77. package/dist/cjs/rendering/RenderablePathSpec.d.ts +15 -0
  78. package/dist/cjs/rendering/RenderablePathSpec.js +70 -0
  79. package/dist/cjs/rendering/RenderingStyle.d.ts +4 -4
  80. package/dist/cjs/rendering/RenderingStyle.js +18 -28
  81. package/dist/cjs/rendering/TextRenderingStyle.d.ts +10 -10
  82. package/dist/cjs/rendering/TextRenderingStyle.js +13 -18
  83. package/dist/cjs/rendering/caching/CacheRecord.d.ts +1 -2
  84. package/dist/cjs/rendering/caching/CacheRecord.js +20 -22
  85. package/dist/cjs/rendering/caching/CacheRecordManager.d.ts +1 -1
  86. package/dist/cjs/rendering/caching/CacheRecordManager.js +17 -15
  87. package/dist/cjs/rendering/caching/RenderingCache.js +19 -19
  88. package/dist/cjs/rendering/caching/RenderingCacheNode.d.ts +1 -1
  89. package/dist/cjs/rendering/caching/RenderingCacheNode.js +98 -118
  90. package/dist/cjs/rendering/caching/testUtils.js +24 -23
  91. package/dist/cjs/rendering/caching/types.d.ts +3 -3
  92. package/dist/cjs/rendering/lib.js +8 -5
  93. package/dist/cjs/rendering/localization.js +5 -5
  94. package/dist/cjs/rendering/renderers/AbstractRenderer.d.ts +2 -11
  95. package/dist/cjs/rendering/renderers/AbstractRenderer.js +53 -57
  96. package/dist/cjs/rendering/renderers/CanvasRenderer.d.ts +3 -5
  97. package/dist/cjs/rendering/renderers/CanvasRenderer.js +91 -106
  98. package/dist/cjs/rendering/renderers/DummyRenderer.d.ts +1 -4
  99. package/dist/cjs/rendering/renderers/DummyRenderer.js +56 -76
  100. package/dist/cjs/rendering/renderers/SVGRenderer.d.ts +5 -5
  101. package/dist/cjs/rendering/renderers/SVGRenderer.js +194 -176
  102. package/dist/cjs/rendering/renderers/TextOnlyRenderer.d.ts +1 -3
  103. package/dist/cjs/rendering/renderers/TextOnlyRenderer.js +47 -72
  104. package/dist/cjs/shortcuts/KeyBinding.d.ts +5 -0
  105. package/dist/cjs/shortcuts/KeyBinding.js +94 -70
  106. package/dist/cjs/shortcuts/KeyboardShortcutManager.d.ts +1 -1
  107. package/dist/cjs/shortcuts/KeyboardShortcutManager.js +36 -45
  108. package/dist/cjs/shortcuts/lib.js +5 -2
  109. package/dist/cjs/testing/createEditor.js +7 -4
  110. package/dist/cjs/testing/getUniquePointerId.js +4 -5
  111. package/dist/cjs/testing/lib.js +5 -2
  112. package/dist/cjs/testing/sendPenEvent.d.ts +2 -2
  113. package/dist/cjs/testing/sendPenEvent.js +10 -7
  114. package/dist/cjs/testing/sendTouchEvent.d.ts +2 -2
  115. package/dist/cjs/testing/sendTouchEvent.js +34 -16
  116. package/dist/cjs/toolbar/AbstractToolbar.d.ts +166 -0
  117. package/dist/cjs/toolbar/AbstractToolbar.js +410 -0
  118. package/dist/cjs/toolbar/DropdownToolbar.d.ts +43 -0
  119. package/dist/cjs/toolbar/DropdownToolbar.js +176 -0
  120. package/dist/cjs/toolbar/EdgeToolbar.d.ts +47 -0
  121. package/dist/cjs/toolbar/EdgeToolbar.js +422 -0
  122. package/dist/cjs/toolbar/IconProvider.d.ts +54 -30
  123. package/dist/cjs/toolbar/IconProvider.js +652 -224
  124. package/dist/cjs/toolbar/constants.d.ts +1 -0
  125. package/dist/cjs/toolbar/constants.js +4 -0
  126. package/dist/cjs/toolbar/lib.d.ts +4 -2
  127. package/dist/cjs/toolbar/lib.js +10 -3
  128. package/dist/cjs/toolbar/localization.d.ts +9 -2
  129. package/dist/cjs/toolbar/localization.js +26 -19
  130. package/dist/cjs/toolbar/types.d.ts +7 -0
  131. package/dist/cjs/toolbar/widgets/ActionButtonWidget.d.ts +1 -1
  132. package/dist/cjs/toolbar/widgets/ActionButtonWidget.js +23 -39
  133. package/dist/cjs/toolbar/widgets/BaseToolWidget.d.ts +1 -1
  134. package/dist/cjs/toolbar/widgets/BaseToolWidget.js +35 -37
  135. package/dist/cjs/toolbar/widgets/BaseWidget.d.ts +60 -5
  136. package/dist/cjs/toolbar/widgets/BaseWidget.js +232 -177
  137. package/dist/cjs/toolbar/widgets/DocumentPropertiesWidget.js +130 -117
  138. package/dist/cjs/toolbar/widgets/EraserToolWidget.d.ts +1 -3
  139. package/dist/cjs/toolbar/widgets/EraserToolWidget.js +45 -73
  140. package/dist/cjs/toolbar/widgets/HandToolWidget.d.ts +1 -0
  141. package/dist/cjs/toolbar/widgets/HandToolWidget.js +126 -141
  142. package/dist/cjs/toolbar/widgets/InsertImageWidget.d.ts +9 -7
  143. package/dist/cjs/toolbar/widgets/InsertImageWidget.js +147 -212
  144. package/dist/cjs/toolbar/widgets/OverflowWidget.js +33 -61
  145. package/dist/cjs/toolbar/widgets/PenToolWidget.d.ts +8 -1
  146. package/dist/cjs/toolbar/widgets/PenToolWidget.js +162 -234
  147. package/dist/cjs/toolbar/widgets/SelectionToolWidget.d.ts +3 -1
  148. package/dist/cjs/toolbar/widgets/SelectionToolWidget.js +105 -177
  149. package/dist/cjs/toolbar/widgets/TextToolWidget.js +64 -87
  150. package/dist/cjs/toolbar/widgets/components/makeColorInput.d.ts +10 -0
  151. package/dist/cjs/toolbar/{makeColorInput.js → widgets/components/makeColorInput.js} +57 -34
  152. package/dist/cjs/toolbar/widgets/components/makeFileInput.d.ts +12 -0
  153. package/dist/cjs/toolbar/widgets/components/makeFileInput.js +111 -0
  154. package/dist/cjs/toolbar/widgets/components/makeGridSelector.d.ts +24 -0
  155. package/dist/cjs/toolbar/widgets/components/makeGridSelector.js +127 -0
  156. package/dist/cjs/toolbar/widgets/components/makeSeparator.d.ts +7 -0
  157. package/dist/cjs/toolbar/widgets/components/makeSeparator.js +16 -0
  158. package/dist/cjs/toolbar/widgets/components/makeThicknessSlider.d.ts +8 -0
  159. package/dist/cjs/toolbar/widgets/components/makeThicknessSlider.js +47 -0
  160. package/dist/cjs/toolbar/widgets/keybindings.js +8 -5
  161. package/dist/cjs/toolbar/widgets/layout/DropdownLayoutManager.d.ts +21 -0
  162. package/dist/cjs/toolbar/widgets/layout/DropdownLayoutManager.js +199 -0
  163. package/dist/cjs/toolbar/widgets/layout/EdgeToolbarLayoutManager.d.ts +14 -0
  164. package/dist/cjs/toolbar/widgets/layout/EdgeToolbarLayoutManager.js +60 -0
  165. package/dist/cjs/toolbar/widgets/layout/types.d.ts +63 -0
  166. package/dist/cjs/toolbar/widgets/layout/types.js +2 -0
  167. package/dist/cjs/toolbar/widgets/lib.d.ts +1 -1
  168. package/dist/cjs/toolbar/widgets/lib.js +15 -11
  169. package/dist/cjs/tools/BaseTool.d.ts +28 -9
  170. package/dist/cjs/tools/BaseTool.js +128 -51
  171. package/dist/cjs/tools/Eraser.d.ts +8 -1
  172. package/dist/cjs/tools/Eraser.js +82 -92
  173. package/dist/cjs/tools/FindTool.d.ts +1 -1
  174. package/dist/cjs/tools/FindTool.js +61 -77
  175. package/dist/cjs/tools/InputFilter/FunctionMapper.d.ts +12 -0
  176. package/dist/cjs/tools/InputFilter/FunctionMapper.js +21 -0
  177. package/dist/cjs/tools/InputFilter/InputMapper.d.ts +23 -0
  178. package/dist/cjs/tools/InputFilter/InputMapper.js +38 -0
  179. package/dist/cjs/tools/InputFilter/InputPipeline.d.ts +15 -0
  180. package/dist/cjs/tools/InputFilter/InputPipeline.js +54 -0
  181. package/dist/cjs/tools/InputFilter/InputStabilizer.d.ts +29 -0
  182. package/dist/cjs/tools/InputFilter/InputStabilizer.js +181 -0
  183. package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.d.ts +21 -0
  184. package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.js +84 -0
  185. package/dist/cjs/tools/PanZoom.d.ts +4 -2
  186. package/dist/cjs/tools/PanZoom.js +186 -248
  187. package/dist/cjs/tools/PasteHandler.d.ts +1 -1
  188. package/dist/cjs/tools/PasteHandler.js +49 -148
  189. package/dist/cjs/tools/Pen.d.ts +12 -11
  190. package/dist/cjs/tools/Pen.js +123 -158
  191. package/dist/cjs/tools/PipetteTool.d.ts +11 -2
  192. package/dist/cjs/tools/PipetteTool.js +51 -48
  193. package/dist/cjs/tools/SelectionTool/SelectAllShortcutHandler.d.ts +1 -1
  194. package/dist/cjs/tools/SelectionTool/SelectAllShortcutHandler.js +15 -30
  195. package/dist/cjs/tools/SelectionTool/Selection.d.ts +5 -5
  196. package/dist/cjs/tools/SelectionTool/Selection.js +308 -415
  197. package/dist/cjs/tools/SelectionTool/SelectionHandle.d.ts +15 -5
  198. package/dist/cjs/tools/SelectionTool/SelectionHandle.js +63 -37
  199. package/dist/cjs/tools/SelectionTool/SelectionTool.d.ts +4 -4
  200. package/dist/cjs/tools/SelectionTool/SelectionTool.js +164 -187
  201. package/dist/cjs/tools/SelectionTool/TransformMode.d.ts +1 -1
  202. package/dist/cjs/tools/SelectionTool/TransformMode.js +65 -66
  203. package/dist/cjs/tools/SoundUITool.d.ts +2 -1
  204. package/dist/cjs/tools/SoundUITool.js +70 -84
  205. package/dist/cjs/tools/TextTool.d.ts +5 -3
  206. package/dist/cjs/tools/TextTool.js +169 -173
  207. package/dist/cjs/tools/ToolController.d.ts +16 -2
  208. package/dist/cjs/tools/ToolController.js +124 -100
  209. package/dist/cjs/tools/ToolEnabledGroup.js +6 -9
  210. package/dist/cjs/tools/ToolSwitcherShortcut.d.ts +1 -1
  211. package/dist/cjs/tools/ToolSwitcherShortcut.js +16 -32
  212. package/dist/cjs/tools/ToolbarShortcutHandler.d.ts +1 -1
  213. package/dist/cjs/tools/ToolbarShortcutHandler.js +17 -33
  214. package/dist/cjs/tools/UndoRedoShortcut.d.ts +1 -1
  215. package/dist/cjs/tools/UndoRedoShortcut.js +12 -27
  216. package/dist/cjs/tools/keybindings.js +21 -18
  217. package/dist/cjs/tools/lib.js +17 -14
  218. package/dist/cjs/tools/localization.d.ts +2 -1
  219. package/dist/cjs/tools/localization.js +8 -7
  220. package/dist/cjs/types.d.ts +22 -80
  221. package/dist/cjs/types.js +8 -16
  222. package/dist/cjs/util/ReactiveValue.d.ts +65 -0
  223. package/dist/cjs/util/ReactiveValue.js +166 -0
  224. package/dist/cjs/util/assertions.js +5 -8
  225. package/dist/cjs/util/fileToBase64.js +6 -6
  226. package/dist/cjs/util/guessKeyCodeFromKey.d.ts +9 -0
  227. package/dist/cjs/util/guessKeyCodeFromKey.js +32 -0
  228. package/dist/cjs/util/listPrefixMatch.d.ts +6 -0
  229. package/dist/cjs/util/listPrefixMatch.js +17 -0
  230. package/dist/cjs/util/stopPropagationOfScrollingWheelEvents.d.ts +2 -0
  231. package/dist/cjs/util/stopPropagationOfScrollingWheelEvents.js +17 -0
  232. package/dist/cjs/util/untilNextAnimationFrame.js +3 -3
  233. package/dist/cjs/util/waitForAll.js +3 -3
  234. package/dist/cjs/util/waitForTimeout.js +3 -3
  235. package/dist/cjs/version.d.ts +4 -0
  236. package/dist/cjs/version.js +5 -0
  237. package/dist/mjs/Editor.d.ts +91 -12
  238. package/dist/mjs/Editor.mjs +565 -563
  239. package/dist/mjs/EditorImage.d.ts +5 -2
  240. package/dist/mjs/EditorImage.mjs +248 -291
  241. package/dist/mjs/EventDispatcher.mjs +17 -20
  242. package/dist/mjs/Pointer.d.ts +3 -1
  243. package/dist/mjs/Pointer.mjs +43 -45
  244. package/dist/mjs/SVGLoader.d.ts +7 -1
  245. package/dist/mjs/SVGLoader.mjs +338 -466
  246. package/dist/mjs/UndoRedoHistory.mjs +27 -39
  247. package/dist/mjs/Viewport.d.ts +1 -4
  248. package/dist/mjs/Viewport.mjs +139 -187
  249. package/dist/mjs/commands/Command.mjs +21 -49
  250. package/dist/mjs/commands/Duplicate.mjs +22 -41
  251. package/dist/mjs/commands/Erase.mjs +30 -51
  252. package/dist/mjs/commands/SerializableCommand.mjs +16 -34
  253. package/dist/mjs/commands/UnresolvedCommand.mjs +10 -29
  254. package/dist/mjs/commands/invertCommand.mjs +24 -49
  255. package/dist/mjs/commands/localization.d.ts +1 -1
  256. package/dist/mjs/commands/localization.mjs +10 -10
  257. package/dist/mjs/commands/uniteCommands.mjs +52 -85
  258. package/dist/mjs/components/AbstractComponent.d.ts +11 -3
  259. package/dist/mjs/components/AbstractComponent.mjs +135 -166
  260. package/dist/mjs/components/BackgroundComponent.d.ts +3 -6
  261. package/dist/mjs/components/BackgroundComponent.mjs +107 -136
  262. package/dist/mjs/components/ImageComponent.d.ts +3 -5
  263. package/dist/mjs/components/ImageComponent.mjs +90 -174
  264. package/dist/mjs/components/RestylableComponent.d.ts +1 -1
  265. package/dist/mjs/components/RestylableComponent.mjs +35 -53
  266. package/dist/mjs/components/SVGGlobalAttributesObject.d.ts +1 -3
  267. package/dist/mjs/components/SVGGlobalAttributesObject.mjs +29 -50
  268. package/dist/mjs/components/Stroke.d.ts +4 -6
  269. package/dist/mjs/components/Stroke.mjs +89 -119
  270. package/dist/mjs/components/TextComponent.d.ts +2 -4
  271. package/dist/mjs/components/TextComponent.mjs +180 -228
  272. package/dist/mjs/components/UnknownSVGObject.d.ts +1 -3
  273. package/dist/mjs/components/UnknownSVGObject.mjs +26 -43
  274. package/dist/mjs/components/builders/ArrowBuilder.d.ts +1 -1
  275. package/dist/mjs/components/builders/ArrowBuilder.mjs +32 -35
  276. package/dist/mjs/components/builders/CircleBuilder.mjs +35 -38
  277. package/dist/mjs/components/builders/FreehandLineBuilder.d.ts +3 -2
  278. package/dist/mjs/components/builders/FreehandLineBuilder.mjs +52 -69
  279. package/dist/mjs/components/builders/LineBuilder.d.ts +1 -1
  280. package/dist/mjs/components/builders/LineBuilder.mjs +30 -32
  281. package/dist/mjs/components/builders/PressureSensitiveFreehandLineBuilder.d.ts +1 -1
  282. package/dist/mjs/components/builders/PressureSensitiveFreehandLineBuilder.mjs +103 -115
  283. package/dist/mjs/components/builders/RectangleBuilder.d.ts +1 -1
  284. package/dist/mjs/components/builders/RectangleBuilder.mjs +27 -31
  285. package/dist/mjs/components/builders/types.d.ts +1 -1
  286. package/dist/mjs/components/lib.d.ts +3 -1
  287. package/dist/mjs/components/lib.mjs +1 -1
  288. package/dist/mjs/components/localization.mjs +5 -5
  289. package/dist/mjs/components/util/StrokeSmoother.d.ts +1 -2
  290. package/dist/mjs/components/util/StrokeSmoother.mjs +63 -69
  291. package/dist/mjs/components/util/describeComponentList.d.ts +1 -1
  292. package/dist/mjs/components/util/describeComponentList.mjs +4 -5
  293. package/dist/mjs/dialogs/makeAboutDialog.d.ts +15 -0
  294. package/dist/mjs/dialogs/makeAboutDialog.mjs +52 -0
  295. package/dist/mjs/inputEvents.d.ts +84 -0
  296. package/dist/mjs/inputEvents.mjs +34 -0
  297. package/dist/mjs/lib.d.ts +29 -13
  298. package/dist/mjs/lib.mjs +30 -13
  299. package/dist/mjs/localization.mjs +14 -13
  300. package/dist/mjs/localizations/de.mjs +116 -12
  301. package/dist/mjs/localizations/en.mjs +3 -12
  302. package/dist/mjs/localizations/es.mjs +61 -22
  303. package/dist/mjs/localizations/getLocalizationTable.mjs +12 -13
  304. package/dist/mjs/rendering/Display.d.ts +1 -2
  305. package/dist/mjs/rendering/Display.mjs +62 -79
  306. package/dist/mjs/rendering/RenderablePathSpec.d.ts +15 -0
  307. package/dist/mjs/rendering/RenderablePathSpec.mjs +64 -0
  308. package/dist/mjs/rendering/RenderingStyle.d.ts +4 -4
  309. package/dist/mjs/rendering/RenderingStyle.mjs +16 -26
  310. package/dist/mjs/rendering/TextRenderingStyle.d.ts +10 -10
  311. package/dist/mjs/rendering/TextRenderingStyle.mjs +12 -17
  312. package/dist/mjs/rendering/caching/CacheRecord.d.ts +1 -2
  313. package/dist/mjs/rendering/caching/CacheRecord.mjs +20 -23
  314. package/dist/mjs/rendering/caching/CacheRecordManager.d.ts +1 -1
  315. package/dist/mjs/rendering/caching/CacheRecordManager.mjs +13 -15
  316. package/dist/mjs/rendering/caching/RenderingCache.mjs +13 -17
  317. package/dist/mjs/rendering/caching/RenderingCacheNode.d.ts +1 -1
  318. package/dist/mjs/rendering/caching/RenderingCacheNode.mjs +94 -115
  319. package/dist/mjs/rendering/caching/testUtils.mjs +19 -21
  320. package/dist/mjs/rendering/caching/types.d.ts +3 -3
  321. package/dist/mjs/rendering/localization.mjs +6 -6
  322. package/dist/mjs/rendering/renderers/AbstractRenderer.d.ts +2 -11
  323. package/dist/mjs/rendering/renderers/AbstractRenderer.mjs +47 -52
  324. package/dist/mjs/rendering/renderers/CanvasRenderer.d.ts +3 -5
  325. package/dist/mjs/rendering/renderers/CanvasRenderer.mjs +84 -103
  326. package/dist/mjs/rendering/renderers/DummyRenderer.d.ts +1 -4
  327. package/dist/mjs/rendering/renderers/DummyRenderer.mjs +51 -75
  328. package/dist/mjs/rendering/renderers/SVGRenderer.d.ts +5 -5
  329. package/dist/mjs/rendering/renderers/SVGRenderer.mjs +185 -171
  330. package/dist/mjs/rendering/renderers/TextOnlyRenderer.d.ts +1 -3
  331. package/dist/mjs/rendering/renderers/TextOnlyRenderer.mjs +43 -72
  332. package/dist/mjs/shortcuts/KeyBinding.d.ts +5 -0
  333. package/dist/mjs/shortcuts/KeyBinding.mjs +94 -71
  334. package/dist/mjs/shortcuts/KeyboardShortcutManager.d.ts +1 -1
  335. package/dist/mjs/shortcuts/KeyboardShortcutManager.mjs +32 -44
  336. package/dist/mjs/testing/createEditor.mjs +2 -2
  337. package/dist/mjs/testing/getUniquePointerId.mjs +4 -5
  338. package/dist/mjs/testing/sendPenEvent.d.ts +2 -2
  339. package/dist/mjs/testing/sendPenEvent.mjs +5 -5
  340. package/dist/mjs/testing/sendTouchEvent.d.ts +2 -2
  341. package/dist/mjs/testing/sendTouchEvent.mjs +8 -16
  342. package/dist/mjs/toolbar/AbstractToolbar.d.ts +166 -0
  343. package/dist/mjs/toolbar/AbstractToolbar.mjs +405 -0
  344. package/dist/mjs/toolbar/DropdownToolbar.d.ts +43 -0
  345. package/dist/mjs/toolbar/DropdownToolbar.mjs +168 -0
  346. package/dist/mjs/toolbar/EdgeToolbar.d.ts +47 -0
  347. package/dist/mjs/toolbar/EdgeToolbar.mjs +414 -0
  348. package/dist/mjs/toolbar/IconProvider.d.ts +54 -30
  349. package/dist/mjs/toolbar/IconProvider.mjs +644 -219
  350. package/dist/mjs/toolbar/constants.d.ts +1 -0
  351. package/dist/mjs/toolbar/constants.mjs +1 -0
  352. package/dist/mjs/toolbar/lib.d.ts +4 -2
  353. package/dist/mjs/toolbar/lib.mjs +3 -1
  354. package/dist/mjs/toolbar/localization.d.ts +9 -2
  355. package/dist/mjs/toolbar/localization.mjs +27 -20
  356. package/dist/mjs/toolbar/types.d.ts +7 -0
  357. package/dist/mjs/toolbar/widgets/ActionButtonWidget.d.ts +1 -1
  358. package/dist/mjs/toolbar/widgets/ActionButtonWidget.mjs +19 -39
  359. package/dist/mjs/toolbar/widgets/BaseToolWidget.d.ts +1 -1
  360. package/dist/mjs/toolbar/widgets/BaseToolWidget.mjs +30 -36
  361. package/dist/mjs/toolbar/widgets/BaseWidget.d.ts +60 -5
  362. package/dist/mjs/toolbar/widgets/BaseWidget.mjs +227 -176
  363. package/dist/mjs/toolbar/widgets/DocumentPropertiesWidget.mjs +98 -111
  364. package/dist/mjs/toolbar/widgets/EraserToolWidget.d.ts +1 -3
  365. package/dist/mjs/toolbar/widgets/EraserToolWidget.mjs +41 -73
  366. package/dist/mjs/toolbar/widgets/HandToolWidget.d.ts +1 -0
  367. package/dist/mjs/toolbar/widgets/HandToolWidget.mjs +94 -136
  368. package/dist/mjs/toolbar/widgets/InsertImageWidget.d.ts +9 -7
  369. package/dist/mjs/toolbar/widgets/InsertImageWidget.mjs +140 -208
  370. package/dist/mjs/toolbar/widgets/OverflowWidget.mjs +30 -62
  371. package/dist/mjs/toolbar/widgets/PenToolWidget.d.ts +8 -1
  372. package/dist/mjs/toolbar/widgets/PenToolWidget.mjs +150 -225
  373. package/dist/mjs/toolbar/widgets/SelectionToolWidget.d.ts +3 -1
  374. package/dist/mjs/toolbar/widgets/SelectionToolWidget.mjs +97 -173
  375. package/dist/mjs/toolbar/widgets/TextToolWidget.mjs +59 -85
  376. package/dist/mjs/toolbar/widgets/components/makeColorInput.d.ts +10 -0
  377. package/dist/mjs/toolbar/{makeColorInput.mjs → widgets/components/makeColorInput.mjs} +53 -33
  378. package/dist/mjs/toolbar/widgets/components/makeFileInput.d.ts +12 -0
  379. package/dist/mjs/toolbar/widgets/components/makeFileInput.mjs +106 -0
  380. package/dist/mjs/toolbar/widgets/components/makeGridSelector.d.ts +24 -0
  381. package/dist/mjs/toolbar/widgets/components/makeGridSelector.mjs +122 -0
  382. package/dist/mjs/toolbar/widgets/components/makeSeparator.d.ts +7 -0
  383. package/dist/mjs/toolbar/widgets/components/makeSeparator.mjs +14 -0
  384. package/dist/mjs/toolbar/widgets/components/makeThicknessSlider.d.ts +8 -0
  385. package/dist/mjs/toolbar/widgets/components/makeThicknessSlider.mjs +45 -0
  386. package/dist/mjs/toolbar/widgets/keybindings.mjs +5 -5
  387. package/dist/mjs/toolbar/widgets/layout/DropdownLayoutManager.d.ts +21 -0
  388. package/dist/mjs/toolbar/widgets/layout/DropdownLayoutManager.mjs +193 -0
  389. package/dist/mjs/toolbar/widgets/layout/EdgeToolbarLayoutManager.d.ts +14 -0
  390. package/dist/mjs/toolbar/widgets/layout/EdgeToolbarLayoutManager.mjs +57 -0
  391. package/dist/mjs/toolbar/widgets/layout/types.d.ts +63 -0
  392. package/dist/mjs/toolbar/widgets/lib.d.ts +1 -1
  393. package/dist/mjs/toolbar/widgets/lib.mjs +1 -1
  394. package/dist/mjs/tools/BaseTool.d.ts +28 -9
  395. package/dist/mjs/tools/BaseTool.mjs +127 -50
  396. package/dist/mjs/tools/Eraser.d.ts +8 -1
  397. package/dist/mjs/tools/Eraser.mjs +72 -86
  398. package/dist/mjs/tools/FindTool.d.ts +1 -1
  399. package/dist/mjs/tools/FindTool.mjs +55 -75
  400. package/dist/mjs/tools/InputFilter/FunctionMapper.d.ts +12 -0
  401. package/dist/mjs/tools/InputFilter/FunctionMapper.mjs +15 -0
  402. package/dist/mjs/tools/InputFilter/InputMapper.d.ts +23 -0
  403. package/dist/mjs/tools/InputFilter/InputMapper.mjs +36 -0
  404. package/dist/mjs/tools/InputFilter/InputPipeline.d.ts +15 -0
  405. package/dist/mjs/tools/InputFilter/InputPipeline.mjs +49 -0
  406. package/dist/mjs/tools/InputFilter/InputStabilizer.d.ts +29 -0
  407. package/dist/mjs/tools/InputFilter/InputStabilizer.mjs +175 -0
  408. package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.d.ts +21 -0
  409. package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.mjs +78 -0
  410. package/dist/mjs/tools/PanZoom.d.ts +4 -2
  411. package/dist/mjs/tools/PanZoom.mjs +169 -235
  412. package/dist/mjs/tools/PasteHandler.d.ts +1 -1
  413. package/dist/mjs/tools/PasteHandler.mjs +42 -145
  414. package/dist/mjs/tools/Pen.d.ts +12 -11
  415. package/dist/mjs/tools/Pen.mjs +115 -154
  416. package/dist/mjs/tools/PipetteTool.d.ts +11 -2
  417. package/dist/mjs/tools/PipetteTool.mjs +47 -48
  418. package/dist/mjs/tools/SelectionTool/SelectAllShortcutHandler.d.ts +1 -1
  419. package/dist/mjs/tools/SelectionTool/SelectAllShortcutHandler.mjs +9 -28
  420. package/dist/mjs/tools/SelectionTool/Selection.d.ts +5 -5
  421. package/dist/mjs/tools/SelectionTool/Selection.mjs +268 -401
  422. package/dist/mjs/tools/SelectionTool/SelectionHandle.d.ts +15 -5
  423. package/dist/mjs/tools/SelectionTool/SelectionHandle.mjs +62 -37
  424. package/dist/mjs/tools/SelectionTool/SelectionTool.d.ts +4 -4
  425. package/dist/mjs/tools/SelectionTool/SelectionTool.mjs +153 -179
  426. package/dist/mjs/tools/SelectionTool/TransformMode.d.ts +1 -1
  427. package/dist/mjs/tools/SelectionTool/TransformMode.mjs +52 -59
  428. package/dist/mjs/tools/SoundUITool.d.ts +2 -1
  429. package/dist/mjs/tools/SoundUITool.mjs +66 -84
  430. package/dist/mjs/tools/TextTool.d.ts +5 -3
  431. package/dist/mjs/tools/TextTool.mjs +155 -163
  432. package/dist/mjs/tools/ToolController.d.ts +16 -2
  433. package/dist/mjs/tools/ToolController.mjs +81 -84
  434. package/dist/mjs/tools/ToolEnabledGroup.mjs +6 -10
  435. package/dist/mjs/tools/ToolSwitcherShortcut.d.ts +1 -1
  436. package/dist/mjs/tools/ToolSwitcherShortcut.mjs +12 -32
  437. package/dist/mjs/tools/ToolbarShortcutHandler.d.ts +1 -1
  438. package/dist/mjs/tools/ToolbarShortcutHandler.mjs +13 -33
  439. package/dist/mjs/tools/UndoRedoShortcut.d.ts +1 -1
  440. package/dist/mjs/tools/UndoRedoShortcut.mjs +7 -26
  441. package/dist/mjs/tools/keybindings.mjs +34 -34
  442. package/dist/mjs/tools/localization.d.ts +2 -1
  443. package/dist/mjs/tools/localization.mjs +9 -8
  444. package/dist/mjs/types.d.ts +22 -80
  445. package/dist/mjs/types.mjs +7 -15
  446. package/dist/mjs/util/ReactiveValue.d.ts +65 -0
  447. package/dist/mjs/util/ReactiveValue.mjs +161 -0
  448. package/dist/mjs/util/assertions.mjs +5 -8
  449. package/dist/mjs/util/fileToBase64.mjs +6 -6
  450. package/dist/mjs/util/guessKeyCodeFromKey.d.ts +9 -0
  451. package/dist/mjs/util/guessKeyCodeFromKey.mjs +30 -0
  452. package/dist/mjs/util/listPrefixMatch.d.ts +6 -0
  453. package/dist/mjs/util/listPrefixMatch.mjs +15 -0
  454. package/dist/mjs/util/stopPropagationOfScrollingWheelEvents.d.ts +2 -0
  455. package/dist/mjs/util/stopPropagationOfScrollingWheelEvents.mjs +15 -0
  456. package/dist/mjs/util/untilNextAnimationFrame.mjs +3 -3
  457. package/dist/mjs/util/waitForAll.mjs +3 -3
  458. package/dist/mjs/util/waitForTimeout.mjs +3 -3
  459. package/dist/mjs/version.d.ts +4 -0
  460. package/dist/mjs/version.mjs +3 -0
  461. package/package.json +11 -22
  462. package/src/Coloris.css +8 -8
  463. package/src/Editor.scss +148 -0
  464. package/src/dialogs/dialogs.scss +36 -0
  465. package/src/dialogs/makeAboutDialog.scss +41 -0
  466. package/src/styles.js +1 -1
  467. package/src/toolbar/{toolbar.css → AbstractToolbar.scss} +47 -85
  468. package/src/toolbar/DropdownToolbar.scss +46 -0
  469. package/src/toolbar/EdgeToolbar.scss +511 -0
  470. package/src/toolbar/toolbar.scss +11 -0
  471. package/src/toolbar/widgets/DocumentPropertiesWidget.scss +7 -0
  472. package/src/toolbar/widgets/HandToolWidget.scss +14 -0
  473. package/src/toolbar/widgets/InsertImageWidget.scss +41 -0
  474. package/src/toolbar/widgets/PenToolWidget.css +0 -51
  475. package/src/toolbar/widgets/SelectionToolWidget.scss +6 -0
  476. package/src/toolbar/widgets/components/components.scss +5 -0
  477. package/src/toolbar/widgets/components/makeColorInput.scss +82 -0
  478. package/src/toolbar/widgets/components/makeFileInput.scss +77 -0
  479. package/src/toolbar/widgets/components/makeGridSelector.scss +60 -0
  480. package/src/toolbar/widgets/components/makeSeparator.scss +14 -0
  481. package/src/toolbar/widgets/components/makeThicknessSlider.scss +9 -0
  482. package/src/tools/FindTool.css +3 -3
  483. package/src/tools/SelectionTool/SelectionTool.css +23 -11
  484. package/src/tools/tools.scss +4 -0
  485. package/tsconfig.json +1 -1
  486. package/typedoc.json +4 -0
  487. package/dist/cjs/Color4.d.ts +0 -69
  488. package/dist/cjs/Color4.js +0 -263
  489. package/dist/cjs/Editor.loadFrom.test.d.ts +0 -1
  490. package/dist/cjs/Editor.toSVG.test.d.ts +0 -1
  491. package/dist/cjs/EditorImage.test.d.ts +0 -1
  492. package/dist/cjs/EventDispatcher.test.d.ts +0 -1
  493. package/dist/cjs/SVGLoader.test.d.ts +0 -1
  494. package/dist/cjs/UndoRedoHistory.test.d.ts +0 -1
  495. package/dist/cjs/commands/uniteCommands.test.d.ts +0 -1
  496. package/dist/cjs/components/AbstractComponent.transformBy.test.d.ts +0 -1
  497. package/dist/cjs/components/BackgroundComponent.test.d.ts +0 -1
  498. package/dist/cjs/components/Stroke.test.d.ts +0 -1
  499. package/dist/cjs/components/TextComponent.test.d.ts +0 -1
  500. package/dist/cjs/components/UnknownSVGObject.test.d.ts +0 -1
  501. package/dist/cjs/components/builders/FreehandLineBuilder.test.d.ts +0 -1
  502. package/dist/cjs/localizations/getLocalizationTable.test.d.ts +0 -1
  503. package/dist/cjs/math/Mat33.d.ts +0 -123
  504. package/dist/cjs/math/Mat33.js +0 -340
  505. package/dist/cjs/math/Mat33.test.d.ts +0 -1
  506. package/dist/cjs/math/Vec2.d.ts +0 -33
  507. package/dist/cjs/math/Vec2.js +0 -37
  508. package/dist/cjs/math/Vec2.test.d.ts +0 -1
  509. package/dist/cjs/math/Vec3.d.ts +0 -106
  510. package/dist/cjs/math/Vec3.js +0 -183
  511. package/dist/cjs/math/Vec3.test.d.ts +0 -1
  512. package/dist/cjs/math/lib.d.ts +0 -7
  513. package/dist/cjs/math/lib.js +0 -15
  514. package/dist/cjs/math/polynomial/solveQuadratic.d.ts +0 -9
  515. package/dist/cjs/math/polynomial/solveQuadratic.js +0 -39
  516. package/dist/cjs/math/polynomial/solveQuadratic.test.d.ts +0 -1
  517. package/dist/cjs/math/rounding.d.ts +0 -4
  518. package/dist/cjs/math/rounding.js +0 -140
  519. package/dist/cjs/math/rounding.test.d.ts +0 -1
  520. package/dist/cjs/math/shapes/Abstract2DShape.d.ts +0 -49
  521. package/dist/cjs/math/shapes/Abstract2DShape.js +0 -42
  522. package/dist/cjs/math/shapes/BezierJSWrapper.d.ts +0 -36
  523. package/dist/cjs/math/shapes/BezierJSWrapper.js +0 -109
  524. package/dist/cjs/math/shapes/CubicBezier.d.ts +0 -17
  525. package/dist/cjs/math/shapes/CubicBezier.js +0 -50
  526. package/dist/cjs/math/shapes/LineSegment2.d.ts +0 -70
  527. package/dist/cjs/math/shapes/LineSegment2.js +0 -204
  528. package/dist/cjs/math/shapes/LineSegment2.test.d.ts +0 -1
  529. package/dist/cjs/math/shapes/Path.d.ts +0 -93
  530. package/dist/cjs/math/shapes/Path.fromString.test.d.ts +0 -1
  531. package/dist/cjs/math/shapes/Path.js +0 -865
  532. package/dist/cjs/math/shapes/Path.test.d.ts +0 -1
  533. package/dist/cjs/math/shapes/Path.toString.test.d.ts +0 -1
  534. package/dist/cjs/math/shapes/PointShape2D.d.ts +0 -18
  535. package/dist/cjs/math/shapes/PointShape2D.js +0 -46
  536. package/dist/cjs/math/shapes/QuadraticBezier.d.ts +0 -34
  537. package/dist/cjs/math/shapes/QuadraticBezier.js +0 -133
  538. package/dist/cjs/math/shapes/QuadraticBezier.test.d.ts +0 -1
  539. package/dist/cjs/math/shapes/Rect2.d.ts +0 -57
  540. package/dist/cjs/math/shapes/Rect2.js +0 -311
  541. package/dist/cjs/math/shapes/Rect2.test.d.ts +0 -1
  542. package/dist/cjs/math/shapes/Triangle.d.ts +0 -46
  543. package/dist/cjs/math/shapes/Triangle.js +0 -148
  544. package/dist/cjs/math/shapes/Triangle.test.d.ts +0 -1
  545. package/dist/cjs/rendering/RenderingStyle.test.d.ts +0 -1
  546. package/dist/cjs/rendering/caching/CacheRecord.test.d.ts +0 -1
  547. package/dist/cjs/rendering/caching/RenderingCache.test.d.ts +0 -1
  548. package/dist/cjs/rendering/renderers/DummyRenderer.test.d.ts +0 -1
  549. package/dist/cjs/rendering/renderers/TextOnlyRenderer.test.d.ts +0 -1
  550. package/dist/cjs/shortcuts/KeyBinding.test.d.ts +0 -1
  551. package/dist/cjs/shortcuts/KeyboardShortcutManager.test.d.ts +0 -1
  552. package/dist/cjs/toolbar/HTMLToolbar.d.ts +0 -105
  553. package/dist/cjs/toolbar/HTMLToolbar.js +0 -465
  554. package/dist/cjs/toolbar/makeColorInput.d.ts +0 -6
  555. package/dist/cjs/tools/Eraser.test.d.ts +0 -1
  556. package/dist/cjs/tools/PanZoom.test.d.ts +0 -1
  557. package/dist/cjs/tools/Pen.test.d.ts +0 -1
  558. package/dist/cjs/tools/SelectionTool/SelectionTool.test.d.ts +0 -1
  559. package/dist/cjs/tools/UndoRedoShortcut.test.d.ts +0 -1
  560. package/dist/mjs/Color4.d.ts +0 -69
  561. package/dist/mjs/Color4.mjs +0 -260
  562. package/dist/mjs/Color4.test.d.ts +0 -1
  563. package/dist/mjs/Editor.loadFrom.test.d.ts +0 -1
  564. package/dist/mjs/Editor.toSVG.test.d.ts +0 -1
  565. package/dist/mjs/EditorImage.test.d.ts +0 -1
  566. package/dist/mjs/EventDispatcher.test.d.ts +0 -1
  567. package/dist/mjs/SVGLoader.test.d.ts +0 -1
  568. package/dist/mjs/UndoRedoHistory.test.d.ts +0 -1
  569. package/dist/mjs/commands/uniteCommands.test.d.ts +0 -1
  570. package/dist/mjs/components/AbstractComponent.transformBy.test.d.ts +0 -1
  571. package/dist/mjs/components/BackgroundComponent.test.d.ts +0 -1
  572. package/dist/mjs/components/Stroke.test.d.ts +0 -1
  573. package/dist/mjs/components/TextComponent.test.d.ts +0 -1
  574. package/dist/mjs/components/UnknownSVGObject.test.d.ts +0 -1
  575. package/dist/mjs/components/builders/FreehandLineBuilder.test.d.ts +0 -1
  576. package/dist/mjs/localizations/getLocalizationTable.test.d.ts +0 -1
  577. package/dist/mjs/math/Mat33.d.ts +0 -123
  578. package/dist/mjs/math/Mat33.mjs +0 -338
  579. package/dist/mjs/math/Mat33.test.d.ts +0 -1
  580. package/dist/mjs/math/Vec2.d.ts +0 -33
  581. package/dist/mjs/math/Vec2.mjs +0 -34
  582. package/dist/mjs/math/Vec2.test.d.ts +0 -1
  583. package/dist/mjs/math/Vec3.d.ts +0 -106
  584. package/dist/mjs/math/Vec3.mjs +0 -181
  585. package/dist/mjs/math/Vec3.test.d.ts +0 -1
  586. package/dist/mjs/math/lib.d.ts +0 -7
  587. package/dist/mjs/math/lib.mjs +0 -7
  588. package/dist/mjs/math/polynomial/solveQuadratic.d.ts +0 -9
  589. package/dist/mjs/math/polynomial/solveQuadratic.mjs +0 -37
  590. package/dist/mjs/math/polynomial/solveQuadratic.test.d.ts +0 -1
  591. package/dist/mjs/math/rounding.d.ts +0 -4
  592. package/dist/mjs/math/rounding.mjs +0 -133
  593. package/dist/mjs/math/rounding.test.d.ts +0 -1
  594. package/dist/mjs/math/shapes/Abstract2DShape.d.ts +0 -49
  595. package/dist/mjs/math/shapes/Abstract2DShape.mjs +0 -40
  596. package/dist/mjs/math/shapes/BezierJSWrapper.d.ts +0 -36
  597. package/dist/mjs/math/shapes/BezierJSWrapper.mjs +0 -107
  598. package/dist/mjs/math/shapes/CubicBezier.d.ts +0 -17
  599. package/dist/mjs/math/shapes/CubicBezier.mjs +0 -48
  600. package/dist/mjs/math/shapes/LineSegment2.d.ts +0 -70
  601. package/dist/mjs/math/shapes/LineSegment2.mjs +0 -202
  602. package/dist/mjs/math/shapes/LineSegment2.test.d.ts +0 -1
  603. package/dist/mjs/math/shapes/Path.d.ts +0 -93
  604. package/dist/mjs/math/shapes/Path.fromString.test.d.ts +0 -1
  605. package/dist/mjs/math/shapes/Path.mjs +0 -862
  606. package/dist/mjs/math/shapes/Path.test.d.ts +0 -1
  607. package/dist/mjs/math/shapes/Path.toString.test.d.ts +0 -1
  608. package/dist/mjs/math/shapes/PointShape2D.d.ts +0 -18
  609. package/dist/mjs/math/shapes/PointShape2D.mjs +0 -44
  610. package/dist/mjs/math/shapes/QuadraticBezier.d.ts +0 -34
  611. package/dist/mjs/math/shapes/QuadraticBezier.mjs +0 -131
  612. package/dist/mjs/math/shapes/QuadraticBezier.test.d.ts +0 -1
  613. package/dist/mjs/math/shapes/Rect2.d.ts +0 -57
  614. package/dist/mjs/math/shapes/Rect2.mjs +0 -309
  615. package/dist/mjs/math/shapes/Rect2.test.d.ts +0 -1
  616. package/dist/mjs/math/shapes/Triangle.d.ts +0 -46
  617. package/dist/mjs/math/shapes/Triangle.mjs +0 -146
  618. package/dist/mjs/math/shapes/Triangle.test.d.ts +0 -1
  619. package/dist/mjs/rendering/RenderingStyle.test.d.ts +0 -1
  620. package/dist/mjs/rendering/caching/CacheRecord.test.d.ts +0 -1
  621. package/dist/mjs/rendering/caching/RenderingCache.test.d.ts +0 -1
  622. package/dist/mjs/rendering/renderers/DummyRenderer.test.d.ts +0 -1
  623. package/dist/mjs/rendering/renderers/TextOnlyRenderer.test.d.ts +0 -1
  624. package/dist/mjs/shortcuts/KeyBinding.test.d.ts +0 -1
  625. package/dist/mjs/shortcuts/KeyboardShortcutManager.test.d.ts +0 -1
  626. package/dist/mjs/toolbar/HTMLToolbar.d.ts +0 -105
  627. package/dist/mjs/toolbar/HTMLToolbar.mjs +0 -462
  628. package/dist/mjs/toolbar/makeColorInput.d.ts +0 -6
  629. package/dist/mjs/tools/Eraser.test.d.ts +0 -1
  630. package/dist/mjs/tools/PanZoom.test.d.ts +0 -1
  631. package/dist/mjs/tools/Pen.test.d.ts +0 -1
  632. package/dist/mjs/tools/SelectionTool/SelectionTool.test.d.ts +0 -1
  633. package/dist/mjs/tools/UndoRedoShortcut.test.d.ts +0 -1
  634. package/dist-test/test_imports/package-lock.json +0 -13
  635. package/dist-test/test_imports/package.json +0 -12
  636. package/dist-test/test_imports/test-imports.js +0 -17
  637. package/dist-test/test_imports/test-require.cjs +0 -19
  638. package/src/Color4.test.ts +0 -47
  639. package/src/Color4.ts +0 -304
  640. package/src/Editor.css +0 -98
  641. package/src/Editor.loadFrom.test.ts +0 -24
  642. package/src/Editor.toSVG.test.ts +0 -111
  643. package/src/Editor.ts +0 -1171
  644. package/src/EditorImage.test.ts +0 -120
  645. package/src/EditorImage.ts +0 -603
  646. package/src/EventDispatcher.test.ts +0 -123
  647. package/src/EventDispatcher.ts +0 -72
  648. package/src/Pointer.ts +0 -167
  649. package/src/SVGLoader.test.ts +0 -114
  650. package/src/SVGLoader.ts +0 -610
  651. package/src/UndoRedoHistory.test.ts +0 -33
  652. package/src/UndoRedoHistory.ts +0 -102
  653. package/src/Viewport.ts +0 -325
  654. package/src/bundle/bundled.ts +0 -7
  655. package/src/commands/Command.ts +0 -45
  656. package/src/commands/Duplicate.ts +0 -75
  657. package/src/commands/Erase.ts +0 -94
  658. package/src/commands/SerializableCommand.ts +0 -49
  659. package/src/commands/UnresolvedCommand.ts +0 -37
  660. package/src/commands/invertCommand.ts +0 -58
  661. package/src/commands/lib.ts +0 -16
  662. package/src/commands/localization.ts +0 -47
  663. package/src/commands/uniteCommands.test.ts +0 -23
  664. package/src/commands/uniteCommands.ts +0 -140
  665. package/src/components/AbstractComponent.transformBy.test.ts +0 -22
  666. package/src/components/AbstractComponent.ts +0 -374
  667. package/src/components/BackgroundComponent.test.ts +0 -45
  668. package/src/components/BackgroundComponent.ts +0 -353
  669. package/src/components/ImageComponent.ts +0 -178
  670. package/src/components/RestylableComponent.ts +0 -161
  671. package/src/components/SVGGlobalAttributesObject.ts +0 -81
  672. package/src/components/Stroke.test.ts +0 -139
  673. package/src/components/Stroke.ts +0 -296
  674. package/src/components/TextComponent.test.ts +0 -204
  675. package/src/components/TextComponent.ts +0 -432
  676. package/src/components/UnknownSVGObject.test.ts +0 -10
  677. package/src/components/UnknownSVGObject.ts +0 -60
  678. package/src/components/builders/ArrowBuilder.ts +0 -107
  679. package/src/components/builders/CircleBuilder.ts +0 -102
  680. package/src/components/builders/FreehandLineBuilder.test.ts +0 -25
  681. package/src/components/builders/FreehandLineBuilder.ts +0 -212
  682. package/src/components/builders/LineBuilder.ts +0 -77
  683. package/src/components/builders/PressureSensitiveFreehandLineBuilder.ts +0 -454
  684. package/src/components/builders/RectangleBuilder.ts +0 -74
  685. package/src/components/builders/types.ts +0 -15
  686. package/src/components/lib.ts +0 -31
  687. package/src/components/localization.ts +0 -24
  688. package/src/components/util/StrokeSmoother.ts +0 -302
  689. package/src/components/util/describeComponentList.ts +0 -18
  690. package/src/lib.ts +0 -69
  691. package/src/localization.ts +0 -34
  692. package/src/localizations/de.ts +0 -146
  693. package/src/localizations/en.ts +0 -8
  694. package/src/localizations/es.ts +0 -74
  695. package/src/localizations/getLocalizationTable.test.ts +0 -27
  696. package/src/localizations/getLocalizationTable.ts +0 -74
  697. package/src/math/Mat33.test.ts +0 -244
  698. package/src/math/Mat33.ts +0 -442
  699. package/src/math/Vec2.test.ts +0 -30
  700. package/src/math/Vec2.ts +0 -40
  701. package/src/math/Vec3.test.ts +0 -44
  702. package/src/math/Vec3.ts +0 -218
  703. package/src/math/lib.ts +0 -15
  704. package/src/math/polynomial/solveQuadratic.test.ts +0 -39
  705. package/src/math/polynomial/solveQuadratic.ts +0 -43
  706. package/src/math/rounding.test.ts +0 -65
  707. package/src/math/rounding.ts +0 -156
  708. package/src/math/shapes/Abstract2DShape.ts +0 -63
  709. package/src/math/shapes/BezierJSWrapper.ts +0 -93
  710. package/src/math/shapes/CubicBezier.ts +0 -35
  711. package/src/math/shapes/LineSegment2.test.ts +0 -99
  712. package/src/math/shapes/LineSegment2.ts +0 -231
  713. package/src/math/shapes/Path.fromString.test.ts +0 -223
  714. package/src/math/shapes/Path.test.ts +0 -309
  715. package/src/math/shapes/Path.toString.test.ts +0 -77
  716. package/src/math/shapes/Path.ts +0 -1027
  717. package/src/math/shapes/PointShape2D.ts +0 -33
  718. package/src/math/shapes/QuadraticBezier.test.ts +0 -31
  719. package/src/math/shapes/QuadraticBezier.ts +0 -141
  720. package/src/math/shapes/Rect2.test.ts +0 -209
  721. package/src/math/shapes/Rect2.ts +0 -344
  722. package/src/math/shapes/Triangle.test.ts +0 -61
  723. package/src/math/shapes/Triangle.ts +0 -139
  724. package/src/rendering/Display.ts +0 -248
  725. package/src/rendering/RenderingStyle.test.ts +0 -68
  726. package/src/rendering/RenderingStyle.ts +0 -55
  727. package/src/rendering/TextRenderingStyle.ts +0 -55
  728. package/src/rendering/caching/CacheRecord.test.ts +0 -49
  729. package/src/rendering/caching/CacheRecord.ts +0 -77
  730. package/src/rendering/caching/CacheRecordManager.ts +0 -71
  731. package/src/rendering/caching/RenderingCache.test.ts +0 -44
  732. package/src/rendering/caching/RenderingCache.ts +0 -66
  733. package/src/rendering/caching/RenderingCacheNode.ts +0 -405
  734. package/src/rendering/caching/testUtils.ts +0 -35
  735. package/src/rendering/caching/types.ts +0 -34
  736. package/src/rendering/lib.ts +0 -8
  737. package/src/rendering/localization.ts +0 -20
  738. package/src/rendering/renderers/AbstractRenderer.ts +0 -242
  739. package/src/rendering/renderers/CanvasRenderer.ts +0 -307
  740. package/src/rendering/renderers/DummyRenderer.test.ts +0 -42
  741. package/src/rendering/renderers/DummyRenderer.ts +0 -145
  742. package/src/rendering/renderers/SVGRenderer.ts +0 -377
  743. package/src/rendering/renderers/TextOnlyRenderer.test.ts +0 -34
  744. package/src/rendering/renderers/TextOnlyRenderer.ts +0 -71
  745. package/src/shortcuts/KeyBinding.test.ts +0 -51
  746. package/src/shortcuts/KeyBinding.ts +0 -218
  747. package/src/shortcuts/KeyboardShortcutManager.test.ts +0 -95
  748. package/src/shortcuts/KeyboardShortcutManager.ts +0 -163
  749. package/src/shortcuts/lib.ts +0 -3
  750. package/src/testing/createEditor.ts +0 -11
  751. package/src/testing/getUniquePointerId.ts +0 -18
  752. package/src/testing/lib.ts +0 -3
  753. package/src/testing/sendPenEvent.ts +0 -36
  754. package/src/testing/sendTouchEvent.ts +0 -71
  755. package/src/toolbar/HTMLToolbar.ts +0 -567
  756. package/src/toolbar/IconProvider.ts +0 -805
  757. package/src/toolbar/lib.ts +0 -4
  758. package/src/toolbar/localization.ts +0 -114
  759. package/src/toolbar/makeColorInput.ts +0 -159
  760. package/src/toolbar/types.ts +0 -5
  761. package/src/toolbar/widgets/ActionButtonWidget.ts +0 -39
  762. package/src/toolbar/widgets/BaseToolWidget.ts +0 -65
  763. package/src/toolbar/widgets/BaseWidget.ts +0 -428
  764. package/src/toolbar/widgets/DocumentPropertiesWidget.ts +0 -234
  765. package/src/toolbar/widgets/EraserToolWidget.ts +0 -85
  766. package/src/toolbar/widgets/HandToolWidget.ts +0 -250
  767. package/src/toolbar/widgets/InsertImageWidget.css +0 -44
  768. package/src/toolbar/widgets/InsertImageWidget.ts +0 -223
  769. package/src/toolbar/widgets/OverflowWidget.ts +0 -92
  770. package/src/toolbar/widgets/PenToolWidget.ts +0 -409
  771. package/src/toolbar/widgets/SelectionToolWidget.ts +0 -197
  772. package/src/toolbar/widgets/TextToolWidget.ts +0 -145
  773. package/src/toolbar/widgets/keybindings.ts +0 -21
  774. package/src/toolbar/widgets/lib.ts +0 -13
  775. package/src/tools/BaseTool.ts +0 -97
  776. package/src/tools/Eraser.test.ts +0 -103
  777. package/src/tools/Eraser.ts +0 -160
  778. package/src/tools/FindTool.ts +0 -153
  779. package/src/tools/PanZoom.test.ts +0 -349
  780. package/src/tools/PanZoom.ts +0 -502
  781. package/src/tools/PasteHandler.ts +0 -95
  782. package/src/tools/Pen.test.ts +0 -262
  783. package/src/tools/Pen.ts +0 -300
  784. package/src/tools/PipetteTool.ts +0 -55
  785. package/src/tools/SelectionTool/SelectAllShortcutHandler.ts +0 -29
  786. package/src/tools/SelectionTool/Selection.ts +0 -611
  787. package/src/tools/SelectionTool/SelectionHandle.ts +0 -108
  788. package/src/tools/SelectionTool/SelectionTool.test.ts +0 -261
  789. package/src/tools/SelectionTool/SelectionTool.ts +0 -496
  790. package/src/tools/SelectionTool/TransformMode.ts +0 -114
  791. package/src/tools/SelectionTool/types.ts +0 -11
  792. package/src/tools/SoundUITool.ts +0 -212
  793. package/src/tools/TextTool.ts +0 -340
  794. package/src/tools/ToolController.ts +0 -200
  795. package/src/tools/ToolEnabledGroup.ts +0 -14
  796. package/src/tools/ToolSwitcherShortcut.ts +0 -39
  797. package/src/tools/ToolbarShortcutHandler.ts +0 -39
  798. package/src/tools/UndoRedoShortcut.test.ts +0 -56
  799. package/src/tools/UndoRedoShortcut.ts +0 -24
  800. package/src/tools/keybindings.ts +0 -85
  801. package/src/tools/lib.ts +0 -22
  802. package/src/tools/localization.ts +0 -74
  803. package/src/tools/tools.css +0 -4
  804. package/src/types.ts +0 -239
  805. package/src/util/assertions.ts +0 -55
  806. package/src/util/fileToBase64.ts +0 -18
  807. package/src/util/untilNextAnimationFrame.ts +0 -9
  808. package/src/util/waitForAll.ts +0 -18
  809. package/src/util/waitForTimeout.ts +0 -9
  810. /package/dist/{cjs/Color4.test.d.ts → mjs/toolbar/widgets/layout/types.mjs} +0 -0
@@ -1,1027 +0,0 @@
1
- import { RenderablePathSpec } from '../../rendering/renderers/AbstractRenderer';
2
- import RenderingStyle from '../../rendering/RenderingStyle';
3
- import { toRoundedString, toStringOfSamePrecision } from '../rounding';
4
- import LineSegment2 from './LineSegment2';
5
- import Mat33 from '../Mat33';
6
- import Rect2 from './Rect2';
7
- import { Point2, Vec2 } from '../Vec2';
8
- import Abstract2DShape from './Abstract2DShape';
9
- import CubicBezier from './CubicBezier';
10
- import QuadraticBezier from './QuadraticBezier';
11
- import PointShape2D from './PointShape2D';
12
-
13
- export enum PathCommandType {
14
- LineTo,
15
- MoveTo,
16
- CubicBezierTo,
17
- QuadraticBezierTo,
18
- }
19
-
20
- export interface CubicBezierPathCommand {
21
- kind: PathCommandType.CubicBezierTo;
22
- controlPoint1: Point2;
23
- controlPoint2: Point2;
24
- endPoint: Point2;
25
- }
26
-
27
- export interface QuadraticBezierPathCommand {
28
- kind: PathCommandType.QuadraticBezierTo;
29
- controlPoint: Point2;
30
- endPoint: Point2;
31
- }
32
-
33
- export interface LinePathCommand {
34
- kind: PathCommandType.LineTo;
35
- point: Point2;
36
- }
37
-
38
- export interface MoveToPathCommand {
39
- kind: PathCommandType.MoveTo;
40
- point: Point2;
41
- }
42
-
43
- export type PathCommand = CubicBezierPathCommand | QuadraticBezierPathCommand | MoveToPathCommand | LinePathCommand;
44
-
45
- interface IntersectionResult {
46
- // @internal
47
- curve: Abstract2DShape;
48
-
49
- /** @internal @deprecated */
50
- parameterValue?: number;
51
-
52
- // Point at which the intersection occured.
53
- point: Point2;
54
- }
55
-
56
- type GeometryType = Abstract2DShape;
57
- type GeometryArrayType = Array<GeometryType>;
58
-
59
- export default class Path {
60
- /**
61
- * A rough estimate of the bounding box of the path.
62
- * A slight overestimate.
63
- * See {@link getExactBBox}
64
- */
65
- public readonly bbox: Rect2;
66
-
67
- public constructor(public readonly startPoint: Point2, public readonly parts: PathCommand[]) {
68
- // Initial bounding box contains one point: the start point.
69
- this.bbox = Rect2.bboxOf([startPoint]);
70
-
71
- // Convert into a representation of the geometry (cache for faster intersection
72
- // calculation)
73
- for (const part of parts) {
74
- this.bbox = this.bbox.union(Path.computeBBoxForSegment(startPoint, part));
75
- }
76
- }
77
-
78
- public getExactBBox(): Rect2 {
79
- const bboxes: Rect2[] = [];
80
- for (const part of this.geometry) {
81
- bboxes.push(part.getTightBoundingBox());
82
- }
83
-
84
- return Rect2.union(...bboxes);
85
- }
86
-
87
- private cachedGeometry: GeometryArrayType|null = null;
88
-
89
- // Lazy-loads and returns this path's geometry
90
- public get geometry(): GeometryArrayType {
91
- if (this.cachedGeometry) {
92
- return this.cachedGeometry;
93
- }
94
-
95
- let startPoint = this.startPoint;
96
- const geometry: GeometryArrayType = [];
97
-
98
- for (const part of this.parts) {
99
- switch (part.kind) {
100
- case PathCommandType.CubicBezierTo:
101
- geometry.push(
102
- new CubicBezier(
103
- startPoint, part.controlPoint1, part.controlPoint2, part.endPoint
104
- )
105
- );
106
- startPoint = part.endPoint;
107
- break;
108
- case PathCommandType.QuadraticBezierTo:
109
- geometry.push(
110
- new QuadraticBezier(
111
- startPoint, part.controlPoint, part.endPoint
112
- )
113
- );
114
- startPoint = part.endPoint;
115
- break;
116
- case PathCommandType.LineTo:
117
- geometry.push(
118
- new LineSegment2(startPoint, part.point)
119
- );
120
- startPoint = part.point;
121
- break;
122
- case PathCommandType.MoveTo:
123
- geometry.push(new PointShape2D(part.point));
124
- startPoint = part.point;
125
- break;
126
- }
127
- }
128
-
129
- this.cachedGeometry = geometry;
130
- return this.cachedGeometry;
131
- }
132
-
133
- private cachedPolylineApproximation: LineSegment2[]|null = null;
134
-
135
- // Approximates this path with a group of line segments.
136
- public polylineApproximation(): LineSegment2[] {
137
- if (this.cachedPolylineApproximation) {
138
- return this.cachedPolylineApproximation;
139
- }
140
-
141
- const points: Point2[] = [];
142
-
143
- for (const part of this.parts) {
144
- switch (part.kind) {
145
- case PathCommandType.CubicBezierTo:
146
- points.push(part.controlPoint1, part.controlPoint2, part.endPoint);
147
- break;
148
- case PathCommandType.QuadraticBezierTo:
149
- points.push(part.controlPoint, part.endPoint);
150
- break;
151
- case PathCommandType.MoveTo:
152
- case PathCommandType.LineTo:
153
- points.push(part.point);
154
- break;
155
- }
156
- }
157
-
158
- const result: LineSegment2[] = [];
159
- let prevPoint = this.startPoint;
160
- for (const point of points) {
161
- result.push(new LineSegment2(prevPoint, point));
162
- prevPoint = point;
163
- }
164
-
165
- return result;
166
- }
167
-
168
- public static computeBBoxForSegment(startPoint: Point2, part: PathCommand): Rect2 {
169
- const points = [startPoint];
170
- let exhaustivenessCheck: never;
171
- switch (part.kind) {
172
- case PathCommandType.MoveTo:
173
- case PathCommandType.LineTo:
174
- points.push(part.point);
175
- break;
176
- case PathCommandType.CubicBezierTo:
177
- points.push(part.controlPoint1, part.controlPoint2, part.endPoint);
178
- break;
179
- case PathCommandType.QuadraticBezierTo:
180
- points.push(part.controlPoint, part.endPoint);
181
- break;
182
- default:
183
- exhaustivenessCheck = part;
184
- return exhaustivenessCheck;
185
- }
186
-
187
- return Rect2.bboxOf(points);
188
- }
189
-
190
- /**
191
- * Let `S` be a closed path a distance `strokeRadius` from this path.
192
- *
193
- * @returns Approximate intersections of `line` with `S` using ray marching, starting from
194
- * both end points of `line` and each point in `additionalRaymarchStartPoints`.
195
- */
196
- private raymarchIntersectionWith(
197
- line: LineSegment2, strokeRadius: number, additionalRaymarchStartPoints: Point2[] = []
198
- ): IntersectionResult[] {
199
- // No intersection between bounding boxes: No possible intersection
200
- // of the interior.
201
- if (!line.bbox.intersects(this.bbox.grownBy(strokeRadius))) {
202
- return [];
203
- }
204
-
205
- const lineLength = line.length;
206
-
207
- type DistanceFunction = (point: Point2) => number;
208
- const partDistFunctionRecords: {
209
- part: GeometryType,
210
- bbox: Rect2,
211
- distFn: DistanceFunction,
212
- }[] = [];
213
-
214
- // Determine distance functions for all parts that the given line could possibly intersect with
215
- for (const part of this.geometry) {
216
- const bbox = part.getTightBoundingBox().grownBy(strokeRadius);
217
- if (!bbox.intersects(line.bbox)) {
218
- continue;
219
- }
220
-
221
- // Signed distance function
222
- const partDist: DistanceFunction = (point) => part.signedDistance(point);
223
-
224
- // Part signed distance function (negative result implies `point` is
225
- // inside the shape).
226
- const partSdf = (point: Point2) => partDist(point) - strokeRadius;
227
-
228
- // If the line can't possibly intersect the part,
229
- if (partSdf(line.p1) > lineLength && partSdf(line.p2) > lineLength) {
230
- continue;
231
- }
232
-
233
- partDistFunctionRecords.push({
234
- part,
235
- distFn: partDist,
236
- bbox,
237
- });
238
- }
239
-
240
- // If no distance functions, there are no intersections.
241
- if (partDistFunctionRecords.length === 0) {
242
- return [];
243
- }
244
-
245
- // Returns the minimum distance to a part in this stroke, where only parts that the given
246
- // line could intersect are considered.
247
- const sdf = (point: Point2): [GeometryType|null, number] => {
248
- let minDist = Infinity;
249
- let minDistPart = null;
250
-
251
- const uncheckedDistFunctions = [];
252
-
253
- // First pass: only curves for which the current point is inside
254
- // the bounding box.
255
- for (const distFnRecord of partDistFunctionRecords) {
256
- const { part, distFn, bbox } = distFnRecord;
257
-
258
- // Check later if the current point isn't in the bounding box.
259
- if (!bbox.containsPoint(point)) {
260
- uncheckedDistFunctions.push(distFnRecord);
261
- continue;
262
- }
263
-
264
- const currentDist = distFn(point);
265
-
266
- if (currentDist <= minDist) {
267
- minDist = currentDist;
268
- minDistPart = part;
269
- }
270
- }
271
-
272
- // Second pass: Everything else
273
- for (const { part, distFn, bbox } of uncheckedDistFunctions) {
274
- // Skip if impossible for the distance to the target to be lesser than
275
- // the current minimum.
276
- if (!bbox.grownBy(minDist).containsPoint(point)) {
277
- continue;
278
- }
279
-
280
- const currentDist = distFn(point);
281
-
282
- if (currentDist <= minDist) {
283
- minDist = currentDist;
284
- minDistPart = part;
285
- }
286
- }
287
-
288
- return [ minDistPart, minDist - strokeRadius ];
289
- };
290
-
291
-
292
- // Raymarch:
293
- const maxRaymarchSteps = 7;
294
-
295
- // Start raymarching from each of these points. This allows detection of multiple
296
- // intersections.
297
- const startPoints = [
298
- line.p1, ...additionalRaymarchStartPoints, line.p2
299
- ];
300
-
301
- // Converts a point ON THE LINE to a parameter
302
- const pointToParameter = (point: Point2) => {
303
- // Because line.direction is a unit vector, this computes the length
304
- // of the projection of the vector(line.p1->point) onto line.direction.
305
- //
306
- // Note that this can be negative if the given point is outside of the given
307
- // line segment.
308
- return point.minus(line.p1).dot(line.direction);
309
- };
310
-
311
- // Sort start points by parameter on the line.
312
- // This allows us to determine whether the current value of a parameter
313
- // drops down to a value already tested.
314
- startPoints.sort((a, b) => {
315
- const t_a = pointToParameter(a);
316
- const t_b = pointToParameter(b);
317
-
318
- // Sort in increasing order
319
- return t_a - t_b;
320
- });
321
-
322
- const result: IntersectionResult[] = [];
323
-
324
- const stoppingThreshold = strokeRadius / 1000;
325
-
326
- // Returns the maximum x value explored
327
- const raymarchFrom = (
328
- startPoint: Point2,
329
-
330
- // Direction to march in (multiplies line.direction)
331
- directionMultiplier: -1|1,
332
-
333
- // Terminate if the current point corresponds to a parameter
334
- // below this.
335
- minimumLineParameter: number,
336
- ): number|null => {
337
- let currentPoint = startPoint;
338
- let [lastPart, lastDist] = sdf(currentPoint);
339
- let lastParameter = pointToParameter(currentPoint);
340
-
341
- if (lastDist > lineLength) {
342
- return lastParameter;
343
- }
344
-
345
- const direction = line.direction.times(directionMultiplier);
346
-
347
- for (let i = 0; i < maxRaymarchSteps; i++) {
348
- // Step in the direction of the edge of the shape.
349
- const step = lastDist;
350
- currentPoint = currentPoint.plus(direction.times(step));
351
- lastParameter = pointToParameter(currentPoint);
352
-
353
- // If we're below the minimum parameter, stop. We've already tried
354
- // this.
355
- if (lastParameter <= minimumLineParameter) {
356
- return lastParameter;
357
- }
358
-
359
- const [currentPart, signedDist] = sdf(currentPoint);
360
-
361
- // Ensure we're stepping in the correct direction.
362
- // Note that because we could start with a negative distance and work towards a
363
- // positive distance, we need absolute values here.
364
- if (Math.abs(signedDist) > Math.abs(lastDist)) {
365
- // If not, stop.
366
- return null;
367
- }
368
-
369
- lastDist = signedDist;
370
- lastPart = currentPart;
371
-
372
- // Is the distance close enough that we can stop early?
373
- if (Math.abs(lastDist) < stoppingThreshold) {
374
- break;
375
- }
376
- }
377
-
378
- // Ensure that the point we ended with is on the line.
379
- const isOnLineSegment = lastParameter >= 0 && lastParameter <= lineLength;
380
-
381
- if (lastPart && isOnLineSegment && Math.abs(lastDist) < stoppingThreshold) {
382
- result.push({
383
- point: currentPoint,
384
- parameterValue: NaN,
385
- curve: lastPart,
386
- });
387
- }
388
-
389
- return lastParameter;
390
- };
391
-
392
- // The maximum value of the line's parameter explored so far (0 corresponds to
393
- // line.p1)
394
- let maxLineT = 0;
395
-
396
- // Raymarch for each start point.
397
- //
398
- // Use a for (i from 0 to length) loop because startPoints may be added
399
- // during iteration.
400
- for (let i = 0; i < startPoints.length; i++) {
401
- const startPoint = startPoints[i];
402
-
403
- // Try raymarching in both directions.
404
- maxLineT = Math.max(maxLineT, raymarchFrom(startPoint, 1, maxLineT) ?? maxLineT);
405
- maxLineT = Math.max(maxLineT, raymarchFrom(startPoint, -1, maxLineT) ?? maxLineT);
406
- }
407
-
408
- return result;
409
- }
410
-
411
- /**
412
- * Returns a list of intersections with this path. If `strokeRadius` is given,
413
- * intersections are approximated with the surface `strokeRadius` away from this.
414
- *
415
- * If `strokeRadius > 0`, the resultant `parameterValue` has no defined value.
416
- */
417
- public intersection(line: LineSegment2, strokeRadius?: number): IntersectionResult[] {
418
- let result: IntersectionResult[] = [];
419
-
420
- // Is any intersection between shapes within the bounding boxes impossible?
421
- if (!line.bbox.intersects(this.bbox.grownBy(strokeRadius ?? 0))) {
422
- return [];
423
- }
424
-
425
- for (const part of this.geometry) {
426
- const intersection = part.intersectsLineSegment(line);
427
-
428
- if (intersection.length > 0) {
429
- result.push({
430
- curve: part,
431
- point: intersection[0],
432
- });
433
- }
434
- }
435
-
436
- // If given a non-zero strokeWidth, attempt to raymarch.
437
- // Even if raymarching, we need to collect starting points.
438
- // We use the above-calculated intersections for this.
439
- const doRaymarching = strokeRadius && strokeRadius > 1e-8;
440
- if (doRaymarching) {
441
- // Starting points for raymarching (in addition to the end points of the line).
442
- const startPoints = result.map(intersection => intersection.point);
443
- result = this.raymarchIntersectionWith(line, strokeRadius, startPoints);
444
- }
445
-
446
- return result;
447
- }
448
-
449
- private static mapPathCommand(part: PathCommand, mapping: (point: Point2)=> Point2): PathCommand {
450
- switch (part.kind) {
451
- case PathCommandType.MoveTo:
452
- case PathCommandType.LineTo:
453
- return {
454
- kind: part.kind,
455
- point: mapping(part.point),
456
- };
457
- break;
458
- case PathCommandType.CubicBezierTo:
459
- return {
460
- kind: part.kind,
461
- controlPoint1: mapping(part.controlPoint1),
462
- controlPoint2: mapping(part.controlPoint2),
463
- endPoint: mapping(part.endPoint),
464
- };
465
- break;
466
- case PathCommandType.QuadraticBezierTo:
467
- return {
468
- kind: part.kind,
469
- controlPoint: mapping(part.controlPoint),
470
- endPoint: mapping(part.endPoint),
471
- };
472
- break;
473
- }
474
-
475
- const exhaustivenessCheck: never = part;
476
- return exhaustivenessCheck;
477
- }
478
-
479
- public mapPoints(mapping: (point: Point2)=>Point2): Path {
480
- const startPoint = mapping(this.startPoint);
481
- const newParts: PathCommand[] = [];
482
-
483
- for (const part of this.parts) {
484
- newParts.push(Path.mapPathCommand(part, mapping));
485
- }
486
-
487
- return new Path(startPoint, newParts);
488
- }
489
-
490
- public transformedBy(affineTransfm: Mat33): Path {
491
- if (affineTransfm.isIdentity()) {
492
- return this;
493
- }
494
-
495
- return this.mapPoints(point => affineTransfm.transformVec2(point));
496
- }
497
-
498
- // Creates a new path by joining [other] to the end of this path
499
- public union(other: Path|null): Path {
500
- if (!other) {
501
- return this;
502
- }
503
-
504
- return new Path(this.startPoint, [
505
- ...this.parts,
506
- {
507
- kind: PathCommandType.MoveTo,
508
- point: other.startPoint,
509
- },
510
- ...other.parts,
511
- ]);
512
- }
513
-
514
- private getEndPoint() {
515
- if (this.parts.length === 0) {
516
- return this.startPoint;
517
- }
518
- const lastPart = this.parts[this.parts.length - 1];
519
- if (lastPart.kind === PathCommandType.QuadraticBezierTo || lastPart.kind === PathCommandType.CubicBezierTo) {
520
- return lastPart.endPoint;
521
- } else {
522
- return lastPart.point;
523
- }
524
- }
525
-
526
- public roughlyIntersects(rect: Rect2, strokeWidth: number = 0) {
527
- if (this.parts.length === 0) {
528
- return rect.containsPoint(this.startPoint);
529
- }
530
- const isClosed = this.startPoint.eq(this.getEndPoint());
531
-
532
- if (isClosed && strokeWidth === 0) {
533
- return this.closedRoughlyIntersects(rect);
534
- }
535
-
536
- if (rect.containsRect(this.bbox)) {
537
- return true;
538
- }
539
-
540
- // Does the rectangle intersect the bounding boxes of any of this' parts?
541
- let startPoint = this.startPoint;
542
- for (const part of this.parts) {
543
- const bbox = Path.computeBBoxForSegment(startPoint, part).grownBy(strokeWidth);
544
-
545
- if (part.kind === PathCommandType.LineTo || part.kind === PathCommandType.MoveTo) {
546
- startPoint = part.point;
547
- } else {
548
- startPoint = part.endPoint;
549
- }
550
-
551
- if (rect.intersects(bbox)) {
552
- return true;
553
- }
554
- }
555
-
556
- return false;
557
- }
558
-
559
- // Treats this as a closed path and returns true if part of `rect` is roughly within
560
- // this path's interior.
561
- //
562
- // Note: Assumes that this is a closed, non-self-intersecting path.
563
- public closedRoughlyIntersects(rect: Rect2): boolean {
564
- if (rect.containsRect(this.bbox)) {
565
- return true;
566
- }
567
-
568
- // Choose a point outside of the path.
569
- const startPt = this.bbox.topLeft.minus(Vec2.of(1, 1));
570
- const testPts = rect.corners;
571
- const polygon = this.polylineApproximation();
572
-
573
- for (const point of testPts) {
574
- const testLine = new LineSegment2(point, startPt);
575
-
576
- let intersectionCount = 0;
577
- for (const line of polygon) {
578
- if (line.intersects(testLine)) {
579
- intersectionCount ++;
580
- }
581
- }
582
-
583
- // Odd? The point is within the polygon!
584
- if (intersectionCount % 2 === 1) {
585
- return true;
586
- }
587
- }
588
-
589
- // Grow the rectangle for possible additional precision.
590
- const grownRect = rect.grownBy(Math.min(rect.size.x, rect.size.y));
591
- const edges = [];
592
- for (const subrect of grownRect.divideIntoGrid(4, 4)) {
593
- edges.push(...subrect.getEdges());
594
- }
595
-
596
- for (const edge of edges) {
597
- for (const line of polygon) {
598
- if (edge.intersects(line)) {
599
- return true;
600
- }
601
- }
602
- }
603
-
604
- // Even? Probably no intersection.
605
- return false;
606
- }
607
-
608
- // Returns a path that outlines [rect]. If [lineWidth] is not given, the resultant path is
609
- // the outline of [rect]. Otherwise, the resultant path represents a line of width [lineWidth]
610
- // that traces [rect].
611
- public static fromRect(rect: Rect2, lineWidth: number|null = null): Path {
612
- const commands: PathCommand[] = [];
613
-
614
- let corners;
615
- let startPoint;
616
-
617
- if (lineWidth !== null) {
618
- // Vector from the top left corner or bottom right corner to the edge of the
619
- // stroked region.
620
- const cornerToEdge = Vec2.of(lineWidth, lineWidth).times(0.5);
621
- const innerRect = Rect2.fromCorners(
622
- rect.topLeft.plus(cornerToEdge),
623
- rect.bottomRight.minus(cornerToEdge)
624
- );
625
- const outerRect = Rect2.fromCorners(
626
- rect.topLeft.minus(cornerToEdge),
627
- rect.bottomRight.plus(cornerToEdge)
628
- );
629
-
630
- corners = [
631
- innerRect.corners[3],
632
- ...innerRect.corners,
633
- ...outerRect.corners.reverse(),
634
- ];
635
- startPoint = outerRect.corners[3];
636
- } else {
637
- corners = rect.corners.slice(1);
638
- startPoint = rect.corners[0];
639
- }
640
-
641
- for (const corner of corners) {
642
- commands.push({
643
- kind: PathCommandType.LineTo,
644
- point: corner,
645
- });
646
- }
647
-
648
- // Close the shape
649
- commands.push({
650
- kind: PathCommandType.LineTo,
651
- point: startPoint,
652
- });
653
-
654
- return new Path(startPoint, commands);
655
- }
656
-
657
- public static fromRenderable(renderable: RenderablePathSpec): Path {
658
- if (renderable.path) {
659
- return renderable.path;
660
- }
661
-
662
- return new Path(renderable.startPoint, renderable.commands);
663
- }
664
-
665
- public toRenderable(fill: RenderingStyle): RenderablePathSpec {
666
- return {
667
- startPoint: this.startPoint,
668
- style: fill,
669
- commands: this.parts,
670
- path: this,
671
- };
672
- }
673
-
674
- /**
675
- * @returns a Path that, when rendered, looks roughly equivalent to the given path.
676
- */
677
- public static visualEquivalent(renderablePath: RenderablePathSpec, visibleRect: Rect2): RenderablePathSpec {
678
- const path = Path.fromRenderable(renderablePath);
679
- const strokeWidth = renderablePath.style.stroke?.width ?? 0;
680
- const onlyStroked = strokeWidth > 0 && renderablePath.style.fill.a === 0;
681
-
682
- // Scale the expanded rect --- the visual equivalent is only close for huge strokes.
683
- const expandedRect = visibleRect.grownBy(strokeWidth)
684
- .transformedBoundingBox(Mat33.scaling2D(4, visibleRect.center));
685
-
686
- // TODO: Handle simplifying very small paths.
687
- if (expandedRect.containsRect(path.bbox.grownBy(strokeWidth))) {
688
- return renderablePath;
689
- }
690
- const parts: PathCommand[] = [];
691
- let startPoint = path.startPoint;
692
-
693
- for (const part of path.parts) {
694
- const partBBox = Path.computeBBoxForSegment(startPoint, part).grownBy(strokeWidth);
695
- let endPoint;
696
-
697
- if (part.kind === PathCommandType.LineTo || part.kind === PathCommandType.MoveTo) {
698
- endPoint = part.point;
699
- } else {
700
- endPoint = part.endPoint;
701
- }
702
-
703
- const intersectsVisible = partBBox.intersects(visibleRect);
704
-
705
- if (intersectsVisible) {
706
- // TODO: Can we trim parts of paths that intersect the visible rectangle?
707
- parts.push(part);
708
- } else if (onlyStroked || part.kind === PathCommandType.MoveTo) {
709
- // We're stroking (not filling) and the path doesn't intersect the bounding box.
710
- // Don't draw it, but preserve the endpoints.
711
- parts.push({
712
- kind: PathCommandType.MoveTo,
713
- point: endPoint,
714
- });
715
- }
716
- else {
717
- // Otherwise, we may be filling. Try to roughly preserve the filled region.
718
- parts.push({
719
- kind: PathCommandType.LineTo,
720
- point: endPoint,
721
- });
722
- }
723
-
724
- startPoint = endPoint;
725
- }
726
-
727
- return new Path(path.startPoint, parts).toRenderable(renderablePath.style);
728
- }
729
-
730
- private cachedStringVersion: string|null = null;
731
-
732
- public toString(useNonAbsCommands?: boolean): string {
733
- if (this.cachedStringVersion) {
734
- return this.cachedStringVersion;
735
- }
736
-
737
- if (useNonAbsCommands === undefined) {
738
- // Hueristic: Try to determine whether converting absolute to relative commands is worth it.
739
- useNonAbsCommands = Math.abs(this.bbox.topLeft.x) > 10 && Math.abs(this.bbox.topLeft.y) > 10;
740
- }
741
-
742
- const result = Path.toString(this.startPoint, this.parts, !useNonAbsCommands);
743
- this.cachedStringVersion = result;
744
- return result;
745
- }
746
-
747
- public serialize(): string {
748
- return this.toString();
749
- }
750
-
751
- // @param onlyAbsCommands - True if we should avoid converting absolute coordinates to relative offsets -- such
752
- // conversions can lead to smaller output strings, but also take time.
753
- public static toString(startPoint: Point2, parts: PathCommand[], onlyAbsCommands?: boolean): string {
754
- const result: string[] = [];
755
-
756
- let prevPoint: Point2|undefined;
757
- const addCommand = (command: string, ...points: Point2[]) => {
758
- const absoluteCommandParts: string[] = [];
759
- const relativeCommandParts: string[] = [];
760
- const makeAbsCommand = !prevPoint || onlyAbsCommands;
761
- const roundedPrevX = prevPoint ? toRoundedString(prevPoint.x) : '';
762
- const roundedPrevY = prevPoint ? toRoundedString(prevPoint.y) : '';
763
-
764
- for (const point of points) {
765
- const xComponent = toRoundedString(point.x);
766
- const yComponent = toRoundedString(point.y);
767
-
768
- // Relative commands are often shorter as strings than absolute commands.
769
- if (!makeAbsCommand) {
770
- const xComponentRelative = toStringOfSamePrecision(point.x - prevPoint!.x, xComponent, roundedPrevX, roundedPrevY);
771
- const yComponentRelative = toStringOfSamePrecision(point.y - prevPoint!.y, yComponent, roundedPrevX, roundedPrevY);
772
-
773
- // No need for an additional separator if it starts with a '-'
774
- if (yComponentRelative.charAt(0) === '-') {
775
- relativeCommandParts.push(`${xComponentRelative}${yComponentRelative}`);
776
- } else {
777
- relativeCommandParts.push(`${xComponentRelative},${yComponentRelative}`);
778
- }
779
- } else {
780
- absoluteCommandParts.push(`${xComponent},${yComponent}`);
781
- }
782
- }
783
-
784
- let commandString;
785
- if (makeAbsCommand) {
786
- commandString = `${command}${absoluteCommandParts.join(' ')}`;
787
- } else {
788
- commandString = `${command.toLowerCase()}${relativeCommandParts.join(' ')}`;
789
- }
790
-
791
- // Don't add no-ops.
792
- if (commandString === 'l0,0' || commandString === 'm0,0') {
793
- return;
794
- }
795
- result.push(commandString);
796
-
797
- if (points.length > 0) {
798
- prevPoint = points[points.length - 1];
799
- }
800
- };
801
-
802
- // Don't add two moveTos in a row (this can happen if
803
- // the start point corresponds to a moveTo _and_ the first command is
804
- // also a moveTo)
805
- if (parts[0]?.kind !== PathCommandType.MoveTo) {
806
- addCommand('M', startPoint);
807
- }
808
-
809
- let exhaustivenessCheck: never;
810
- for (let i = 0; i < parts.length; i++) {
811
- const part = parts[i];
812
-
813
- switch (part.kind) {
814
- case PathCommandType.MoveTo:
815
- addCommand('M', part.point);
816
- break;
817
- case PathCommandType.LineTo:
818
- addCommand('L', part.point);
819
- break;
820
- case PathCommandType.CubicBezierTo:
821
- addCommand('C', part.controlPoint1, part.controlPoint2, part.endPoint);
822
- break;
823
- case PathCommandType.QuadraticBezierTo:
824
- addCommand('Q', part.controlPoint, part.endPoint);
825
- break;
826
- default:
827
- exhaustivenessCheck = part;
828
- return exhaustivenessCheck;
829
- }
830
- }
831
-
832
- return result.join('');
833
- }
834
-
835
- // Create a Path from a SVG path specification.
836
- // TODO: Support a larger subset of SVG paths.
837
- // TODO: Support `s`,`t` commands shorthands.
838
- public static fromString(pathString: string): Path {
839
- // See the MDN reference:
840
- // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d
841
- // and
842
- // https://www.w3.org/TR/SVG2/paths.html
843
-
844
- // Remove linebreaks
845
- pathString = pathString.split('\n').join(' ');
846
-
847
- let lastPos: Point2 = Vec2.zero;
848
- let firstPos: Point2|null = null;
849
- let startPos: Point2|null = null;
850
- let isFirstCommand: boolean = true;
851
- const commands: PathCommand[] = [];
852
-
853
-
854
- const moveTo = (point: Point2) => {
855
- // The first moveTo/lineTo is already handled by the [startPoint] parameter of the Path constructor.
856
- if (isFirstCommand) {
857
- isFirstCommand = false;
858
- return;
859
- }
860
-
861
- commands.push({
862
- kind: PathCommandType.MoveTo,
863
- point,
864
- });
865
- };
866
- const lineTo = (point: Point2) => {
867
- if (isFirstCommand) {
868
- isFirstCommand = false;
869
- return;
870
- }
871
-
872
- commands.push({
873
- kind: PathCommandType.LineTo,
874
- point,
875
- });
876
- };
877
- const cubicBezierTo = (cp1: Point2, cp2: Point2, end: Point2) => {
878
- commands.push({
879
- kind: PathCommandType.CubicBezierTo,
880
- controlPoint1: cp1,
881
- controlPoint2: cp2,
882
- endPoint: end,
883
- });
884
- };
885
- const quadraticBeierTo = (controlPoint: Point2, endPoint: Point2) => {
886
- commands.push({
887
- kind: PathCommandType.QuadraticBezierTo,
888
- controlPoint,
889
- endPoint,
890
- });
891
- };
892
- const commandArgCounts: Record<string, number> = {
893
- 'm': 1,
894
- 'l': 1,
895
- 'c': 3,
896
- 'q': 2,
897
- 'z': 0,
898
- 'h': 1,
899
- 'v': 1,
900
- };
901
-
902
- // Each command: Command character followed by anything that isn't a command character
903
- const commandExp = /([MZLHVCSQTA])\s*([^MZLHVCSQTA]*)/ig;
904
- let current;
905
- while ((current = commandExp.exec(pathString)) !== null) {
906
- const argParts = current[2].trim().split(/[^0-9Ee.-]/).filter(
907
- part => part.length > 0
908
- ).reduce((accumualtor: string[], current: string): string[] => {
909
- // As of 09/2022, iOS Safari doesn't support support lookbehind in regular
910
- // expressions. As such, we need an alternative.
911
- // Because '-' can be used as a path separator, unless preceeded by an 'e' (as in 1e-5),
912
- // we need special cases:
913
- current = current.replace(/([^eE])[-]/g, '$1 -');
914
- const parts = current.split(' -');
915
- if (parts[0] !== '') {
916
- accumualtor.push(parts[0]);
917
- }
918
- accumualtor.push(...parts.slice(1).map(part => `-${part}`));
919
- return accumualtor;
920
- }, []);
921
-
922
- let numericArgs = argParts.map(arg => parseFloat(arg));
923
-
924
- let commandChar = current[1].toLowerCase();
925
- let uppercaseCommand = current[1] !== commandChar;
926
-
927
- // Convert commands that don't take points into commands that do.
928
- if (commandChar === 'v' || commandChar === 'h') {
929
- numericArgs = numericArgs.reduce((accumulator: number[], current: number): number[] => {
930
- if (commandChar === 'v') {
931
- return accumulator.concat(uppercaseCommand ? lastPos.x : 0, current);
932
- } else {
933
- return accumulator.concat(current, uppercaseCommand ? lastPos.y : 0);
934
- }
935
- }, []);
936
- commandChar = 'l';
937
- } else if (commandChar === 'z') {
938
- if (firstPos) {
939
- numericArgs = [ firstPos.x, firstPos.y ];
940
- firstPos = lastPos;
941
- } else {
942
- continue;
943
- }
944
-
945
- // 'z' always acts like an uppercase lineTo(startPos)
946
- uppercaseCommand = true;
947
- commandChar = 'l';
948
- }
949
-
950
-
951
- const commandArgCount: number = commandArgCounts[commandChar] ?? 0;
952
- const allArgs = numericArgs.reduce((
953
- accumulator: Point2[], current, index, parts
954
- ): Point2[] => {
955
- if (index % 2 !== 0) {
956
- const currentAsFloat = current;
957
- const prevAsFloat = parts[index - 1];
958
- return accumulator.concat(Vec2.of(prevAsFloat, currentAsFloat));
959
- } else {
960
- return accumulator;
961
- }
962
- }, []).map((coordinate, index): Point2 => {
963
- // Lowercase commands are relative, uppercase commands use absolute
964
- // positioning
965
- let newPos;
966
- if (uppercaseCommand) {
967
- newPos = coordinate;
968
- } else {
969
- newPos = lastPos.plus(coordinate);
970
- }
971
-
972
- if ((index + 1) % commandArgCount === 0) {
973
- lastPos = newPos;
974
- }
975
-
976
- return newPos;
977
- });
978
-
979
- if (allArgs.length % commandArgCount !== 0) {
980
- throw new Error([
981
- `Incorrect number of arguments: got ${JSON.stringify(allArgs)} with a length of ${allArgs.length} ≠ ${commandArgCount}k, k ∈ ℤ.`,
982
- `The number of arguments to ${commandChar} must be a multiple of ${commandArgCount}!`,
983
- `Command: ${current[0]}`,
984
- ].join('\n'));
985
- }
986
-
987
- for (let argPos = 0; argPos < allArgs.length; argPos += commandArgCount) {
988
- const args = allArgs.slice(argPos, argPos + commandArgCount);
989
-
990
- switch (commandChar.toLowerCase()) {
991
- case 'm':
992
- if (argPos === 0) {
993
- moveTo(args[0]);
994
- } else {
995
- lineTo(args[0]);
996
- }
997
- break;
998
- case 'l':
999
- lineTo(args[0]);
1000
- break;
1001
- case 'c':
1002
- cubicBezierTo(args[0], args[1], args[2]);
1003
- break;
1004
- case 'q':
1005
- quadraticBeierTo(args[0], args[1]);
1006
- break;
1007
- default:
1008
- throw new Error(`Unknown path command ${commandChar}`);
1009
- }
1010
-
1011
- isFirstCommand = false;
1012
- }
1013
-
1014
- if (allArgs.length > 0) {
1015
- firstPos ??= allArgs[0];
1016
- startPos ??= firstPos;
1017
- lastPos = allArgs[allArgs.length - 1];
1018
- }
1019
- }
1020
-
1021
- const result = new Path(startPos ?? Vec2.zero, commands);
1022
- result.cachedStringVersion = pathString;
1023
- return result;
1024
- }
1025
-
1026
- public static empty: Path = new Path(Vec2.zero, []);
1027
- }