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,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PointerDevice = void 0;
4
+ const Vec2_1 = require("./math/Vec2");
5
+ var PointerDevice;
6
+ (function (PointerDevice) {
7
+ PointerDevice[PointerDevice["Pen"] = 0] = "Pen";
8
+ PointerDevice[PointerDevice["Eraser"] = 1] = "Eraser";
9
+ PointerDevice[PointerDevice["Touch"] = 2] = "Touch";
10
+ PointerDevice[PointerDevice["PrimaryButtonMouse"] = 3] = "PrimaryButtonMouse";
11
+ PointerDevice[PointerDevice["RightButtonMouse"] = 4] = "RightButtonMouse";
12
+ PointerDevice[PointerDevice["Other"] = 5] = "Other";
13
+ })(PointerDevice = exports.PointerDevice || (exports.PointerDevice = {}));
14
+ // Provides a snapshot containing information about a pointer. A Pointer
15
+ // object is immutable — it will not be updated when the pointer's information changes.
16
+ class Pointer {
17
+ constructor(
18
+ // The (x, y) position of the pointer relative to the top-left corner
19
+ // of the visible canvas.
20
+ screenPos,
21
+ // Position of the pointer relative to the top left corner of the drawing
22
+ // surface.
23
+ canvasPos, pressure, isPrimary, down, device,
24
+ // Unique ID for the pointer
25
+ id,
26
+ // Numeric timestamp (milliseconds, as from `(new Date).getTime()`)
27
+ timeStamp) {
28
+ this.screenPos = screenPos;
29
+ this.canvasPos = canvasPos;
30
+ this.pressure = pressure;
31
+ this.isPrimary = isPrimary;
32
+ this.down = down;
33
+ this.device = device;
34
+ this.id = id;
35
+ this.timeStamp = timeStamp;
36
+ }
37
+ // Snaps this pointer to the nearest grid point (rounds the coordinates of this
38
+ // pointer based on the current zoom). Returns a new Pointer and does not modify
39
+ // this.
40
+ snappedToGrid(viewport) {
41
+ const snappedCanvasPos = viewport.snapToGrid(this.canvasPos);
42
+ const snappedScreenPos = viewport.canvasToScreen(snappedCanvasPos);
43
+ return new Pointer(snappedScreenPos, snappedCanvasPos, this.pressure, this.isPrimary, this.down, this.device, this.id, this.timeStamp);
44
+ }
45
+ // Creates a Pointer from a DOM event. If `relativeTo` is given, (0, 0) in screen coordinates is
46
+ // considered the top left of `relativeTo`.
47
+ static ofEvent(evt, isDown, viewport, relativeTo) {
48
+ var _a, _b;
49
+ let screenPos = Vec2_1.Vec2.of(evt.clientX, evt.clientY);
50
+ if (relativeTo) {
51
+ const bbox = relativeTo.getBoundingClientRect();
52
+ screenPos = screenPos.minus(Vec2_1.Vec2.of(bbox.left, bbox.top));
53
+ }
54
+ const pointerTypeToDevice = {
55
+ 'mouse': PointerDevice.PrimaryButtonMouse,
56
+ 'pen': PointerDevice.Pen,
57
+ 'touch': PointerDevice.Touch,
58
+ };
59
+ let device = (_a = pointerTypeToDevice[evt.pointerType]) !== null && _a !== void 0 ? _a : PointerDevice.Other;
60
+ const eraserButtonMask = 0x20;
61
+ if (device === PointerDevice.Pen && (evt.buttons & eraserButtonMask) !== 0) {
62
+ device = PointerDevice.Eraser;
63
+ }
64
+ const timeStamp = (new Date()).getTime();
65
+ const canvasPos = viewport.roundPoint(viewport.screenToCanvas(screenPos));
66
+ if (device === PointerDevice.PrimaryButtonMouse) {
67
+ if (evt.buttons & 0x2) {
68
+ device = PointerDevice.RightButtonMouse;
69
+ }
70
+ else if (!(evt.buttons & 0x1)) {
71
+ device = PointerDevice.Other;
72
+ }
73
+ }
74
+ return new Pointer(screenPos, canvasPos, (_b = evt.pressure) !== null && _b !== void 0 ? _b : null, evt.isPrimary, isDown, device, evt.pointerId, timeStamp);
75
+ }
76
+ // Create a new Pointer from a point on the canvas.
77
+ // Intended for unit tests.
78
+ static ofCanvasPoint(canvasPos, isDown, viewport, id = 0, device = PointerDevice.Pen, isPrimary = true, pressure = null) {
79
+ const screenPos = viewport.canvasToScreen(canvasPos);
80
+ const timeStamp = (new Date()).getTime();
81
+ return new Pointer(screenPos, canvasPos, pressure, isPrimary, isDown, device, id, timeStamp);
82
+ }
83
+ }
84
+ exports.default = Pointer;
@@ -0,0 +1,48 @@
1
+ import Rect2 from './math/Rect2';
2
+ import { ComponentAddedListener, ImageLoader, OnDetermineExportRectListener, OnProgressListener } from './types';
3
+ export declare const defaultSVGViewRect: Rect2;
4
+ export declare const svgAttributesDataKey = "svgAttrs";
5
+ export declare const svgStyleAttributesDataKey = "svgStyleAttrs";
6
+ export type SVGLoaderUnknownAttribute = [string, string];
7
+ export type SVGLoaderUnknownStyleAttribute = {
8
+ key: string;
9
+ value: string;
10
+ priority?: string;
11
+ };
12
+ export default class SVGLoader implements ImageLoader {
13
+ private source;
14
+ private onFinish?;
15
+ private readonly storeUnknown;
16
+ private onAddComponent;
17
+ private onProgress;
18
+ private onDetermineExportRect;
19
+ private processedCount;
20
+ private totalToProcess;
21
+ private rootViewBox;
22
+ private constructor();
23
+ private getStyle;
24
+ private strokeDataFromElem;
25
+ private attachUnrecognisedAttrs;
26
+ private addPath;
27
+ private addBackground;
28
+ private getTransform;
29
+ private makeText;
30
+ private addText;
31
+ private addImage;
32
+ private addUnknownNode;
33
+ private updateViewBox;
34
+ private updateSVGAttrs;
35
+ private visit;
36
+ private getSourceAttrs;
37
+ start(onAddComponent: ComponentAddedListener, onProgress: OnProgressListener, onDetermineExportRect?: OnDetermineExportRectListener | null): Promise<void>;
38
+ /**
39
+ * Create an `SVGLoader` from the content of an SVG image. SVGs are loaded within a sandboxed
40
+ * iframe with `sandbox="allow-same-origin"`
41
+ * [thereby disabling JavaScript](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#sandbox).
42
+ *
43
+ * @see {@link Editor.loadFrom}
44
+ * @param text - Textual representation of the SVG (e.g. `<svg viewbox='...'>...</svg>`).
45
+ * @param sanitize - if `true`, don't store unknown attributes.
46
+ */
47
+ static fromString(text: string, sanitize?: boolean): SVGLoader;
48
+ }
@@ -0,0 +1,475 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.svgStyleAttributesDataKey = exports.svgAttributesDataKey = exports.defaultSVGViewRect = void 0;
39
+ const Color4_1 = __importDefault(require("./Color4"));
40
+ const ImageBackground_1 = __importStar(require("./components/ImageBackground"));
41
+ const ImageComponent_1 = __importDefault(require("./components/ImageComponent"));
42
+ const Stroke_1 = __importDefault(require("./components/Stroke"));
43
+ const SVGGlobalAttributesObject_1 = __importDefault(require("./components/SVGGlobalAttributesObject"));
44
+ const TextComponent_1 = __importDefault(require("./components/TextComponent"));
45
+ const UnknownSVGObject_1 = __importDefault(require("./components/UnknownSVGObject"));
46
+ const Mat33_1 = __importDefault(require("./math/Mat33"));
47
+ const Path_1 = __importDefault(require("./math/Path"));
48
+ const Rect2_1 = __importDefault(require("./math/Rect2"));
49
+ const Vec2_1 = require("./math/Vec2");
50
+ // Size of a loaded image if no size is specified.
51
+ exports.defaultSVGViewRect = new Rect2_1.default(0, 0, 500, 500);
52
+ // Key to retrieve unrecognised attributes from an AbstractComponent
53
+ exports.svgAttributesDataKey = 'svgAttrs';
54
+ exports.svgStyleAttributesDataKey = 'svgStyleAttrs';
55
+ const supportedStrokeFillStyleAttrs = ['stroke', 'fill', 'stroke-width'];
56
+ // Handles loading images from SVG.
57
+ class SVGLoader {
58
+ constructor(source, onFinish, storeUnknown = true) {
59
+ this.source = source;
60
+ this.onFinish = onFinish;
61
+ this.storeUnknown = storeUnknown;
62
+ this.onAddComponent = null;
63
+ this.onProgress = null;
64
+ this.onDetermineExportRect = null;
65
+ this.processedCount = 0;
66
+ this.totalToProcess = 0;
67
+ }
68
+ // If [computedStyles] is given, it is preferred to directly accessing node's style object.
69
+ getStyle(node, computedStyles) {
70
+ var _a, _b, _c, _d, _f, _g;
71
+ let fill = Color4_1.default.transparent;
72
+ let stroke;
73
+ // If possible, use computedStyles (allows property inheritance).
74
+ const fillAttribute = (_b = (_a = node.getAttribute('fill')) !== null && _a !== void 0 ? _a : computedStyles === null || computedStyles === void 0 ? void 0 : computedStyles.fill) !== null && _b !== void 0 ? _b : node.style.fill;
75
+ if (fillAttribute) {
76
+ try {
77
+ fill = Color4_1.default.fromString(fillAttribute);
78
+ }
79
+ catch (e) {
80
+ console.error('Unknown fill color,', fillAttribute);
81
+ }
82
+ }
83
+ const strokeAttribute = (_d = (_c = node.getAttribute('stroke')) !== null && _c !== void 0 ? _c : computedStyles === null || computedStyles === void 0 ? void 0 : computedStyles.stroke) !== null && _d !== void 0 ? _d : node.style.stroke;
84
+ const strokeWidthAttr = (_g = (_f = node.getAttribute('stroke-width')) !== null && _f !== void 0 ? _f : computedStyles === null || computedStyles === void 0 ? void 0 : computedStyles.strokeWidth) !== null && _g !== void 0 ? _g : node.style.strokeWidth;
85
+ if (strokeAttribute && strokeWidthAttr) {
86
+ try {
87
+ let width = parseFloat(strokeWidthAttr !== null && strokeWidthAttr !== void 0 ? strokeWidthAttr : '1');
88
+ if (!isFinite(width)) {
89
+ width = 0;
90
+ }
91
+ const strokeColor = Color4_1.default.fromString(strokeAttribute);
92
+ if (strokeColor.a > 0) {
93
+ stroke = {
94
+ width,
95
+ color: strokeColor,
96
+ };
97
+ }
98
+ }
99
+ catch (e) {
100
+ console.error('Error parsing stroke data:', e);
101
+ }
102
+ }
103
+ const style = {
104
+ fill,
105
+ stroke,
106
+ };
107
+ return style;
108
+ }
109
+ strokeDataFromElem(node) {
110
+ var _a;
111
+ const result = [];
112
+ const pathData = (_a = node.getAttribute('d')) !== null && _a !== void 0 ? _a : '';
113
+ const style = this.getStyle(node);
114
+ // Break the path into chunks at each moveTo ('M') command:
115
+ const parts = pathData.split('M');
116
+ let isFirst = true;
117
+ for (const part of parts) {
118
+ // Skip effective no-ops -- moveTos without additional commands.
119
+ const isNoOpMoveTo = /^[0-9., \t\n]+$/.exec(part);
120
+ if (part !== '' && !isNoOpMoveTo) {
121
+ // We split the path by moveTo commands, so add the 'M' back in
122
+ // if it was present.
123
+ const current = !isFirst ? `M${part}` : part;
124
+ const path = Path_1.default.fromString(current);
125
+ const spec = path.toRenderable(style);
126
+ result.push(spec);
127
+ }
128
+ isFirst = false;
129
+ }
130
+ return result;
131
+ }
132
+ attachUnrecognisedAttrs(elem, node, supportedAttrs, supportedStyleAttrs) {
133
+ if (!this.storeUnknown) {
134
+ return;
135
+ }
136
+ for (const attr of node.getAttributeNames()) {
137
+ if (supportedAttrs.has(attr) || (attr === 'style' && supportedStyleAttrs)) {
138
+ continue;
139
+ }
140
+ elem.attachLoadSaveData(exports.svgAttributesDataKey, [attr, node.getAttribute(attr)]);
141
+ }
142
+ if (supportedStyleAttrs && node.style) {
143
+ for (const attr of node.style) {
144
+ if (attr === '' || !attr) {
145
+ continue;
146
+ }
147
+ if (supportedStyleAttrs.has(attr)) {
148
+ continue;
149
+ }
150
+ // TODO: Do we need special logic for !important properties?
151
+ elem.attachLoadSaveData(exports.svgStyleAttributesDataKey, {
152
+ key: attr,
153
+ value: node.style.getPropertyValue(attr),
154
+ priority: node.style.getPropertyPriority(attr)
155
+ });
156
+ }
157
+ }
158
+ }
159
+ // Adds a stroke with a single path
160
+ addPath(node) {
161
+ var _a;
162
+ return __awaiter(this, void 0, void 0, function* () {
163
+ let elem;
164
+ try {
165
+ const strokeData = this.strokeDataFromElem(node);
166
+ elem = new Stroke_1.default(strokeData);
167
+ this.attachUnrecognisedAttrs(elem, node, new Set([...supportedStrokeFillStyleAttrs, 'd']), new Set(supportedStrokeFillStyleAttrs));
168
+ }
169
+ catch (e) {
170
+ console.error('Invalid path in node', node, '\nError:', e, '\nAdding as an unknown object.');
171
+ if (this.storeUnknown) {
172
+ elem = new UnknownSVGObject_1.default(node);
173
+ }
174
+ else {
175
+ return;
176
+ }
177
+ }
178
+ yield ((_a = this.onAddComponent) === null || _a === void 0 ? void 0 : _a.call(this, elem));
179
+ });
180
+ }
181
+ addBackground(node) {
182
+ var _a, _b, _c;
183
+ return __awaiter(this, void 0, void 0, function* () {
184
+ const fill = Color4_1.default.fromString((_b = (_a = node.getAttribute('fill')) !== null && _a !== void 0 ? _a : node.style.fill) !== null && _b !== void 0 ? _b : 'black');
185
+ const elem = new ImageBackground_1.default(ImageBackground_1.BackgroundType.SolidColor, fill);
186
+ yield ((_c = this.onAddComponent) === null || _c === void 0 ? void 0 : _c.call(this, elem));
187
+ });
188
+ }
189
+ // If given, 'supportedAttrs' will have x, y, etc. attributes that were used in computing the transform added to it,
190
+ // to prevent storing duplicate transform information when saving the component.
191
+ getTransform(elem, supportedAttrs, computedStyles) {
192
+ computedStyles !== null && computedStyles !== void 0 ? computedStyles : (computedStyles = window.getComputedStyle(elem));
193
+ let transformProperty = computedStyles.transform;
194
+ if (transformProperty === '' || transformProperty === 'none') {
195
+ transformProperty = elem.style.transform || 'none';
196
+ }
197
+ // Prefer the actual .style.transform
198
+ // to the computed stylesheet -- in some browsers, the computedStyles version
199
+ // can have lower precision.
200
+ let transform;
201
+ try {
202
+ transform = Mat33_1.default.fromCSSMatrix(elem.style.transform);
203
+ }
204
+ catch (_e) {
205
+ transform = Mat33_1.default.fromCSSMatrix(transformProperty);
206
+ }
207
+ const elemX = elem.getAttribute('x');
208
+ const elemY = elem.getAttribute('y');
209
+ if (elemX || elemY) {
210
+ const x = parseFloat(elemX !== null && elemX !== void 0 ? elemX : '0');
211
+ const y = parseFloat(elemY !== null && elemY !== void 0 ? elemY : '0');
212
+ if (!isNaN(x) && !isNaN(y)) {
213
+ supportedAttrs === null || supportedAttrs === void 0 ? void 0 : supportedAttrs.push('x', 'y');
214
+ transform = transform.rightMul(Mat33_1.default.translation(Vec2_1.Vec2.of(x, y)));
215
+ }
216
+ }
217
+ return transform;
218
+ }
219
+ makeText(elem) {
220
+ var _a;
221
+ const contentList = [];
222
+ for (const child of elem.childNodes) {
223
+ if (child.nodeType === Node.TEXT_NODE) {
224
+ contentList.push((_a = child.nodeValue) !== null && _a !== void 0 ? _a : '');
225
+ }
226
+ else if (child.nodeType === Node.ELEMENT_NODE) {
227
+ const subElem = child;
228
+ if (subElem.tagName.toLowerCase() === 'tspan') {
229
+ // FIXME: tspan's (x, y) components are absolute, not relative to the parent.
230
+ contentList.push(this.makeText(subElem));
231
+ }
232
+ else {
233
+ throw new Error(`Unrecognized text child element: ${subElem}`);
234
+ }
235
+ }
236
+ else {
237
+ throw new Error(`Unrecognized text child node: ${child}.`);
238
+ }
239
+ }
240
+ // If no content, the content is an empty string.
241
+ if (contentList.length === 0) {
242
+ contentList.push('');
243
+ }
244
+ // Compute styles.
245
+ const computedStyles = window.getComputedStyle(elem);
246
+ const fontSizeExp = /^([-0-9.e]+)px/i;
247
+ // In some environments, computedStyles.fontSize can be increased by the system.
248
+ // Thus, to prevent text from growing on load/save, prefer .style.fontSize.
249
+ let fontSizeMatch = fontSizeExp.exec(elem.style.fontSize);
250
+ if (!fontSizeMatch && elem.tagName.toLowerCase() === 'tspan' && elem.parentElement) {
251
+ // Try to inherit the font size of the parent text element.
252
+ fontSizeMatch = fontSizeExp.exec(elem.parentElement.style.fontSize);
253
+ }
254
+ // If we still couldn't find a font size, try to use computedStyles (which can be
255
+ // wrong).
256
+ if (!fontSizeMatch) {
257
+ fontSizeMatch = fontSizeExp.exec(computedStyles.fontSize);
258
+ }
259
+ const supportedStyleAttrs = [
260
+ 'fontFamily',
261
+ 'transform',
262
+ ...supportedStrokeFillStyleAttrs,
263
+ ];
264
+ let fontSize = 12;
265
+ if (fontSizeMatch) {
266
+ supportedStyleAttrs.push('fontSize');
267
+ fontSize = parseFloat(fontSizeMatch[1]);
268
+ }
269
+ const style = {
270
+ size: fontSize,
271
+ fontFamily: computedStyles.fontFamily || elem.style.fontFamily || 'sans-serif',
272
+ renderingStyle: this.getStyle(elem, computedStyles),
273
+ };
274
+ const supportedAttrs = [];
275
+ const transform = this.getTransform(elem, supportedAttrs, computedStyles);
276
+ const result = new TextComponent_1.default(contentList, transform, style);
277
+ this.attachUnrecognisedAttrs(result, elem, new Set(supportedAttrs), new Set(supportedStyleAttrs));
278
+ return result;
279
+ }
280
+ addText(elem) {
281
+ var _a;
282
+ return __awaiter(this, void 0, void 0, function* () {
283
+ try {
284
+ const textElem = this.makeText(elem);
285
+ yield ((_a = this.onAddComponent) === null || _a === void 0 ? void 0 : _a.call(this, textElem));
286
+ }
287
+ catch (e) {
288
+ console.error('Invalid text object in node', elem, '. Continuing.... Error:', e);
289
+ this.addUnknownNode(elem);
290
+ }
291
+ });
292
+ }
293
+ addImage(elem) {
294
+ var _a, _b, _c;
295
+ return __awaiter(this, void 0, void 0, function* () {
296
+ const image = new Image();
297
+ image.src = (_a = elem.getAttribute('xlink:href')) !== null && _a !== void 0 ? _a : elem.href.baseVal;
298
+ image.setAttribute('alt', (_b = elem.getAttribute('aria-label')) !== null && _b !== void 0 ? _b : '');
299
+ try {
300
+ const supportedAttrs = [];
301
+ const transform = this.getTransform(elem, supportedAttrs);
302
+ const imageElem = yield ImageComponent_1.default.fromImage(image, transform);
303
+ this.attachUnrecognisedAttrs(imageElem, elem, new Set(supportedAttrs), new Set(['transform']));
304
+ yield ((_c = this.onAddComponent) === null || _c === void 0 ? void 0 : _c.call(this, imageElem));
305
+ }
306
+ catch (e) {
307
+ console.error('Error loading image:', e, '. Element: ', elem, '. Continuing...');
308
+ yield this.addUnknownNode(elem);
309
+ }
310
+ });
311
+ }
312
+ addUnknownNode(node) {
313
+ var _a;
314
+ return __awaiter(this, void 0, void 0, function* () {
315
+ if (this.storeUnknown) {
316
+ const component = new UnknownSVGObject_1.default(node);
317
+ yield ((_a = this.onAddComponent) === null || _a === void 0 ? void 0 : _a.call(this, component));
318
+ }
319
+ });
320
+ }
321
+ updateViewBox(node) {
322
+ var _a;
323
+ const viewBoxAttr = node.getAttribute('viewBox');
324
+ if (this.rootViewBox || !viewBoxAttr) {
325
+ return;
326
+ }
327
+ const components = viewBoxAttr.split(/[ \t\n,]+/);
328
+ const x = parseFloat(components[0]);
329
+ const y = parseFloat(components[1]);
330
+ const width = parseFloat(components[2]);
331
+ const height = parseFloat(components[3]);
332
+ if (isNaN(x) || isNaN(y) || isNaN(width) || isNaN(height)) {
333
+ console.warn(`node ${node} has an unparsable viewbox. Viewbox: ${viewBoxAttr}. Match: ${components}.`);
334
+ return;
335
+ }
336
+ this.rootViewBox = new Rect2_1.default(x, y, width, height);
337
+ (_a = this.onDetermineExportRect) === null || _a === void 0 ? void 0 : _a.call(this, this.rootViewBox);
338
+ }
339
+ updateSVGAttrs(node) {
340
+ var _a;
341
+ return __awaiter(this, void 0, void 0, function* () {
342
+ if (this.storeUnknown) {
343
+ yield ((_a = this.onAddComponent) === null || _a === void 0 ? void 0 : _a.call(this, new SVGGlobalAttributesObject_1.default(this.getSourceAttrs(node))));
344
+ }
345
+ });
346
+ }
347
+ visit(node) {
348
+ var _a;
349
+ return __awaiter(this, void 0, void 0, function* () {
350
+ this.totalToProcess += node.childElementCount;
351
+ let visitChildren = true;
352
+ switch (node.tagName.toLowerCase()) {
353
+ case 'g':
354
+ // Continue -- visit the node's children.
355
+ break;
356
+ case 'path':
357
+ if (node.classList.contains(ImageBackground_1.imageBackgroundCSSClassName)) {
358
+ yield this.addBackground(node);
359
+ }
360
+ else {
361
+ yield this.addPath(node);
362
+ }
363
+ break;
364
+ case 'text':
365
+ yield this.addText(node);
366
+ visitChildren = false;
367
+ break;
368
+ case 'image':
369
+ yield this.addImage(node);
370
+ // Images should not have children.
371
+ visitChildren = false;
372
+ break;
373
+ case 'svg':
374
+ this.updateViewBox(node);
375
+ this.updateSVGAttrs(node);
376
+ break;
377
+ case 'style':
378
+ yield this.addUnknownNode(node);
379
+ break;
380
+ default:
381
+ console.warn('Unknown SVG element,', node);
382
+ if (!(node instanceof SVGElement)) {
383
+ console.warn('Element', node, 'is not an SVGElement!', this.storeUnknown ? 'Continuing anyway.' : 'Skipping.');
384
+ }
385
+ yield this.addUnknownNode(node);
386
+ return;
387
+ }
388
+ if (visitChildren) {
389
+ for (const child of node.children) {
390
+ yield this.visit(child);
391
+ }
392
+ }
393
+ this.processedCount++;
394
+ yield ((_a = this.onProgress) === null || _a === void 0 ? void 0 : _a.call(this, this.processedCount, this.totalToProcess));
395
+ });
396
+ }
397
+ // Get SVG element attributes (e.g. xlink=...)
398
+ getSourceAttrs(node) {
399
+ return node.getAttributeNames().map(attr => {
400
+ return [attr, node.getAttribute(attr)];
401
+ });
402
+ }
403
+ start(onAddComponent, onProgress, onDetermineExportRect = null) {
404
+ var _a, _b;
405
+ return __awaiter(this, void 0, void 0, function* () {
406
+ this.onAddComponent = onAddComponent;
407
+ this.onProgress = onProgress;
408
+ this.onDetermineExportRect = onDetermineExportRect;
409
+ // Estimate the number of tags to process.
410
+ this.totalToProcess = this.source.childElementCount;
411
+ this.processedCount = 0;
412
+ this.rootViewBox = null;
413
+ yield this.visit(this.source);
414
+ const viewBox = this.rootViewBox;
415
+ if (!viewBox) {
416
+ (_a = this.onDetermineExportRect) === null || _a === void 0 ? void 0 : _a.call(this, exports.defaultSVGViewRect);
417
+ }
418
+ (_b = this.onFinish) === null || _b === void 0 ? void 0 : _b.call(this);
419
+ });
420
+ }
421
+ /**
422
+ * Create an `SVGLoader` from the content of an SVG image. SVGs are loaded within a sandboxed
423
+ * iframe with `sandbox="allow-same-origin"`
424
+ * [thereby disabling JavaScript](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#sandbox).
425
+ *
426
+ * @see {@link Editor.loadFrom}
427
+ * @param text - Textual representation of the SVG (e.g. `<svg viewbox='...'>...</svg>`).
428
+ * @param sanitize - if `true`, don't store unknown attributes.
429
+ */
430
+ static fromString(text, sanitize = false) {
431
+ var _a, _b;
432
+ const sandbox = document.createElement('iframe');
433
+ sandbox.src = 'about:blank';
434
+ sandbox.setAttribute('sandbox', 'allow-same-origin');
435
+ sandbox.setAttribute('csp', 'default-src \'about:blank\'');
436
+ sandbox.style.display = 'none';
437
+ // Required to access the frame's DOM. See https://stackoverflow.com/a/17777943/17055750
438
+ document.body.appendChild(sandbox);
439
+ if (!sandbox.hasAttribute('sandbox')) {
440
+ sandbox.remove();
441
+ throw new Error('SVG loading iframe is not sandboxed.');
442
+ }
443
+ const sandboxDoc = (_b = (_a = sandbox.contentWindow) === null || _a === void 0 ? void 0 : _a.document) !== null && _b !== void 0 ? _b : sandbox.contentDocument;
444
+ if (sandboxDoc == null)
445
+ throw new Error('Unable to open a sandboxed iframe!');
446
+ sandboxDoc.open();
447
+ sandboxDoc.write(`
448
+ <!DOCTYPE html>
449
+ <html>
450
+ <head>
451
+ <title>SVG Loading Sandbox</title>
452
+ <meta name='viewport' conent='width=device-width,initial-scale=1.0'/>
453
+ <meta charset='utf-8'/>
454
+ </head>
455
+ <body style='font-size: 12px;'>
456
+ <script>
457
+ console.error('JavaScript should not be able to run here!');
458
+ throw new Error(
459
+ 'The SVG sandbox is broken! Please double-check the sandboxing setting.'
460
+ );
461
+ </script>
462
+ </body>
463
+ </html>
464
+ `);
465
+ sandboxDoc.close();
466
+ const svgElem = sandboxDoc.createElementNS('http://www.w3.org/2000/svg', 'svg');
467
+ svgElem.innerHTML = text;
468
+ sandboxDoc.body.appendChild(svgElem);
469
+ return new SVGLoader(svgElem, () => {
470
+ svgElem.remove();
471
+ sandbox.remove();
472
+ }, !sanitize);
473
+ }
474
+ }
475
+ exports.default = SVGLoader;
@@ -0,0 +1,19 @@
1
+ import Editor from './Editor';
2
+ import Command from './commands/Command';
3
+ type AnnounceRedoCallback = (command: Command) => void;
4
+ type AnnounceUndoCallback = (command: Command) => void;
5
+ declare class UndoRedoHistory {
6
+ #private;
7
+ private readonly editor;
8
+ private announceRedoCallback;
9
+ private announceUndoCallback;
10
+ private readonly maxUndoRedoStackSize;
11
+ constructor(editor: Editor, announceRedoCallback: AnnounceRedoCallback, announceUndoCallback: AnnounceUndoCallback);
12
+ private fireUpdateEvent;
13
+ push(command: Command, apply?: boolean): void;
14
+ undo(): void;
15
+ redo(): void;
16
+ get undoStackSize(): number;
17
+ get redoStackSize(): number;
18
+ }
19
+ export default UndoRedoHistory;