js-draw 1.20.3 → 1.21.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (245) hide show
  1. package/LICENSE +1 -1
  2. package/dist/Editor.css +136 -26
  3. package/dist/bundle.js +2 -2
  4. package/dist/bundledStyles.js +1 -1
  5. package/dist/cjs/Editor.d.ts +27 -6
  6. package/dist/cjs/Editor.js +30 -8
  7. package/dist/cjs/SVGLoader/SVGLoader.js +2 -2
  8. package/dist/cjs/Viewport.d.ts +2 -2
  9. package/dist/cjs/commands/Command.d.ts +5 -0
  10. package/dist/cjs/commands/Command.js +5 -0
  11. package/dist/cjs/commands/SerializableCommand.d.ts +7 -0
  12. package/dist/cjs/commands/SerializableCommand.js +9 -0
  13. package/dist/cjs/dialogs/makeAboutDialog.d.ts +1 -1
  14. package/dist/cjs/dialogs/makeAboutDialog.js +10 -25
  15. package/dist/cjs/dialogs/makeMessageDialog.d.ts +11 -0
  16. package/dist/cjs/dialogs/makeMessageDialog.js +56 -0
  17. package/dist/cjs/image/EditorImage.d.ts +15 -1
  18. package/dist/cjs/image/EditorImage.js +15 -5
  19. package/dist/cjs/inputEvents.d.ts +10 -2
  20. package/dist/cjs/inputEvents.js +1 -0
  21. package/dist/cjs/localizations/es.js +3 -0
  22. package/dist/cjs/rendering/Display.d.ts +1 -0
  23. package/dist/cjs/rendering/Display.js +1 -0
  24. package/dist/cjs/rendering/TextRenderingStyle.d.ts +7 -6
  25. package/dist/cjs/rendering/TextRenderingStyle.js +1 -0
  26. package/dist/cjs/rendering/renderers/CanvasRenderer.d.ts +12 -3
  27. package/dist/cjs/rendering/renderers/CanvasRenderer.js +15 -2
  28. package/dist/cjs/rendering/renderers/DummyRenderer.d.ts +1 -1
  29. package/dist/cjs/testing/firstElementAncestorOfNode.d.ts +1 -1
  30. package/dist/cjs/testing/firstElementAncestorOfNode.js +1 -1
  31. package/dist/cjs/testing/sendPenEvent.d.ts +2 -2
  32. package/dist/cjs/testing/sendTouchEvent.d.ts +2 -2
  33. package/dist/cjs/toolbar/AbstractToolbar.d.ts +6 -1
  34. package/dist/cjs/toolbar/AbstractToolbar.js +6 -1
  35. package/dist/cjs/toolbar/IconProvider.d.ts +1 -1
  36. package/dist/cjs/toolbar/IconProvider.js +6 -1
  37. package/dist/cjs/toolbar/widgets/BaseWidget.d.ts +8 -0
  38. package/dist/cjs/toolbar/widgets/BaseWidget.js +8 -0
  39. package/dist/cjs/toolbar/widgets/HandToolWidget.d.ts +1 -0
  40. package/dist/cjs/toolbar/widgets/HandToolWidget.js +1 -0
  41. package/dist/cjs/toolbar/widgets/InsertImageWidget/ImageWrapper.d.ts +1 -1
  42. package/dist/cjs/toolbar/widgets/PenToolWidget.d.ts +6 -0
  43. package/dist/cjs/toolbar/widgets/PenToolWidget.js +5 -0
  44. package/dist/cjs/types.d.ts +5 -0
  45. package/dist/cjs/types.js +1 -0
  46. package/dist/cjs/util/ClipboardHandler.d.ts +9 -1
  47. package/dist/cjs/util/ClipboardHandler.js +82 -24
  48. package/dist/cjs/version.js +1 -1
  49. package/dist/mjs/Editor.d.ts +27 -6
  50. package/dist/mjs/Editor.mjs +31 -9
  51. package/dist/mjs/SVGLoader/SVGLoader.mjs +2 -2
  52. package/dist/mjs/Viewport.d.ts +2 -2
  53. package/dist/mjs/commands/Command.d.ts +5 -0
  54. package/dist/mjs/commands/Command.mjs +5 -0
  55. package/dist/mjs/commands/SerializableCommand.d.ts +7 -0
  56. package/dist/mjs/commands/SerializableCommand.mjs +9 -0
  57. package/dist/mjs/dialogs/makeAboutDialog.d.ts +1 -1
  58. package/dist/mjs/dialogs/makeAboutDialog.mjs +7 -25
  59. package/dist/mjs/dialogs/makeMessageDialog.d.ts +11 -0
  60. package/dist/mjs/dialogs/makeMessageDialog.mjs +51 -0
  61. package/dist/mjs/image/EditorImage.d.ts +15 -1
  62. package/dist/mjs/image/EditorImage.mjs +15 -5
  63. package/dist/mjs/inputEvents.d.ts +10 -2
  64. package/dist/mjs/inputEvents.mjs +1 -0
  65. package/dist/mjs/localizations/es.mjs +3 -0
  66. package/dist/mjs/rendering/Display.d.ts +1 -0
  67. package/dist/mjs/rendering/Display.mjs +1 -0
  68. package/dist/mjs/rendering/TextRenderingStyle.d.ts +7 -6
  69. package/dist/mjs/rendering/TextRenderingStyle.mjs +1 -0
  70. package/dist/mjs/rendering/renderers/CanvasRenderer.d.ts +12 -3
  71. package/dist/mjs/rendering/renderers/CanvasRenderer.mjs +15 -2
  72. package/dist/mjs/rendering/renderers/DummyRenderer.d.ts +1 -1
  73. package/dist/mjs/testing/firstElementAncestorOfNode.d.ts +1 -1
  74. package/dist/mjs/testing/firstElementAncestorOfNode.mjs +1 -1
  75. package/dist/mjs/testing/sendPenEvent.d.ts +2 -2
  76. package/dist/mjs/testing/sendTouchEvent.d.ts +2 -2
  77. package/dist/mjs/toolbar/AbstractToolbar.d.ts +6 -1
  78. package/dist/mjs/toolbar/AbstractToolbar.mjs +6 -1
  79. package/dist/mjs/toolbar/IconProvider.d.ts +1 -1
  80. package/dist/mjs/toolbar/IconProvider.mjs +6 -1
  81. package/dist/mjs/toolbar/widgets/BaseWidget.d.ts +8 -0
  82. package/dist/mjs/toolbar/widgets/BaseWidget.mjs +8 -0
  83. package/dist/mjs/toolbar/widgets/HandToolWidget.d.ts +1 -0
  84. package/dist/mjs/toolbar/widgets/HandToolWidget.mjs +1 -0
  85. package/dist/mjs/toolbar/widgets/InsertImageWidget/ImageWrapper.d.ts +1 -1
  86. package/dist/mjs/toolbar/widgets/PenToolWidget.d.ts +6 -0
  87. package/dist/mjs/toolbar/widgets/PenToolWidget.mjs +5 -0
  88. package/dist/mjs/types.d.ts +5 -0
  89. package/dist/mjs/types.mjs +1 -0
  90. package/dist/mjs/util/ClipboardHandler.d.ts +9 -1
  91. package/dist/mjs/util/ClipboardHandler.mjs +82 -24
  92. package/dist/mjs/version.mjs +1 -1
  93. package/package.json +8 -9
  94. package/src/dialogs/dialogs.scss +9 -21
  95. package/src/dialogs/makeAboutDialog.scss +13 -33
  96. package/src/dialogs/makeMessageDialog.scss +46 -0
  97. package/dist/cjs/tools/BaseTool.d.ts +0 -60
  98. package/dist/cjs/tools/BaseTool.js +0 -174
  99. package/dist/cjs/tools/Eraser.d.ts +0 -56
  100. package/dist/cjs/tools/Eraser.js +0 -295
  101. package/dist/cjs/tools/Eraser.test.d.ts +0 -1
  102. package/dist/cjs/tools/FindTool.d.ts +0 -21
  103. package/dist/cjs/tools/FindTool.js +0 -137
  104. package/dist/cjs/tools/FindTool.test.d.ts +0 -1
  105. package/dist/cjs/tools/InputFilter/FunctionMapper.d.ts +0 -12
  106. package/dist/cjs/tools/InputFilter/FunctionMapper.js +0 -21
  107. package/dist/cjs/tools/InputFilter/InputMapper.d.ts +0 -23
  108. package/dist/cjs/tools/InputFilter/InputMapper.js +0 -38
  109. package/dist/cjs/tools/InputFilter/InputPipeline.d.ts +0 -15
  110. package/dist/cjs/tools/InputFilter/InputPipeline.js +0 -54
  111. package/dist/cjs/tools/InputFilter/InputPipeline.test.d.ts +0 -1
  112. package/dist/cjs/tools/InputFilter/InputStabilizer.d.ts +0 -29
  113. package/dist/cjs/tools/InputFilter/InputStabilizer.js +0 -181
  114. package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.d.ts +0 -21
  115. package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.js +0 -84
  116. package/dist/cjs/tools/PanZoom.d.ts +0 -119
  117. package/dist/cjs/tools/PanZoom.js +0 -508
  118. package/dist/cjs/tools/PanZoom.test.d.ts +0 -1
  119. package/dist/cjs/tools/PasteHandler.d.ts +0 -23
  120. package/dist/cjs/tools/PasteHandler.js +0 -109
  121. package/dist/cjs/tools/Pen.d.ts +0 -53
  122. package/dist/cjs/tools/Pen.js +0 -318
  123. package/dist/cjs/tools/Pen.test.d.ts +0 -1
  124. package/dist/cjs/tools/PipetteTool.d.ts +0 -28
  125. package/dist/cjs/tools/PipetteTool.js +0 -69
  126. package/dist/cjs/tools/ScrollbarTool.d.ts +0 -18
  127. package/dist/cjs/tools/ScrollbarTool.js +0 -85
  128. package/dist/cjs/tools/SelectionTool/SelectAllShortcutHandler.d.ts +0 -9
  129. package/dist/cjs/tools/SelectionTool/SelectAllShortcutHandler.js +0 -32
  130. package/dist/cjs/tools/SelectionTool/Selection.d.ts +0 -71
  131. package/dist/cjs/tools/SelectionTool/Selection.js +0 -620
  132. package/dist/cjs/tools/SelectionTool/SelectionHandle.d.ts +0 -62
  133. package/dist/cjs/tools/SelectionTool/SelectionHandle.js +0 -141
  134. package/dist/cjs/tools/SelectionTool/SelectionTool.d.ts +0 -40
  135. package/dist/cjs/tools/SelectionTool/SelectionTool.js +0 -494
  136. package/dist/cjs/tools/SelectionTool/SelectionTool.selecting.test.d.ts +0 -1
  137. package/dist/cjs/tools/SelectionTool/SelectionTool.test.d.ts +0 -1
  138. package/dist/cjs/tools/SelectionTool/ToPointerAutoscroller.d.ts +0 -23
  139. package/dist/cjs/tools/SelectionTool/ToPointerAutoscroller.js +0 -83
  140. package/dist/cjs/tools/SelectionTool/TransformMode.d.ts +0 -42
  141. package/dist/cjs/tools/SelectionTool/TransformMode.js +0 -155
  142. package/dist/cjs/tools/SelectionTool/types.d.ts +0 -28
  143. package/dist/cjs/tools/SelectionTool/types.js +0 -14
  144. package/dist/cjs/tools/SoundUITool.d.ts +0 -26
  145. package/dist/cjs/tools/SoundUITool.js +0 -171
  146. package/dist/cjs/tools/TextTool.d.ts +0 -36
  147. package/dist/cjs/tools/TextTool.js +0 -285
  148. package/dist/cjs/tools/TextTool.test.d.ts +0 -1
  149. package/dist/cjs/tools/ToolController.d.ts +0 -73
  150. package/dist/cjs/tools/ToolController.js +0 -304
  151. package/dist/cjs/tools/ToolController.test.d.ts +0 -1
  152. package/dist/cjs/tools/ToolEnabledGroup.d.ts +0 -6
  153. package/dist/cjs/tools/ToolEnabledGroup.js +0 -13
  154. package/dist/cjs/tools/ToolSwitcherShortcut.d.ts +0 -16
  155. package/dist/cjs/tools/ToolSwitcherShortcut.js +0 -40
  156. package/dist/cjs/tools/ToolbarShortcutHandler.d.ts +0 -12
  157. package/dist/cjs/tools/ToolbarShortcutHandler.js +0 -34
  158. package/dist/cjs/tools/UndoRedoShortcut.d.ts +0 -8
  159. package/dist/cjs/tools/UndoRedoShortcut.js +0 -27
  160. package/dist/cjs/tools/UndoRedoShortcut.test.d.ts +0 -1
  161. package/dist/cjs/tools/keybindings.d.ts +0 -18
  162. package/dist/cjs/tools/keybindings.js +0 -49
  163. package/dist/cjs/tools/lib.d.ts +0 -14
  164. package/dist/cjs/tools/lib.js +0 -36
  165. package/dist/cjs/tools/localization.d.ts +0 -34
  166. package/dist/cjs/tools/localization.js +0 -36
  167. package/dist/cjs/tools/util/StationaryPenDetector.d.ts +0 -22
  168. package/dist/cjs/tools/util/StationaryPenDetector.js +0 -95
  169. package/dist/mjs/tools/BaseTool.d.ts +0 -60
  170. package/dist/mjs/tools/BaseTool.mjs +0 -172
  171. package/dist/mjs/tools/Eraser.d.ts +0 -56
  172. package/dist/mjs/tools/Eraser.mjs +0 -288
  173. package/dist/mjs/tools/Eraser.test.d.ts +0 -1
  174. package/dist/mjs/tools/FindTool.d.ts +0 -21
  175. package/dist/mjs/tools/FindTool.mjs +0 -131
  176. package/dist/mjs/tools/FindTool.test.d.ts +0 -1
  177. package/dist/mjs/tools/InputFilter/FunctionMapper.d.ts +0 -12
  178. package/dist/mjs/tools/InputFilter/FunctionMapper.mjs +0 -15
  179. package/dist/mjs/tools/InputFilter/InputMapper.d.ts +0 -23
  180. package/dist/mjs/tools/InputFilter/InputMapper.mjs +0 -36
  181. package/dist/mjs/tools/InputFilter/InputPipeline.d.ts +0 -15
  182. package/dist/mjs/tools/InputFilter/InputPipeline.mjs +0 -49
  183. package/dist/mjs/tools/InputFilter/InputPipeline.test.d.ts +0 -1
  184. package/dist/mjs/tools/InputFilter/InputStabilizer.d.ts +0 -29
  185. package/dist/mjs/tools/InputFilter/InputStabilizer.mjs +0 -175
  186. package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.d.ts +0 -21
  187. package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.mjs +0 -78
  188. package/dist/mjs/tools/PanZoom.d.ts +0 -119
  189. package/dist/mjs/tools/PanZoom.mjs +0 -501
  190. package/dist/mjs/tools/PanZoom.test.d.ts +0 -1
  191. package/dist/mjs/tools/PasteHandler.d.ts +0 -23
  192. package/dist/mjs/tools/PasteHandler.mjs +0 -103
  193. package/dist/mjs/tools/Pen.d.ts +0 -53
  194. package/dist/mjs/tools/Pen.mjs +0 -312
  195. package/dist/mjs/tools/Pen.test.d.ts +0 -1
  196. package/dist/mjs/tools/PipetteTool.d.ts +0 -28
  197. package/dist/mjs/tools/PipetteTool.mjs +0 -63
  198. package/dist/mjs/tools/ScrollbarTool.d.ts +0 -18
  199. package/dist/mjs/tools/ScrollbarTool.mjs +0 -79
  200. package/dist/mjs/tools/SelectionTool/SelectAllShortcutHandler.d.ts +0 -9
  201. package/dist/mjs/tools/SelectionTool/SelectAllShortcutHandler.mjs +0 -26
  202. package/dist/mjs/tools/SelectionTool/Selection.d.ts +0 -71
  203. package/dist/mjs/tools/SelectionTool/Selection.mjs +0 -592
  204. package/dist/mjs/tools/SelectionTool/SelectionHandle.d.ts +0 -62
  205. package/dist/mjs/tools/SelectionTool/SelectionHandle.mjs +0 -137
  206. package/dist/mjs/tools/SelectionTool/SelectionTool.d.ts +0 -40
  207. package/dist/mjs/tools/SelectionTool/SelectionTool.mjs +0 -488
  208. package/dist/mjs/tools/SelectionTool/SelectionTool.selecting.test.d.ts +0 -1
  209. package/dist/mjs/tools/SelectionTool/SelectionTool.test.d.ts +0 -1
  210. package/dist/mjs/tools/SelectionTool/ToPointerAutoscroller.d.ts +0 -23
  211. package/dist/mjs/tools/SelectionTool/ToPointerAutoscroller.mjs +0 -77
  212. package/dist/mjs/tools/SelectionTool/TransformMode.d.ts +0 -42
  213. package/dist/mjs/tools/SelectionTool/TransformMode.mjs +0 -146
  214. package/dist/mjs/tools/SelectionTool/types.d.ts +0 -28
  215. package/dist/mjs/tools/SelectionTool/types.mjs +0 -11
  216. package/dist/mjs/tools/SoundUITool.d.ts +0 -26
  217. package/dist/mjs/tools/SoundUITool.mjs +0 -165
  218. package/dist/mjs/tools/TextTool.d.ts +0 -36
  219. package/dist/mjs/tools/TextTool.mjs +0 -279
  220. package/dist/mjs/tools/TextTool.test.d.ts +0 -1
  221. package/dist/mjs/tools/ToolController.d.ts +0 -73
  222. package/dist/mjs/tools/ToolController.mjs +0 -275
  223. package/dist/mjs/tools/ToolController.test.d.ts +0 -1
  224. package/dist/mjs/tools/ToolEnabledGroup.d.ts +0 -6
  225. package/dist/mjs/tools/ToolEnabledGroup.mjs +0 -10
  226. package/dist/mjs/tools/ToolSwitcherShortcut.d.ts +0 -16
  227. package/dist/mjs/tools/ToolSwitcherShortcut.mjs +0 -34
  228. package/dist/mjs/tools/ToolbarShortcutHandler.d.ts +0 -12
  229. package/dist/mjs/tools/ToolbarShortcutHandler.mjs +0 -28
  230. package/dist/mjs/tools/UndoRedoShortcut.d.ts +0 -8
  231. package/dist/mjs/tools/UndoRedoShortcut.mjs +0 -21
  232. package/dist/mjs/tools/UndoRedoShortcut.test.d.ts +0 -1
  233. package/dist/mjs/tools/keybindings.d.ts +0 -18
  234. package/dist/mjs/tools/keybindings.mjs +0 -43
  235. package/dist/mjs/tools/lib.d.ts +0 -14
  236. package/dist/mjs/tools/lib.mjs +0 -14
  237. package/dist/mjs/tools/localization.d.ts +0 -34
  238. package/dist/mjs/tools/localization.mjs +0 -33
  239. package/dist/mjs/tools/util/StationaryPenDetector.d.ts +0 -22
  240. package/dist/mjs/tools/util/StationaryPenDetector.mjs +0 -92
  241. package/src/tools/FindTool.css +0 -7
  242. package/src/tools/ScrollbarTool.scss +0 -57
  243. package/src/tools/SelectionTool/SelectionTool.scss +0 -137
  244. package/src/tools/SoundUITool.scss +0 -22
  245. package/src/tools/tools.scss +0 -5
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const waitForTimeout_1 = __importDefault(require("../util/waitForTimeout"));
7
+ const makeAboutDialog = (editor, options) => {
8
+ const overlay = document.createElement('div');
9
+ const { remove: removeOverlay } = editor.createHTMLOverlay(overlay);
10
+ overlay.classList.add('dialog-container', 'message-dialog-container', ...(options.classNames ?? []));
11
+ const dialog = document.createElement('dialog');
12
+ const contentWrapper = document.createElement('div');
13
+ contentWrapper.classList.add('message-dialog-content', ...(options.contentClassNames ?? []));
14
+ const heading = document.createElement('h1');
15
+ heading.textContent = options.title;
16
+ heading.setAttribute('autofocus', 'true');
17
+ const closeButton = document.createElement('button');
18
+ closeButton.innerText = editor.localization.closeDialog;
19
+ closeButton.classList.add('close');
20
+ const scrollRegion = document.createElement('div');
21
+ scrollRegion.classList.add('scroll');
22
+ // Allow scrolling in the scrollable container -- don't forward wheel events.
23
+ scrollRegion.onwheel = evt => evt.stopPropagation();
24
+ contentWrapper.replaceChildren(heading, scrollRegion, closeButton);
25
+ dialog.replaceChildren(contentWrapper);
26
+ overlay.replaceChildren(dialog);
27
+ const closeTimeout = 300;
28
+ dialog.style.setProperty('--close-delay', `${closeTimeout}ms`);
29
+ const closeDialog = async () => {
30
+ dialog.classList.add('-closing');
31
+ await (0, waitForTimeout_1.default)(closeTimeout);
32
+ dialog.close();
33
+ };
34
+ const addCloseListeners = () => {
35
+ dialog.addEventListener('pointerdown', event => {
36
+ if (event.target === dialog) {
37
+ void closeDialog();
38
+ }
39
+ });
40
+ dialog.onclose = () => {
41
+ removeOverlay();
42
+ };
43
+ closeButton.onclick = () => closeDialog();
44
+ };
45
+ addCloseListeners();
46
+ dialog.showModal();
47
+ return {
48
+ close: () => {
49
+ return closeDialog();
50
+ },
51
+ appendChild: (child) => {
52
+ scrollRegion.appendChild(child);
53
+ },
54
+ };
55
+ };
56
+ exports.default = makeAboutDialog;
@@ -21,6 +21,9 @@ export type EditorImageNotifier = EventDispatcher<EditorImageEventType, {
21
21
  * 3. stop the render process early by returning `false`.
22
22
  */
23
23
  export type PreRenderComponentCallback = (component: AbstractComponent, componentsProcessed: number, totalComponents: number) => Promise<boolean>;
24
+ /**
25
+ * Handles lookup/storage of elements in the image.
26
+ */
24
27
  export default class EditorImage {
25
28
  private root;
26
29
  private background;
@@ -88,7 +91,8 @@ export default class EditorImage {
88
91
  *
89
92
  * @see {@link Display.flatten}
90
93
  *
91
- * @example
94
+ * **Example**:
95
+ *
92
96
  * [[include:doc-pages/inline-examples/adding-a-stroke.md]]
93
97
  */
94
98
  static addElement(elem: AbstractComponent, applyByFlattening?: boolean): SerializableCommand;
@@ -199,6 +203,16 @@ export declare class ImageNode {
199
203
  getParent(): ImageNode | null;
200
204
  protected getChildrenIntersectingRegion(region: Rect2, isTooSmallFilter?: TooSmallToRenderCheck): ImageNode[];
201
205
  getChildrenOrSelfIntersectingRegion(region: Rect2): ImageNode[];
206
+ /**
207
+ * Returns a list of `ImageNode`s with content (and thus no children).
208
+ * Override getChildrenIntersectingRegion to customize how this method
209
+ * determines whether/which children are in `region`.
210
+ *
211
+ * @paran region - All resultant `ImageNode`s must intersect `region`.
212
+ * @param isTooSmall - If `isTooSmall` returns true for an image node, that node
213
+ * is excluded from the output.
214
+ *
215
+ */
202
216
  getLeavesIntersectingRegion(region: Rect2, isTooSmall?: TooSmallToRenderCheck): ImageNode[];
203
217
  getChildWithContent(target: AbstractComponent): ImageNode | null;
204
218
  getLeaves(): ImageNode[];
@@ -50,7 +50,9 @@ var EditorImageEventType;
50
50
  EditorImageEventType[EditorImageEventType["AutoresizeModeChanged"] = 1] = "AutoresizeModeChanged";
51
51
  })(EditorImageEventType || (exports.EditorImageEventType = EditorImageEventType = {}));
52
52
  let debugMode = false;
53
- // Handles lookup/storage of elements in the image
53
+ /**
54
+ * Handles lookup/storage of elements in the image.
55
+ */
54
56
  class EditorImage {
55
57
  // @internal
56
58
  constructor() {
@@ -211,7 +213,8 @@ class EditorImage {
211
213
  *
212
214
  * @see {@link Display.flatten}
213
215
  *
214
- * @example
216
+ * **Example**:
217
+ *
215
218
  * [[include:doc-pages/inline-examples/adding-a-stroke.md]]
216
219
  */
217
220
  static addElement(elem, applyByFlattening = false) {
@@ -549,9 +552,16 @@ class ImageNode {
549
552
  }
550
553
  return this.getChildrenIntersectingRegion(region);
551
554
  }
552
- // Returns a list of `ImageNode`s with content (and thus no children).
553
- // Override getChildrenIntersectingRegion to customize how this method
554
- // determines whether/which children are in `region`.
555
+ /**
556
+ * Returns a list of `ImageNode`s with content (and thus no children).
557
+ * Override getChildrenIntersectingRegion to customize how this method
558
+ * determines whether/which children are in `region`.
559
+ *
560
+ * @paran region - All resultant `ImageNode`s must intersect `region`.
561
+ * @param isTooSmall - If `isTooSmall` returns true for an image node, that node
562
+ * is excluded from the output.
563
+ *
564
+ */
555
565
  getLeavesIntersectingRegion(region, isTooSmall) {
556
566
  const result = [];
557
567
  const workList = [];
@@ -17,7 +17,8 @@ export declare enum InputEvtType {
17
17
  KeyPressEvent = 5,
18
18
  KeyUpEvent = 6,
19
19
  CopyEvent = 7,
20
- PasteEvent = 8
20
+ PasteEvent = 8,
21
+ ContextMenu = 9
21
22
  }
22
23
  export interface WheelEvt {
23
24
  readonly kind: InputEvtType.WheelEvt;
@@ -76,18 +77,25 @@ export interface PointerMoveEvt extends PointerEvtBase {
76
77
  export interface PointerUpEvt extends PointerEvtBase {
77
78
  readonly kind: InputEvtType.PointerUpEvt;
78
79
  }
80
+ export interface ContextMenuEvt {
81
+ readonly kind: InputEvtType.ContextMenu;
82
+ readonly screenPos: Point2;
83
+ readonly canvasPos: Point2;
84
+ }
79
85
  /**
80
86
  * An internal `js-draw` pointer event type.
81
87
  *
82
88
  * This **is not** the same as a DOM pointer event.
83
89
  */
84
90
  export type PointerEvt = PointerDownEvt | PointerMoveEvt | PointerUpEvt;
91
+ /** The type of any internal {@link PointerEvt} record. */
92
+ export type PointerEvtType = InputEvtType.PointerDownEvt | InputEvtType.PointerMoveEvt | InputEvtType.PointerUpEvt;
85
93
  /**
86
94
  * An internal `js-draw` input event type.
87
95
  *
88
96
  * These are not DOM events.
89
97
  */
90
- export type InputEvt = KeyPressEvent | KeyUpEvent | WheelEvt | GestureCancelEvt | PointerEvt | CopyEvent | PasteEvent;
98
+ export type InputEvt = KeyPressEvent | KeyUpEvent | WheelEvt | GestureCancelEvt | PointerEvt | CopyEvent | PasteEvent | ContextMenuEvt;
91
99
  export declare const keyUpEventFromHTMLEvent: (event: KeyboardEvent) => KeyUpEvent;
92
100
  export declare const keyPressEventFromHTMLEvent: (event: KeyboardEvent) => KeyPressEvent;
93
101
  export declare const isPointerEvt: (event: InputEvt) => event is PointerEvt;
@@ -12,6 +12,7 @@ var InputEvtType;
12
12
  InputEvtType[InputEvtType["KeyUpEvent"] = 6] = "KeyUpEvent";
13
13
  InputEvtType[InputEvtType["CopyEvent"] = 7] = "CopyEvent";
14
14
  InputEvtType[InputEvtType["PasteEvent"] = 8] = "PasteEvent";
15
+ InputEvtType[InputEvtType["ContextMenu"] = 9] = "ContextMenu";
15
16
  })(InputEvtType || (exports.InputEvtType = InputEvtType = {}));
16
17
  // Constructor
17
18
  const keyEventFromHTMLEvent = (kind, event) => {
@@ -43,6 +43,9 @@ const localization = {
43
43
  filledRectanglePen: 'Rectángulo sin borde',
44
44
  lockRotation: 'Bloquea rotación',
45
45
  paste: 'Pegar',
46
+ selectionMenu__paste: 'Pegar',
47
+ selectionMenu__delete: 'Eliminar',
48
+ selectionMenu__duplicate: 'Duplicar',
46
49
  closeSidebar: (toolName) => `Close sidebar for ${toolName}`,
47
50
  dropdownShown: (toolName) => `Menú por ${toolName} es visible`,
48
51
  dropdownHidden: (toolName) => { return `Menú por ${toolName} fue ocultado`; },
@@ -37,6 +37,7 @@ export default class Display {
37
37
  * in the DOM).
38
38
  */
39
39
  get width(): number;
40
+ /** @returns the visible height of the display. See {@link width}. */
40
41
  get height(): number;
41
42
  /** @internal */
42
43
  getCache(): RenderingCache;
@@ -100,6 +100,7 @@ class Display {
100
100
  get width() {
101
101
  return this.dryInkRenderer.displaySize().x;
102
102
  }
103
+ /** @returns the visible height of the display. See {@link width}. */
103
104
  get height() {
104
105
  return this.dryInkRenderer.displaySize().y;
105
106
  }
@@ -22,10 +22,11 @@ export declare const cloneTextStyle: (style: TextRenderingStyle) => {
22
22
  };
23
23
  size: number;
24
24
  fontFamily: string;
25
- fontWeight?: string | undefined;
26
- fontStyle?: string | undefined;
27
- fontVariant?: string | undefined;
25
+ fontWeight?: string;
26
+ fontStyle?: string;
27
+ fontVariant?: string;
28
28
  };
29
+ /** `json` can either be a `string` or an `object`. */
29
30
  export declare const textStyleFromJSON: (json: any) => TextRenderingStyle;
30
31
  export declare const textStyleToJSON: (style: TextRenderingStyle) => {
31
32
  renderingStyle: {
@@ -37,7 +38,7 @@ export declare const textStyleToJSON: (style: TextRenderingStyle) => {
37
38
  };
38
39
  size: number;
39
40
  fontFamily: string;
40
- fontWeight?: string | undefined;
41
- fontStyle?: string | undefined;
42
- fontVariant?: string | undefined;
41
+ fontWeight?: string;
42
+ fontStyle?: string;
43
+ fontVariant?: string;
43
44
  };
@@ -9,6 +9,7 @@ const cloneTextStyle = (style) => {
9
9
  };
10
10
  };
11
11
  exports.cloneTextStyle = cloneTextStyle;
12
+ /** `json` can either be a `string` or an `object`. */
12
13
  const textStyleFromJSON = (json) => {
13
14
  if (typeof json === 'string') {
14
15
  json = JSON.parse(json);
@@ -8,9 +8,15 @@ import RenderablePathSpec from '../RenderablePathSpec';
8
8
  * Renders onto a `CanvasRenderingContext2D`.
9
9
  *
10
10
  * @example
11
- * ```ts
12
- * const editor = new Editor(document.body);
11
+ * ```ts,runnable
12
+ * import {Editor,CanvasRenderer} from 'js-draw';
13
13
  *
14
+ * // Create an editor and load initial data -- don't add to the body (hidden editor).
15
+ * const editor = new Editor(document.createElement('div'));
16
+ * await editor.loadFromSVG('<svg><path d="m0,0 l100,5 l-50,60 l30,20 z" fill="green"/></svg>');
17
+ * ---visible---
18
+ * // Given some editor.
19
+ * // Set up the canvas to be drawn onto.
14
20
  * const canvas = document.createElement('canvas');
15
21
  * const ctx = canvas.getContext('2d');
16
22
  *
@@ -22,6 +28,9 @@ import RenderablePathSpec from '../RenderablePathSpec';
22
28
  * // Render editor.image onto the renderer
23
29
  * const renderer = new CanvasRenderer(ctx, viewport);
24
30
  * editor.image.render(renderer, viewport);
31
+ *
32
+ * // Add the rendered canvas to the document.
33
+ * document.body.appendChild(canvas);
25
34
  * ```
26
35
  */
27
36
  export default class CanvasRenderer extends AbstractRenderer {
@@ -39,7 +48,7 @@ export default class CanvasRenderer extends AbstractRenderer {
39
48
  */
40
49
  constructor(ctx: CanvasRenderingContext2D, viewport: Viewport);
41
50
  private transformBy;
42
- canRenderFromWithoutDataLoss(other: AbstractRenderer): boolean;
51
+ canRenderFromWithoutDataLoss(other: AbstractRenderer): other is CanvasRenderer;
43
52
  renderFromOtherOfSameType(transformBy: Mat33, other: AbstractRenderer): void;
44
53
  setDraftMode(draftMode: boolean): void;
45
54
  displaySize(): Vec2;
@@ -11,9 +11,15 @@ const RenderablePathSpec_1 = require("../RenderablePathSpec");
11
11
  * Renders onto a `CanvasRenderingContext2D`.
12
12
  *
13
13
  * @example
14
- * ```ts
15
- * const editor = new Editor(document.body);
14
+ * ```ts,runnable
15
+ * import {Editor,CanvasRenderer} from 'js-draw';
16
16
  *
17
+ * // Create an editor and load initial data -- don't add to the body (hidden editor).
18
+ * const editor = new Editor(document.createElement('div'));
19
+ * await editor.loadFromSVG('<svg><path d="m0,0 l100,5 l-50,60 l30,20 z" fill="green"/></svg>');
20
+ * ---visible---
21
+ * // Given some editor.
22
+ * // Set up the canvas to be drawn onto.
17
23
  * const canvas = document.createElement('canvas');
18
24
  * const ctx = canvas.getContext('2d');
19
25
  *
@@ -25,6 +31,9 @@ const RenderablePathSpec_1 = require("../RenderablePathSpec");
25
31
  * // Render editor.image onto the renderer
26
32
  * const renderer = new CanvasRenderer(ctx, viewport);
27
33
  * editor.image.render(renderer, viewport);
34
+ *
35
+ * // Add the rendered canvas to the document.
36
+ * document.body.appendChild(canvas);
28
37
  * ```
29
38
  */
30
39
  class CanvasRenderer extends AbstractRenderer_1.default {
@@ -176,6 +185,10 @@ class CanvasRenderer extends AbstractRenderer_1.default {
176
185
  this.ctx.restore();
177
186
  }
178
187
  drawImage(image) {
188
+ // .drawImage can fail for zero-size images.
189
+ if (image.image.width === 0 || image.image.height === 0) {
190
+ return;
191
+ }
179
192
  this.ctx.save();
180
193
  const transform = this.getCanvasToScreenTransform().rightMul(image.transform);
181
194
  this.transformBy(transform);
@@ -27,7 +27,7 @@ export default class DummyRenderer extends AbstractRenderer {
27
27
  startObject(boundingBox: Rect2, _clip: boolean): void;
28
28
  endObject(): void;
29
29
  isTooSmallToRender(_rect: Rect2): boolean;
30
- canRenderFromWithoutDataLoss(other: AbstractRenderer): boolean;
30
+ canRenderFromWithoutDataLoss(other: AbstractRenderer): other is DummyRenderer;
31
31
  renderFromOtherOfSameType(transform: Mat33, other: AbstractRenderer): void;
32
32
  toString(): string;
33
33
  }
@@ -1,3 +1,3 @@
1
- /** Returns the first ancestor of the given node that is an HTMLElement */
1
+ /** Returns the first ancestor of the given node (or the node itself) that is an HTMLElement */
2
2
  declare const firstElementAncestorOfNode: (node: Node | null) => HTMLElement | null;
3
3
  export default firstElementAncestorOfNode;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- /** Returns the first ancestor of the given node that is an HTMLElement */
3
+ /** Returns the first ancestor of the given node (or the node itself) that is an HTMLElement */
4
4
  const firstElementAncestorOfNode = (node) => {
5
5
  if (node instanceof HTMLElement) {
6
6
  return node;
@@ -1,12 +1,12 @@
1
1
  import Editor from '../Editor';
2
2
  import { Point2 } from '@js-draw/math';
3
3
  import Pointer, { PointerDevice } from '../Pointer';
4
- import { InputEvtType } from '../inputEvents';
4
+ import { PointerEvtType } from '../inputEvents';
5
5
  /**
6
6
  * Dispatch a pen event to the currently selected tool.
7
7
  * Intended for unit tests.
8
8
  *
9
9
  * @see {@link sendTouchEvent}
10
10
  */
11
- declare const sendPenEvent: (editor: Editor, eventType: InputEvtType.PointerDownEvt | InputEvtType.PointerMoveEvt | InputEvtType.PointerUpEvt, point: Point2, allPointers?: Pointer[], deviceType?: PointerDevice) => Pointer;
11
+ declare const sendPenEvent: (editor: Editor, eventType: PointerEvtType, point: Point2, allPointers?: Pointer[], deviceType?: PointerDevice) => Pointer;
12
12
  export default sendPenEvent;
@@ -1,7 +1,7 @@
1
1
  import Editor from '../Editor';
2
2
  import { Vec2 } from '@js-draw/math';
3
3
  import Pointer from '../Pointer';
4
- import { InputEvtType } from '../inputEvents';
4
+ import { PointerEvtType } from '../inputEvents';
5
5
  /**
6
6
  * Dispatch a touch event to the currently selected tool. Intended for unit tests.
7
7
  *
@@ -38,5 +38,5 @@ import { InputEvtType } from '../inputEvents';
38
38
  * }
39
39
  * ```
40
40
  */
41
- declare const sendTouchEvent: (editor: Editor, eventType: InputEvtType.PointerDownEvt | InputEvtType.PointerMoveEvt | InputEvtType.PointerUpEvt, screenPos: Vec2, allOtherPointers?: Pointer[]) => Pointer;
41
+ declare const sendTouchEvent: (editor: Editor, eventType: PointerEvtType, screenPos: Vec2, allOtherPointers?: Pointer[]) => Pointer;
42
42
  export default sendTouchEvent;
@@ -13,6 +13,11 @@ export type ToolbarActionButtonOptions = {
13
13
  mustBeToplevel?: boolean;
14
14
  autoDisableInReadOnlyEditors?: boolean;
15
15
  };
16
+ /**
17
+ * Abstract base class for js-draw editor toolbars.
18
+ *
19
+ * See {@link Editor.addToolbar}, {@link makeDropdownToolbar}, and {@link makeEdgeToolbar}.
20
+ */
16
21
  export default abstract class AbstractToolbar {
17
22
  #private;
18
23
  protected editor: Editor;
@@ -82,7 +87,7 @@ export default abstract class AbstractToolbar {
82
87
  * Called by `serializeState` to attach any additional JSONifyable data
83
88
  * to the serialized result.
84
89
  *
85
- * @reutrns an object that can be converted to JSON with `JSON.stringify`.
90
+ * @returns an object that can be converted to JSON with `JSON.stringify`.
86
91
  */
87
92
  protected serializeInternal(): any;
88
93
  /**
@@ -36,6 +36,11 @@ const math_1 = require("@js-draw/math");
36
36
  const constants_1 = require("./constants");
37
37
  const SaveActionWidget_1 = __importDefault(require("./widgets/SaveActionWidget"));
38
38
  const ExitActionWidget_1 = __importDefault(require("./widgets/ExitActionWidget"));
39
+ /**
40
+ * Abstract base class for js-draw editor toolbars.
41
+ *
42
+ * See {@link Editor.addToolbar}, {@link makeDropdownToolbar}, and {@link makeEdgeToolbar}.
43
+ */
39
44
  class AbstractToolbar {
40
45
  /** @internal */
41
46
  constructor(editor, localizationTable = localization_1.defaultToolbarLocalization) {
@@ -222,7 +227,7 @@ class AbstractToolbar {
222
227
  * Called by `serializeState` to attach any additional JSONifyable data
223
228
  * to the serialized result.
224
229
  *
225
- * @reutrns an object that can be converted to JSON with `JSON.stringify`.
230
+ * @returns an object that can be converted to JSON with `JSON.stringify`.
226
231
  */
227
232
  serializeInternal() { }
228
233
  /**
@@ -63,7 +63,7 @@ export default class IconProvider {
63
63
  /** Renamed to {@link makeResizeImageToSelectionIcon} @deprecated */
64
64
  makeResizeViewportIcon(): IconElemType;
65
65
  makeDuplicateSelectionIcon(): IconElemType;
66
- /** Unused. @deprecated */
66
+ makeCopyIcon(): IconElemType;
67
67
  makePasteIcon(): IconElemType;
68
68
  makeDeleteSelectionIcon(): IconElemType;
69
69
  makeCloseIcon(): IconElemType;
@@ -710,7 +710,12 @@ class IconProvider {
710
710
  M 10,25 10,90 70,90 70,60 40,60 40,25 10,25 z
711
711
  `);
712
712
  }
713
- /** Unused. @deprecated */
713
+ makeCopyIcon() {
714
+ return this.makeIconFromPath(`
715
+ M 45,10 45,55 90,55 90,10 45,10 z
716
+ M 10,25 10,90 70,90 70,60 40,60 40,25 10,25 z
717
+ `);
718
+ }
714
719
  makePasteIcon() {
715
720
  const icon = this.makeIconFromPath(`
716
721
  M 50 0 L 50 5 L 35 5 L 40 24.75 L 20 25 L 20 100 L 85 100 L 100 90 L 100 24 L 75.1 24.3 L 80 5 L 65 5 L 65 0 L 50 0 z
@@ -13,6 +13,14 @@ export declare enum ToolbarWidgetTag {
13
13
  Undo = "undo",
14
14
  Redo = "redo"
15
15
  }
16
+ /**
17
+ * The `abstract` base class for items that can be shown in a `js-draw` toolbar. See also {@link AbstractToolbar.addWidget}.
18
+ *
19
+ * See [the custom tool example](https://github.com/personalizedrefrigerator/js-draw/blob/main/docs/examples/example-custom-tools/example.ts)
20
+ * for how to create a custom toolbar widget for a tool.
21
+ *
22
+ * For custom action buttons, {@link AbstractToolbar.addActionButton} may be sufficient for most use cases.
23
+ */
16
24
  export default abstract class BaseWidget {
17
25
  #private;
18
26
  protected editor: Editor;
@@ -32,6 +32,14 @@ var ToolbarWidgetTag;
32
32
  ToolbarWidgetTag["Undo"] = "undo";
33
33
  ToolbarWidgetTag["Redo"] = "redo";
34
34
  })(ToolbarWidgetTag || (exports.ToolbarWidgetTag = ToolbarWidgetTag = {}));
35
+ /**
36
+ * The `abstract` base class for items that can be shown in a `js-draw` toolbar. See also {@link AbstractToolbar.addWidget}.
37
+ *
38
+ * See [the custom tool example](https://github.com/personalizedrefrigerator/js-draw/blob/main/docs/examples/example-custom-tools/example.ts)
39
+ * for how to create a custom toolbar widget for a tool.
40
+ *
41
+ * For custom action buttons, {@link AbstractToolbar.addActionButton} may be sufficient for most use cases.
42
+ */
35
43
  class BaseWidget {
36
44
  constructor(editor, id, localizationTable) {
37
45
  _BaseWidget_instances.add(this);
@@ -4,6 +4,7 @@ import { ToolbarLocalization } from '../localization';
4
4
  import BaseToolWidget from './BaseToolWidget';
5
5
  import { SavedToolbuttonState } from './BaseWidget';
6
6
  import HelpDisplay from '../utils/HelpDisplay';
7
+ /** This toolbar widget allows controlling the editor's {@link PanZoom} tool(s). */
7
8
  export default class HandToolWidget extends BaseToolWidget {
8
9
  private allowTogglingBaseTool;
9
10
  protected overridePanZoomTool: PanZoom;
@@ -130,6 +130,7 @@ class HandModeWidget extends BaseWidget_1.default {
130
130
  return this.helpText;
131
131
  }
132
132
  }
133
+ /** This toolbar widget allows controlling the editor's {@link PanZoom} tool(s). */
133
134
  class HandToolWidget extends BaseToolWidget_1.default {
134
135
  constructor(editor,
135
136
  // Can either be the primary pan/zoom tool (in the primary tools list) or
@@ -1,4 +1,4 @@
1
- import { RenderableImage } from 'js-draw/src/rendering/renderers/AbstractRenderer';
1
+ import { RenderableImage } from '../../../rendering/renderers/AbstractRenderer';
2
2
  /** Handles filtering and other operations on an image. */
3
3
  export declare class ImageWrapper {
4
4
  private imageBase64Url;
@@ -6,12 +6,18 @@ import { ToolbarLocalization } from '../localization';
6
6
  import BaseToolWidget from './BaseToolWidget';
7
7
  import { SavedToolbuttonState } from './BaseWidget';
8
8
  import HelpDisplay from '../utils/HelpDisplay';
9
+ /** Represents a style that can be applied to a pen tool. */
9
10
  export interface PenTypeRecord {
10
11
  name: string;
11
12
  id: string;
12
13
  isShapeBuilder?: boolean;
13
14
  factory: ComponentBuilderFactory;
14
15
  }
16
+ /**
17
+ * This toolbar widget allows a user to control a single {@link Pen} tool.
18
+ *
19
+ * See also {@link AbstractToolbar.addDefaultToolWidgets}.
20
+ */
15
21
  export default class PenToolWidget extends BaseToolWidget {
16
22
  private tool;
17
23
  private updateInputs;
@@ -18,6 +18,11 @@ const constants_1 = require("../constants");
18
18
  const makeThicknessSlider_1 = __importDefault(require("./components/makeThicknessSlider"));
19
19
  const makeGridSelector_1 = __importDefault(require("./components/makeGridSelector"));
20
20
  const PolylineBuilder_1 = require("../../components/builders/PolylineBuilder");
21
+ /**
22
+ * This toolbar widget allows a user to control a single {@link Pen} tool.
23
+ *
24
+ * See also {@link AbstractToolbar.addDefaultToolWidgets}.
25
+ */
21
26
  class PenToolWidget extends BaseToolWidget_1.default {
22
27
  constructor(editor, tool, localization) {
23
28
  super(editor, tool, 'pen', localization);
@@ -4,7 +4,12 @@ import type BaseTool from './tools/BaseTool';
4
4
  import type AbstractComponent from './components/AbstractComponent';
5
5
  import type Command from './commands/Command';
6
6
  import type { WidgetContentLayoutManager } from './toolbar/widgets/layout/types';
7
+ /**
8
+ * The type of the {@link Editor.notifier}, which provides notifications for
9
+ * various editor-related events.
10
+ */
7
11
  export type EditorNotifier = EventDispatcher<EditorEventType, EditorEventDataType>;
12
+ /** @see {@link EditorNotifier} */
8
13
  export declare enum EditorEventType {
9
14
  ToolEnabled = 0,
10
15
  ToolDisabled = 1,
package/dist/cjs/types.js CHANGED
@@ -2,6 +2,7 @@
2
2
  // Types related to the image editor
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.UndoEventType = exports.EditorEventType = void 0;
5
+ /** @see {@link EditorNotifier} */
5
6
  var EditorEventType;
6
7
  (function (EditorEventType) {
7
8
  EditorEventType[EditorEventType["ToolEnabled"] = 0] = "ToolEnabled";
@@ -1,4 +1,8 @@
1
1
  import { Editor } from '../Editor';
2
+ interface Callbacks {
3
+ onPasteError(error: Error | unknown): void;
4
+ onCopyError(error: Error | unknown): void;
5
+ }
2
6
  /**
3
7
  * Handles conversion between the browser clipboard APIs and internal
4
8
  * js-draw clipboard events.
@@ -6,7 +10,8 @@ import { Editor } from '../Editor';
6
10
  export default class ClipboardHandler {
7
11
  #private;
8
12
  private editor;
9
- constructor(editor: Editor);
13
+ private callbacks?;
14
+ constructor(editor: Editor, callbacks?: Callbacks | undefined);
10
15
  /**
11
16
  * Pastes data from the clipboard into the editor associated with
12
17
  * this handler.
@@ -16,6 +21,7 @@ export default class ClipboardHandler {
16
21
  * @returns true if the paste event was handled by the editor.
17
22
  */
18
23
  paste(event?: DragEvent | ClipboardEvent): Promise<boolean>;
24
+ private pasteInternal;
19
25
  /**
20
26
  * Copies text from the editor associated with this.
21
27
  *
@@ -24,4 +30,6 @@ export default class ClipboardHandler {
24
30
  * images.
25
31
  */
26
32
  copy(event?: ClipboardEvent): Promise<void>;
33
+ private copyInternal;
27
34
  }
35
+ export {};