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
@@ -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;
@@ -9,6 +9,7 @@ export var InputEvtType;
9
9
  InputEvtType[InputEvtType["KeyUpEvent"] = 6] = "KeyUpEvent";
10
10
  InputEvtType[InputEvtType["CopyEvent"] = 7] = "CopyEvent";
11
11
  InputEvtType[InputEvtType["PasteEvent"] = 8] = "PasteEvent";
12
+ InputEvtType[InputEvtType["ContextMenu"] = 9] = "ContextMenu";
12
13
  })(InputEvtType || (InputEvtType = {}));
13
14
  // Constructor
14
15
  const keyEventFromHTMLEvent = (kind, event) => {
@@ -41,6 +41,9 @@ const localization = {
41
41
  filledRectanglePen: 'Rectángulo sin borde',
42
42
  lockRotation: 'Bloquea rotación',
43
43
  paste: 'Pegar',
44
+ selectionMenu__paste: 'Pegar',
45
+ selectionMenu__delete: 'Eliminar',
46
+ selectionMenu__duplicate: 'Duplicar',
44
47
  closeSidebar: (toolName) => `Close sidebar for ${toolName}`,
45
48
  dropdownShown: (toolName) => `Menú por ${toolName} es visible`,
46
49
  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;
@@ -94,6 +94,7 @@ export default class Display {
94
94
  get width() {
95
95
  return this.dryInkRenderer.displaySize().x;
96
96
  }
97
+ /** @returns the visible height of the display. See {@link width}. */
97
98
  get height() {
98
99
  return this.dryInkRenderer.displaySize().y;
99
100
  }
@@ -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
  };
@@ -5,6 +5,7 @@ export const cloneTextStyle = (style) => {
5
5
  renderingStyle: cloneStyle(style.renderingStyle),
6
6
  };
7
7
  };
8
+ /** `json` can either be a `string` or an `object`. */
8
9
  export const textStyleFromJSON = (json) => {
9
10
  if (typeof json === 'string') {
10
11
  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;
@@ -6,9 +6,15 @@ import { visualEquivalent } from '../RenderablePathSpec.mjs';
6
6
  * Renders onto a `CanvasRenderingContext2D`.
7
7
  *
8
8
  * @example
9
- * ```ts
10
- * const editor = new Editor(document.body);
9
+ * ```ts,runnable
10
+ * import {Editor,CanvasRenderer} from 'js-draw';
11
11
  *
12
+ * // Create an editor and load initial data -- don't add to the body (hidden editor).
13
+ * const editor = new Editor(document.createElement('div'));
14
+ * await editor.loadFromSVG('<svg><path d="m0,0 l100,5 l-50,60 l30,20 z" fill="green"/></svg>');
15
+ * ---visible---
16
+ * // Given some editor.
17
+ * // Set up the canvas to be drawn onto.
12
18
  * const canvas = document.createElement('canvas');
13
19
  * const ctx = canvas.getContext('2d');
14
20
  *
@@ -20,6 +26,9 @@ import { visualEquivalent } from '../RenderablePathSpec.mjs';
20
26
  * // Render editor.image onto the renderer
21
27
  * const renderer = new CanvasRenderer(ctx, viewport);
22
28
  * editor.image.render(renderer, viewport);
29
+ *
30
+ * // Add the rendered canvas to the document.
31
+ * document.body.appendChild(canvas);
23
32
  * ```
24
33
  */
25
34
  export default class CanvasRenderer extends AbstractRenderer {
@@ -171,6 +180,10 @@ export default class CanvasRenderer extends AbstractRenderer {
171
180
  this.ctx.restore();
172
181
  }
173
182
  drawImage(image) {
183
+ // .drawImage can fail for zero-size images.
184
+ if (image.image.width === 0 || image.image.height === 0) {
185
+ return;
186
+ }
174
187
  this.ctx.save();
175
188
  const transform = this.getCanvasToScreenTransform().rightMul(image.transform);
176
189
  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,4 +1,4 @@
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
  const firstElementAncestorOfNode = (node) => {
3
3
  if (node instanceof HTMLElement) {
4
4
  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
  /**
@@ -31,6 +31,11 @@ import { Color4 } from '@js-draw/math';
31
31
  import { toolbarCSSPrefix } from './constants.mjs';
32
32
  import SaveActionWidget from './widgets/SaveActionWidget.mjs';
33
33
  import ExitActionWidget from './widgets/ExitActionWidget.mjs';
34
+ /**
35
+ * Abstract base class for js-draw editor toolbars.
36
+ *
37
+ * See {@link Editor.addToolbar}, {@link makeDropdownToolbar}, and {@link makeEdgeToolbar}.
38
+ */
34
39
  class AbstractToolbar {
35
40
  /** @internal */
36
41
  constructor(editor, localizationTable = defaultToolbarLocalization) {
@@ -217,7 +222,7 @@ class AbstractToolbar {
217
222
  * Called by `serializeState` to attach any additional JSONifyable data
218
223
  * to the serialized result.
219
224
  *
220
- * @reutrns an object that can be converted to JSON with `JSON.stringify`.
225
+ * @returns an object that can be converted to JSON with `JSON.stringify`.
221
226
  */
222
227
  serializeInternal() { }
223
228
  /**
@@ -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;
@@ -705,7 +705,12 @@ class IconProvider {
705
705
  M 10,25 10,90 70,90 70,60 40,60 40,25 10,25 z
706
706
  `);
707
707
  }
708
- /** Unused. @deprecated */
708
+ makeCopyIcon() {
709
+ return this.makeIconFromPath(`
710
+ M 45,10 45,55 90,55 90,10 45,10 z
711
+ M 10,25 10,90 70,90 70,60 40,60 40,25 10,25 z
712
+ `);
713
+ }
709
714
  makePasteIcon() {
710
715
  const icon = this.makeIconFromPath(`
711
716
  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;
@@ -26,6 +26,14 @@ export var ToolbarWidgetTag;
26
26
  ToolbarWidgetTag["Undo"] = "undo";
27
27
  ToolbarWidgetTag["Redo"] = "redo";
28
28
  })(ToolbarWidgetTag || (ToolbarWidgetTag = {}));
29
+ /**
30
+ * The `abstract` base class for items that can be shown in a `js-draw` toolbar. See also {@link AbstractToolbar.addWidget}.
31
+ *
32
+ * See [the custom tool example](https://github.com/personalizedrefrigerator/js-draw/blob/main/docs/examples/example-custom-tools/example.ts)
33
+ * for how to create a custom toolbar widget for a tool.
34
+ *
35
+ * For custom action buttons, {@link AbstractToolbar.addActionButton} may be sufficient for most use cases.
36
+ */
29
37
  class BaseWidget {
30
38
  constructor(editor, id, localizationTable) {
31
39
  _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;
@@ -102,6 +102,7 @@ class HandModeWidget extends BaseWidget {
102
102
  return this.helpText;
103
103
  }
104
104
  }
105
+ /** This toolbar widget allows controlling the editor's {@link PanZoom} tool(s). */
105
106
  export default class HandToolWidget extends BaseToolWidget {
106
107
  constructor(editor,
107
108
  // 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;
@@ -13,6 +13,11 @@ import { toolbarCSSPrefix } from '../constants.mjs';
13
13
  import makeThicknessSlider from './components/makeThicknessSlider.mjs';
14
14
  import makeGridSelector from './components/makeGridSelector.mjs';
15
15
  import { makePolylineBuilder } from '../../components/builders/PolylineBuilder.mjs';
16
+ /**
17
+ * This toolbar widget allows a user to control a single {@link Pen} tool.
18
+ *
19
+ * See also {@link AbstractToolbar.addDefaultToolWidgets}.
20
+ */
16
21
  class PenToolWidget extends BaseToolWidget {
17
22
  constructor(editor, tool, localization) {
18
23
  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,
@@ -1,4 +1,5 @@
1
1
  // Types related to the image editor
2
+ /** @see {@link EditorNotifier} */
2
3
  export var EditorEventType;
3
4
  (function (EditorEventType) {
4
5
  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 {};
@@ -20,8 +20,9 @@ mime.endsWith('+xml') || mime.startsWith('text/');
20
20
  * js-draw clipboard events.
21
21
  */
22
22
  class ClipboardHandler {
23
- constructor(editor) {
23
+ constructor(editor, callbacks) {
24
24
  this.editor = editor;
25
+ this.callbacks = callbacks;
25
26
  _ClipboardHandler_preferClipboardEvents.set(this, false);
26
27
  }
27
28
  /**
@@ -32,7 +33,27 @@ class ClipboardHandler {
32
33
  * `navigator.clipboard` will be used instead.
33
34
  * @returns true if the paste event was handled by the editor.
34
35
  */
35
- async paste(event) {
36
+ paste(event) {
37
+ const onError = (error) => {
38
+ if (this.callbacks?.onPasteError) {
39
+ this.callbacks.onPasteError(error);
40
+ return Promise.resolve(false);
41
+ }
42
+ else {
43
+ throw error;
44
+ }
45
+ };
46
+ try {
47
+ // Use .catch rather than `async` to prevent future modifications from
48
+ // moving clipboard handling logic out of user event handlers.
49
+ // In the past, `await`s have caused permissions issues in some browsers.
50
+ return this.pasteInternal(event).catch(onError);
51
+ }
52
+ catch (error) {
53
+ return onError(error);
54
+ }
55
+ }
56
+ async pasteInternal(event) {
36
57
  const editor = this.editor;
37
58
  const clipboardData = event?.dataTransfer ?? event?.clipboardData ?? null;
38
59
  const hasEvent = !!clipboardData;
@@ -131,45 +152,82 @@ class ClipboardHandler {
131
152
  * images.
132
153
  */
133
154
  copy(event) {
134
- const mimeToData = Object.create(null);
155
+ const onError = (error) => {
156
+ if (this.callbacks?.onCopyError) {
157
+ this.callbacks.onCopyError(error);
158
+ return Promise.resolve();
159
+ }
160
+ else {
161
+ throw error;
162
+ }
163
+ };
164
+ try {
165
+ // As above, use `.catch` to be certain that certain copyInternal
166
+ // is run now, before returning.
167
+ return this.copyInternal(event).catch(onError);
168
+ }
169
+ catch (error) {
170
+ return onError(error);
171
+ }
172
+ }
173
+ copyInternal(event) {
174
+ const mimeToData = new Map();
135
175
  if (this.editor.toolController.dispatchInputEvent({
136
176
  kind: InputEvtType.CopyEvent,
137
177
  setData: (mime, data) => {
138
- mimeToData[mime] = data;
178
+ mimeToData.set(mime, data);
139
179
  },
140
180
  })) {
141
181
  event?.preventDefault();
142
182
  }
143
- const mimeTypes = Object.keys(mimeToData);
183
+ const mimeTypes = [...mimeToData.keys()];
144
184
  const hasNonTextMimeTypes = mimeTypes.some(mime => !isTextMimeType(mime));
145
- const copyToEvent = () => {
185
+ const copyToEvent = (reason) => {
146
186
  if (!event) {
147
- throw new Error('Unable to paste -- no event provided.');
187
+ throw new Error(`Unable to copy -- no event provided${reason ? `. Original error: ${reason}` : ''}`);
148
188
  }
149
- for (const key in mimeToData) {
150
- const value = mimeToData[key];
189
+ for (const [key, value] of mimeToData.entries()) {
151
190
  if (typeof value === 'string') {
152
191
  event.clipboardData?.setData(key, value);
153
192
  }
154
193
  }
155
194
  };
156
195
  const copyToClipboardApi = () => {
157
- const mappedMimeToData = Object.create(null);
158
- const mimeMapping = {
159
- // image/svg+xml is unsupported in Chrome.
160
- 'image/svg+xml': 'text/html',
161
- };
162
- for (const key in mimeToData) {
163
- const data = mimeToData[key];
164
- const mappedKey = mimeMapping[key] || key;
165
- if (typeof data === 'string') {
166
- mappedMimeToData[mappedKey] = new Blob([new TextEncoder().encode(data)], { type: mappedKey });
196
+ const mapInternalDataToBrowserData = (originalMimeToData) => {
197
+ const mappedMimeToData = Object.create(null);
198
+ for (const [key, data] of originalMimeToData.entries()) {
199
+ if (typeof data === 'string') {
200
+ const loadedData = new Blob([new TextEncoder().encode(data)], { type: key });
201
+ mappedMimeToData[key] = loadedData;
202
+ }
203
+ else {
204
+ mappedMimeToData[key] = data;
205
+ }
206
+ // Different platforms have varying support for different clipboard MIME types:
207
+ // - As of September 2024, image/svg+xml is unsupported on iOS
208
+ // - text/html is unsupported on Chrome/Android (and perhaps Chrome on other platforms).
209
+ // - See https://issues.chromium.org/issues/40851502
210
+ if (key === 'image/svg+xml') {
211
+ mappedMimeToData['text/html'] ??= mappedMimeToData[key];
212
+ }
167
213
  }
168
- else {
169
- mappedMimeToData[mappedKey] = data;
214
+ return mappedMimeToData;
215
+ };
216
+ const removeUnsupportedMime = (originalMimeToData) => {
217
+ const filteredMimeToData = Object.create(null);
218
+ for (const [key, data] of Object.entries(originalMimeToData)) {
219
+ // Browser support for ClipboardItem.supports is limited as of mid 2024. However, some browsers
220
+ // that do support `.supports` throw an exception when attempting to copy an unsupported MIME type
221
+ // (e.g. Firefox).
222
+ const unsupported = 'supports' in ClipboardItem && typeof ClipboardItem.supports === 'function' && !ClipboardItem.supports(key);
223
+ if (!unsupported) {
224
+ filteredMimeToData[key] = data;
225
+ }
170
226
  }
171
- }
172
- return navigator.clipboard.write([new ClipboardItem(mappedMimeToData)]);
227
+ return filteredMimeToData;
228
+ };
229
+ const browserMimeToData = removeUnsupportedMime(mapInternalDataToBrowserData(mimeToData));
230
+ return navigator.clipboard.write([new ClipboardItem(browserMimeToData)]);
173
231
  };
174
232
  const supportsClipboardApi = (typeof ClipboardItem !== 'undefined'
175
233
  && typeof navigator?.clipboard?.write !== 'undefined');
@@ -178,7 +236,7 @@ class ClipboardHandler {
178
236
  const fallBackToCopyEvent = (reason) => {
179
237
  console.warn('Unable to copy to the clipboard API. Future calls to .copy will use ClipboardEvents if possible.', reason);
180
238
  __classPrivateFieldSet(this, _ClipboardHandler_preferClipboardEvents, true, "f");
181
- copyToEvent();
239
+ copyToEvent(reason);
182
240
  };
183
241
  try {
184
242
  clipboardApiPromise = copyToClipboardApi();
@@ -4,5 +4,5 @@
4
4
  * @internal
5
5
  */
6
6
  export default {
7
- number: '1.20.3',
7
+ number: '1.21.2',
8
8
  };