js-draw 1.21.2 → 1.22.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (421) hide show
  1. package/README.md +103 -75
  2. package/build-config.json +2 -2
  3. package/dist/Editor.css +29 -16
  4. package/dist/bundle.js +2 -2
  5. package/dist/bundledStyles.js +1 -1
  6. package/dist/cjs/Editor.js +36 -22
  7. package/dist/cjs/EventDispatcher.js +1 -1
  8. package/dist/cjs/Pointer.js +3 -3
  9. package/dist/cjs/SVGLoader/SVGLoader.js +13 -6
  10. package/dist/cjs/UndoRedoHistory.js +1 -1
  11. package/dist/cjs/Viewport.js +4 -2
  12. package/dist/cjs/commands/Command.js +7 -5
  13. package/dist/cjs/commands/Duplicate.js +2 -2
  14. package/dist/cjs/commands/Erase.js +3 -4
  15. package/dist/cjs/commands/invertCommand.js +4 -4
  16. package/dist/cjs/commands/lib.d.ts +1 -1
  17. package/dist/cjs/commands/uniteCommands.js +4 -4
  18. package/dist/cjs/components/AbstractComponent.d.ts +1 -1
  19. package/dist/cjs/components/AbstractComponent.js +3 -3
  20. package/dist/cjs/components/BackgroundComponent.js +8 -6
  21. package/dist/cjs/components/ImageComponent.js +12 -5
  22. package/dist/cjs/components/RestylableComponent.js +1 -1
  23. package/dist/cjs/components/SVGGlobalAttributesObject.js +1 -2
  24. package/dist/cjs/components/Stroke.js +37 -24
  25. package/dist/cjs/components/TextComponent.js +13 -10
  26. package/dist/cjs/components/UnknownSVGObject.js +2 -3
  27. package/dist/cjs/components/builders/ArrowBuilder.d.ts +6 -0
  28. package/dist/cjs/components/builders/ArrowBuilder.js +9 -3
  29. package/dist/cjs/components/builders/CircleBuilder.d.ts +6 -0
  30. package/dist/cjs/components/builders/CircleBuilder.js +11 -4
  31. package/dist/cjs/components/builders/FreehandLineBuilder.d.ts +6 -0
  32. package/dist/cjs/components/builders/FreehandLineBuilder.js +10 -4
  33. package/dist/cjs/components/builders/LineBuilder.d.ts +6 -0
  34. package/dist/cjs/components/builders/LineBuilder.js +8 -4
  35. package/dist/cjs/components/builders/PolylineBuilder.d.ts +4 -1
  36. package/dist/cjs/components/builders/PolylineBuilder.js +9 -5
  37. package/dist/cjs/components/builders/PressureSensitiveFreehandLineBuilder.js +16 -10
  38. package/dist/cjs/components/builders/RectangleBuilder.d.ts +12 -0
  39. package/dist/cjs/components/builders/RectangleBuilder.js +17 -3
  40. package/dist/cjs/components/builders/autocorrect/makeShapeFitAutocorrect.js +5 -8
  41. package/dist/cjs/components/builders/autocorrect/makeSnapToGridAutocorrect.js +1 -1
  42. package/dist/cjs/components/builders/lib.d.ts +7 -0
  43. package/dist/cjs/components/builders/lib.js +18 -0
  44. package/dist/cjs/components/lib.d.ts +1 -4
  45. package/dist/cjs/components/lib.js +2 -9
  46. package/dist/cjs/components/util/StrokeSmoother.js +5 -6
  47. package/dist/cjs/dialogs/makeAboutDialog.js +1 -1
  48. package/dist/cjs/dialogs/makeMessageDialog.js +2 -2
  49. package/dist/cjs/image/EditorImage.js +13 -15
  50. package/dist/cjs/image/export/editorImageToSVG.js +1 -1
  51. package/dist/cjs/inputEvents.js +3 -3
  52. package/dist/cjs/lib.d.ts +2 -2
  53. package/dist/cjs/localizations/de.js +2 -2
  54. package/dist/cjs/localizations/es.js +7 -3
  55. package/dist/cjs/rendering/Display.js +7 -3
  56. package/dist/cjs/rendering/RenderablePathSpec.js +26 -11
  57. package/dist/cjs/rendering/RenderingStyle.js +22 -15
  58. package/dist/cjs/rendering/TextRenderingStyle.js +1 -1
  59. package/dist/cjs/rendering/caching/CacheRecord.js +1 -1
  60. package/dist/cjs/rendering/caching/CacheRecordManager.js +1 -1
  61. package/dist/cjs/rendering/caching/RenderingCache.js +1 -1
  62. package/dist/cjs/rendering/caching/RenderingCacheNode.js +26 -15
  63. package/dist/cjs/rendering/caching/testUtils.js +2 -2
  64. package/dist/cjs/rendering/renderers/AbstractRenderer.js +3 -1
  65. package/dist/cjs/rendering/renderers/CanvasRenderer.js +4 -3
  66. package/dist/cjs/rendering/renderers/DummyRenderer.js +1 -1
  67. package/dist/cjs/rendering/renderers/SVGRenderer.js +37 -19
  68. package/dist/cjs/rendering/renderers/TextOnlyRenderer.js +13 -15
  69. package/dist/cjs/shortcuts/KeyBinding.js +6 -12
  70. package/dist/cjs/shortcuts/KeyboardShortcutManager.js +2 -2
  71. package/dist/cjs/testing/createEditor.js +6 -1
  72. package/dist/cjs/testing/findNodeWithText.d.ts +4 -1
  73. package/dist/cjs/testing/findNodeWithText.js +12 -3
  74. package/dist/cjs/testing/getUniquePointerId.js +1 -1
  75. package/dist/cjs/testing/sendHtmlSwipe.js +7 -3
  76. package/dist/cjs/testing/sendPenEvent.js +1 -3
  77. package/dist/cjs/testing/sendTouchEvent.js +1 -4
  78. package/dist/cjs/testing/startPinchGesture.js +3 -1
  79. package/dist/cjs/toolbar/AbstractToolbar.js +7 -11
  80. package/dist/cjs/toolbar/EdgeToolbar.js +11 -15
  81. package/dist/cjs/toolbar/IconProvider.js +5 -3
  82. package/dist/cjs/toolbar/localization.js +3 -3
  83. package/dist/cjs/toolbar/utils/HelpDisplay.js +8 -6
  84. package/dist/cjs/toolbar/utils/makeDraggable.js +4 -7
  85. package/dist/cjs/toolbar/widgets/BaseToolWidget.js +3 -2
  86. package/dist/cjs/toolbar/widgets/BaseWidget.js +7 -7
  87. package/dist/cjs/toolbar/widgets/DocumentPropertiesWidget.js +2 -2
  88. package/dist/cjs/toolbar/widgets/EraserToolWidget.js +5 -3
  89. package/dist/cjs/toolbar/widgets/HandToolWidget.js +8 -6
  90. package/dist/cjs/toolbar/widgets/InsertImageWidget/InsertImageWidget.js +9 -10
  91. package/dist/cjs/toolbar/widgets/PenToolWidget.js +22 -13
  92. package/dist/cjs/toolbar/widgets/SelectionToolWidget.js +2 -2
  93. package/dist/cjs/toolbar/widgets/TextToolWidget.js +5 -5
  94. package/dist/cjs/toolbar/widgets/components/makeFileInput.js +7 -7
  95. package/dist/cjs/toolbar/widgets/components/makeGridSelector.js +5 -5
  96. package/dist/cjs/toolbar/widgets/components/makeSnappedList.js +9 -5
  97. package/dist/cjs/toolbar/widgets/keybindings.js +2 -2
  98. package/dist/cjs/toolbar/widgets/layout/DropdownLayoutManager.js +6 -6
  99. package/dist/cjs/tools/BaseTool.d.ts +61 -0
  100. package/dist/cjs/tools/BaseTool.js +181 -0
  101. package/dist/cjs/tools/Eraser.d.ts +60 -0
  102. package/dist/cjs/tools/Eraser.js +304 -0
  103. package/dist/cjs/tools/Eraser.test.d.ts +1 -0
  104. package/dist/cjs/tools/FindTool.d.ts +21 -0
  105. package/dist/cjs/tools/FindTool.js +137 -0
  106. package/dist/cjs/tools/FindTool.test.d.ts +1 -0
  107. package/dist/cjs/tools/InputFilter/ContextMenuRecognizer.d.ts +17 -0
  108. package/dist/cjs/tools/InputFilter/ContextMenuRecognizer.js +103 -0
  109. package/dist/cjs/tools/InputFilter/ContextMenuRecognizer.test.d.ts +1 -0
  110. package/dist/cjs/tools/InputFilter/FunctionMapper.d.ts +12 -0
  111. package/dist/cjs/tools/InputFilter/FunctionMapper.js +21 -0
  112. package/dist/cjs/tools/InputFilter/InputMapper.d.ts +23 -0
  113. package/dist/cjs/tools/InputFilter/InputMapper.js +38 -0
  114. package/dist/cjs/tools/InputFilter/InputPipeline.d.ts +15 -0
  115. package/dist/cjs/tools/InputFilter/InputPipeline.js +54 -0
  116. package/dist/cjs/tools/InputFilter/InputPipeline.test.d.ts +1 -0
  117. package/dist/cjs/tools/InputFilter/InputStabilizer.d.ts +29 -0
  118. package/dist/cjs/tools/InputFilter/InputStabilizer.js +188 -0
  119. package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.d.ts +21 -0
  120. package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.js +87 -0
  121. package/dist/cjs/tools/PanZoom.d.ts +125 -0
  122. package/dist/cjs/tools/PanZoom.js +522 -0
  123. package/dist/cjs/tools/PanZoom.test.d.ts +1 -0
  124. package/dist/cjs/tools/PasteHandler.d.ts +23 -0
  125. package/dist/cjs/tools/PasteHandler.js +115 -0
  126. package/dist/cjs/tools/Pen.d.ts +54 -0
  127. package/dist/cjs/tools/Pen.js +343 -0
  128. package/dist/cjs/tools/Pen.test.d.ts +1 -0
  129. package/dist/cjs/tools/PipetteTool.d.ts +28 -0
  130. package/dist/cjs/tools/PipetteTool.js +69 -0
  131. package/dist/cjs/tools/ScrollbarTool.d.ts +18 -0
  132. package/dist/cjs/tools/ScrollbarTool.js +86 -0
  133. package/dist/cjs/tools/SelectionTool/SelectAllShortcutHandler.d.ts +9 -0
  134. package/dist/cjs/tools/SelectionTool/SelectAllShortcutHandler.js +32 -0
  135. package/dist/cjs/tools/SelectionTool/Selection.d.ts +72 -0
  136. package/dist/cjs/tools/SelectionTool/Selection.js +638 -0
  137. package/dist/cjs/tools/SelectionTool/SelectionHandle.d.ts +62 -0
  138. package/dist/cjs/tools/SelectionTool/SelectionHandle.js +144 -0
  139. package/dist/cjs/tools/SelectionTool/SelectionMenuShortcut.d.ts +32 -0
  140. package/dist/cjs/tools/SelectionTool/SelectionMenuShortcut.js +88 -0
  141. package/dist/cjs/tools/SelectionTool/SelectionTool.d.ts +42 -0
  142. package/dist/cjs/tools/SelectionTool/SelectionTool.js +509 -0
  143. package/dist/cjs/tools/SelectionTool/SelectionTool.selecting.test.d.ts +1 -0
  144. package/dist/cjs/tools/SelectionTool/SelectionTool.test.d.ts +1 -0
  145. package/dist/cjs/tools/SelectionTool/ToPointerAutoscroller.d.ts +23 -0
  146. package/dist/cjs/tools/SelectionTool/ToPointerAutoscroller.js +83 -0
  147. package/dist/cjs/tools/SelectionTool/TransformMode.d.ts +42 -0
  148. package/dist/cjs/tools/SelectionTool/TransformMode.js +154 -0
  149. package/dist/cjs/tools/SelectionTool/keybindings.d.ts +15 -0
  150. package/dist/cjs/tools/SelectionTool/keybindings.js +38 -0
  151. package/dist/cjs/tools/SelectionTool/types.d.ts +35 -0
  152. package/dist/cjs/tools/SelectionTool/types.js +14 -0
  153. package/dist/cjs/tools/SelectionTool/util/makeClipboardErrorHandlers.d.ts +6 -0
  154. package/dist/cjs/tools/SelectionTool/util/makeClipboardErrorHandlers.js +71 -0
  155. package/dist/cjs/tools/SelectionTool/util/showSelectionContextMenu.d.ts +5 -0
  156. package/dist/cjs/tools/SelectionTool/util/showSelectionContextMenu.js +52 -0
  157. package/dist/cjs/tools/SoundUITool.d.ts +26 -0
  158. package/dist/cjs/tools/SoundUITool.js +173 -0
  159. package/dist/cjs/tools/TextTool.d.ts +36 -0
  160. package/dist/cjs/tools/TextTool.js +287 -0
  161. package/dist/cjs/tools/TextTool.test.d.ts +1 -0
  162. package/dist/cjs/tools/ToolController.d.ts +73 -0
  163. package/dist/cjs/tools/ToolController.js +310 -0
  164. package/dist/cjs/tools/ToolController.test.d.ts +1 -0
  165. package/dist/cjs/tools/ToolEnabledGroup.d.ts +6 -0
  166. package/dist/cjs/tools/ToolEnabledGroup.js +13 -0
  167. package/dist/cjs/tools/ToolSwitcherShortcut.d.ts +16 -0
  168. package/dist/cjs/tools/ToolSwitcherShortcut.js +40 -0
  169. package/dist/cjs/tools/ToolbarShortcutHandler.d.ts +12 -0
  170. package/dist/cjs/tools/ToolbarShortcutHandler.js +34 -0
  171. package/dist/cjs/tools/UndoRedoShortcut.d.ts +8 -0
  172. package/dist/cjs/tools/UndoRedoShortcut.js +27 -0
  173. package/dist/cjs/tools/UndoRedoShortcut.test.d.ts +1 -0
  174. package/dist/cjs/tools/keybindings.d.ts +16 -0
  175. package/dist/cjs/tools/keybindings.js +58 -0
  176. package/dist/cjs/tools/lib.d.ts +14 -0
  177. package/dist/cjs/tools/lib.js +36 -0
  178. package/dist/cjs/tools/localization.d.ts +45 -0
  179. package/dist/cjs/tools/localization.js +47 -0
  180. package/dist/cjs/tools/util/StationaryPenDetector.d.ts +25 -0
  181. package/dist/cjs/tools/util/StationaryPenDetector.js +107 -0
  182. package/dist/cjs/tools/util/createMenuOverlay.d.ts +10 -0
  183. package/dist/cjs/tools/util/createMenuOverlay.js +126 -0
  184. package/dist/cjs/tools/util/createMenuOverlay.test.d.ts +1 -0
  185. package/dist/cjs/util/ClipboardHandler.d.ts +1 -1
  186. package/dist/cjs/util/ClipboardHandler.js +19 -18
  187. package/dist/cjs/util/ReactiveValue.js +16 -12
  188. package/dist/cjs/util/adjustEditorThemeForContrast.js +6 -2
  189. package/dist/cjs/util/guessKeyCodeFromKey.js +1 -1
  190. package/dist/cjs/util/listenForKeyboardEventsFrom.js +8 -6
  191. package/dist/cjs/util/waitForAll.js +3 -3
  192. package/dist/cjs/util/waitForImageLoaded.js +3 -3
  193. package/dist/cjs/util/waitForTimeout.js +1 -1
  194. package/dist/cjs/version.js +1 -1
  195. package/dist/mjs/Editor.mjs +37 -23
  196. package/dist/mjs/EventDispatcher.mjs +1 -1
  197. package/dist/mjs/Pointer.mjs +3 -3
  198. package/dist/mjs/SVGLoader/SVGLoader.mjs +14 -7
  199. package/dist/mjs/UndoRedoHistory.mjs +1 -1
  200. package/dist/mjs/Viewport.mjs +4 -2
  201. package/dist/mjs/commands/Command.mjs +7 -5
  202. package/dist/mjs/commands/Duplicate.mjs +2 -2
  203. package/dist/mjs/commands/Erase.mjs +3 -4
  204. package/dist/mjs/commands/invertCommand.mjs +4 -4
  205. package/dist/mjs/commands/lib.d.ts +1 -1
  206. package/dist/mjs/commands/lib.mjs +1 -1
  207. package/dist/mjs/commands/uniteCommands.mjs +4 -4
  208. package/dist/mjs/components/AbstractComponent.d.ts +1 -1
  209. package/dist/mjs/components/AbstractComponent.mjs +3 -3
  210. package/dist/mjs/components/BackgroundComponent.mjs +10 -8
  211. package/dist/mjs/components/ImageComponent.mjs +12 -5
  212. package/dist/mjs/components/RestylableComponent.mjs +2 -2
  213. package/dist/mjs/components/SVGGlobalAttributesObject.mjs +1 -2
  214. package/dist/mjs/components/Stroke.mjs +40 -27
  215. package/dist/mjs/components/TextComponent.mjs +15 -12
  216. package/dist/mjs/components/UnknownSVGObject.mjs +2 -3
  217. package/dist/mjs/components/builders/ArrowBuilder.d.ts +6 -0
  218. package/dist/mjs/components/builders/ArrowBuilder.mjs +9 -3
  219. package/dist/mjs/components/builders/CircleBuilder.d.ts +6 -0
  220. package/dist/mjs/components/builders/CircleBuilder.mjs +11 -4
  221. package/dist/mjs/components/builders/FreehandLineBuilder.d.ts +6 -0
  222. package/dist/mjs/components/builders/FreehandLineBuilder.mjs +10 -4
  223. package/dist/mjs/components/builders/LineBuilder.d.ts +6 -0
  224. package/dist/mjs/components/builders/LineBuilder.mjs +8 -4
  225. package/dist/mjs/components/builders/PolylineBuilder.d.ts +4 -1
  226. package/dist/mjs/components/builders/PolylineBuilder.mjs +10 -6
  227. package/dist/mjs/components/builders/PressureSensitiveFreehandLineBuilder.mjs +17 -11
  228. package/dist/mjs/components/builders/RectangleBuilder.d.ts +12 -0
  229. package/dist/mjs/components/builders/RectangleBuilder.mjs +17 -3
  230. package/dist/mjs/components/builders/autocorrect/makeShapeFitAutocorrect.mjs +5 -8
  231. package/dist/mjs/components/builders/autocorrect/makeSnapToGridAutocorrect.mjs +1 -1
  232. package/dist/mjs/components/builders/lib.d.ts +7 -0
  233. package/dist/mjs/components/builders/lib.mjs +7 -0
  234. package/dist/mjs/components/lib.d.ts +1 -4
  235. package/dist/mjs/components/lib.mjs +2 -5
  236. package/dist/mjs/components/util/StrokeSmoother.mjs +5 -6
  237. package/dist/mjs/dialogs/makeAboutDialog.mjs +1 -1
  238. package/dist/mjs/dialogs/makeMessageDialog.mjs +2 -2
  239. package/dist/mjs/image/EditorImage.mjs +13 -15
  240. package/dist/mjs/image/export/editorImageToSVG.mjs +1 -1
  241. package/dist/mjs/inputEvents.mjs +3 -3
  242. package/dist/mjs/lib.d.ts +2 -2
  243. package/dist/mjs/lib.mjs +2 -2
  244. package/dist/mjs/localization.mjs +2 -2
  245. package/dist/mjs/localizations/de.mjs +2 -2
  246. package/dist/mjs/localizations/es.mjs +7 -3
  247. package/dist/mjs/rendering/Display.mjs +7 -3
  248. package/dist/mjs/rendering/RenderablePathSpec.mjs +26 -11
  249. package/dist/mjs/rendering/RenderingStyle.mjs +22 -15
  250. package/dist/mjs/rendering/TextRenderingStyle.mjs +1 -1
  251. package/dist/mjs/rendering/caching/CacheRecord.mjs +1 -1
  252. package/dist/mjs/rendering/caching/CacheRecordManager.mjs +1 -1
  253. package/dist/mjs/rendering/caching/RenderingCache.mjs +1 -1
  254. package/dist/mjs/rendering/caching/RenderingCacheNode.mjs +26 -15
  255. package/dist/mjs/rendering/caching/testUtils.mjs +2 -2
  256. package/dist/mjs/rendering/renderers/AbstractRenderer.mjs +3 -1
  257. package/dist/mjs/rendering/renderers/CanvasRenderer.mjs +4 -3
  258. package/dist/mjs/rendering/renderers/DummyRenderer.mjs +1 -1
  259. package/dist/mjs/rendering/renderers/SVGRenderer.mjs +38 -20
  260. package/dist/mjs/rendering/renderers/TextOnlyRenderer.mjs +13 -15
  261. package/dist/mjs/shortcuts/KeyBinding.mjs +6 -12
  262. package/dist/mjs/shortcuts/KeyboardShortcutManager.mjs +2 -2
  263. package/dist/mjs/testing/createEditor.mjs +6 -1
  264. package/dist/mjs/testing/findNodeWithText.d.ts +4 -1
  265. package/dist/mjs/testing/findNodeWithText.mjs +12 -3
  266. package/dist/mjs/testing/getUniquePointerId.mjs +1 -1
  267. package/dist/mjs/testing/sendHtmlSwipe.mjs +7 -3
  268. package/dist/mjs/testing/sendPenEvent.mjs +1 -3
  269. package/dist/mjs/testing/sendTouchEvent.mjs +1 -4
  270. package/dist/mjs/testing/startPinchGesture.mjs +3 -1
  271. package/dist/mjs/toolbar/AbstractToolbar.mjs +7 -11
  272. package/dist/mjs/toolbar/EdgeToolbar.mjs +11 -15
  273. package/dist/mjs/toolbar/IconProvider.mjs +5 -3
  274. package/dist/mjs/toolbar/localization.mjs +3 -3
  275. package/dist/mjs/toolbar/utils/HelpDisplay.mjs +8 -6
  276. package/dist/mjs/toolbar/utils/makeDraggable.mjs +4 -7
  277. package/dist/mjs/toolbar/widgets/BaseToolWidget.mjs +3 -2
  278. package/dist/mjs/toolbar/widgets/BaseWidget.mjs +8 -8
  279. package/dist/mjs/toolbar/widgets/DocumentPropertiesWidget.mjs +2 -2
  280. package/dist/mjs/toolbar/widgets/EraserToolWidget.mjs +5 -3
  281. package/dist/mjs/toolbar/widgets/HandToolWidget.mjs +8 -6
  282. package/dist/mjs/toolbar/widgets/InsertImageWidget/InsertImageWidget.mjs +9 -10
  283. package/dist/mjs/toolbar/widgets/PenToolWidget.mjs +23 -14
  284. package/dist/mjs/toolbar/widgets/SelectionToolWidget.mjs +2 -2
  285. package/dist/mjs/toolbar/widgets/TextToolWidget.mjs +5 -5
  286. package/dist/mjs/toolbar/widgets/components/makeFileInput.mjs +7 -7
  287. package/dist/mjs/toolbar/widgets/components/makeGridSelector.mjs +5 -5
  288. package/dist/mjs/toolbar/widgets/components/makeSnappedList.mjs +9 -5
  289. package/dist/mjs/toolbar/widgets/keybindings.mjs +2 -2
  290. package/dist/mjs/toolbar/widgets/layout/DropdownLayoutManager.mjs +6 -6
  291. package/dist/mjs/tools/BaseTool.d.ts +61 -0
  292. package/dist/mjs/tools/BaseTool.mjs +179 -0
  293. package/dist/mjs/tools/Eraser.d.ts +60 -0
  294. package/dist/mjs/tools/Eraser.mjs +297 -0
  295. package/dist/mjs/tools/Eraser.test.d.ts +1 -0
  296. package/dist/mjs/tools/FindTool.d.ts +21 -0
  297. package/dist/mjs/tools/FindTool.mjs +131 -0
  298. package/dist/mjs/tools/FindTool.test.d.ts +1 -0
  299. package/dist/mjs/tools/InputFilter/ContextMenuRecognizer.d.ts +17 -0
  300. package/dist/mjs/tools/InputFilter/ContextMenuRecognizer.mjs +74 -0
  301. package/dist/mjs/tools/InputFilter/ContextMenuRecognizer.test.d.ts +1 -0
  302. package/dist/mjs/tools/InputFilter/FunctionMapper.d.ts +12 -0
  303. package/dist/mjs/tools/InputFilter/FunctionMapper.mjs +15 -0
  304. package/dist/mjs/tools/InputFilter/InputMapper.d.ts +23 -0
  305. package/dist/mjs/tools/InputFilter/InputMapper.mjs +36 -0
  306. package/dist/mjs/tools/InputFilter/InputPipeline.d.ts +15 -0
  307. package/dist/mjs/tools/InputFilter/InputPipeline.mjs +49 -0
  308. package/dist/mjs/tools/InputFilter/InputPipeline.test.d.ts +1 -0
  309. package/dist/mjs/tools/InputFilter/InputStabilizer.d.ts +29 -0
  310. package/dist/mjs/tools/InputFilter/InputStabilizer.mjs +182 -0
  311. package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.d.ts +21 -0
  312. package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.mjs +81 -0
  313. package/dist/mjs/tools/PanZoom.d.ts +125 -0
  314. package/dist/mjs/tools/PanZoom.mjs +515 -0
  315. package/dist/mjs/tools/PanZoom.test.d.ts +1 -0
  316. package/dist/mjs/tools/PasteHandler.d.ts +23 -0
  317. package/dist/mjs/tools/PasteHandler.mjs +109 -0
  318. package/dist/mjs/tools/Pen.d.ts +54 -0
  319. package/dist/mjs/tools/Pen.mjs +314 -0
  320. package/dist/mjs/tools/Pen.test.d.ts +1 -0
  321. package/dist/mjs/tools/PipetteTool.d.ts +28 -0
  322. package/dist/mjs/tools/PipetteTool.mjs +63 -0
  323. package/dist/mjs/tools/ScrollbarTool.d.ts +18 -0
  324. package/dist/mjs/tools/ScrollbarTool.mjs +80 -0
  325. package/dist/mjs/tools/SelectionTool/SelectAllShortcutHandler.d.ts +9 -0
  326. package/dist/mjs/tools/SelectionTool/SelectAllShortcutHandler.mjs +26 -0
  327. package/dist/mjs/tools/SelectionTool/Selection.d.ts +72 -0
  328. package/dist/mjs/tools/SelectionTool/Selection.mjs +610 -0
  329. package/dist/mjs/tools/SelectionTool/SelectionHandle.d.ts +62 -0
  330. package/dist/mjs/tools/SelectionTool/SelectionHandle.mjs +140 -0
  331. package/dist/mjs/tools/SelectionTool/SelectionMenuShortcut.d.ts +32 -0
  332. package/dist/mjs/tools/SelectionTool/SelectionMenuShortcut.mjs +85 -0
  333. package/dist/mjs/tools/SelectionTool/SelectionTool.d.ts +42 -0
  334. package/dist/mjs/tools/SelectionTool/SelectionTool.mjs +502 -0
  335. package/dist/mjs/tools/SelectionTool/SelectionTool.selecting.test.d.ts +1 -0
  336. package/dist/mjs/tools/SelectionTool/SelectionTool.test.d.ts +1 -0
  337. package/dist/mjs/tools/SelectionTool/ToPointerAutoscroller.d.ts +23 -0
  338. package/dist/mjs/tools/SelectionTool/ToPointerAutoscroller.mjs +77 -0
  339. package/dist/mjs/tools/SelectionTool/TransformMode.d.ts +42 -0
  340. package/dist/mjs/tools/SelectionTool/TransformMode.mjs +145 -0
  341. package/dist/mjs/tools/SelectionTool/keybindings.d.ts +15 -0
  342. package/dist/mjs/tools/SelectionTool/keybindings.mjs +32 -0
  343. package/dist/mjs/tools/SelectionTool/types.d.ts +35 -0
  344. package/dist/mjs/tools/SelectionTool/types.mjs +11 -0
  345. package/dist/mjs/tools/SelectionTool/util/makeClipboardErrorHandlers.d.ts +6 -0
  346. package/dist/mjs/tools/SelectionTool/util/makeClipboardErrorHandlers.mjs +66 -0
  347. package/dist/mjs/tools/SelectionTool/util/showSelectionContextMenu.d.ts +5 -0
  348. package/dist/mjs/tools/SelectionTool/util/showSelectionContextMenu.mjs +47 -0
  349. package/dist/mjs/tools/SoundUITool.d.ts +26 -0
  350. package/dist/mjs/tools/SoundUITool.mjs +167 -0
  351. package/dist/mjs/tools/TextTool.d.ts +36 -0
  352. package/dist/mjs/tools/TextTool.mjs +281 -0
  353. package/dist/mjs/tools/TextTool.test.d.ts +1 -0
  354. package/dist/mjs/tools/ToolController.d.ts +73 -0
  355. package/dist/mjs/tools/ToolController.mjs +281 -0
  356. package/dist/mjs/tools/ToolController.test.d.ts +1 -0
  357. package/dist/mjs/tools/ToolEnabledGroup.d.ts +6 -0
  358. package/dist/mjs/tools/ToolEnabledGroup.mjs +10 -0
  359. package/dist/mjs/tools/ToolSwitcherShortcut.d.ts +16 -0
  360. package/dist/mjs/tools/ToolSwitcherShortcut.mjs +34 -0
  361. package/dist/mjs/tools/ToolbarShortcutHandler.d.ts +12 -0
  362. package/dist/mjs/tools/ToolbarShortcutHandler.mjs +28 -0
  363. package/dist/mjs/tools/UndoRedoShortcut.d.ts +8 -0
  364. package/dist/mjs/tools/UndoRedoShortcut.mjs +21 -0
  365. package/dist/mjs/tools/UndoRedoShortcut.test.d.ts +1 -0
  366. package/dist/mjs/tools/keybindings.d.ts +16 -0
  367. package/dist/mjs/tools/keybindings.mjs +38 -0
  368. package/dist/mjs/tools/lib.d.ts +14 -0
  369. package/dist/mjs/tools/lib.mjs +14 -0
  370. package/dist/mjs/tools/localization.d.ts +45 -0
  371. package/dist/mjs/tools/localization.mjs +44 -0
  372. package/dist/mjs/tools/util/StationaryPenDetector.d.ts +25 -0
  373. package/dist/mjs/tools/util/StationaryPenDetector.mjs +103 -0
  374. package/dist/mjs/tools/util/createMenuOverlay.d.ts +10 -0
  375. package/dist/mjs/tools/util/createMenuOverlay.mjs +121 -0
  376. package/dist/mjs/tools/util/createMenuOverlay.test.d.ts +1 -0
  377. package/dist/mjs/util/ClipboardHandler.d.ts +1 -1
  378. package/dist/mjs/util/ClipboardHandler.mjs +19 -18
  379. package/dist/mjs/util/ReactiveValue.mjs +16 -12
  380. package/dist/mjs/util/adjustEditorThemeForContrast.mjs +6 -2
  381. package/dist/mjs/util/guessKeyCodeFromKey.mjs +1 -1
  382. package/dist/mjs/util/listenForKeyboardEventsFrom.mjs +8 -6
  383. package/dist/mjs/util/waitForAll.mjs +3 -3
  384. package/dist/mjs/util/waitForImageLoaded.mjs +3 -3
  385. package/dist/mjs/util/waitForTimeout.mjs +1 -1
  386. package/dist/mjs/version.mjs +1 -1
  387. package/package.json +88 -88
  388. package/src/Coloris.css +6 -6
  389. package/src/Editor.scss +7 -5
  390. package/src/dialogs/dialogs.scss +3 -4
  391. package/src/dialogs/makeAboutDialog.scss +2 -2
  392. package/src/dialogs/makeMessageDialog.scss +11 -7
  393. package/src/styles.js +1 -1
  394. package/src/toolbar/AbstractToolbar.scss +20 -12
  395. package/src/toolbar/DropdownToolbar.scss +5 -4
  396. package/src/toolbar/EdgeToolbar.scss +65 -31
  397. package/src/toolbar/toolbar.scss +5 -5
  398. package/src/toolbar/utils/HelpDisplay.scss +48 -25
  399. package/src/toolbar/utils/labelVisibleOnHover.scss +39 -16
  400. package/src/toolbar/widgets/DocumentPropertiesWidget.scss +0 -1
  401. package/src/toolbar/widgets/HandToolWidget.scss +0 -1
  402. package/src/toolbar/widgets/InsertImageWidget/InsertImageWidget.scss +2 -3
  403. package/src/toolbar/widgets/OverflowWidget.css +1 -2
  404. package/src/toolbar/widgets/PenToolWidget.scss +0 -2
  405. package/src/toolbar/widgets/SelectionToolWidget.scss +1 -2
  406. package/src/toolbar/widgets/components/components.scss +6 -6
  407. package/src/toolbar/widgets/components/makeColorInput.scss +0 -2
  408. package/src/toolbar/widgets/components/makeFileInput.scss +5 -7
  409. package/src/toolbar/widgets/components/makeGridSelector.scss +6 -9
  410. package/src/toolbar/widgets/components/makeSnappedList.scss +3 -4
  411. package/src/toolbar/widgets/components/makeThicknessSlider.scss +1 -2
  412. package/src/toolbar/widgets/widgets.scss +7 -7
  413. package/src/tools/FindTool.css +6 -0
  414. package/src/tools/ScrollbarTool.scss +61 -0
  415. package/src/tools/SelectionTool/SelectionTool.scss +173 -0
  416. package/src/tools/SelectionTool/util/makeClipboardErrorHandlers.scss +14 -0
  417. package/src/tools/SoundUITool.scss +22 -0
  418. package/src/tools/tools.scss +5 -0
  419. package/src/tools/util/createMenuOverlay.scss +73 -0
  420. package/tsconfig.json +1 -3
  421. package/typedoc.json +1 -1
