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
@@ -7,14 +7,17 @@ import { makeOutlinedCircleBuilder } from '../../components/builders/CircleBuild
7
7
  import { ComponentBuilderFactory } from '../../components/builders/types';
8
8
  import Editor from '../../Editor';
9
9
  import Pen from '../../tools/Pen';
10
- import { EditorEventType, KeyPressEvent } from '../../types';
11
- import { toolbarCSSPrefix } from '../HTMLToolbar';
10
+ import { EditorEventType } from '../../types';
11
+ import { KeyPressEvent } from '../../inputEvents';
12
12
  import { ToolbarLocalization } from '../localization';
13
- import makeColorInput from '../makeColorInput';
13
+ import makeColorInput from './components/makeColorInput';
14
14
  import BaseToolWidget from './BaseToolWidget';
15
- import Color4 from '../../Color4';
15
+ import { Color4 } from '@js-draw/math';
16
16
  import { SavedToolbuttonState } from './BaseWidget';
17
17
  import { selectStrokeTypeKeyboardShortcutIds } from './keybindings';
18
+ import { toolbarCSSPrefix } from '../constants';
19
+ import makeThicknessSlider from './components/makeThicknessSlider';
20
+ import makeGridSelector from './components/makeGridSelector';
18
21
 
19
22
  export interface PenTypeRecord {
20
23
  // Description of the factory (e.g. 'Freehand line')
@@ -23,6 +26,10 @@ export interface PenTypeRecord {
23
26
  // A unique ID for the facotory (e.g. 'chisel-tip-pen')
24
27
  id: string;
25
28
 
29
+ // True if the pen type generates shapes (and should thus be shown in the GUI
30
+ // as a shape generator). Defaults to false.
31
+ isShapeBuilder?: boolean;
32
+
26
33
  // Creates an `AbstractComponent` from pen input.
27
34
  factory: ComponentBuilderFactory;
28
35
  }
@@ -30,6 +37,7 @@ export interface PenTypeRecord {
30
37
  export default class PenToolWidget extends BaseToolWidget {
31
38
  private updateInputs: ()=> void = () => {};
32
39
  protected penTypes: PenTypeRecord[];
40
+ protected shapelikeIDs: string[];
33
41
 
34
42
  // A counter variable that ensures different HTML elements are given unique names/ids.
35
43
  private static idCounter: number = 0;
@@ -39,6 +47,9 @@ export default class PenToolWidget extends BaseToolWidget {
39
47
  ) {
40
48
  super(editor, tool, 'pen', localization);
41
49
 
50
+ // Pen types that correspond to
51
+ this.shapelikeIDs = [ 'pressure-sensitive-pen', 'freehand-pen' ];
52
+
42
53
  // Default pen types
43
54
  this.penTypes = [
44
55
  {
@@ -57,30 +68,35 @@ export default class PenToolWidget extends BaseToolWidget {
57
68
  name: this.localizationTable.arrowPen,
58
69
  id: 'arrow',
59
70
 
71
+ isShapeBuilder: true,
60
72
  factory: makeArrowBuilder,
61
73
  },
62
74
  {
63
75
  name: this.localizationTable.linePen,
64
76
  id: 'line',
65
77
 
78
+ isShapeBuilder: true,
66
79
  factory: makeLineBuilder,
67
80
  },
68
81
  {
69
82
  name: this.localizationTable.filledRectanglePen,
70
83
  id: 'filled-rectangle',
71
84
 
85
+ isShapeBuilder: true,
72
86
  factory: makeFilledRectangleBuilder,
73
87
  },
74
88
  {
75
89
  name: this.localizationTable.outlinedRectanglePen,
76
90
  id: 'outlined-rectangle',
77
91
 
92
+ isShapeBuilder: true,
78
93
  factory: makeOutlinedRectangleBuilder,
79
94
  },
80
95
  {
81
96
  name: this.localizationTable.outlinedCirclePen,
82
97
  id: 'outlined-circle',
83
98
 
99
+ isShapeBuilder: true,
84
100
  factory: makeOutlinedCircleBuilder,
85
101
  }
86
102
  ];
@@ -127,18 +143,19 @@ export default class PenToolWidget extends BaseToolWidget {
127
143
  }
128
144
 
129
145
  private createIconForRecord(record: PenTypeRecord|null) {
130
- const color = this.tool.getColor();
146
+ const style = {
147
+ ...this.tool.getStyleValue().get(),
148
+ };
149
+
150
+ if (record?.factory) {
151
+ style.factory = record.factory;
152
+ }
131
153
 
132
154
  const strokeFactory = record?.factory;
133
155
  if (!strokeFactory || strokeFactory === makeFreehandLineBuilder || strokeFactory === makePressureSensitiveFreehandLineBuilder) {
134
- // Use a square-root scale to prevent the pen's tip from overflowing.
135
- const scale = Math.round(Math.sqrt(this.tool.getThickness()) * 4);
136
- const roundedTip = strokeFactory === makeFreehandLineBuilder;
137
-
138
- return this.editor.icons.makePenIcon(scale, color.toHexString(), roundedTip);
156
+ return this.editor.icons.makePenIcon(style);
139
157
  } else {
140
- const hasTransparency = color.a < 1;
141
- return this.editor.icons.makeIconFromFactory(this.tool, strokeFactory, hasTransparency);
158
+ return this.editor.icons.makeIconFromFactory(style);
142
159
  }
143
160
  }
144
161
 
@@ -149,168 +166,101 @@ export default class PenToolWidget extends BaseToolWidget {
149
166
 
150
167
  // Creates a widget that allows selecting different pen types
151
168
  private createPenTypeSelector() {
152
- const outerContainer = document.createElement('div');
153
- outerContainer.classList.add(`${toolbarCSSPrefix}pen-type-selector`);
154
-
155
- const scrollingContainer = document.createElement('div');
156
- scrollingContainer.setAttribute('role', 'menu');
157
- scrollingContainer.id = `${toolbarCSSPrefix}-pen-type-selector-id-${PenToolWidget.idCounter++}`;
158
-
159
- scrollingContainer.onwheel = (event) => {
160
- const hasScroll = scrollingContainer.clientWidth !== scrollingContainer.scrollWidth
161
- && event.deltaX !== 0;
162
- const eventScrollsPastLeft =
163
- scrollingContainer.scrollLeft + event.deltaX <= 0;
164
- const scrollRight = scrollingContainer.scrollLeft + scrollingContainer.clientWidth;
165
- const eventScrollsPastRight =
166
- scrollRight + event.deltaX > scrollingContainer.scrollWidth;
167
-
168
- // Stop the editor from receiving the event if it will scroll the pen type selector
169
- // instead.
170
- if (hasScroll && !eventScrollsPastLeft && !eventScrollsPastRight) {
171
- event.stopPropagation();
172
- }
173
- };
174
-
175
- const label = document.createElement('label');
176
- label.innerText = this.localizationTable.selectPenType;
177
- label.htmlFor = scrollingContainer.id;
178
- outerContainer.appendChild(label);
179
-
180
- // All buttons in a radiogroup need the same name attribute.
181
- const radiogroupName = `${toolbarCSSPrefix}-pen-type-selector-${PenToolWidget.idCounter++}`;
182
-
183
- const createTypeSelectorButton = (record: PenTypeRecord) => {
184
- const buttonContainer = document.createElement('div');
185
- buttonContainer.classList.add('pen-type-button');
186
-
187
- const button = document.createElement('input');
188
- button.type = 'radio';
189
- button.name = radiogroupName;
190
- button.id = `${toolbarCSSPrefix}-pen-type-button-${PenToolWidget.idCounter++}`;
191
-
192
- const labelContainer = document.createElement('label');
193
-
194
- const rebuildLabel = () => {
195
- const labelText = document.createElement('span');
196
-
197
- const icon = this.createIconForRecord(record);
198
- icon.classList.add('icon');
199
-
200
- // The title of the record
201
- labelText.innerText = record.name;
202
- labelContainer.htmlFor = button.id;
203
-
204
- labelContainer.replaceChildren(icon, labelText);
205
- };
206
- rebuildLabel();
207
-
208
- const updateButtonCSS = () => {
209
- if (button.checked) {
210
- buttonContainer.classList.add('checked');
211
- } else {
212
- buttonContainer.classList.remove('checked');
213
- }
169
+ const allChoices = this.penTypes.map((penType, index) => {
170
+ return {
171
+ id: index,
172
+ makeIcon: () => this.createIconForRecord(penType),
173
+ title: penType.name,
174
+ isShapeBuilder: penType.isShapeBuilder ?? false,
214
175
  };
176
+ });
215
177
 
216
- button.oninput = () => {
217
- // Setting the stroke factory fires an event that causes the value
218
- // of this button to be set.
219
- if (button.checked) {
220
- this.tool.setStrokeFactory(record.factory);
221
- }
222
-
223
- updateButtonCSS();
224
- };
225
-
226
- buttonContainer.replaceChildren(button, labelContainer);
227
- scrollingContainer.appendChild(buttonContainer);
228
-
229
- // Set whether the button is checked, assuming the stroke factory associated
230
- // with the button was set elsewhere.
231
- const setChecked = (checked: boolean) => {
232
- button.checked = checked;
233
- updateButtonCSS();
178
+ const penSelector = makeGridSelector(
179
+ this.localizationTable.selectPenTip,
180
+ this.getCurrentPenTypeIdx(),
181
+ allChoices.filter(choice => !choice.isShapeBuilder),
182
+ );
234
183
 
235
- if (checked) {
236
- button.scrollIntoView();
237
- }
238
- };
239
- setChecked(false);
240
-
241
- // Updates the factory's icon based on the current style of the tool.
242
- const updateIcon = () => {
243
- rebuildLabel();
244
- };
184
+ const shapeSelector = makeGridSelector(
185
+ this.localizationTable.selectShape,
186
+ this.getCurrentPenTypeIdx(),
187
+ allChoices.filter(choice => choice.isShapeBuilder),
188
+ );
245
189
 
246
- return { setChecked, updateIcon };
190
+ const onSelectorUpdate = (newPenTypeIndex: number) => {
191
+ this.tool.setStrokeFactory(this.penTypes[newPenTypeIndex].factory);
247
192
  };
248
193
 
249
- const buttons: Array<ReturnType<typeof createTypeSelectorButton>> = [];
250
- for (const penType of this.penTypes) {
251
- buttons.push(createTypeSelectorButton(penType));
252
- }
253
- // invariant: buttons.length = this.penTypes.length
254
-
255
- outerContainer.appendChild(scrollingContainer);
194
+ penSelector.value.onUpdate(onSelectorUpdate);
195
+ shapeSelector.value.onUpdate(onSelectorUpdate);
256
196
 
257
197
  return {
258
198
  setValue: (penTypeIndex: number) => {
259
- // Select the value specified
260
- if (penTypeIndex < 0 || penTypeIndex >= this.penTypes.length) {
261
- console.error('Invalid pen type index', penTypeIndex);
262
- return;
263
- }
264
-
265
- for (let i = 0; i < buttons.length; i++) {
266
- buttons[i].setChecked(i === penTypeIndex);
267
- }
199
+ penSelector.value.set(penTypeIndex);
200
+ shapeSelector.value.set(penTypeIndex);
268
201
  },
269
202
 
270
203
  updateIcons: () => {
271
- buttons.forEach(button => button.updateIcon());
204
+ penSelector.updateIcons();
205
+ shapeSelector.updateIcons();
272
206
  },
273
207
 
274
208
  addTo: (parent: HTMLElement) => {
275
- parent.appendChild(outerContainer);
209
+ penSelector.addTo(parent);
210
+ shapeSelector.addTo(parent);
276
211
  },
277
212
  };
278
213
  }
279
214
 
280
- protected override fillDropdown(dropdown: HTMLElement): boolean {
281
- const container = document.createElement('div');
282
- container.classList.add(`${toolbarCSSPrefix}spacedList`);
215
+ private setInputStabilizationEnabled(enabled: boolean) {
216
+ this.tool.setHasStabilization(enabled);
217
+ }
283
218
 
284
- const thicknessRow = document.createElement('div');
219
+ protected createStabilizationOption() {
220
+ const stabilizationOption = document.createElement('div');
221
+ const stabilizationCheckbox = document.createElement('input');
222
+ const stabilizationLabel = document.createElement('label');
223
+ stabilizationLabel.innerText = this.localizationTable.inputStabilization;
285
224
 
286
- // Thickness: Value of the input is squared to allow for finer control/larger values.
287
- const thicknessLabel = document.createElement('label');
288
- const thicknessInput = document.createElement('input');
289
- const penTypeSelect = this.createPenTypeSelector();
225
+ stabilizationCheckbox.type = 'checkbox';
226
+ stabilizationCheckbox.id = `${toolbarCSSPrefix}-penInputStabilizationCheckbox-${PenToolWidget.idCounter++}`;
227
+ stabilizationLabel.htmlFor = stabilizationCheckbox.id;
290
228
 
291
- // Give inputs IDs so we can label them with a <label for=...>Label text</label>
292
- thicknessInput.id = `${toolbarCSSPrefix}penThicknessInput${PenToolWidget.idCounter++}`;
229
+ stabilizationOption.replaceChildren(stabilizationLabel, stabilizationCheckbox);
293
230
 
294
- thicknessLabel.innerText = this.localizationTable.thicknessLabel;
295
- thicknessLabel.setAttribute('for', thicknessInput.id);
231
+ stabilizationCheckbox.oninput = () => {
232
+ this.setInputStabilizationEnabled(stabilizationCheckbox.checked);
233
+ };
296
234
 
297
- // Use a logarithmic scale for thicknessInput (finer control over thinner strokewidths.)
298
- const inverseThicknessInputFn = (t: number) => Math.log10(t);
299
- const thicknessInputFn = (t: number) => 10**t;
235
+ return {
236
+ update: () => {
237
+ stabilizationCheckbox.checked = !!this.tool.getInputMapper();
238
+ },
300
239
 
301
- thicknessInput.type = 'range';
302
- thicknessInput.min = `${inverseThicknessInputFn(2)}`;
303
- thicknessInput.max = `${inverseThicknessInputFn(400)}`;
304
- thicknessInput.step = '0.1';
305
- thicknessInput.oninput = () => {
306
- this.tool.setThickness(thicknessInputFn(parseFloat(thicknessInput.value)));
240
+ addTo: (parent: HTMLElement) => {
241
+ parent.appendChild(stabilizationOption);
242
+ }
307
243
  };
308
- thicknessRow.appendChild(thicknessLabel);
309
- thicknessRow.appendChild(thicknessInput);
244
+ }
245
+
246
+ protected override fillDropdown(dropdown: HTMLElement): boolean {
247
+ const container = document.createElement('div');
248
+ container.classList.add(
249
+ `${toolbarCSSPrefix}spacedList`, `${toolbarCSSPrefix}nonbutton-controls-main-list`
250
+ );
251
+
252
+ // Thickness: Value of the input is squared to allow for finer control/larger values.
253
+ const { container: thicknessRow, setValue: setThickness } = makeThicknessSlider(this.editor, thickness => {
254
+ this.tool.setThickness(thickness);
255
+ });
256
+
257
+ const penTypeSelect = this.createPenTypeSelector();
310
258
 
311
259
  const colorRow = document.createElement('div');
312
260
  const colorLabel = document.createElement('label');
313
- const [ colorInput, colorInputContainer, setColorInputValue ] = makeColorInput(this.editor, color => {
261
+ const {
262
+ input: colorInput, container: colorInputContainer, setValue: setColorInputValue
263
+ } = makeColorInput(this.editor, color => {
314
264
  this.tool.setColor(color);
315
265
  });
316
266
 
@@ -321,19 +271,24 @@ export default class PenToolWidget extends BaseToolWidget {
321
271
  colorRow.appendChild(colorLabel);
322
272
  colorRow.appendChild(colorInputContainer);
323
273
 
274
+ const stabilizationOption = this.createStabilizationOption();
275
+
324
276
  this.updateInputs = () => {
325
277
  setColorInputValue(this.tool.getColor());
326
- thicknessInput.value = inverseThicknessInputFn(this.tool.getThickness()).toString();
278
+ setThickness(this.tool.getThickness());
327
279
 
328
280
  penTypeSelect.updateIcons();
329
281
 
330
282
  // Update the selected stroke factory.
331
283
  penTypeSelect.setValue(this.getCurrentPenTypeIdx());
284
+ stabilizationOption.update();
332
285
  };
333
286
  this.updateInputs();
334
287
 
335
288
  container.replaceChildren(colorRow, thicknessRow);
336
289
  penTypeSelect.addTo(container);
290
+ stabilizationOption.addTo(container);
291
+
337
292
  dropdown.replaceChildren(container);
338
293
  return true;
339
294
  }
@@ -368,6 +323,7 @@ export default class PenToolWidget extends BaseToolWidget {
368
323
  color: this.tool.getColor().toHexString(),
369
324
  thickness: this.tool.getThickness(),
370
325
  strokeFactoryId: this.getCurrentPenType()?.id,
326
+ inputStabilization: !!this.tool.getInputMapper(),
371
327
  };
372
328
  }
373
329
 
@@ -405,5 +361,9 @@ export default class PenToolWidget extends BaseToolWidget {
405
361
  }
406
362
  }
407
363
  }
364
+
365
+ if (state.inputStabilization !== undefined) {
366
+ this.setInputStabilizationEnabled(!!state.inputStabilization);
367
+ }
408
368
  }
409
369
  }
@@ -0,0 +1,6 @@
1
+
2
+ .selection-format-menu {
3
+ &.disabled {
4
+ opacity: 0.5;
5
+ }
6
+ }
@@ -1,99 +1,84 @@
1
- import Color4 from '../../Color4';
1
+ import { Color4 } from '@js-draw/math';
2
2
  import { isRestylableComponent } from '../../components/RestylableComponent';
3
3
  import Editor from '../../Editor';
4
4
  import uniteCommands from '../../commands/uniteCommands';
5
5
  import SelectionTool from '../../tools/SelectionTool/SelectionTool';
6
- import { EditorEventType, KeyPressEvent } from '../../types';
6
+ import { EditorEventType } from '../../types';
7
+ import { KeyPressEvent } from '../../inputEvents';
7
8
  import { ToolbarLocalization } from '../localization';
8
- import makeColorInput from '../makeColorInput';
9
+ import makeColorInput from './components/makeColorInput';
9
10
  import ActionButtonWidget from './ActionButtonWidget';
10
11
  import BaseToolWidget from './BaseToolWidget';
11
- import BaseWidget from './BaseWidget';
12
12
  import { resizeImageToSelectionKeyboardShortcut } from './keybindings';
13
+ import makeSeparator from './components/makeSeparator';
14
+ import { toolbarCSSPrefix } from '../constants';
15
+
16
+ const makeFormatMenu = (editor: Editor, selectionTool: SelectionTool, localizationTable: ToolbarLocalization) => {
17
+ const container = document.createElement('div');
18
+ container.classList.add(
19
+ 'selection-format-menu', `${toolbarCSSPrefix}spacedList`, `${toolbarCSSPrefix}indentedList`
20
+ );
21
+
22
+ const colorRow = document.createElement('div');
23
+ const colorLabel = document.createElement('label');
24
+ const {
25
+ input: colorInput, container: colorInputContainer, setValue: setColorInputValue
26
+ } = makeColorInput(editor, color => {
27
+ const selection = selectionTool.getSelection();
13
28
 
14
- class RestyleSelectionWidget extends BaseWidget {
15
- private updateFormatData: ()=>void = () => {};
16
-
17
- public constructor(editor: Editor, private selectionTool: SelectionTool, localizationTable?: ToolbarLocalization) {
18
- super(editor, 'restyle-selection', localizationTable);
19
-
20
- // Allow showing the dropdown even if this widget isn't selected yet
21
- this.container.classList.add('dropdownShowable');
22
-
23
- this.editor.notifier.on(EditorEventType.ToolUpdated, toolEvt => {
24
- if (toolEvt.kind !== EditorEventType.ToolUpdated) {
25
- throw new Error('Invalid event type!');
26
- }
27
-
28
- if (toolEvt.tool === this.selectionTool) {
29
- this.updateFormatData();
30
- }
31
- });
32
- }
33
-
34
- protected getTitle(): string {
35
- return this.localizationTable.reformatSelection;
36
- }
37
-
38
- protected createIcon(){
39
- return this.editor.icons.makeFormatSelectionIcon();
40
- }
41
-
42
- protected handleClick(): void {
43
- this.setDropdownVisible(!this.isDropdownVisible());
44
- }
29
+ if (selection) {
30
+ const updateStyleCommands = [];
45
31
 
46
- protected override fillDropdown(dropdown: HTMLElement): boolean {
47
- const container = document.createElement('div');
48
- const colorRow = document.createElement('div');
49
- const colorLabel = document.createElement('label');
50
- const [ colorInput, colorInputContainer, setColorInputValue ] = makeColorInput(this.editor, color => {
51
- const selection = this.selectionTool.getSelection();
52
-
53
- if (selection) {
54
- const updateStyleCommands = [];
55
-
56
- for (const elem of selection.getSelectedObjects()) {
57
- if (isRestylableComponent(elem)) {
58
- updateStyleCommands.push(elem.updateStyle({ color }));
59
- }
32
+ for (const elem of selection.getSelectedObjects()) {
33
+ if (isRestylableComponent(elem)) {
34
+ updateStyleCommands.push(elem.updateStyle({ color }));
60
35
  }
61
-
62
- const unitedCommand = uniteCommands(updateStyleCommands);
63
- this.editor.dispatch(unitedCommand);
64
36
  }
65
- });
66
-
67
- colorLabel.innerText = this.localizationTable.colorLabel;
68
-
69
- this.updateFormatData = () => {
70
- const selection = this.selectionTool.getSelection();
71
- if (selection) {
72
- colorInput.disabled = false;
73
37
 
74
- const colors = [];
75
- for (const elem of selection.getSelectedObjects()) {
76
- if (isRestylableComponent(elem)) {
77
- const color = elem.getStyle().color;
78
- if (color) {
79
- colors.push(color);
80
- }
38
+ const unitedCommand = uniteCommands(updateStyleCommands);
39
+ editor.dispatch(unitedCommand);
40
+ }
41
+ });
42
+
43
+ colorLabel.innerText = localizationTable.colorLabel;
44
+
45
+ const update = () => {
46
+ const selection = selectionTool.getSelection();
47
+ if (selection && selection.getSelectedItemCount() > 0) {
48
+ colorInput.disabled = false;
49
+ container.classList.remove('disabled');
50
+
51
+ const colors = [];
52
+ for (const elem of selection.getSelectedObjects()) {
53
+ if (isRestylableComponent(elem)) {
54
+ const color = elem.getStyle().color;
55
+ if (color) {
56
+ colors.push(color);
81
57
  }
82
58
  }
83
- setColorInputValue(Color4.average(colors));
84
- } else {
85
- colorInput.disabled = true;
86
59
  }
87
- };
60
+ setColorInputValue(Color4.average(colors));
61
+ } else {
62
+ colorInput.disabled = true;
63
+ container.classList.add('disabled');
64
+ setColorInputValue(Color4.transparent);
65
+ }
66
+ };
88
67
 
89
- colorRow.replaceChildren(colorLabel, colorInputContainer);
90
- container.replaceChildren(colorRow);
91
- dropdown.replaceChildren(container);
92
- return true;
93
- }
94
- }
68
+ colorRow.replaceChildren(colorLabel, colorInputContainer);
69
+ container.replaceChildren(colorRow);
70
+
71
+ return {
72
+ addTo: (parent: HTMLElement) => {
73
+ parent.appendChild(container);
74
+ },
75
+ update,
76
+ };
77
+ };
95
78
 
96
79
  export default class SelectionToolWidget extends BaseToolWidget {
80
+ private updateFormatMenu: ()=>void = () => {};
81
+
97
82
  public constructor(
98
83
  editor: Editor, private tool: SelectionTool, localization?: ToolbarLocalization
99
84
  ) {
@@ -101,7 +86,7 @@ export default class SelectionToolWidget extends BaseToolWidget {
101
86
 
102
87
  const resizeButton = new ActionButtonWidget(
103
88
  editor, 'resize-btn',
104
- () => editor.icons.makeResizeViewportIcon(),
89
+ () => editor.icons.makeResizeImageToSelectionIcon(),
105
90
  this.localizationTable.resizeImageToSelection,
106
91
  () => {
107
92
  this.resizeImageToSelection();
@@ -126,25 +111,19 @@ export default class SelectionToolWidget extends BaseToolWidget {
126
111
  async () => {
127
112
  const selection = this.tool.getSelection();
128
113
  this.editor.dispatch(await selection!.duplicateSelectedObjects());
114
+ this.setDropdownVisible(false);
129
115
  },
130
116
  localization,
131
117
  );
132
- const restyleButton = new RestyleSelectionWidget(
133
- editor,
134
- this.tool,
135
- localization,
136
- );
137
118
 
138
119
  this.addSubWidget(resizeButton);
139
120
  this.addSubWidget(deleteButton);
140
121
  this.addSubWidget(duplicateButton);
141
- this.addSubWidget(restyleButton);
142
122
 
143
123
  const updateDisabled = (disabled: boolean) => {
144
124
  resizeButton.setDisabled(disabled);
145
125
  deleteButton.setDisabled(disabled);
146
126
  duplicateButton.setDisabled(disabled);
147
- restyleButton.setDisabled(disabled);
148
127
  };
149
128
  updateDisabled(true);
150
129
 
@@ -159,6 +138,7 @@ export default class SelectionToolWidget extends BaseToolWidget {
159
138
  const hasSelection = selection && selection.getSelectedItemCount() > 0;
160
139
 
161
140
  updateDisabled(!hasSelection);
141
+ this.updateFormatMenu();
162
142
  }
163
143
  });
164
144
  }
@@ -194,4 +174,22 @@ export default class SelectionToolWidget extends BaseToolWidget {
194
174
  protected createIcon(): Element {
195
175
  return this.editor.icons.makeSelectionIcon();
196
176
  }
177
+
178
+ protected override fillDropdown(dropdown: HTMLElement): boolean {
179
+ super.fillDropdown(dropdown);
180
+
181
+ const controlsContainer = document.createElement('div');
182
+ controlsContainer.classList.add(`${toolbarCSSPrefix}nonbutton-controls-main-list`);
183
+ dropdown.appendChild(controlsContainer);
184
+
185
+ makeSeparator(this.localizationTable.reformatSelection).addTo(controlsContainer);
186
+
187
+ const formatMenu = makeFormatMenu(this.editor, this.tool, this.localizationTable);
188
+ formatMenu.addTo(controlsContainer);
189
+ this.updateFormatMenu = () => formatMenu.update();
190
+
191
+ formatMenu.update();
192
+
193
+ return true;
194
+ }
197
195
  }
@@ -1,10 +1,10 @@
1
- import Color4 from '../../Color4';
1
+ import { Color4 } from '@js-draw/math';
2
2
  import Editor from '../../Editor';
3
3
  import TextTool from '../../tools/TextTool';
4
4
  import { EditorEventType } from '../../types';
5
- import { toolbarCSSPrefix } from '../HTMLToolbar';
5
+ import { toolbarCSSPrefix } from '../constants';
6
6
  import { ToolbarLocalization } from '../localization';
7
- import makeColorInput from '../makeColorInput';
7
+ import makeColorInput from './components/makeColorInput';
8
8
  import BaseToolWidget from './BaseToolWidget';
9
9
  import { SavedToolbuttonState } from './BaseWidget';
10
10
 
@@ -33,7 +33,9 @@ export default class TextToolWidget extends BaseToolWidget {
33
33
  private static idCounter: number = 0;
34
34
  protected override fillDropdown(dropdown: HTMLElement): boolean {
35
35
  const container = document.createElement('div');
36
- container.classList.add(`${toolbarCSSPrefix}spacedList`);
36
+ container.classList.add(
37
+ `${toolbarCSSPrefix}spacedList`, `${toolbarCSSPrefix}nonbutton-controls-main-list`
38
+ );
37
39
  const fontRow = document.createElement('div');
38
40
  const colorRow = document.createElement('div');
39
41
  const sizeRow = document.createElement('div');
@@ -44,7 +46,9 @@ export default class TextToolWidget extends BaseToolWidget {
44
46
  const sizeInput = document.createElement('input');
45
47
  const sizeLabel = document.createElement('label');
46
48
 
47
- const [ colorInput, colorInputContainer, setColorInputValue ] = makeColorInput(this.editor, color => {
49
+ const {
50
+ input: colorInput, container: colorInputContainer, setValue: setColorInputValue
51
+ } = makeColorInput(this.editor, color => {
48
52
  this.tool.setColor(color);
49
53
  });
50
54
  const colorLabel = document.createElement('label');
@@ -0,0 +1,5 @@
1
+ @use "./makeThicknessSlider.scss";
2
+ @use "./makeColorInput.scss";
3
+ @use "./makeSeparator.scss";
4
+ @use "./makeFileInput.scss";
5
+ @use "./makeGridSelector.scss";