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
@@ -1,15 +0,0 @@
1
- import InputMapper from './InputMapper.mjs';
2
- /**
3
- * An `InputMapper` that applies a function to all events it receives.
4
- *
5
- * Useful for automated testing.
6
- */
7
- export default class FunctionMapper extends InputMapper {
8
- constructor(fn) {
9
- super();
10
- this.fn = fn;
11
- }
12
- onEvent(event) {
13
- return this.emit(this.fn(event));
14
- }
15
- }
@@ -1,23 +0,0 @@
1
- import { InputEvt } from '../../inputEvents';
2
- type OnEventCallback = (event: InputEvt) => boolean;
3
- export interface InputEventListener {
4
- onEvent: OnEventCallback;
5
- }
6
- /**
7
- * Accepts input events and emits input events.
8
- */
9
- export default abstract class InputMapper implements InputEventListener {
10
- #private;
11
- constructor();
12
- setEmitListener(listener: InputEventListener | OnEventCallback | null): void;
13
- protected emit(event: InputEvt): boolean;
14
- /**
15
- * @returns true if the given `event` should be considered "handled" by the app and thus not
16
- * forwarded to other targets. For example, returning "true" for a touchpad pinch event prevents
17
- * the pinch event from zooming the webpage.
18
- *
19
- * Generally, this should return the result of calling `this.emit` with some event.
20
- */
21
- abstract onEvent(event: InputEvt): boolean;
22
- }
23
- export {};
@@ -1,36 +0,0 @@
1
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
- if (kind === "m") throw new TypeError("Private method is not writable");
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
- };
7
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
- };
12
- var _InputMapper_listener;
13
- /**
14
- * Accepts input events and emits input events.
15
- */
16
- class InputMapper {
17
- constructor() {
18
- _InputMapper_listener.set(this, null);
19
- }
20
- // @internal
21
- setEmitListener(listener) {
22
- if (listener && typeof (listener) === 'object') {
23
- __classPrivateFieldSet(this, _InputMapper_listener, (event) => {
24
- return listener.onEvent(event) ?? false;
25
- }, "f");
26
- }
27
- else {
28
- __classPrivateFieldSet(this, _InputMapper_listener, listener, "f");
29
- }
30
- }
31
- emit(event) {
32
- return __classPrivateFieldGet(this, _InputMapper_listener, "f")?.call(this, event) ?? false;
33
- }
34
- }
35
- _InputMapper_listener = new WeakMap();
36
- export default InputMapper;
@@ -1,15 +0,0 @@
1
- import { InputEvt } from '../../inputEvents';
2
- import InputMapper from './InputMapper';
3
- /**
4
- * The composition of multiple `InputMapper`s.
5
- */
6
- export default class InputPipeline extends InputMapper {
7
- #private;
8
- onEvent(event: InputEvt): boolean;
9
- /**
10
- * Adds a new `InputMapper` to the *tail* of this pipeline.
11
- * Note that an instance of an `InputMapper` can only be used in a single
12
- * pipeline.
13
- */
14
- addToTail(mapper: InputMapper): void;
15
- }
@@ -1,49 +0,0 @@
1
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
- };
6
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
7
- if (kind === "m") throw new TypeError("Private method is not writable");
8
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
9
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
10
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
11
- };
12
- var _InputPipeline_head, _InputPipeline_tail;
13
- import InputMapper from './InputMapper.mjs';
14
- /**
15
- * The composition of multiple `InputMapper`s.
16
- */
17
- class InputPipeline extends InputMapper {
18
- constructor() {
19
- super(...arguments);
20
- _InputPipeline_head.set(this, null);
21
- _InputPipeline_tail.set(this, null);
22
- }
23
- onEvent(event) {
24
- if (__classPrivateFieldGet(this, _InputPipeline_head, "f") === null) {
25
- return this.emit(event);
26
- }
27
- else {
28
- return __classPrivateFieldGet(this, _InputPipeline_head, "f").onEvent(event);
29
- }
30
- }
31
- /**
32
- * Adds a new `InputMapper` to the *tail* of this pipeline.
33
- * Note that an instance of an `InputMapper` can only be used in a single
34
- * pipeline.
35
- */
36
- addToTail(mapper) {
37
- if (!__classPrivateFieldGet(this, _InputPipeline_tail, "f")) {
38
- __classPrivateFieldSet(this, _InputPipeline_head, mapper, "f");
39
- __classPrivateFieldSet(this, _InputPipeline_tail, __classPrivateFieldGet(this, _InputPipeline_head, "f"), "f");
40
- }
41
- else {
42
- __classPrivateFieldGet(this, _InputPipeline_tail, "f").setEmitListener(mapper);
43
- __classPrivateFieldSet(this, _InputPipeline_tail, mapper, "f");
44
- }
45
- __classPrivateFieldGet(this, _InputPipeline_tail, "f").setEmitListener(event => this.emit(event));
46
- }
47
- }
48
- _InputPipeline_head = new WeakMap(), _InputPipeline_tail = new WeakMap();
49
- export default InputPipeline;
@@ -1 +0,0 @@
1
- export {};
@@ -1,29 +0,0 @@
1
- import { InputEvt } from '../../inputEvents';
2
- import InputMapper from './InputMapper';
3
- import Viewport from '../../Viewport';
4
- import Editor from '../../Editor';
5
- declare enum StabilizerType {
6
- IntertialStabilizer = 0
7
- }
8
- interface InputStabilizerOptions {
9
- kind: StabilizerType.IntertialStabilizer;
10
- mass: number;
11
- springConstant: number;
12
- frictionCoefficient: number;
13
- maxPointDist: number;
14
- minSimilarityToFinalize: number;
15
- inertiaFraction: number;
16
- velocityDecayFactor: number;
17
- }
18
- export default class InputStabilizer extends InputMapper {
19
- private viewport;
20
- private readonly options;
21
- private stabilizer;
22
- private lastPointerEvent;
23
- constructor(viewport: Viewport, options?: InputStabilizerOptions);
24
- private mapPointerEvent;
25
- private emitPointerMove;
26
- onEvent(event: InputEvt): boolean;
27
- static fromEditor(editor: Editor): InputStabilizer;
28
- }
29
- export {};
@@ -1,175 +0,0 @@
1
- import { InputEvtType, isPointerEvt } from '../../inputEvents.mjs';
2
- import InputMapper from './InputMapper.mjs';
3
- import { Vec2 } from '@js-draw/math';
4
- import untilNextAnimationFrame from '../../util/untilNextAnimationFrame.mjs';
5
- var StabilizerType;
6
- (function (StabilizerType) {
7
- StabilizerType[StabilizerType["IntertialStabilizer"] = 0] = "IntertialStabilizer";
8
- })(StabilizerType || (StabilizerType = {}));
9
- const defaultOptions = {
10
- kind: StabilizerType.IntertialStabilizer,
11
- mass: 0.4, // kg
12
- springConstant: 100.0, // N/m
13
- frictionCoefficient: 0.28,
14
- maxPointDist: 10, // screen units
15
- inertiaFraction: 0.75,
16
- minSimilarityToFinalize: 0.0,
17
- velocityDecayFactor: 0.1,
18
- };
19
- // Stabilizes input for a single cursor
20
- class StylusInputStabilizer {
21
- constructor(
22
- // The initial starting point of the pointer.
23
- start,
24
- // Emits a pointer motion event, returns true if the event was handled.
25
- updatePointer, options) {
26
- this.updatePointer = updatePointer;
27
- this.options = options;
28
- this.runLoop = true;
29
- this.lastUpdateTime = 0;
30
- this.velocity = Vec2.zero;
31
- this.strokePoint = start;
32
- this.targetPoint = start;
33
- this.targetInterval = 10; // ms
34
- void this.loop();
35
- }
36
- async loop() {
37
- this.lastUpdateTime = performance.now();
38
- while (this.runLoop) {
39
- this.update(false);
40
- await untilNextAnimationFrame();
41
- }
42
- }
43
- setTarget(point) {
44
- this.targetPoint = point;
45
- }
46
- getNextVelocity(deltaTimeMs) {
47
- const toTarget = this.targetPoint.minus(this.strokePoint);
48
- const springForce = toTarget.times(this.options.springConstant);
49
- const gravityAccel = 10;
50
- const normalForceMagnitude = this.options.mass * gravityAccel;
51
- const frictionForce = this.velocity.normalizedOrZero().times(-this.options.frictionCoefficient * normalForceMagnitude);
52
- const acceleration = (springForce.plus(frictionForce)).times(1 / this.options.mass);
53
- const decayFactor = this.options.velocityDecayFactor;
54
- const springVelocity = this.velocity.times(1 - decayFactor).plus(acceleration.times(deltaTimeMs / 1000));
55
- // An alternate velocity that goes directly towards the target.
56
- const toTargetVelocity = toTarget.normalizedOrZero().times(springVelocity.length());
57
- return toTargetVelocity.lerp(springVelocity, this.options.inertiaFraction);
58
- }
59
- update(force) {
60
- const nowTime = performance.now();
61
- const deltaTime = nowTime - this.lastUpdateTime;
62
- const reachedTarget = this.strokePoint.eq(this.targetPoint);
63
- if (deltaTime > this.targetInterval || force) {
64
- if (!reachedTarget) {
65
- let velocity;
66
- let deltaX;
67
- let parts = 1;
68
- do {
69
- velocity = this.getNextVelocity(deltaTime / parts);
70
- deltaX = velocity.times(deltaTime / 1000);
71
- parts++;
72
- } while (deltaX.magnitude() > this.options.maxPointDist && parts < 10);
73
- for (let i = 0; i < parts; i++) {
74
- this.velocity = this.getNextVelocity(deltaTime / parts);
75
- deltaX = this.velocity.times(deltaTime / 1000);
76
- this.strokePoint = this.strokePoint.plus(deltaX);
77
- // Allows the last updatePointer to be returned.
78
- if (i < parts - 1) {
79
- this.updatePointer(this.strokePoint, nowTime);
80
- }
81
- }
82
- }
83
- // Even if we have reached the target, ensure that lastUpdateTime is updated
84
- // (prevent large deltaTime).
85
- this.lastUpdateTime = nowTime;
86
- if (force || !reachedTarget) {
87
- return this.updatePointer(this.strokePoint, nowTime);
88
- }
89
- }
90
- return false;
91
- }
92
- /** Finalizes the current stroke. */
93
- finish() {
94
- this.runLoop = false;
95
- const toTarget = this.targetPoint.minus(this.strokePoint);
96
- if (this.velocity.dot(toTarget) > this.options.minSimilarityToFinalize) {
97
- // Connect the stroke to its end point
98
- this.updatePointer(this.targetPoint, performance.now());
99
- }
100
- }
101
- cancel() {
102
- this.runLoop = false;
103
- }
104
- }
105
- export default class InputStabilizer extends InputMapper {
106
- constructor(viewport, options = defaultOptions) {
107
- super();
108
- this.viewport = viewport;
109
- this.options = options;
110
- this.stabilizer = null;
111
- this.lastPointerEvent = null;
112
- }
113
- mapPointerEvent(event) {
114
- // Don't store the last pointer event for use with pressure/button data --
115
- // this information can be very different for a pointerup event.
116
- if (isPointerEvt(event) && event.kind !== InputEvtType.PointerUpEvt) {
117
- this.lastPointerEvent = event;
118
- }
119
- // Only apply smoothing if there is a single pointer.
120
- if (event.kind === InputEvtType.GestureCancelEvt || event.allPointers.length > 1 || this.stabilizer === null) {
121
- return this.emit(event);
122
- }
123
- this.stabilizer.setTarget(event.current.screenPos);
124
- if (event.kind === InputEvtType.PointerMoveEvt) {
125
- return this.stabilizer.update(true);
126
- }
127
- else if (event.kind === InputEvtType.PointerUpEvt) {
128
- this.stabilizer.finish();
129
- return this.emit(event);
130
- }
131
- else {
132
- return this.emit(event);
133
- }
134
- }
135
- // Assumes that there is exactly one pointer that is currently down.
136
- emitPointerMove(screenPoint, timeStamp) {
137
- if (!this.lastPointerEvent) {
138
- return false;
139
- }
140
- const pointer = this.lastPointerEvent.current
141
- .withScreenPosition(screenPoint, this.viewport)
142
- .withTimestamp(timeStamp);
143
- const event = {
144
- kind: InputEvtType.PointerMoveEvt,
145
- current: pointer,
146
- allPointers: [pointer],
147
- };
148
- const handled = this.emit(event);
149
- return handled;
150
- }
151
- onEvent(event) {
152
- if (isPointerEvt(event) || event.kind === InputEvtType.GestureCancelEvt) {
153
- if (event.kind === InputEvtType.PointerDownEvt) {
154
- if (this.stabilizer === null) {
155
- this.stabilizer = new StylusInputStabilizer(event.current.screenPos, (screenPoint, timeStamp) => this.emitPointerMove(screenPoint, timeStamp), this.options);
156
- }
157
- else if (event.allPointers.length > 1) {
158
- // Do not attempt to stabilize multiple pointers.
159
- this.stabilizer.cancel();
160
- this.stabilizer = null;
161
- }
162
- }
163
- const handled = this.mapPointerEvent(event);
164
- if (event.kind === InputEvtType.PointerUpEvt || event.kind === InputEvtType.GestureCancelEvt) {
165
- this.stabilizer?.cancel();
166
- this.stabilizer = null;
167
- }
168
- return handled;
169
- }
170
- return this.emit(event);
171
- }
172
- static fromEditor(editor) {
173
- return new InputStabilizer(editor.viewport);
174
- }
175
- }
@@ -1,21 +0,0 @@
1
- import { InputEvt } from '../../inputEvents';
2
- import InputMapper from './InputMapper';
3
- import KeyboardShortcutManager from '../../shortcuts/KeyboardShortcutManager';
4
- import Viewport from '../../Viewport';
5
- import Editor from '../../Editor';
6
- /**
7
- * Provides keyboard shortcuts that provide some amount of control over
8
- * drawing (e.g. snap to grid, plane lock).
9
- */
10
- export default class StrokeKeyboardControl extends InputMapper {
11
- private shortcuts;
12
- private viewport;
13
- private snapToGridEnabled;
14
- private angleLockEnabled;
15
- private startPointCanvas;
16
- constructor(shortcuts: KeyboardShortcutManager, viewport: Viewport);
17
- private xyAxesSnap;
18
- private mapPointerEvent;
19
- onEvent(event: InputEvt): boolean;
20
- static fromEditor(editor: Editor): StrokeKeyboardControl;
21
- }
@@ -1,78 +0,0 @@
1
- import { InputEvtType } from '../../inputEvents.mjs';
2
- import InputMapper from './InputMapper.mjs';
3
- import { lineLockKeyboardShortcutId, snapToGridKeyboardShortcutId } from '../keybindings.mjs';
4
- /**
5
- * Provides keyboard shortcuts that provide some amount of control over
6
- * drawing (e.g. snap to grid, plane lock).
7
- */
8
- export default class StrokeKeyboardControl extends InputMapper {
9
- constructor(shortcuts, viewport) {
10
- super();
11
- this.shortcuts = shortcuts;
12
- this.viewport = viewport;
13
- this.snapToGridEnabled = false;
14
- this.angleLockEnabled = false;
15
- // The point at which the last pointerDown event happened (or null if
16
- // no such event has occurred).
17
- this.startPointCanvas = null;
18
- }
19
- // Snap the given pointer to the nearer of the x/y axes.
20
- xyAxesSnap(pointer) {
21
- if (!this.startPointCanvas) {
22
- return pointer;
23
- }
24
- // Convert this.startPointCanvas here because the viewport might change
25
- // while drawing a stroke.
26
- const screenPos = this.viewport.canvasToScreen(this.startPointCanvas);
27
- return pointer.lockedToXYAxesScreen(screenPos, this.viewport);
28
- }
29
- mapPointerEvent(event) {
30
- const mapPointer = (pointer) => {
31
- // Only map if there's exactly one pointer.
32
- if (event.allPointers.length > 1) {
33
- return pointer;
34
- }
35
- if (this.snapToGridEnabled) {
36
- return pointer.snappedToGrid(this.viewport);
37
- }
38
- if (this.angleLockEnabled && this.startPointCanvas) {
39
- return this.xyAxesSnap(pointer);
40
- }
41
- return pointer;
42
- };
43
- return {
44
- kind: event.kind,
45
- current: mapPointer(event.current),
46
- allPointers: event.allPointers.map(mapPointer),
47
- };
48
- }
49
- onEvent(event) {
50
- const shortcuts = this.shortcuts;
51
- if (event.kind === InputEvtType.PointerDownEvt || event.kind === InputEvtType.PointerMoveEvt || event.kind === InputEvtType.PointerUpEvt) {
52
- if (event.kind === InputEvtType.PointerDownEvt) {
53
- this.startPointCanvas = event.current.canvasPos;
54
- }
55
- event = this.mapPointerEvent(event);
56
- }
57
- let handled = this.emit(event);
58
- if ( // Always check keyUpEvents (in case we handled the corresponding keyDown event)
59
- event.kind === InputEvtType.KeyUpEvent
60
- // Only handle key press events if another tool isn't handling it. We don't want
61
- // snap to grid/angle lock to conflict with selection/another tool's shortcuts.
62
- || (!handled && event.kind === InputEvtType.KeyPressEvent)) {
63
- const isKeyPress = event.kind === InputEvtType.KeyPressEvent;
64
- if (shortcuts.matchesShortcut(snapToGridKeyboardShortcutId, event)) {
65
- this.snapToGridEnabled = isKeyPress;
66
- handled = true;
67
- }
68
- if (shortcuts.matchesShortcut(lineLockKeyboardShortcutId, event)) {
69
- this.angleLockEnabled = isKeyPress;
70
- handled = true;
71
- }
72
- }
73
- return handled;
74
- }
75
- static fromEditor(editor) {
76
- return new StrokeKeyboardControl(editor.shortcuts, editor.viewport);
77
- }
78
- }
@@ -1,119 +0,0 @@
1
- import { Editor } from '../Editor';
2
- import { Point2 } from '@js-draw/math';
3
- import Pointer from '../Pointer';
4
- import { KeyPressEvent, PointerEvt, WheelEvt } from '../inputEvents';
5
- import BaseTool from './BaseTool';
6
- interface PinchData {
7
- canvasCenter: Point2;
8
- screenCenter: Point2;
9
- angle: number;
10
- dist: number;
11
- }
12
- export declare enum PanZoomMode {
13
- /** Touch gestures with a single pointer. Ignores non-touch gestures. */
14
- OneFingerTouchGestures = 1,
15
- /** Touch gestures with exactly two pointers. Ignores non-touch gestures. */
16
- TwoFingerTouchGestures = 2,
17
- RightClickDrags = 4,
18
- /** Single-pointer gestures of *any* type (including touch). */
19
- SinglePointerGestures = 8,
20
- /** Keyboard navigation (e.g. LeftArrow to move left). */
21
- Keyboard = 16,
22
- /** If provided, prevents **this** tool from rotating the viewport (other tools may still do so). */
23
- RotationLocked = 32
24
- }
25
- /**
26
- * This tool moves the viewport in response to touchpad, touchscreen, mouse, and keyboard events.
27
- *
28
- * Which events are handled, and which are skipped, are determined by the tool's `mode`. For example,
29
- * a `PanZoom` tool with `mode = PanZoomMode.TwoFingerTouchGestures|PanZoomMode.RightClickDrags` would
30
- * respond to right-click drag events and two-finger touch gestures.
31
- *
32
- * @see {@link setModeEnabled}
33
- */
34
- export default class PanZoom extends BaseTool {
35
- private editor;
36
- private mode;
37
- private transform;
38
- private readonly initialRotationSnapAngle;
39
- private readonly afterRotationStartSnapAngle;
40
- private readonly pinchZoomStartThreshold;
41
- private startTouchDist;
42
- private lastTouchDist;
43
- private lastScreenCenter;
44
- private lastTimestamp;
45
- private lastPointerDownTimestamp;
46
- private initialTouchAngle;
47
- private initialViewportRotation;
48
- private initialViewportScale;
49
- private isScaling;
50
- private isRotating;
51
- private inertialScroller;
52
- private velocity;
53
- constructor(editor: Editor, mode: PanZoomMode, description: string);
54
- canReceiveInputInReadOnlyEditor(): boolean;
55
- computePinchData(p1: Pointer, p2: Pointer): PinchData;
56
- private allPointersAreOfType;
57
- onPointerDown({ allPointers: pointers, current: currentPointer }: PointerEvt): boolean;
58
- private updateVelocity;
59
- private getCenterDelta;
60
- private toSnappedRotationDelta;
61
- /**
62
- * Given a scale update, `scaleFactor`, returns a new scale factor snapped
63
- * to a power of two (if within some tolerance of that scale).
64
- */
65
- private toSnappedScaleFactor;
66
- private handleTwoFingerMove;
67
- private handleOneFingerMove;
68
- onPointerMove({ allPointers }: PointerEvt): void;
69
- onPointerUp(event: PointerEvt): void;
70
- onGestureCancel(): void;
71
- private updateTransform;
72
- onWheel({ delta, screenPos }: WheelEvt): boolean;
73
- onKeyPress(event: KeyPressEvent): boolean;
74
- private isRotationLocked;
75
- /**
76
- * Changes the types of gestures used by this pan/zoom tool.
77
- *
78
- * @see {@link PanZoomMode} {@link setMode}
79
- *
80
- * @example
81
- * ```ts,runnable
82
- * import { Editor, PanZoomTool, PanZoomMode } from 'js-draw';
83
- *
84
- * const editor = new Editor(document.body);
85
- *
86
- * // By default, there are multiple PanZoom tools that handle different events.
87
- * // This gets all PanZoomTools.
88
- * const panZoomToolList = editor.toolController.getMatchingTools(PanZoomTool);
89
- *
90
- * // The first PanZoomTool is the highest priority -- by default,
91
- * // this tool is responsible for handling multi-finger touch gestures.
92
- * //
93
- * // Lower-priority PanZoomTools handle one-finger touch gestures and
94
- * // key-presses.
95
- * const panZoomTool = panZoomToolList[0];
96
- *
97
- * // Lock rotation for multi-finger touch gestures.
98
- * panZoomTool.setModeEnabled(PanZoomMode.RotationLocked, true);
99
- * ```
100
- */
101
- setModeEnabled(mode: PanZoomMode, enabled: boolean): void;
102
- /**
103
- * Sets all modes for this tool using a bitmask.
104
- *
105
- * @see {@link setModeEnabled}
106
- *
107
- * @example
108
- * ```ts
109
- * tool.setMode(PanZoomMode.RotationLocked|PanZoomMode.TwoFingerTouchGestures);
110
- * ```
111
- */
112
- setMode(mode: PanZoomMode): void;
113
- /**
114
- * Returns a bitmask indicating the currently-enabled modes.
115
- * @see {@link setModeEnabled}
116
- */
117
- getMode(): PanZoomMode;
118
- }
119
- export {};