js-draw 1.21.3 → 1.22.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (305) 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.js +5 -3
  100. package/dist/cjs/tools/Eraser.js +25 -20
  101. package/dist/cjs/tools/FindTool.js +2 -2
  102. package/dist/cjs/tools/InputFilter/ContextMenuRecognizer.js +1 -3
  103. package/dist/cjs/tools/InputFilter/InputMapper.js +1 -1
  104. package/dist/cjs/tools/InputFilter/InputPipeline.js +1 -1
  105. package/dist/cjs/tools/InputFilter/InputStabilizer.js +12 -5
  106. package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.js +7 -4
  107. package/dist/cjs/tools/PanZoom.d.ts +1 -1
  108. package/dist/cjs/tools/PanZoom.js +17 -12
  109. package/dist/cjs/tools/PasteHandler.js +8 -2
  110. package/dist/cjs/tools/Pen.js +17 -9
  111. package/dist/cjs/tools/ScrollbarTool.js +8 -7
  112. package/dist/cjs/tools/SelectionTool/Selection.js +16 -12
  113. package/dist/cjs/tools/SelectionTool/SelectionHandle.js +5 -2
  114. package/dist/cjs/tools/SelectionTool/SelectionMenuShortcut.js +3 -1
  115. package/dist/cjs/tools/SelectionTool/SelectionTool.js +25 -16
  116. package/dist/cjs/tools/SelectionTool/ToPointerAutoscroller.js +1 -1
  117. package/dist/cjs/tools/SelectionTool/TransformMode.js +6 -7
  118. package/dist/cjs/tools/SelectionTool/util/makeClipboardErrorHandlers.js +23 -2
  119. package/dist/cjs/tools/SelectionTool/util/showSelectionContextMenu.js +29 -20
  120. package/dist/cjs/tools/SoundUITool.js +5 -3
  121. package/dist/cjs/tools/TextTool.js +8 -6
  122. package/dist/cjs/tools/ToolController.js +16 -10
  123. package/dist/cjs/tools/localization.d.ts +2 -0
  124. package/dist/cjs/tools/localization.js +3 -1
  125. package/dist/cjs/tools/util/StationaryPenDetector.js +3 -3
  126. package/dist/cjs/tools/util/createMenuOverlay.js +2 -2
  127. package/dist/cjs/util/ClipboardHandler.d.ts +1 -1
  128. package/dist/cjs/util/ClipboardHandler.js +19 -18
  129. package/dist/cjs/util/ReactiveValue.js +16 -12
  130. package/dist/cjs/util/adjustEditorThemeForContrast.js +6 -2
  131. package/dist/cjs/util/guessKeyCodeFromKey.js +1 -1
  132. package/dist/cjs/util/listenForKeyboardEventsFrom.js +8 -6
  133. package/dist/cjs/util/waitForAll.js +3 -3
  134. package/dist/cjs/util/waitForImageLoaded.js +3 -3
  135. package/dist/cjs/util/waitForTimeout.js +1 -1
  136. package/dist/cjs/version.js +1 -1
  137. package/dist/mjs/Editor.mjs +37 -23
  138. package/dist/mjs/EventDispatcher.mjs +1 -1
  139. package/dist/mjs/Pointer.mjs +3 -3
  140. package/dist/mjs/SVGLoader/SVGLoader.mjs +14 -7
  141. package/dist/mjs/UndoRedoHistory.mjs +1 -1
  142. package/dist/mjs/Viewport.mjs +4 -2
  143. package/dist/mjs/commands/Command.mjs +7 -5
  144. package/dist/mjs/commands/Duplicate.mjs +2 -2
  145. package/dist/mjs/commands/Erase.mjs +3 -4
  146. package/dist/mjs/commands/invertCommand.mjs +4 -4
  147. package/dist/mjs/commands/lib.d.ts +1 -1
  148. package/dist/mjs/commands/lib.mjs +1 -1
  149. package/dist/mjs/commands/uniteCommands.mjs +4 -4
  150. package/dist/mjs/components/AbstractComponent.d.ts +1 -1
  151. package/dist/mjs/components/AbstractComponent.mjs +3 -3
  152. package/dist/mjs/components/BackgroundComponent.mjs +10 -8
  153. package/dist/mjs/components/ImageComponent.mjs +12 -5
  154. package/dist/mjs/components/RestylableComponent.mjs +2 -2
  155. package/dist/mjs/components/SVGGlobalAttributesObject.mjs +1 -2
  156. package/dist/mjs/components/Stroke.mjs +40 -27
  157. package/dist/mjs/components/TextComponent.mjs +15 -12
  158. package/dist/mjs/components/UnknownSVGObject.mjs +2 -3
  159. package/dist/mjs/components/builders/ArrowBuilder.d.ts +6 -0
  160. package/dist/mjs/components/builders/ArrowBuilder.mjs +9 -3
  161. package/dist/mjs/components/builders/CircleBuilder.d.ts +6 -0
  162. package/dist/mjs/components/builders/CircleBuilder.mjs +11 -4
  163. package/dist/mjs/components/builders/FreehandLineBuilder.d.ts +6 -0
  164. package/dist/mjs/components/builders/FreehandLineBuilder.mjs +10 -4
  165. package/dist/mjs/components/builders/LineBuilder.d.ts +6 -0
  166. package/dist/mjs/components/builders/LineBuilder.mjs +8 -4
  167. package/dist/mjs/components/builders/PolylineBuilder.d.ts +4 -1
  168. package/dist/mjs/components/builders/PolylineBuilder.mjs +10 -6
  169. package/dist/mjs/components/builders/PressureSensitiveFreehandLineBuilder.mjs +17 -11
  170. package/dist/mjs/components/builders/RectangleBuilder.d.ts +12 -0
  171. package/dist/mjs/components/builders/RectangleBuilder.mjs +17 -3
  172. package/dist/mjs/components/builders/autocorrect/makeShapeFitAutocorrect.mjs +5 -8
  173. package/dist/mjs/components/builders/autocorrect/makeSnapToGridAutocorrect.mjs +1 -1
  174. package/dist/mjs/components/builders/lib.d.ts +7 -0
  175. package/dist/mjs/components/builders/lib.mjs +7 -0
  176. package/dist/mjs/components/lib.d.ts +1 -4
  177. package/dist/mjs/components/lib.mjs +2 -5
  178. package/dist/mjs/components/util/StrokeSmoother.mjs +5 -6
  179. package/dist/mjs/dialogs/makeAboutDialog.mjs +1 -1
  180. package/dist/mjs/dialogs/makeMessageDialog.mjs +2 -2
  181. package/dist/mjs/image/EditorImage.mjs +13 -15
  182. package/dist/mjs/image/export/editorImageToSVG.mjs +1 -1
  183. package/dist/mjs/inputEvents.mjs +3 -3
  184. package/dist/mjs/lib.d.ts +2 -2
  185. package/dist/mjs/lib.mjs +2 -2
  186. package/dist/mjs/localization.mjs +2 -2
  187. package/dist/mjs/localizations/de.mjs +2 -2
  188. package/dist/mjs/localizations/es.mjs +7 -3
  189. package/dist/mjs/rendering/Display.mjs +7 -3
  190. package/dist/mjs/rendering/RenderablePathSpec.mjs +26 -11
  191. package/dist/mjs/rendering/RenderingStyle.mjs +22 -15
  192. package/dist/mjs/rendering/TextRenderingStyle.mjs +1 -1
  193. package/dist/mjs/rendering/caching/CacheRecord.mjs +1 -1
  194. package/dist/mjs/rendering/caching/CacheRecordManager.mjs +1 -1
  195. package/dist/mjs/rendering/caching/RenderingCache.mjs +1 -1
  196. package/dist/mjs/rendering/caching/RenderingCacheNode.mjs +26 -15
  197. package/dist/mjs/rendering/caching/testUtils.mjs +2 -2
  198. package/dist/mjs/rendering/renderers/AbstractRenderer.mjs +3 -1
  199. package/dist/mjs/rendering/renderers/CanvasRenderer.mjs +4 -3
  200. package/dist/mjs/rendering/renderers/DummyRenderer.mjs +1 -1
  201. package/dist/mjs/rendering/renderers/SVGRenderer.mjs +38 -20
  202. package/dist/mjs/rendering/renderers/TextOnlyRenderer.mjs +13 -15
  203. package/dist/mjs/shortcuts/KeyBinding.mjs +6 -12
  204. package/dist/mjs/shortcuts/KeyboardShortcutManager.mjs +2 -2
  205. package/dist/mjs/testing/createEditor.mjs +6 -1
  206. package/dist/mjs/testing/findNodeWithText.d.ts +4 -1
  207. package/dist/mjs/testing/findNodeWithText.mjs +12 -3
  208. package/dist/mjs/testing/getUniquePointerId.mjs +1 -1
  209. package/dist/mjs/testing/sendHtmlSwipe.mjs +7 -3
  210. package/dist/mjs/testing/sendPenEvent.mjs +1 -3
  211. package/dist/mjs/testing/sendTouchEvent.mjs +1 -4
  212. package/dist/mjs/testing/startPinchGesture.mjs +3 -1
  213. package/dist/mjs/toolbar/AbstractToolbar.mjs +7 -11
  214. package/dist/mjs/toolbar/EdgeToolbar.mjs +11 -15
  215. package/dist/mjs/toolbar/IconProvider.mjs +5 -3
  216. package/dist/mjs/toolbar/localization.mjs +3 -3
  217. package/dist/mjs/toolbar/utils/HelpDisplay.mjs +8 -6
  218. package/dist/mjs/toolbar/utils/makeDraggable.mjs +4 -7
  219. package/dist/mjs/toolbar/widgets/BaseToolWidget.mjs +3 -2
  220. package/dist/mjs/toolbar/widgets/BaseWidget.mjs +8 -8
  221. package/dist/mjs/toolbar/widgets/DocumentPropertiesWidget.mjs +2 -2
  222. package/dist/mjs/toolbar/widgets/EraserToolWidget.mjs +5 -3
  223. package/dist/mjs/toolbar/widgets/HandToolWidget.mjs +8 -6
  224. package/dist/mjs/toolbar/widgets/InsertImageWidget/InsertImageWidget.mjs +9 -10
  225. package/dist/mjs/toolbar/widgets/PenToolWidget.mjs +23 -14
  226. package/dist/mjs/toolbar/widgets/SelectionToolWidget.mjs +2 -2
  227. package/dist/mjs/toolbar/widgets/TextToolWidget.mjs +5 -5
  228. package/dist/mjs/toolbar/widgets/components/makeFileInput.mjs +7 -7
  229. package/dist/mjs/toolbar/widgets/components/makeGridSelector.mjs +5 -5
  230. package/dist/mjs/toolbar/widgets/components/makeSnappedList.mjs +9 -5
  231. package/dist/mjs/toolbar/widgets/keybindings.mjs +2 -2
  232. package/dist/mjs/toolbar/widgets/layout/DropdownLayoutManager.mjs +6 -6
  233. package/dist/mjs/tools/BaseTool.mjs +6 -4
  234. package/dist/mjs/tools/Eraser.mjs +25 -20
  235. package/dist/mjs/tools/FindTool.mjs +2 -2
  236. package/dist/mjs/tools/InputFilter/ContextMenuRecognizer.mjs +2 -4
  237. package/dist/mjs/tools/InputFilter/InputMapper.mjs +1 -1
  238. package/dist/mjs/tools/InputFilter/InputPipeline.mjs +1 -1
  239. package/dist/mjs/tools/InputFilter/InputStabilizer.mjs +13 -6
  240. package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.mjs +7 -4
  241. package/dist/mjs/tools/PanZoom.d.ts +1 -1
  242. package/dist/mjs/tools/PanZoom.mjs +18 -13
  243. package/dist/mjs/tools/PasteHandler.mjs +8 -2
  244. package/dist/mjs/tools/Pen.mjs +18 -10
  245. package/dist/mjs/tools/ScrollbarTool.mjs +8 -7
  246. package/dist/mjs/tools/SelectionTool/Selection.mjs +16 -12
  247. package/dist/mjs/tools/SelectionTool/SelectionHandle.mjs +5 -2
  248. package/dist/mjs/tools/SelectionTool/SelectionMenuShortcut.mjs +3 -1
  249. package/dist/mjs/tools/SelectionTool/SelectionTool.mjs +26 -17
  250. package/dist/mjs/tools/SelectionTool/ToPointerAutoscroller.mjs +1 -1
  251. package/dist/mjs/tools/SelectionTool/TransformMode.mjs +6 -7
  252. package/dist/mjs/tools/SelectionTool/util/makeClipboardErrorHandlers.mjs +23 -2
  253. package/dist/mjs/tools/SelectionTool/util/showSelectionContextMenu.mjs +29 -20
  254. package/dist/mjs/tools/SoundUITool.mjs +5 -3
  255. package/dist/mjs/tools/TextTool.mjs +8 -6
  256. package/dist/mjs/tools/ToolController.mjs +16 -10
  257. package/dist/mjs/tools/localization.d.ts +2 -0
  258. package/dist/mjs/tools/localization.mjs +3 -1
  259. package/dist/mjs/tools/util/StationaryPenDetector.mjs +3 -3
  260. package/dist/mjs/tools/util/createMenuOverlay.mjs +2 -2
  261. package/dist/mjs/util/ClipboardHandler.d.ts +1 -1
  262. package/dist/mjs/util/ClipboardHandler.mjs +19 -18
  263. package/dist/mjs/util/ReactiveValue.mjs +16 -12
  264. package/dist/mjs/util/adjustEditorThemeForContrast.mjs +6 -2
  265. package/dist/mjs/util/guessKeyCodeFromKey.mjs +1 -1
  266. package/dist/mjs/util/listenForKeyboardEventsFrom.mjs +8 -6
  267. package/dist/mjs/util/waitForAll.mjs +3 -3
  268. package/dist/mjs/util/waitForImageLoaded.mjs +3 -3
  269. package/dist/mjs/util/waitForTimeout.mjs +1 -1
  270. package/dist/mjs/version.mjs +1 -1
  271. package/package.json +88 -88
  272. package/src/Coloris.css +6 -6
  273. package/src/Editor.scss +7 -5
  274. package/src/dialogs/dialogs.scss +3 -4
  275. package/src/dialogs/makeAboutDialog.scss +2 -2
  276. package/src/dialogs/makeMessageDialog.scss +11 -7
  277. package/src/styles.js +1 -1
  278. package/src/toolbar/AbstractToolbar.scss +20 -12
  279. package/src/toolbar/DropdownToolbar.scss +5 -4
  280. package/src/toolbar/EdgeToolbar.scss +65 -31
  281. package/src/toolbar/toolbar.scss +5 -5
  282. package/src/toolbar/utils/HelpDisplay.scss +48 -25
  283. package/src/toolbar/utils/labelVisibleOnHover.scss +39 -16
  284. package/src/toolbar/widgets/DocumentPropertiesWidget.scss +0 -1
  285. package/src/toolbar/widgets/HandToolWidget.scss +0 -1
  286. package/src/toolbar/widgets/InsertImageWidget/InsertImageWidget.scss +2 -3
  287. package/src/toolbar/widgets/OverflowWidget.css +1 -2
  288. package/src/toolbar/widgets/PenToolWidget.scss +0 -2
  289. package/src/toolbar/widgets/SelectionToolWidget.scss +1 -2
  290. package/src/toolbar/widgets/components/components.scss +6 -6
  291. package/src/toolbar/widgets/components/makeColorInput.scss +0 -2
  292. package/src/toolbar/widgets/components/makeFileInput.scss +5 -7
  293. package/src/toolbar/widgets/components/makeGridSelector.scss +6 -9
  294. package/src/toolbar/widgets/components/makeSnappedList.scss +3 -4
  295. package/src/toolbar/widgets/components/makeThicknessSlider.scss +1 -2
  296. package/src/toolbar/widgets/widgets.scss +7 -7
  297. package/src/tools/FindTool.css +1 -2
  298. package/src/tools/ScrollbarTool.scss +9 -5
  299. package/src/tools/SelectionTool/SelectionTool.scss +15 -7
  300. package/src/tools/SelectionTool/util/makeClipboardErrorHandlers.scss +1 -2
  301. package/src/tools/SoundUITool.scss +4 -4
  302. package/src/tools/tools.scss +5 -6
  303. package/src/tools/util/createMenuOverlay.scss +10 -4
  304. package/tsconfig.json +1 -3
  305. package/typedoc.json +1 -1
