js-draw 0.17.4 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/bundle.js +9 -1
  3. package/package.json +35 -33
  4. package/tsconfig.json +3 -2
  5. package/tsconfig.mjs.json +9 -0
  6. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -34
  7. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  8. package/.github/ISSUE_TEMPLATE/translation.yml +0 -902
  9. package/.github/pull_request_template.md +0 -15
  10. package/.github/workflows/firebase-hosting-merge.yml +0 -32
  11. package/.github/workflows/firebase-hosting-pull-request.yml +0 -32
  12. package/.github/workflows/github-pages.yml +0 -56
  13. package/.husky/pre-commit +0 -4
  14. package/build_tools/BundledFile.ts +0 -167
  15. package/build_tools/buildTranslationTemplate.ts +0 -121
  16. package/build_tools/bundle.ts +0 -11
  17. package/dist/build_tools/BundledFile.d.ts +0 -13
  18. package/dist/build_tools/BundledFile.js +0 -157
  19. package/dist/build_tools/buildTranslationTemplate.d.ts +0 -1
  20. package/dist/build_tools/buildTranslationTemplate.js +0 -94
  21. package/dist/build_tools/bundle.d.ts +0 -1
  22. package/dist/build_tools/bundle.js +0 -5
  23. package/dist/src/Color4.d.ts +0 -60
  24. package/dist/src/Color4.js +0 -192
  25. package/dist/src/Editor.d.ts +0 -308
  26. package/dist/src/Editor.js +0 -874
  27. package/dist/src/EditorImage.d.ts +0 -97
  28. package/dist/src/EditorImage.js +0 -477
  29. package/dist/src/EventDispatcher.d.ts +0 -30
  30. package/dist/src/EventDispatcher.js +0 -54
  31. package/dist/src/Pointer.d.ts +0 -24
  32. package/dist/src/Pointer.js +0 -80
  33. package/dist/src/SVGLoader.d.ts +0 -48
  34. package/dist/src/SVGLoader.js +0 -442
  35. package/dist/src/UndoRedoHistory.d.ts +0 -19
  36. package/dist/src/UndoRedoHistory.js +0 -91
  37. package/dist/src/Viewport.d.ts +0 -71
  38. package/dist/src/Viewport.js +0 -256
  39. package/dist/src/bundle/bundled.d.ts +0 -4
  40. package/dist/src/bundle/bundled.js +0 -5
  41. package/dist/src/commands/Command.d.ts +0 -16
  42. package/dist/src/commands/Command.js +0 -30
  43. package/dist/src/commands/Duplicate.d.ts +0 -14
  44. package/dist/src/commands/Duplicate.js +0 -33
  45. package/dist/src/commands/Erase.d.ts +0 -14
  46. package/dist/src/commands/Erase.js +0 -57
  47. package/dist/src/commands/SerializableCommand.d.ts +0 -12
  48. package/dist/src/commands/SerializableCommand.js +0 -36
  49. package/dist/src/commands/UnresolvedCommand.d.ts +0 -14
  50. package/dist/src/commands/UnresolvedCommand.js +0 -22
  51. package/dist/src/commands/invertCommand.d.ts +0 -4
  52. package/dist/src/commands/invertCommand.js +0 -44
  53. package/dist/src/commands/lib.d.ts +0 -7
  54. package/dist/src/commands/lib.js +0 -7
  55. package/dist/src/commands/localization.d.ts +0 -23
  56. package/dist/src/commands/localization.js +0 -21
  57. package/dist/src/commands/uniteCommands.d.ts +0 -4
  58. package/dist/src/commands/uniteCommands.js +0 -116
  59. package/dist/src/components/AbstractComponent.d.ts +0 -73
  60. package/dist/src/components/AbstractComponent.js +0 -252
  61. package/dist/src/components/ImageBackground.d.ts +0 -42
  62. package/dist/src/components/ImageBackground.js +0 -139
  63. package/dist/src/components/ImageComponent.d.ts +0 -31
  64. package/dist/src/components/ImageComponent.js +0 -146
  65. package/dist/src/components/RestylableComponent.d.ts +0 -24
  66. package/dist/src/components/RestylableComponent.js +0 -80
  67. package/dist/src/components/SVGGlobalAttributesObject.d.ts +0 -21
  68. package/dist/src/components/SVGGlobalAttributesObject.js +0 -59
  69. package/dist/src/components/Stroke.d.ts +0 -40
  70. package/dist/src/components/Stroke.js +0 -185
  71. package/dist/src/components/TextComponent.d.ts +0 -53
  72. package/dist/src/components/TextComponent.js +0 -252
  73. package/dist/src/components/UnknownSVGObject.d.ts +0 -18
  74. package/dist/src/components/UnknownSVGObject.js +0 -44
  75. package/dist/src/components/builders/ArrowBuilder.d.ts +0 -19
  76. package/dist/src/components/builders/ArrowBuilder.js +0 -86
  77. package/dist/src/components/builders/FreehandLineBuilder.d.ts +0 -33
  78. package/dist/src/components/builders/FreehandLineBuilder.js +0 -165
  79. package/dist/src/components/builders/LineBuilder.d.ts +0 -18
  80. package/dist/src/components/builders/LineBuilder.js +0 -58
  81. package/dist/src/components/builders/PressureSensitiveFreehandLineBuilder.d.ts +0 -36
  82. package/dist/src/components/builders/PressureSensitiveFreehandLineBuilder.js +0 -339
  83. package/dist/src/components/builders/RectangleBuilder.d.ts +0 -20
  84. package/dist/src/components/builders/RectangleBuilder.js +0 -50
  85. package/dist/src/components/builders/types.d.ts +0 -12
  86. package/dist/src/components/builders/types.js +0 -1
  87. package/dist/src/components/lib.d.ts +0 -12
  88. package/dist/src/components/lib.js +0 -12
  89. package/dist/src/components/localization.d.ts +0 -11
  90. package/dist/src/components/localization.js +0 -10
  91. package/dist/src/components/util/StrokeSmoother.d.ts +0 -35
  92. package/dist/src/components/util/StrokeSmoother.js +0 -210
  93. package/dist/src/components/util/describeComponentList.d.ts +0 -4
  94. package/dist/src/components/util/describeComponentList.js +0 -14
  95. package/dist/src/lib.d.ts +0 -34
  96. package/dist/src/lib.js +0 -34
  97. package/dist/src/localization.d.ts +0 -14
  98. package/dist/src/localization.js +0 -10
  99. package/dist/src/localizations/de.d.ts +0 -3
  100. package/dist/src/localizations/de.js +0 -4
  101. package/dist/src/localizations/en.d.ts +0 -3
  102. package/dist/src/localizations/en.js +0 -4
  103. package/dist/src/localizations/es.d.ts +0 -3
  104. package/dist/src/localizations/es.js +0 -18
  105. package/dist/src/localizations/getLocalizationTable.d.ts +0 -3
  106. package/dist/src/localizations/getLocalizationTable.js +0 -45
  107. package/dist/src/math/LineSegment2.d.ts +0 -24
  108. package/dist/src/math/LineSegment2.js +0 -125
  109. package/dist/src/math/Mat33.d.ts +0 -118
  110. package/dist/src/math/Mat33.js +0 -326
  111. package/dist/src/math/Path.d.ts +0 -71
  112. package/dist/src/math/Path.js +0 -648
  113. package/dist/src/math/Rect2.d.ts +0 -52
  114. package/dist/src/math/Rect2.js +0 -228
  115. package/dist/src/math/Triangle.d.ts +0 -11
  116. package/dist/src/math/Triangle.js +0 -19
  117. package/dist/src/math/Vec2.d.ts +0 -13
  118. package/dist/src/math/Vec2.js +0 -13
  119. package/dist/src/math/Vec3.d.ts +0 -106
  120. package/dist/src/math/Vec3.js +0 -174
  121. package/dist/src/math/lib.d.ts +0 -7
  122. package/dist/src/math/lib.js +0 -7
  123. package/dist/src/math/rounding.d.ts +0 -4
  124. package/dist/src/math/rounding.js +0 -128
  125. package/dist/src/rendering/Display.d.ts +0 -75
  126. package/dist/src/rendering/Display.js +0 -207
  127. package/dist/src/rendering/RenderingStyle.d.ts +0 -31
  128. package/dist/src/rendering/RenderingStyle.js +0 -38
  129. package/dist/src/rendering/TextRenderingStyle.d.ts +0 -36
  130. package/dist/src/rendering/TextRenderingStyle.js +0 -23
  131. package/dist/src/rendering/caching/CacheRecord.d.ts +0 -20
  132. package/dist/src/rendering/caching/CacheRecord.js +0 -55
  133. package/dist/src/rendering/caching/CacheRecordManager.d.ts +0 -12
  134. package/dist/src/rendering/caching/CacheRecordManager.js +0 -43
  135. package/dist/src/rendering/caching/RenderingCache.d.ts +0 -11
  136. package/dist/src/rendering/caching/RenderingCache.js +0 -45
  137. package/dist/src/rendering/caching/RenderingCacheNode.d.ts +0 -29
  138. package/dist/src/rendering/caching/RenderingCacheNode.js +0 -320
  139. package/dist/src/rendering/caching/testUtils.d.ts +0 -9
  140. package/dist/src/rendering/caching/testUtils.js +0 -20
  141. package/dist/src/rendering/caching/types.d.ts +0 -19
  142. package/dist/src/rendering/caching/types.js +0 -1
  143. package/dist/src/rendering/lib.d.ts +0 -5
  144. package/dist/src/rendering/lib.js +0 -5
  145. package/dist/src/rendering/localization.d.ts +0 -10
  146. package/dist/src/rendering/localization.js +0 -9
  147. package/dist/src/rendering/renderers/AbstractRenderer.d.ts +0 -68
  148. package/dist/src/rendering/renderers/AbstractRenderer.js +0 -144
  149. package/dist/src/rendering/renderers/CanvasRenderer.d.ts +0 -63
  150. package/dist/src/rendering/renderers/CanvasRenderer.js +0 -230
  151. package/dist/src/rendering/renderers/DummyRenderer.d.ts +0 -35
  152. package/dist/src/rendering/renderers/DummyRenderer.js +0 -106
  153. package/dist/src/rendering/renderers/SVGRenderer.d.ts +0 -57
  154. package/dist/src/rendering/renderers/SVGRenderer.js +0 -304
  155. package/dist/src/rendering/renderers/TextOnlyRenderer.d.ts +0 -29
  156. package/dist/src/rendering/renderers/TextOnlyRenderer.js +0 -57
  157. package/dist/src/testing/beforeEachFile.d.ts +0 -1
  158. package/dist/src/testing/beforeEachFile.js +0 -7
  159. package/dist/src/testing/createEditor.d.ts +0 -4
  160. package/dist/src/testing/createEditor.js +0 -9
  161. package/dist/src/testing/lib.d.ts +0 -2
  162. package/dist/src/testing/lib.js +0 -2
  163. package/dist/src/testing/loadExpectExtensions.d.ts +0 -2
  164. package/dist/src/testing/loadExpectExtensions.js +0 -24
  165. package/dist/src/testing/sendPenEvent.d.ts +0 -12
  166. package/dist/src/testing/sendPenEvent.js +0 -19
  167. package/dist/src/testing/sendTouchEvent.d.ts +0 -42
  168. package/dist/src/testing/sendTouchEvent.js +0 -62
  169. package/dist/src/toolbar/HTMLToolbar.d.ts +0 -103
  170. package/dist/src/toolbar/HTMLToolbar.js +0 -376
  171. package/dist/src/toolbar/IconProvider.d.ts +0 -62
  172. package/dist/src/toolbar/IconProvider.js +0 -654
  173. package/dist/src/toolbar/lib.d.ts +0 -3
  174. package/dist/src/toolbar/lib.js +0 -3
  175. package/dist/src/toolbar/localization.d.ts +0 -49
  176. package/dist/src/toolbar/localization.js +0 -48
  177. package/dist/src/toolbar/makeColorInput.d.ts +0 -6
  178. package/dist/src/toolbar/makeColorInput.js +0 -113
  179. package/dist/src/toolbar/types.d.ts +0 -4
  180. package/dist/src/toolbar/types.js +0 -1
  181. package/dist/src/toolbar/widgets/ActionButtonWidget.d.ts +0 -15
  182. package/dist/src/toolbar/widgets/ActionButtonWidget.js +0 -25
  183. package/dist/src/toolbar/widgets/BaseToolWidget.d.ts +0 -11
  184. package/dist/src/toolbar/widgets/BaseToolWidget.js +0 -44
  185. package/dist/src/toolbar/widgets/BaseWidget.d.ts +0 -72
  186. package/dist/src/toolbar/widgets/BaseWidget.js +0 -307
  187. package/dist/src/toolbar/widgets/DocumentPropertiesWidget.d.ts +0 -18
  188. package/dist/src/toolbar/widgets/DocumentPropertiesWidget.js +0 -120
  189. package/dist/src/toolbar/widgets/EraserToolWidget.d.ts +0 -17
  190. package/dist/src/toolbar/widgets/EraserToolWidget.js +0 -57
  191. package/dist/src/toolbar/widgets/HandToolWidget.d.ts +0 -17
  192. package/dist/src/toolbar/widgets/HandToolWidget.js +0 -172
  193. package/dist/src/toolbar/widgets/InsertImageWidget.d.ts +0 -19
  194. package/dist/src/toolbar/widgets/InsertImageWidget.js +0 -170
  195. package/dist/src/toolbar/widgets/OverflowWidget.d.ts +0 -25
  196. package/dist/src/toolbar/widgets/OverflowWidget.js +0 -71
  197. package/dist/src/toolbar/widgets/PenToolWidget.d.ts +0 -27
  198. package/dist/src/toolbar/widgets/PenToolWidget.js +0 -220
  199. package/dist/src/toolbar/widgets/SelectionToolWidget.d.ts +0 -13
  200. package/dist/src/toolbar/widgets/SelectionToolWidget.js +0 -147
  201. package/dist/src/toolbar/widgets/TextToolWidget.d.ts +0 -16
  202. package/dist/src/toolbar/widgets/TextToolWidget.js +0 -109
  203. package/dist/src/toolbar/widgets/lib.d.ts +0 -10
  204. package/dist/src/toolbar/widgets/lib.js +0 -10
  205. package/dist/src/tools/BaseTool.d.ts +0 -22
  206. package/dist/src/tools/BaseTool.js +0 -63
  207. package/dist/src/tools/Eraser.d.ts +0 -23
  208. package/dist/src/tools/Eraser.js +0 -106
  209. package/dist/src/tools/FindTool.d.ts +0 -21
  210. package/dist/src/tools/FindTool.js +0 -114
  211. package/dist/src/tools/PanZoom.d.ts +0 -52
  212. package/dist/src/tools/PanZoom.js +0 -414
  213. package/dist/src/tools/PasteHandler.d.ts +0 -23
  214. package/dist/src/tools/PasteHandler.js +0 -93
  215. package/dist/src/tools/Pen.d.ts +0 -39
  216. package/dist/src/tools/Pen.js +0 -173
  217. package/dist/src/tools/PipetteTool.d.ts +0 -18
  218. package/dist/src/tools/PipetteTool.js +0 -39
  219. package/dist/src/tools/SelectionTool/SelectAllShortcutHandler.d.ts +0 -8
  220. package/dist/src/tools/SelectionTool/SelectAllShortcutHandler.js +0 -22
  221. package/dist/src/tools/SelectionTool/Selection.d.ts +0 -64
  222. package/dist/src/tools/SelectionTool/Selection.js +0 -459
  223. package/dist/src/tools/SelectionTool/SelectionHandle.d.ts +0 -38
  224. package/dist/src/tools/SelectionTool/SelectionHandle.js +0 -81
  225. package/dist/src/tools/SelectionTool/SelectionTool.d.ts +0 -36
  226. package/dist/src/tools/SelectionTool/SelectionTool.js +0 -398
  227. package/dist/src/tools/SelectionTool/TransformMode.d.ts +0 -34
  228. package/dist/src/tools/SelectionTool/TransformMode.js +0 -98
  229. package/dist/src/tools/SelectionTool/types.d.ts +0 -9
  230. package/dist/src/tools/SelectionTool/types.js +0 -11
  231. package/dist/src/tools/TextTool.d.ts +0 -33
  232. package/dist/src/tools/TextTool.js +0 -256
  233. package/dist/src/tools/ToolController.d.ts +0 -18
  234. package/dist/src/tools/ToolController.js +0 -158
  235. package/dist/src/tools/ToolEnabledGroup.d.ts +0 -6
  236. package/dist/src/tools/ToolEnabledGroup.js +0 -11
  237. package/dist/src/tools/ToolSwitcherShortcut.d.ts +0 -16
  238. package/dist/src/tools/ToolSwitcherShortcut.js +0 -32
  239. package/dist/src/tools/ToolbarShortcutHandler.d.ts +0 -12
  240. package/dist/src/tools/ToolbarShortcutHandler.js +0 -23
  241. package/dist/src/tools/UndoRedoShortcut.d.ts +0 -8
  242. package/dist/src/tools/UndoRedoShortcut.js +0 -22
  243. package/dist/src/tools/lib.d.ts +0 -16
  244. package/dist/src/tools/lib.js +0 -16
  245. package/dist/src/tools/localization.d.ts +0 -28
  246. package/dist/src/tools/localization.js +0 -27
  247. package/dist/src/types.d.ts +0 -151
  248. package/dist/src/types.js +0 -35
  249. package/dist/src/util/assertions.d.ts +0 -23
  250. package/dist/src/util/assertions.js +0 -45
  251. package/dist/src/util/fileToBase64.d.ts +0 -3
  252. package/dist/src/util/fileToBase64.js +0 -13
  253. package/dist/src/util/untilNextAnimationFrame.d.ts +0 -3
  254. package/dist/src/util/untilNextAnimationFrame.js +0 -7
  255. package/dist/src/util/waitForTimeout.d.ts +0 -2
  256. package/dist/src/util/waitForTimeout.js +0 -7
  257. package/src/Color4.test.ts +0 -40
  258. package/src/Color4.ts +0 -234
  259. package/src/Editor.css +0 -86
  260. package/src/Editor.loadFrom.test.ts +0 -24
  261. package/src/Editor.toSVG.test.ts +0 -111
  262. package/src/Editor.ts +0 -1122
  263. package/src/EditorImage.test.ts +0 -120
  264. package/src/EditorImage.ts +0 -603
  265. package/src/EventDispatcher.test.ts +0 -123
  266. package/src/EventDispatcher.ts +0 -71
  267. package/src/Pointer.ts +0 -127
  268. package/src/SVGLoader.test.ts +0 -114
  269. package/src/SVGLoader.ts +0 -511
  270. package/src/UndoRedoHistory.test.ts +0 -33
  271. package/src/UndoRedoHistory.ts +0 -102
  272. package/src/Viewport.ts +0 -319
  273. package/src/bundle/bundled.ts +0 -7
  274. package/src/commands/Command.ts +0 -45
  275. package/src/commands/Duplicate.ts +0 -48
  276. package/src/commands/Erase.ts +0 -74
  277. package/src/commands/SerializableCommand.ts +0 -49
  278. package/src/commands/UnresolvedCommand.ts +0 -37
  279. package/src/commands/invertCommand.ts +0 -51
  280. package/src/commands/lib.ts +0 -16
  281. package/src/commands/localization.ts +0 -47
  282. package/src/commands/uniteCommands.test.ts +0 -23
  283. package/src/commands/uniteCommands.ts +0 -135
  284. package/src/components/AbstractComponent.transformBy.test.ts +0 -22
  285. package/src/components/AbstractComponent.ts +0 -364
  286. package/src/components/ImageBackground.test.ts +0 -35
  287. package/src/components/ImageBackground.ts +0 -176
  288. package/src/components/ImageComponent.ts +0 -171
  289. package/src/components/RestylableComponent.ts +0 -142
  290. package/src/components/SVGGlobalAttributesObject.ts +0 -81
  291. package/src/components/Stroke.test.ts +0 -139
  292. package/src/components/Stroke.ts +0 -245
  293. package/src/components/TextComponent.test.ts +0 -99
  294. package/src/components/TextComponent.ts +0 -315
  295. package/src/components/UnknownSVGObject.test.ts +0 -10
  296. package/src/components/UnknownSVGObject.ts +0 -60
  297. package/src/components/builders/ArrowBuilder.ts +0 -107
  298. package/src/components/builders/FreehandLineBuilder.ts +0 -212
  299. package/src/components/builders/LineBuilder.ts +0 -77
  300. package/src/components/builders/PressureSensitiveFreehandLineBuilder.ts +0 -454
  301. package/src/components/builders/RectangleBuilder.ts +0 -74
  302. package/src/components/builders/types.ts +0 -15
  303. package/src/components/lib.ts +0 -25
  304. package/src/components/localization.ts +0 -22
  305. package/src/components/util/StrokeSmoother.ts +0 -293
  306. package/src/components/util/describeComponentList.ts +0 -18
  307. package/src/lib.ts +0 -37
  308. package/src/localization.ts +0 -34
  309. package/src/localizations/de.ts +0 -98
  310. package/src/localizations/en.ts +0 -8
  311. package/src/localizations/es.ts +0 -74
  312. package/src/localizations/getLocalizationTable.test.ts +0 -27
  313. package/src/localizations/getLocalizationTable.ts +0 -55
  314. package/src/math/LineSegment2.test.ts +0 -99
  315. package/src/math/LineSegment2.ts +0 -160
  316. package/src/math/Mat33.test.ts +0 -244
  317. package/src/math/Mat33.ts +0 -437
  318. package/src/math/Path.fromString.test.ts +0 -223
  319. package/src/math/Path.test.ts +0 -198
  320. package/src/math/Path.toString.test.ts +0 -77
  321. package/src/math/Path.ts +0 -790
  322. package/src/math/Rect2.test.ts +0 -204
  323. package/src/math/Rect2.ts +0 -315
  324. package/src/math/Triangle.ts +0 -29
  325. package/src/math/Vec2.test.ts +0 -30
  326. package/src/math/Vec2.ts +0 -18
  327. package/src/math/Vec3.test.ts +0 -44
  328. package/src/math/Vec3.ts +0 -218
  329. package/src/math/lib.ts +0 -15
  330. package/src/math/rounding.test.ts +0 -65
  331. package/src/math/rounding.ts +0 -156
  332. package/src/rendering/Display.ts +0 -249
  333. package/src/rendering/RenderingStyle.test.ts +0 -68
  334. package/src/rendering/RenderingStyle.ts +0 -55
  335. package/src/rendering/TextRenderingStyle.ts +0 -45
  336. package/src/rendering/caching/CacheRecord.test.ts +0 -49
  337. package/src/rendering/caching/CacheRecord.ts +0 -77
  338. package/src/rendering/caching/CacheRecordManager.ts +0 -71
  339. package/src/rendering/caching/RenderingCache.test.ts +0 -44
  340. package/src/rendering/caching/RenderingCache.ts +0 -66
  341. package/src/rendering/caching/RenderingCacheNode.ts +0 -405
  342. package/src/rendering/caching/testUtils.ts +0 -35
  343. package/src/rendering/caching/types.ts +0 -34
  344. package/src/rendering/lib.ts +0 -6
  345. package/src/rendering/localization.ts +0 -20
  346. package/src/rendering/renderers/AbstractRenderer.ts +0 -222
  347. package/src/rendering/renderers/CanvasRenderer.ts +0 -296
  348. package/src/rendering/renderers/DummyRenderer.test.ts +0 -42
  349. package/src/rendering/renderers/DummyRenderer.ts +0 -136
  350. package/src/rendering/renderers/SVGRenderer.ts +0 -354
  351. package/src/rendering/renderers/TextOnlyRenderer.ts +0 -70
  352. package/src/styles.js +0 -7
  353. package/src/testing/beforeEachFile.ts +0 -8
  354. package/src/testing/createEditor.ts +0 -11
  355. package/src/testing/global.d.ts +0 -17
  356. package/src/testing/lib.ts +0 -3
  357. package/src/testing/loadExpectExtensions.ts +0 -25
  358. package/src/testing/sendPenEvent.ts +0 -31
  359. package/src/testing/sendTouchEvent.ts +0 -78
  360. package/src/toolbar/HTMLToolbar.ts +0 -492
  361. package/src/toolbar/IconProvider.ts +0 -736
  362. package/src/toolbar/lib.ts +0 -4
  363. package/src/toolbar/localization.ts +0 -106
  364. package/src/toolbar/makeColorInput.ts +0 -145
  365. package/src/toolbar/toolbar.css +0 -213
  366. package/src/toolbar/types.ts +0 -5
  367. package/src/toolbar/widgets/ActionButtonWidget.ts +0 -39
  368. package/src/toolbar/widgets/BaseToolWidget.ts +0 -56
  369. package/src/toolbar/widgets/BaseWidget.ts +0 -377
  370. package/src/toolbar/widgets/DocumentPropertiesWidget.ts +0 -167
  371. package/src/toolbar/widgets/EraserToolWidget.ts +0 -85
  372. package/src/toolbar/widgets/HandToolWidget.ts +0 -250
  373. package/src/toolbar/widgets/InsertImageWidget.css +0 -44
  374. package/src/toolbar/widgets/InsertImageWidget.ts +0 -223
  375. package/src/toolbar/widgets/OverflowWidget.css +0 -27
  376. package/src/toolbar/widgets/OverflowWidget.ts +0 -92
  377. package/src/toolbar/widgets/PenToolWidget.ts +0 -288
  378. package/src/toolbar/widgets/SelectionToolWidget.ts +0 -190
  379. package/src/toolbar/widgets/TextToolWidget.ts +0 -145
  380. package/src/toolbar/widgets/lib.ts +0 -13
  381. package/src/tools/BaseTool.ts +0 -76
  382. package/src/tools/Eraser.test.ts +0 -103
  383. package/src/tools/Eraser.ts +0 -139
  384. package/src/tools/FindTool.css +0 -7
  385. package/src/tools/FindTool.ts +0 -152
  386. package/src/tools/PanZoom.test.ts +0 -310
  387. package/src/tools/PanZoom.ts +0 -520
  388. package/src/tools/PasteHandler.ts +0 -95
  389. package/src/tools/Pen.test.ts +0 -194
  390. package/src/tools/Pen.ts +0 -226
  391. package/src/tools/PipetteTool.ts +0 -55
  392. package/src/tools/SelectionTool/SelectAllShortcutHandler.ts +0 -28
  393. package/src/tools/SelectionTool/Selection.ts +0 -607
  394. package/src/tools/SelectionTool/SelectionHandle.ts +0 -108
  395. package/src/tools/SelectionTool/SelectionTool.css +0 -23
  396. package/src/tools/SelectionTool/SelectionTool.test.ts +0 -261
  397. package/src/tools/SelectionTool/SelectionTool.ts +0 -480
  398. package/src/tools/SelectionTool/TransformMode.ts +0 -114
  399. package/src/tools/SelectionTool/types.ts +0 -11
  400. package/src/tools/TextTool.ts +0 -326
  401. package/src/tools/ToolController.ts +0 -178
  402. package/src/tools/ToolEnabledGroup.ts +0 -14
  403. package/src/tools/ToolSwitcherShortcut.ts +0 -39
  404. package/src/tools/ToolbarShortcutHandler.ts +0 -34
  405. package/src/tools/UndoRedoShortcut.test.ts +0 -56
  406. package/src/tools/UndoRedoShortcut.ts +0 -25
  407. package/src/tools/lib.ts +0 -21
  408. package/src/tools/localization.ts +0 -66
  409. package/src/types.ts +0 -234
  410. package/src/util/assertions.ts +0 -55
  411. package/src/util/fileToBase64.ts +0 -18
  412. package/src/util/untilNextAnimationFrame.ts +0 -9
  413. package/src/util/waitForTimeout.ts +0 -9
