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
@@ -13,11 +13,13 @@ export interface ToolbarLocalization {
13
13
  image: string;
14
14
  inputAltText: string;
15
15
  chooseFile: string;
16
+ dragAndDropHereOrBrowse: string; // Uses {{curly braces}} to bold text
16
17
  cancel: string;
17
18
  submit: string;
18
19
  roundedTipPen: string;
19
20
  flatTipPen: string;
20
- selectPenType: string;
21
+ selectPenTip: string;
22
+ selectShape: string;
21
23
  colorLabel: string;
22
24
  pen: string;
23
25
  eraser: string;
@@ -32,11 +34,14 @@ export interface ToolbarLocalization {
32
34
  clickToPickColorAnnouncement: string;
33
35
  colorSelectionCanceledAnnouncement: string;
34
36
 
35
- reformatSelection: string;
36
37
  undo: string;
37
38
  redo: string;
39
+ exit: string;
40
+ save: string;
41
+
38
42
  zoom: string;
39
43
  resetView: string;
44
+ reformatSelection: string;
40
45
  selectionToolKeyboardShortcuts: string;
41
46
  paste: string;
42
47
  documentProperties: string;
@@ -46,10 +51,16 @@ export interface ToolbarLocalization {
46
51
  useGridOption: string;
47
52
  toggleOverflow: string,
48
53
 
54
+ about: string;
55
+ inputStabilization: string;
56
+
49
57
  errorImageHasZeroSize: string;
50
58
 
59
+ // closeSidebar is used for accessibility in a button label.
60
+ closeSidebar: (toolName: string)=>string;
51
61
  dropdownShown: (toolName: string)=> string;
52
62
  dropdownHidden: (toolName: string)=> string;
63
+
53
64
  zoomLevel: (zoomPercentage: number)=> string;
54
65
  colorChangedAnnouncement: (color: string)=> string;
55
66
  imageSize: (size: number, units: string)=> string;
@@ -64,36 +75,44 @@ export const defaultToolbarLocalization: ToolbarLocalization = {
64
75
  zoom: 'Zoom',
65
76
  image: 'Image',
66
77
  reformatSelection: 'Format selection',
67
- inputAltText: 'Alt text: ',
68
- chooseFile: 'Choose file: ',
78
+ inputAltText: 'Alt text',
79
+ chooseFile: 'Choose file',
80
+ dragAndDropHereOrBrowse: 'Drag and drop here\nor\n{{browse}}',
69
81
  submit: 'Submit',
70
82
  cancel: 'Cancel',
71
83
  resetView: 'Reset view',
72
- thicknessLabel: 'Thickness: ',
73
- colorLabel: 'Color: ',
74
- fontLabel: 'Font: ',
75
- textSize: 'Size: ',
84
+ thicknessLabel: 'Thickness',
85
+ colorLabel: 'Color',
86
+ fontLabel: 'Font',
87
+ textSize: 'Size',
76
88
  resizeImageToSelection: 'Resize image to selection',
77
89
  deleteSelection: 'Delete selection',
78
90
  duplicateSelection: 'Duplicate selection',
91
+
92
+ exit: 'Exit',
93
+ save: 'Save',
79
94
  undo: 'Undo',
80
95
  redo: 'Redo',
81
- selectPenType: 'Pen type: ',
96
+
97
+ selectPenTip: 'Pen tip',
98
+ selectShape: 'Shape',
82
99
  pickColorFromScreen: 'Pick color from screen',
83
100
  clickToPickColorAnnouncement: 'Click on the screen to pick a color',
84
101
  colorSelectionCanceledAnnouncement: 'Color selection canceled',
85
102
  selectionToolKeyboardShortcuts: 'Selection tool: Use arrow keys to move selected items, lowercase/uppercase ‘i’ and ‘o’ to resize.',
86
103
  documentProperties: 'Page',
87
- backgroundColor: 'Background Color: ',
88
- imageWidthOption: 'Width: ',
89
- imageHeightOption: 'Height: ',
90
- useGridOption: 'Grid: ',
104
+ backgroundColor: 'Background color',
105
+ imageWidthOption: 'Width',
106
+ imageHeightOption: 'Height',
107
+ useGridOption: 'Grid',
91
108
  toggleOverflow: 'More',
109
+ about: 'About',
110
+ inputStabilization: 'Input stabilization',
92
111
 
93
112
  touchPanning: 'Touchscreen panning',
94
113
 
95
- roundedTipPen: 'Rounded Tip',
96
- flatTipPen: 'Flat Tip',
114
+ roundedTipPen: 'Round',
115
+ flatTipPen: 'Flat',
97
116
  arrowPen: 'Arrow',
98
117
  linePen: 'Line',
99
118
  outlinedRectanglePen: 'Outlined rectangle',
@@ -103,8 +122,11 @@ export const defaultToolbarLocalization: ToolbarLocalization = {
103
122
 
104
123
  paste: 'Paste',
105
124
 
106
- dropdownShown: (toolName) => `Dropdown for ${toolName} shown`,
107
- dropdownHidden: (toolName) => `Dropdown for ${toolName} hidden`,
125
+
126
+ closeSidebar: (toolName: string) => `Close sidebar for ${toolName}`,
127
+ dropdownShown: (toolName) => `Menu for ${toolName} shown`,
128
+ dropdownHidden: (toolName) => `Menu for ${toolName} hidden`,
129
+
108
130
  zoomLevel: (zoomPercent: number) => `Zoom: ${zoomPercent}%`,
109
131
  colorChangedAnnouncement: (color: string) => `Color changed to ${color}`,
110
132
  imageSize: (size: number, units: string) => `Image size: ${size} ${units}`,
@@ -0,0 +1,11 @@
1
+ @use "./widgets/InsertImageWidget.scss";
2
+ @use "./widgets/OverflowWidget.css";
3
+ @use "./widgets/PenToolWidget.css";
4
+ @use "./widgets/HandToolWidget.scss";
5
+ @use "./widgets/SelectionToolWidget.scss";
6
+ @use "./widgets/DocumentPropertiesWidget.scss";
7
+ @use "./widgets/components/components.scss";
8
+
9
+ @use "./AbstractToolbar.scss";
10
+ @use "./EdgeToolbar.scss";
11
+ @use "./DropdownToolbar.scss";
@@ -1,5 +1,13 @@
1
+ import IconProvider from './IconProvider';
2
+ import type { ToolbarLocalization } from './localization';
1
3
 
2
4
  export interface ActionButtonIcon {
3
5
  icon: Element;
4
6
  label: string;
5
7
  }
8
+
9
+ export interface ToolbarContext {
10
+ announceForAccessibility(text: string): void;
11
+ localization: ToolbarLocalization;
12
+ icons: IconProvider;
13
+ }
@@ -33,7 +33,7 @@ export default class ActionButtonWidget extends BaseWidget {
33
33
  return false;
34
34
  }
35
35
 
36
- public override canBeInOverflowMenu(): boolean {
37
- return !this.mustBeToplevel;
36
+ public override mustBeInToplevelMenu(): boolean {
37
+ return this.mustBeToplevel;
38
38
  }
39
39
  }
@@ -1,8 +1,15 @@
1
1
  import Editor from '../../Editor';
2
2
  import BaseTool from '../../tools/BaseTool';
3
- import { EditorEventType, KeyPressEvent } from '../../types';
3
+ import { EditorEventType } from '../../types';
4
+ import { KeyPressEvent } from '../../inputEvents';
4
5
  import { ToolbarLocalization } from '../localization';
5
6
  import BaseWidget from './BaseWidget';
7
+ import { toolbarCSSPrefix } from '../constants';
8
+
9
+ const isToolWidgetFocused = () => {
10
+ const currentFocus = [...document.querySelectorAll('*:focus')];
11
+ return currentFocus.length && currentFocus.some(elem => elem.classList.contains(`${toolbarCSSPrefix}button`));
12
+ };
6
13
 
7
14
  export default abstract class BaseToolWidget extends BaseWidget {
8
15
  public constructor(
@@ -20,6 +27,14 @@ export default abstract class BaseToolWidget extends BaseWidget {
20
27
 
21
28
  if (toolEvt.tool === targetTool) {
22
29
  this.setSelected(true);
30
+
31
+ // Transfer focus to the current button, only if another toolbar button is
32
+ // focused.
33
+ // This prevents pressing "space" from triggering a different action when
34
+ // the current is selected.
35
+ if (isToolWidgetFocused()) {
36
+ this.focus();
37
+ }
23
38
  }
24
39
  });
25
40
 
@@ -39,6 +54,7 @@ export default abstract class BaseToolWidget extends BaseWidget {
39
54
  if (this.hasDropdown) {
40
55
  if (!this.targetTool.isEnabled()) {
41
56
  this.targetTool.setEnabled(true);
57
+ this.activateDropdown();
42
58
  } else {
43
59
  this.setDropdownVisible(!this.isDropdownVisible());
44
60
  }
@@ -1,22 +1,37 @@
1
1
  import Editor from '../../Editor';
2
- import { DispatcherEventListener } from '../../EventDispatcher';
3
2
  import ToolbarShortcutHandler from '../../tools/ToolbarShortcutHandler';
4
- import { EditorEventType, InputEvtType, KeyPressEvent } from '../../types';
5
- import { toolbarCSSPrefix } from '../HTMLToolbar';
3
+ import { KeyPressEvent, keyPressEventFromHTMLEvent, keyUpEventFromHTMLEvent } from '../../inputEvents';
4
+ import { toolbarCSSPrefix } from '../constants';
6
5
  import { ToolbarLocalization } from '../localization';
6
+ import DropdownLayoutManager from './layout/DropdownLayoutManager';
7
+ import { ToolMenu, WidgetContentLayoutManager } from './layout/types';
7
8
 
8
9
  export type SavedToolbuttonState = Record<string, any>;
9
10
 
11
+ /**
12
+ * A set of labels that allow toolbar themes to treat buttons differently.
13
+ */
14
+ export enum ToolbarWidgetTag {
15
+ Save = 'save',
16
+ Exit = 'exit',
17
+ Undo = 'undo',
18
+ Redo = 'redo',
19
+ }
20
+
10
21
  export default abstract class BaseWidget {
11
22
  protected readonly container: HTMLElement;
12
23
  private button: HTMLElement;
13
24
  private icon: Element|null;
14
- private dropdownContainer: HTMLElement;
25
+ private layoutManager: WidgetContentLayoutManager;
26
+ private dropdown: ToolMenu|null = null;
27
+ private dropdownContent: HTMLElement;
15
28
  private dropdownIcon: Element;
16
29
  private label: HTMLLabelElement;
17
30
  #hasDropdown: boolean;
18
31
  private disabled: boolean = false;
19
32
 
33
+ #tags: (ToolbarWidgetTag|string)[] = [];
34
+
20
35
  // Maps subWidget IDs to subWidgets.
21
36
  private subWidgets: Record<string, BaseWidget> = {};
22
37
 
@@ -26,16 +41,24 @@ export default abstract class BaseWidget {
26
41
  public constructor(
27
42
  protected editor: Editor,
28
43
  protected id: string,
29
- localizationTable?: ToolbarLocalization,
44
+ localizationTable?: ToolbarLocalization
30
45
  ) {
31
46
  this.localizationTable = localizationTable ?? editor.localization;
32
47
 
48
+ // Default layout manager
49
+ const defaultLayoutManager = new DropdownLayoutManager(
50
+ (text) => this.editor.announceForAccessibility(text),
51
+ this.localizationTable
52
+ );
53
+ defaultLayoutManager.connectToEditorNotifier(editor.notifier);
54
+ this.layoutManager = defaultLayoutManager;
55
+
33
56
  this.icon = null;
34
57
  this.container = document.createElement('div');
35
- this.container.classList.add(`${toolbarCSSPrefix}toolContainer`);
36
- this.dropdownContainer = document.createElement('div');
37
- this.dropdownContainer.classList.add(`${toolbarCSSPrefix}dropdown`);
38
- this.dropdownContainer.classList.add('hidden');
58
+ this.container.classList.add(
59
+ `${toolbarCSSPrefix}toolContainer`, `${toolbarCSSPrefix}toolButtonContainer`
60
+ );
61
+ this.dropdownContent = document.createElement('div');
39
62
  this.#hasDropdown = false;
40
63
 
41
64
  this.button = document.createElement('div');
@@ -57,6 +80,43 @@ export default abstract class BaseWidget {
57
80
  return this.id;
58
81
  }
59
82
 
83
+ /**
84
+ * Note: Tags should be set *before* a tool widget is added to a toolbar.
85
+ *
86
+ *
87
+ * Associates tags with this widget that can be used by toolbar themes
88
+ * to customize the layout/appearance of this button. Prefer tags in
89
+ * the `ToolbarWidgetTag` enum, where possible.
90
+ *
91
+ * In addition to being readable from the {@link getTags} method, tags are
92
+ * added to a button's main container as CSS classes with the `toolwidget-tag--` prefix.
93
+ *
94
+ * For example, the `undo` tag would result in `toolwidget-tag--undo`
95
+ * being added to the button's container's class list.
96
+ *
97
+ */
98
+ public setTags(tags: (string|ToolbarWidgetTag)[]) {
99
+ const toClassName = (tag: string) => {
100
+ return `toolwidget-tag--${tag}`;
101
+ };
102
+
103
+ // Remove CSS classes associated with old tags
104
+ for (const tag of this.#tags) {
105
+ this.container.classList.remove(toClassName(tag));
106
+ }
107
+
108
+ this.#tags = [...tags];
109
+
110
+ // Add new CSS classes
111
+ for (const tag of this.#tags) {
112
+ this.container.classList.add(toClassName(tag));
113
+ }
114
+ }
115
+
116
+ public getTags() {
117
+ return [ ...this.#tags ];
118
+ }
119
+
60
120
  /**
61
121
  * Returns the ID of this widget in `container`. Adds a suffix to this' ID
62
122
  * if an item in `container` already has this' ID.
@@ -65,6 +125,8 @@ export default abstract class BaseWidget {
65
125
  * `container = { 'foo': somethingNotThis, 'foo-1': somethingElseNotThis }`, this method
66
126
  * returns `foo-2` because elements with IDs `foo` and `foo-1` are already present in
67
127
  * `container`.
128
+ *
129
+ * If `this` is already in `container`, returns the id given to `this` in the container.
68
130
  */
69
131
  public getUniqueIdIn(container: Record<string, BaseWidget>): string {
70
132
  let id = this.getId();
@@ -97,7 +159,12 @@ export default abstract class BaseWidget {
97
159
  return true;
98
160
  }
99
161
 
162
+ /** @deprecated Renamed to `setUpButtonEventListeners`. */
100
163
  protected setupActionBtnClickListener(button: HTMLElement) {
164
+ return this.setUpButtonEventListeners(button);
165
+ }
166
+
167
+ protected setUpButtonEventListeners(button: HTMLElement) {
101
168
  const clickTriggers = { Enter: true, ' ': true, };
102
169
  button.onkeydown = (evt) => {
103
170
  let handled = false;
@@ -111,12 +178,8 @@ export default abstract class BaseWidget {
111
178
 
112
179
  // If we didn't do anything with the event, send it to the editor.
113
180
  if (!handled) {
114
- handled = this.editor.toolController.dispatchInputEvent({
115
- kind: InputEvtType.KeyPressEvent,
116
- key: evt.key,
117
- ctrlKey: evt.ctrlKey || evt.metaKey,
118
- altKey: evt.altKey,
119
- });
181
+ const editorEvent = keyPressEventFromHTMLEvent(evt);
182
+ handled = this.editor.toolController.dispatchInputEvent(editorEvent);
120
183
  }
121
184
 
122
185
  if (handled) {
@@ -124,20 +187,16 @@ export default abstract class BaseWidget {
124
187
  }
125
188
  };
126
189
 
127
- button.onkeyup = evt => {
128
- if (evt.key in clickTriggers) {
190
+ button.onkeyup = htmlEvent => {
191
+ if (htmlEvent.key in clickTriggers) {
129
192
  return;
130
193
  }
131
194
 
132
- const handled = this.editor.toolController.dispatchInputEvent({
133
- kind: InputEvtType.KeyUpEvent,
134
- key: evt.key,
135
- ctrlKey: evt.ctrlKey || evt.metaKey,
136
- altKey: evt.altKey,
137
- });
195
+ const event = keyUpEventFromHTMLEvent(htmlEvent);
196
+ const handled = this.editor.toolController.dispatchInputEvent(event);
138
197
 
139
198
  if (handled) {
140
- evt.preventDefault();
199
+ htmlEvent.preventDefault();
141
200
  }
142
201
  };
143
202
 
@@ -146,6 +205,11 @@ export default abstract class BaseWidget {
146
205
  this.handleClick();
147
206
  }
148
207
  };
208
+
209
+ // Prevent double-click zoom on some devices.
210
+ button.ondblclick = event => {
211
+ event.preventDefault();
212
+ };
149
213
  }
150
214
 
151
215
  // Add a listener that is triggered when a key is pressed.
@@ -169,7 +233,18 @@ export default abstract class BaseWidget {
169
233
  this.subWidgets[id] = widget;
170
234
  }
171
235
 
172
- private toolbarWidgetToggleListener: DispatcherEventListener|null = null;
236
+ public setLayoutManager(manager: WidgetContentLayoutManager) {
237
+ if (manager === this.layoutManager) {
238
+ return;
239
+ }
240
+
241
+ this.layoutManager = manager;
242
+ if (this.container.parentElement) {
243
+ // Trigger a re-creation of this' content
244
+ this.addTo(this.container.parentElement);
245
+ }
246
+ }
247
+
173
248
 
174
249
  /**
175
250
  * Adds this to `parent`.
@@ -190,7 +265,7 @@ export default abstract class BaseWidget {
190
265
  }
191
266
 
192
267
  // Click functionality
193
- this.setupActionBtnClickListener(this.button);
268
+ this.setUpButtonEventListeners(this.button);
194
269
 
195
270
  // Clear anything already in this.container.
196
271
  this.container.replaceChildren();
@@ -200,29 +275,39 @@ export default abstract class BaseWidget {
200
275
 
201
276
  // Clear the dropdownContainer in case this element is being moved to another
202
277
  // parent.
203
- this.dropdownContainer.replaceChildren();
204
- this.#hasDropdown = this.fillDropdown(this.dropdownContainer);
278
+ this.dropdownContent.replaceChildren();
279
+ this.#hasDropdown = this.fillDropdown(this.dropdownContent);
205
280
  if (this.#hasDropdown) {
281
+ this.button.classList.add('has-dropdown');
282
+
283
+ // We're re-creating the dropdown.
284
+ this.dropdown?.destroy();
285
+
206
286
  this.dropdownIcon = this.createDropdownIcon();
207
287
  this.button.appendChild(this.dropdownIcon);
208
- this.container.appendChild(this.dropdownContainer);
209
288
 
210
- if (this.toolbarWidgetToggleListener) {
211
- this.toolbarWidgetToggleListener.remove();
212
- }
289
+ this.dropdown = this.layoutManager.createToolMenu({
290
+ target: this.button,
291
+ getTitle: () => this.getTitle(),
292
+ isToplevel: () => this.toplevel,
293
+ });
213
294
 
214
- this.toolbarWidgetToggleListener = this.editor.notifier.on(EditorEventType.ToolbarDropdownShown, (evt) => {
215
- if (
216
- evt.kind === EditorEventType.ToolbarDropdownShown
217
- && evt.parentWidget !== this
295
+ this.dropdown.visible.onUpdate(visible => {
296
+ if (visible) {
297
+ this.container.classList.add('dropdownVisible');
298
+ } else {
299
+ this.container.classList.remove('dropdownVisible');
300
+ }
218
301
 
219
- // Don't hide if a submenu wash shown (it might be a submenu of
220
- // the current menu).
221
- && evt.parentWidget.toplevel
222
- ) {
223
- this.setDropdownVisible(false);
302
+ // Auto-focus this component's button when the dropdown hides --
303
+ // this ensures that keyboard focus goes to a reasonable location when
304
+ // the user closes a menu.
305
+ if (!visible) {
306
+ this.focus();
224
307
  }
225
308
  });
309
+
310
+ this.dropdown.appendChild(this.dropdownContent);
226
311
  }
227
312
 
228
313
  this.setDropdownVisible(false);
@@ -235,17 +320,38 @@ export default abstract class BaseWidget {
235
320
  return this.container;
236
321
  }
237
322
 
323
+ public focus() {
324
+ this.button.focus();
325
+ }
326
+
327
+ /**
328
+ * @internal
329
+ */
330
+ public addCSSClassToContainer(className: string) {
331
+ this.container.classList.add(className);
332
+ }
333
+
334
+ public removeCSSClassFromContainer(className: string) {
335
+ this.container.classList.remove(className);
336
+ }
337
+
338
+ public remove() {
339
+ this.container.remove();
340
+ }
238
341
 
239
342
  protected updateIcon() {
240
- const newIcon = this.createIcon();
343
+ let newIcon = this.createIcon();
241
344
 
242
- if (newIcon) {
243
- this.icon?.replaceWith(newIcon);
244
- this.icon = newIcon;
245
- this.icon.classList.add(`${toolbarCSSPrefix}icon`);
345
+ if (!newIcon) {
346
+ newIcon = document.createElement('div');
347
+ this.container.classList.add('no-icon');
246
348
  } else {
247
- this.icon?.remove();
349
+ this.container.classList.remove('no-icon');
248
350
  }
351
+
352
+ this.icon?.replaceWith(newIcon);
353
+ this.icon = newIcon;
354
+ this.icon.classList.add(`${toolbarCSSPrefix}icon`);
249
355
  }
250
356
 
251
357
  public setDisabled(disabled: boolean) {
@@ -281,66 +387,40 @@ export default abstract class BaseWidget {
281
387
  }
282
388
  }
283
389
 
284
- private hideDropdownTimeout: any|null = null;
285
390
 
286
391
  protected setDropdownVisible(visible: boolean) {
287
- const currentlyVisible = this.container.classList.contains('dropdownVisible');
288
- if (currentlyVisible === visible) {
289
- return;
290
- }
291
-
292
- // If waiting to hide the dropdown, cancel it.
293
- if (this.hideDropdownTimeout) {
294
- clearTimeout(this.hideDropdownTimeout);
295
- this.hideDropdownTimeout = null;
296
- this.dropdownContainer.classList.remove('hiding');
297
- this.repositionDropdown();
298
- }
299
-
300
-
301
- const animationDuration = 150; // ms
302
-
303
392
  if (visible) {
304
- this.dropdownContainer.classList.remove('hidden');
305
- this.container.classList.add('dropdownVisible');
306
- this.editor.announceForAccessibility(
307
- this.localizationTable.dropdownShown(this.getTitle())
308
- );
309
-
310
- this.editor.notifier.dispatch(EditorEventType.ToolbarDropdownShown, {
311
- kind: EditorEventType.ToolbarDropdownShown,
312
- parentWidget: this,
313
- });
314
-
315
- this.repositionDropdown();
393
+ this.dropdown?.requestShow();
316
394
  } else {
317
- this.container.classList.remove('dropdownVisible');
318
- this.editor.announceForAccessibility(
319
- this.localizationTable.dropdownHidden(this.getTitle())
320
- );
321
-
322
- this.dropdownContainer.classList.add('hiding');
323
-
324
- // Hide the dropdown *slightly* before the animation finishes. This
325
- // prevents flickering in some browsers.
326
- const hideDelay = animationDuration * 0.95;
327
-
328
- this.hideDropdownTimeout = setTimeout(() => {
329
- this.dropdownContainer.classList.add('hidden');
330
- this.dropdownContainer.classList.remove('hiding');
331
- this.repositionDropdown();
332
- }, hideDelay);
395
+ this.dropdown?.requestHide();
333
396
  }
397
+ }
398
+
399
+ /**
400
+ * Only used by some layout managers.
401
+ * In those layout managers, makes this dropdown visible.
402
+ */
403
+ protected activateDropdown() {
404
+ this.dropdown?.onActivated();
405
+ }
334
406
 
335
- // Animate
336
- const animationName = `var(--dropdown-${
337
- visible ? 'show' : 'hide'
338
- }-animation)`;
339
- this.dropdownContainer.style.animation = `${animationDuration}ms ease ${animationName}`;
407
+ /**
408
+ * Returns `true` if this widget must always be in a toplevel menu and not
409
+ * in a scrolling/overflow menu.
410
+ *
411
+ * This method can be overidden to override the default of `true`.
412
+ */
413
+ public mustBeInToplevelMenu(): boolean {
414
+ return false;
340
415
  }
341
416
 
417
+ /**
418
+ * Returns true iff this widget can be in a nontoplevel menu.
419
+ *
420
+ * @deprecated Use `!mustBeInToplevelMenu()` instead.
421
+ */
342
422
  public canBeInOverflowMenu(): boolean {
343
- return true;
423
+ return !this.mustBeInToplevelMenu();
344
424
  }
345
425
 
346
426
  public getButtonWidth(): number {
@@ -355,26 +435,13 @@ export default abstract class BaseWidget {
355
435
  this.container.style.display = hidden ? 'none' : '';
356
436
  }
357
437
 
358
- protected repositionDropdown() {
359
- const dropdownBBox = this.dropdownContainer.getBoundingClientRect();
360
- const screenWidth = document.body.clientWidth;
361
-
362
- if (dropdownBBox.left > screenWidth / 2) {
363
- // Use .translate so as not to conflict with CSS animating the
364
- // transform property.
365
- this.dropdownContainer.style.translate = `calc(${this.button.clientWidth + 'px'} - 100%) 0`;
366
- } else {
367
- this.dropdownContainer.style.translate = '';
368
- }
369
- }
370
-
371
438
  /** Set whether the widget is contained within another. @internal */
372
439
  public setIsToplevel(toplevel: boolean) {
373
440
  this.toplevel = toplevel;
374
441
  }
375
442
 
376
443
  protected isDropdownVisible(): boolean {
377
- return !this.dropdownContainer.classList.contains('hidden');
444
+ return this.dropdown?.visible?.get() ?? false;
378
445
  }
379
446
 
380
447
  protected isSelected(): boolean {
@@ -0,0 +1,7 @@
1
+
2
+ .toolbar-document-properties-widget {
3
+ button.about-button {
4
+ width: 100%;
5
+ text-align: end;
6
+ }
7
+ }