@@ -9,6 +9,12 @@ const Stroke_1 = __importDefault(require("../Stroke"));
9
9
  const Viewport_1 = __importDefault(require("../../Viewport"));
10
10
  const StrokeSmoother_1 = require("../util/StrokeSmoother");
11
11
  const makeShapeFitAutocorrect_1 = __importDefault(require("./autocorrect/makeShapeFitAutocorrect"));
12
+ /**
13
+ * Creates a stroke builder that draws freehand lines.
14
+ *
15
+ * Example:
16
+ * [[include:doc-pages/inline-examples/changing-pen-types.md]]
17
+ */
12
18
  exports.makeFreehandLineBuilder = (0, makeShapeFitAutocorrect_1.default)((initialPoint, viewport) => {
13
19
  // Don't smooth if input is more than ± 3 pixels from the true curve, do smooth if
14
20
  // less than ±1 px from the curve.
@@ -38,7 +44,7 @@ class FreehandLineBuilder {
38
44
  stroke: {
39
45
  color: this.startPoint.color,
40
46
  width: this.roundDistance(this.averageWidth),
41
- }
47
+ },
42
48
  };
43
49
  }
44
50
  previewCurrentPath() {
@@ -135,7 +141,7 @@ class FreehandLineBuilder {
135
141
  kind: math_1.PathCommandType.QuadraticBezierTo,
136
142
  controlPoint: center.plus(math_1.Vec2.of(width, -width)),
137
143
  endPoint: center.plus(math_1.Vec2.of(width, 0)),
138
- }
144
+ },
139
145
  ];