@@ -42,15 +42,18 @@ const pathIncluded = (renderablePath, path) => {
42
42
  *
43
43
  * @internal
44
44
  */
45
- const simplifyPathToFullScreenOrEmpty = (renderablePath, visibleRect, options = { fastCheck: true, expensiveCheck: true }) => {
45
+ const simplifyPathToFullScreenOrEmpty = (renderablePath, visibleRect, options = {
46
+ fastCheck: true,
47
+ expensiveCheck: true,
48
+ }) => {
46
49
  const path = (0, exports.pathFromRenderable)(renderablePath);
47
50
  const strokeWidth = renderablePath.style.stroke?.width ?? 0;
48
51
  const onlyStroked = strokeWidth > 0 && renderablePath.style.fill.a === 0;
49
52
  const styledPathBBox = path.bbox.grownBy(strokeWidth);
50
53
  // Are we close enough to the path that it fills the entire screen?
51
- const isOnlyStrokedAndCouldFillScreen = (onlyStroked
52
- && strokeWidth > visibleRect.maxDimension
53
- && styledPathBBox.containsRect(visibleRect));
54
+ const isOnlyStrokedAndCouldFillScreen = onlyStroked &&
55
+ strokeWidth > visibleRect.maxDimension &&
56
+ styledPathBBox.containsRect(visibleRect);
54
57
  if (options.fastCheck && isOnlyStrokedAndCouldFillScreen && renderablePath.style.stroke) {
55
58
  const strokeRadius = strokeWidth / 2;
56
59
  // Are we completely within the stroke?
@@ -60,7 +63,9 @@ const simplifyPathToFullScreenOrEmpty = (renderablePath, visibleRect, options =
60
63
  if (visibleRect.isWithinRadiusOf(strokeRadius, point)) {
61
64
  return {
62
65
  rectangle: visibleRect,
63
- path: (0, exports.pathToRenderable)(math_1.Path.fromRect(visibleRect), { fill: renderablePath.style.stroke.color }),
66
+ path: (0, exports.pathToRenderable)(math_1.Path.fromRect(visibleRect), {
67
+ fill: renderablePath.style.stroke.color,
68
+ }),
64
69
  fullScreen: true,
65
70
  };
66
71
  }
@@ -68,13 +73,16 @@ const simplifyPathToFullScreenOrEmpty = (renderablePath, visibleRect, options =
68
73
  }
69
74
  // Try filtering again, but with slightly more expensive checks
70
75
  if (options.expensiveCheck &&
71
- isOnlyStrokedAndCouldFillScreen && renderablePath.style.stroke
72
- && strokeWidth > visibleRect.maxDimension * 3) {
76
+ isOnlyStrokedAndCouldFillScreen &&
77
+ renderablePath.style.stroke &&
78
+ strokeWidth > visibleRect.maxDimension * 3) {
73
79
  const signedDist = path.signedDistance(visibleRect.center, strokeWidth / 2);
74
80
  const margin = strokeWidth / 6;
75
81
  if (signedDist < -visibleRect.maxDimension / 2 - margin) {
76
82
  return {
77
- path: (0, exports.pathToRenderable)(math_1.Path.fromRect(visibleRect), { fill: renderablePath.style.stroke.color }),
83
+ path: (0, exports.pathToRenderable)(math_1.Path.fromRect(visibleRect), {
84
+ fill: renderablePath.style.stroke.color,
85
+ }),
78
86
  rectangle: visibleRect,
79
87
  fullScreen: true,
80
88
  };
@@ -98,12 +106,16 @@ const visualEquivalent = (renderablePath, visibleRect) => {
98
106
  const strokeWidth = renderablePath.style.stroke?.width ?? 0;
99
107
  const onlyStroked = strokeWidth > 0 && renderablePath.style.fill.a === 0;
100
108
  const styledPathBBox = path.bbox.grownBy(strokeWidth);
101
- let rectangleSimplification = (0, exports.simplifyPathToFullScreenOrEmpty)(renderablePath, visibleRect, { fastCheck: true, expensiveCheck: false, });
109
+ let rectangleSimplification = (0, exports.simplifyPathToFullScreenOrEmpty)(renderablePath, visibleRect, {
110
+ fastCheck: true,
111
+ expensiveCheck: false,
112
+ });
102
113
  if (rectangleSimplification) {
103
114
  return rectangleSimplification.path;
104
115
  }
105
116
  // Scale the expanded rect --- the visual equivalent is only close for huge strokes.
106
- const expandedRect = visibleRect.grownBy(strokeWidth)
117
+ const expandedRect = visibleRect
118
+ .grownBy(strokeWidth)
107
119
  .transformedBoundingBox(math_1.Mat33.scaling2D(4, visibleRect.center));
108
120
  // TODO: Handle simplifying very small paths.
109
121
  if (expandedRect.containsRect(styledPathBBox)) {
@@ -144,7 +156,10 @@ const visualEquivalent = (renderablePath, visibleRect) => {
144
156
  }
145
157
  const newPath = new math_1.Path(path.startPoint, parts);
146
158
  const newStyle = renderablePath.style;
147
- rectangleSimplification = (0, exports.simplifyPathToFullScreenOrEmpty)(renderablePath, visibleRect, { fastCheck: false, expensiveCheck: true, });
159
+ rectangleSimplification = (0, exports.simplifyPathToFullScreenOrEmpty)(renderablePath, visibleRect, {
160
+ fastCheck: false,
161
+ expensiveCheck: true,
162
+ });
148
163
  if (rectangleSimplification) {
149
164
  return rectangleSimplification.path;
150
165
  }
@@ -5,17 +5,20 @@ const math_1 = require("@js-draw/math");
5
5
  const cloneStyle = (style) => {
6
6
  return {
7
7
  fill: style.fill,
8
- stroke: style.stroke ? {
9
- ...style.stroke
10
- } : undefined,
8
+ stroke: style.stroke
9
+ ? {
10
+ ...style.stroke,
11
+ }
12
+ : undefined,
11
13
  };
12
14
  };
13
15
  exports.cloneStyle = cloneStyle;
14
16
  const stylesEqual = (a, b) => {
15
- const result = a === b || (a.fill.eq(b.fill)
16
- && (a.stroke == undefined) === (b.stroke == undefined)
17
- && (a.stroke?.color?.eq(b.stroke?.color) ?? true)
18
- && a.stroke?.width === b.stroke?.width);
17
+ const result = a === b ||
18
+ (a.fill.eq(b.fill) &&
19
+ (a.stroke == undefined) === (b.stroke == undefined) &&
20
+ (a.stroke?.color?.eq(b.stroke?.color) ?? true) &&
21
+ a.stroke?.width === b.stroke?.width);
19
22
  // Map undefined/null -> false
20
23
  return result ?? false;
21
24
  };
@@ -23,10 +26,12 @@ exports.stylesEqual = stylesEqual;
23
26
  // Returns an object that can be converted to a JSON string with
24
27
  // JSON.stringify.
25
28
  const styleToJSON = (style) => {
26
- const stroke = !style.stroke ? undefined : {
27
- color: style.stroke.color.toHexString(),
28
- width: style.stroke.width,
29
- };
29
+ const stroke = !style.stroke
30
+ ? undefined
31
+ : {
32
+ color: style.stroke.color.toHexString(),
33
+ width: style.stroke.width,
34
+ };
30
35
  return {
31
36
  fill: style.fill.toHexString(),
32
37
  stroke,
@@ -34,10 +39,12 @@ const styleToJSON = (style) => {
34
39
  };
35
40
  exports.styleToJSON = styleToJSON;
36
41
  const styleFromJSON = (json) => {
37
- const stroke = json.stroke ? {
38
- color: math_1.Color4.fromHex(json.stroke.color),
39
- width: json.stroke.width,
40
- } : undefined;
42
+ const stroke = json.stroke
43
+ ? {
44
+ color: math_1.Color4.fromHex(json.stroke.color),
45
+ width: json.stroke.width,
46
+ }
47
+ : undefined;
41
48
  return {
42
49
  fill: math_1.Color4.fromHex(json.fill),
43
50
  stroke,
@@ -14,7 +14,7 @@ const textStyleFromJSON = (json) => {
14
14
  if (typeof json === 'string') {
15
15
  json = JSON.parse(json);
16
16
  }
17
- if (typeof (json.fontFamily) !== 'string') {
17
+ if (typeof json.fontFamily !== 'string') {
18
18
  throw new Error('Serialized textStyle missing string fontFamily attribute!');
19
19
  }
20
20
  const style = {
@@ -17,7 +17,7 @@ class CacheRecord {
17
17
  startRender() {
18
18
  this.lastUsedCycle = this.cacheState.currentRenderingCycle;
19
19
  if (!this.allocd) {
20
- throw new Error('Only alloc\'d canvases can be rendered to');
20
+ throw new Error("Only alloc'd canvases can be rendered to");
21
21
  }
22
22
  return this.renderer;
23
23
  }
@@ -34,7 +34,7 @@ class CacheRecordManager {
34
34
  lru.realloc(onDealloc);
35
35
  lru.setRenderingRegion(drawTo);
36
36
  if (this.cacheState.debugMode) {
37
- console.log('[Cache] Now re-alloc\'d. Last used cycle: ', lru.getLastUsedCycle());
37
+ console.log("[Cache] Now re-alloc'd. Last used cycle: ", lru.getLastUsedCycle());
38
38
  console.assert(lru['cacheState'] === this.cacheState, '[Cache] Unequal cache states! cacheState should be a shared object!');
39
39
  }
40
40
  return lru;
@@ -35,7 +35,7 @@ class RenderingCache {
35
35
  this.rootNode = this.rootNode.generateParent();
36
36
  }
37
37
  this.rootNode = this.rootNode.smallestChildContaining(visibleRect) ?? this.rootNode;
38
- const visibleLeaves = image.getLeavesIntersectingRegion(viewport.visibleRect, rect => screenRenderer.isTooSmallToRender(rect));
38
+ const visibleLeaves = image.getLeavesIntersectingRegion(viewport.visibleRect, (rect) => screenRenderer.isTooSmallToRender(rect));
39
39
  let approxVisibleRenderTime = 0;
40
40
  for (const leaf of visibleLeaves) {
41
41
  approxVisibleRenderTime += leaf.getContent().getProportionalRenderingTime();
@@ -32,7 +32,7 @@ class RenderingCacheNode {
32
32
  const middleChildIdx = (parent.instantiatedChildren.length - 1) / 2;
33
33
  if (!parent.instantiatedChildren[middleChildIdx].region.eq(this.region, checkTolerance)) {
34
34
  console.error(parent.instantiatedChildren[middleChildIdx].region, '≠', this.region);
35
- throw new Error('Logic error: [this] is not contained within its parent\'s center child');
35
+ throw new Error("Logic error: [this] is not contained within its parent's center child");
36
36
  }
37
37
  // Replace the middle child
38
38
  parent.instantiatedChildren[middleChildIdx] = this;
@@ -42,7 +42,8 @@ class RenderingCacheNode {
42
42
  // Generates children, if missing.
43
43
  generateChildren() {
44
44
  if (this.instantiatedChildren.length === 0) {
45
- if (this.region.size.x / cacheDivisionSize === 0 || this.region.size.y / cacheDivisionSize === 0) {
45
+ if (this.region.size.x / cacheDivisionSize === 0 ||
46
+ this.region.size.y / cacheDivisionSize === 0) {
46
47
  console.warn('Cache element has zero size! Not generating children.');
47
48
  return;
48
49
  }
@@ -137,8 +138,7 @@ class RenderingCacheNode {
137
138
  }
138
139
  // Render all [items] within [viewport]
139
140
  renderItems(screenRenderer, items, viewport) {
140
- if (!viewport.visibleRect.intersects(this.region)
141
- || items.length === 0) {
141
+ if (!viewport.visibleRect.intersects(this.region) || items.length === 0) {
142
142
  return;
143
143
  }
144
144
  // Divide [items] until nodes are smaller than this, or are leaves.
@@ -167,13 +167,15 @@ class RenderingCacheNode {
167
167
  return;
168
168
  }
169
169
  if (this.cacheState.debugMode) {
170
- screenRenderer.drawRect(this.region, viewport.getSizeOfPixelOnCanvas(), { fill: math_1.Color4.yellow });
170
+ screenRenderer.drawRect(this.region, viewport.getSizeOfPixelOnCanvas(), {
171
+ fill: math_1.Color4.yellow,
172
+ });
171
173
  }
172
174
  // Could we render direclty from [this] or do we need to recurse?
173
175
  const couldRender = this.renderingWouldBeHighEnoughResolution(viewport);
174
176
  if (!couldRender) {
175
177
  for (const child of this.getChildren()) {
176
- child.renderItems(screenRenderer, items.filter(item => {
178
+ child.renderItems(screenRenderer, items.filter((item) => {
177
179
  return item.getBBox().intersects(child.region);
178
180
  }), viewport);
179
181
  }
@@ -191,7 +193,7 @@ class RenderingCacheNode {
191
193
  if (leavesByIds.length === 0) {
192
194
  return;
193
195
  }
194
- const leafIds = leavesByIds.map(leaf => leaf.getId());
196
+ const leafIds = leavesByIds.map((leaf) => leaf.getId());
195
197
  let thisRenderer;
196
198
  if (!this.renderingIsUpToDate(leafIds)) {
197
199
  if (this.allChildrenCanRender(viewport, leavesByIds)) {
@@ -212,7 +214,9 @@ class RenderingCacheNode {
212
214
  if (!this.cachedRenderer) {
213
215
  this.cachedRenderer = this.cacheState.recordManager.allocCanvas(this.region, () => this.onRegionDealloc());
214
216
  }
215
- else if (leavesByIds.length > this.renderedIds.length && this.allRenderedIdsIn(leafIds) && this.renderedMaxZIndex !== null) {
217
+ else if (leavesByIds.length > this.renderedIds.length &&
218
+ this.allRenderedIdsIn(leafIds) &&
219
+ this.renderedMaxZIndex !== null) {
216
220
  // We often don't need to do a full re-render even if something's changed.
217
221
  // Check whether we can just draw on top of the existing cache.
218
222
  const newLeaves = [];
@@ -242,7 +246,9 @@ class RenderingCacheNode {
242
246
  }
243
247
  if (this.cacheState.debugMode) {
244
248
  // Clay for adding new elements
245
- screenRenderer.drawRect(this.region, 2 * viewport.getSizeOfPixelOnCanvas(), { fill: math_1.Color4.clay });
249
+ screenRenderer.drawRect(this.region, 2 * viewport.getSizeOfPixelOnCanvas(), {
250
+ fill: math_1.Color4.clay,
251
+ });
246
252
  }
247
253
  }
248
254
  }
@@ -263,7 +269,9 @@ class RenderingCacheNode {
263
269
  }
264
270
  if (this.cacheState.debugMode) {
265
271
  // Red for full rerender
266
- screenRenderer.drawRect(this.region, 3 * viewport.getSizeOfPixelOnCanvas(), { fill: math_1.Color4.red });
272
+ screenRenderer.drawRect(this.region, 3 * viewport.getSizeOfPixelOnCanvas(), {
273
+ fill: math_1.Color4.red,
274
+ });
267
275
  }
268
276
  }
269
277
  this.renderedIds = leafIds;
@@ -282,7 +290,9 @@ class RenderingCacheNode {
282
290
  screenRenderer.endObject();
283
291
  if (this.cacheState.debugMode) {
284
292
  // Green for no cache needed render
285
- screenRenderer.drawRect(this.region, 2 * viewport.getSizeOfPixelOnCanvas(), { fill: math_1.Color4.green });
293
+ screenRenderer.drawRect(this.region, 2 * viewport.getSizeOfPixelOnCanvas(), {
294
+ fill: math_1.Color4.green,
295
+ });
286
296
  }
287
297
  }
288
298
  }
@@ -294,7 +304,7 @@ class RenderingCacheNode {
294
304
  screenRenderer.renderFromOtherOfSameType(transformMat, thisRenderer);
295
305
  }
296
306
  // Can we clean up this' children? (Are they unused?)
297
- if (this.instantiatedChildren.every(child => child.isEmpty())) {
307
+ if (this.instantiatedChildren.every((child) => child.isEmpty())) {
298
308
  this.instantiatedChildren = [];
299
309
  }
300
310
  }
@@ -305,7 +315,7 @@ class RenderingCacheNode {
305
315
  if (this.cachedRenderer !== null) {
306
316
  return false;
307
317
  }
308
- return this.instantiatedChildren.every(child => child.isEmpty());
318
+ return this.instantiatedChildren.every((child) => child.isEmpty());
309
319
  }
310
320
  onRegionDealloc() {
311
321
  this.cachedRenderer = null;
@@ -314,7 +324,8 @@ class RenderingCacheNode {
314
324
  }
315
325
  }
316
326
  checkRep() {
317
- if (this.instantiatedChildren.length !== cacheDivisionSize * cacheDivisionSize && this.instantiatedChildren.length !== 0) {
327
+ if (this.instantiatedChildren.length !== cacheDivisionSize * cacheDivisionSize &&
328
+ this.instantiatedChildren.length !== 0) {
318
329
  throw new Error(`Repcheck: Wrong number of children. Got ${this.instantiatedChildren.length}`);
319
330
  }
320
331
  if (this.renderedIds[1] !== undefined && this.renderedIds[0] >= this.renderedIds[1]) {
@@ -327,7 +338,7 @@ class RenderingCacheNode {
327
338
  }
328
339
  }
329
340
  if (this.cachedRenderer && !this.cachedRenderer.isAllocd()) {
330
- throw new Error('this\' cachedRenderer != null, but is dealloc\'d');
341
+ throw new Error("this' cachedRenderer != null, but is dealloc'd");
331
342
  }
332
343
  }
333
344
  }
@@ -25,11 +25,11 @@ const createCache = (onRenderAlloc, cacheOptions) => {
25
25
  maxScale: 2,
26
26
  minProportionalRenderTimePerCache: 0,
27
27
  minProportionalRenderTimeToUseCache: 0,
28
- ...cacheOptions
28
+ ...cacheOptions,
29
29
  });
30
30
  return {
31
31
  cache,
32
- editor
32
+ editor,
33
33
  };
34
34
  };
35
35
  exports.createCache = createCache;
@@ -22,7 +22,9 @@ class AbstractRenderer {
22
22
  * methods on `Viewport`, because the viewport may not accurately reflect
23
23
  * what is rendered.
24
24
  */
25
- getViewport() { return this.viewport; }
25
+ getViewport() {
26
+ return this.viewport;
27
+ }
26
28
  setDraftMode(_draftMode) { }
27
29
  flushPath() {
28
30
  if (!this.currentPaths) {
@@ -136,8 +136,8 @@ class CanvasRenderer extends AbstractRenderer_1.default {
136
136
  // Approximate the curve if small enough.
137
137
  const delta1 = p2.minus(p1);
138
138
  const delta2 = p3.minus(p2);
139
- if (delta1.magnitudeSquared() < this.minSquareCurveApproxDist
140
- && delta2.magnitudeSquared() < this.minSquareCurveApproxDist) {
139
+ if (delta1.magnitudeSquared() < this.minSquareCurveApproxDist &&
140
+ delta2.magnitudeSquared() < this.minSquareCurveApproxDist) {
141
141
  this.ctx.lineTo(p3.x, p3.y);
142
142
  }
143
143
  else {
@@ -230,7 +230,8 @@ class CanvasRenderer extends AbstractRenderer_1.default {
230
230
  }
231
231
  }
232
232
  // If exiting an object with a too-small-to-draw bounding box,
233
- if (this.ignoreObjectsAboveLevel !== null && this.getNestingLevel() <= this.ignoreObjectsAboveLevel) {
233
+ if (this.ignoreObjectsAboveLevel !== null &&
234
+ this.getNestingLevel() <= this.ignoreObjectsAboveLevel) {
234
235
  this.ignoreObjectsAboveLevel = null;
235
236
  this.ignoringObject = false;
236
237
  }
@@ -104,7 +104,7 @@ class DummyRenderer extends AbstractRenderer_1.default {
104
104
  this.renderedPathCount += other.renderedPathCount;
105
105
  this.lastFillStyle = other.lastFillStyle;
106
106
  this.lastPoint = other.lastPoint;
107
- this.pointBuffer.push(...other.pointBuffer.map(point => {
107
+ this.pointBuffer.push(...other.pointBuffer.map((point) => {
108
108
  return transform.transformVec2(point);
109
109
  }));
110
110
  }
@@ -126,7 +126,9 @@ class SVGRenderer extends AbstractRenderer_1.default {
126
126
  const style = pathSpec.style;
127
127
  const path = (0, RenderablePathSpec_1.pathFromRenderable)(pathSpec).transformedBy(this.getCanvasToScreenTransform());
128
128
  // Try to extend the previous path, if possible
129
- if (this.lastPathString.length === 0 || !this.lastPathStyle || !(0, RenderingStyle_1.stylesEqual)(this.lastPathStyle, style)) {
129
+ if (this.lastPathString.length === 0 ||
130
+ !this.lastPathStyle ||
131
+ !(0, RenderingStyle_1.stylesEqual)(this.lastPathStyle, style)) {
130
132
  this.addPathToSVG();
131
133
  this.lastPathStyle = style;
132
134
  this.lastPathString = [];
@@ -136,7 +138,9 @@ class SVGRenderer extends AbstractRenderer_1.default {
136
138
  // Apply [elemTransform] to [elem]. Uses both a `matrix` and `.x`, `.y` properties if `setXY` is true.
137
139
  // Otherwise, just uses a `matrix`.
138
140
  transformFrom(elemTransform, elem, inCanvasSpace = false) {
139
- const transform = !inCanvasSpace ? this.getCanvasToScreenTransform().rightMul(elemTransform) : elemTransform;
141
+ const transform = !inCanvasSpace
142
+ ? this.getCanvasToScreenTransform().rightMul(elemTransform)
143
+ : elemTransform;
140
144
  if (!transform.eq(math_1.Mat33.identity)) {
141
145
  const matrixString = transform.toCSSMatrix();
142
146
  elem.style.transform = matrixString;
@@ -261,15 +265,15 @@ class SVGRenderer extends AbstractRenderer_1.default {
261
265
  containerIDList = containerIDData[0];
262
266
  }
263
267
  }
264
- if (containerIDList.length > 0
268
+ if (containerIDList.length > 0 &&
265
269
  // containerIDList must share a prefix with the last ID list
266
270
  // otherwise, the z order of elements may have been changed from
267
271
  // the original image.
268
272
  // In the case that the z order has been changed, keep the current
269
273
  // element as a child of the root to preserve z order.
270
- && (0, listPrefixMatch_1.default)(this.lastContainerIDList, containerIDList)
274
+ (0, listPrefixMatch_1.default)(this.lastContainerIDList, containerIDList) &&
271
275
  // The component can add at most one more parent than the previous item.
272
- && this.lastContainerIDList.length >= containerIDList.length - 1) {
276
+ this.lastContainerIDList.length >= containerIDList.length - 1) {
273
277
  // Select the last
274
278
  const containerID = containerIDList[containerIDList.length - 1];
275
279
  const containerCandidates = this.elem.querySelectorAll(`g#${containerID}`);
@@ -278,7 +282,8 @@ class SVGRenderer extends AbstractRenderer_1.default {
278
282
  // If this is the first time we're entering the group, the
279
283
  // group should be empty.
280
284
  // Otherwise, this may be a case that would break z-ordering.
281
- if (container.children.length === 0 || this.lastContainerIDList.length >= containerIDList.length) {
285
+ if (container.children.length === 0 ||
286
+ this.lastContainerIDList.length >= containerIDList.length) {
282
287
  // Move all objectElems to the found container
283
288
  for (const elem of this.objectElems) {
284
289
  elem.remove();
@@ -312,15 +317,29 @@ class SVGRenderer extends AbstractRenderer_1.default {
312
317
  }
313
318
  }
314
319
  // Not implemented -- use drawPath instead.
315
- unimplementedMessage() { throw new Error('Not implemenented!'); }
316
- beginPath(_startPoint) { this.unimplementedMessage(); }
317
- endPath(_style) { this.unimplementedMessage(); }
318
- lineTo(_point) { this.unimplementedMessage(); }
319
- moveTo(_point) { this.unimplementedMessage(); }
320
- traceCubicBezierCurve(_controlPoint1, _controlPoint2, _endPoint) { this.unimplementedMessage(); }
321
- traceQuadraticBezierCurve(_controlPoint, _endPoint) { this.unimplementedMessage(); }
320
+ unimplementedMessage() {
321
+ throw new Error('Not implemenented!');
322
+ }
323
+ beginPath(_startPoint) {
324
+ this.unimplementedMessage();
325
+ }
326
+ endPath(_style) {
327
+ this.unimplementedMessage();
328
+ }
329
+ lineTo(_point) {
330
+ this.unimplementedMessage();
331
+ }
332
+ moveTo(_point) {
333
+ this.unimplementedMessage();
334
+ }
335
+ traceCubicBezierCurve(_controlPoint1, _controlPoint2, _endPoint) {
336
+ this.unimplementedMessage();
337
+ }
338
+ traceQuadraticBezierCurve(_controlPoint, _endPoint) {
339
+ this.unimplementedMessage();
340
+ }
322
341
  drawPoints(...points) {
323
- points.map(point => {
342
+ points.map((point) => {
324
343
  const elem = document.createElementNS(svgNameSpace, 'circle');
325
344
  elem.setAttribute('cx', `${point.x}`);
326
345
  elem.setAttribute('cy', `${point.y}`);
@@ -334,7 +353,8 @@ class SVGRenderer extends AbstractRenderer_1.default {
334
353
  return;
335
354
  }
336
355
  // Don't add multiple copies of the default stylesheet.
337
- if (elem.tagName.toLowerCase() === 'style' && elem.getAttribute('id') === exports.renderedStylesheetId) {
356
+ if (elem.tagName.toLowerCase() === 'style' &&
357
+ elem.getAttribute('id') === exports.renderedStylesheetId) {
338
358
  return;
339
359
  }
340
360
  const elemToDraw = elem.cloneNode(true);
@@ -369,9 +389,7 @@ class SVGRenderer extends AbstractRenderer_1.default {
369
389
  let viewBoxComponents;
370
390
  if (useViewBoxForPositioning) {
371
391
  const exportRect = viewport.visibleRect;
372
- viewBoxComponents = [
373
- exportRect.x, exportRect.y, exportRect.w, exportRect.h,
374
- ];
392
+ viewBoxComponents = [exportRect.x, exportRect.y, exportRect.w, exportRect.h];
375
393
  // Replace the viewport with a copy that has a modified transform.
376
394
  // (Avoids modifying the original viewport).
377
395
  viewport = viewport.getTemporaryClone();
@@ -383,7 +401,7 @@ class SVGRenderer extends AbstractRenderer_1.default {
383
401
  viewBoxComponents = [0, 0, screenRectSize.x, screenRectSize.y];
384
402
  }
385
403
  // rect.x -> size of rect in x direction, rect.y -> size of rect in y direction.
386
- result.setAttribute('viewBox', viewBoxComponents.map(part => (0, math_1.toRoundedString)(part)).join(' '));
404
+ result.setAttribute('viewBox', viewBoxComponents.map((part) => (0, math_1.toRoundedString)(part)).join(' '));
387
405
  result.setAttribute('width', (0, math_1.toRoundedString)(screenRectSize.x));
388
406
  result.setAttribute('height', (0, math_1.toRoundedString)(screenRectSize.y));
389
407
  // Ensure the image can be identified as an SVG if downloaded.
@@ -29,36 +29,34 @@ class TextOnlyRenderer extends AbstractRenderer_1.default {
29
29
  return [
30
30
  this.localizationTable.pathNodeCount(this.pathCount),
31
31
  ...(this.textNodeCount > 0 ? [this.localizationTable.textNodeCount(this.textNodeCount)] : []),
32
- ...(this.imageNodeCount > 0 ? [this.localizationTable.imageNodeCount(this.imageNodeCount)] : []),
33
- ...this.descriptionBuilder
32
+ ...(this.imageNodeCount > 0
33
+ ? [this.localizationTable.imageNodeCount(this.imageNodeCount)]
34
+ : []),
35
+ ...this.descriptionBuilder,
34
36
  ].join('\n');
35
37
  }
36
- beginPath(_startPoint) {
37
- }
38
+ beginPath(_startPoint) { }
38
39
  endPath(_style) {
39
40
  this.pathCount++;
40
41
  }
41
- lineTo(_point) {
42
- }
43
- moveTo(_point) {
44
- }
45
- traceCubicBezierCurve(_p1, _p2, _p3) {
46
- }
47
- traceQuadraticBezierCurve(_controlPoint, _endPoint) {
48
- }
42
+ lineTo(_point) { }
43
+ moveTo(_point) { }
44
+ traceCubicBezierCurve(_p1, _p2, _p3) { }
45
+ traceQuadraticBezierCurve(_controlPoint, _endPoint) { }
49
46
  drawText(text, _transform, _style) {
50
47
  this.descriptionBuilder.push(this.localizationTable.textNode(text));
51
48
  this.textNodeCount++;
52
49
  }
53
50
  drawImage(image) {
54
- const label = image.label ? this.localizationTable.imageNode(image.label) : this.localizationTable.unlabeledImageNode;
51
+ const label = image.label
52
+ ? this.localizationTable.imageNode(image.label)
53
+ : this.localizationTable.unlabeledImageNode;
55
54
  this.descriptionBuilder.push(label);
56
55
  this.imageNodeCount++;
57
56
  }
58
57
  isTooSmallToRender(rect) {
59
58
  return rect.maxDimension < 15 / this.getSizeOfCanvasPixelOnScreen();
60
59
  }
61
- drawPoints(..._points) {
62
- }
60
+ drawPoints(..._points) { }
63
61
  }
64
62
  exports.default = TextOnlyRenderer;
@@ -1,14 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const isUppercaseLetter = (text) => {
4
- return text.toUpperCase() === text
5
- && text.toLowerCase() !== text
6
- && text.length === 1;
4
+ return text.toUpperCase() === text && text.toLowerCase() !== text && text.length === 1;
7
5
  };
8
6
  const isLowercaseLetter = (text) => {
9
- return text.toLowerCase() === text
10
- && text.toUpperCase() !== text
11
- && text.length === 1;
7
+ return text.toLowerCase() === text && text.toUpperCase() !== text && text.length === 1;
12
8
  };
13
9
  /** Represents a key combination that can trigger a keyboard shortcut. */
14
10
  class KeyBinding {
@@ -51,12 +47,10 @@ class KeyBinding {
51
47
  const shortcutControlOrMeta = this.controlOrMeta;
52
48
  // Match ctrl/meta if the shortcut doesn't have controlOrMeta specified
53
49
  // (controlOrMeta should match either).
54
- const ctrlAndMetaMatches = ctrlKey === this.ctrlKey
55
- && metaKey === this.metaKey
56
- && !shortcutControlOrMeta;
57
- const matches = (ctrlAndMetaMatches || (shortcutControlOrMeta && keyEventHasCtrlOrMeta))
58
- && altKey === this.altKey
59
- && (shiftKey === this.shiftKey || this.shiftKey === undefined);
50
+ const ctrlAndMetaMatches = ctrlKey === this.ctrlKey && metaKey === this.metaKey && !shortcutControlOrMeta;
51
+ const matches = (ctrlAndMetaMatches || (shortcutControlOrMeta && keyEventHasCtrlOrMeta)) &&
52
+ altKey === this.altKey &&
53
+ (shiftKey === this.shiftKey || this.shiftKey === undefined);
60
54
  return matches;
61
55
  }
62
56
  /**
@@ -82,8 +82,8 @@ class KeyboardShortcutManager {
82
82
  return false;
83
83
  }
84
84
  // Convert the strings to shortcut maps.
85
- const shortcutsAsShortcuts = shortcuts.map(shortcut => {
86
- if (typeof (shortcut) === 'string') {
85
+ const shortcutsAsShortcuts = shortcuts.map((shortcut) => {
86
+ if (typeof shortcut === 'string') {
87
87
  return KeyBinding_1.default.fromString(shortcut);
88
88
  }
89
89
  return shortcut;
@@ -5,10 +5,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const Display_1 = require("../rendering/Display");
7
7
  const Editor_1 = __importDefault(require("../Editor"));
8
+ const getLocalizationTable_1 = __importDefault(require("../localizations/getLocalizationTable"));
8
9
  /** Creates an editor. Should only be used in test files. */
9
10
  exports.default = (settings) => {
10
11
  if (jest === undefined) {
11
12
  throw new Error('Files in the testing/ folder should only be used in tests!');
12
13
  }
13
- return new Editor_1.default(document.body, { renderingMode: Display_1.RenderingMode.DummyRenderer, ...settings });
14
+ return new Editor_1.default(document.body, {
15
+ renderingMode: Display_1.RenderingMode.DummyRenderer,
16
+ localization: (0, getLocalizationTable_1.default)(['en']),
17
+ ...settings,
18
+ });
14
19
  };
@@ -1,3 +1,6 @@
1
+ interface Options {
2
+ tag?: string;
3
+ }
1
4
  /** Returns the first node or element with `textContent` matching `expectedText`. */
2
- declare const findNodeWithText: (expectedText: string, parent: Node) => Node | null;
5
+ declare const findNodeWithText: (expectedText: string, parent: Node, options?: Options) => Node | null;
3
6
  export default findNodeWithText;
@@ -1,12 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  /** Returns the first node or element with `textContent` matching `expectedText`. */
4
- const findNodeWithText = (expectedText, parent) => {
4
+ const findNodeWithText = (expectedText, parent, options = {}) => {
5
+ const { tag } = options;
5
6
  if (parent.textContent === expectedText) {
6
- return parent;
7
+ const matchesTag = (() => {
8
+ // No tag check necessary?
9
+ if (!tag)
10
+ return true;
11
+ return parent instanceof Element && tag.toUpperCase() === parent.tagName;
12
+ })();
13
+ if (matchesTag) {
14
+ return parent;
15
+ }
7
16
  }
8
17
  for (const child of parent.childNodes) {
9
- const results = findNodeWithText(expectedText, child);
18
+ const results = findNodeWithText(expectedText, child, options);
10
19
  if (results) {
11
20
  return results;
12
21
  }