js-draw 0.18.1 → 0.19.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 (485) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/bundle.js +2 -2
  3. package/dist/bundledStyles.js +1 -0
  4. package/dist/cjs/src/Color4.d.ts +69 -0
  5. package/dist/cjs/src/Color4.js +264 -0
  6. package/dist/cjs/src/Editor.d.ts +308 -0
  7. package/dist/cjs/src/Editor.js +904 -0
  8. package/dist/cjs/src/EditorImage.d.ts +97 -0
  9. package/dist/cjs/src/EditorImage.js +486 -0
  10. package/dist/cjs/src/EventDispatcher.d.ts +30 -0
  11. package/dist/cjs/src/EventDispatcher.js +57 -0
  12. package/dist/cjs/src/Pointer.d.ts +24 -0
  13. package/dist/cjs/src/Pointer.js +84 -0
  14. package/dist/cjs/src/SVGLoader.d.ts +48 -0
  15. package/dist/cjs/src/SVGLoader.js +475 -0
  16. package/dist/cjs/src/UndoRedoHistory.d.ts +19 -0
  17. package/dist/cjs/src/UndoRedoHistory.js +93 -0
  18. package/dist/cjs/src/Viewport.d.ts +71 -0
  19. package/dist/cjs/src/Viewport.js +264 -0
  20. package/dist/cjs/src/bundle/bundled.d.ts +4 -0
  21. package/dist/cjs/src/bundle/bundled.js +24 -0
  22. package/dist/cjs/src/commands/Command.d.ts +16 -0
  23. package/dist/cjs/src/commands/Command.js +34 -0
  24. package/dist/cjs/src/commands/Duplicate.d.ts +14 -0
  25. package/dist/cjs/src/commands/Duplicate.js +39 -0
  26. package/dist/cjs/src/commands/Erase.d.ts +14 -0
  27. package/dist/cjs/src/commands/Erase.js +63 -0
  28. package/dist/cjs/src/commands/SerializableCommand.d.ts +12 -0
  29. package/dist/cjs/src/commands/SerializableCommand.js +42 -0
  30. package/dist/cjs/src/commands/UnresolvedCommand.d.ts +14 -0
  31. package/dist/cjs/src/commands/UnresolvedCommand.js +28 -0
  32. package/dist/cjs/src/commands/invertCommand.d.ts +4 -0
  33. package/dist/cjs/src/commands/invertCommand.js +49 -0
  34. package/dist/cjs/src/commands/lib.d.ts +7 -0
  35. package/dist/cjs/src/commands/lib.js +18 -0
  36. package/dist/cjs/src/commands/localization.d.ts +23 -0
  37. package/dist/cjs/src/commands/localization.js +24 -0
  38. package/dist/cjs/src/commands/uniteCommands.d.ts +4 -0
  39. package/dist/cjs/src/commands/uniteCommands.js +121 -0
  40. package/dist/cjs/src/components/AbstractComponent.d.ts +73 -0
  41. package/dist/cjs/src/components/AbstractComponent.js +258 -0
  42. package/dist/cjs/src/components/ImageBackground.d.ts +42 -0
  43. package/dist/cjs/src/components/ImageBackground.js +146 -0
  44. package/dist/cjs/src/components/ImageComponent.d.ts +31 -0
  45. package/dist/cjs/src/components/ImageComponent.js +152 -0
  46. package/dist/cjs/src/components/RestylableComponent.d.ts +43 -0
  47. package/dist/cjs/src/components/RestylableComponent.js +88 -0
  48. package/dist/cjs/src/components/SVGGlobalAttributesObject.d.ts +21 -0
  49. package/dist/cjs/src/components/SVGGlobalAttributesObject.js +65 -0
  50. package/dist/cjs/src/components/Stroke.d.ts +75 -0
  51. package/dist/cjs/src/components/Stroke.js +225 -0
  52. package/dist/cjs/src/components/TextComponent.d.ts +75 -0
  53. package/dist/cjs/src/components/TextComponent.js +280 -0
  54. package/dist/cjs/src/components/UnknownSVGObject.d.ts +18 -0
  55. package/dist/cjs/src/components/UnknownSVGObject.js +50 -0
  56. package/dist/cjs/src/components/builders/ArrowBuilder.d.ts +19 -0
  57. package/dist/cjs/src/components/builders/ArrowBuilder.js +117 -0
  58. package/dist/cjs/src/components/builders/FreehandLineBuilder.d.ts +33 -0
  59. package/dist/cjs/src/components/builders/FreehandLineBuilder.js +173 -0
  60. package/dist/cjs/src/components/builders/LineBuilder.d.ts +18 -0
  61. package/dist/cjs/src/components/builders/LineBuilder.js +89 -0
  62. package/dist/cjs/src/components/builders/PressureSensitiveFreehandLineBuilder.d.ts +36 -0
  63. package/dist/cjs/src/components/builders/PressureSensitiveFreehandLineBuilder.js +347 -0
  64. package/dist/cjs/src/components/builders/RectangleBuilder.d.ts +20 -0
  65. package/dist/cjs/src/components/builders/RectangleBuilder.js +59 -0
  66. package/dist/cjs/src/components/builders/types.d.ts +12 -0
  67. package/dist/cjs/src/components/builders/types.js +2 -0
  68. package/dist/cjs/src/components/lib.d.ts +13 -0
  69. package/dist/cjs/src/components/lib.js +43 -0
  70. package/dist/cjs/src/components/localization.d.ts +11 -0
  71. package/dist/cjs/src/components/localization.js +13 -0
  72. package/dist/cjs/src/components/util/StrokeSmoother.d.ts +35 -0
  73. package/dist/cjs/src/components/util/StrokeSmoother.js +217 -0
  74. package/dist/cjs/src/components/util/describeComponentList.d.ts +4 -0
  75. package/dist/cjs/src/components/util/describeComponentList.js +16 -0
  76. package/dist/cjs/src/lib.d.ts +64 -0
  77. package/dist/cjs/src/lib.js +93 -0
  78. package/dist/cjs/src/localization.d.ts +14 -0
  79. package/dist/cjs/src/localization.js +13 -0
  80. package/dist/cjs/src/localizations/de.d.ts +3 -0
  81. package/dist/cjs/src/localizations/de.js +6 -0
  82. package/dist/cjs/src/localizations/en.d.ts +3 -0
  83. package/dist/cjs/src/localizations/en.js +6 -0
  84. package/dist/cjs/src/localizations/es.d.ts +3 -0
  85. package/dist/cjs/src/localizations/es.js +20 -0
  86. package/dist/cjs/src/localizations/getLocalizationTable.d.ts +3 -0
  87. package/dist/cjs/src/localizations/getLocalizationTable.js +50 -0
  88. package/dist/cjs/src/math/LineSegment2.d.ts +24 -0
  89. package/dist/cjs/src/math/LineSegment2.js +131 -0
  90. package/dist/cjs/src/math/Mat33.d.ts +118 -0
  91. package/dist/cjs/src/math/Mat33.js +332 -0
  92. package/dist/cjs/src/math/Path.d.ts +71 -0
  93. package/dist/cjs/src/math/Path.js +655 -0
  94. package/dist/cjs/src/math/Rect2.d.ts +52 -0
  95. package/dist/cjs/src/math/Rect2.js +234 -0
  96. package/dist/cjs/src/math/Triangle.d.ts +11 -0
  97. package/dist/cjs/src/math/Triangle.js +22 -0
  98. package/dist/cjs/src/math/Vec2.d.ts +13 -0
  99. package/dist/cjs/src/math/Vec2.js +19 -0
  100. package/dist/cjs/src/math/Vec3.d.ts +106 -0
  101. package/dist/cjs/src/math/Vec3.js +177 -0
  102. package/dist/cjs/src/math/lib.d.ts +7 -0
  103. package/dist/cjs/src/math/lib.js +18 -0
  104. package/dist/cjs/src/math/rounding.d.ts +4 -0
  105. package/dist/cjs/src/math/rounding.js +135 -0
  106. package/dist/cjs/src/rendering/Display.d.ts +75 -0
  107. package/dist/cjs/src/rendering/Display.js +214 -0
  108. package/dist/cjs/src/rendering/RenderingStyle.d.ts +31 -0
  109. package/dist/cjs/src/rendering/RenderingStyle.js +48 -0
  110. package/dist/cjs/src/rendering/TextRenderingStyle.d.ts +36 -0
  111. package/dist/cjs/src/rendering/TextRenderingStyle.js +29 -0
  112. package/dist/cjs/src/rendering/caching/CacheRecord.d.ts +20 -0
  113. package/dist/cjs/src/rendering/caching/CacheRecord.js +61 -0
  114. package/dist/cjs/src/rendering/caching/CacheRecordManager.d.ts +12 -0
  115. package/dist/cjs/src/rendering/caching/CacheRecordManager.js +50 -0
  116. package/dist/cjs/src/rendering/caching/RenderingCache.d.ts +11 -0
  117. package/dist/cjs/src/rendering/caching/RenderingCache.js +51 -0
  118. package/dist/cjs/src/rendering/caching/RenderingCacheNode.d.ts +29 -0
  119. package/dist/cjs/src/rendering/caching/RenderingCacheNode.js +326 -0
  120. package/dist/cjs/src/rendering/caching/testUtils.d.ts +9 -0
  121. package/dist/cjs/src/rendering/caching/testUtils.js +27 -0
  122. package/dist/cjs/src/rendering/caching/types.d.ts +19 -0
  123. package/dist/cjs/src/rendering/caching/types.js +2 -0
  124. package/dist/cjs/src/rendering/lib.d.ts +7 -0
  125. package/dist/cjs/src/rendering/lib.js +17 -0
  126. package/dist/cjs/src/rendering/localization.d.ts +10 -0
  127. package/dist/cjs/src/rendering/localization.js +12 -0
  128. package/dist/cjs/src/rendering/renderers/AbstractRenderer.d.ts +68 -0
  129. package/dist/cjs/src/rendering/renderers/AbstractRenderer.js +170 -0
  130. package/dist/cjs/src/rendering/renderers/CanvasRenderer.d.ts +63 -0
  131. package/dist/cjs/src/rendering/renderers/CanvasRenderer.js +236 -0
  132. package/dist/cjs/src/rendering/renderers/DummyRenderer.d.ts +35 -0
  133. package/dist/cjs/src/rendering/renderers/DummyRenderer.js +112 -0
  134. package/dist/cjs/src/rendering/renderers/SVGRenderer.d.ts +57 -0
  135. package/dist/cjs/src/rendering/renderers/SVGRenderer.js +311 -0
  136. package/dist/cjs/src/rendering/renderers/TextOnlyRenderer.d.ts +29 -0
  137. package/dist/cjs/src/rendering/renderers/TextOnlyRenderer.js +63 -0
  138. package/dist/cjs/src/testing/beforeEachFile.d.ts +1 -0
  139. package/dist/cjs/src/testing/beforeEachFile.js +12 -0
  140. package/dist/cjs/src/testing/createEditor.d.ts +4 -0
  141. package/dist/cjs/src/testing/createEditor.js +14 -0
  142. package/dist/cjs/src/testing/lib.d.ts +2 -0
  143. package/dist/cjs/src/testing/lib.js +10 -0
  144. package/dist/cjs/src/testing/loadExpectExtensions.d.ts +2 -0
  145. package/dist/cjs/src/testing/loadExpectExtensions.js +28 -0
  146. package/dist/cjs/src/testing/sendPenEvent.d.ts +12 -0
  147. package/dist/cjs/src/testing/sendPenEvent.js +24 -0
  148. package/dist/cjs/src/testing/sendTouchEvent.d.ts +42 -0
  149. package/dist/cjs/src/testing/sendTouchEvent.js +87 -0
  150. package/dist/cjs/src/toolbar/HTMLToolbar.d.ts +103 -0
  151. package/dist/cjs/src/toolbar/HTMLToolbar.js +383 -0
  152. package/dist/cjs/src/toolbar/IconProvider.d.ts +62 -0
  153. package/dist/cjs/src/toolbar/IconProvider.js +660 -0
  154. package/dist/cjs/src/toolbar/lib.d.ts +3 -0
  155. package/dist/cjs/src/toolbar/lib.js +24 -0
  156. package/dist/cjs/src/toolbar/localization.d.ts +49 -0
  157. package/dist/cjs/src/toolbar/localization.js +51 -0
  158. package/dist/cjs/src/toolbar/makeColorInput.d.ts +6 -0
  159. package/dist/cjs/src/toolbar/makeColorInput.js +120 -0
  160. package/dist/cjs/src/toolbar/types.d.ts +4 -0
  161. package/dist/cjs/src/toolbar/types.js +2 -0
  162. package/dist/cjs/src/toolbar/widgets/ActionButtonWidget.d.ts +15 -0
  163. package/dist/cjs/src/toolbar/widgets/ActionButtonWidget.js +31 -0
  164. package/dist/cjs/src/toolbar/widgets/BaseToolWidget.d.ts +11 -0
  165. package/dist/cjs/src/toolbar/widgets/BaseToolWidget.js +50 -0
  166. package/dist/cjs/src/toolbar/widgets/BaseWidget.d.ts +72 -0
  167. package/dist/cjs/src/toolbar/widgets/BaseWidget.js +313 -0
  168. package/dist/cjs/src/toolbar/widgets/DocumentPropertiesWidget.d.ts +18 -0
  169. package/dist/cjs/src/toolbar/widgets/DocumentPropertiesWidget.js +126 -0
  170. package/dist/cjs/src/toolbar/widgets/EraserToolWidget.d.ts +17 -0
  171. package/dist/cjs/src/toolbar/widgets/EraserToolWidget.js +63 -0
  172. package/dist/cjs/src/toolbar/widgets/HandToolWidget.d.ts +17 -0
  173. package/dist/cjs/src/toolbar/widgets/HandToolWidget.js +201 -0
  174. package/dist/cjs/src/toolbar/widgets/InsertImageWidget.d.ts +19 -0
  175. package/dist/cjs/src/toolbar/widgets/InsertImageWidget.js +176 -0
  176. package/dist/cjs/src/toolbar/widgets/OverflowWidget.d.ts +25 -0
  177. package/dist/cjs/src/toolbar/widgets/OverflowWidget.js +77 -0
  178. package/dist/cjs/src/toolbar/widgets/PenToolWidget.d.ts +27 -0
  179. package/dist/cjs/src/toolbar/widgets/PenToolWidget.js +226 -0
  180. package/dist/cjs/src/toolbar/widgets/SelectionToolWidget.d.ts +13 -0
  181. package/dist/cjs/src/toolbar/widgets/SelectionToolWidget.js +153 -0
  182. package/dist/cjs/src/toolbar/widgets/TextToolWidget.d.ts +16 -0
  183. package/dist/cjs/src/toolbar/widgets/TextToolWidget.js +115 -0
  184. package/dist/cjs/src/toolbar/widgets/lib.d.ts +10 -0
  185. package/dist/cjs/src/toolbar/widgets/lib.js +26 -0
  186. package/dist/cjs/src/tools/BaseTool.d.ts +22 -0
  187. package/dist/cjs/src/tools/BaseTool.js +66 -0
  188. package/dist/cjs/src/tools/Eraser.d.ts +23 -0
  189. package/dist/cjs/src/tools/Eraser.js +112 -0
  190. package/dist/cjs/src/tools/FindTool.d.ts +21 -0
  191. package/dist/cjs/src/tools/FindTool.js +121 -0
  192. package/dist/cjs/src/tools/PanZoom.d.ts +52 -0
  193. package/dist/cjs/src/tools/PanZoom.js +421 -0
  194. package/dist/cjs/src/tools/PasteHandler.d.ts +23 -0
  195. package/dist/cjs/src/tools/PasteHandler.js +99 -0
  196. package/dist/cjs/src/tools/Pen.d.ts +39 -0
  197. package/dist/cjs/src/tools/Pen.js +179 -0
  198. package/dist/cjs/src/tools/PipetteTool.d.ts +18 -0
  199. package/dist/cjs/src/tools/PipetteTool.js +45 -0
  200. package/dist/cjs/src/tools/SelectionTool/SelectAllShortcutHandler.d.ts +8 -0
  201. package/dist/cjs/src/tools/SelectionTool/SelectAllShortcutHandler.js +28 -0
  202. package/dist/cjs/src/tools/SelectionTool/Selection.d.ts +64 -0
  203. package/dist/cjs/src/tools/SelectionTool/Selection.js +488 -0
  204. package/dist/cjs/src/tools/SelectionTool/SelectionHandle.d.ts +38 -0
  205. package/dist/cjs/src/tools/SelectionTool/SelectionHandle.js +85 -0
  206. package/dist/cjs/src/tools/SelectionTool/SelectionTool.d.ts +36 -0
  207. package/dist/cjs/src/tools/SelectionTool/SelectionTool.js +405 -0
  208. package/dist/cjs/src/tools/SelectionTool/TransformMode.d.ts +34 -0
  209. package/dist/cjs/src/tools/SelectionTool/TransformMode.js +107 -0
  210. package/dist/cjs/src/tools/SelectionTool/types.d.ts +9 -0
  211. package/dist/cjs/src/tools/SelectionTool/types.js +14 -0
  212. package/dist/cjs/src/tools/SoundUITool.d.ts +24 -0
  213. package/dist/cjs/src/tools/SoundUITool.js +164 -0
  214. package/dist/cjs/src/tools/TextTool.d.ts +33 -0
  215. package/dist/cjs/src/tools/TextTool.js +262 -0
  216. package/dist/cjs/src/tools/ToolController.d.ts +18 -0
  217. package/dist/cjs/src/tools/ToolController.js +192 -0
  218. package/dist/cjs/src/tools/ToolEnabledGroup.d.ts +6 -0
  219. package/dist/cjs/src/tools/ToolEnabledGroup.js +14 -0
  220. package/dist/cjs/src/tools/ToolSwitcherShortcut.d.ts +16 -0
  221. package/dist/cjs/src/tools/ToolSwitcherShortcut.js +38 -0
  222. package/dist/cjs/src/tools/ToolbarShortcutHandler.d.ts +12 -0
  223. package/dist/cjs/src/tools/ToolbarShortcutHandler.js +29 -0
  224. package/dist/cjs/src/tools/UndoRedoShortcut.d.ts +8 -0
  225. package/dist/cjs/src/tools/UndoRedoShortcut.js +28 -0
  226. package/dist/cjs/src/tools/lib.d.ts +17 -0
  227. package/dist/cjs/src/tools/lib.js +38 -0
  228. package/dist/cjs/src/tools/localization.d.ts +31 -0
  229. package/dist/cjs/src/tools/localization.js +33 -0
  230. package/dist/cjs/src/types.d.ts +151 -0
  231. package/dist/cjs/src/types.js +38 -0
  232. package/dist/cjs/src/util/assertions.d.ts +23 -0
  233. package/dist/cjs/src/util/assertions.js +51 -0
  234. package/dist/cjs/src/util/fileToBase64.d.ts +3 -0
  235. package/dist/cjs/src/util/fileToBase64.js +15 -0
  236. package/dist/cjs/src/util/untilNextAnimationFrame.d.ts +3 -0
  237. package/dist/cjs/src/util/untilNextAnimationFrame.js +9 -0
  238. package/dist/cjs/src/util/waitForTimeout.d.ts +2 -0
  239. package/dist/cjs/src/util/waitForTimeout.js +9 -0
  240. package/dist/mjs/src/Color4.d.ts +69 -0
  241. package/dist/mjs/src/Color4.mjs +257 -0
  242. package/dist/mjs/src/Editor.d.ts +308 -0
  243. package/dist/mjs/src/Editor.mjs +874 -0
  244. package/dist/mjs/src/EditorImage.d.ts +97 -0
  245. package/dist/mjs/src/EditorImage.mjs +477 -0
  246. package/dist/mjs/src/EventDispatcher.d.ts +30 -0
  247. package/dist/mjs/src/EventDispatcher.mjs +54 -0
  248. package/dist/mjs/src/Pointer.d.ts +24 -0
  249. package/dist/mjs/src/Pointer.mjs +80 -0
  250. package/dist/mjs/src/SVGLoader.d.ts +48 -0
  251. package/dist/mjs/src/SVGLoader.mjs +445 -0
  252. package/dist/mjs/src/UndoRedoHistory.d.ts +19 -0
  253. package/dist/mjs/src/UndoRedoHistory.mjs +91 -0
  254. package/dist/mjs/src/Viewport.d.ts +71 -0
  255. package/dist/mjs/src/Viewport.mjs +256 -0
  256. package/dist/mjs/src/bundle/bundled.d.ts +4 -0
  257. package/dist/mjs/src/bundle/bundled.mjs +5 -0
  258. package/dist/mjs/src/commands/Command.d.ts +16 -0
  259. package/dist/mjs/src/commands/Command.mjs +30 -0
  260. package/dist/mjs/src/commands/Duplicate.d.ts +14 -0
  261. package/dist/mjs/src/commands/Duplicate.mjs +33 -0
  262. package/dist/mjs/src/commands/Erase.d.ts +14 -0
  263. package/dist/mjs/src/commands/Erase.mjs +57 -0
  264. package/dist/mjs/src/commands/SerializableCommand.d.ts +12 -0
  265. package/dist/mjs/src/commands/SerializableCommand.mjs +36 -0
  266. package/dist/mjs/src/commands/UnresolvedCommand.d.ts +14 -0
  267. package/dist/mjs/src/commands/UnresolvedCommand.mjs +22 -0
  268. package/dist/mjs/src/commands/invertCommand.d.ts +4 -0
  269. package/dist/mjs/src/commands/invertCommand.mjs +44 -0
  270. package/dist/mjs/src/commands/lib.d.ts +7 -0
  271. package/dist/mjs/src/commands/lib.mjs +7 -0
  272. package/dist/mjs/src/commands/localization.d.ts +23 -0
  273. package/dist/mjs/src/commands/localization.mjs +21 -0
  274. package/dist/mjs/src/commands/uniteCommands.d.ts +4 -0
  275. package/dist/mjs/src/commands/uniteCommands.mjs +116 -0
  276. package/dist/mjs/src/components/AbstractComponent.d.ts +73 -0
  277. package/dist/mjs/src/components/AbstractComponent.mjs +252 -0
  278. package/dist/mjs/src/components/ImageBackground.d.ts +42 -0
  279. package/dist/mjs/src/components/ImageBackground.mjs +139 -0
  280. package/dist/mjs/src/components/ImageComponent.d.ts +31 -0
  281. package/dist/mjs/src/components/ImageComponent.mjs +146 -0
  282. package/dist/mjs/src/components/RestylableComponent.d.ts +43 -0
  283. package/dist/mjs/src/components/RestylableComponent.mjs +80 -0
  284. package/dist/mjs/src/components/SVGGlobalAttributesObject.d.ts +21 -0
  285. package/dist/mjs/src/components/SVGGlobalAttributesObject.mjs +59 -0
  286. package/dist/mjs/src/components/Stroke.d.ts +75 -0
  287. package/dist/mjs/src/components/Stroke.mjs +219 -0
  288. package/dist/mjs/src/components/TextComponent.d.ts +75 -0
  289. package/dist/mjs/src/components/TextComponent.mjs +274 -0
  290. package/dist/mjs/src/components/UnknownSVGObject.d.ts +18 -0
  291. package/dist/mjs/src/components/UnknownSVGObject.mjs +44 -0
  292. package/dist/mjs/src/components/builders/ArrowBuilder.d.ts +19 -0
  293. package/dist/mjs/src/components/builders/ArrowBuilder.mjs +86 -0
  294. package/dist/mjs/src/components/builders/FreehandLineBuilder.d.ts +33 -0
  295. package/dist/mjs/src/components/builders/FreehandLineBuilder.mjs +165 -0
  296. package/dist/mjs/src/components/builders/LineBuilder.d.ts +18 -0
  297. package/dist/mjs/src/components/builders/LineBuilder.mjs +58 -0
  298. package/dist/mjs/src/components/builders/PressureSensitiveFreehandLineBuilder.d.ts +36 -0
  299. package/dist/mjs/src/components/builders/PressureSensitiveFreehandLineBuilder.mjs +339 -0
  300. package/dist/mjs/src/components/builders/RectangleBuilder.d.ts +20 -0
  301. package/dist/mjs/src/components/builders/RectangleBuilder.mjs +50 -0
  302. package/dist/mjs/src/components/builders/types.d.ts +12 -0
  303. package/dist/mjs/src/components/builders/types.mjs +1 -0
  304. package/dist/mjs/src/components/lib.d.ts +13 -0
  305. package/dist/mjs/src/components/lib.mjs +12 -0
  306. package/dist/mjs/src/components/localization.d.ts +11 -0
  307. package/dist/mjs/src/components/localization.mjs +10 -0
  308. package/dist/mjs/src/components/util/StrokeSmoother.d.ts +35 -0
  309. package/dist/mjs/src/components/util/StrokeSmoother.mjs +210 -0
  310. package/dist/mjs/src/components/util/describeComponentList.d.ts +4 -0
  311. package/dist/mjs/src/components/util/describeComponentList.mjs +14 -0
  312. package/dist/mjs/src/lib.d.ts +64 -0
  313. package/dist/mjs/src/lib.mjs +64 -0
  314. package/dist/mjs/src/localization.d.ts +14 -0
  315. package/dist/mjs/src/localization.mjs +10 -0
  316. package/dist/mjs/src/localizations/de.d.ts +3 -0
  317. package/dist/mjs/src/localizations/de.mjs +4 -0
  318. package/dist/mjs/src/localizations/en.d.ts +3 -0
  319. package/dist/mjs/src/localizations/en.mjs +4 -0
  320. package/dist/mjs/src/localizations/es.d.ts +3 -0
  321. package/dist/mjs/src/localizations/es.mjs +18 -0
  322. package/dist/mjs/src/localizations/getLocalizationTable.d.ts +3 -0
  323. package/dist/mjs/src/localizations/getLocalizationTable.mjs +45 -0
  324. package/dist/mjs/src/math/LineSegment2.d.ts +24 -0
  325. package/dist/mjs/src/math/LineSegment2.mjs +125 -0
  326. package/dist/mjs/src/math/Mat33.d.ts +118 -0
  327. package/dist/mjs/src/math/Mat33.mjs +326 -0
  328. package/dist/mjs/src/math/Path.d.ts +71 -0
  329. package/dist/mjs/src/math/Path.mjs +648 -0
  330. package/dist/mjs/src/math/Rect2.d.ts +52 -0
  331. package/dist/mjs/src/math/Rect2.mjs +228 -0
  332. package/dist/mjs/src/math/Triangle.d.ts +11 -0
  333. package/dist/mjs/src/math/Triangle.mjs +19 -0
  334. package/dist/mjs/src/math/Vec2.d.ts +13 -0
  335. package/dist/mjs/src/math/Vec2.mjs +13 -0
  336. package/dist/mjs/src/math/Vec3.d.ts +106 -0
  337. package/dist/mjs/src/math/Vec3.mjs +174 -0
  338. package/dist/mjs/src/math/lib.d.ts +7 -0
  339. package/dist/mjs/src/math/lib.mjs +7 -0
  340. package/dist/mjs/src/math/rounding.d.ts +4 -0
  341. package/dist/mjs/src/math/rounding.mjs +128 -0
  342. package/dist/mjs/src/rendering/Display.d.ts +75 -0
  343. package/dist/mjs/src/rendering/Display.mjs +207 -0
  344. package/dist/mjs/src/rendering/RenderingStyle.d.ts +31 -0
  345. package/dist/mjs/src/rendering/RenderingStyle.mjs +38 -0
  346. package/dist/mjs/src/rendering/TextRenderingStyle.d.ts +36 -0
  347. package/dist/mjs/src/rendering/TextRenderingStyle.mjs +23 -0
  348. package/dist/mjs/src/rendering/caching/CacheRecord.d.ts +20 -0
  349. package/dist/mjs/src/rendering/caching/CacheRecord.mjs +55 -0
  350. package/dist/mjs/src/rendering/caching/CacheRecordManager.d.ts +12 -0
  351. package/dist/mjs/src/rendering/caching/CacheRecordManager.mjs +43 -0
  352. package/dist/mjs/src/rendering/caching/RenderingCache.d.ts +11 -0
  353. package/dist/mjs/src/rendering/caching/RenderingCache.mjs +45 -0
  354. package/dist/mjs/src/rendering/caching/RenderingCacheNode.d.ts +29 -0
  355. package/dist/mjs/src/rendering/caching/RenderingCacheNode.mjs +320 -0
  356. package/dist/mjs/src/rendering/caching/testUtils.d.ts +9 -0
  357. package/dist/mjs/src/rendering/caching/testUtils.mjs +20 -0
  358. package/dist/mjs/src/rendering/caching/types.d.ts +19 -0
  359. package/dist/mjs/src/rendering/caching/types.mjs +1 -0
  360. package/dist/mjs/src/rendering/lib.d.ts +7 -0
  361. package/dist/mjs/src/rendering/lib.mjs +5 -0
  362. package/dist/mjs/src/rendering/localization.d.ts +10 -0
  363. package/dist/mjs/src/rendering/localization.mjs +9 -0
  364. package/dist/mjs/src/rendering/renderers/AbstractRenderer.d.ts +68 -0
  365. package/dist/mjs/src/rendering/renderers/AbstractRenderer.mjs +144 -0
  366. package/dist/mjs/src/rendering/renderers/CanvasRenderer.d.ts +63 -0
  367. package/dist/mjs/src/rendering/renderers/CanvasRenderer.mjs +230 -0
  368. package/dist/mjs/src/rendering/renderers/DummyRenderer.d.ts +35 -0
  369. package/dist/mjs/src/rendering/renderers/DummyRenderer.mjs +106 -0
  370. package/dist/mjs/src/rendering/renderers/SVGRenderer.d.ts +57 -0
  371. package/dist/mjs/src/rendering/renderers/SVGRenderer.mjs +304 -0
  372. package/dist/mjs/src/rendering/renderers/TextOnlyRenderer.d.ts +29 -0
  373. package/dist/mjs/src/rendering/renderers/TextOnlyRenderer.mjs +57 -0
  374. package/dist/mjs/src/testing/beforeEachFile.d.ts +1 -0
  375. package/dist/mjs/src/testing/beforeEachFile.mjs +7 -0
  376. package/dist/mjs/src/testing/createEditor.d.ts +4 -0
  377. package/dist/mjs/src/testing/createEditor.mjs +9 -0
  378. package/dist/mjs/src/testing/lib.d.ts +2 -0
  379. package/dist/mjs/src/testing/lib.mjs +2 -0
  380. package/dist/mjs/src/testing/loadExpectExtensions.d.ts +2 -0
  381. package/dist/mjs/src/testing/loadExpectExtensions.mjs +24 -0
  382. package/dist/mjs/src/testing/sendPenEvent.d.ts +12 -0
  383. package/dist/mjs/src/testing/sendPenEvent.mjs +19 -0
  384. package/dist/mjs/src/testing/sendTouchEvent.d.ts +42 -0
  385. package/dist/mjs/src/testing/sendTouchEvent.mjs +62 -0
  386. package/dist/mjs/src/toolbar/HTMLToolbar.d.ts +103 -0
  387. package/dist/mjs/src/toolbar/HTMLToolbar.mjs +376 -0
  388. package/dist/mjs/src/toolbar/IconProvider.d.ts +62 -0
  389. package/dist/mjs/src/toolbar/IconProvider.mjs +654 -0
  390. package/dist/mjs/src/toolbar/lib.d.ts +3 -0
  391. package/dist/mjs/src/toolbar/lib.mjs +3 -0
  392. package/dist/mjs/src/toolbar/localization.d.ts +49 -0
  393. package/dist/mjs/src/toolbar/localization.mjs +48 -0
  394. package/dist/mjs/src/toolbar/makeColorInput.d.ts +6 -0
  395. package/dist/mjs/src/toolbar/makeColorInput.mjs +113 -0
  396. package/dist/mjs/src/toolbar/types.d.ts +4 -0
  397. package/dist/mjs/src/toolbar/types.mjs +1 -0
  398. package/dist/mjs/src/toolbar/widgets/ActionButtonWidget.d.ts +15 -0
  399. package/dist/mjs/src/toolbar/widgets/ActionButtonWidget.mjs +25 -0
  400. package/dist/mjs/src/toolbar/widgets/BaseToolWidget.d.ts +11 -0
  401. package/dist/mjs/src/toolbar/widgets/BaseToolWidget.mjs +44 -0
  402. package/dist/mjs/src/toolbar/widgets/BaseWidget.d.ts +72 -0
  403. package/dist/mjs/src/toolbar/widgets/BaseWidget.mjs +307 -0
  404. package/dist/mjs/src/toolbar/widgets/DocumentPropertiesWidget.d.ts +18 -0
  405. package/dist/mjs/src/toolbar/widgets/DocumentPropertiesWidget.mjs +120 -0
  406. package/dist/mjs/src/toolbar/widgets/EraserToolWidget.d.ts +17 -0
  407. package/dist/mjs/src/toolbar/widgets/EraserToolWidget.mjs +57 -0
  408. package/dist/mjs/src/toolbar/widgets/HandToolWidget.d.ts +17 -0
  409. package/dist/mjs/src/toolbar/widgets/HandToolWidget.mjs +172 -0
  410. package/dist/mjs/src/toolbar/widgets/InsertImageWidget.d.ts +19 -0
  411. package/dist/mjs/src/toolbar/widgets/InsertImageWidget.mjs +170 -0
  412. package/dist/mjs/src/toolbar/widgets/OverflowWidget.d.ts +25 -0
  413. package/dist/mjs/src/toolbar/widgets/OverflowWidget.mjs +71 -0
  414. package/dist/mjs/src/toolbar/widgets/PenToolWidget.d.ts +27 -0
  415. package/dist/mjs/src/toolbar/widgets/PenToolWidget.mjs +220 -0
  416. package/dist/mjs/src/toolbar/widgets/SelectionToolWidget.d.ts +13 -0
  417. package/dist/mjs/src/toolbar/widgets/SelectionToolWidget.mjs +147 -0
  418. package/dist/mjs/src/toolbar/widgets/TextToolWidget.d.ts +16 -0
  419. package/dist/mjs/src/toolbar/widgets/TextToolWidget.mjs +109 -0
  420. package/dist/mjs/src/toolbar/widgets/lib.d.ts +10 -0
  421. package/dist/mjs/src/toolbar/widgets/lib.mjs +10 -0
  422. package/dist/mjs/src/tools/BaseTool.d.ts +22 -0
  423. package/dist/mjs/src/tools/BaseTool.mjs +63 -0
  424. package/dist/mjs/src/tools/Eraser.d.ts +23 -0
  425. package/dist/mjs/src/tools/Eraser.mjs +106 -0
  426. package/dist/mjs/src/tools/FindTool.d.ts +21 -0
  427. package/dist/mjs/src/tools/FindTool.mjs +114 -0
  428. package/dist/mjs/src/tools/PanZoom.d.ts +52 -0
  429. package/dist/mjs/src/tools/PanZoom.mjs +414 -0
  430. package/dist/mjs/src/tools/PasteHandler.d.ts +23 -0
  431. package/dist/mjs/src/tools/PasteHandler.mjs +93 -0
  432. package/dist/mjs/src/tools/Pen.d.ts +39 -0
  433. package/dist/mjs/src/tools/Pen.mjs +173 -0
  434. package/dist/mjs/src/tools/PipetteTool.d.ts +18 -0
  435. package/dist/mjs/src/tools/PipetteTool.mjs +39 -0
  436. package/dist/mjs/src/tools/SelectionTool/SelectAllShortcutHandler.d.ts +8 -0
  437. package/dist/mjs/src/tools/SelectionTool/SelectAllShortcutHandler.mjs +22 -0
  438. package/dist/mjs/src/tools/SelectionTool/Selection.d.ts +64 -0
  439. package/dist/mjs/src/tools/SelectionTool/Selection.mjs +459 -0
  440. package/dist/mjs/src/tools/SelectionTool/SelectionHandle.d.ts +38 -0
  441. package/dist/mjs/src/tools/SelectionTool/SelectionHandle.mjs +81 -0
  442. package/dist/mjs/src/tools/SelectionTool/SelectionTool.d.ts +36 -0
  443. package/dist/mjs/src/tools/SelectionTool/SelectionTool.mjs +398 -0
  444. package/dist/mjs/src/tools/SelectionTool/TransformMode.d.ts +34 -0
  445. package/dist/mjs/src/tools/SelectionTool/TransformMode.mjs +98 -0
  446. package/dist/mjs/src/tools/SelectionTool/types.d.ts +9 -0
  447. package/dist/mjs/src/tools/SelectionTool/types.mjs +11 -0
  448. package/dist/mjs/src/tools/SoundUITool.d.ts +24 -0
  449. package/dist/mjs/src/tools/SoundUITool.mjs +158 -0
  450. package/dist/mjs/src/tools/TextTool.d.ts +33 -0
  451. package/dist/mjs/src/tools/TextTool.mjs +256 -0
  452. package/dist/mjs/src/tools/ToolController.d.ts +18 -0
  453. package/dist/mjs/src/tools/ToolController.mjs +163 -0
  454. package/dist/mjs/src/tools/ToolEnabledGroup.d.ts +6 -0
  455. package/dist/mjs/src/tools/ToolEnabledGroup.mjs +11 -0
  456. package/dist/mjs/src/tools/ToolSwitcherShortcut.d.ts +16 -0
  457. package/dist/mjs/src/tools/ToolSwitcherShortcut.mjs +32 -0
  458. package/dist/mjs/src/tools/ToolbarShortcutHandler.d.ts +12 -0
  459. package/dist/mjs/src/tools/ToolbarShortcutHandler.mjs +23 -0
  460. package/dist/mjs/src/tools/UndoRedoShortcut.d.ts +8 -0
  461. package/dist/mjs/src/tools/UndoRedoShortcut.mjs +22 -0
  462. package/dist/mjs/src/tools/lib.d.ts +17 -0
  463. package/dist/mjs/src/tools/lib.mjs +17 -0
  464. package/dist/mjs/src/tools/localization.d.ts +31 -0
  465. package/dist/mjs/src/tools/localization.mjs +30 -0
  466. package/dist/mjs/src/types.d.ts +151 -0
  467. package/dist/mjs/src/types.mjs +35 -0
  468. package/dist/mjs/src/util/assertions.d.ts +23 -0
  469. package/dist/mjs/src/util/assertions.mjs +45 -0
  470. package/dist/mjs/src/util/fileToBase64.d.ts +3 -0
  471. package/dist/mjs/src/util/fileToBase64.mjs +13 -0
  472. package/dist/mjs/src/util/untilNextAnimationFrame.d.ts +3 -0
  473. package/dist/mjs/src/util/untilNextAnimationFrame.mjs +7 -0
  474. package/dist/mjs/src/util/waitForTimeout.d.ts +2 -0
  475. package/dist/mjs/src/util/waitForTimeout.mjs +7 -0
  476. package/package.json +6 -4
  477. package/src/Editor.css +86 -0
  478. package/src/styles.js +7 -0
  479. package/src/toolbar/toolbar.css +213 -0
  480. package/src/toolbar/widgets/InsertImageWidget.css +44 -0
  481. package/src/toolbar/widgets/OverflowWidget.css +27 -0
  482. package/src/tools/FindTool.css +7 -0
  483. package/src/tools/SelectionTool/SelectionTool.css +23 -0
  484. package/src/tools/SoundUITool.css +15 -0
  485. package/src/tools/tools.css +4 -0