140
146
  }
141
147
  const result = [];
@@ -163,8 +169,8 @@ class FreehandLineBuilder {
163
169
  this.curveFitter.addPoint(newPoint);
164
170
  this.widthAverageNumSamples++;
165
171
  this.averageWidth =
166
- this.averageWidth * (this.widthAverageNumSamples - 1) / this.widthAverageNumSamples
167
- + newPoint.width / this.widthAverageNumSamples;
172
+ (this.averageWidth * (this.widthAverageNumSamples - 1)) / this.widthAverageNumSamples +
173
+ newPoint.width / this.widthAverageNumSamples;
168
174
  }
169
175
  }
170
176
  exports.default = FreehandLineBuilder;
@@ -4,6 +4,12 @@ import { StrokeDataPoint } from '../../types';
4
4
  import Viewport from '../../Viewport';
5
5
  import AbstractComponent from '../AbstractComponent';
6
6
  import { ComponentBuilder, ComponentBuilderFactory } from './types';
7
+ /**
8
+ * Creates a stroke builder that generates filled lines.
9
+ *
10
+ * Example:
11
+ * [[include:doc-pages/inline-examples/changing-pen-types.md]]
12
+ */
7
13
  export declare const makeLineBuilder: ComponentBuilderFactory;
8
14
  export default class LineBuilder implements ComponentBuilder {
9
15
  private readonly startPoint;
@@ -8,6 +8,12 @@ const math_1 = require("@js-draw/math");
8
8
  const RenderablePathSpec_1 = require("../../rendering/RenderablePathSpec");
9
9
  const Stroke_1 = __importDefault(require("../Stroke"));
10
10
  const makeSnapToGridAutocorrect_1 = __importDefault(require("./autocorrect/makeSnapToGridAutocorrect"));
11
+ /**
12
+ * Creates a stroke builder that generates filled lines.
13
+ *
14
+ * Example:
15
+ * [[include:doc-pages/inline-examples/changing-pen-types.md]]
16
+ */
11
17
  exports.makeLineBuilder = (0, makeSnapToGridAutocorrect_1.default)((initialPoint, viewport) => {
12
18
  return new LineBuilder(initialPoint, viewport);
13
19
  });
@@ -48,10 +54,8 @@ class LineBuilder {
48
54
  kind: math_1.PathCommandType.LineTo,
49
55
  point: startPoint.minus(scaledStartNormal),
50
56
  },
51
- ]).mapPoints(point => this.viewport.roundPoint(point));
52
- const preview = new Stroke_1.default([
53
- (0, RenderablePathSpec_1.pathToRenderable)(path, { fill: this.startPoint.color })
54
- ]);
57
+ ]).mapPoints((point) => this.viewport.roundPoint(point));
58
+ const preview = new Stroke_1.default([(0, RenderablePathSpec_1.pathToRenderable)(path, { fill: this.startPoint.color })]);
55
59
  return preview;
56
60
  }
