js-draw 0.25.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (810) hide show
  1. package/README.md +60 -20
  2. package/build-config.json +22 -21
  3. package/dist/Editor.css +1281 -0
  4. package/dist/bundle.js +3 -3
  5. package/dist/bundledStyles.js +1 -1
  6. package/dist/cjs/Editor.d.ts +91 -12
  7. package/dist/cjs/Editor.js +619 -590
  8. package/dist/cjs/EditorImage.d.ts +5 -2
  9. package/dist/cjs/EditorImage.js +258 -297
  10. package/dist/cjs/EventDispatcher.js +17 -19
  11. package/dist/cjs/Pointer.d.ts +3 -1
  12. package/dist/cjs/Pointer.js +44 -45
  13. package/dist/cjs/SVGLoader.d.ts +7 -1
  14. package/dist/cjs/SVGLoader.js +373 -474
  15. package/dist/cjs/UndoRedoHistory.js +28 -40
  16. package/dist/cjs/Viewport.d.ts +1 -4
  17. package/dist/cjs/Viewport.js +150 -193
  18. package/dist/cjs/bundle/bundled.js +4 -1
  19. package/dist/cjs/commands/Command.js +22 -49
  20. package/dist/cjs/commands/Duplicate.js +28 -44
  21. package/dist/cjs/commands/Erase.js +36 -54
  22. package/dist/cjs/commands/SerializableCommand.js +20 -35
  23. package/dist/cjs/commands/UnresolvedCommand.js +14 -29
  24. package/dist/cjs/commands/invertCommand.js +29 -51
  25. package/dist/cjs/commands/lib.js +9 -6
  26. package/dist/cjs/commands/localization.d.ts +1 -1
  27. package/dist/cjs/commands/localization.js +9 -9
  28. package/dist/cjs/commands/uniteCommands.js +57 -87
  29. package/dist/cjs/components/AbstractComponent.d.ts +11 -3
  30. package/dist/cjs/components/AbstractComponent.js +141 -169
  31. package/dist/cjs/components/BackgroundComponent.d.ts +3 -6
  32. package/dist/cjs/components/BackgroundComponent.js +124 -149
  33. package/dist/cjs/components/ImageComponent.d.ts +3 -5
  34. package/dist/cjs/components/ImageComponent.js +95 -175
  35. package/dist/cjs/components/RestylableComponent.d.ts +1 -1
  36. package/dist/cjs/components/RestylableComponent.js +41 -56
  37. package/dist/cjs/components/SVGGlobalAttributesObject.d.ts +1 -3
  38. package/dist/cjs/components/SVGGlobalAttributesObject.js +34 -51
  39. package/dist/cjs/components/Stroke.d.ts +4 -6
  40. package/dist/cjs/components/Stroke.js +95 -121
  41. package/dist/cjs/components/TextComponent.d.ts +2 -4
  42. package/dist/cjs/components/TextComponent.js +189 -234
  43. package/dist/cjs/components/UnknownSVGObject.d.ts +1 -3
  44. package/dist/cjs/components/UnknownSVGObject.js +30 -43
  45. package/dist/cjs/components/builders/ArrowBuilder.d.ts +1 -1
  46. package/dist/cjs/components/builders/ArrowBuilder.js +43 -42
  47. package/dist/cjs/components/builders/CircleBuilder.js +43 -43
  48. package/dist/cjs/components/builders/FreehandLineBuilder.d.ts +3 -2
  49. package/dist/cjs/components/builders/FreehandLineBuilder.js +73 -86
  50. package/dist/cjs/components/builders/LineBuilder.d.ts +1 -1
  51. package/dist/cjs/components/builders/LineBuilder.js +38 -36
  52. package/dist/cjs/components/builders/PressureSensitiveFreehandLineBuilder.d.ts +1 -1
  53. package/dist/cjs/components/builders/PressureSensitiveFreehandLineBuilder.js +131 -139
  54. package/dist/cjs/components/builders/RectangleBuilder.d.ts +1 -1
  55. package/dist/cjs/components/builders/RectangleBuilder.js +31 -31
  56. package/dist/cjs/components/builders/types.d.ts +1 -1
  57. package/dist/cjs/components/lib.d.ts +3 -1
  58. package/dist/cjs/components/lib.js +10 -7
  59. package/dist/cjs/components/localization.js +4 -4
  60. package/dist/cjs/components/util/StrokeSmoother.d.ts +1 -2
  61. package/dist/cjs/components/util/StrokeSmoother.js +67 -72
  62. package/dist/cjs/components/util/describeComponentList.d.ts +1 -1
  63. package/dist/cjs/components/util/describeComponentList.js +4 -5
  64. package/dist/cjs/dialogs/makeAboutDialog.d.ts +15 -0
  65. package/dist/cjs/dialogs/makeAboutDialog.js +54 -0
  66. package/dist/cjs/inputEvents.d.ts +84 -0
  67. package/dist/cjs/inputEvents.js +40 -0
  68. package/dist/cjs/lib.d.ts +29 -13
  69. package/dist/cjs/lib.js +38 -23
  70. package/dist/cjs/localization.js +19 -18
  71. package/dist/cjs/localizations/de.js +117 -13
  72. package/dist/cjs/localizations/en.js +4 -13
  73. package/dist/cjs/localizations/es.js +62 -23
  74. package/dist/cjs/localizations/getLocalizationTable.js +15 -13
  75. package/dist/cjs/rendering/Display.d.ts +1 -2
  76. package/dist/cjs/rendering/Display.js +70 -83
  77. package/dist/cjs/rendering/RenderablePathSpec.d.ts +15 -0
  78. package/dist/cjs/rendering/RenderablePathSpec.js +70 -0
  79. package/dist/cjs/rendering/RenderingStyle.d.ts +4 -4
  80. package/dist/cjs/rendering/RenderingStyle.js +18 -28
  81. package/dist/cjs/rendering/TextRenderingStyle.d.ts +10 -10
  82. package/dist/cjs/rendering/TextRenderingStyle.js +13 -18
  83. package/dist/cjs/rendering/caching/CacheRecord.d.ts +1 -2
  84. package/dist/cjs/rendering/caching/CacheRecord.js +20 -22
  85. package/dist/cjs/rendering/caching/CacheRecordManager.d.ts +1 -1
  86. package/dist/cjs/rendering/caching/CacheRecordManager.js +17 -15
  87. package/dist/cjs/rendering/caching/RenderingCache.js +19 -19
  88. package/dist/cjs/rendering/caching/RenderingCacheNode.d.ts +1 -1
  89. package/dist/cjs/rendering/caching/RenderingCacheNode.js +98 -118
  90. package/dist/cjs/rendering/caching/testUtils.js +24 -23
  91. package/dist/cjs/rendering/caching/types.d.ts +3 -3
  92. package/dist/cjs/rendering/lib.js +8 -5
  93. package/dist/cjs/rendering/localization.js +5 -5
  94. package/dist/cjs/rendering/renderers/AbstractRenderer.d.ts +2 -11
  95. package/dist/cjs/rendering/renderers/AbstractRenderer.js +53 -57
  96. package/dist/cjs/rendering/renderers/CanvasRenderer.d.ts +3 -5
  97. package/dist/cjs/rendering/renderers/CanvasRenderer.js +91 -106
  98. package/dist/cjs/rendering/renderers/DummyRenderer.d.ts +1 -4
  99. package/dist/cjs/rendering/renderers/DummyRenderer.js +56 -76
  100. package/dist/cjs/rendering/renderers/SVGRenderer.d.ts +5 -5
  101. package/dist/cjs/rendering/renderers/SVGRenderer.js +194 -176
  102. package/dist/cjs/rendering/renderers/TextOnlyRenderer.d.ts +1 -3
  103. package/dist/cjs/rendering/renderers/TextOnlyRenderer.js +47 -72
  104. package/dist/cjs/shortcuts/KeyBinding.d.ts +5 -0
  105. package/dist/cjs/shortcuts/KeyBinding.js +94 -70
  106. package/dist/cjs/shortcuts/KeyboardShortcutManager.d.ts +1 -1
  107. package/dist/cjs/shortcuts/KeyboardShortcutManager.js +36 -45
  108. package/dist/cjs/shortcuts/lib.js +5 -2
  109. package/dist/cjs/testing/createEditor.js +7 -4
  110. package/dist/cjs/testing/getUniquePointerId.js +4 -5
  111. package/dist/cjs/testing/lib.js +5 -2
  112. package/dist/cjs/testing/sendPenEvent.d.ts +2 -2
  113. package/dist/cjs/testing/sendPenEvent.js +10 -7
  114. package/dist/cjs/testing/sendTouchEvent.d.ts +2 -2
  115. package/dist/cjs/testing/sendTouchEvent.js +34 -16
  116. package/dist/cjs/toolbar/AbstractToolbar.d.ts +166 -0
  117. package/dist/cjs/toolbar/AbstractToolbar.js +410 -0
  118. package/dist/cjs/toolbar/DropdownToolbar.d.ts +43 -0
  119. package/dist/cjs/toolbar/DropdownToolbar.js +176 -0
  120. package/dist/cjs/toolbar/EdgeToolbar.d.ts +47 -0
  121. package/dist/cjs/toolbar/EdgeToolbar.js +422 -0
  122. package/dist/cjs/toolbar/IconProvider.d.ts +54 -30
  123. package/dist/cjs/toolbar/IconProvider.js +652 -224
  124. package/dist/cjs/toolbar/constants.d.ts +1 -0
  125. package/dist/cjs/toolbar/constants.js +4 -0
  126. package/dist/cjs/toolbar/lib.d.ts +4 -2
  127. package/dist/cjs/toolbar/lib.js +10 -3
  128. package/dist/cjs/toolbar/localization.d.ts +9 -2
  129. package/dist/cjs/toolbar/localization.js +26 -19
  130. package/dist/cjs/toolbar/types.d.ts +7 -0
  131. package/dist/cjs/toolbar/widgets/ActionButtonWidget.d.ts +1 -1
  132. package/dist/cjs/toolbar/widgets/ActionButtonWidget.js +23 -39
  133. package/dist/cjs/toolbar/widgets/BaseToolWidget.d.ts +1 -1
  134. package/dist/cjs/toolbar/widgets/BaseToolWidget.js +35 -37
  135. package/dist/cjs/toolbar/widgets/BaseWidget.d.ts +60 -5
  136. package/dist/cjs/toolbar/widgets/BaseWidget.js +232 -177
  137. package/dist/cjs/toolbar/widgets/DocumentPropertiesWidget.js +130 -117
  138. package/dist/cjs/toolbar/widgets/EraserToolWidget.d.ts +1 -3
  139. package/dist/cjs/toolbar/widgets/EraserToolWidget.js +45 -73
  140. package/dist/cjs/toolbar/widgets/HandToolWidget.d.ts +1 -0
  141. package/dist/cjs/toolbar/widgets/HandToolWidget.js +126 -141
  142. package/dist/cjs/toolbar/widgets/InsertImageWidget.d.ts +9 -7
  143. package/dist/cjs/toolbar/widgets/InsertImageWidget.js +147 -212
  144. package/dist/cjs/toolbar/widgets/OverflowWidget.js +33 -61
  145. package/dist/cjs/toolbar/widgets/PenToolWidget.d.ts +8 -1
  146. package/dist/cjs/toolbar/widgets/PenToolWidget.js +162 -234
  147. package/dist/cjs/toolbar/widgets/SelectionToolWidget.d.ts +3 -1
  148. package/dist/cjs/toolbar/widgets/SelectionToolWidget.js +105 -177
  149. package/dist/cjs/toolbar/widgets/TextToolWidget.js +64 -87
  150. package/dist/cjs/toolbar/widgets/components/makeColorInput.d.ts +10 -0
  151. package/dist/cjs/toolbar/{makeColorInput.js → widgets/components/makeColorInput.js} +57 -34
  152. package/dist/cjs/toolbar/widgets/components/makeFileInput.d.ts +12 -0
  153. package/dist/cjs/toolbar/widgets/components/makeFileInput.js +111 -0
  154. package/dist/cjs/toolbar/widgets/components/makeGridSelector.d.ts +24 -0
  155. package/dist/cjs/toolbar/widgets/components/makeGridSelector.js +127 -0
  156. package/dist/cjs/toolbar/widgets/components/makeSeparator.d.ts +7 -0
  157. package/dist/cjs/toolbar/widgets/components/makeSeparator.js +16 -0
  158. package/dist/cjs/toolbar/widgets/components/makeThicknessSlider.d.ts +8 -0
  159. package/dist/cjs/toolbar/widgets/components/makeThicknessSlider.js +47 -0
  160. package/dist/cjs/toolbar/widgets/keybindings.js +8 -5
  161. package/dist/cjs/toolbar/widgets/layout/DropdownLayoutManager.d.ts +21 -0
  162. package/dist/cjs/toolbar/widgets/layout/DropdownLayoutManager.js +199 -0
  163. package/dist/cjs/toolbar/widgets/layout/EdgeToolbarLayoutManager.d.ts +14 -0
  164. package/dist/cjs/toolbar/widgets/layout/EdgeToolbarLayoutManager.js +60 -0
  165. package/dist/cjs/toolbar/widgets/layout/types.d.ts +63 -0
  166. package/dist/cjs/toolbar/widgets/layout/types.js +2 -0
  167. package/dist/cjs/toolbar/widgets/lib.d.ts +1 -1
  168. package/dist/cjs/toolbar/widgets/lib.js +15 -11
  169. package/dist/cjs/tools/BaseTool.d.ts +28 -9
  170. package/dist/cjs/tools/BaseTool.js +128 -51
  171. package/dist/cjs/tools/Eraser.d.ts +8 -1
  172. package/dist/cjs/tools/Eraser.js +82 -92
  173. package/dist/cjs/tools/FindTool.d.ts +1 -1
  174. package/dist/cjs/tools/FindTool.js +61 -77
  175. package/dist/cjs/tools/InputFilter/FunctionMapper.d.ts +12 -0
  176. package/dist/cjs/tools/InputFilter/FunctionMapper.js +21 -0
  177. package/dist/cjs/tools/InputFilter/InputMapper.d.ts +23 -0
  178. package/dist/cjs/tools/InputFilter/InputMapper.js +38 -0
  179. package/dist/cjs/tools/InputFilter/InputPipeline.d.ts +15 -0
  180. package/dist/cjs/tools/InputFilter/InputPipeline.js +54 -0
  181. package/dist/cjs/tools/InputFilter/InputStabilizer.d.ts +29 -0
  182. package/dist/cjs/tools/InputFilter/InputStabilizer.js +181 -0
  183. package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.d.ts +21 -0
  184. package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.js +84 -0
  185. package/dist/cjs/tools/PanZoom.d.ts +4 -2
  186. package/dist/cjs/tools/PanZoom.js +186 -248
  187. package/dist/cjs/tools/PasteHandler.d.ts +1 -1
  188. package/dist/cjs/tools/PasteHandler.js +49 -148
  189. package/dist/cjs/tools/Pen.d.ts +12 -11
  190. package/dist/cjs/tools/Pen.js +123 -158
  191. package/dist/cjs/tools/PipetteTool.d.ts +11 -2
  192. package/dist/cjs/tools/PipetteTool.js +51 -48
  193. package/dist/cjs/tools/SelectionTool/SelectAllShortcutHandler.d.ts +1 -1
  194. package/dist/cjs/tools/SelectionTool/SelectAllShortcutHandler.js +15 -30
  195. package/dist/cjs/tools/SelectionTool/Selection.d.ts +5 -5
  196. package/dist/cjs/tools/SelectionTool/Selection.js +308 -415
  197. package/dist/cjs/tools/SelectionTool/SelectionHandle.d.ts +15 -5
  198. package/dist/cjs/tools/SelectionTool/SelectionHandle.js +63 -37
  199. package/dist/cjs/tools/SelectionTool/SelectionTool.d.ts +4 -4
  200. package/dist/cjs/tools/SelectionTool/SelectionTool.js +164 -187
  201. package/dist/cjs/tools/SelectionTool/TransformMode.d.ts +1 -1
  202. package/dist/cjs/tools/SelectionTool/TransformMode.js +65 -66
  203. package/dist/cjs/tools/SoundUITool.d.ts +2 -1
  204. package/dist/cjs/tools/SoundUITool.js +70 -84
  205. package/dist/cjs/tools/TextTool.d.ts +5 -3
  206. package/dist/cjs/tools/TextTool.js +169 -173
  207. package/dist/cjs/tools/ToolController.d.ts +16 -2
  208. package/dist/cjs/tools/ToolController.js +124 -100
  209. package/dist/cjs/tools/ToolEnabledGroup.js +6 -9
  210. package/dist/cjs/tools/ToolSwitcherShortcut.d.ts +1 -1
  211. package/dist/cjs/tools/ToolSwitcherShortcut.js +16 -32
  212. package/dist/cjs/tools/ToolbarShortcutHandler.d.ts +1 -1
  213. package/dist/cjs/tools/ToolbarShortcutHandler.js +17 -33
  214. package/dist/cjs/tools/UndoRedoShortcut.d.ts +1 -1
  215. package/dist/cjs/tools/UndoRedoShortcut.js +12 -27
  216. package/dist/cjs/tools/keybindings.js +21 -18
  217. package/dist/cjs/tools/lib.js +17 -14
  218. package/dist/cjs/tools/localization.d.ts +2 -1
  219. package/dist/cjs/tools/localization.js +8 -7
  220. package/dist/cjs/types.d.ts +22 -80
  221. package/dist/cjs/types.js +8 -16
  222. package/dist/cjs/util/ReactiveValue.d.ts +65 -0
  223. package/dist/cjs/util/ReactiveValue.js +166 -0
  224. package/dist/cjs/util/assertions.js +5 -8
  225. package/dist/cjs/util/fileToBase64.js +6 -6
  226. package/dist/cjs/util/guessKeyCodeFromKey.d.ts +9 -0
  227. package/dist/cjs/util/guessKeyCodeFromKey.js +32 -0
  228. package/dist/cjs/util/listPrefixMatch.d.ts +6 -0
  229. package/dist/cjs/util/listPrefixMatch.js +17 -0
  230. package/dist/cjs/util/stopPropagationOfScrollingWheelEvents.d.ts +2 -0
  231. package/dist/cjs/util/stopPropagationOfScrollingWheelEvents.js +17 -0
  232. package/dist/cjs/util/untilNextAnimationFrame.js +3 -3
  233. package/dist/cjs/util/waitForAll.js +3 -3
  234. package/dist/cjs/util/waitForTimeout.js +3 -3
  235. package/dist/cjs/version.d.ts +4 -0
  236. package/dist/cjs/version.js +5 -0
  237. package/dist/mjs/Editor.d.ts +91 -12
  238. package/dist/mjs/Editor.mjs +565 -563
  239. package/dist/mjs/EditorImage.d.ts +5 -2
  240. package/dist/mjs/EditorImage.mjs +248 -291
  241. package/dist/mjs/EventDispatcher.mjs +17 -20
  242. package/dist/mjs/Pointer.d.ts +3 -1
  243. package/dist/mjs/Pointer.mjs +43 -45
  244. package/dist/mjs/SVGLoader.d.ts +7 -1
  245. package/dist/mjs/SVGLoader.mjs +338 -466
  246. package/dist/mjs/UndoRedoHistory.mjs +27 -39
  247. package/dist/mjs/Viewport.d.ts +1 -4
  248. package/dist/mjs/Viewport.mjs +139 -187
  249. package/dist/mjs/commands/Command.mjs +21 -49
  250. package/dist/mjs/commands/Duplicate.mjs +22 -41
  251. package/dist/mjs/commands/Erase.mjs +30 -51
  252. package/dist/mjs/commands/SerializableCommand.mjs +16 -34
  253. package/dist/mjs/commands/UnresolvedCommand.mjs +10 -29
  254. package/dist/mjs/commands/invertCommand.mjs +24 -49
  255. package/dist/mjs/commands/localization.d.ts +1 -1
  256. package/dist/mjs/commands/localization.mjs +10 -10
  257. package/dist/mjs/commands/uniteCommands.mjs +52 -85
  258. package/dist/mjs/components/AbstractComponent.d.ts +11 -3
  259. package/dist/mjs/components/AbstractComponent.mjs +135 -166
  260. package/dist/mjs/components/BackgroundComponent.d.ts +3 -6
  261. package/dist/mjs/components/BackgroundComponent.mjs +107 -136
  262. package/dist/mjs/components/ImageComponent.d.ts +3 -5
  263. package/dist/mjs/components/ImageComponent.mjs +90 -174
  264. package/dist/mjs/components/RestylableComponent.d.ts +1 -1
  265. package/dist/mjs/components/RestylableComponent.mjs +35 -53
  266. package/dist/mjs/components/SVGGlobalAttributesObject.d.ts +1 -3
  267. package/dist/mjs/components/SVGGlobalAttributesObject.mjs +29 -50
  268. package/dist/mjs/components/Stroke.d.ts +4 -6
  269. package/dist/mjs/components/Stroke.mjs +89 -119
  270. package/dist/mjs/components/TextComponent.d.ts +2 -4
  271. package/dist/mjs/components/TextComponent.mjs +180 -228
  272. package/dist/mjs/components/UnknownSVGObject.d.ts +1 -3
  273. package/dist/mjs/components/UnknownSVGObject.mjs +26 -43
  274. package/dist/mjs/components/builders/ArrowBuilder.d.ts +1 -1
  275. package/dist/mjs/components/builders/ArrowBuilder.mjs +32 -35
  276. package/dist/mjs/components/builders/CircleBuilder.mjs +35 -38
  277. package/dist/mjs/components/builders/FreehandLineBuilder.d.ts +3 -2
  278. package/dist/mjs/components/builders/FreehandLineBuilder.mjs +52 -69
  279. package/dist/mjs/components/builders/LineBuilder.d.ts +1 -1
  280. package/dist/mjs/components/builders/LineBuilder.mjs +30 -32
  281. package/dist/mjs/components/builders/PressureSensitiveFreehandLineBuilder.d.ts +1 -1
  282. package/dist/mjs/components/builders/PressureSensitiveFreehandLineBuilder.mjs +103 -115
  283. package/dist/mjs/components/builders/RectangleBuilder.d.ts +1 -1
  284. package/dist/mjs/components/builders/RectangleBuilder.mjs +27 -31
  285. package/dist/mjs/components/builders/types.d.ts +1 -1
  286. package/dist/mjs/components/lib.d.ts +3 -1
  287. package/dist/mjs/components/lib.mjs +1 -1
  288. package/dist/mjs/components/localization.mjs +5 -5
  289. package/dist/mjs/components/util/StrokeSmoother.d.ts +1 -2
  290. package/dist/mjs/components/util/StrokeSmoother.mjs +63 -69
  291. package/dist/mjs/components/util/describeComponentList.d.ts +1 -1
  292. package/dist/mjs/components/util/describeComponentList.mjs +4 -5
  293. package/dist/mjs/dialogs/makeAboutDialog.d.ts +15 -0
  294. package/dist/mjs/dialogs/makeAboutDialog.mjs +52 -0
  295. package/dist/mjs/inputEvents.d.ts +84 -0
  296. package/dist/mjs/inputEvents.mjs +34 -0
  297. package/dist/mjs/lib.d.ts +29 -13
  298. package/dist/mjs/lib.mjs +30 -13
  299. package/dist/mjs/localization.mjs +14 -13
  300. package/dist/mjs/localizations/de.mjs +116 -12
  301. package/dist/mjs/localizations/en.mjs +3 -12
  302. package/dist/mjs/localizations/es.mjs +61 -22
  303. package/dist/mjs/localizations/getLocalizationTable.mjs +12 -13
  304. package/dist/mjs/rendering/Display.d.ts +1 -2
  305. package/dist/mjs/rendering/Display.mjs +62 -79
  306. package/dist/mjs/rendering/RenderablePathSpec.d.ts +15 -0
  307. package/dist/mjs/rendering/RenderablePathSpec.mjs +64 -0
  308. package/dist/mjs/rendering/RenderingStyle.d.ts +4 -4
  309. package/dist/mjs/rendering/RenderingStyle.mjs +16 -26
  310. package/dist/mjs/rendering/TextRenderingStyle.d.ts +10 -10
  311. package/dist/mjs/rendering/TextRenderingStyle.mjs +12 -17
  312. package/dist/mjs/rendering/caching/CacheRecord.d.ts +1 -2
  313. package/dist/mjs/rendering/caching/CacheRecord.mjs +20 -23
  314. package/dist/mjs/rendering/caching/CacheRecordManager.d.ts +1 -1
  315. package/dist/mjs/rendering/caching/CacheRecordManager.mjs +13 -15
  316. package/dist/mjs/rendering/caching/RenderingCache.mjs +13 -17
  317. package/dist/mjs/rendering/caching/RenderingCacheNode.d.ts +1 -1
  318. package/dist/mjs/rendering/caching/RenderingCacheNode.mjs +94 -115
  319. package/dist/mjs/rendering/caching/testUtils.mjs +19 -21
  320. package/dist/mjs/rendering/caching/types.d.ts +3 -3
  321. package/dist/mjs/rendering/localization.mjs +6 -6
  322. package/dist/mjs/rendering/renderers/AbstractRenderer.d.ts +2 -11
  323. package/dist/mjs/rendering/renderers/AbstractRenderer.mjs +47 -52
  324. package/dist/mjs/rendering/renderers/CanvasRenderer.d.ts +3 -5
  325. package/dist/mjs/rendering/renderers/CanvasRenderer.mjs +84 -103
  326. package/dist/mjs/rendering/renderers/DummyRenderer.d.ts +1 -4
  327. package/dist/mjs/rendering/renderers/DummyRenderer.mjs +51 -75
  328. package/dist/mjs/rendering/renderers/SVGRenderer.d.ts +5 -5
  329. package/dist/mjs/rendering/renderers/SVGRenderer.mjs +185 -171
  330. package/dist/mjs/rendering/renderers/TextOnlyRenderer.d.ts +1 -3
  331. package/dist/mjs/rendering/renderers/TextOnlyRenderer.mjs +43 -72
  332. package/dist/mjs/shortcuts/KeyBinding.d.ts +5 -0
  333. package/dist/mjs/shortcuts/KeyBinding.mjs +94 -71
  334. package/dist/mjs/shortcuts/KeyboardShortcutManager.d.ts +1 -1
  335. package/dist/mjs/shortcuts/KeyboardShortcutManager.mjs +32 -44
  336. package/dist/mjs/testing/createEditor.mjs +2 -2
  337. package/dist/mjs/testing/getUniquePointerId.mjs +4 -5
  338. package/dist/mjs/testing/sendPenEvent.d.ts +2 -2
  339. package/dist/mjs/testing/sendPenEvent.mjs +5 -5
  340. package/dist/mjs/testing/sendTouchEvent.d.ts +2 -2
  341. package/dist/mjs/testing/sendTouchEvent.mjs +8 -16
  342. package/dist/mjs/toolbar/AbstractToolbar.d.ts +166 -0
  343. package/dist/mjs/toolbar/AbstractToolbar.mjs +405 -0
  344. package/dist/mjs/toolbar/DropdownToolbar.d.ts +43 -0
  345. package/dist/mjs/toolbar/DropdownToolbar.mjs +168 -0
  346. package/dist/mjs/toolbar/EdgeToolbar.d.ts +47 -0
  347. package/dist/mjs/toolbar/EdgeToolbar.mjs +414 -0
  348. package/dist/mjs/toolbar/IconProvider.d.ts +54 -30
  349. package/dist/mjs/toolbar/IconProvider.mjs +644 -219
  350. package/dist/mjs/toolbar/constants.d.ts +1 -0
  351. package/dist/mjs/toolbar/constants.mjs +1 -0
  352. package/dist/mjs/toolbar/lib.d.ts +4 -2
  353. package/dist/mjs/toolbar/lib.mjs +3 -1
  354. package/dist/mjs/toolbar/localization.d.ts +9 -2
  355. package/dist/mjs/toolbar/localization.mjs +27 -20
  356. package/dist/mjs/toolbar/types.d.ts +7 -0
  357. package/dist/mjs/toolbar/widgets/ActionButtonWidget.d.ts +1 -1
  358. package/dist/mjs/toolbar/widgets/ActionButtonWidget.mjs +19 -39
  359. package/dist/mjs/toolbar/widgets/BaseToolWidget.d.ts +1 -1
  360. package/dist/mjs/toolbar/widgets/BaseToolWidget.mjs +30 -36
  361. package/dist/mjs/toolbar/widgets/BaseWidget.d.ts +60 -5
  362. package/dist/mjs/toolbar/widgets/BaseWidget.mjs +227 -176
  363. package/dist/mjs/toolbar/widgets/DocumentPropertiesWidget.mjs +98 -111
  364. package/dist/mjs/toolbar/widgets/EraserToolWidget.d.ts +1 -3
  365. package/dist/mjs/toolbar/widgets/EraserToolWidget.mjs +41 -73
  366. package/dist/mjs/toolbar/widgets/HandToolWidget.d.ts +1 -0
  367. package/dist/mjs/toolbar/widgets/HandToolWidget.mjs +94 -136
  368. package/dist/mjs/toolbar/widgets/InsertImageWidget.d.ts +9 -7
  369. package/dist/mjs/toolbar/widgets/InsertImageWidget.mjs +140 -208
  370. package/dist/mjs/toolbar/widgets/OverflowWidget.mjs +30 -62
  371. package/dist/mjs/toolbar/widgets/PenToolWidget.d.ts +8 -1
  372. package/dist/mjs/toolbar/widgets/PenToolWidget.mjs +150 -225
  373. package/dist/mjs/toolbar/widgets/SelectionToolWidget.d.ts +3 -1
  374. package/dist/mjs/toolbar/widgets/SelectionToolWidget.mjs +97 -173
  375. package/dist/mjs/toolbar/widgets/TextToolWidget.mjs +59 -85
  376. package/dist/mjs/toolbar/widgets/components/makeColorInput.d.ts +10 -0
  377. package/dist/mjs/toolbar/{makeColorInput.mjs → widgets/components/makeColorInput.mjs} +53 -33
  378. package/dist/mjs/toolbar/widgets/components/makeFileInput.d.ts +12 -0
  379. package/dist/mjs/toolbar/widgets/components/makeFileInput.mjs +106 -0
  380. package/dist/mjs/toolbar/widgets/components/makeGridSelector.d.ts +24 -0
  381. package/dist/mjs/toolbar/widgets/components/makeGridSelector.mjs +122 -0
  382. package/dist/mjs/toolbar/widgets/components/makeSeparator.d.ts +7 -0
  383. package/dist/mjs/toolbar/widgets/components/makeSeparator.mjs +14 -0
  384. package/dist/mjs/toolbar/widgets/components/makeThicknessSlider.d.ts +8 -0
  385. package/dist/mjs/toolbar/widgets/components/makeThicknessSlider.mjs +45 -0
  386. package/dist/mjs/toolbar/widgets/keybindings.mjs +5 -5
  387. package/dist/mjs/toolbar/widgets/layout/DropdownLayoutManager.d.ts +21 -0
  388. package/dist/mjs/toolbar/widgets/layout/DropdownLayoutManager.mjs +193 -0
  389. package/dist/mjs/toolbar/widgets/layout/EdgeToolbarLayoutManager.d.ts +14 -0
  390. package/dist/mjs/toolbar/widgets/layout/EdgeToolbarLayoutManager.mjs +57 -0
  391. package/dist/mjs/toolbar/widgets/layout/types.d.ts +63 -0
  392. package/dist/mjs/toolbar/widgets/lib.d.ts +1 -1
  393. package/dist/mjs/toolbar/widgets/lib.mjs +1 -1
  394. package/dist/mjs/tools/BaseTool.d.ts +28 -9
  395. package/dist/mjs/tools/BaseTool.mjs +127 -50
  396. package/dist/mjs/tools/Eraser.d.ts +8 -1
  397. package/dist/mjs/tools/Eraser.mjs +72 -86
  398. package/dist/mjs/tools/FindTool.d.ts +1 -1
  399. package/dist/mjs/tools/FindTool.mjs +55 -75
  400. package/dist/mjs/tools/InputFilter/FunctionMapper.d.ts +12 -0
  401. package/dist/mjs/tools/InputFilter/FunctionMapper.mjs +15 -0
  402. package/dist/mjs/tools/InputFilter/InputMapper.d.ts +23 -0
  403. package/dist/mjs/tools/InputFilter/InputMapper.mjs +36 -0
  404. package/dist/mjs/tools/InputFilter/InputPipeline.d.ts +15 -0
  405. package/dist/mjs/tools/InputFilter/InputPipeline.mjs +49 -0
  406. package/dist/mjs/tools/InputFilter/InputStabilizer.d.ts +29 -0
  407. package/dist/mjs/tools/InputFilter/InputStabilizer.mjs +175 -0
  408. package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.d.ts +21 -0
  409. package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.mjs +78 -0
  410. package/dist/mjs/tools/PanZoom.d.ts +4 -2
  411. package/dist/mjs/tools/PanZoom.mjs +169 -235
  412. package/dist/mjs/tools/PasteHandler.d.ts +1 -1
  413. package/dist/mjs/tools/PasteHandler.mjs +42 -145
  414. package/dist/mjs/tools/Pen.d.ts +12 -11
  415. package/dist/mjs/tools/Pen.mjs +115 -154
  416. package/dist/mjs/tools/PipetteTool.d.ts +11 -2
  417. package/dist/mjs/tools/PipetteTool.mjs +47 -48
  418. package/dist/mjs/tools/SelectionTool/SelectAllShortcutHandler.d.ts +1 -1
  419. package/dist/mjs/tools/SelectionTool/SelectAllShortcutHandler.mjs +9 -28
  420. package/dist/mjs/tools/SelectionTool/Selection.d.ts +5 -5
  421. package/dist/mjs/tools/SelectionTool/Selection.mjs +268 -401
  422. package/dist/mjs/tools/SelectionTool/SelectionHandle.d.ts +15 -5
  423. package/dist/mjs/tools/SelectionTool/SelectionHandle.mjs +62 -37
  424. package/dist/mjs/tools/SelectionTool/SelectionTool.d.ts +4 -4
  425. package/dist/mjs/tools/SelectionTool/SelectionTool.mjs +153 -179
  426. package/dist/mjs/tools/SelectionTool/TransformMode.d.ts +1 -1
  427. package/dist/mjs/tools/SelectionTool/TransformMode.mjs +52 -59
  428. package/dist/mjs/tools/SoundUITool.d.ts +2 -1
  429. package/dist/mjs/tools/SoundUITool.mjs +66 -84
  430. package/dist/mjs/tools/TextTool.d.ts +5 -3
  431. package/dist/mjs/tools/TextTool.mjs +155 -163
  432. package/dist/mjs/tools/ToolController.d.ts +16 -2
  433. package/dist/mjs/tools/ToolController.mjs +81 -84
  434. package/dist/mjs/tools/ToolEnabledGroup.mjs +6 -10
  435. package/dist/mjs/tools/ToolSwitcherShortcut.d.ts +1 -1
  436. package/dist/mjs/tools/ToolSwitcherShortcut.mjs +12 -32
  437. package/dist/mjs/tools/ToolbarShortcutHandler.d.ts +1 -1
  438. package/dist/mjs/tools/ToolbarShortcutHandler.mjs +13 -33
  439. package/dist/mjs/tools/UndoRedoShortcut.d.ts +1 -1
  440. package/dist/mjs/tools/UndoRedoShortcut.mjs +7 -26
  441. package/dist/mjs/tools/keybindings.mjs +34 -34
  442. package/dist/mjs/tools/localization.d.ts +2 -1
  443. package/dist/mjs/tools/localization.mjs +9 -8
  444. package/dist/mjs/types.d.ts +22 -80
  445. package/dist/mjs/types.mjs +7 -15
  446. package/dist/mjs/util/ReactiveValue.d.ts +65 -0
  447. package/dist/mjs/util/ReactiveValue.mjs +161 -0
  448. package/dist/mjs/util/assertions.mjs +5 -8
  449. package/dist/mjs/util/fileToBase64.mjs +6 -6
  450. package/dist/mjs/util/guessKeyCodeFromKey.d.ts +9 -0
  451. package/dist/mjs/util/guessKeyCodeFromKey.mjs +30 -0
  452. package/dist/mjs/util/listPrefixMatch.d.ts +6 -0
  453. package/dist/mjs/util/listPrefixMatch.mjs +15 -0
  454. package/dist/mjs/util/stopPropagationOfScrollingWheelEvents.d.ts +2 -0
  455. package/dist/mjs/util/stopPropagationOfScrollingWheelEvents.mjs +15 -0
  456. package/dist/mjs/util/untilNextAnimationFrame.mjs +3 -3
  457. package/dist/mjs/util/waitForAll.mjs +3 -3
  458. package/dist/mjs/util/waitForTimeout.mjs +3 -3
  459. package/dist/mjs/version.d.ts +4 -0
  460. package/dist/mjs/version.mjs +3 -0
  461. package/package.json +11 -22
  462. package/src/Coloris.css +8 -8
  463. package/src/Editor.scss +148 -0
  464. package/src/dialogs/dialogs.scss +36 -0
  465. package/src/dialogs/makeAboutDialog.scss +41 -0
  466. package/src/styles.js +1 -1
  467. package/src/toolbar/{toolbar.css → AbstractToolbar.scss} +47 -85
  468. package/src/toolbar/DropdownToolbar.scss +46 -0
  469. package/src/toolbar/EdgeToolbar.scss +511 -0
  470. package/src/toolbar/toolbar.scss +11 -0
  471. package/src/toolbar/widgets/DocumentPropertiesWidget.scss +7 -0
  472. package/src/toolbar/widgets/HandToolWidget.scss +14 -0
  473. package/src/toolbar/widgets/InsertImageWidget.scss +41 -0
  474. package/src/toolbar/widgets/PenToolWidget.css +0 -51
  475. package/src/toolbar/widgets/SelectionToolWidget.scss +6 -0
  476. package/src/toolbar/widgets/components/components.scss +5 -0
  477. package/src/toolbar/widgets/components/makeColorInput.scss +82 -0
  478. package/src/toolbar/widgets/components/makeFileInput.scss +77 -0
  479. package/src/toolbar/widgets/components/makeGridSelector.scss +60 -0
  480. package/src/toolbar/widgets/components/makeSeparator.scss +14 -0
  481. package/src/toolbar/widgets/components/makeThicknessSlider.scss +9 -0
  482. package/src/tools/FindTool.css +3 -3
  483. package/src/tools/SelectionTool/SelectionTool.css +23 -11
  484. package/src/tools/tools.scss +4 -0
  485. package/tsconfig.json +1 -1
  486. package/typedoc.json +4 -0
  487. package/dist/cjs/Color4.d.ts +0 -69
  488. package/dist/cjs/Color4.js +0 -263
  489. package/dist/cjs/Editor.loadFrom.test.d.ts +0 -1
  490. package/dist/cjs/Editor.toSVG.test.d.ts +0 -1
  491. package/dist/cjs/EditorImage.test.d.ts +0 -1
  492. package/dist/cjs/EventDispatcher.test.d.ts +0 -1
  493. package/dist/cjs/SVGLoader.test.d.ts +0 -1
  494. package/dist/cjs/UndoRedoHistory.test.d.ts +0 -1
  495. package/dist/cjs/commands/uniteCommands.test.d.ts +0 -1
  496. package/dist/cjs/components/AbstractComponent.transformBy.test.d.ts +0 -1
  497. package/dist/cjs/components/BackgroundComponent.test.d.ts +0 -1
  498. package/dist/cjs/components/Stroke.test.d.ts +0 -1
  499. package/dist/cjs/components/TextComponent.test.d.ts +0 -1
  500. package/dist/cjs/components/UnknownSVGObject.test.d.ts +0 -1
  501. package/dist/cjs/components/builders/FreehandLineBuilder.test.d.ts +0 -1
  502. package/dist/cjs/localizations/getLocalizationTable.test.d.ts +0 -1
  503. package/dist/cjs/math/Mat33.d.ts +0 -123
  504. package/dist/cjs/math/Mat33.js +0 -340
  505. package/dist/cjs/math/Mat33.test.d.ts +0 -1
  506. package/dist/cjs/math/Vec2.d.ts +0 -33
  507. package/dist/cjs/math/Vec2.js +0 -37
  508. package/dist/cjs/math/Vec2.test.d.ts +0 -1
  509. package/dist/cjs/math/Vec3.d.ts +0 -106
  510. package/dist/cjs/math/Vec3.js +0 -183
  511. package/dist/cjs/math/Vec3.test.d.ts +0 -1
  512. package/dist/cjs/math/lib.d.ts +0 -7
  513. package/dist/cjs/math/lib.js +0 -15
  514. package/dist/cjs/math/polynomial/solveQuadratic.d.ts +0 -9
  515. package/dist/cjs/math/polynomial/solveQuadratic.js +0 -39
  516. package/dist/cjs/math/polynomial/solveQuadratic.test.d.ts +0 -1
  517. package/dist/cjs/math/rounding.d.ts +0 -4
  518. package/dist/cjs/math/rounding.js +0 -140
  519. package/dist/cjs/math/rounding.test.d.ts +0 -1
  520. package/dist/cjs/math/shapes/Abstract2DShape.d.ts +0 -49
  521. package/dist/cjs/math/shapes/Abstract2DShape.js +0 -42
  522. package/dist/cjs/math/shapes/BezierJSWrapper.d.ts +0 -36
  523. package/dist/cjs/math/shapes/BezierJSWrapper.js +0 -109
  524. package/dist/cjs/math/shapes/CubicBezier.d.ts +0 -17
  525. package/dist/cjs/math/shapes/CubicBezier.js +0 -50
  526. package/dist/cjs/math/shapes/LineSegment2.d.ts +0 -70
  527. package/dist/cjs/math/shapes/LineSegment2.js +0 -204
  528. package/dist/cjs/math/shapes/LineSegment2.test.d.ts +0 -1
  529. package/dist/cjs/math/shapes/Path.d.ts +0 -93
  530. package/dist/cjs/math/shapes/Path.fromString.test.d.ts +0 -1
  531. package/dist/cjs/math/shapes/Path.js +0 -865
  532. package/dist/cjs/math/shapes/Path.test.d.ts +0 -1
  533. package/dist/cjs/math/shapes/Path.toString.test.d.ts +0 -1
  534. package/dist/cjs/math/shapes/PointShape2D.d.ts +0 -18
  535. package/dist/cjs/math/shapes/PointShape2D.js +0 -46
  536. package/dist/cjs/math/shapes/QuadraticBezier.d.ts +0 -34
  537. package/dist/cjs/math/shapes/QuadraticBezier.js +0 -133
  538. package/dist/cjs/math/shapes/QuadraticBezier.test.d.ts +0 -1
  539. package/dist/cjs/math/shapes/Rect2.d.ts +0 -57
  540. package/dist/cjs/math/shapes/Rect2.js +0 -311
  541. package/dist/cjs/math/shapes/Rect2.test.d.ts +0 -1
  542. package/dist/cjs/math/shapes/Triangle.d.ts +0 -46
  543. package/dist/cjs/math/shapes/Triangle.js +0 -148
  544. package/dist/cjs/math/shapes/Triangle.test.d.ts +0 -1
  545. package/dist/cjs/rendering/RenderingStyle.test.d.ts +0 -1
  546. package/dist/cjs/rendering/caching/CacheRecord.test.d.ts +0 -1
  547. package/dist/cjs/rendering/caching/RenderingCache.test.d.ts +0 -1
  548. package/dist/cjs/rendering/renderers/DummyRenderer.test.d.ts +0 -1
  549. package/dist/cjs/rendering/renderers/TextOnlyRenderer.test.d.ts +0 -1
  550. package/dist/cjs/shortcuts/KeyBinding.test.d.ts +0 -1
  551. package/dist/cjs/shortcuts/KeyboardShortcutManager.test.d.ts +0 -1
  552. package/dist/cjs/toolbar/HTMLToolbar.d.ts +0 -105
  553. package/dist/cjs/toolbar/HTMLToolbar.js +0 -465
  554. package/dist/cjs/toolbar/makeColorInput.d.ts +0 -6
  555. package/dist/cjs/tools/Eraser.test.d.ts +0 -1
  556. package/dist/cjs/tools/PanZoom.test.d.ts +0 -1
  557. package/dist/cjs/tools/Pen.test.d.ts +0 -1
  558. package/dist/cjs/tools/SelectionTool/SelectionTool.test.d.ts +0 -1
  559. package/dist/cjs/tools/UndoRedoShortcut.test.d.ts +0 -1
  560. package/dist/mjs/Color4.d.ts +0 -69
  561. package/dist/mjs/Color4.mjs +0 -260
  562. package/dist/mjs/Color4.test.d.ts +0 -1
  563. package/dist/mjs/Editor.loadFrom.test.d.ts +0 -1
  564. package/dist/mjs/Editor.toSVG.test.d.ts +0 -1
  565. package/dist/mjs/EditorImage.test.d.ts +0 -1
  566. package/dist/mjs/EventDispatcher.test.d.ts +0 -1
  567. package/dist/mjs/SVGLoader.test.d.ts +0 -1
  568. package/dist/mjs/UndoRedoHistory.test.d.ts +0 -1
  569. package/dist/mjs/commands/uniteCommands.test.d.ts +0 -1
  570. package/dist/mjs/components/AbstractComponent.transformBy.test.d.ts +0 -1
  571. package/dist/mjs/components/BackgroundComponent.test.d.ts +0 -1
  572. package/dist/mjs/components/Stroke.test.d.ts +0 -1
  573. package/dist/mjs/components/TextComponent.test.d.ts +0 -1
  574. package/dist/mjs/components/UnknownSVGObject.test.d.ts +0 -1
  575. package/dist/mjs/components/builders/FreehandLineBuilder.test.d.ts +0 -1
  576. package/dist/mjs/localizations/getLocalizationTable.test.d.ts +0 -1
  577. package/dist/mjs/math/Mat33.d.ts +0 -123
  578. package/dist/mjs/math/Mat33.mjs +0 -338
  579. package/dist/mjs/math/Mat33.test.d.ts +0 -1
  580. package/dist/mjs/math/Vec2.d.ts +0 -33
  581. package/dist/mjs/math/Vec2.mjs +0 -34
  582. package/dist/mjs/math/Vec2.test.d.ts +0 -1
  583. package/dist/mjs/math/Vec3.d.ts +0 -106
  584. package/dist/mjs/math/Vec3.mjs +0 -181
  585. package/dist/mjs/math/Vec3.test.d.ts +0 -1
  586. package/dist/mjs/math/lib.d.ts +0 -7
  587. package/dist/mjs/math/lib.mjs +0 -7
  588. package/dist/mjs/math/polynomial/solveQuadratic.d.ts +0 -9
  589. package/dist/mjs/math/polynomial/solveQuadratic.mjs +0 -37
  590. package/dist/mjs/math/polynomial/solveQuadratic.test.d.ts +0 -1
  591. package/dist/mjs/math/rounding.d.ts +0 -4
  592. package/dist/mjs/math/rounding.mjs +0 -133
  593. package/dist/mjs/math/rounding.test.d.ts +0 -1
  594. package/dist/mjs/math/shapes/Abstract2DShape.d.ts +0 -49
  595. package/dist/mjs/math/shapes/Abstract2DShape.mjs +0 -40
  596. package/dist/mjs/math/shapes/BezierJSWrapper.d.ts +0 -36
  597. package/dist/mjs/math/shapes/BezierJSWrapper.mjs +0 -107
  598. package/dist/mjs/math/shapes/CubicBezier.d.ts +0 -17
  599. package/dist/mjs/math/shapes/CubicBezier.mjs +0 -48
  600. package/dist/mjs/math/shapes/LineSegment2.d.ts +0 -70
  601. package/dist/mjs/math/shapes/LineSegment2.mjs +0 -202
  602. package/dist/mjs/math/shapes/LineSegment2.test.d.ts +0 -1
  603. package/dist/mjs/math/shapes/Path.d.ts +0 -93
  604. package/dist/mjs/math/shapes/Path.fromString.test.d.ts +0 -1
  605. package/dist/mjs/math/shapes/Path.mjs +0 -862
  606. package/dist/mjs/math/shapes/Path.test.d.ts +0 -1
  607. package/dist/mjs/math/shapes/Path.toString.test.d.ts +0 -1
  608. package/dist/mjs/math/shapes/PointShape2D.d.ts +0 -18
  609. package/dist/mjs/math/shapes/PointShape2D.mjs +0 -44
  610. package/dist/mjs/math/shapes/QuadraticBezier.d.ts +0 -34
  611. package/dist/mjs/math/shapes/QuadraticBezier.mjs +0 -131
  612. package/dist/mjs/math/shapes/QuadraticBezier.test.d.ts +0 -1
  613. package/dist/mjs/math/shapes/Rect2.d.ts +0 -57
  614. package/dist/mjs/math/shapes/Rect2.mjs +0 -309
  615. package/dist/mjs/math/shapes/Rect2.test.d.ts +0 -1
  616. package/dist/mjs/math/shapes/Triangle.d.ts +0 -46
  617. package/dist/mjs/math/shapes/Triangle.mjs +0 -146
  618. package/dist/mjs/math/shapes/Triangle.test.d.ts +0 -1
  619. package/dist/mjs/rendering/RenderingStyle.test.d.ts +0 -1
  620. package/dist/mjs/rendering/caching/CacheRecord.test.d.ts +0 -1
  621. package/dist/mjs/rendering/caching/RenderingCache.test.d.ts +0 -1
  622. package/dist/mjs/rendering/renderers/DummyRenderer.test.d.ts +0 -1
  623. package/dist/mjs/rendering/renderers/TextOnlyRenderer.test.d.ts +0 -1
  624. package/dist/mjs/shortcuts/KeyBinding.test.d.ts +0 -1
  625. package/dist/mjs/shortcuts/KeyboardShortcutManager.test.d.ts +0 -1
  626. package/dist/mjs/toolbar/HTMLToolbar.d.ts +0 -105
  627. package/dist/mjs/toolbar/HTMLToolbar.mjs +0 -462
  628. package/dist/mjs/toolbar/makeColorInput.d.ts +0 -6
  629. package/dist/mjs/tools/Eraser.test.d.ts +0 -1
  630. package/dist/mjs/tools/PanZoom.test.d.ts +0 -1
  631. package/dist/mjs/tools/Pen.test.d.ts +0 -1
  632. package/dist/mjs/tools/SelectionTool/SelectionTool.test.d.ts +0 -1
  633. package/dist/mjs/tools/UndoRedoShortcut.test.d.ts +0 -1
  634. package/dist-test/test_imports/package-lock.json +0 -13
  635. package/dist-test/test_imports/package.json +0 -12
  636. package/dist-test/test_imports/test-imports.js +0 -17
  637. package/dist-test/test_imports/test-require.cjs +0 -19
  638. package/src/Color4.test.ts +0 -47
  639. package/src/Color4.ts +0 -304
  640. package/src/Editor.css +0 -98
  641. package/src/Editor.loadFrom.test.ts +0 -24
  642. package/src/Editor.toSVG.test.ts +0 -111
  643. package/src/Editor.ts +0 -1171
  644. package/src/EditorImage.test.ts +0 -120
  645. package/src/EditorImage.ts +0 -603
  646. package/src/EventDispatcher.test.ts +0 -123
  647. package/src/EventDispatcher.ts +0 -72
  648. package/src/Pointer.ts +0 -167
  649. package/src/SVGLoader.test.ts +0 -114
  650. package/src/SVGLoader.ts +0 -610
  651. package/src/UndoRedoHistory.test.ts +0 -33
  652. package/src/UndoRedoHistory.ts +0 -102
  653. package/src/Viewport.ts +0 -325
  654. package/src/bundle/bundled.ts +0 -7
  655. package/src/commands/Command.ts +0 -45
  656. package/src/commands/Duplicate.ts +0 -75
  657. package/src/commands/Erase.ts +0 -94
  658. package/src/commands/SerializableCommand.ts +0 -49
  659. package/src/commands/UnresolvedCommand.ts +0 -37
  660. package/src/commands/invertCommand.ts +0 -58
  661. package/src/commands/lib.ts +0 -16
  662. package/src/commands/localization.ts +0 -47
  663. package/src/commands/uniteCommands.test.ts +0 -23
  664. package/src/commands/uniteCommands.ts +0 -140
  665. package/src/components/AbstractComponent.transformBy.test.ts +0 -22
  666. package/src/components/AbstractComponent.ts +0 -374
  667. package/src/components/BackgroundComponent.test.ts +0 -45
  668. package/src/components/BackgroundComponent.ts +0 -353
  669. package/src/components/ImageComponent.ts +0 -178
  670. package/src/components/RestylableComponent.ts +0 -161
  671. package/src/components/SVGGlobalAttributesObject.ts +0 -81
  672. package/src/components/Stroke.test.ts +0 -139
  673. package/src/components/Stroke.ts +0 -296
  674. package/src/components/TextComponent.test.ts +0 -204
  675. package/src/components/TextComponent.ts +0 -432
  676. package/src/components/UnknownSVGObject.test.ts +0 -10
  677. package/src/components/UnknownSVGObject.ts +0 -60
  678. package/src/components/builders/ArrowBuilder.ts +0 -107
  679. package/src/components/builders/CircleBuilder.ts +0 -102
  680. package/src/components/builders/FreehandLineBuilder.test.ts +0 -25
  681. package/src/components/builders/FreehandLineBuilder.ts +0 -212
  682. package/src/components/builders/LineBuilder.ts +0 -77
  683. package/src/components/builders/PressureSensitiveFreehandLineBuilder.ts +0 -454
  684. package/src/components/builders/RectangleBuilder.ts +0 -74
  685. package/src/components/builders/types.ts +0 -15
  686. package/src/components/lib.ts +0 -31
  687. package/src/components/localization.ts +0 -24
  688. package/src/components/util/StrokeSmoother.ts +0 -302
  689. package/src/components/util/describeComponentList.ts +0 -18
  690. package/src/lib.ts +0 -69
  691. package/src/localization.ts +0 -34
  692. package/src/localizations/de.ts +0 -146
  693. package/src/localizations/en.ts +0 -8
  694. package/src/localizations/es.ts +0 -74
  695. package/src/localizations/getLocalizationTable.test.ts +0 -27
  696. package/src/localizations/getLocalizationTable.ts +0 -74
  697. package/src/math/Mat33.test.ts +0 -244
  698. package/src/math/Mat33.ts +0 -442
  699. package/src/math/Vec2.test.ts +0 -30
  700. package/src/math/Vec2.ts +0 -40
  701. package/src/math/Vec3.test.ts +0 -44
  702. package/src/math/Vec3.ts +0 -218
  703. package/src/math/lib.ts +0 -15
  704. package/src/math/polynomial/solveQuadratic.test.ts +0 -39
  705. package/src/math/polynomial/solveQuadratic.ts +0 -43
  706. package/src/math/rounding.test.ts +0 -65
  707. package/src/math/rounding.ts +0 -156
  708. package/src/math/shapes/Abstract2DShape.ts +0 -63
  709. package/src/math/shapes/BezierJSWrapper.ts +0 -93
  710. package/src/math/shapes/CubicBezier.ts +0 -35
  711. package/src/math/shapes/LineSegment2.test.ts +0 -99
  712. package/src/math/shapes/LineSegment2.ts +0 -231
  713. package/src/math/shapes/Path.fromString.test.ts +0 -223
  714. package/src/math/shapes/Path.test.ts +0 -309
  715. package/src/math/shapes/Path.toString.test.ts +0 -77
  716. package/src/math/shapes/Path.ts +0 -1027
  717. package/src/math/shapes/PointShape2D.ts +0 -33
  718. package/src/math/shapes/QuadraticBezier.test.ts +0 -31
  719. package/src/math/shapes/QuadraticBezier.ts +0 -141
  720. package/src/math/shapes/Rect2.test.ts +0 -209
  721. package/src/math/shapes/Rect2.ts +0 -344
  722. package/src/math/shapes/Triangle.test.ts +0 -61
  723. package/src/math/shapes/Triangle.ts +0 -139
  724. package/src/rendering/Display.ts +0 -248
  725. package/src/rendering/RenderingStyle.test.ts +0 -68
  726. package/src/rendering/RenderingStyle.ts +0 -55
  727. package/src/rendering/TextRenderingStyle.ts +0 -55
  728. package/src/rendering/caching/CacheRecord.test.ts +0 -49
  729. package/src/rendering/caching/CacheRecord.ts +0 -77
  730. package/src/rendering/caching/CacheRecordManager.ts +0 -71
  731. package/src/rendering/caching/RenderingCache.test.ts +0 -44
  732. package/src/rendering/caching/RenderingCache.ts +0 -66
  733. package/src/rendering/caching/RenderingCacheNode.ts +0 -405
  734. package/src/rendering/caching/testUtils.ts +0 -35
  735. package/src/rendering/caching/types.ts +0 -34
  736. package/src/rendering/lib.ts +0 -8
  737. package/src/rendering/localization.ts +0 -20
  738. package/src/rendering/renderers/AbstractRenderer.ts +0 -242
  739. package/src/rendering/renderers/CanvasRenderer.ts +0 -307
  740. package/src/rendering/renderers/DummyRenderer.test.ts +0 -42
  741. package/src/rendering/renderers/DummyRenderer.ts +0 -145
  742. package/src/rendering/renderers/SVGRenderer.ts +0 -377
  743. package/src/rendering/renderers/TextOnlyRenderer.test.ts +0 -34
  744. package/src/rendering/renderers/TextOnlyRenderer.ts +0 -71
  745. package/src/shortcuts/KeyBinding.test.ts +0 -51
  746. package/src/shortcuts/KeyBinding.ts +0 -218
  747. package/src/shortcuts/KeyboardShortcutManager.test.ts +0 -95
  748. package/src/shortcuts/KeyboardShortcutManager.ts +0 -163
  749. package/src/shortcuts/lib.ts +0 -3
  750. package/src/testing/createEditor.ts +0 -11
  751. package/src/testing/getUniquePointerId.ts +0 -18
  752. package/src/testing/lib.ts +0 -3
  753. package/src/testing/sendPenEvent.ts +0 -36
  754. package/src/testing/sendTouchEvent.ts +0 -71
  755. package/src/toolbar/HTMLToolbar.ts +0 -567
  756. package/src/toolbar/IconProvider.ts +0 -805
  757. package/src/toolbar/lib.ts +0 -4
  758. package/src/toolbar/localization.ts +0 -114
  759. package/src/toolbar/makeColorInput.ts +0 -159
  760. package/src/toolbar/types.ts +0 -5
  761. package/src/toolbar/widgets/ActionButtonWidget.ts +0 -39
  762. package/src/toolbar/widgets/BaseToolWidget.ts +0 -65
  763. package/src/toolbar/widgets/BaseWidget.ts +0 -428
  764. package/src/toolbar/widgets/DocumentPropertiesWidget.ts +0 -234
  765. package/src/toolbar/widgets/EraserToolWidget.ts +0 -85
  766. package/src/toolbar/widgets/HandToolWidget.ts +0 -250
  767. package/src/toolbar/widgets/InsertImageWidget.css +0 -44
  768. package/src/toolbar/widgets/InsertImageWidget.ts +0 -223
  769. package/src/toolbar/widgets/OverflowWidget.ts +0 -92
  770. package/src/toolbar/widgets/PenToolWidget.ts +0 -409
  771. package/src/toolbar/widgets/SelectionToolWidget.ts +0 -197
  772. package/src/toolbar/widgets/TextToolWidget.ts +0 -145
  773. package/src/toolbar/widgets/keybindings.ts +0 -21
  774. package/src/toolbar/widgets/lib.ts +0 -13
  775. package/src/tools/BaseTool.ts +0 -97
  776. package/src/tools/Eraser.test.ts +0 -103
  777. package/src/tools/Eraser.ts +0 -160
  778. package/src/tools/FindTool.ts +0 -153
  779. package/src/tools/PanZoom.test.ts +0 -349
  780. package/src/tools/PanZoom.ts +0 -502
  781. package/src/tools/PasteHandler.ts +0 -95
  782. package/src/tools/Pen.test.ts +0 -262
  783. package/src/tools/Pen.ts +0 -300
  784. package/src/tools/PipetteTool.ts +0 -55
  785. package/src/tools/SelectionTool/SelectAllShortcutHandler.ts +0 -29
  786. package/src/tools/SelectionTool/Selection.ts +0 -611
  787. package/src/tools/SelectionTool/SelectionHandle.ts +0 -108
  788. package/src/tools/SelectionTool/SelectionTool.test.ts +0 -261
  789. package/src/tools/SelectionTool/SelectionTool.ts +0 -496
  790. package/src/tools/SelectionTool/TransformMode.ts +0 -114
  791. package/src/tools/SelectionTool/types.ts +0 -11
  792. package/src/tools/SoundUITool.ts +0 -212
  793. package/src/tools/TextTool.ts +0 -340
  794. package/src/tools/ToolController.ts +0 -200
  795. package/src/tools/ToolEnabledGroup.ts +0 -14
  796. package/src/tools/ToolSwitcherShortcut.ts +0 -39
  797. package/src/tools/ToolbarShortcutHandler.ts +0 -39
  798. package/src/tools/UndoRedoShortcut.test.ts +0 -56
  799. package/src/tools/UndoRedoShortcut.ts +0 -24
  800. package/src/tools/keybindings.ts +0 -85
  801. package/src/tools/lib.ts +0 -22
  802. package/src/tools/localization.ts +0 -74
  803. package/src/tools/tools.css +0 -4
  804. package/src/types.ts +0 -239
  805. package/src/util/assertions.ts +0 -55
  806. package/src/util/fileToBase64.ts +0 -18
  807. package/src/util/untilNextAnimationFrame.ts +0 -9
  808. package/src/util/waitForAll.ts +0 -18
  809. package/src/util/waitForTimeout.ts +0 -9
  810. /package/dist/{cjs/Color4.test.d.ts → mjs/toolbar/widgets/layout/types.mjs} +0 -0
@@ -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
+ }