@@ -0,0 +1,22 @@
1
+ import SerializableCommand from './SerializableCommand.mjs';
2
+ /**
3
+ * A command that requires a component that may or may not be present in the editor when
4
+ * the command is created.
5
+ */
6
+ export default class UnresolvedSerializableCommand extends SerializableCommand {
7
+ constructor(commandId, componentID, component) {
8
+ super(commandId);
9
+ this.component = component !== null && component !== void 0 ? component : null;
10
+ this.componentID = componentID;
11
+ }
12
+ resolveComponent(image) {
13
+ if (this.component) {
14
+ return;
15
+ }
16
+ const component = image.lookupElement(this.componentID);
17
+ if (!component) {
18
+ throw new Error(`Unable to resolve component with ID ${this.componentID}`);
19
+ }
20
+ this.component = component;
21
+ }
22
+ }
@@ -0,0 +1,4 @@
1
+ import Command from './Command';
2
+ import SerializableCommand from './SerializableCommand';
3
+ declare const invertCommand: <T extends Command>(command: T) => T extends SerializableCommand ? SerializableCommand : Command;
4
+ export default invertCommand;
@@ -0,0 +1,44 @@
1
+ import Command from './Command.mjs';
2
+ import SerializableCommand from './SerializableCommand.mjs';
3
+ // Returns a command that does the opposite of the given command --- `result.apply()` calls
4
+ // `command.unapply()` and `result.unapply()` calls `command.apply()`.
5
+ const invertCommand = (command) => {
6
+ if (command instanceof SerializableCommand) {
7
+ // SerializableCommand that does the inverse of [command]
8
+ return new class extends SerializableCommand {
9
+ serializeToJSON() {
10
+ return command.serialize();
11
+ }
12
+ apply(editor) {
13
+ command.unapply(editor);
14
+ }
15
+ unapply(editor) {
16
+ command.unapply(editor);
17
+ }
18
+ description(editor, localizationTable) {
19
+ return localizationTable.inverseOf(command.description(editor, localizationTable));
20
+ }
21
+ }('inverse');
22
+ }
23
+ else {
24
+ // Command that does the inverse of [command].
25
+ const result = new class extends Command {
26
+ apply(editor) {
27
+ command.unapply(editor);
28
+ }
29
+ unapply(editor) {
30
+ command.apply(editor);
31
+ }
32
+ description(editor, localizationTable) {
33
+ return localizationTable.inverseOf(command.description(editor, localizationTable));
34
+ }
35
+ };
36
+ // We know that T does not extend SerializableCommand, and thus returning a Command
37
+ // is appropriate.
38
+ return result;
39
+ }
40
+ };
41
+ SerializableCommand.register('inverse', (data, editor) => {
42
+ return invertCommand(SerializableCommand.deserialize(data, editor));
43
+ });
44
+ export default invertCommand;
@@ -0,0 +1,7 @@
1
+ import Command from './Command';
2
+ import Duplicate from './Duplicate';
3
+ import Erase from './Erase';
4
+ import invertCommand from './invertCommand';
5
+ import SerializableCommand from './SerializableCommand';
6
+ import uniteCommands from './uniteCommands';
7
+ export { Command, Duplicate, Erase, SerializableCommand, invertCommand, uniteCommands, };
@@ -0,0 +1,7 @@
1
+ import Command from './Command.mjs';
2
+ import Duplicate from './Duplicate.mjs';
3
+ import Erase from './Erase.mjs';
4
+ import invertCommand from './invertCommand.mjs';
5
+ import SerializableCommand from './SerializableCommand.mjs';
6
+ import uniteCommands from './uniteCommands.mjs';
7
+ export { Command, Duplicate, Erase, SerializableCommand, invertCommand, uniteCommands, };
@@ -0,0 +1,23 @@
1
+ import Rect2 from '../math/Rect2';
2
+ export interface CommandLocalization {
3
+ movedLeft: string;
4
+ movedUp: string;
5
+ movedDown: string;
6
+ movedRight: string;
7
+ rotatedBy: (degrees: number) => string;
8
+ zoomedOut: string;
9
+ zoomedIn: string;
10
+ erasedNoElements: string;
11
+ duplicatedNoElements: string;
12
+ elements: string;
13
+ updatedViewport: string;
14
+ transformedElements: (elemCount: number) => string;
15
+ resizeOutputCommand: (newSize: Rect2) => string;
16
+ addElementAction: (elemDescription: string) => string;
17
+ eraseAction: (elemDescription: string, numElems: number) => string;
18
+ duplicateAction: (elemDescription: string, count: number) => string;
19
+ inverseOf: (actionDescription: string) => string;
20
+ unionOf: (actionDescription: string, actionCount: number) => string;
21
+ selectedElements: (count: number) => string;
22
+ }
23
+ export declare const defaultCommandLocalization: CommandLocalization;
@@ -0,0 +1,21 @@
1
+ export const defaultCommandLocalization = {
2
+ updatedViewport: 'Transformed Viewport',
3
+ transformedElements: (elemCount) => `Transformed ${elemCount} element${elemCount === 1 ? '' : 's'}`,
4
+ resizeOutputCommand: (newSize) => `Resized image to ${newSize.w}x${newSize.h}`,
5
+ addElementAction: (componentDescription) => `Added ${componentDescription}`,
6
+ eraseAction: (componentDescription, numElems) => `Erased ${numElems} ${componentDescription}`,
7
+ duplicateAction: (componentDescription, numElems) => `Duplicated ${numElems} ${componentDescription}`,
8
+ unionOf: (actionDescription, actionCount) => `Union: ${actionCount} ${actionDescription}`,
9
+ inverseOf: (actionDescription) => `Inverse of ${actionDescription}`,
10
+ elements: 'Elements',
11
+ erasedNoElements: 'Erased nothing',
12
+ duplicatedNoElements: 'Duplicated nothing',
13
+ rotatedBy: (degrees) => `Rotated by ${Math.abs(degrees)} degrees ${degrees < 0 ? 'clockwise' : 'counter-clockwise'}`,
14
+ movedLeft: 'Moved left',
15
+ movedUp: 'Moved up',
16
+ movedDown: 'Moved down',
17
+ movedRight: 'Moved right',
18
+ zoomedOut: 'Zoomed out',
19
+ zoomedIn: 'Zoomed in',
20
+ selectedElements: (count) => `Selected ${count} element${count === 1 ? '' : 's'}`,
21
+ };
@@ -0,0 +1,4 @@
1
+ import Command from './Command';
2
+ import SerializableCommand from './SerializableCommand';
3
+ declare const uniteCommands: <T extends Command>(commands: T[], applyChunkSize?: number) => T extends SerializableCommand ? SerializableCommand : Command;
4
+ export default uniteCommands;
@@ -0,0 +1,116 @@
1
+ import Command from './Command.mjs';
2
+ import SerializableCommand from './SerializableCommand.mjs';
3
+ class NonSerializableUnion extends Command {
4
+ constructor(commands, applyChunkSize) {
5
+ super();
6
+ this.commands = commands;
7
+ this.applyChunkSize = applyChunkSize;
8
+ }
9
+ static waitForAll(commands) {
10
+ // If any are Promises...
11
+ if (commands.some(command => command && command['then'])) {
12
+ console.log('waiting...');
13
+ // Wait for all commands to finish.
14
+ return Promise.all(commands)
15
+ // Ensure we return a Promise<void> and not a Promise<void[]>
16
+ .then(() => { });
17
+ }
18
+ return;
19
+ }
20
+ apply(editor) {
21
+ if (this.applyChunkSize === undefined) {
22
+ const results = this.commands.map(cmd => cmd.apply(editor));
23
+ return NonSerializableUnion.waitForAll(results);
24
+ }
25
+ else {
26
+ return editor.asyncApplyCommands(this.commands, this.applyChunkSize);
27
+ }
28
+ }
29
+ unapply(editor) {
30
+ const commands = [...this.commands];
31
+ commands.reverse();
32
+ if (this.applyChunkSize === undefined) {
33
+ const results = commands.map(cmd => cmd.unapply(editor));
34
+ return NonSerializableUnion.waitForAll(results);
35
+ }
36
+ else {
37
+ return editor.asyncUnapplyCommands(commands, this.applyChunkSize, false);
38
+ }
39
+ }
40
+ description(editor, localizationTable) {
41
+ const descriptions = [];
42
+ let lastDescription = null;
43
+ let duplicateDescriptionCount = 0;
44
+ for (const part of this.commands) {
45
+ const description = part.description(editor, localizationTable);
46
+ if (description !== lastDescription && lastDescription !== null) {
47
+ descriptions.push(localizationTable.unionOf(lastDescription, duplicateDescriptionCount));
48
+ lastDescription = null;
49
+ duplicateDescriptionCount = 0;
50
+ }
51
+ duplicateDescriptionCount++;
52
+ lastDescription !== null && lastDescription !== void 0 ? lastDescription : (lastDescription = description);
53
+ }
54
+ if (duplicateDescriptionCount > 1) {
55
+ descriptions.push(localizationTable.unionOf(lastDescription, duplicateDescriptionCount));
56
+ }
57
+ else if (duplicateDescriptionCount === 1) {
58
+ descriptions.push(lastDescription);
59
+ }
60
+ return descriptions.join(', ');
61
+ }
62
+ }
63
+ class SerializableUnion extends SerializableCommand {
64
+ constructor(commands, applyChunkSize) {
65
+ super('union');
66
+ this.commands = commands;
67
+ this.applyChunkSize = applyChunkSize;
68
+ this.nonserializableCommand = new NonSerializableUnion(commands, applyChunkSize);
69
+ }
70
+ serializeToJSON() {
71
+ return {
72
+ applyChunkSize: this.applyChunkSize,
73
+ data: this.commands.map(command => command.serialize()),
74
+ };
75
+ }
76
+ apply(editor) {
77
+ return this.nonserializableCommand.apply(editor);
78
+ }
79
+ unapply(editor) {
80
+ return this.nonserializableCommand.unapply(editor);
81
+ }
82
+ description(editor, localizationTable) {
83
+ return this.nonserializableCommand.description(editor, localizationTable);
84
+ }
85
+ }
86
+ const uniteCommands = (commands, applyChunkSize) => {
87
+ let allSerializable = true;
88
+ for (const command of commands) {
89
+ if (!(command instanceof SerializableCommand)) {
90
+ allSerializable = false;
91
+ break;
92
+ }
93
+ }
94
+ if (!allSerializable) {
95
+ return new NonSerializableUnion(commands, applyChunkSize);
96
+ }
97
+ else {
98
+ const castedCommands = commands;
99
+ return new SerializableUnion(castedCommands, applyChunkSize);
100
+ }
101
+ };
102
+ SerializableCommand.register('union', (data, editor) => {
103
+ if (typeof data.data.length !== 'number') {
104
+ throw new Error('Unions of commands must serialize to lists of serialization data.');
105
+ }
106
+ const applyChunkSize = data.applyChunkSize;
107
+ if (typeof applyChunkSize !== 'number' && applyChunkSize !== undefined) {
108
+ throw new Error('serialized applyChunkSize is neither undefined nor a number.');
109
+ }
110
+ const commands = [];
111
+ for (const part of data.data) {
112
+ commands.push(SerializableCommand.deserialize(part, editor));
113
+ }
114
+ return uniteCommands(commands, applyChunkSize);
115
+ });
116
+ export default uniteCommands;
@@ -0,0 +1,73 @@
1
+ import SerializableCommand from '../commands/SerializableCommand';
2
+ import EditorImage from '../EditorImage';
3
+ import LineSegment2 from '../math/LineSegment2';
4
+ import Mat33 from '../math/Mat33';
5
+ import Rect2 from '../math/Rect2';
6
+ import AbstractRenderer from '../rendering/renderers/AbstractRenderer';
7
+ import { ImageComponentLocalization } from './localization';
8
+ export type LoadSaveData = (string[] | Record<symbol, string | number>);
9
+ export type LoadSaveDataTable = Record<string, Array<LoadSaveData>>;
10
+ export type DeserializeCallback = (data: string) => AbstractComponent;
11
+ /**
12
+ * A base class for everything that can be added to an {@link EditorImage}.
13
+ */
14
+ export default abstract class AbstractComponent {
15
+ private readonly componentKind;
16
+ protected lastChangedTime: number;
17
+ protected abstract contentBBox: Rect2;
18
+ private zIndex;
19
+ private id;
20
+ private static zIndexCounter;
21
+ protected constructor(componentKind: string, initialZIndex?: number);
22
+ getId(): string;
23
+ private static deserializationCallbacks;
24
+ static registerComponent(componentKind: string, deserialize: DeserializeCallback | null): void;
25
+ private loadSaveData;
26
+ /**
27
+ * Attach data that can be used while exporting the component (e.g. to SVG).
28
+ *
29
+ * This is intended for use by an {@link ImageLoader}.
30
+ */
31
+ attachLoadSaveData(key: string, data: LoadSaveData): void;
32
+ /** See {@link attachLoadSaveData} */
33
+ getLoadSaveData(): LoadSaveDataTable;
34
+ getZIndex(): number;
35
+ /** @returns the bounding box of this. */
36
+ getBBox(): Rect2;
37
+ /** Called when this component is added to the given image. */
38
+ onAddToImage(_image: EditorImage): void;
39
+ onRemoveFromImage(): void;
40
+ abstract render(canvas: AbstractRenderer, visibleRect?: Rect2): void;
41
+ /** @return true if `lineSegment` intersects this component. */
42
+ abstract intersects(lineSegment: LineSegment2): boolean;
43
+ /**
44
+ * @returns true if this component intersects `rect` -- it is entirely contained
45
+ * within the rectangle or one of the rectangle's edges intersects this component.
46
+ */
47
+ intersectsRect(rect: Rect2): boolean;
48
+ protected abstract serializeToJSON(): any[] | Record<string, any> | number | string | null;
49
+ protected abstract applyTransformation(affineTransfm: Mat33): void;
50
+ transformBy(affineTransfm: Mat33): SerializableCommand;
51
+ setZIndex(newZIndex: number): SerializableCommand;
52
+ isSelectable(): boolean;
53
+ isBackground(): boolean;
54
+ getProportionalRenderingTime(): number;
55
+ private static transformElementCommandId;
56
+ private static TransformElementCommand;
57
+ /**
58
+ * @return a description that could be read by a screen reader
59
+ * (e.g. when adding/erasing the component)
60
+ */
61
+ abstract description(localizationTable: ImageComponentLocalization): string;
62
+ protected abstract createClone(): AbstractComponent;
63
+ clone(): AbstractComponent;
64
+ serialize(): {
65
+ name: string;
66
+ zIndex: number;
67
+ id: string;
68
+ loadSaveData: LoadSaveDataTable;
69
+ data: string | number | any[] | Record<string, any>;
70
+ };
71
+ private static isNotDeserializable;
72
+ static deserialize(json: string | any): AbstractComponent;
73
+ }
@@ -0,0 +1,252 @@
1
+ var _a;
2
+ import SerializableCommand from '../commands/SerializableCommand.mjs';
3
+ import EditorImage from '../EditorImage.mjs';
4
+ import Mat33 from '../math/Mat33.mjs';
5
+ import UnresolvedSerializableCommand from '../commands/UnresolvedCommand.mjs';
6
+ /**
7
+ * A base class for everything that can be added to an {@link EditorImage}.
8
+ */
9
+ export default class AbstractComponent {
10
+ constructor(
11
+ // A unique identifier for the type of component
12
+ componentKind, initialZIndex) {
13
+ this.componentKind = componentKind;
14
+ // Stores data attached by a loader.
15
+ this.loadSaveData = {};
16
+ this.lastChangedTime = (new Date()).getTime();
17
+ if (initialZIndex !== undefined) {
18
+ this.zIndex = initialZIndex;
19
+ }
20
+ else {
21
+ this.zIndex = AbstractComponent.zIndexCounter++;
22
+ }
23
+ // Create a unique ID.
24
+ this.id = `${new Date().getTime()}-${Math.random()}`;
25
+ if (AbstractComponent.deserializationCallbacks[componentKind] === undefined) {
26
+ throw new Error(`Component ${componentKind} has not been registered using AbstractComponent.registerComponent`);
27
+ }
28
+ }
29
+ // Returns a unique ID for this element.
30
+ // @see { @link EditorImage.lookupElement }
31
+ getId() {
32
+ return this.id;
33
+ }
34
+ // Store the deserialization callback (or lack of it) for [componentKind].
35
+ // If components are registered multiple times (as may be done in automated tests),
36
+ // the most recent deserialization callback is used.
37
+ static registerComponent(componentKind, deserialize) {
38
+ this.deserializationCallbacks[componentKind] = deserialize !== null && deserialize !== void 0 ? deserialize : null;
39
+ }
40
+ /**
41
+ * Attach data that can be used while exporting the component (e.g. to SVG).
42
+ *
43
+ * This is intended for use by an {@link ImageLoader}.
44
+ */
45
+ attachLoadSaveData(key, data) {
46
+ if (!this.loadSaveData[key]) {
47
+ this.loadSaveData[key] = [];
48
+ }
49
+ this.loadSaveData[key].push(data);
50
+ }
51
+ /** See {@link attachLoadSaveData} */
52
+ getLoadSaveData() {
53
+ return this.loadSaveData;
54
+ }
55
+ getZIndex() {
56
+ return this.zIndex;
57
+ }
58
+ /** @returns the bounding box of this. */
59
+ getBBox() {
60
+ return this.contentBBox;
61
+ }
62
+ /** Called when this component is added to the given image. */
63
+ onAddToImage(_image) { }
64
+ onRemoveFromImage() { }
65
+ /**
66
+ * @returns true if this component intersects `rect` -- it is entirely contained
67
+ * within the rectangle or one of the rectangle's edges intersects this component.
68
+ */
69
+ intersectsRect(rect) {
70
+ // If this component intersects rect,
71
+ // it is either contained entirely within rect or intersects one of rect's edges.
72
+ // If contained within,
73
+ if (rect.containsRect(this.getBBox())) {
74
+ return true;
75
+ }
76
+ // Calculated bounding boxes can be slightly larger than their actual contents' bounding box.
77
+ // As such, test with more lines than just the rect's edges.
78
+ const testLines = [];
79
+ for (const subregion of rect.divideIntoGrid(2, 2)) {
80
+ testLines.push(...subregion.getEdges());
81
+ }
82
+ return testLines.some(edge => this.intersects(edge));
83
+ }
84
+ // Returns a command that, when applied, transforms this by [affineTransfm] and
85
+ // updates the editor.
86
+ transformBy(affineTransfm) {
87
+ return new AbstractComponent.TransformElementCommand(affineTransfm, this.getId(), this);
88
+ }
89
+ // Returns a command that updates this component's z-index.
90
+ setZIndex(newZIndex) {
91
+ return new AbstractComponent.TransformElementCommand(Mat33.identity, this.getId(), this, newZIndex, this.getZIndex());
92
+ }
93
+ // @returns true iff this component can be selected (e.g. by the selection tool.)
94
+ isSelectable() {
95
+ return true;
96
+ }
97
+ // @returns true iff this component should be added to the background, rather than the
98
+ // foreground of the image.
99
+ isBackground() {
100
+ return false;
101
+ }
102
+ // @returns an approximation of the proportional time it takes to render this component.
103
+ // This is intended to be a rough estimate, but, for example, a stroke with two points sould have
104
+ // a renderingWeight approximately twice that of a stroke with one point.
105
+ getProportionalRenderingTime() {
106
+ return 1;
107
+ }
108
+ // Returns a copy of this component.
109
+ clone() {
110
+ const clone = this.createClone();
111
+ for (const attachmentKey in this.loadSaveData) {
112
+ for (const val of this.loadSaveData[attachmentKey]) {
113
+ clone.attachLoadSaveData(attachmentKey, val);
114
+ }
115
+ }
116
+ return clone;
117
+ }
118
+ // Convert the component to an object that can be passed to
119
+ // `JSON.stringify`.
120
+ //
121
+ // Do not rely on the output of this function to take a particular form —
122
+ // this function's output can change form without a major version increase.
123
+ serialize() {
124
+ const data = this.serializeToJSON();
125
+ if (data === null) {
126
+ throw new Error(`${this} cannot be serialized.`);
127
+ }
128
+ return {
129
+ name: this.componentKind,
130
+ zIndex: this.zIndex,
131
+ id: this.id,
132
+ loadSaveData: this.loadSaveData,
133
+ data,
134
+ };
135
+ }
136
+ // Returns true if `data` is not deserializable. May return false even if [data]
137
+ // is not deserializable.
138
+ static isNotDeserializable(json) {
139
+ if (typeof json === 'string') {
140
+ json = JSON.parse(json);
141
+ }
142
+ if (typeof json !== 'object') {
143
+ return true;
144
+ }
145
+ if (!this.deserializationCallbacks[json === null || json === void 0 ? void 0 : json.name]) {
146
+ return true;
147
+ }
148
+ if (!json.data) {
149
+ return true;
150
+ }
151
+ return false;
152
+ }
153
+ // Convert a string or an object produced by `JSON.parse` into an `AbstractComponent`.
154
+ static deserialize(json) {
155
+ if (typeof json === 'string') {
156
+ json = JSON.parse(json);
157
+ }
158
+ if (AbstractComponent.isNotDeserializable(json)) {
159
+ throw new Error(`Element with data ${json} cannot be deserialized.`);
160
+ }
161
+ const instance = this.deserializationCallbacks[json.name](json.data);
162
+ instance.zIndex = json.zIndex;
163
+ instance.id = json.id;
164
+ // TODO: What should we do with json.loadSaveData?
165
+ // If we attach it to [instance], we create a potential security risk — loadSaveData
166
+ // is often used to store unrecognised attributes so they can be preserved on output.
167
+ // ...but what if we're deserializing data sent across the network?
168
+ return instance;
169
+ }
170
+ }
171
+ // Topmost z-index
172
+ AbstractComponent.zIndexCounter = 0;
173
+ AbstractComponent.deserializationCallbacks = {};
174
+ AbstractComponent.transformElementCommandId = 'transform-element';
175
+ AbstractComponent.TransformElementCommand = (_a = class extends UnresolvedSerializableCommand {
176
+ // Construct a new TransformElementCommand. `component`, while optional, should
177
+ // be provided if available. If not provided, it will be fetched from the editor's
178
+ // document when the command is applied.
179
+ constructor(affineTransfm, componentID, component, targetZIndex, origZIndex) {
180
+ super(AbstractComponent.transformElementCommandId, componentID, component);
181
+ this.affineTransfm = affineTransfm;
182
+ this.origZIndex = origZIndex;
183
+ this.targetZIndex = targetZIndex !== null && targetZIndex !== void 0 ? targetZIndex : AbstractComponent.zIndexCounter++;
184
+ // Ensure that we keep drawing on top even after changing the z-index.
185
+ if (this.targetZIndex >= AbstractComponent.zIndexCounter) {
186
+ AbstractComponent.zIndexCounter = this.targetZIndex + 1;
187
+ }
188
+ if (component && origZIndex === undefined) {
189
+ this.origZIndex = component.getZIndex();
190
+ }
191
+ }
192
+ resolveComponent(image) {
193
+ var _a;
194
+ if (this.component) {
195
+ return;
196
+ }
197
+ super.resolveComponent(image);
198
+ (_a = this.origZIndex) !== null && _a !== void 0 ? _a : (this.origZIndex = this.component.getZIndex());
199
+ }
200
+ updateTransform(editor, newTransfm) {
201
+ if (!this.component) {
202
+ throw new Error('this.component is undefined or null!');
203
+ }
204
+ // Any parent should have only one direct child.
205
+ const parent = editor.image.findParent(this.component);
206
+ let hadParent = false;
207
+ if (parent) {
208
+ parent.remove();
209
+ hadParent = true;
210
+ }
211
+ this.component.applyTransformation(newTransfm);
212
+ this.component.lastChangedTime = (new Date()).getTime();
213
+ // Add the element back to the document.
214
+ if (hadParent) {
215
+ EditorImage.addElement(this.component).apply(editor);
216
+ }
217
+ }
218
+ apply(editor) {
219
+ this.resolveComponent(editor.image);
220
+ this.component.zIndex = this.targetZIndex;
221
+ this.updateTransform(editor, this.affineTransfm);
222
+ editor.queueRerender();
223
+ }
224
+ unapply(editor) {
225
+ this.resolveComponent(editor.image);
226
+ this.component.zIndex = this.origZIndex;
227
+ this.updateTransform(editor, this.affineTransfm.inverse());
228
+ editor.queueRerender();
229
+ }
230
+ description(_editor, localizationTable) {
231
+ return localizationTable.transformedElements(1);
232
+ }
233
+ serializeToJSON() {
234
+ return {
235
+ id: this.componentID,
236
+ transfm: this.affineTransfm.toArray(),
237
+ targetZIndex: this.targetZIndex,
238
+ origZIndex: this.origZIndex,
239
+ };
240
+ }
241
+ },
242
+ (() => {
243
+ SerializableCommand.register(AbstractComponent.transformElementCommandId, (json, editor) => {
244
+ var _a, _b;
245
+ const elem = (_a = editor.image.lookupElement(json.id)) !== null && _a !== void 0 ? _a : undefined;
246
+ const transform = new Mat33(...json.transfm);
247
+ const targetZIndex = json.targetZIndex;
248
+ const origZIndex = (_b = json.origZIndex) !== null && _b !== void 0 ? _b : undefined;
249
+ return new AbstractComponent.TransformElementCommand(transform, json.id, elem, targetZIndex, origZIndex);
250
+ });
251
+ })(),
252
+ _a);
@@ -0,0 +1,42 @@
1
+ import Color4 from '../Color4';
2
+ import Editor from '../Editor';
3
+ import EditorImage from '../EditorImage';
4
+ import SerializableCommand from '../commands/SerializableCommand';
5
+ import LineSegment2 from '../math/LineSegment2';
6
+ import Mat33 from '../math/Mat33';
7
+ import Rect2 from '../math/Rect2';
8
+ import AbstractRenderer from '../rendering/renderers/AbstractRenderer';
9
+ import AbstractComponent from './AbstractComponent';
10
+ import { ImageComponentLocalization } from './localization';
11
+ import RestyleableComponent, { ComponentStyle } from './RestylableComponent';
12
+ export declare enum BackgroundType {
13
+ SolidColor = 0,
14
+ None = 1
15
+ }
16
+ export declare const imageBackgroundCSSClassName = "js-draw-image-background";
17
+ export default class ImageBackground extends AbstractComponent implements RestyleableComponent {
18
+ private backgroundType;
19
+ private mainColor;
20
+ protected contentBBox: Rect2;
21
+ private viewportSizeChangeListener;
22
+ readonly isRestylableComponent: true;
23
+ constructor(backgroundType: BackgroundType, mainColor: Color4);
24
+ getStyle(): ComponentStyle;
25
+ updateStyle(style: ComponentStyle): SerializableCommand;
26
+ forceStyle(style: ComponentStyle, editor: Editor | null): void;
27
+ onAddToImage(image: EditorImage): void;
28
+ onRemoveFromImage(): void;
29
+ private recomputeBBox;
30
+ render(canvas: AbstractRenderer, visibleRect?: Rect2): void;
31
+ intersects(lineSegment: LineSegment2): boolean;
32
+ isSelectable(): boolean;
33
+ isBackground(): boolean;
34
+ protected serializeToJSON(): {
35
+ mainColor: string;
36
+ backgroundType: BackgroundType;
37
+ };
38
+ protected applyTransformation(_affineTransfm: Mat33): void;
39
+ description(localizationTable: ImageComponentLocalization): string;
40
+ protected createClone(): AbstractComponent;
41
+ static deserializeFromJSON(json: any): ImageBackground;
42
+ }