57
61
  build() {
@@ -7,8 +7,11 @@ import { StrokeDataPoint } from '../../types';
7
7
  import { ComponentBuilder, ComponentBuilderFactory } from './types';
8
8
  import RenderingStyle from '../../rendering/RenderingStyle';
9
9
  /**
10
- * Creates strokes from line segments rather than Bézier curves.
10
+ * Creates a freehand line builder that creates strokes from line segments
11
+ * rather than Bézier curves.
11
12
  *
13
+ * Example:
14
+ * [[include:doc-pages/inline-examples/changing-pen-types.md]]
12
15
  */
13
16
  export declare const makePolylineBuilder: ComponentBuilderFactory;
14
17
  export default class PolylineBuilder implements ComponentBuilder {
@@ -9,8 +9,11 @@ const Stroke_1 = __importDefault(require("../Stroke"));
9
9
  const Viewport_1 = __importDefault(require("../../Viewport"));
10
10
  const makeShapeFitAutocorrect_1 = __importDefault(require("./autocorrect/makeShapeFitAutocorrect"));
11
11
  /**
12
- * Creates strokes from line segments rather than Bézier curves.
12
+ * Creates a freehand line builder that creates strokes from line segments
13
+ * rather than Bézier curves.
13
14
  *
15
+ * Example:
16
+ * [[include:doc-pages/inline-examples/changing-pen-types.md]]
14
17
  */
15
18
  exports.makePolylineBuilder = (0, makeShapeFitAutocorrect_1.default)((initialPoint, viewport) => {
16
19
  // Fit to a value slightly smaller than the pixel size. A larger value can
@@ -48,7 +51,7 @@ class PolylineBuilder {
48
51
  stroke: {
49
52
  color: this.startPoint.color,
50
53
  width: this.roundDistance(this.averageWidth),
51
- }
54
+ },
52
55
  };
53
56
  }
54
57
  previewCurrentPath() {
@@ -102,12 +105,13 @@ class PolylineBuilder {
102
105
  addPoint(newPoint) {
103
106
  this.widthAverageNumSamples++;
104
107
  this.averageWidth =
105
- this.averageWidth * (this.widthAverageNumSamples - 1) / this.widthAverageNumSamples
106
- + newPoint.width / this.widthAverageNumSamples;
108
+ (this.averageWidth * (this.widthAverageNumSamples - 1)) / this.widthAverageNumSamples +
109
+ newPoint.width / this.widthAverageNumSamples;
107
110
  const roundedPoint = this.roundPoint(newPoint.pos);
108
111
  if (!roundedPoint.eq(this.lastPoint)) {
109
112
  // If almost exactly in the same line as the previous
110
- if (this.lastLineSegment && this.lastLineSegment.direction.dot(roundedPoint.minus(this.lastPoint).normalized()) > 0.997) {
113
+ if (this.lastLineSegment &&
114
+ this.lastLineSegment.direction.dot(roundedPoint.minus(this.lastPoint).normalized()) > 0.997) {
111
115
  this.parts.pop();
112
116
  this.lastPoint = this.lastLineSegment.p1;
113
117
  }
@@ -36,7 +36,7 @@ class PressureSensitiveFreehandLineBuilder {
36
36
  this.parts = [];
37
37
  this.upperSegments = [];
38
38
  this.lowerSegments = [];
39
- this.curveFitter = new StrokeSmoother_1.StrokeSmoother(startPoint, minFitAllowed, maxFitAllowed, curve => this.addCurve(curve));
39
+ this.curveFitter = new StrokeSmoother_1.StrokeSmoother(startPoint, minFitAllowed, maxFitAllowed, (curve) => this.addCurve(curve));
40
40
  this.curveStartWidth = startPoint.width;
41
41
  this.bbox = new math_1.Rect2(this.startPoint.pos.x, this.startPoint.pos.y, 0, 0);
42
42
  }
@@ -70,7 +70,8 @@ class PressureSensitiveFreehandLineBuilder {
70
70
  }
71
71
  let startPoint;
72
72
  const lastLowerSegment = lowerPath[lowerPath.length - 1];
73
- if (lastLowerSegment.kind === math_1.PathCommandType.LineTo || lastLowerSegment.kind === math_1.PathCommandType.MoveTo) {
73
+ if (lastLowerSegment.kind === math_1.PathCommandType.LineTo ||
74
+ lastLowerSegment.kind === math_1.PathCommandType.MoveTo) {
74
75
  startPoint = lastLowerSegment.point;
75
76
  }
76
77
  else {
@@ -169,11 +170,11 @@ class PressureSensitiveFreehandLineBuilder {
169
170
  // where the next stroke and the previous stroke are in different directions.
170
171
  //
171
172
  // Are the exit/enter directions of the previous and current curves in different enough directions?
172
- if (getEnterDirection(upperCurve).dot(getExitDirection(this.lastUpperBezier)) < 0.35
173
- || getEnterDirection(lowerCurve).dot(getExitDirection(this.lastLowerBezier)) < 0.35
173
+ if (getEnterDirection(upperCurve).dot(getExitDirection(this.lastUpperBezier)) < 0.35 ||
174
+ getEnterDirection(lowerCurve).dot(getExitDirection(this.lastLowerBezier)) < 0.35 ||
174
175
  // Also handle if the curves exit/enter directions differ
175
- || getEnterDirection(upperCurve).dot(getExitDirection(upperCurve)) < 0
176
- || getEnterDirection(lowerCurve).dot(getExitDirection(lowerCurve)) < 0) {
176
+ getEnterDirection(upperCurve).dot(getExitDirection(upperCurve)) < 0 ||
177
+ getEnterDirection(lowerCurve).dot(getExitDirection(lowerCurve)) < 0) {
177
178
  return true;
178
179
  }
179
180
  // Check whether the lower curve intersects the other wall:
@@ -280,8 +281,9 @@ class PressureSensitiveFreehandLineBuilder {
280
281
  // Approximate the normal at the location of the control point
281
282
  const projectionT = bezier.nearestPointTo(controlPoint).parameterValue;
282
283
  const halfVecT = projectionT;
283
- const halfVec = bezier.normal(halfVecT).times(curve.startWidth / 2 * halfVecT
284
- + curve.endWidth / 2 * (1 - halfVecT));
284
+ const halfVec = bezier
285
+ .normal(halfVecT)
286
+ .times((curve.startWidth / 2) * halfVecT + (curve.endWidth / 2) * (1 - halfVecT));
285
287
  // Each starts at startPt ± startVec
286
288
  const lowerCurveStartPoint = this.roundPoint(startPt.plus(startVec));
287
289
  const lowerCurveControlPoint = this.roundPoint(controlPoint.plus(halfVec));
@@ -324,8 +326,12 @@ class PressureSensitiveFreehandLineBuilder {
324
326
  const upperCurve = new math_1.QuadraticBezier(upperCurveStartPoint, upperCurveControlPoint, upperCurveEndPoint);
325
327
  const lowerCurve = new math_1.QuadraticBezier(lowerCurveStartPoint, lowerCurveControlPoint, lowerCurveEndPoint);
326
328
  return {
327
- upperCurveCommand, upperToLowerConnector, lowerToUpperConnector, lowerCurveCommand,
328
- upperCurve, lowerCurve,
329
+ upperCurveCommand,
330
+ upperToLowerConnector,
331
+ lowerToUpperConnector,
332
+ lowerCurveCommand,
333
+ upperCurve,
334
+ lowerCurve,
329
335
  nextCurveStartConnector,
330
336
  };
331
337
  }
@@ -4,7 +4,19 @@ import { StrokeDataPoint } from '../../types';
4
4
  import Viewport from '../../Viewport';
5
5
  import AbstractComponent from '../AbstractComponent';
6
6
  import { ComponentBuilder, ComponentBuilderFactory } from './types';
7
+ /**
8
+ * Creates filled rectangles with sharp corners.
9
+ *
10
+ * Example:
11
+ * [[include:doc-pages/inline-examples/changing-pen-types.md]]
12
+ */
7
13
  export declare const makeFilledRectangleBuilder: ComponentBuilderFactory;
14
+ /**
15
+ * Creates outlined rectangles with sharp corners.
16
+ *
17
+ * Example:
18
+ * [[include:doc-pages/inline-examples/changing-pen-types.md]]
19
+ */
8
20
  export declare const makeOutlinedRectangleBuilder: ComponentBuilderFactory;
9
21
  export default class RectangleBuilder implements ComponentBuilder {
10
22
  private readonly startPoint;
@@ -8,9 +8,21 @@ const math_1 = require("@js-draw/math");
8
8
  const RenderablePathSpec_1 = require("../../rendering/RenderablePathSpec");
9
9
  const Stroke_1 = __importDefault(require("../Stroke"));
10
10
  const makeSnapToGridAutocorrect_1 = __importDefault(require("./autocorrect/makeSnapToGridAutocorrect"));
11
+ /**
12
+ * Creates filled rectangles with sharp corners.
13
+ *
14
+ * Example:
15
+ * [[include:doc-pages/inline-examples/changing-pen-types.md]]
16
+ */
11
17
  exports.makeFilledRectangleBuilder = (0, makeSnapToGridAutocorrect_1.default)((initialPoint, viewport) => {
12
18
  return new RectangleBuilder(initialPoint, true, viewport);
13
19
  });
20
+ /**
21
+ * Creates outlined rectangles with sharp corners.
22
+ *
23
+ * Example:
24
+ * [[include:doc-pages/inline-examples/changing-pen-types.md]]
25
+ */
14
26
  exports.makeOutlinedRectangleBuilder = (0, makeSnapToGridAutocorrect_1.default)((initialPoint, viewport) => {
15
27
  return new RectangleBuilder(initialPoint, false, viewport);
16
28
  });
@@ -34,12 +46,14 @@ class RectangleBuilder {
34
46
  const startPoint = rotationMat.inverse().transformVec2(this.startPoint.pos);
35
47
  const endPoint = rotationMat.inverse().transformVec2(this.endPoint.pos);
36
48
  const rect = math_1.Rect2.fromCorners(startPoint, endPoint);
37
- const path = math_1.Path.fromRect(rect, this.filled ? null : this.endPoint.width).transformedBy(
49
+ const path = math_1.Path.fromRect(rect, this.filled ? null : this.endPoint.width)
50
+ .transformedBy(
38
51
  // Rotate the canvas rectangle so that its rotation matches the screen
39
- rotationMat).mapPoints(point => this.viewport.roundPoint(point));
52
+ rotationMat)
53
+ .mapPoints((point) => this.viewport.roundPoint(point));
40
54
  const preview = new Stroke_1.default([
41
55
  (0, RenderablePathSpec_1.pathToRenderable)(path, {
42
- fill: this.endPoint.color
56
+ fill: this.endPoint.color,
43
57
  }),
44
58
  ]);
45
59
  return preview;
@@ -8,14 +8,11 @@ const makeShapeFitAutocorrect = (sourceFactory) => {
8
8
  };
9
9
  exports.default = makeShapeFitAutocorrect;
10
10
  const makeLineTemplate = (startPoint, points, _bbox) => {
11
- const templatePoints = [
12
- startPoint,
13
- points[points.length - 1],
14
- ];
15
- return { points: templatePoints, };
11
+ const templatePoints = [startPoint, points[points.length - 1]];
12
+ return { points: templatePoints };
16
13
  };
17
14
  const makeRectangleTemplate = (_startPoint, _points, bbox) => {
18
- return { points: [...bbox.corners, bbox.corners[0]], };
15
+ return { points: [...bbox.corners, bbox.corners[0]] };
19
16
  };
20
17
  class ShapeFitBuilder {
21
18
  constructor(sourceFactory, startPoint, viewport) {
@@ -41,10 +38,10 @@ class ShapeFitBuilder {
41
38
  async autocorrectShape() {
42
39
  // Use screen points so that autocorrected shapes rotate with the screen.
43
40
  const startPoint = this.viewport.canvasToScreen(this.startPoint.pos);
44
- const points = this.points.map(point => this.viewport.canvasToScreen(point.pos));
41
+ const points = this.points.map((point) => this.viewport.canvasToScreen(point.pos));
45
42
  const bbox = math_1.Rect2.bboxOf(points);
46
43
  const snappedStartPoint = this.viewport.canvasToScreen(this.viewport.snapToGrid(this.startPoint.pos));
47
- const snappedPoints = this.points.map(point => this.viewport.canvasToScreen(this.viewport.snapToGrid(point.pos)));
44
+ const snappedPoints = this.points.map((point) => this.viewport.canvasToScreen(this.viewport.snapToGrid(point.pos)));
48
45
  const snappedBBox = math_1.Rect2.bboxOf(snappedPoints);
49
46
  // Only fit larger shapes
50
47
  if (bbox.maxDimension < 32) {
@@ -37,7 +37,7 @@ class SnapToGridAutocompleteBuilder {
37
37
  // Use screen points so that snapped shapes rotate with the screen.
38
38
  const startPoint = snapToGrid(this.startPoint);
39
39
  const builder = this.sourceFactory(startPoint, this.viewport);
40
- const points = this.points.map(point => snapToGrid(point));
40
+ const points = this.points.map((point) => snapToGrid(point));
41
41
  for (const point of points) {
42
42
  builder.addPoint(point);
43
43
  }
@@ -0,0 +1,7 @@
1
+ export { makeFreehandLineBuilder } from './FreehandLineBuilder';
2
+ export { makePolylineBuilder } from './PolylineBuilder';
3
+ export { makePressureSensitiveFreehandLineBuilder } from './PressureSensitiveFreehandLineBuilder';
4
+ export { makeOutlinedCircleBuilder } from './CircleBuilder';
5
+ export { makeArrowBuilder } from './ArrowBuilder';
6
+ export { makeLineBuilder } from './LineBuilder';
7
+ export { makeFilledRectangleBuilder, makeOutlinedRectangleBuilder } from './RectangleBuilder';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeOutlinedRectangleBuilder = exports.makeFilledRectangleBuilder = exports.makeLineBuilder = exports.makeArrowBuilder = exports.makeOutlinedCircleBuilder = exports.makePressureSensitiveFreehandLineBuilder = exports.makePolylineBuilder = exports.makeFreehandLineBuilder = void 0;
4
+ var FreehandLineBuilder_1 = require("./FreehandLineBuilder");
5
+ Object.defineProperty(exports, "makeFreehandLineBuilder", { enumerable: true, get: function () { return FreehandLineBuilder_1.makeFreehandLineBuilder; } });
6
+ var PolylineBuilder_1 = require("./PolylineBuilder");
7
+ Object.defineProperty(exports, "makePolylineBuilder", { enumerable: true, get: function () { return PolylineBuilder_1.makePolylineBuilder; } });
8
+ var PressureSensitiveFreehandLineBuilder_1 = require("./PressureSensitiveFreehandLineBuilder");
9
+ Object.defineProperty(exports, "makePressureSensitiveFreehandLineBuilder", { enumerable: true, get: function () { return PressureSensitiveFreehandLineBuilder_1.makePressureSensitiveFreehandLineBuilder; } });
10
+ var CircleBuilder_1 = require("./CircleBuilder");
11
+ Object.defineProperty(exports, "makeOutlinedCircleBuilder", { enumerable: true, get: function () { return CircleBuilder_1.makeOutlinedCircleBuilder; } });
12
+ var ArrowBuilder_1 = require("./ArrowBuilder");
13
+ Object.defineProperty(exports, "makeArrowBuilder", { enumerable: true, get: function () { return ArrowBuilder_1.makeArrowBuilder; } });
14
+ var LineBuilder_1 = require("./LineBuilder");
15
+ Object.defineProperty(exports, "makeLineBuilder", { enumerable: true, get: function () { return LineBuilder_1.makeLineBuilder; } });
16
+ var RectangleBuilder_1 = require("./RectangleBuilder");
17
+ Object.defineProperty(exports, "makeFilledRectangleBuilder", { enumerable: true, get: function () { return RectangleBuilder_1.makeFilledRectangleBuilder; } });
18
+ Object.defineProperty(exports, "makeOutlinedRectangleBuilder", { enumerable: true, get: function () { return RectangleBuilder_1.makeOutlinedRectangleBuilder; } });
@@ -1,8 +1,5 @@
1
1
  export * from './builders/types';
2
- export { makeFreehandLineBuilder } from './builders/FreehandLineBuilder';
3
- export { makePolylineBuilder } from './builders/PolylineBuilder';
4
- export { makePressureSensitiveFreehandLineBuilder } from './builders/PressureSensitiveFreehandLineBuilder';
5
- export { makeOutlinedCircleBuilder } from './builders/CircleBuilder';
2
+ export * from './builders/lib';
6
3
  export { default as StrokeSmoother, Curve as StrokeSmootherCurve } from './util/StrokeSmoother';
7
4
  export * from './AbstractComponent';
8
5
  export { default as AbstractComponent } from './AbstractComponent';
@@ -29,16 +29,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
29
29
  return (mod && mod.__esModule) ? mod : { "default": mod };
30
30
  };
31
31
  Object.defineProperty(exports, "__esModule", { value: true });
32
- exports.ImageComponent = exports.BackgroundComponentBackgroundType = exports.BackgroundComponent = exports.StrokeComponent = exports.Text = exports.TextComponent = exports.isRestylableComponent = exports.createRestyleComponentCommand = exports.Stroke = exports.AbstractComponent = exports.StrokeSmoother = exports.makeOutlinedCircleBuilder = exports.makePressureSensitiveFreehandLineBuilder = exports.makePolylineBuilder = exports.makeFreehandLineBuilder = void 0;
32
+ exports.ImageComponent = exports.BackgroundComponentBackgroundType = exports.BackgroundComponent = exports.StrokeComponent = exports.Text = exports.TextComponent = exports.isRestylableComponent = exports.createRestyleComponentCommand = exports.Stroke = exports.AbstractComponent = exports.StrokeSmoother = void 0;
33
33
  __exportStar(require("./builders/types"), exports);
34
- var FreehandLineBuilder_1 = require("./builders/FreehandLineBuilder");
35
- Object.defineProperty(exports, "makeFreehandLineBuilder", { enumerable: true, get: function () { return FreehandLineBuilder_1.makeFreehandLineBuilder; } });
36
- var PolylineBuilder_1 = require("./builders/PolylineBuilder");
37
- Object.defineProperty(exports, "makePolylineBuilder", { enumerable: true, get: function () { return PolylineBuilder_1.makePolylineBuilder; } });
38
- var PressureSensitiveFreehandLineBuilder_1 = require("./builders/PressureSensitiveFreehandLineBuilder");
39
- Object.defineProperty(exports, "makePressureSensitiveFreehandLineBuilder", { enumerable: true, get: function () { return PressureSensitiveFreehandLineBuilder_1.makePressureSensitiveFreehandLineBuilder; } });
40
- var CircleBuilder_1 = require("./builders/CircleBuilder");
41
- Object.defineProperty(exports, "makeOutlinedCircleBuilder", { enumerable: true, get: function () { return CircleBuilder_1.makeOutlinedCircleBuilder; } });
34
+ __exportStar(require("./builders/lib"), exports);
42
35
  var StrokeSmoother_1 = require("./util/StrokeSmoother");
43
36
  Object.defineProperty(exports, "StrokeSmoother", { enumerable: true, get: function () { return __importDefault(StrokeSmoother_1).default; } });
44
37
  __exportStar(require("./AbstractComponent"), exports);
@@ -56,9 +56,7 @@ class StrokeSmoother {
56
56
  console.assert(this.lastExitingVec.magnitude() !== 0, 'lastExitingVec has zero length!');
57
57
  // Use the last two points to start a new curve (the last point isn't used
58
58
  // in the current curve and we want connected curves to share end points)
59
- this.buffer = [
60
- this.buffer[this.buffer.length - 2], lastPoint,
61
- ];
59
+ this.buffer = [this.buffer[this.buffer.length - 2], lastPoint];
62
60
  this.currentCurve = null;
63
61
  this.isFirstSegment = false;
64
62
  }
@@ -99,8 +97,7 @@ class StrokeSmoother {
99
97
  return;
100
98
  }
101
99
  const threshold = Math.min(this.lastPoint.width, newPoint.width) / 3;
102
- const shouldSnapToInitial = this.startPoint.pos.distanceTo(newPoint.pos) < threshold
103
- && this.isFirstSegment;
100
+ const shouldSnapToInitial = this.startPoint.pos.distanceTo(newPoint.pos) < threshold && this.isFirstSegment;
104
101
  // Snap to the starting point if the stroke is contained within a small ball centered
105
102
  // at the starting point.
106
103
  // This allows us to create a circle/dot at the start of the stroke.
@@ -153,7 +150,9 @@ class StrokeSmoother {
153
150
  const startEndDist = segmentEnd.distanceTo(segmentStart);
154
151
  const maxControlPointDist = maxRelativeLength * startEndDist;
155
152
  // Exit in cases where we would divide by zero
156
- if (maxControlPointDist === 0 || exitingVec.magnitude() === 0 || !isFinite(exitingVec.magnitude())) {
153
+ if (maxControlPointDist === 0 ||
154
+ exitingVec.magnitude() === 0 ||
155
+ !isFinite(exitingVec.magnitude())) {
157
156
  return;
158
157
  }
159
158
  console.assert(isFinite(enteringVec.magnitude()), 'Pre-normalized enteringVec has NaN or ∞ magnitude!');
@@ -13,7 +13,7 @@ const makeAboutDialog = (editor, entries) => {
13
13
  const container = document.createElement(entry.minimized ? 'details' : 'div');
14
14
  container.classList.add('about-entry');
15
15
  const header = document.createElement(entry.minimized ? 'summary' : 'h2');
16
- if (typeof (entry.heading) === 'string') {
16
+ if (typeof entry.heading === 'string') {
17
17
  header.innerText = entry.heading;
18
18
  }
19
19
  else {
@@ -20,7 +20,7 @@ const makeAboutDialog = (editor, options) => {
20
20
  const scrollRegion = document.createElement('div');
21
21
  scrollRegion.classList.add('scroll');
22
22
  // Allow scrolling in the scrollable container -- don't forward wheel events.
23
- scrollRegion.onwheel = evt => evt.stopPropagation();
23
+ scrollRegion.onwheel = (evt) => evt.stopPropagation();
24
24
  contentWrapper.replaceChildren(heading, scrollRegion, closeButton);
25
25
  dialog.replaceChildren(contentWrapper);
26
26
  overlay.replaceChildren(dialog);
@@ -32,7 +32,7 @@ const makeAboutDialog = (editor, options) => {
32
32
  dialog.close();
33
33
  };
34
34
  const addCloseListeners = () => {
35
- dialog.addEventListener('pointerdown', event => {
35
+ dialog.addEventListener('pointerdown', (event) => {
36
36
  if (event.target === dialog) {
37
37
  void closeDialog();
38
38
  }
@@ -151,7 +151,7 @@ class EditorImage {
151
151
  getAllElements() {
152
152
  const leaves = this.root.getLeaves();
153
153
  (0, exports.sortLeavesByZIndex)(leaves);
154
- return leaves.map(leaf => leaf.getContent());
154
+ return leaves.map((leaf) => leaf.getContent());
155
155
  }
156
156
  /** Returns the number of elements added to this image. @internal */
157
157
  estimateNumElements() {
@@ -164,7 +164,7 @@ class EditorImage {
164
164
  leaves = leaves.concat(this.background.getLeavesIntersectingRegion(region));
165
165
  }
166
166
  (0, exports.sortLeavesByZIndex)(leaves);
167
- return leaves.map(leaf => leaf.getContent());
167
+ return leaves.map((leaf) => leaf.getContent());
168
168
  }
169
169
  /** Called whenever (just after) an element is completely removed. @internal */
170
170
  onDestroyElement(elem) {
@@ -504,8 +504,8 @@ const computeFirstIndexToRender = (sortedLeaves, visibleRect) => {
504
504
  for (let i = sortedLeaves.length - 1; i >= 1; i--) {
505
505
  if (
506
506
  // Check for occlusion
507
- sortedLeaves[i].getBBox().containsRect(visibleRect)
508
- && sortedLeaves[i].getContent()?.occludesEverythingBelowWhenRenderedInRect(visibleRect)) {
507
+ sortedLeaves[i].getBBox().containsRect(visibleRect) &&
508
+ sortedLeaves[i].getContent()?.occludesEverythingBelowWhenRenderedInRect(visibleRect)) {
509
509
  startIndex = i;
510
510
  break;
511
511
  }
@@ -541,7 +541,7 @@ class ImageNode {
541
541
  }
542
542
  // Override this to change how children are considered within a given region.
543
543
  getChildrenIntersectingRegion(region, isTooSmallFilter) {
544
- return this.children.filter(child => {
544
+ return this.children.filter((child) => {
545
545
  const bbox = child.getBBox();
546
546
  return !isTooSmallFilter?.(bbox) && bbox.intersects(region);
547
547
  });
@@ -632,7 +632,7 @@ class ImageNode {
632
632
  }
633
633
  return nodeForNewLeaf.addLeaf(leaf);
634
634
  }
635
- const containingNodes = this.children.filter(child => child.getBBox().containsRect(leafBBox));
635
+ const containingNodes = this.children.filter((child) => child.getBBox().containsRect(leafBBox));
636
636
  // Does the leaf already fit within one of the children?
637
637
  if (containingNodes.length > 0 && this.children.length >= this.targetChildCount) {
638
638
  // Sort the containers in ascending order by area
@@ -670,7 +670,7 @@ class ImageNode {
670
670
  this.bbox = this.content.getBBox();
671
671
  }
672
672
  else {
673
- this.bbox = math_1.Rect2.union(...this.children.map(child => child.getBBox()));
673
+ this.bbox = math_1.Rect2.union(...this.children.map((child) => child.getBBox()));
674
674
  }
675
675
  if (bubbleUp && !oldBBox.eq(this.bbox)) {
676
676
  if (this.bbox.containsRect(oldBBox)) {
@@ -705,7 +705,7 @@ class ImageNode {
705
705
  const oldParent = this.parent;
706
706
  if (oldParent.parent !== null) {
707
707
  const newParent = oldParent.parent;
708
- newParent.children = newParent.children.filter(c => c !== oldParent);
708
+ newParent.children = newParent.children.filter((c) => c !== oldParent);
709
709
  oldParent.parent = null;
710
710
  oldParent.children = [];
711
711
  this.parent = newParent;
@@ -777,11 +777,11 @@ class ImageNode {
777
777
  removeChild(child) {
778
778
  this.checkRep();
779
779
  const oldChildCount = this.children.length;
780
- this.children = this.children.filter(node => {
780
+ this.children = this.children.filter((node) => {
781
781
  return node !== child;
782
782
  });
783
783
  console.assert(this.children.length === oldChildCount - 1, `${oldChildCount - 1} ≠ ${this.children.length} after removing all nodes equal to ${child}. Nodes should only be removed once.`);
784
- this.children.forEach(child => {
784
+ this.children.forEach((child) => {
785
785
  child.rebalance();
786
786
  });
787
787
  this.recomputeBBox(true);
@@ -830,7 +830,7 @@ class ImageNode {
830
830
  render(renderer, visibleRect) {
831
831
  let leaves;
832
832
  if (visibleRect) {
833
- leaves = this.getLeavesIntersectingRegion(visibleRect, rect => renderer.isTooSmallToRender(rect));
833
+ leaves = this.getLeavesIntersectingRegion(visibleRect, (rect) => renderer.isTooSmallToRender(rect));
834
834
  }
835
835
  else {
836
836
  leaves = this.getLeaves();
@@ -941,10 +941,8 @@ class RootImageNode extends ImageNode {
941
941
  };
942
942
  // Check whether the child is stored in the data/fullscreen
943
943
  // component arrays first.
944
- this.dataComponents = this.dataComponents
945
- .filter(checkTargetChild);
946
- this.fullscreenChildren = this.fullscreenChildren
947
- .filter(checkTargetChild);
944
+ this.dataComponents = this.dataComponents.filter(checkTargetChild);
945
+ this.fullscreenChildren = this.fullscreenChildren.filter(checkTargetChild);
948
946
  if (!removed) {
949
947
  super.removeChild(child);
950
948
  }
@@ -52,7 +52,7 @@ const editorImageToSVGSync = (image, options) => {
52
52
  };
53
53
  exports.editorImageToSVGSync = editorImageToSVGSync;
54
54
  const editorImageToSVGAsync = (image, preRenderComponent, options) => {
55
- return new Promise(resolve => {
55
+ return new Promise((resolve) => {
56
56
  toSVGInternal(image, async (renderer, onComplete) => {
57
57
  await image.renderAllAsync(renderer, preRenderComponent);
58
58
  const result = onComplete();
@@ -34,8 +34,8 @@ const keyPressEventFromHTMLEvent = (event) => {
34
34
  };
35
35
  exports.keyPressEventFromHTMLEvent = keyPressEventFromHTMLEvent;
36
36
  const isPointerEvt = (event) => {
37
- return event.kind === InputEvtType.PointerDownEvt
38
- || event.kind === InputEvtType.PointerMoveEvt
39
- || event.kind === InputEvtType.PointerUpEvt;
37
+ return (event.kind === InputEvtType.PointerDownEvt ||
38
+ event.kind === InputEvtType.PointerMoveEvt ||
39
+ event.kind === InputEvtType.PointerUpEvt);
40
40
  };
41
41
  exports.isPointerEvt = isPointerEvt;
package/dist/cjs/lib.d.ts CHANGED
@@ -18,7 +18,7 @@ import Editor, { EditorSettings } from './Editor';
18
18
  export * from './image/lib';
19
19
  export * from './types';
20
20
  export * from './inputEvents';
21
- export { default as getLocalizationTable, matchingLocalizationTable } from './localizations/getLocalizationTable';
21
+ export { default as getLocalizationTable, matchingLocalizationTable, } from './localizations/getLocalizationTable';
22
22
  export * from './localization';
23
23
  export { default as SVGLoader } from './SVGLoader/SVGLoader';
24
24
  export { default as Viewport } from './Viewport';
@@ -36,7 +36,7 @@ export { default as UndoRedoHistory } from './UndoRedoHistory';
36
36
  export * from './util/lib';
37
37
  export { default as __js_draw__version } from './version';
38
38
  import AbstractToolbar from './toolbar/AbstractToolbar';
39
- export { Editor, EditorSettings, AbstractToolbar, };
39
+ export { Editor, EditorSettings, AbstractToolbar };
40
40
  /**
41
41
  * Using the HTMLToolbar alias is deprecated. Use
42
42
  * `AbstractToolbar` instead.
@@ -91,11 +91,11 @@ const localization = {
91
91
  textNodeCount: (count) => `Es gibt ${count} sichtbare Text-Knotenpunkte.`,
92
92
  textNode: (content) => `Text: ${content}`,
93
93
  imageNodeCount: (nodeCount) => `Es gibt ${nodeCount} sichtbare Bild-Knoten.`,
94
- imageNode: label => `Bild: ${label}`,
94
+ imageNode: (label) => `Bild: ${label}`,
95
95
  unlabeledImageNode: 'Bild ohne Label',
96
96
  rerenderAsText: 'Als Text darstellen',
97
97
  accessibilityInputInstructions: 'Drücke ‚t‘, um den Inhalt des Ansichtsfensters als Text zu lesen. Verwende die Pfeiltasten, um die Ansicht zu verschieben, und klicke und ziehe, um Striche zu zeichnen. Drücke ‚w‘ zum Vergrößern und ‚s‘ zum Verkleinern der Ansicht.',
98
- loading: percentage => `Laden ${percentage}%...`,
98
+ loading: (percentage) => `Laden ${percentage}%...`,
99
99
  doneLoading: 'Laden fertig',
100
100
  imageEditor: 'Bild-Editor',
101
101
  undoAnnouncement: (commandDescription) => `${commandDescription} rückgängig gemacht`,
@@ -48,9 +48,13 @@ const localization = {
48
48
  selectionMenu__duplicate: 'Duplicar',
49
49
  closeSidebar: (toolName) => `Close sidebar for ${toolName}`,
50
50
  dropdownShown: (toolName) => `Menú por ${toolName} es visible`,
51
- dropdownHidden: (toolName) => { return `Menú por ${toolName} fue ocultado`; },
51
+ dropdownHidden: (toolName) => {
52
+ return `Menú por ${toolName} fue ocultado`;
53
+ },
52
54
  zoomLevel: (zoomPercent) => `Zoom: ${zoomPercent}%`,
53
- colorChangedAnnouncement: (color) => { return `Color fue cambiado a ${color}`; },
55
+ colorChangedAnnouncement: (color) => {
56
+ return `Color fue cambiado a ${color}`;
57
+ },
54
58
  imageSize: (size, units) => `Tamaño del imagen: ${size} ${units}`,
55
59
  imageLoadError: (message) => `Error cargando imagen: ${message}`,
56
60
  penTool: (penId) => `Lapiz ${penId}`,
@@ -67,7 +71,7 @@ const localization = {
67
71
  closeDialog: 'Cerrar',
68
72
  anyDevicePanning: 'Mover la pantalla con todo dispotivo',
69
73
  copied: (count) => `${count} cosas fueron copiados`,
70
- pasted: (count) => count === 1 ? 'Pegado' : `${count} cosas fueron pegados`,
74
+ pasted: (count) => (count === 1 ? 'Pegado' : `${count} cosas fueron pegados`),
71
75
  toolEnabledAnnouncement: (toolName) => `${toolName} fue activado`,
72
76
  toolDisabledAnnouncement: (toolName) => `${toolName} fue desactivado`,
73
77
  resizeOutputCommand: (newSize) => `Tamaño de imagen fue cambiado a ${newSize.w}x${newSize.h}`,
@@ -85,7 +85,7 @@ class Display {
85
85
  // Require about 105 strokes with 4 parts each to use the cache at all.
86
86
  minProportionalRenderTimeToUseCache: 105 * 4,
87
87
  });
88
- this.editor.notifier.on(types_1.EditorEventType.DisplayResized, event => {
88
+ this.editor.notifier.on(types_1.EditorEventType.DisplayResized, (event) => {
89
89
  if (event.kind !== types_1.EditorEventType.DisplayResized) {
90
90
  throw new Error('Mismatched event.kinds!');
91
91
  }
@@ -123,10 +123,14 @@ class Display {
123
123
  }
124
124
  this.resizeSurfacesCallback = () => {
125
125
  const expectedWidth = (canvas) => {
126
- return Math.ceil(canvas.clientWidth * this.devicePixelRatio);
126
+ const widthInPixels = Math.ceil(canvas.clientWidth * this.devicePixelRatio);
127
+ // Avoid setting the canvas width to zero -- doing so can cause errors when attempting
128
+ // to use the canvas:
129
+ return widthInPixels || canvas.width;
127
130
  };
128
131
  const expectedHeight = (canvas) => {
129
- return Math.ceil(canvas.clientHeight * this.devicePixelRatio);
132
+ const heightInPixels = Math.ceil(canvas.clientHeight * this.devicePixelRatio);
133
+ return heightInPixels || canvas.height; // Zero-size canvases can cause errors.
130
134
  };
131
135
  const hasSizeMismatch = (canvas) => {
132
136
  return expectedHeight(canvas) !== canvas.height || expectedWidth(canvas) !== canvas.width;