@@ -1,648 +0,0 @@
1
- import { Bezier } from 'bezier-js';
2
- import { toRoundedString, toStringOfSamePrecision } from './rounding';
3
- import LineSegment2 from './LineSegment2';
4
- import Mat33 from './Mat33';
5
- import Rect2 from './Rect2';
6
- import { Vec2 } from './Vec2';
7
- export var PathCommandType;
8
- (function (PathCommandType) {
9
- PathCommandType[PathCommandType["LineTo"] = 0] = "LineTo";
10
- PathCommandType[PathCommandType["MoveTo"] = 1] = "MoveTo";
11
- PathCommandType[PathCommandType["CubicBezierTo"] = 2] = "CubicBezierTo";
12
- PathCommandType[PathCommandType["QuadraticBezierTo"] = 3] = "QuadraticBezierTo";
13
- })(PathCommandType || (PathCommandType = {}));
14
- export default class Path {
15
- constructor(startPoint, parts) {
16
- this.startPoint = startPoint;
17
- this.parts = parts;
18
- this.cachedGeometry = null;
19
- this.cachedPolylineApproximation = null;
20
- this.cachedStringVersion = null;
21
- // Initial bounding box contains one point: the start point.
22
- this.bbox = Rect2.bboxOf([startPoint]);
23
- // Convert into a representation of the geometry (cache for faster intersection
24
- // calculation)
25
- for (const part of parts) {
26
- this.bbox = this.bbox.union(Path.computeBBoxForSegment(startPoint, part));
27
- }
28
- }
29
- // Lazy-loads and returns this path's geometry
30
- get geometry() {
31
- if (this.cachedGeometry) {
32
- return this.cachedGeometry;
33
- }
34
- let startPoint = this.startPoint;
35
- const geometry = [];
36
- for (const part of this.parts) {
37
- switch (part.kind) {
38
- case PathCommandType.CubicBezierTo:
39
- geometry.push(new Bezier(startPoint.xy, part.controlPoint1.xy, part.controlPoint2.xy, part.endPoint.xy));
40
- startPoint = part.endPoint;
41
- break;
42
- case PathCommandType.QuadraticBezierTo:
43
- geometry.push(new Bezier(startPoint.xy, part.controlPoint.xy, part.endPoint.xy));
44
- startPoint = part.endPoint;
45
- break;
46
- case PathCommandType.LineTo:
47
- geometry.push(new LineSegment2(startPoint, part.point));
48
- startPoint = part.point;
49
- break;
50
- case PathCommandType.MoveTo:
51
- startPoint = part.point;
52
- break;
53
- }
54
- }
55
- this.cachedGeometry = geometry;
56
- return this.cachedGeometry;
57
- }
58
- // Approximates this path with a group of line segments.
59
- polylineApproximation() {
60
- if (this.cachedPolylineApproximation) {
61
- return this.cachedPolylineApproximation;
62
- }
63
- const points = [];
64
- for (const part of this.parts) {
65
- switch (part.kind) {
66
- case PathCommandType.CubicBezierTo:
67
- points.push(part.controlPoint1, part.controlPoint2, part.endPoint);
68
- break;
69
- case PathCommandType.QuadraticBezierTo:
70
- points.push(part.controlPoint, part.endPoint);
71
- break;
72
- case PathCommandType.MoveTo:
73
- case PathCommandType.LineTo:
74
- points.push(part.point);
75
- break;
76
- }
77
- }
78
- const result = [];
79
- let prevPoint = this.startPoint;
80
- for (const point of points) {
81
- result.push(new LineSegment2(prevPoint, point));
82
- prevPoint = point;
83
- }
84
- return result;
85
- }
86
- static computeBBoxForSegment(startPoint, part) {
87
- const points = [startPoint];
88
- let exhaustivenessCheck;
89
- switch (part.kind) {
90
- case PathCommandType.MoveTo:
91
- case PathCommandType.LineTo:
92
- points.push(part.point);
93
- break;
94
- case PathCommandType.CubicBezierTo:
95
- points.push(part.controlPoint1, part.controlPoint2, part.endPoint);
96
- break;
97
- case PathCommandType.QuadraticBezierTo:
98
- points.push(part.controlPoint, part.endPoint);
99
- break;
100
- default:
101
- exhaustivenessCheck = part;
102
- return exhaustivenessCheck;
103
- }
104
- return Rect2.bboxOf(points);
105
- }
106
- intersection(line) {
107
- if (!line.bbox.intersects(this.bbox)) {
108
- return [];
109
- }
110
- const result = [];
111
- for (const part of this.geometry) {
112
- if (part instanceof LineSegment2) {
113
- const intersection = part.intersection(line);
114
- if (intersection) {
115
- result.push({
116
- curve: part,
117
- parameterValue: intersection.t,
118
- point: intersection.point,
119
- });
120
- }
121
- }
122
- else {
123
- const intersectionPoints = part.intersects(line).map(t => {
124
- // We're using the .intersects(line) function, which is documented
125
- // to always return numbers. However, to satisfy the type checker (and
126
- // possibly improperly-defined types),
127
- if (typeof t === 'string') {
128
- t = parseFloat(t);
129
- }
130
- const point = Vec2.ofXY(part.get(t));
131
- // Ensure that the intersection is on the line
132
- if (point.minus(line.p1).magnitude() > line.length
133
- || point.minus(line.p2).magnitude() > line.length) {
134
- return null;
135
- }
136
- return {
137
- point,
138
- parameterValue: t,
139
- curve: part,
140
- };
141
- }).filter(entry => entry !== null);
142
- result.push(...intersectionPoints);
143
- }
144
- }
145
- return result;
146
- }
147
- static mapPathCommand(part, mapping) {
148
- switch (part.kind) {
149
- case PathCommandType.MoveTo:
150
- case PathCommandType.LineTo:
151
- return {
152
- kind: part.kind,
153
- point: mapping(part.point),
154
- };
155
- break;
156
- case PathCommandType.CubicBezierTo:
157
- return {
158
- kind: part.kind,
159
- controlPoint1: mapping(part.controlPoint1),
160
- controlPoint2: mapping(part.controlPoint2),
161
- endPoint: mapping(part.endPoint),
162
- };
163
- break;
164
- case PathCommandType.QuadraticBezierTo:
165
- return {
166
- kind: part.kind,
167
- controlPoint: mapping(part.controlPoint),
168
- endPoint: mapping(part.endPoint),
169
- };
170
- break;
171
- }
172
- const exhaustivenessCheck = part;
173
- return exhaustivenessCheck;
174
- }
175
- mapPoints(mapping) {
176
- const startPoint = mapping(this.startPoint);
177
- const newParts = [];
178
- for (const part of this.parts) {
179
- newParts.push(Path.mapPathCommand(part, mapping));
180
- }
181
- return new Path(startPoint, newParts);
182
- }
183
- transformedBy(affineTransfm) {
184
- if (affineTransfm.isIdentity()) {
185
- return this;
186
- }
187
- return this.mapPoints(point => affineTransfm.transformVec2(point));
188
- }
189
- // Creates a new path by joining [other] to the end of this path
190
- union(other) {
191
- if (!other) {
192
- return this;
193
- }
194
- return new Path(this.startPoint, [
195
- ...this.parts,
196
- {
197
- kind: PathCommandType.MoveTo,
198
- point: other.startPoint,
199
- },
200
- ...other.parts,
201
- ]);
202
- }
203
- getEndPoint() {
204
- if (this.parts.length === 0) {
205
- return this.startPoint;
206
- }
207
- const lastPart = this.parts[this.parts.length - 1];
208
- if (lastPart.kind === PathCommandType.QuadraticBezierTo || lastPart.kind === PathCommandType.CubicBezierTo) {
209
- return lastPart.endPoint;
210
- }
211
- else {
212
- return lastPart.point;
213
- }
214
- }
215
- roughlyIntersects(rect, strokeWidth = 0) {
216
- if (this.parts.length === 0) {
217
- return rect.containsPoint(this.startPoint);
218
- }
219
- const isClosed = this.startPoint.eq(this.getEndPoint());
220
- if (isClosed && strokeWidth === 0) {
221
- return this.closedRoughlyIntersects(rect);
222
- }
223
- if (rect.containsRect(this.bbox)) {
224
- return true;
225
- }
226
- // Does the rectangle intersect the bounding boxes of any of this' parts?
227
- let startPoint = this.startPoint;
228
- for (const part of this.parts) {
229
- const bbox = Path.computeBBoxForSegment(startPoint, part).grownBy(strokeWidth);
230
- if (part.kind === PathCommandType.LineTo || part.kind === PathCommandType.MoveTo) {
231
- startPoint = part.point;
232
- }
233
- else {
234
- startPoint = part.endPoint;
235
- }
236
- if (rect.intersects(bbox)) {
237
- return true;
238
- }
239
- }
240
- return false;
241
- }
242
- // Treats this as a closed path and returns true if part of `rect` is roughly within
243
- // this path's interior.
244
- //
245
- // Note: Assumes that this is a closed, non-self-intersecting path.
246
- closedRoughlyIntersects(rect) {
247
- if (rect.containsRect(this.bbox)) {
248
- return true;
249
- }
250
- // Choose a point outside of the path.
251
- const startPt = this.bbox.topLeft.minus(Vec2.of(1, 1));
252
- const testPts = rect.corners;
253
- const polygon = this.polylineApproximation();
254
- for (const point of testPts) {
255
- const testLine = new LineSegment2(point, startPt);
256
- let intersectionCount = 0;
257
- for (const line of polygon) {
258
- if (line.intersects(testLine)) {
259
- intersectionCount++;
260
- }
261
- }
262
- // Odd? The point is within the polygon!
263
- if (intersectionCount % 2 === 1) {
264
- return true;
265
- }
266
- }
267
- // Grow the rectangle for possible additional precision.
268
- const grownRect = rect.grownBy(Math.min(rect.size.x, rect.size.y));
269
- const edges = [];
270
- for (const subrect of grownRect.divideIntoGrid(4, 4)) {
271
- edges.push(...subrect.getEdges());
272
- }
273
- for (const edge of edges) {
274
- for (const line of polygon) {
275
- if (edge.intersects(line)) {
276
- return true;
277
- }
278
- }
279
- }
280
- // Even? Probably no intersection.
281
- return false;
282
- }
283
- // Returns a path that outlines [rect]. If [lineWidth] is not given, the resultant path is
284
- // the outline of [rect]. Otherwise, the resultant path represents a line of width [lineWidth]
285
- // that traces [rect].
286
- static fromRect(rect, lineWidth = null) {
287
- const commands = [];
288
- let corners;
289
- let startPoint;
290
- if (lineWidth !== null) {
291
- // Vector from the top left corner or bottom right corner to the edge of the
292
- // stroked region.
293
- const cornerToEdge = Vec2.of(lineWidth, lineWidth).times(0.5);
294
- const innerRect = Rect2.fromCorners(rect.topLeft.plus(cornerToEdge), rect.bottomRight.minus(cornerToEdge));
295
- const outerRect = Rect2.fromCorners(rect.topLeft.minus(cornerToEdge), rect.bottomRight.plus(cornerToEdge));
296
- corners = [
297
- innerRect.corners[3],
298
- ...innerRect.corners,
299
- ...outerRect.corners.reverse(),
300
- ];
301
- startPoint = outerRect.corners[3];
302
- }
303
- else {
304
- corners = rect.corners.slice(1);
305
- startPoint = rect.corners[0];
306
- }
307
- for (const corner of corners) {
308
- commands.push({
309
- kind: PathCommandType.LineTo,
310
- point: corner,
311
- });
312
- }
313
- // Close the shape
314
- commands.push({
315
- kind: PathCommandType.LineTo,
316
- point: startPoint,
317
- });
318
- return new Path(startPoint, commands);
319
- }
320
- static fromRenderable(renderable) {
321
- if (renderable.path) {
322
- return renderable.path;
323
- }
324
- return new Path(renderable.startPoint, renderable.commands);
325
- }
326
- toRenderable(fill) {
327
- return {
328
- startPoint: this.startPoint,
329
- style: fill,
330
- commands: this.parts,
331
- path: this,
332
- };
333
- }
334
- /**
335
- * @returns a Path that, when rendered, looks roughly equivalent to the given path.
336
- */
337
- static visualEquivalent(renderablePath, visibleRect) {
338
- var _a, _b;
339
- const path = Path.fromRenderable(renderablePath);
340
- const strokeWidth = (_b = (_a = renderablePath.style.stroke) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : 0;
341
- const onlyStroked = strokeWidth > 0 && renderablePath.style.fill.a === 0;
342
- // Scale the expanded rect --- the visual equivalent is only close for huge strokes.
343
- const expandedRect = visibleRect.grownBy(strokeWidth)
344
- .transformedBoundingBox(Mat33.scaling2D(2, visibleRect.center));
345
- // TODO: Handle simplifying very small paths.
346
- if (expandedRect.containsRect(path.bbox.grownBy(strokeWidth))) {
347
- return renderablePath;
348
- }
349
- const parts = [];
350
- let startPoint = path.startPoint;
351
- for (const part of path.parts) {
352
- const partBBox = Path.computeBBoxForSegment(startPoint, part).grownBy(strokeWidth);
353
- let endPoint;
354
- if (part.kind === PathCommandType.LineTo || part.kind === PathCommandType.MoveTo) {
355
- endPoint = part.point;
356
- }
357
- else {
358
- endPoint = part.endPoint;
359
- }
360
- const intersectsVisible = partBBox.intersects(visibleRect);
361
- if (intersectsVisible) {
362
- // TODO: Can we trim parts of paths that intersect the visible rectangle?
363
- parts.push(part);
364
- }
365
- else if (onlyStroked || part.kind === PathCommandType.MoveTo) {
366
- // We're stroking (not filling) and the path doesn't intersect the bounding box.
367
- // Don't draw it, but preserve the endpoints.
368
- parts.push({
369
- kind: PathCommandType.MoveTo,
370
- point: endPoint,
371
- });
372
- }
373
- else {
374
- // Otherwise, we may be filling. Try to roughly preserve the filled region.
375
- parts.push({
376
- kind: PathCommandType.LineTo,
377
- point: endPoint,
378
- });
379
- }
380
- startPoint = endPoint;
381
- }
382
- return new Path(path.startPoint, parts).toRenderable(renderablePath.style);
383
- }
384
- toString(useNonAbsCommands) {
385
- if (this.cachedStringVersion) {
386
- return this.cachedStringVersion;
387
- }
388
- if (useNonAbsCommands === undefined) {
389
- // Hueristic: Try to determine whether converting absolute to relative commands is worth it.
390
- useNonAbsCommands = Math.abs(this.bbox.topLeft.x) > 10 && Math.abs(this.bbox.topLeft.y) > 10;
391
- }
392
- const result = Path.toString(this.startPoint, this.parts, !useNonAbsCommands);
393
- this.cachedStringVersion = result;
394
- return result;
395
- }
396
- serialize() {
397
- return this.toString();
398
- }
399
- // @param onlyAbsCommands - True if we should avoid converting absolute coordinates to relative offsets -- such
400
- // conversions can lead to smaller output strings, but also take time.
401
- static toString(startPoint, parts, onlyAbsCommands) {
402
- var _a;
403
- const result = [];
404
- let prevPoint;
405
- const addCommand = (command, ...points) => {
406
- const absoluteCommandParts = [];
407
- const relativeCommandParts = [];
408
- const makeAbsCommand = !prevPoint || onlyAbsCommands;
409
- const roundedPrevX = prevPoint ? toRoundedString(prevPoint.x) : '';
410
- const roundedPrevY = prevPoint ? toRoundedString(prevPoint.y) : '';
411
- for (const point of points) {
412
- const xComponent = toRoundedString(point.x);
413
- const yComponent = toRoundedString(point.y);
414
- // Relative commands are often shorter as strings than absolute commands.
415
- if (!makeAbsCommand) {
416
- const xComponentRelative = toStringOfSamePrecision(point.x - prevPoint.x, xComponent, roundedPrevX, roundedPrevY);
417
- const yComponentRelative = toStringOfSamePrecision(point.y - prevPoint.y, yComponent, roundedPrevX, roundedPrevY);
418
- // No need for an additional separator if it starts with a '-'
419
- if (yComponentRelative.charAt(0) === '-') {
420
- relativeCommandParts.push(`${xComponentRelative}${yComponentRelative}`);
421
- }
422
- else {
423
- relativeCommandParts.push(`${xComponentRelative},${yComponentRelative}`);
424
- }
425
- }
426
- else {
427
- absoluteCommandParts.push(`${xComponent},${yComponent}`);
428
- }
429
- }
430
- let commandString;
431
- if (makeAbsCommand) {
432
- commandString = `${command}${absoluteCommandParts.join(' ')}`;
433
- }
434
- else {
435
- commandString = `${command.toLowerCase()}${relativeCommandParts.join(' ')}`;
436
- }
437
- // Don't add no-ops.
438
- if (commandString === 'l0,0' || commandString === 'm0,0') {
439
- return;
440
- }
441
- result.push(commandString);
442
- if (points.length > 0) {
443
- prevPoint = points[points.length - 1];
444
- }
445
- };
446
- // Don't add two moveTos in a row (this can happen if
447
- // the start point corresponds to a moveTo _and_ the first command is
448
- // also a moveTo)
449
- if (((_a = parts[0]) === null || _a === void 0 ? void 0 : _a.kind) !== PathCommandType.MoveTo) {
450
- addCommand('M', startPoint);
451
- }
452
- let exhaustivenessCheck;
453
- for (let i = 0; i < parts.length; i++) {
454
- const part = parts[i];
455
- switch (part.kind) {
456
- case PathCommandType.MoveTo:
457
- addCommand('M', part.point);
458
- break;
459
- case PathCommandType.LineTo:
460
- addCommand('L', part.point);
461
- break;
462
- case PathCommandType.CubicBezierTo:
463
- addCommand('C', part.controlPoint1, part.controlPoint2, part.endPoint);
464
- break;
465
- case PathCommandType.QuadraticBezierTo:
466
- addCommand('Q', part.controlPoint, part.endPoint);
467
- break;
468
- default:
469
- exhaustivenessCheck = part;
470
- return exhaustivenessCheck;
471
- }
472
- }
473
- return result.join('');
474
- }
475
- // Create a Path from a SVG path specification.
476
- // TODO: Support a larger subset of SVG paths.
477
- // TODO: Support `s`,`t` commands shorthands.
478
- static fromString(pathString) {
479
- // See the MDN reference:
480
- // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d
481
- // and
482
- // https://www.w3.org/TR/SVG2/paths.html
483
- var _a;
484
- // Remove linebreaks
485
- pathString = pathString.split('\n').join(' ');
486
- let lastPos = Vec2.zero;
487
- let firstPos = null;
488
- let startPos = null;
489
- let isFirstCommand = true;
490
- const commands = [];
491
- const moveTo = (point) => {
492
- // The first moveTo/lineTo is already handled by the [startPoint] parameter of the Path constructor.
493
- if (isFirstCommand) {
494
- isFirstCommand = false;
495
- return;
496
- }
497
- commands.push({
498
- kind: PathCommandType.MoveTo,
499
- point,
500
- });
501
- };
502
- const lineTo = (point) => {
503
- if (isFirstCommand) {
504
- isFirstCommand = false;
505
- return;
506
- }
507
- commands.push({
508
- kind: PathCommandType.LineTo,
509
- point,
510
- });
511
- };
512
- const cubicBezierTo = (cp1, cp2, end) => {
513
- commands.push({
514
- kind: PathCommandType.CubicBezierTo,
515
- controlPoint1: cp1,
516
- controlPoint2: cp2,
517
- endPoint: end,
518
- });
519
- };
520
- const quadraticBeierTo = (controlPoint, endPoint) => {
521
- commands.push({
522
- kind: PathCommandType.QuadraticBezierTo,
523
- controlPoint,
524
- endPoint,
525
- });
526
- };
527
- const commandArgCounts = {
528
- 'm': 1,
529
- 'l': 1,
530
- 'c': 3,
531
- 'q': 2,
532
- 'z': 0,
533
- 'h': 1,
534
- 'v': 1,
535
- };
536
- // Each command: Command character followed by anything that isn't a command character
537
- const commandExp = /([MZLHVCSQTA])\s*([^MZLHVCSQTA]*)/ig;
538
- let current;
539
- while ((current = commandExp.exec(pathString)) !== null) {
540
- const argParts = current[2].trim().split(/[^0-9Ee.-]/).filter(part => part.length > 0).reduce((accumualtor, current) => {
541
- // As of 09/2022, iOS Safari doesn't support support lookbehind in regular
542
- // expressions. As such, we need an alternative.
543
- // Because '-' can be used as a path separator, unless preceeded by an 'e' (as in 1e-5),
544
- // we need special cases:
545
- current = current.replace(/([^eE])[-]/g, '$1 -');
546
- const parts = current.split(' -');
547
- if (parts[0] !== '') {
548
- accumualtor.push(parts[0]);
549
- }
550
- accumualtor.push(...parts.slice(1).map(part => `-${part}`));
551
- return accumualtor;
552
- }, []);
553
- let numericArgs = argParts.map(arg => parseFloat(arg));
554
- let commandChar = current[1].toLowerCase();
555
- let uppercaseCommand = current[1] !== commandChar;
556
- // Convert commands that don't take points into commands that do.
557
- if (commandChar === 'v' || commandChar === 'h') {
558
- numericArgs = numericArgs.reduce((accumulator, current) => {
559
- if (commandChar === 'v') {
560
- return accumulator.concat(uppercaseCommand ? lastPos.x : 0, current);
561
- }
562
- else {
563
- return accumulator.concat(current, uppercaseCommand ? lastPos.y : 0);
564
- }
565
- }, []);
566
- commandChar = 'l';
567
- }
568
- else if (commandChar === 'z') {
569
- if (firstPos) {
570
- numericArgs = [firstPos.x, firstPos.y];
571
- firstPos = lastPos;
572
- }
573
- else {
574
- continue;
575
- }
576
- // 'z' always acts like an uppercase lineTo(startPos)
577
- uppercaseCommand = true;
578
- commandChar = 'l';
579
- }
580
- const commandArgCount = (_a = commandArgCounts[commandChar]) !== null && _a !== void 0 ? _a : 0;
581
- const allArgs = numericArgs.reduce((accumulator, current, index, parts) => {
582
- if (index % 2 !== 0) {
583
- const currentAsFloat = current;
584
- const prevAsFloat = parts[index - 1];
585
- return accumulator.concat(Vec2.of(prevAsFloat, currentAsFloat));
586
- }
587
- else {
588
- return accumulator;
589
- }
590
- }, []).map((coordinate, index) => {
591
- // Lowercase commands are relative, uppercase commands use absolute
592
- // positioning
593
- let newPos;
594
- if (uppercaseCommand) {
595
- newPos = coordinate;
596
- }
597
- else {
598
- newPos = lastPos.plus(coordinate);
599
- }
600
- if ((index + 1) % commandArgCount === 0) {
601
- lastPos = newPos;
602
- }
603
- return newPos;
604
- });
605
- if (allArgs.length % commandArgCount !== 0) {
606
- throw new Error([
607
- `Incorrect number of arguments: got ${JSON.stringify(allArgs)} with a length of ${allArgs.length} ≠ ${commandArgCount}k, k ∈ ℤ.`,
608
- `The number of arguments to ${commandChar} must be a multiple of ${commandArgCount}!`,
609
- `Command: ${current[0]}`,
610
- ].join('\n'));
611
- }
612
- for (let argPos = 0; argPos < allArgs.length; argPos += commandArgCount) {
613
- const args = allArgs.slice(argPos, argPos + commandArgCount);
614
- switch (commandChar.toLowerCase()) {
615
- case 'm':
616
- if (argPos === 0) {
617
- moveTo(args[0]);
618
- }
619
- else {
620
- lineTo(args[0]);
621
- }
622
- break;
623
- case 'l':
624
- lineTo(args[0]);
625
- break;
626
- case 'c':
627
- cubicBezierTo(args[0], args[1], args[2]);
628
- break;
629
- case 'q':
630
- quadraticBeierTo(args[0], args[1]);
631
- break;
632
- default:
633
- throw new Error(`Unknown path command ${commandChar}`);
634
- }
635
- isFirstCommand = false;
636
- }
637
- if (allArgs.length > 0) {
638
- firstPos !== null && firstPos !== void 0 ? firstPos : (firstPos = allArgs[0]);
639
- startPos !== null && startPos !== void 0 ? startPos : (startPos = firstPos);
640
- lastPos = allArgs[allArgs.length - 1];
641
- }
642
- }
643
- const result = new Path(startPos !== null && startPos !== void 0 ? startPos : Vec2.zero, commands);
644
- result.cachedStringVersion = pathString;
645
- return result;
646
- }
647
- }
648
- Path.empty = new Path(Vec2.zero, []);
@@ -1,52 +0,0 @@
1
- import LineSegment2 from './LineSegment2';
2
- import Mat33 from './Mat33';
3
- import { Point2, Vec2 } from './Vec2';
4
- /** An object that can be converted to a Rect2. */
5
- export interface RectTemplate {
6
- x: number;
7
- y: number;
8
- w?: number;
9
- h?: number;
10
- width?: number;
11
- height?: number;
12
- }
13
- export default class Rect2 {
14
- readonly x: number;
15
- readonly y: number;
16
- readonly w: number;
17
- readonly h: number;
18
- readonly topLeft: Point2;
19
- readonly size: Vec2;
20
- readonly bottomRight: Point2;
21
- readonly center: Point2;
22
- readonly area: number;
23
- constructor(x: number, y: number, w: number, h: number);
24
- translatedBy(vec: Vec2): Rect2;
25
- resizedTo(size: Vec2): Rect2;
26
- containsPoint(other: Point2): boolean;
27
- containsRect(other: Rect2): boolean;
28
- intersects(other: Rect2): boolean;
29
- intersection(other: Rect2): Rect2 | null;
30
- union(other: Rect2): Rect2;
31
- divideIntoGrid(columns: number, rows: number): Rect2[];
32
- grownToPoint(point: Point2, margin?: number): Rect2;
33
- grownBy(margin: number): Rect2;
34
- getClosestPointOnBoundaryTo(target: Point2): import("./Vec3").default;
35
- get corners(): Point2[];
36
- get maxDimension(): number;
37
- get topRight(): import("./Vec3").default;
38
- get bottomLeft(): import("./Vec3").default;
39
- get width(): number;
40
- get height(): number;
41
- getEdges(): LineSegment2[];
42
- transformedBoundingBox(affineTransform: Mat33): Rect2;
43
- /** @return true iff this is equal to [other] ± fuzz */
44
- eq(other: Rect2, fuzz?: number): boolean;
45
- toString(): string;
46
- static fromCorners(corner1: Point2, corner2: Point2): Rect2;
47
- static bboxOf(points: Point2[], margin?: number): Rect2;
48
- static union(...rects: Rect2[]): Rect2;
49
- static of(template: RectTemplate): Rect2;
50
- static empty: Rect2;
51
- static unitSquare: Rect2;
52
- }