js-draw 0.25.1 → 1.0.1

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 (750) hide show
  1. package/README.md +80 -26
  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 +41 -44
  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 +40 -44
  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/dist-test/test_imports/package.json +1 -1
  462. package/dist-test/test_imports/test-imports.js +5 -11
  463. package/dist-test/test_imports/test-require.cjs +6 -11
  464. package/package.json +11 -22
  465. package/src/Coloris.css +8 -8
  466. package/src/Editor.loadFrom.test.ts +1 -1
  467. package/src/Editor.scss +148 -0
  468. package/src/Editor.test.ts +107 -0
  469. package/src/Editor.toSVG.test.ts +184 -1
  470. package/src/Editor.ts +325 -53
  471. package/src/EditorImage.test.ts +4 -7
  472. package/src/EditorImage.ts +10 -4
  473. package/src/Pointer.ts +18 -5
  474. package/src/SVGLoader.ts +77 -15
  475. package/src/UndoRedoHistory.test.ts +2 -1
  476. package/src/Viewport.ts +1 -4
  477. package/src/commands/Erase.ts +1 -0
  478. package/src/commands/localization.ts +1 -1
  479. package/src/commands/uniteCommands.test.ts +3 -3
  480. package/src/components/AbstractComponent.transformBy.test.ts +2 -1
  481. package/src/components/AbstractComponent.ts +12 -3
  482. package/src/components/BackgroundComponent.test.ts +1 -2
  483. package/src/components/BackgroundComponent.ts +3 -8
  484. package/src/components/ImageComponent.ts +1 -3
  485. package/src/components/RestylableComponent.ts +1 -1
  486. package/src/components/SVGGlobalAttributesObject.ts +1 -3
  487. package/src/components/Stroke.test.ts +4 -6
  488. package/src/components/Stroke.ts +5 -7
  489. package/src/components/TextComponent.test.ts +1 -3
  490. package/src/components/TextComponent.ts +1 -4
  491. package/src/components/UnknownSVGObject.ts +3 -3
  492. package/src/components/builders/ArrowBuilder.ts +1 -2
  493. package/src/components/builders/CircleBuilder.ts +3 -5
  494. package/src/components/builders/FreehandLineBuilder.test.ts +2 -3
  495. package/src/components/builders/FreehandLineBuilder.ts +3 -5
  496. package/src/components/builders/LineBuilder.ts +3 -3
  497. package/src/components/builders/PressureSensitiveFreehandLineBuilder.ts +3 -4
  498. package/src/components/builders/RectangleBuilder.ts +3 -4
  499. package/src/components/builders/types.ts +1 -1
  500. package/src/components/lib.ts +1 -1
  501. package/src/components/util/StrokeSmoother.ts +7 -7
  502. package/src/dialogs/dialogs.scss +36 -0
  503. package/src/dialogs/makeAboutDialog.scss +41 -0
  504. package/src/dialogs/makeAboutDialog.ts +82 -0
  505. package/src/inputEvents.ts +143 -0
  506. package/src/lib.ts +35 -13
  507. package/src/localizations/de.ts +2 -2
  508. package/src/localizations/es.ts +5 -5
  509. package/src/rendering/Display.ts +1 -2
  510. package/src/rendering/RenderablePathSpec.ts +88 -0
  511. package/src/rendering/RenderingStyle.test.ts +1 -1
  512. package/src/rendering/RenderingStyle.ts +1 -1
  513. package/src/rendering/caching/CacheRecord.test.ts +1 -2
  514. package/src/rendering/caching/CacheRecord.ts +1 -2
  515. package/src/rendering/caching/CacheRecordManager.ts +1 -1
  516. package/src/rendering/caching/RenderingCache.test.ts +3 -4
  517. package/src/rendering/caching/RenderingCache.ts +1 -1
  518. package/src/rendering/caching/RenderingCacheNode.ts +1 -2
  519. package/src/rendering/caching/testUtils.ts +1 -1
  520. package/src/rendering/caching/types.ts +3 -3
  521. package/src/rendering/renderers/AbstractRenderer.ts +4 -14
  522. package/src/rendering/renderers/CanvasRenderer.ts +17 -12
  523. package/src/rendering/renderers/DummyRenderer.test.ts +1 -2
  524. package/src/rendering/renderers/DummyRenderer.ts +1 -4
  525. package/src/rendering/renderers/SVGRenderer.ts +68 -11
  526. package/src/rendering/renderers/TextOnlyRenderer.ts +1 -4
  527. package/src/shortcuts/KeyBinding.test.ts +10 -0
  528. package/src/shortcuts/KeyBinding.ts +74 -35
  529. package/src/shortcuts/KeyboardShortcutManager.test.ts +1 -1
  530. package/src/styles.js +1 -1
  531. package/src/testing/sendPenEvent.ts +2 -2
  532. package/src/testing/sendTouchEvent.ts +2 -2
  533. package/src/toolbar/{toolbar.css → AbstractToolbar.scss} +47 -85
  534. package/src/toolbar/AbstractToolbar.ts +542 -0
  535. package/src/toolbar/DropdownToolbar.scss +46 -0
  536. package/src/toolbar/DropdownToolbar.ts +220 -0
  537. package/src/toolbar/EdgeToolbar.scss +511 -0
  538. package/src/toolbar/EdgeToolbar.test.ts +54 -0
  539. package/src/toolbar/EdgeToolbar.ts +543 -0
  540. package/src/toolbar/IconProvider.ts +189 -133
  541. package/src/toolbar/constants.ts +1 -0
  542. package/src/toolbar/lib.ts +4 -2
  543. package/src/toolbar/localization.ts +39 -17
  544. package/src/toolbar/toolbar.scss +11 -0
  545. package/src/toolbar/types.ts +8 -0
  546. package/src/toolbar/widgets/ActionButtonWidget.ts +2 -2
  547. package/src/toolbar/widgets/BaseToolWidget.ts +17 -1
  548. package/src/toolbar/widgets/BaseWidget.ts +179 -112
  549. package/src/toolbar/widgets/DocumentPropertiesWidget.scss +7 -0
  550. package/src/toolbar/widgets/DocumentPropertiesWidget.ts +26 -10
  551. package/src/toolbar/widgets/EraserToolWidget.ts +21 -22
  552. package/src/toolbar/widgets/HandToolWidget.scss +14 -0
  553. package/src/toolbar/widgets/HandToolWidget.ts +21 -32
  554. package/src/toolbar/widgets/InsertImageWidget.scss +41 -0
  555. package/src/toolbar/widgets/InsertImageWidget.ts +90 -65
  556. package/src/toolbar/widgets/PenToolWidget.css +0 -51
  557. package/src/toolbar/widgets/PenToolWidget.ts +106 -146
  558. package/src/toolbar/widgets/SelectionToolWidget.scss +6 -0
  559. package/src/toolbar/widgets/SelectionToolWidget.ts +83 -85
  560. package/src/toolbar/widgets/TextToolWidget.ts +9 -5
  561. package/src/toolbar/widgets/components/components.scss +5 -0
  562. package/src/toolbar/widgets/components/makeColorInput.scss +82 -0
  563. package/src/toolbar/{makeColorInput.ts → widgets/components/makeColorInput.ts} +39 -14
  564. package/src/toolbar/widgets/components/makeFileInput.scss +77 -0
  565. package/src/toolbar/widgets/components/makeFileInput.ts +128 -0
  566. package/src/toolbar/widgets/components/makeGridSelector.scss +60 -0
  567. package/src/toolbar/widgets/components/makeGridSelector.ts +179 -0
  568. package/src/toolbar/widgets/components/makeSeparator.scss +14 -0
  569. package/src/toolbar/widgets/components/makeSeparator.ts +17 -0
  570. package/src/toolbar/widgets/components/makeThicknessSlider.scss +9 -0
  571. package/src/toolbar/widgets/components/makeThicknessSlider.ts +62 -0
  572. package/src/toolbar/widgets/keybindings.ts +1 -3
  573. package/src/toolbar/widgets/layout/DropdownLayoutManager.ts +262 -0
  574. package/src/toolbar/widgets/layout/EdgeToolbarLayoutManager.ts +71 -0
  575. package/src/toolbar/widgets/layout/types.ts +74 -0
  576. package/src/toolbar/widgets/lib.ts +2 -2
  577. package/src/tools/BaseTool.ts +102 -30
  578. package/src/tools/Eraser.test.ts +2 -2
  579. package/src/tools/Eraser.ts +24 -11
  580. package/src/tools/FindTool.css +3 -3
  581. package/src/tools/FindTool.test.ts +67 -0
  582. package/src/tools/FindTool.ts +3 -3
  583. package/src/tools/InputFilter/FunctionMapper.ts +17 -0
  584. package/src/tools/InputFilter/InputMapper.ts +41 -0
  585. package/src/tools/InputFilter/InputPipeline.test.ts +41 -0
  586. package/src/tools/InputFilter/InputPipeline.ts +34 -0
  587. package/src/tools/InputFilter/InputStabilizer.ts +254 -0
  588. package/src/tools/InputFilter/StrokeKeyboardControl.ts +104 -0
  589. package/src/tools/PanZoom.test.ts +3 -13
  590. package/src/tools/PanZoom.ts +33 -10
  591. package/src/tools/PasteHandler.ts +2 -3
  592. package/src/tools/Pen.test.ts +2 -4
  593. package/src/tools/Pen.ts +54 -70
  594. package/src/tools/PipetteTool.ts +31 -2
  595. package/src/tools/SelectionTool/SelectAllShortcutHandler.ts +1 -1
  596. package/src/tools/SelectionTool/Selection.ts +52 -16
  597. package/src/tools/SelectionTool/SelectionHandle.ts +46 -12
  598. package/src/tools/SelectionTool/SelectionTool.css +23 -11
  599. package/src/tools/SelectionTool/SelectionTool.test.ts +130 -21
  600. package/src/tools/SelectionTool/SelectionTool.ts +62 -48
  601. package/src/tools/SelectionTool/TransformMode.ts +1 -3
  602. package/src/tools/SoundUITool.ts +13 -4
  603. package/src/tools/TextTool.ts +29 -30
  604. package/src/tools/ToolController.ts +60 -36
  605. package/src/tools/ToolSwitcherShortcut.ts +1 -1
  606. package/src/tools/ToolbarShortcutHandler.ts +1 -1
  607. package/src/tools/UndoRedoShortcut.test.ts +10 -4
  608. package/src/tools/UndoRedoShortcut.ts +1 -1
  609. package/src/tools/keybindings.ts +17 -17
  610. package/src/tools/localization.ts +4 -2
  611. package/src/tools/tools.scss +4 -0
  612. package/src/types.ts +25 -113
  613. package/src/util/ReactiveValue.test.ts +168 -0
  614. package/src/util/ReactiveValue.ts +241 -0
  615. package/src/util/guessKeyCodeFromKey.ts +36 -0
  616. package/src/util/listPrefixMatch.ts +19 -0
  617. package/src/util/stopPropagationOfScrollingWheelEvents.ts +20 -0
  618. package/src/version.test.ts +12 -0
  619. package/src/version.ts +3 -0
  620. package/tsconfig.json +1 -1
  621. package/typedoc.json +4 -0
  622. package/dist/cjs/Color4.d.ts +0 -69
  623. package/dist/cjs/Color4.js +0 -263
  624. package/dist/cjs/math/Mat33.d.ts +0 -123
  625. package/dist/cjs/math/Mat33.js +0 -340
  626. package/dist/cjs/math/Vec2.d.ts +0 -33
  627. package/dist/cjs/math/Vec2.js +0 -37
  628. package/dist/cjs/math/Vec3.d.ts +0 -106
  629. package/dist/cjs/math/Vec3.js +0 -183
  630. package/dist/cjs/math/lib.d.ts +0 -7
  631. package/dist/cjs/math/lib.js +0 -15
  632. package/dist/cjs/math/polynomial/solveQuadratic.d.ts +0 -9
  633. package/dist/cjs/math/polynomial/solveQuadratic.js +0 -39
  634. package/dist/cjs/math/rounding.d.ts +0 -4
  635. package/dist/cjs/math/rounding.js +0 -140
  636. package/dist/cjs/math/shapes/Abstract2DShape.d.ts +0 -49
  637. package/dist/cjs/math/shapes/Abstract2DShape.js +0 -42
  638. package/dist/cjs/math/shapes/BezierJSWrapper.d.ts +0 -36
  639. package/dist/cjs/math/shapes/BezierJSWrapper.js +0 -109
  640. package/dist/cjs/math/shapes/CubicBezier.d.ts +0 -17
  641. package/dist/cjs/math/shapes/CubicBezier.js +0 -50
  642. package/dist/cjs/math/shapes/LineSegment2.d.ts +0 -70
  643. package/dist/cjs/math/shapes/LineSegment2.js +0 -204
  644. package/dist/cjs/math/shapes/Path.d.ts +0 -93
  645. package/dist/cjs/math/shapes/Path.js +0 -865
  646. package/dist/cjs/math/shapes/PointShape2D.d.ts +0 -18
  647. package/dist/cjs/math/shapes/PointShape2D.js +0 -46
  648. package/dist/cjs/math/shapes/QuadraticBezier.d.ts +0 -34
  649. package/dist/cjs/math/shapes/QuadraticBezier.js +0 -133
  650. package/dist/cjs/math/shapes/Rect2.d.ts +0 -57
  651. package/dist/cjs/math/shapes/Rect2.js +0 -311
  652. package/dist/cjs/math/shapes/Triangle.d.ts +0 -46
  653. package/dist/cjs/math/shapes/Triangle.js +0 -148
  654. package/dist/cjs/toolbar/HTMLToolbar.d.ts +0 -105
  655. package/dist/cjs/toolbar/HTMLToolbar.js +0 -465
  656. package/dist/cjs/toolbar/makeColorInput.d.ts +0 -6
  657. package/dist/mjs/Color4.d.ts +0 -69
  658. package/dist/mjs/Color4.mjs +0 -260
  659. package/dist/mjs/Color4.test.d.ts +0 -1
  660. package/dist/mjs/math/Mat33.d.ts +0 -123
  661. package/dist/mjs/math/Mat33.mjs +0 -338
  662. package/dist/mjs/math/Mat33.test.d.ts +0 -1
  663. package/dist/mjs/math/Vec2.d.ts +0 -33
  664. package/dist/mjs/math/Vec2.mjs +0 -34
  665. package/dist/mjs/math/Vec2.test.d.ts +0 -1
  666. package/dist/mjs/math/Vec3.d.ts +0 -106
  667. package/dist/mjs/math/Vec3.mjs +0 -181
  668. package/dist/mjs/math/Vec3.test.d.ts +0 -1
  669. package/dist/mjs/math/lib.d.ts +0 -7
  670. package/dist/mjs/math/lib.mjs +0 -7
  671. package/dist/mjs/math/polynomial/solveQuadratic.d.ts +0 -9
  672. package/dist/mjs/math/polynomial/solveQuadratic.mjs +0 -37
  673. package/dist/mjs/math/polynomial/solveQuadratic.test.d.ts +0 -1
  674. package/dist/mjs/math/rounding.d.ts +0 -4
  675. package/dist/mjs/math/rounding.mjs +0 -133
  676. package/dist/mjs/math/rounding.test.d.ts +0 -1
  677. package/dist/mjs/math/shapes/Abstract2DShape.d.ts +0 -49
  678. package/dist/mjs/math/shapes/Abstract2DShape.mjs +0 -40
  679. package/dist/mjs/math/shapes/BezierJSWrapper.d.ts +0 -36
  680. package/dist/mjs/math/shapes/BezierJSWrapper.mjs +0 -107
  681. package/dist/mjs/math/shapes/CubicBezier.d.ts +0 -17
  682. package/dist/mjs/math/shapes/CubicBezier.mjs +0 -48
  683. package/dist/mjs/math/shapes/LineSegment2.d.ts +0 -70
  684. package/dist/mjs/math/shapes/LineSegment2.mjs +0 -202
  685. package/dist/mjs/math/shapes/LineSegment2.test.d.ts +0 -1
  686. package/dist/mjs/math/shapes/Path.d.ts +0 -93
  687. package/dist/mjs/math/shapes/Path.fromString.test.d.ts +0 -1
  688. package/dist/mjs/math/shapes/Path.mjs +0 -862
  689. package/dist/mjs/math/shapes/Path.test.d.ts +0 -1
  690. package/dist/mjs/math/shapes/Path.toString.test.d.ts +0 -1
  691. package/dist/mjs/math/shapes/PointShape2D.d.ts +0 -18
  692. package/dist/mjs/math/shapes/PointShape2D.mjs +0 -44
  693. package/dist/mjs/math/shapes/QuadraticBezier.d.ts +0 -34
  694. package/dist/mjs/math/shapes/QuadraticBezier.mjs +0 -131
  695. package/dist/mjs/math/shapes/QuadraticBezier.test.d.ts +0 -1
  696. package/dist/mjs/math/shapes/Rect2.d.ts +0 -57
  697. package/dist/mjs/math/shapes/Rect2.mjs +0 -309
  698. package/dist/mjs/math/shapes/Rect2.test.d.ts +0 -1
  699. package/dist/mjs/math/shapes/Triangle.d.ts +0 -46
  700. package/dist/mjs/math/shapes/Triangle.mjs +0 -146
  701. package/dist/mjs/math/shapes/Triangle.test.d.ts +0 -1
  702. package/dist/mjs/toolbar/HTMLToolbar.d.ts +0 -105
  703. package/dist/mjs/toolbar/HTMLToolbar.mjs +0 -462
  704. package/dist/mjs/toolbar/makeColorInput.d.ts +0 -6
  705. package/src/Color4.test.ts +0 -47
  706. package/src/Color4.ts +0 -304
  707. package/src/Editor.css +0 -98
  708. package/src/math/Mat33.test.ts +0 -244
  709. package/src/math/Mat33.ts +0 -442
  710. package/src/math/Vec2.test.ts +0 -30
  711. package/src/math/Vec2.ts +0 -40
  712. package/src/math/Vec3.test.ts +0 -44
  713. package/src/math/Vec3.ts +0 -218
  714. package/src/math/lib.ts +0 -15
  715. package/src/math/polynomial/solveQuadratic.test.ts +0 -39
  716. package/src/math/polynomial/solveQuadratic.ts +0 -43
  717. package/src/math/rounding.test.ts +0 -65
  718. package/src/math/rounding.ts +0 -156
  719. package/src/math/shapes/Abstract2DShape.ts +0 -63
  720. package/src/math/shapes/BezierJSWrapper.ts +0 -93
  721. package/src/math/shapes/CubicBezier.ts +0 -35
  722. package/src/math/shapes/LineSegment2.test.ts +0 -99
  723. package/src/math/shapes/LineSegment2.ts +0 -231
  724. package/src/math/shapes/Path.fromString.test.ts +0 -223
  725. package/src/math/shapes/Path.test.ts +0 -309
  726. package/src/math/shapes/Path.toString.test.ts +0 -77
  727. package/src/math/shapes/Path.ts +0 -1027
  728. package/src/math/shapes/PointShape2D.ts +0 -33
  729. package/src/math/shapes/QuadraticBezier.test.ts +0 -31
  730. package/src/math/shapes/QuadraticBezier.ts +0 -141
  731. package/src/math/shapes/Rect2.test.ts +0 -209
  732. package/src/math/shapes/Rect2.ts +0 -344
  733. package/src/math/shapes/Triangle.test.ts +0 -61
  734. package/src/math/shapes/Triangle.ts +0 -139
  735. package/src/toolbar/HTMLToolbar.ts +0 -567
  736. package/src/toolbar/widgets/InsertImageWidget.css +0 -44
  737. package/src/tools/tools.css +0 -4
  738. /package/dist/cjs/{Color4.test.d.ts → Editor.test.d.ts} +0 -0
  739. /package/dist/cjs/{math/Mat33.test.d.ts → toolbar/EdgeToolbar.test.d.ts} +0 -0
  740. /package/dist/cjs/{math/Vec2.test.d.ts → tools/FindTool.test.d.ts} +0 -0
  741. /package/dist/cjs/{math/Vec3.test.d.ts → tools/InputFilter/InputPipeline.test.d.ts} +0 -0
  742. /package/dist/cjs/{math/polynomial/solveQuadratic.test.d.ts → util/ReactiveValue.test.d.ts} +0 -0
  743. /package/dist/cjs/{math/rounding.test.d.ts → version.test.d.ts} +0 -0
  744. /package/dist/{cjs/math/shapes/LineSegment2.test.d.ts → mjs/Editor.test.d.ts} +0 -0
  745. /package/dist/{cjs/math/shapes/Path.fromString.test.d.ts → mjs/toolbar/EdgeToolbar.test.d.ts} +0 -0
  746. /package/dist/{cjs/math/shapes/Path.test.d.ts → mjs/toolbar/widgets/layout/types.mjs} +0 -0
  747. /package/dist/{cjs/math/shapes/Path.toString.test.d.ts → mjs/tools/FindTool.test.d.ts} +0 -0
  748. /package/dist/{cjs/math/shapes/QuadraticBezier.test.d.ts → mjs/tools/InputFilter/InputPipeline.test.d.ts} +0 -0
  749. /package/dist/{cjs/math/shapes/Rect2.test.d.ts → mjs/util/ReactiveValue.test.d.ts} +0 -0
  750. /package/dist/{cjs/math/shapes/Triangle.test.d.ts → mjs/version.test.d.ts} +0 -0
