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,23 +0,0 @@
1
- import { Point2, Vec2 } from '@js-draw/math';
2
- import Viewport from '../../Viewport';
3
- type ScrollByCallback = (delta: Vec2) => void;
4
- /**
5
- * Automatically scrolls the viewport such that the user's pointer is visible.
6
- */
7
- export default class ToPointerAutoscroller {
8
- private viewport;
9
- private scrollByCanvasDelta;
10
- private started;
11
- private updateLoopId;
12
- private updateLoopRunning;
13
- private targetPoint;
14
- private scrollRate;
15
- constructor(viewport: Viewport, scrollByCanvasDelta: ScrollByCallback);
16
- private getScrollForPoint;
17
- start(): void;
18
- onPointerMove(pointerScreenPosition: Point2): void;
19
- stop(): void;
20
- private startUpdateLoop;
21
- private stopUpdateLoop;
22
- }
23
- export {};
@@ -1,77 +0,0 @@
1
- import { Rect2, Vec2 } from '@js-draw/math';
2
- import untilNextAnimationFrame from '../../util/untilNextAnimationFrame.mjs';
3
- /**
4
- * Automatically scrolls the viewport such that the user's pointer is visible.
5
- */
6
- export default class ToPointerAutoscroller {
7
- constructor(viewport, scrollByCanvasDelta) {
8
- this.viewport = viewport;
9
- this.scrollByCanvasDelta = scrollByCanvasDelta;
10
- this.started = false;
11
- this.updateLoopId = 0;
12
- this.updateLoopRunning = false;
13
- this.targetPoint = null;
14
- this.scrollRate = 1000; // px/s
15
- }
16
- getScrollForPoint(screenPoint) {
17
- const screenSize = this.viewport.getScreenRectSize();
18
- const screenRect = new Rect2(0, 0, screenSize.x, screenSize.y);
19
- // Starts autoscrolling when the cursor is **outside of** this region
20
- const marginSize = 44;
21
- const autoscrollBoundary = screenRect.grownBy(-marginSize);
22
- if (autoscrollBoundary.containsPoint(screenPoint)) {
23
- return Vec2.zero;
24
- }
25
- const closestEdgePoint = autoscrollBoundary.getClosestPointOnBoundaryTo(screenPoint);
26
- const distToEdge = closestEdgePoint.distanceTo(screenPoint);
27
- const toEdge = closestEdgePoint.minus(screenPoint);
28
- // Go faster for points further away from the boundary.
29
- const maximumScaleFactor = 1.25;
30
- const scaleFactor = Math.min(distToEdge / marginSize, maximumScaleFactor);
31
- return toEdge.normalizedOrZero().times(scaleFactor);
32
- }
33
- start() {
34
- this.started = true;
35
- }
36
- onPointerMove(pointerScreenPosition) {
37
- if (!this.started) {
38
- return;
39
- }
40
- if (this.getScrollForPoint(pointerScreenPosition) === Vec2.zero) {
41
- this.stopUpdateLoop();
42
- }
43
- else {
44
- this.targetPoint = pointerScreenPosition;
45
- this.startUpdateLoop();
46
- }
47
- }
48
- stop() {
49
- this.targetPoint = null;
50
- this.started = false;
51
- this.stopUpdateLoop();
52
- }
53
- startUpdateLoop() {
54
- if (this.updateLoopRunning) {
55
- return;
56
- }
57
- (async () => {
58
- this.updateLoopId++;
59
- const currentUpdateLoopId = this.updateLoopId;
60
- let lastUpdateTime = performance.now();
61
- while (this.updateLoopId === currentUpdateLoopId && this.targetPoint) {
62
- this.updateLoopRunning = true;
63
- const currentTime = performance.now();
64
- const deltaTimeMs = currentTime - lastUpdateTime;
65
- const scrollDirection = this.getScrollForPoint(this.targetPoint);
66
- const screenScrollAmount = scrollDirection.times(this.scrollRate * deltaTimeMs / 1000);
67
- this.scrollByCanvasDelta(this.viewport.screenToCanvasTransform.transformVec3(screenScrollAmount));
68
- lastUpdateTime = currentTime;
69
- await untilNextAnimationFrame();
70
- }
71
- this.updateLoopRunning = false;
72
- })();
73
- }
74
- stopUpdateLoop() {
75
- this.updateLoopId++;
76
- }
77
- }
@@ -1,42 +0,0 @@
1
- import Editor from '../../Editor';
2
- import { Vec3 } from '@js-draw/math';
3
- import Selection from './Selection';
4
- import { ResizeMode } from './types';
5
- export declare class DragTransformer {
6
- private readonly editor;
7
- private selection;
8
- private dragStartPoint;
9
- constructor(editor: Editor, selection: Selection);
10
- onDragStart(startPoint: Vec3): void;
11
- onDragUpdate(canvasPos: Vec3): void;
12
- onDragEnd(): void | Promise<void>;
13
- }
14
- export declare class ResizeTransformer {
15
- private readonly editor;
16
- private selection;
17
- private mode;
18
- private dragStartPoint;
19
- private transformOrigin;
20
- private scaleRate;
21
- constructor(editor: Editor, selection: Selection);
22
- onDragStart(startPoint: Vec3, mode: ResizeMode): void;
23
- private computeOriginAndScaleRate;
24
- onDragUpdate(canvasPos: Vec3): void;
25
- onDragEnd(): void | Promise<void>;
26
- }
27
- export declare class RotateTransformer {
28
- private readonly editor;
29
- private selection;
30
- private startAngle;
31
- private targetRotation;
32
- private maximumDistFromStart;
33
- private startPoint;
34
- private startTime;
35
- constructor(editor: Editor, selection: Selection);
36
- private getAngle;
37
- private roundAngle;
38
- onDragStart(startPoint: Vec3): void;
39
- private setRotationTo;
40
- onDragUpdate(canvasPos: Vec3): void;
41
- onDragEnd(): void | Promise<void>;
42
- }
@@ -1,146 +0,0 @@
1
- import { Mat33, Vec2 } from '@js-draw/math';
2
- import Viewport from '../../Viewport.mjs';
3
- import { ResizeMode } from './types.mjs';
4
- export class DragTransformer {
5
- constructor(editor, selection) {
6
- this.editor = editor;
7
- this.selection = selection;
8
- }
9
- onDragStart(startPoint) {
10
- this.selection.setTransform(Mat33.identity);
11
- this.dragStartPoint = startPoint;
12
- }
13
- onDragUpdate(canvasPos) {
14
- const delta = this.editor.viewport.roundPoint(canvasPos.minus(this.dragStartPoint));
15
- this.selection.setTransform(Mat33.translation(delta));
16
- }
17
- onDragEnd() {
18
- return this.selection.finalizeTransform();
19
- }
20
- }
21
- export class ResizeTransformer {
22
- constructor(editor, selection) {
23
- this.editor = editor;
24
- this.selection = selection;
25
- this.mode = ResizeMode.Both;
26
- }
27
- onDragStart(startPoint, mode) {
28
- this.selection.setTransform(Mat33.identity);
29
- this.mode = mode;
30
- this.dragStartPoint = startPoint;
31
- this.computeOriginAndScaleRate();
32
- }
33
- computeOriginAndScaleRate() {
34
- // Store the index of the furthest corner from startPoint. We'll use that
35
- // to determine where the transform considers (0, 0) (where we scale from).
36
- const selectionRect = this.selection.preTransformRegion;
37
- const selectionBoxCorners = selectionRect.corners;
38
- let largestDistSquared = 0;
39
- for (let i = 0; i < selectionBoxCorners.length; i++) {
40
- const currentCorner = selectionBoxCorners[i];
41
- const distSquaredToCurrent = this.dragStartPoint.minus(currentCorner).magnitudeSquared();
42
- if (distSquaredToCurrent > largestDistSquared) {
43
- largestDistSquared = distSquaredToCurrent;
44
- this.transformOrigin = currentCorner;
45
- }
46
- }
47
- // Determine whether moving the mouse to the right increases or decreases the width.
48
- let widthScaleRate = 1;
49
- let heightScaleRate = 1;
50
- if (this.transformOrigin.x > selectionRect.center.x) {
51
- widthScaleRate = -1;
52
- }
53
- if (this.transformOrigin.y > selectionRect.center.y) {
54
- heightScaleRate = -1;
55
- }
56
- this.scaleRate = Vec2.of(widthScaleRate, heightScaleRate);
57
- }
58
- onDragUpdate(canvasPos) {
59
- const canvasDelta = canvasPos.minus(this.dragStartPoint);
60
- const origWidth = this.selection.preTransformRegion.width;
61
- const origHeight = this.selection.preTransformRegion.height;
62
- let scale = Vec2.of(1, 1);
63
- if (this.mode === ResizeMode.HorizontalOnly) {
64
- const newWidth = origWidth + canvasDelta.x * this.scaleRate.x;
65
- scale = Vec2.of(newWidth / origWidth, scale.y);
66
- }
67
- if (this.mode === ResizeMode.VerticalOnly) {
68
- const newHeight = origHeight + canvasDelta.y * this.scaleRate.y;
69
- scale = Vec2.of(scale.x, newHeight / origHeight);
70
- }
71
- if (this.mode === ResizeMode.Both) {
72
- const delta = Math.abs(canvasDelta.x) > Math.abs(canvasDelta.y) ? canvasDelta.x : canvasDelta.y;
73
- const newWidth = origWidth + delta;
74
- scale = Vec2.of(newWidth / origWidth, newWidth / origWidth);
75
- }
76
- // Round: If this isn't done, scaling can create numbers with long decimal representations.
77
- // long decimal representations => large file sizes.
78
- scale = scale.map(component => Viewport.roundScaleRatio(component, 2));
79
- if (scale.x !== 0 && scale.y !== 0) {
80
- const origin = this.editor.viewport.roundPoint(this.transformOrigin);
81
- this.selection.setTransform(Mat33.scaling2D(scale, origin));
82
- }
83
- }
84
- onDragEnd() {
85
- return this.selection.finalizeTransform();
86
- }
87
- }
88
- export class RotateTransformer {
89
- constructor(editor, selection) {
90
- this.editor = editor;
91
- this.selection = selection;
92
- this.startAngle = 0;
93
- this.targetRotation = 0;
94
- this.maximumDistFromStart = 0;
95
- }
96
- getAngle(canvasPoint) {
97
- const selectionCenter = this.selection.preTransformRegion.center;
98
- const offset = canvasPoint.minus(selectionCenter);
99
- return offset.angle();
100
- }
101
- roundAngle(angle) {
102
- // Round angles to the nearest 16th of a turn
103
- const roundingFactor = 16 / 2 / Math.PI;
104
- return Math.round(angle * roundingFactor) / roundingFactor;
105
- }
106
- onDragStart(startPoint) {
107
- this.startPoint = startPoint;
108
- this.selection.setTransform(Mat33.identity);
109
- this.startAngle = this.getAngle(startPoint);
110
- this.targetRotation = 0;
111
- // Used to determine whether the user clicked or not.
112
- this.maximumDistFromStart = 0;
113
- this.startTime = performance.now();
114
- }
115
- setRotationTo(angle) {
116
- // Transform in canvas space
117
- const canvasSelCenter = this.editor.viewport.roundPoint(this.selection.preTransformRegion.center);
118
- const unrounded = Mat33.zRotation(angle);
119
- const roundedRotationTransform = unrounded.mapEntries(entry => Viewport.roundScaleRatio(entry));
120
- const fullRoundedTransform = Mat33
121
- .translation(canvasSelCenter)
122
- .rightMul(roundedRotationTransform)
123
- .rightMul(Mat33.translation(canvasSelCenter.times(-1)));
124
- this.selection.setTransform(fullRoundedTransform);
125
- }
126
- onDragUpdate(canvasPos) {
127
- this.targetRotation = this.roundAngle(this.getAngle(canvasPos) - this.startAngle);
128
- this.setRotationTo(this.targetRotation);
129
- const distFromStart = canvasPos.minus(this.startPoint).magnitude();
130
- if (distFromStart > this.maximumDistFromStart) {
131
- this.maximumDistFromStart = distFromStart;
132
- }
133
- }
134
- onDragEnd() {
135
- // Anything with motion less than this is considered a click
136
- const clickThresholdDist = 10;
137
- const clickThresholdTime = 0.4; // s
138
- const dragTimeSeconds = (performance.now() - this.startTime) / 1000;
139
- if (dragTimeSeconds < clickThresholdTime
140
- && this.maximumDistFromStart < clickThresholdDist
141
- && this.targetRotation === 0) {
142
- this.setRotationTo(-Math.PI / 2);
143
- }
144
- return this.selection.finalizeTransform();
145
- }
146
- }
@@ -1,28 +0,0 @@
1
- import type { Rect2, Point2 } from '@js-draw/math';
2
- import Pointer from '../../Pointer';
3
- export declare enum ResizeMode {
4
- Both = 0,
5
- HorizontalOnly = 1,
6
- VerticalOnly = 2
7
- }
8
- export declare enum TransformMode {
9
- Snap = 0,
10
- NoSnap = 1
11
- }
12
- /**
13
- * Represents a child of the selection that should move with the selection
14
- * and handle events.
15
- *
16
- * Although selection children should be `HTMLElement`s, the selection may be
17
- * hidden behind an invisible element. As such, these elements should handle
18
- * drag start/update/end events.
19
- */
20
- export interface SelectionBoxChild {
21
- updatePosition(selectionScreenBBox: Rect2): void;
22
- containsPoint(point: Point2): boolean;
23
- addTo(container: HTMLElement): void;
24
- remove(): void;
25
- handleDragStart(pointer: Pointer): boolean;
26
- handleDragUpdate(pointer: Pointer): void;
27
- handleDragEnd(): void;
28
- }
@@ -1,11 +0,0 @@
1
- export var ResizeMode;
2
- (function (ResizeMode) {
3
- ResizeMode[ResizeMode["Both"] = 0] = "Both";
4
- ResizeMode[ResizeMode["HorizontalOnly"] = 1] = "HorizontalOnly";
5
- ResizeMode[ResizeMode["VerticalOnly"] = 2] = "VerticalOnly";
6
- })(ResizeMode || (ResizeMode = {}));
7
- export var TransformMode;
8
- (function (TransformMode) {
9
- TransformMode[TransformMode["Snap"] = 0] = "Snap";
10
- TransformMode[TransformMode["NoSnap"] = 1] = "NoSnap";
11
- })(TransformMode || (TransformMode = {}));
@@ -1,26 +0,0 @@
1
- import Editor from '../Editor';
2
- import { KeyPressEvent, PointerEvt } from '../inputEvents';
3
- import BaseTool from './BaseTool';
4
- /**
5
- * This tool, when enabled, plays a sound representing the color of the portion of the display
6
- * currently under the cursor. This tool adds a button that can be navigated to with the tab key
7
- * that enables/disables the tool.
8
- *
9
- * This allows the user to explore the content of the display without a working screen.
10
- */
11
- export default class SoundUITool extends BaseTool {
12
- private editor;
13
- private soundFeedback;
14
- private toggleButton;
15
- private toggleButtonContainer;
16
- constructor(editor: Editor, description: string);
17
- canReceiveInputInReadOnlyEditor(): boolean;
18
- private updateToggleButtonText;
19
- setEnabled(enabled: boolean): void;
20
- onKeyPress(event: KeyPressEvent): boolean;
21
- private lastPointerPos;
22
- onPointerDown({ current, allPointers }: PointerEvt): boolean;
23
- onPointerMove({ current }: PointerEvt): void;
24
- onPointerUp(_event: PointerEvt): void;
25
- onGestureCancel(): void;
26
- }
@@ -1,165 +0,0 @@
1
- import { LineSegment2, Color4 } from '@js-draw/math';
2
- import BaseTool from './BaseTool.mjs';
3
- class SoundFeedback {
4
- constructor() {
5
- this.closed = false;
6
- // No AudioContext? Exit!
7
- if (!window.AudioContext) {
8
- console.warn('Accessibility sound UI: Unable to open AudioContext.');
9
- this.closed = true;
10
- return;
11
- }
12
- this.ctx = new AudioContext();
13
- // Color oscillator and gain
14
- this.colorOscHue = this.ctx.createOscillator();
15
- this.colorOscValue = this.ctx.createOscillator();
16
- this.colorOscSaturation = this.ctx.createOscillator();
17
- this.colorOscHue.type = 'triangle';
18
- this.colorOscSaturation.type = 'sine';
19
- this.colorOscValue.type = 'sawtooth';
20
- this.valueGain = this.ctx.createGain();
21
- this.colorOscValue.connect(this.valueGain);
22
- this.valueGain.gain.setValueAtTime(0.18, this.ctx.currentTime);
23
- this.colorGain = this.ctx.createGain();
24
- this.colorOscHue.connect(this.colorGain);
25
- this.valueGain.connect(this.colorGain);
26
- this.colorOscSaturation.connect(this.colorGain);
27
- this.colorGain.connect(this.ctx.destination);
28
- // Boundary oscillator and gain
29
- this.boundaryGain = this.ctx.createGain();
30
- this.boundaryOsc = this.ctx.createOscillator();
31
- this.boundaryOsc.type = 'sawtooth';
32
- this.boundaryGain.gain.setValueAtTime(0, this.ctx.currentTime);
33
- this.boundaryOsc.connect(this.boundaryGain);
34
- this.boundaryGain.connect(this.ctx.destination);
35
- // Prepare for the first announcement/feedback.
36
- this.colorOscHue.start();
37
- this.colorOscSaturation.start();
38
- this.colorOscValue.start();
39
- this.boundaryOsc.start();
40
- this.pause();
41
- }
42
- pause() {
43
- if (this.closed)
44
- return;
45
- this.colorGain.gain.setValueAtTime(0, this.ctx.currentTime);
46
- void this.ctx.suspend();
47
- }
48
- play() {
49
- if (this.closed)
50
- return;
51
- void this.ctx.resume();
52
- }
53
- setColor(color) {
54
- const hsv = color.asHSV();
55
- // Choose frequencies that roughly correspond to hue, saturation, and value.
56
- const hueFrequency = (-Math.cos(hsv.x / 2)) * 220 + 440;
57
- const saturationFrequency = hsv.y * 440 + 220;
58
- const valueFrequency = (hsv.z + 0.1) * 440;
59
- // Sigmoid with maximum 0.25 * alpha.
60
- // Louder for greater value.
61
- const gain = 0.25 * Math.min(1, color.a) / (1 + Math.exp(-(hsv.z - 0.5) * 3));
62
- this.colorOscHue.frequency.setValueAtTime(hueFrequency, this.ctx.currentTime);
63
- this.colorOscSaturation.frequency.setValueAtTime(saturationFrequency, this.ctx.currentTime);
64
- this.colorOscValue.frequency.setValueAtTime(valueFrequency, this.ctx.currentTime);
65
- this.valueGain.gain.setValueAtTime((1 - hsv.z) * 0.4, this.ctx.currentTime);
66
- this.colorGain.gain.setValueAtTime(gain, this.ctx.currentTime);
67
- }
68
- announceBoundaryCross(boundaryCrossCount) {
69
- this.boundaryGain.gain.cancelScheduledValues(this.ctx.currentTime);
70
- this.boundaryGain.gain.setValueAtTime(0, this.ctx.currentTime);
71
- this.boundaryGain.gain.linearRampToValueAtTime(0.018, this.ctx.currentTime + 0.1);
72
- this.boundaryOsc.frequency.setValueAtTime(440 + Math.atan(boundaryCrossCount / 2) * 100, this.ctx.currentTime);
73
- this.boundaryGain.gain.linearRampToValueAtTime(0, this.ctx.currentTime + 0.25);
74
- }
75
- close() {
76
- this.ctx.close();
77
- this.closed = true;
78
- }
79
- }
80
- /**
81
- * This tool, when enabled, plays a sound representing the color of the portion of the display
82
- * currently under the cursor. This tool adds a button that can be navigated to with the tab key
83
- * that enables/disables the tool.
84
- *
85
- * This allows the user to explore the content of the display without a working screen.
86
- */
87
- export default class SoundUITool extends BaseTool {
88
- constructor(editor, description) {
89
- super(editor.notifier, description);
90
- this.editor = editor;
91
- this.soundFeedback = null;
92
- // Create a screen-reader-usable method of toggling the tool:
93
- this.toggleButtonContainer = document.createElement('div');
94
- this.toggleButtonContainer.classList.add('js-draw-sound-ui-toggle');
95
- this.toggleButton = document.createElement('button');
96
- this.toggleButton.onclick = () => {
97
- this.setEnabled(!this.isEnabled());
98
- };
99
- this.toggleButtonContainer.appendChild(this.toggleButton);
100
- this.updateToggleButtonText();
101
- editor.createHTMLOverlay(this.toggleButtonContainer);
102
- }
103
- canReceiveInputInReadOnlyEditor() {
104
- return true;
105
- }
106
- updateToggleButtonText() {
107
- const containerEnabledClass = 'sound-ui-tool-enabled';
108
- if (this.isEnabled()) {
109
- this.toggleButton.innerText = this.editor.localization.disableAccessibilityExploreTool;
110
- this.toggleButtonContainer.classList.add(containerEnabledClass);
111
- }
112
- else {
113
- this.toggleButton.innerText = this.editor.localization.enableAccessibilityExploreTool;
114
- this.toggleButtonContainer.classList.remove(containerEnabledClass);
115
- }
116
- }
117
- setEnabled(enabled) {
118
- super.setEnabled(enabled);
119
- if (!this.isEnabled()) {
120
- this.soundFeedback?.close();
121
- this.soundFeedback = null;
122
- }
123
- else {
124
- this.editor.announceForAccessibility(this.editor.localization.soundExplorerUsageAnnouncement);
125
- }
126
- this.updateToggleButtonText();
127
- }
128
- onKeyPress(event) {
129
- if (event.code === 'Escape') {
130
- this.setEnabled(false);
131
- return true;
132
- }
133
- return false;
134
- }
135
- onPointerDown({ current, allPointers }) {
136
- if (!this.soundFeedback) {
137
- this.soundFeedback = new SoundFeedback();
138
- }
139
- // Allow two-finger gestures to move the screen.
140
- if (allPointers.length >= 2) {
141
- return false;
142
- }
143
- // Accept multiple cursors -- some screen readers require multiple (touch) pointers to interact with
144
- // an image instead of using the built-in navigation features.
145
- this.soundFeedback?.play();
146
- this.soundFeedback?.setColor(this.editor.display.getColorAt(current.screenPos) ?? Color4.black);
147
- this.lastPointerPos = current.canvasPos;
148
- return true;
149
- }
150
- onPointerMove({ current }) {
151
- this.soundFeedback?.setColor(this.editor.display.getColorAt(current.screenPos) ?? Color4.black);
152
- const pointerMotionLine = new LineSegment2(this.lastPointerPos, current.canvasPos);
153
- const collisions = this.editor.image.getElementsIntersectingRegion(pointerMotionLine.bbox).filter(component => component.intersects(pointerMotionLine));
154
- this.lastPointerPos = current.canvasPos;
155
- if (collisions.length > 0) {
156
- this.soundFeedback?.announceBoundaryCross(collisions.length);
157
- }
158
- }
159
- onPointerUp(_event) {
160
- this.soundFeedback?.pause();
161
- }
162
- onGestureCancel() {
163
- this.soundFeedback?.pause();
164
- }
165
- }
@@ -1,36 +0,0 @@
1
- import Editor from '../Editor';
2
- import { Color4 } from '@js-draw/math';
3
- import { PointerEvt } from '../inputEvents';
4
- import BaseTool from './BaseTool';
5
- import { ToolLocalization } from './localization';
6
- import TextRenderingStyle from '../rendering/TextRenderingStyle';
7
- import { MutableReactiveValue } from '../util/ReactiveValue';
8
- export default class TextTool extends BaseTool {
9
- private editor;
10
- private localizationTable;
11
- private textStyleValue;
12
- private textStyle;
13
- private textEditOverlay;
14
- private textInputElem;
15
- private textTargetPosition;
16
- private textMeasuringCtx;
17
- private textRotation;
18
- private textScale;
19
- private removeExistingCommand;
20
- constructor(editor: Editor, description: string, localizationTable: ToolLocalization);
21
- private initTextMeasuringCanvas;
22
- private getTextAscent;
23
- private flushInput;
24
- private getTextScaleMatrix;
25
- private updateTextInput;
26
- private startTextInput;
27
- setEnabled(enabled: boolean): void;
28
- onPointerDown({ current, allPointers }: PointerEvt): boolean;
29
- onGestureCancel(): void;
30
- setFontFamily(fontFamily: string): void;
31
- setColor(color: Color4): void;
32
- setFontSize(size: number): void;
33
- getTextStyle(): TextRenderingStyle;
34
- getStyleValue(): MutableReactiveValue<TextRenderingStyle>;
35
- private setTextStyle;
36
- }