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
@@ -0,0 +1,168 @@
1
+ import { defaultToolbarLocalization } from './localization.mjs';
2
+ import OverflowWidget from './widgets/OverflowWidget.mjs';
3
+ import AbstractToolbar from './AbstractToolbar.mjs';
4
+ import { toolbarCSSPrefix } from './constants.mjs';
5
+ export const makeDropdownToolbar = (editor) => {
6
+ return new DropdownToolbar(editor, editor.getRootElement());
7
+ };
8
+ export default class DropdownToolbar extends AbstractToolbar {
9
+ /** @internal */
10
+ constructor(editor, parent, localizationTable = defaultToolbarLocalization) {
11
+ super(editor, localizationTable);
12
+ // Flex-order of the next widget to be added.
13
+ this.widgetOrderCounter = 0;
14
+ // Widget to toggle overflow menu.
15
+ this.overflowWidget = null;
16
+ this.reLayoutQueued = false;
17
+ this.container = document.createElement('div');
18
+ this.container.classList.add(`${toolbarCSSPrefix}root`);
19
+ this.container.classList.add(`${toolbarCSSPrefix}element`);
20
+ this.container.classList.add(`${toolbarCSSPrefix}dropdown-toolbar`);
21
+ this.container.setAttribute('role', 'toolbar');
22
+ parent.appendChild(this.container);
23
+ if ('ResizeObserver' in window) {
24
+ this.resizeObserver = new ResizeObserver((_entries) => {
25
+ this.reLayout();
26
+ });
27
+ this.resizeObserver.observe(this.container);
28
+ }
29
+ else {
30
+ console.warn('ResizeObserver not supported. Toolbar will not resize.');
31
+ }
32
+ }
33
+ queueReLayout() {
34
+ if (!this.reLayoutQueued) {
35
+ this.reLayoutQueued = true;
36
+ requestAnimationFrame(() => this.reLayout());
37
+ }
38
+ }
39
+ reLayout() {
40
+ this.reLayoutQueued = false;
41
+ if (!this.overflowWidget) {
42
+ return;
43
+ }
44
+ const getTotalWidth = (widgetList) => {
45
+ let totalWidth = 0;
46
+ for (const widget of widgetList) {
47
+ if (!widget.isHidden()) {
48
+ totalWidth += widget.getButtonWidth();
49
+ }
50
+ }
51
+ return totalWidth;
52
+ };
53
+ // Returns true if there is enough empty space to move the first child
54
+ // from the overflow menu to the main menu.
55
+ const canRemoveFirstChildFromOverflow = (freeSpaceInMainMenu) => {
56
+ const overflowChildren = this.overflowWidget?.getChildWidgets() ?? [];
57
+ if (overflowChildren.length === 0) {
58
+ return false;
59
+ }
60
+ return overflowChildren[0].getButtonWidth() <= freeSpaceInMainMenu;
61
+ };
62
+ const allWidgets = this.getAllWidgets();
63
+ let overflowWidgetsWidth = getTotalWidth(this.overflowWidget.getChildWidgets());
64
+ let shownWidgetWidth = getTotalWidth(allWidgets) - overflowWidgetsWidth;
65
+ let availableWidth = this.container.clientWidth * 0.87;
66
+ // If on a device that has enough vertical space, allow
67
+ // showing two rows of buttons.
68
+ // TODO: Fix magic numbers
69
+ if (window.innerHeight > availableWidth * 1.75) {
70
+ availableWidth *= 1.75;
71
+ }
72
+ let updatedChildren = false;
73
+ // If we can remove at least one child from the overflow menu,
74
+ if (canRemoveFirstChildFromOverflow(availableWidth - shownWidgetWidth)) {
75
+ // Move widgets to the main menu.
76
+ const overflowChildren = this.overflowWidget.clearChildren();
77
+ for (const child of overflowChildren) {
78
+ child.addTo(this.container);
79
+ child.setIsToplevel(true);
80
+ if (!child.isHidden()) {
81
+ shownWidgetWidth += child.getButtonWidth();
82
+ }
83
+ }
84
+ overflowWidgetsWidth = 0;
85
+ updatedChildren = true;
86
+ }
87
+ if (shownWidgetWidth >= availableWidth) {
88
+ // Move widgets to the overflow menu.
89
+ // Start with the rightmost widget, move to the leftmost
90
+ for (let i = allWidgets.length - 1; i >= 0 && shownWidgetWidth >= availableWidth; i--) {
91
+ const child = allWidgets[i];
92
+ if (this.overflowWidget.hasAsChild(child)) {
93
+ continue;
94
+ }
95
+ if (child.canBeInOverflowMenu()) {
96
+ shownWidgetWidth -= child.getButtonWidth();
97
+ this.overflowWidget.addToOverflow(child);
98
+ }
99
+ }
100
+ updatedChildren = true;
101
+ }
102
+ // Hide/show the overflow widget.
103
+ this.overflowWidget.setHidden(this.overflowWidget.getChildWidgets().length === 0);
104
+ if (updatedChildren) {
105
+ this.setupColorPickers();
106
+ }
107
+ }
108
+ addWidgetInternal(widget) {
109
+ const container = widget.addTo(this.container);
110
+ // Ensure that the widget gets displayed in the correct
111
+ // place in the toolbar, even if it's removed and re-added.
112
+ container.style.order = `${this.widgetOrderCounter++}`;
113
+ this.queueReLayout();
114
+ }
115
+ removeWidgetInternal(widget) {
116
+ widget.remove();
117
+ this.queueReLayout();
118
+ }
119
+ addSpacer(options = {}) {
120
+ const spacer = document.createElement('div');
121
+ spacer.classList.add(`${toolbarCSSPrefix}spacer`);
122
+ if (options.grow) {
123
+ spacer.style.flexGrow = `${options.grow}`;
124
+ }
125
+ if (options.minSize) {
126
+ spacer.style.minWidth = options.minSize;
127
+ }
128
+ if (options.maxSize) {
129
+ spacer.style.maxWidth = options.maxSize;
130
+ }
131
+ spacer.style.order = `${this.widgetOrderCounter++}`;
132
+ this.container.appendChild(spacer);
133
+ }
134
+ /**
135
+ * Adds a widget that toggles the overflow menu. Call `addOverflowWidget` to ensure
136
+ * that this widget is in the correct space (if shown).
137
+ *
138
+ * @example
139
+ * ```ts
140
+ * toolbar.addDefaultToolWidgets();
141
+ * toolbar.addOverflowWidget();
142
+ * toolbar.addDefaultActionButtons();
143
+ * ```
144
+ * shows the overflow widget between the default tool widgets and the default action buttons,
145
+ * if shown.
146
+ */
147
+ addOverflowWidget() {
148
+ this.overflowWidget = new OverflowWidget(this.editor, this.localizationTable);
149
+ this.addWidget(this.overflowWidget);
150
+ }
151
+ /**
152
+ * Adds both the default tool widgets and action buttons. Equivalent to
153
+ * ```ts
154
+ * toolbar.addDefaultToolWidgets();
155
+ * toolbar.addOverflowWidget();
156
+ * toolbar.addDefaultActionButtons();
157
+ * ```
158
+ */
159
+ addDefaults() {
160
+ this.addDefaultToolWidgets();
161
+ this.addOverflowWidget();
162
+ this.addDefaultActionButtons();
163
+ }
164
+ onRemove() {
165
+ this.container.remove();
166
+ this.resizeObserver.disconnect();
167
+ }
168
+ }
@@ -0,0 +1,47 @@
1
+ import Editor from '../Editor';
2
+ import { ToolbarLocalization } from './localization';
3
+ import BaseWidget from './widgets/BaseWidget';
4
+ import AbstractToolbar, { SpacerOptions } from './AbstractToolbar';
5
+ export declare const makeEdgeToolbar: (editor: Editor) => AbstractToolbar;
6
+ export default class EdgeToolbar extends AbstractToolbar {
7
+ private toolbarContainer;
8
+ private toolbarActionRow;
9
+ private toolbarToolRow;
10
+ private toolRowResizeObserver;
11
+ private menuContainer;
12
+ private sidebarContainer;
13
+ private sidebarContent;
14
+ private closeButton;
15
+ private layoutManager;
16
+ private sidebarVisible;
17
+ private sidebarY;
18
+ private sidebarTitle;
19
+ /** @internal */
20
+ constructor(editor: Editor, parent: HTMLElement, localizationTable: ToolbarLocalization);
21
+ private listenForVisibilityChanges;
22
+ private onToolbarRowResize;
23
+ addSpacer(_options?: Partial<SpacerOptions> | undefined): void;
24
+ addUndoRedoButtons(): void;
25
+ addDefaults(): void;
26
+ private updateWidgetCSSClasses;
27
+ protected addWidgetInternal(widget: BaseWidget): void;
28
+ protected removeWidgetInternal(widget: BaseWidget): void;
29
+ protected onRemove(): void;
30
+ private initDragListeners;
31
+ /**
32
+ * Updates the position of this menu **during** a drag. After a drag ends,
33
+ * {@link finalizeDrag} should be called.
34
+ */
35
+ private handleDrag;
36
+ /** Returns `this.sidebarY` rounded to a valid value. */
37
+ private snappedSidebarY;
38
+ /**
39
+ * Moves the menu to a valid location or closes it, depending on
40
+ * the position set by the drag.
41
+ */
42
+ private finalizeDrag;
43
+ protected serializeInternal(): {
44
+ menuSizeY: number;
45
+ };
46
+ protected deserializeInternal(json: any): void;
47
+ }
@@ -0,0 +1,414 @@
1
+ import { ToolbarWidgetTag } from './widgets/BaseWidget.mjs';
2
+ import { toolbarCSSPrefix } from './constants.mjs';
3
+ import EdgeToolbarLayoutManager from './widgets/layout/EdgeToolbarLayoutManager.mjs';
4
+ import { MutableReactiveValue, ReactiveValue } from '../util/ReactiveValue.mjs';
5
+ import AbstractToolbar from './AbstractToolbar.mjs';
6
+ import stopPropagationOfScrollingWheelEvents from '../util/stopPropagationOfScrollingWheelEvents.mjs';
7
+ export const makeEdgeToolbar = (editor) => {
8
+ return new EdgeToolbar(editor, editor.getRootElement(), editor.localization);
9
+ };
10
+ export default class EdgeToolbar extends AbstractToolbar {
11
+ /** @internal */
12
+ constructor(editor, parent, localizationTable) {
13
+ super(editor, localizationTable);
14
+ this.toolbarContainer = document.createElement('div');
15
+ this.toolbarContainer.classList.add(`${toolbarCSSPrefix}root`);
16
+ this.toolbarContainer.classList.add(`${toolbarCSSPrefix}element`);
17
+ this.toolbarContainer.classList.add(`${toolbarCSSPrefix}edge-toolbar`);
18
+ this.toolbarContainer.setAttribute('role', 'toolbar');
19
+ this.toolbarActionRow = document.createElement('div');
20
+ this.toolbarActionRow.classList.add('toolbar-element', 'toolbar-action-row');
21
+ this.toolbarToolRow = document.createElement('div');
22
+ this.toolbarToolRow.classList.add('toolbar-element', 'toolbar-tool-row');
23
+ stopPropagationOfScrollingWheelEvents(this.toolbarToolRow);
24
+ if ('ResizeObserver' in window) {
25
+ this.toolRowResizeObserver = new ResizeObserver((_entries) => {
26
+ this.onToolbarRowResize();
27
+ });
28
+ this.toolRowResizeObserver.observe(this.toolbarToolRow);
29
+ }
30
+ else {
31
+ console.warn('ResizeObserver not supported. Toolbar will not resize.');
32
+ }
33
+ this.toolbarContainer.replaceChildren(this.toolbarActionRow, this.toolbarToolRow);
34
+ parent.appendChild(this.toolbarContainer);
35
+ this.sidebarVisible = ReactiveValue.fromInitialValue(false);
36
+ this.sidebarY = ReactiveValue.fromInitialValue(0);
37
+ // Create the container elements
38
+ this.menuContainer = document.createElement('div');
39
+ this.menuContainer.classList.add(`${toolbarCSSPrefix}edgemenu-container`);
40
+ this.sidebarContainer = document.createElement('div');
41
+ this.sidebarContainer.classList.add(`${toolbarCSSPrefix}edgemenu`, `${toolbarCSSPrefix}element`);
42
+ this.sidebarContainer.classList.add(`${toolbarCSSPrefix}tool-properties`);
43
+ this.sidebarContent = document.createElement('div');
44
+ // Setup resizing/dragging
45
+ this.sidebarY.onUpdateAndNow(y => {
46
+ const belowEdgeClassName = 'dropdown-below-edge';
47
+ if (y > 0) {
48
+ this.sidebarContainer.style.translate = `0 ${y}px`;
49
+ this.sidebarContainer.style.paddingBottom = '';
50
+ this.menuContainer.classList.add(belowEdgeClassName);
51
+ }
52
+ else {
53
+ this.sidebarContainer.style.translate = '';
54
+ this.sidebarContainer.style.paddingBottom = `${-y}px`;
55
+ this.menuContainer.classList.remove(belowEdgeClassName);
56
+ }
57
+ });
58
+ this.closeButton = document.createElement('button');
59
+ this.closeButton.classList.add('drag-elem');
60
+ // The close button has default focus -- forward its events to the main editor so that keyboard
61
+ // shortcuts still work.
62
+ this.editor.handleKeyEventsFrom(this.closeButton, event => {
63
+ // Don't send
64
+ return event.code !== 'Space' && event.code !== 'Enter' && event.code !== 'Tab';
65
+ });
66
+ // Close the sidebar when pressing escape
67
+ this.sidebarContainer.addEventListener('keyup', event => {
68
+ if (!event.defaultPrevented && event.code === 'Escape') {
69
+ this.sidebarVisible.set(false);
70
+ event.preventDefault();
71
+ }
72
+ });
73
+ this.initDragListeners();
74
+ // Initialize the layout manager
75
+ const setSidebarContent = (...content) => {
76
+ this.sidebarContent.replaceChildren(...content);
77
+ this.setupColorPickers();
78
+ };
79
+ this.sidebarTitle = MutableReactiveValue.fromInitialValue('');
80
+ this.layoutManager = new EdgeToolbarLayoutManager(setSidebarContent, this.sidebarTitle, this.sidebarVisible, editor.announceForAccessibility.bind(editor), localizationTable);
81
+ this.sidebarTitle.onUpdateAndNow(title => {
82
+ this.closeButton.setAttribute('aria-label', localizationTable.closeSidebar(title));
83
+ });
84
+ // Make things visible/keep hidden.
85
+ this.listenForVisibilityChanges();
86
+ this.sidebarContainer.replaceChildren(this.closeButton, this.sidebarContent);
87
+ this.menuContainer.replaceChildren(this.sidebarContainer);
88
+ parent.appendChild(this.menuContainer);
89
+ }
90
+ listenForVisibilityChanges() {
91
+ let animationTimeout = null;
92
+ const animationDuration = 170;
93
+ if (!this.sidebarVisible.get()) {
94
+ this.menuContainer.style.display = 'none';
95
+ // Set the initial opacity to 0 to allow the `transition` property
96
+ // to animate it to 1.
97
+ this.menuContainer.style.opacity = '0';
98
+ }
99
+ this.sidebarVisible.onUpdate(visible => {
100
+ const animationProperties = `${animationDuration}ms ease`;
101
+ if (visible) {
102
+ this.sidebarY.set(this.snappedSidebarY());
103
+ if (animationTimeout) {
104
+ clearTimeout(animationTimeout);
105
+ animationTimeout = null;
106
+ }
107
+ this.menuContainer.style.display = '';
108
+ this.sidebarContainer.style.animation = `${animationProperties} ${toolbarCSSPrefix}-edgemenu-transition-in`;
109
+ this.menuContainer.style.animation = `${animationProperties} ${toolbarCSSPrefix}-edgemenu-container-transition-in`;
110
+ this.menuContainer.style.opacity = '1';
111
+ // Focus the close button when first shown.
112
+ this.closeButton.focus();
113
+ }
114
+ else {
115
+ this.closeColorPickers();
116
+ if (animationTimeout === null) {
117
+ this.sidebarContainer.style.animation = ` ${animationProperties} ${toolbarCSSPrefix}-edgemenu-transition-out`;
118
+ this.menuContainer.style.animation = `${animationProperties} ${toolbarCSSPrefix}-edgemenu-container-transition-out`;
119
+ // Manually set the container's opacity to prevent flickering when closing
120
+ // the toolbar.
121
+ this.menuContainer.style.opacity = '0';
122
+ // Hide overflow -- don't show the part of the edge toolbar that's outside of
123
+ // the editor.
124
+ //this.menuContainer.style.overflowY = 'hidden';
125
+ this.editor.announceForAccessibility(this.localizationTable.dropdownHidden(this.sidebarTitle.get()));
126
+ animationTimeout = setTimeout(() => {
127
+ this.menuContainer.style.display = 'none';
128
+ this.menuContainer.style.overflowY = '';
129
+ animationTimeout = null;
130
+ }, animationDuration);
131
+ }
132
+ }
133
+ });
134
+ }
135
+ onToolbarRowResize() {
136
+ const setExtraPadding = () => {
137
+ const visibleWidth = this.toolbarToolRow.clientWidth;
138
+ // Determine whether extra spacing needs to be added so that one button is cut
139
+ // in half. Ideally, when there is scroll, one button will be cut in half to show
140
+ // that scrolling is possible.
141
+ let currentWidth = 0;
142
+ let extraPadding = 0;
143
+ let numVisibleButtons = 0;
144
+ for (const child of this.toolbarToolRow.children) {
145
+ // Use the first child -- padding is applied around that child. Assumes
146
+ // that the button's width is its height plus some padding.
147
+ const buttonBaseSize = child.clientHeight;
148
+ currentWidth += buttonBaseSize;
149
+ numVisibleButtons++;
150
+ if (currentWidth > visibleWidth) {
151
+ // We want extraPadding + (currentWidth - buttonWidth / 2) = visibleWidth.
152
+ // Thus, extraPadding = visibleWidth - currentWidth + buttonWidth / 2;
153
+ extraPadding = visibleWidth - currentWidth + buttonBaseSize / 2;
154
+ // Ensure that the padding is positive
155
+ if (extraPadding < 0) {
156
+ extraPadding += buttonBaseSize;
157
+ }
158
+ break;
159
+ }
160
+ }
161
+ const perButtonPadding = Math.round(extraPadding / numVisibleButtons * 10) / 10;
162
+ this.toolbarToolRow.style.setProperty('--extra-left-right-padding', `${perButtonPadding}px`);
163
+ };
164
+ const actionRowBBox = this.toolbarActionRow.getBoundingClientRect();
165
+ const toolbarRowBBox = this.toolbarToolRow.getBoundingClientRect();
166
+ const inSameRow = actionRowBBox.y === toolbarRowBBox.y;
167
+ const onDifferentRows = actionRowBBox.y + actionRowBBox.height <= toolbarRowBBox.y;
168
+ if (onDifferentRows) {
169
+ this.toolbarContainer.classList.remove('one-row');
170
+ }
171
+ else {
172
+ this.toolbarContainer.classList.add('one-row');
173
+ }
174
+ if (this.toolbarToolRow.clientWidth < this.toolbarToolRow.scrollWidth) {
175
+ this.toolbarToolRow.classList.add('has-scroll');
176
+ // If both button areas are in the same row, don't change the padding --
177
+ // it could lead to an endless loop of reseize events.
178
+ if (!inSameRow) {
179
+ setExtraPadding();
180
+ }
181
+ }
182
+ else {
183
+ this.toolbarToolRow.classList.remove('has-scroll', 'extra-padding');
184
+ }
185
+ }
186
+ addSpacer(_options) {
187
+ //throw new Error('Method not implemented.');
188
+ // Unused for this toolbar.
189
+ }
190
+ addUndoRedoButtons() {
191
+ super.addUndoRedoButtons(false);
192
+ }
193
+ addDefaults() {
194
+ this.addDefaultActionButtons();
195
+ this.addDefaultToolWidgets();
196
+ }
197
+ updateWidgetCSSClasses(widget) {
198
+ const tags = widget.getTags();
199
+ widget.removeCSSClassFromContainer('label-inline');
200
+ widget.removeCSSClassFromContainer('label-left');
201
+ widget.removeCSSClassFromContainer('label-right');
202
+ if (tags.includes(ToolbarWidgetTag.Save)) {
203
+ widget.addCSSClassToContainer('label-inline');
204
+ widget.addCSSClassToContainer('label-right');
205
+ }
206
+ if (tags.includes(ToolbarWidgetTag.Exit)) {
207
+ widget.addCSSClassToContainer('label-inline');
208
+ widget.addCSSClassToContainer('label-left');
209
+ }
210
+ }
211
+ addWidgetInternal(widget) {
212
+ this.updateWidgetCSSClasses(widget);
213
+ widget.setLayoutManager(this.layoutManager);
214
+ if (widget.mustBeInToplevelMenu()) {
215
+ widget.addTo(this.toolbarActionRow);
216
+ }
217
+ else {
218
+ widget.addTo(this.toolbarToolRow);
219
+ }
220
+ }
221
+ removeWidgetInternal(widget) {
222
+ widget.remove();
223
+ }
224
+ onRemove() {
225
+ this.toolbarContainer.remove();
226
+ this.menuContainer.remove();
227
+ this.toolRowResizeObserver.disconnect();
228
+ }
229
+ initDragListeners() {
230
+ let lastX = 0;
231
+ let lastY = 0;
232
+ let startX = 0;
233
+ let startY = 0;
234
+ let pointerDown = false;
235
+ let capturedPointerId = null;
236
+ const dragElements = [this.closeButton, this.sidebarContainer, this.sidebarContent];
237
+ this.manageListener(this.editor.handlePointerEventsExceptClicksFrom(this.menuContainer, (eventName, event) => {
238
+ if (event.target === this.menuContainer) {
239
+ if (eventName === 'pointerdown') {
240
+ this.sidebarVisible.set(false);
241
+ }
242
+ if (eventName === 'pointerup') {
243
+ this.editor.focus();
244
+ }
245
+ return true;
246
+ }
247
+ if (!this.sidebarVisible.get()) {
248
+ return true;
249
+ }
250
+ // Don't send pointer events that don't directly target mainContainer
251
+ // to the editor
252
+ return false;
253
+ }, (_eventName, event) => {
254
+ return event.target === this.menuContainer;
255
+ }));
256
+ const isDraggableElement = (element) => {
257
+ if (!element) {
258
+ return false;
259
+ }
260
+ if (dragElements.includes(element)) {
261
+ return true;
262
+ }
263
+ // Some inputs handle dragging themselves. Don't also interpret such gestures
264
+ // as dragging the dropdown.
265
+ const undraggableElementTypes = ['INPUT', 'SELECT', 'IMG'];
266
+ let hasSuitableAncestors = false;
267
+ let ancestor = element.parentElement;
268
+ while (ancestor) {
269
+ if (undraggableElementTypes.includes(ancestor.tagName)) {
270
+ break;
271
+ }
272
+ if (ancestor === this.sidebarContainer) {
273
+ hasSuitableAncestors = true;
274
+ break;
275
+ }
276
+ ancestor = ancestor.parentElement;
277
+ }
278
+ return !undraggableElementTypes.includes(element.tagName) && hasSuitableAncestors;
279
+ };
280
+ const clickThreshold = 5;
281
+ // Returns whether the current (or if no current, **the last**) gesture is roughly a click.
282
+ // Because this can be called **after** a gesture has just ended, it should not require
283
+ // the gesture to be in progress.
284
+ const isRoughlyClick = () => {
285
+ return Math.hypot(lastX - startX, lastY - startY) < clickThreshold;
286
+ };
287
+ let startedDragging = false;
288
+ this.sidebarContainer.addEventListener('pointerdown', event => {
289
+ if (event.defaultPrevented || !isDraggableElement(event.target)) {
290
+ return;
291
+ }
292
+ if (event.isPrimary) {
293
+ startedDragging = false;
294
+ lastX = event.clientX;
295
+ lastY = event.clientY;
296
+ startX = event.clientX;
297
+ startY = event.clientY;
298
+ capturedPointerId = null;
299
+ pointerDown = true;
300
+ }
301
+ }, { passive: true });
302
+ let gestureEndTimestamp = 0;
303
+ const onGestureEnd = (_event) => {
304
+ // If the pointerup/pointercancel event was for a pointer not being tracked,
305
+ if (!pointerDown) {
306
+ return;
307
+ }
308
+ gestureEndTimestamp = performance.now();
309
+ if (capturedPointerId !== null) {
310
+ this.sidebarContainer.releasePointerCapture(capturedPointerId);
311
+ capturedPointerId = null;
312
+ }
313
+ this.finalizeDrag();
314
+ pointerDown = false;
315
+ startedDragging = false;
316
+ };
317
+ this.sidebarContainer.onpointermove = event => {
318
+ if (!event.isPrimary || !pointerDown) {
319
+ return undefined;
320
+ }
321
+ // Mouse event and no buttons pressed? Cancel the event.
322
+ // This can happen if the event was canceled by a focus change (e.g. by opening a
323
+ // right-click menu).
324
+ if (event.pointerType === 'mouse' && event.buttons === 0) {
325
+ onGestureEnd(event);
326
+ return undefined;
327
+ }
328
+ // Only capture after motion -- capturing early prevents click events in Chrome.
329
+ if (capturedPointerId === null && !isRoughlyClick()) {
330
+ this.sidebarContainer.setPointerCapture(event.pointerId);
331
+ capturedPointerId = event.pointerId;
332
+ }
333
+ const x = event.clientX;
334
+ const y = event.clientY;
335
+ const dx = x - lastX;
336
+ const dy = y - lastY;
337
+ if (Math.abs(y - startY) > clickThreshold || startedDragging) {
338
+ this.handleDrag(dx, dy);
339
+ lastX = x;
340
+ lastY = y;
341
+ startedDragging = true;
342
+ }
343
+ };
344
+ this.sidebarContainer.onpointerleave = event => {
345
+ {
346
+ // Capture the pointer if it exits the container while dragging.
347
+ if (capturedPointerId === null && pointerDown && event.isPrimary) {
348
+ this.sidebarContainer.setPointerCapture(event.pointerId);
349
+ capturedPointerId = event.pointerId;
350
+ }
351
+ }
352
+ };
353
+ this.closeButton.onclick = () => {
354
+ const wasJustDragging = performance.now() - gestureEndTimestamp < 100;
355
+ const roughlyClick = isRoughlyClick();
356
+ // Ignore the click event if it was caused by dragging the button.
357
+ if (wasJustDragging && roughlyClick || !wasJustDragging) {
358
+ this.sidebarVisible.set(false);
359
+ }
360
+ };
361
+ this.sidebarContainer.onpointerup = onGestureEnd;
362
+ this.sidebarContainer.onpointercancel = onGestureEnd;
363
+ }
364
+ /**
365
+ * Updates the position of this menu **during** a drag. After a drag ends,
366
+ * {@link finalizeDrag} should be called.
367
+ */
368
+ handleDrag(_deltaX, deltaY) {
369
+ this.sidebarContainer.style.transition = 'none';
370
+ this.sidebarY.set(this.sidebarY.get() + deltaY);
371
+ }
372
+ /** Returns `this.sidebarY` rounded to a valid value. */
373
+ snappedSidebarY(sidebarY) {
374
+ const y = sidebarY ?? this.sidebarY.get();
375
+ const snapYs = [-100, 0];
376
+ // Allow some amount of scrolling if the sidebar is too tall to fit entirely
377
+ // in the window.
378
+ if (this.sidebarContainer.clientHeight > window.innerHeight) {
379
+ snapYs.push(100);
380
+ }
381
+ let closestSnap = snapYs[0];
382
+ for (const snapY of snapYs) {
383
+ if (Math.abs(snapY - y) < Math.abs(closestSnap - y)) {
384
+ closestSnap = snapY;
385
+ }
386
+ }
387
+ return closestSnap;
388
+ }
389
+ /**
390
+ * Moves the menu to a valid location or closes it, depending on
391
+ * the position set by the drag.
392
+ */
393
+ finalizeDrag() {
394
+ this.sidebarContainer.style.transition = '';
395
+ if (this.sidebarY.get() > this.sidebarContainer.clientHeight / 2) {
396
+ this.sidebarVisible.set(false);
397
+ }
398
+ else {
399
+ // Snap to the closest valid Y.
400
+ this.sidebarY.set(this.snappedSidebarY());
401
+ }
402
+ }
403
+ serializeInternal() {
404
+ return {
405
+ menuSizeY: this.snappedSidebarY(),
406
+ };
407
+ }
408
+ deserializeInternal(json) {
409
+ if (typeof json === 'object' && typeof json['menuSizeY'] === 'number') {
410
+ // Load the y-position of the sidebar -- call snappedSidebarY to ensure validity.
411
+ this.sidebarY.set(this.snappedSidebarY(json['menuSizeY']));
412
+ }
413
+ }
414
+ }