@@ -1,10 +1,9 @@
1
1
 
2
2
  import { Editor } from '../Editor';
3
- import Mat33 from '../math/Mat33';
4
- import { Point2, Vec2 } from '../math/Vec2';
5
- import Vec3 from '../math/Vec3';
3
+ import { Mat33, Vec3, Point2, Vec2 } from '@js-draw/math';
6
4
  import Pointer, { PointerDevice } from '../Pointer';
7
- import { EditorEventType, KeyPressEvent, PointerEvt, WheelEvt } from '../types';
5
+ import { EditorEventType } from '../types';
6
+ import { KeyPressEvent, PointerEvt, WheelEvt } from '../inputEvents';
8
7
  import untilNextAnimationFrame from '../util/untilNextAnimationFrame';
9
8
  import { Viewport, ViewportTransform } from '../Viewport';
10
9
  import BaseTool from './BaseTool';
@@ -47,7 +46,7 @@ class InertialScroller {
47
46
  }
48
47
 
49
48
  this.currentVelocity = this.initialVelocity;
50
- let lastTime = (new Date()).getTime();
49
+ let lastTime = performance.now();
51
50
  this.running = true;
52
51
 
53
52
  const maxSpeed = 5000; // units/s
@@ -57,7 +56,7 @@ class InertialScroller {
57
56
  }
58
57
 
59
58
  while (this.running && this.currentVelocity.magnitude() > minSpeed) {
60
- const nowTime = (new Date()).getTime();
59
+ const nowTime = performance.now();
61
60
  const dt = (nowTime - lastTime) / 1000;
62
61
 
63
62
  this.currentVelocity = this.currentVelocity.times(Math.pow(1/8, dt));
@@ -91,6 +90,10 @@ class InertialScroller {
91
90
  export default class PanZoom extends BaseTool {
92
91
  private transform: ViewportTransform|null = null;
93
92
 
93
+ // Distance between two touch points at the **start** of a gesture.
94
+ private startDist: number;
95
+
96
+ // Distance between two touch points the last time input data was received.
94
97
  private lastDist: number;
95
98
  private lastScreenCenter: Point2;
96
99
  private lastTimestamp: number;
@@ -98,6 +101,10 @@ export default class PanZoom extends BaseTool {
98
101
  private initialTouchAngle: number = 0;
99
102
  private initialViewportRotation: number = 0;
100
103
 
104
+ // Set to `true` only when scaling has started (if two fingers are down and have moved
105
+ // far enough).
106
+ private isScaling: boolean = false;
107
+
101
108
  private inertialScroller: InertialScroller|null = null;
102
109
  private velocity: Vec2|null = null;
103
110
 
@@ -142,9 +149,11 @@ export default class PanZoom extends BaseTool {
142
149
  if (allAreTouch && pointers.length === 2 && this.mode & PanZoomMode.TwoFingerTouchGestures) {
143
150
  const { screenCenter, angle, dist } = this.computePinchData(pointers[0], pointers[1]);
144
151
  this.lastDist = dist;
152
+ this.startDist = dist;
145
153
  this.lastScreenCenter = screenCenter;
146
154
  this.initialTouchAngle = angle;
147
155
  this.initialViewportRotation = this.editor.viewport.getRotationAngle();
156
+ this.isScaling = false;
148
157
 
149
158
  handlingGesture = true;
150
159
  } else if (pointers.length === 1 && (
@@ -153,11 +162,12 @@ export default class PanZoom extends BaseTool {
153
162
  || (this.mode & PanZoomMode.SinglePointerGestures)
154
163
  )) {
155
164
  this.lastScreenCenter = pointers[0].screenPos;
165
+ this.isScaling = false;
156
166
  handlingGesture = true;
157
167
  }
158
168
 
159
169
  if (handlingGesture) {
160
- this.lastTimestamp = (new Date()).getTime();
170
+ this.lastTimestamp = performance.now();
161
171
  this.transform ??= Viewport.transformBy(Mat33.identity);
162
172
  this.editor.display.setDraftMode(true);
163
173
  }
@@ -167,7 +177,7 @@ export default class PanZoom extends BaseTool {
167
177
 
168
178
  private updateVelocity(currentCenter: Point2) {
169
179
  const deltaPos = currentCenter.minus(this.lastScreenCenter);
170
- let deltaTime = ((new Date()).getTime() - this.lastTimestamp) / 1000;
180
+ let deltaTime = (performance.now() - this.lastTimestamp) / 1000;
171
181
 
172
182
  // Ignore duplicate events, unless there has been enough time between them.
173
183
  if (deltaPos.magnitude() === 0 && deltaTime < 0.1) {
@@ -245,8 +255,21 @@ export default class PanZoom extends BaseTool {
245
255
 
246
256
  this.updateVelocity(screenCenter);
247
257
 
258
+ let scaleFactor = 1;
259
+ if (this.isScaling) {
260
+ scaleFactor = dist / this.lastDist;
261
+ } else {
262
+ const initialScaleFactor = dist / this.startDist;
263
+
264
+ // Only start scaling if scaling done so far exceeds some threshold.
265
+ if (initialScaleFactor > 1.05 || initialScaleFactor < 0.95) {
266
+ scaleFactor = initialScaleFactor;
267
+ this.isScaling = true;
268
+ }
269
+ }
270
+
248
271
  const transformUpdate = Mat33.translation(delta)
249
- .rightMul(Mat33.scaling2D(dist / this.lastDist, canvasCenter))
272
+ .rightMul(Mat33.scaling2D(scaleFactor, canvasCenter))
250
273
  .rightMul(Mat33.zRotation(deltaRotation, canvasCenter));
251
274
 
252
275
  this.lastScreenCenter = screenCenter;
@@ -279,7 +302,7 @@ export default class PanZoom extends BaseTool {
279
302
  lastTransform.unapply(this.editor);
280
303
  this.transform.apply(this.editor);
281
304
 
282
- this.lastTimestamp = (new Date()).getTime();
305
+ this.lastTimestamp = performance.now();
283
306
  }
284
307
 
285
308
  public override onPointerUp(event: PointerEvt): void {
@@ -2,11 +2,10 @@ import Editor from '../Editor';
2
2
  import AbstractComponent from '../components/AbstractComponent';
3
3
  import TextComponent from '../components/TextComponent';
4
4
  import SVGLoader from '../SVGLoader';
5
- import { PasteEvent } from '../types';
6
- import Mat33 from '../math/Mat33';
5
+ import { PasteEvent } from '../inputEvents';
6
+ import { Mat33, Color4 } from '@js-draw/math';
7
7
  import BaseTool from './BaseTool';
8
8
  import TextTool from './TextTool';
9
- import Color4 from '../Color4';
10
9
  import ImageComponent from '../components/ImageComponent';
11
10
  import TextRenderingStyle from '../rendering/TextRenderingStyle';
12
11
 
@@ -1,11 +1,9 @@
1
1
 
2
2
  import PenTool from './Pen';
3
- import { Vec2 } from '../math/Vec2';
3
+ import { Mat33, Rect2, Vec2 } from '@js-draw/math';
4
4
  import createEditor from '../testing/createEditor';
5
- import { InputEvtType } from '../types';
6
- import Rect2 from '../math/shapes/Rect2';
5
+ import { InputEvtType } from '../inputEvents';
7
6
  import StrokeComponent from '../components/Stroke';
8
- import Mat33 from '../math/Mat33';
9
7
  import { makeFreehandLineBuilder } from '../components/builders/FreehandLineBuilder';
10
8
  import sendPenEvent from '../testing/sendPenEvent';
11
9
  import sendTouchEvent from '../testing/sendTouchEvent';
package/src/tools/Pen.ts CHANGED
@@ -1,19 +1,21 @@
1
- import Color4 from '../Color4';
1
+ import { Color4 } from '@js-draw/math';
2
2
  import Editor from '../Editor';
3
3
  import EditorImage from '../EditorImage';
4
4
  import Pointer, { PointerDevice } from '../Pointer';
5
5
  import { makeFreehandLineBuilder } from '../components/builders/FreehandLineBuilder';
6
- import { EditorEventType, KeyPressEvent, KeyUpEvent, PointerEvt, StrokeDataPoint } from '../types';
6
+ import { EditorEventType, StrokeDataPoint } from '../types';
7
+ import { KeyPressEvent, PointerEvt } from '../inputEvents';
7
8
  import BaseTool from './BaseTool';
8
9
  import { ComponentBuilder, ComponentBuilderFactory } from '../components/builders/types';
9
10
  import { undoKeyboardShortcutId } from './keybindings';
10
- import { decreaseSizeKeyboardShortcutId, increaseSizeKeyboardShortcutId, lineLockKeyboardShortcutId, snapToGridKeyboardShortcutId } from './keybindings';
11
-
12
-
11
+ import { decreaseSizeKeyboardShortcutId, increaseSizeKeyboardShortcutId } from './keybindings';
12
+ import InputStabilizer from './InputFilter/InputStabilizer';
13
+ import { MutableReactiveValue, ReactiveValue } from '../util/ReactiveValue';
13
14
 
14
15
  export interface PenStyle {
15
- color: Color4;
16
- thickness: number;
16
+ readonly color: Color4;
17
+ readonly thickness: number;
18
+ readonly factory: ComponentBuilderFactory;
17
19
  }
18
20
 
19
21
  export default class Pen extends BaseTool {
@@ -21,43 +23,36 @@ export default class Pen extends BaseTool {
21
23
  private lastPoint: StrokeDataPoint|null = null;
22
24
  private startPoint: StrokeDataPoint|null = null;
23
25
  private currentDeviceType: PointerDevice|null = null;
24
-
25
- private snapToGridEnabled: boolean = false;
26
- private angleLockEnabled: boolean = false;
26
+ private styleValue: MutableReactiveValue<PenStyle>;
27
+ private style: PenStyle;
27
28
 
28
29
  public constructor(
29
30
  private editor: Editor,
30
31
  description: string,
31
- private style: PenStyle,
32
- private builderFactory: ComponentBuilderFactory = makeFreehandLineBuilder,
32
+ style: Partial<PenStyle>,
33
33
  ) {
34
34
  super(editor.notifier, description);
35
- }
36
35
 
37
- private getPressureMultiplier() {
38
- return 1 / this.editor.viewport.getScaleFactor() * this.style.thickness;
39
- }
36
+ this.styleValue = ReactiveValue.fromInitialValue<PenStyle>({
37
+ factory: makeFreehandLineBuilder,
38
+ color: Color4.blue,
39
+ thickness: 4,
40
+ ...style,
41
+ });
40
42
 
41
- // Snap the given pointer to the nearer of the x/y axes.
42
- private xyAxesSnap(pointer: Pointer) {
43
- if (!this.startPoint) {
44
- return pointer;
45
- }
43
+ this.styleValue.onUpdateAndNow(newValue => {
44
+ this.style = newValue;
45
+ this.noteUpdated();
46
+ });
47
+ }
46
48
 
47
- const screenPos = this.editor.viewport.canvasToScreen(this.startPoint.pos);
48
- return pointer.lockedToXYAxesScreen(screenPos, this.editor.viewport);
49
+ private getPressureMultiplier() {
50
+ const thickness = this.style.thickness;
51
+ return 1 / this.editor.viewport.getScaleFactor() * thickness;
49
52
  }
50
53
 
51
54
  // Converts a `pointer` to a `StrokeDataPoint`.
52
55
  protected toStrokePoint(pointer: Pointer): StrokeDataPoint {
53
- if (this.angleLockEnabled && this.lastPoint) {
54
- pointer = this.xyAxesSnap(pointer);
55
- }
56
-
57
- if (this.snapToGridEnabled) {
58
- pointer = pointer.snappedToGrid(this.editor.viewport);
59
- }
60
-
61
56
  const minPressure = 0.3;
62
57
  let pressure = Math.max(pointer.pressure ?? 1.0, minPressure);
63
58
 
@@ -114,7 +109,7 @@ export default class Pen extends BaseTool {
114
109
 
115
110
  if ((allPointers.length === 1 && !isEraser) || anyDeviceIsStylus) {
116
111
  this.startPoint = this.toStrokePoint(current);
117
- this.builder = this.builderFactory(this.startPoint, this.editor.viewport);
112
+ this.builder = this.style.factory(this.startPoint, this.editor.viewport);
118
113
  this.currentDeviceType = current.device;
119
114
  return true;
120
115
  }
@@ -208,39 +203,54 @@ export default class Pen extends BaseTool {
208
203
 
209
204
  public setColor(color: Color4): void {
210
205
  if (color.toHexString() !== this.style.color.toHexString()) {
211
- this.style = {
206
+ this.styleValue.set({
212
207
  ...this.style,
213
208
  color,
214
- };
215
- this.noteUpdated();
209
+ });
216
210
  }
217
211
  }
218
212
 
219
213
  public setThickness(thickness: number) {
220
214
  if (thickness !== this.style.thickness) {
221
- this.style = {
215
+ this.styleValue.set({
222
216
  ...this.style,
223
217
  thickness,
224
- };
225
- this.noteUpdated();
218
+ });
226
219
  }
227
220
  }
228
221
 
229
222
  public setStrokeFactory(factory: ComponentBuilderFactory) {
230
- if (factory !== this.builderFactory) {
231
- this.builderFactory = factory;
232
- this.noteUpdated();
223
+ if (factory !== this.style.factory) {
224
+ this.styleValue.set({
225
+ ...this.style,
226
+ factory,
227
+ });
228
+ }
229
+ }
230
+
231
+ public setHasStabilization(hasStabilization: boolean) {
232
+ const hasInputMapper = !!this.getInputMapper();
233
+
234
+ // TODO: Currently, this assumes that there is no other input mapper.
235
+ if (hasStabilization === hasInputMapper) {
236
+ return;
237
+ }
238
+
239
+ if (hasInputMapper) {
240
+ this.setInputMapper(null);
241
+ } else {
242
+ this.setInputMapper(new InputStabilizer(this.editor.viewport));
233
243
  }
244
+ this.noteUpdated();
234
245
  }
235
246
 
236
247
  public getThickness() { return this.style.thickness; }
237
248
  public getColor() { return this.style.color; }
238
- public getStrokeFactory() { return this.builderFactory; }
249
+ public getStrokeFactory() { return this.style.factory; }
250
+ public getStyleValue() { return this.styleValue; }
239
251
 
240
252
  public override setEnabled(enabled: boolean): void {
241
253
  super.setEnabled(enabled);
242
-
243
- this.snapToGridEnabled = false;
244
254
  }
245
255
 
246
256
  public override onKeyPress(event: KeyPressEvent): boolean {
@@ -269,32 +279,6 @@ export default class Pen extends BaseTool {
269
279
  return true;
270
280
  }
271
281
 
272
- if (shortcuts.matchesShortcut(snapToGridKeyboardShortcutId, event)) {
273
- this.snapToGridEnabled = true;
274
- return true;
275
- }
276
-
277
- if (shortcuts.matchesShortcut(lineLockKeyboardShortcutId, event)) {
278
- this.angleLockEnabled = true;
279
- return true;
280
- }
281
-
282
- return false;
283
- }
284
-
285
- public override onKeyUp(event: KeyUpEvent): boolean {
286
- const shortcuts = this.editor.shortcuts;
287
-
288
- if (shortcuts.matchesShortcut(snapToGridKeyboardShortcutId, event)) {
289
- this.snapToGridEnabled = false;
290
- return true;
291
- }
292
-
293
- if (shortcuts.matchesShortcut(lineLockKeyboardShortcutId, event)) {
294
- this.angleLockEnabled = false;
295
- return true;
296
- }
297
-
298
282
  return false;
299
283
  }
300
284
  }
@@ -1,12 +1,20 @@
1
1
  // @internal @packageDocumentation
2
2
 
3
- import Color4 from '../Color4';
3
+ import { Color4 } from '@js-draw/math';
4
4
  import Editor from '../Editor';
5
- import { PointerEvt } from '../types';
5
+ import { PointerEvt } from '../inputEvents';
6
6
  import BaseTool from './BaseTool';
7
7
 
8
8
  type ColorListener = (color: Color4|null)=>void;
9
9
 
10
+ /**
11
+ * A tool used internally to pick colors from the canvas.
12
+ *
13
+ * When color selection is in progress, the `pipette--color-selection-in-progress` class
14
+ * is added to the root element. This can be used by themes.
15
+ *
16
+ * @internal
17
+ */
10
18
  export default class PipetteTool extends BaseTool {
11
19
  private colorPreviewListener: ColorListener|null = null;
12
20
  private colorSelectListener: ColorListener|null = null;
@@ -16,6 +24,23 @@ export default class PipetteTool extends BaseTool {
16
24
  description: string,
17
25
  ) {
18
26
  super(editor.notifier, description);
27
+
28
+ this.enabledValue().onUpdateAndNow(() => {
29
+ this.updateSelectingStatus();
30
+ });
31
+ }
32
+
33
+ // Ensures that the root editor element correctly reflects whether color selection
34
+ // is in progress.
35
+ private updateSelectingStatus() {
36
+ const className = 'pipette--color-selection-in-progress';
37
+
38
+ if (this.isEnabled() && this.colorSelectListener && this.colorPreviewListener) {
39
+ this.editor.getRootElement().classList.add(className);
40
+ }
41
+ else {
42
+ this.editor.getRootElement().classList.remove(className);
43
+ }
19
44
  }
20
45
 
21
46
  public setColorListener(
@@ -26,11 +51,15 @@ export default class PipetteTool extends BaseTool {
26
51
  ) {
27
52
  this.colorPreviewListener = colorPreviewListener;
28
53
  this.colorSelectListener = colorSelectListener;
54
+
55
+ this.updateSelectingStatus();
29
56
  }
30
57
 
31
58
  public clearColorListener() {
32
59
  this.colorPreviewListener = null;
33
60
  this.colorSelectListener = null;
61
+
62
+ this.updateSelectingStatus();
34
63
  }
35
64
 
36
65
  public override onPointerDown({ current, allPointers }: PointerEvt): boolean {
@@ -1,5 +1,5 @@
1
1
  import Editor from '../../Editor';
2
- import { KeyPressEvent } from '../../types';
2
+ import { KeyPressEvent } from '../../inputEvents';
3
3
  import BaseTool from '../BaseTool';
4
4
  import { selectAllKeyboardShortcut } from '../keybindings';
5
5
  import SelectionTool from './SelectionTool';
@@ -5,14 +5,11 @@
5
5
 
6
6
  import SerializableCommand from '../../commands/SerializableCommand';
7
7
  import Editor from '../../Editor';
8
- import Mat33 from '../../math/Mat33';
9
- import Rect2 from '../../math/shapes/Rect2';
10
- import { Point2, Vec2 } from '../../math/Vec2';
8
+ import { Mat33, Rect2, Point2, Vec2, Mat33Array } from '@js-draw/math';
11
9
  import Pointer from '../../Pointer';
12
10
  import SelectionHandle, { HandleShape, handleSize } from './SelectionHandle';
13
11
  import { cssPrefix } from './SelectionTool';
14
12
  import AbstractComponent from '../../components/AbstractComponent';
15
- import { Mat33Array } from '../../math/Mat33';
16
13
  import { EditorLocalization } from '../../localization';
17
14
  import Viewport from '../../Viewport';
18
15
  import Erase from '../../commands/Erase';
@@ -57,6 +54,7 @@ export default class Selection {
57
54
  HandleShape.Square,
58
55
  Vec2.of(1, 0.5),
59
56
  this,
57
+ this.editor.viewport,
60
58
  (startPoint) => this.transformers.resize.onDragStart(startPoint, ResizeMode.HorizontalOnly),
61
59
  (currentPoint) => this.transformers.resize.onDragUpdate(currentPoint),
62
60
  () => this.transformers.resize.onDragEnd(),
@@ -66,6 +64,7 @@ export default class Selection {
66
64
  HandleShape.Square,
67
65
  Vec2.of(0.5, 1),
68
66
  this,
67
+ this.editor.viewport,
69
68
  (startPoint) => this.transformers.resize.onDragStart(startPoint, ResizeMode.VerticalOnly),
70
69
  (currentPoint) => this.transformers.resize.onDragUpdate(currentPoint),
71
70
  () => this.transformers.resize.onDragEnd(),
@@ -75,6 +74,7 @@ export default class Selection {
75
74
  HandleShape.Square,
76
75
  Vec2.of(1, 1),
77
76
  this,
77
+ this.editor.viewport,
78
78
  (startPoint) => this.transformers.resize.onDragStart(startPoint, ResizeMode.Both),
79
79
  (currentPoint) => this.transformers.resize.onDragUpdate(currentPoint),
80
80
  () => this.transformers.resize.onDragEnd(),
@@ -84,6 +84,7 @@ export default class Selection {
84
84
  HandleShape.Circle,
85
85
  Vec2.of(0.5, 0),
86
86
  this,
87
+ this.editor.viewport,
87
88
  (startPoint) => this.transformers.rotate.onDragStart(startPoint),
88
89
  (currentPoint) => this.transformers.rotate.onDragUpdate(currentPoint),
89
90
  () => this.transformers.rotate.onDragEnd(),
@@ -179,7 +180,7 @@ export default class Selection {
179
180
  }
180
181
 
181
182
  // Applies the current transformation to the selection
182
- public finalizeTransform() {
183
+ public async finalizeTransform() {
183
184
  const fullTransform = this.transform;
184
185
  const selectedElems = this.selectedElems;
185
186
 
@@ -188,7 +189,7 @@ export default class Selection {
188
189
  this.transform = Mat33.identity;
189
190
 
190
191
  // Make the commands undo-able
191
- this.editor.dispatch(new Selection.ApplyTransformationCommand(
192
+ await this.editor.dispatch(new Selection.ApplyTransformationCommand(
192
193
  this, selectedElems, fullTransform
193
194
  ));
194
195
 
@@ -459,25 +460,41 @@ export default class Selection {
459
460
 
460
461
  private targetHandle: SelectionHandle|null = null;
461
462
  private backgroundDragging: boolean = false;
462
- public onDragStart(pointer: Pointer, target: EventTarget): boolean {
463
- this.removeDeletedElemsFromSelection();
464
- this.addRemoveSelectionFromImage(false);
463
+ public onDragStart(pointer: Pointer): boolean {
464
+ // Clear the HTML selection (prevent HTML drag and drop being triggered by this drag)
465
+ document.getSelection()?.removeAllRanges();
466
+
467
+ this.targetHandle = null;
468
+
469
+ let result = false;
465
470
 
466
471
  for (const handle of this.handles) {
467
- if (handle.isTarget(target)) {
468
- handle.handleDragStart(pointer);
472
+ if (handle.containsPoint(pointer.canvasPos)) {
469
473
  this.targetHandle = handle;
470
- return true;
474
+ result = true;
471
475
  }
472
476
  }
473
477
 
474
- if (this.backgroundElem === target) {
478
+ this.backgroundDragging = false;
479
+ if (this.region.containsPoint(pointer.canvasPos)) {
475
480
  this.backgroundDragging = true;
481
+ result = true;
482
+ }
483
+
484
+ if (result) {
485
+ this.removeDeletedElemsFromSelection();
486
+ this.addRemoveSelectionFromImage(false);
487
+ }
488
+
489
+ if (this.targetHandle) {
490
+ this.targetHandle.handleDragStart(pointer);
491
+ }
492
+
493
+ if (this.backgroundDragging) {
476
494
  this.transformers.drag.onDragStart(pointer.canvasPos);
477
- return true;
478
495
  }
479
496
 
480
- return false;
497
+ return result;
481
498
  }
482
499
 
483
500
  public onDragUpdate(pointer: Pointer) {
@@ -543,10 +560,29 @@ export default class Selection {
543
560
  return new Erase(this.selectedElems);
544
561
  }
545
562
 
563
+ private selectionDuplicatedAnimationTimeout: ReturnType<typeof setTimeout>|null = null;
564
+ private runSelectionDuplicatedAnimation() {
565
+ if (this.selectionDuplicatedAnimationTimeout) {
566
+ clearTimeout(this.selectionDuplicatedAnimationTimeout);
567
+ }
568
+
569
+ const animationDuration = 400; // ms
570
+ this.backgroundElem.style.animation = `${animationDuration}ms ease selection-duplicated-animation`;
571
+
572
+ this.selectionDuplicatedAnimationTimeout = setTimeout(() => {
573
+ this.backgroundElem.style.animation = '';
574
+ this.selectionDuplicatedAnimationTimeout = null;
575
+ }, animationDuration);
576
+ }
577
+
546
578
  public async duplicateSelectedObjects(): Promise<Command> {
547
579
  const wasTransforming = this.backgroundDragging || this.targetHandle;
548
580
  let tmpApplyCommand: Command|null = null;
549
581
 
582
+ if (!wasTransforming) {
583
+ this.runSelectionDuplicatedAnimation();
584
+ }
585
+
550
586
  if (wasTransforming) {
551
587
  // Don't update the selection's focus when redoing/undoing
552
588
  const selectionToUpdate: Selection|null = null;
@@ -605,7 +641,7 @@ export default class Selection {
605
641
  }
606
642
 
607
643
  public getSelectedObjects(): AbstractComponent[] {
608
- return this.selectedElems;
644
+ return [...this.selectedElems];
609
645
  }
610
646
  }
611
647
 
@@ -1,8 +1,9 @@
1
1
  import { assertUnreachable } from '../../util/assertions';
2
- import { Point2, Vec2 } from '../../math/Vec2';
2
+ import { Point2, Rect2, Vec2 } from '@js-draw/math';
3
3
  import { cssPrefix } from './SelectionTool';
4
4
  import Selection from './Selection';
5
5
  import Pointer from '../../Pointer';
6
+ import Viewport from '../../Viewport';
6
7
 
7
8
  export enum HandleShape {
8
9
  Circle,
@@ -20,12 +21,11 @@ export default class SelectionHandle {
20
21
  private element: HTMLElement;
21
22
  private snapToGrid: boolean;
22
23
 
23
- // Bounding box in screen coordinates.
24
-
25
24
  public constructor(
26
25
  readonly shape: HandleShape,
27
26
  private readonly parentSide: Vec2,
28
27
  private readonly parent: Selection,
28
+ private readonly viewport: Viewport,
29
29
 
30
30
  private readonly onDragStart: DragStartCallback,
31
31
  private readonly onDragUpdate: DragUpdateCallback,
@@ -56,25 +56,59 @@ export default class SelectionHandle {
56
56
  container.appendChild(this.element);
57
57
  }
58
58
 
59
- public updatePosition() {
59
+ /**
60
+ * Returns this handle's bounding box relative to the top left of the
61
+ * selection box.
62
+ */
63
+ private getBBoxParentCoords() {
60
64
  const parentRect = this.parent.screenRegion;
61
65
  const size = Vec2.of(handleSize, handleSize);
62
66
  const topLeft = parentRect.size.scale(this.parentSide)
63
67
  // Center
64
68
  .minus(size.times(1/2));
65
69
 
66
- // Position within the selection box.
67
- this.element.style.marginLeft = `${topLeft.x}px`;
68
- this.element.style.marginTop = `${topLeft.y}px`;
69
- this.element.style.width = `${size.x}px`;
70
- this.element.style.height = `${size.y}px`;
70
+ return new Rect2(topLeft.x, topLeft.y, size.x, size.y);
71
+ }
72
+
73
+ /** @returns this handle's bounding box relative to the canvas. */
74
+ private getBBoxCanvasCoords() {
75
+ const parentRect = this.parent.region;
76
+ const size = Vec2.of(handleSize, handleSize).times(1/this.viewport.getScaleFactor());
77
+
78
+ const topLeftFromParent = parentRect.size.scale(this.parentSide).minus(size.times(0.5));
79
+
80
+ return new Rect2(topLeftFromParent.x, topLeftFromParent.y, size.x, size.y).translatedBy(parentRect.topLeft);
71
81
  }
72
82
 
73
83
  /**
74
- * @returns `true` if the given `EventTarget` matches this.
84
+ * Moves the HTML representation of this to the location matching its internal representation.
75
85
  */
76
- public isTarget(target: EventTarget): boolean {
77
- return target === this.element;
86
+ public updatePosition() {
87
+ const bbox = this.getBBoxParentCoords();
88
+
89
+ // Position within the selection box.
90
+ this.element.style.marginLeft = `${bbox.topLeft.x}px`;
91
+ this.element.style.marginTop = `${bbox.topLeft.y}px`;
92
+ this.element.style.width = `${bbox.w}px`;
93
+ this.element.style.height = `${bbox.h}px`;
94
+ }
95
+
96
+ /** @returns true iff `point` (in editor **canvas** coordinates) is in this. */
97
+ public containsPoint(point: Point2) {
98
+ const bbox = this.getBBoxCanvasCoords();
99
+ const delta = point.minus(bbox.center);
100
+
101
+ // Should have same x and y radius
102
+ const radius = bbox.size.x / 2;
103
+
104
+ let result;
105
+ if (this.shape === HandleShape.Circle) {
106
+ result = delta.magnitude() <= radius;
107
+ } else {
108
+ result = Math.abs(delta.x) <= radius && Math.abs(delta.y) <= radius;
109
+ }
110
+
111
+ return result;
78
112
  }
79
113
 
80
114
  private dragLastPos: Vec2|null = null;