js-draw 1.30.0 → 1.30.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/bundle.js +34 -34
  2. package/dist/cjs/Editor.js +1 -1
  3. package/dist/cjs/components/ImageComponent.js +1 -1
  4. package/dist/cjs/dialogs/makeMessageDialog.js +5 -3
  5. package/dist/cjs/rendering/Display.js +5 -3
  6. package/dist/cjs/toolbar/EdgeToolbar.js +3 -2
  7. package/dist/cjs/toolbar/IconProvider.js +1 -1
  8. package/dist/cjs/toolbar/utils/HelpDisplay.js +7 -6
  9. package/dist/cjs/toolbar/widgets/BaseWidget.js +1 -1
  10. package/dist/cjs/toolbar/widgets/DocumentPropertiesWidget.js +5 -3
  11. package/dist/cjs/toolbar/widgets/HandToolWidget.js +4 -3
  12. package/dist/cjs/toolbar/widgets/InsertImageWidget/InsertImageWidget.js +14 -11
  13. package/dist/cjs/toolbar/widgets/PenToolWidget.js +2 -1
  14. package/dist/cjs/toolbar/widgets/components/makeButtonGrid.js +3 -2
  15. package/dist/cjs/toolbar/widgets/components/makeColorInput.js +2 -1
  16. package/dist/cjs/toolbar/widgets/components/makeGridSelector.js +2 -2
  17. package/dist/cjs/toolbar/widgets/components/makeSnappedList.js +1 -1
  18. package/dist/cjs/tools/FindTool.js +3 -2
  19. package/dist/cjs/tools/SelectionTool/SelectionMenuShortcut.js +7 -2
  20. package/dist/cjs/tools/SoundUITool.js +6 -4
  21. package/dist/cjs/tools/util/createMenuOverlay.js +9 -7
  22. package/dist/cjs/util/dom/createButton.d.ts +7 -0
  23. package/dist/cjs/util/dom/createButton.js +20 -0
  24. package/dist/cjs/util/{createElement.d.ts → dom/createElement.d.ts} +3 -0
  25. package/dist/cjs/version.js +1 -1
  26. package/dist/mjs/Editor.mjs +1 -1
  27. package/dist/mjs/components/ImageComponent.mjs +1 -1
  28. package/dist/mjs/dialogs/makeMessageDialog.mjs +5 -3
  29. package/dist/mjs/rendering/Display.mjs +5 -3
  30. package/dist/mjs/toolbar/EdgeToolbar.mjs +3 -2
  31. package/dist/mjs/toolbar/IconProvider.mjs +1 -1
  32. package/dist/mjs/toolbar/utils/HelpDisplay.mjs +7 -6
  33. package/dist/mjs/toolbar/widgets/BaseWidget.mjs +1 -1
  34. package/dist/mjs/toolbar/widgets/DocumentPropertiesWidget.mjs +5 -3
  35. package/dist/mjs/toolbar/widgets/HandToolWidget.mjs +4 -3
  36. package/dist/mjs/toolbar/widgets/InsertImageWidget/InsertImageWidget.mjs +14 -11
  37. package/dist/mjs/toolbar/widgets/PenToolWidget.mjs +2 -1
  38. package/dist/mjs/toolbar/widgets/components/makeButtonGrid.mjs +3 -2
  39. package/dist/mjs/toolbar/widgets/components/makeColorInput.mjs +2 -1
  40. package/dist/mjs/toolbar/widgets/components/makeGridSelector.mjs +2 -2
  41. package/dist/mjs/toolbar/widgets/components/makeSnappedList.mjs +1 -1
  42. package/dist/mjs/tools/FindTool.mjs +3 -2
  43. package/dist/mjs/tools/SelectionTool/SelectionMenuShortcut.mjs +4 -2
  44. package/dist/mjs/tools/SoundUITool.mjs +6 -4
  45. package/dist/mjs/tools/util/createMenuOverlay.mjs +9 -7
  46. package/dist/mjs/util/dom/createButton.d.ts +7 -0
  47. package/dist/mjs/util/dom/createButton.mjs +15 -0
  48. package/dist/mjs/util/{createElement.d.ts → dom/createElement.d.ts} +3 -0
  49. package/dist/mjs/version.mjs +1 -1
  50. package/package.json +4 -4
  51. /package/dist/cjs/util/{addLongPressOrHoverCssClasses.d.ts → dom/addLongPressOrHoverCssClasses.d.ts} +0 -0
  52. /package/dist/cjs/util/{addLongPressOrHoverCssClasses.js → dom/addLongPressOrHoverCssClasses.js} +0 -0
  53. /package/dist/cjs/util/{cloneElementWithStyles.d.ts → dom/cloneElementWithStyles.d.ts} +0 -0
  54. /package/dist/cjs/util/{cloneElementWithStyles.js → dom/cloneElementWithStyles.js} +0 -0
  55. /package/dist/cjs/util/{createElement.js → dom/createElement.js} +0 -0
  56. /package/dist/cjs/util/{listenForKeyboardEventsFrom.d.ts → dom/listenForKeyboardEventsFrom.d.ts} +0 -0
  57. /package/dist/cjs/util/{listenForKeyboardEventsFrom.js → dom/listenForKeyboardEventsFrom.js} +0 -0
  58. /package/dist/cjs/util/{listenForLongPressOrHover.d.ts → dom/listenForLongPressOrHover.d.ts} +0 -0
  59. /package/dist/cjs/util/{listenForLongPressOrHover.js → dom/listenForLongPressOrHover.js} +0 -0
  60. /package/dist/cjs/util/{listenForLongPressOrHover.test.d.ts → dom/listenForLongPressOrHover.test.d.ts} +0 -0
  61. /package/dist/cjs/util/{stopPropagationOfScrollingWheelEvents.d.ts → dom/stopPropagationOfScrollingWheelEvents.d.ts} +0 -0
  62. /package/dist/cjs/util/{stopPropagationOfScrollingWheelEvents.js → dom/stopPropagationOfScrollingWheelEvents.js} +0 -0
  63. /package/dist/cjs/util/{waitForImageLoaded.d.ts → dom/waitForImageLoaded.d.ts} +0 -0
  64. /package/dist/cjs/util/{waitForImageLoaded.js → dom/waitForImageLoaded.js} +0 -0
  65. /package/dist/mjs/util/{addLongPressOrHoverCssClasses.d.ts → dom/addLongPressOrHoverCssClasses.d.ts} +0 -0
  66. /package/dist/mjs/util/{addLongPressOrHoverCssClasses.mjs → dom/addLongPressOrHoverCssClasses.mjs} +0 -0
  67. /package/dist/mjs/util/{cloneElementWithStyles.d.ts → dom/cloneElementWithStyles.d.ts} +0 -0
  68. /package/dist/mjs/util/{cloneElementWithStyles.mjs → dom/cloneElementWithStyles.mjs} +0 -0
  69. /package/dist/mjs/util/{createElement.mjs → dom/createElement.mjs} +0 -0
  70. /package/dist/mjs/util/{listenForKeyboardEventsFrom.d.ts → dom/listenForKeyboardEventsFrom.d.ts} +0 -0
  71. /package/dist/mjs/util/{listenForKeyboardEventsFrom.mjs → dom/listenForKeyboardEventsFrom.mjs} +0 -0
  72. /package/dist/mjs/util/{listenForLongPressOrHover.d.ts → dom/listenForLongPressOrHover.d.ts} +0 -0
  73. /package/dist/mjs/util/{listenForLongPressOrHover.mjs → dom/listenForLongPressOrHover.mjs} +0 -0
  74. /package/dist/mjs/util/{listenForLongPressOrHover.test.d.ts → dom/listenForLongPressOrHover.test.d.ts} +0 -0
  75. /package/dist/mjs/util/{stopPropagationOfScrollingWheelEvents.d.ts → dom/stopPropagationOfScrollingWheelEvents.d.ts} +0 -0
  76. /package/dist/mjs/util/{stopPropagationOfScrollingWheelEvents.mjs → dom/stopPropagationOfScrollingWheelEvents.mjs} +0 -0
  77. /package/dist/mjs/util/{waitForImageLoaded.d.ts → dom/waitForImageLoaded.d.ts} +0 -0
  78. /package/dist/mjs/util/{waitForImageLoaded.mjs → dom/waitForImageLoaded.mjs} +0 -0
@@ -7,6 +7,7 @@ import { EditorEventType } from '../../types.mjs';
7
7
  import { toolbarCSSPrefix } from '../constants.mjs';
8
8
  import makeColorInput from './components/makeColorInput.mjs';
9
9
  import BaseWidget from './BaseWidget.mjs';
10
+ import createButton from '../../util/dom/createButton.mjs';
10
11
  class DocumentPropertiesWidget extends BaseWidget {
11
12
  constructor(editor, localizationTable) {
12
13
  super(editor, 'document-properties-widget', localizationTable);
@@ -216,9 +217,10 @@ class DocumentPropertiesWidget extends BaseWidget {
216
217
  this.editor.dispatch(image.setAutoresizeEnabled(checked));
217
218
  });
218
219
  // The "About..." button
219
- const aboutButton = document.createElement('button');
220
- aboutButton.classList.add('about-button');
221
- aboutButton.innerText = this.localizationTable.about;
220
+ const aboutButton = createButton({
221
+ classList: ['about-button'],
222
+ text: this.localizationTable.about,
223
+ });
222
224
  aboutButton.onclick = () => {
223
225
  this.editor.showAboutDialog();
224
226
  };
@@ -6,11 +6,12 @@ import { toolbarCSSPrefix } from '../constants.mjs';
6
6
  import BaseToolWidget from './BaseToolWidget.mjs';
7
7
  import BaseWidget from './BaseWidget.mjs';
8
8
  import makeSeparator from './components/makeSeparator.mjs';
9
+ import createButton from '../../util/dom/createButton.mjs';
9
10
  const makeZoomControl = (localizationTable, editor, helpDisplay) => {
10
11
  const zoomLevelRow = document.createElement('div');
11
- const increaseButton = document.createElement('button');
12
- const decreaseButton = document.createElement('button');
13
- const resetViewButton = document.createElement('button');
12
+ const increaseButton = createButton();
13
+ const decreaseButton = createButton();
14
+ const resetViewButton = createButton();
14
15
  const zoomLevelDisplay = document.createElement('span');
15
16
  increaseButton.innerText = '+';
16
17
  decreaseButton.innerText = '-';
@@ -13,6 +13,7 @@ import bytesToSizeString from '../../../util/bytesToSizeString.mjs';
13
13
  import { ImageWrapper } from './ImageWrapper.mjs';
14
14
  import makeSnappedList from '../components/makeSnappedList.mjs';
15
15
  import fileToImages from './fileToImages.mjs';
16
+ import createButton from '../../../util/dom/createButton.mjs';
16
17
  /**
17
18
  * Provides a widget that allows inserting or modifying raster images.
18
19
  *
@@ -78,7 +79,7 @@ class InsertImageWidget extends BaseWidget {
78
79
  const actionButtonRow = document.createElement('div');
79
80
  actionButtonRow.classList.add('action-button-row');
80
81
  this.statusView.classList.add('insert-image-image-status-view');
81
- this.submitButton = document.createElement('button');
82
+ this.submitButton = createButton();
82
83
  this.selectedFiles = selectedFiles;
83
84
  this.imageAltTextInput = document.createElement('input');
84
85
  // Label the alt text input
@@ -165,16 +166,18 @@ class InsertImageWidget extends BaseWidget {
165
166
  const sizeText = document.createElement('span');
166
167
  sizeText.innerText = this.localizationTable.imageSize(Math.round(size), units);
167
168
  // Add a button to allow decreasing the size of large images.
168
- const decreaseSizeButton = document.createElement('button');
169
- decreaseSizeButton.innerText = this.localizationTable.decreaseImageSize;
170
- decreaseSizeButton.onclick = () => {
171
- currentImage?.decreaseSize();
172
- };
173
- const resetSizeButton = document.createElement('button');
174
- resetSizeButton.innerText = this.localizationTable.resetImage;
175
- resetSizeButton.onclick = () => {
176
- currentImage?.reset();
177
- };
169
+ const decreaseSizeButton = createButton({
170
+ text: this.localizationTable.decreaseImageSize,
171
+ onClick: () => {
172
+ currentImage?.decreaseSize();
173
+ },
174
+ });
175
+ const resetSizeButton = createButton({
176
+ text: this.localizationTable.resetImage,
177
+ onClick: () => {
178
+ currentImage?.reset();
179
+ },
180
+ });
178
181
  this.statusView.replaceChildren(sizeText);
179
182
  if (currentImage?.isLarge()) {
180
183
  this.statusView.appendChild(decreaseSizeButton);
@@ -13,6 +13,7 @@ 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
+ import createElement from '../../util/dom/createElement.mjs';
16
17
  /**
17
18
  * This toolbar widget allows a user to control a single {@link Pen} tool.
18
19
  *
@@ -179,7 +180,7 @@ class PenToolWidget extends BaseToolWidget {
179
180
  const container = document.createElement('div');
180
181
  container.classList.add('action-button-row', `${toolbarCSSPrefix}-pen-tool-toggle-buttons`);
181
182
  const addToggleButton = (labelText, icon) => {
182
- const button = document.createElement('button');
183
+ const button = createElement('button', { type: 'button' });
183
184
  button.classList.add(`${toolbarCSSPrefix}-toggle-button`);
184
185
  const iconElement = icon.cloneNode(true);
185
186
  iconElement.classList.add('icon');
@@ -1,4 +1,5 @@
1
- import addLongPressOrHoverCssClasses from '../../../util/addLongPressOrHoverCssClasses.mjs';
1
+ import addLongPressOrHoverCssClasses from '../../../util/dom/addLongPressOrHoverCssClasses.mjs';
2
+ import createButton from '../../../util/dom/createButton.mjs';
2
3
  /**
3
4
  * Creates HTML `button` elements from `buttonSpecs` and displays them in a
4
5
  * grid with `columnCount` columns.
@@ -8,7 +9,7 @@ const makeButtonGrid = (buttonSpecs, columnCount) => {
8
9
  container.classList.add('toolbar-button-grid');
9
10
  container.style.setProperty('--column-count', `${columnCount}`);
10
11
  const makeButton = (buttonSpec) => {
11
- const buttonElement = document.createElement('button');
12
+ const buttonElement = createButton();
12
13
  buttonElement.classList.add('button');
13
14
  const iconElement = buttonSpec.icon();
14
15
  iconElement.classList.add('icon');
@@ -1,6 +1,7 @@
1
1
  import { Color4 } from '@js-draw/math';
2
2
  import PipetteTool from '../../../tools/PipetteTool.mjs';
3
3
  import { EditorEventType } from '../../../types.mjs';
4
+ import createButton from '../../../util/dom/createButton.mjs';
4
5
  // Returns [ color input, input container, callback to change the color value ].
5
6
  export const makeColorInput = (editor, onColorChange) => {
6
7
  const container = document.createElement('span');
@@ -93,7 +94,7 @@ export const makeColorInput = (editor, onColorChange) => {
93
94
  };
94
95
  };
95
96
  const addPipetteTool = (editor, container, onColorChange) => {
96
- const pipetteButton = document.createElement('button');
97
+ const pipetteButton = createButton();
97
98
  pipetteButton.classList.add('pipetteButton');
98
99
  pipetteButton.title = editor.localization.pickColorFromScreen;
99
100
  pipetteButton.setAttribute('alt', pipetteButton.title);
@@ -1,6 +1,6 @@
1
1
  import { MutableReactiveValue } from '../../../util/ReactiveValue.mjs';
2
- import stopPropagationOfScrollingWheelEvents from '../../../util/stopPropagationOfScrollingWheelEvents.mjs';
3
- import addLongPressOrHoverCssClasses from '../../../util/addLongPressOrHoverCssClasses.mjs';
2
+ import stopPropagationOfScrollingWheelEvents from '../../../util/dom/stopPropagationOfScrollingWheelEvents.mjs';
3
+ import addLongPressOrHoverCssClasses from '../../../util/dom/addLongPressOrHoverCssClasses.mjs';
4
4
  import { toolbarCSSPrefix } from '../../constants.mjs';
5
5
  let idCounter = 0;
6
6
  /**
@@ -1,4 +1,4 @@
1
- import stopPropagationOfScrollingWheelEvents from '../../../util/stopPropagationOfScrollingWheelEvents.mjs';
1
+ import stopPropagationOfScrollingWheelEvents from '../../../util/dom/stopPropagationOfScrollingWheelEvents.mjs';
2
2
  import { MutableReactiveValue, ReactiveValue } from '../../../util/ReactiveValue.mjs';
3
3
  /**
4
4
  * Creates a list that snaps to each item and reports the selected item.
@@ -5,6 +5,7 @@ import TextComponent from '../components/TextComponent.mjs';
5
5
  import ImageComponent from '../components/ImageComponent.mjs';
6
6
  import BaseTool from './BaseTool.mjs';
7
7
  import { toggleFindVisibleShortcutId } from './keybindings.mjs';
8
+ import createButton from '../util/dom/createButton.mjs';
8
9
  const cssPrefix = 'find-tool';
9
10
  export default class FindTool extends BaseTool {
10
11
  constructor(editor) {
@@ -62,8 +63,8 @@ export default class FindTool extends BaseTool {
62
63
  fillOverlay() {
63
64
  const label = document.createElement('label');
64
65
  this.searchInput = document.createElement('input');
65
- const nextBtn = document.createElement('button');
66
- const closeBtn = document.createElement('button');
66
+ const nextBtn = createButton();
67
+ const closeBtn = createButton();
67
68
  // Math.random() ensures that the ID is unique (to allow us to refer to it
68
69
  // with an htmlFor).
69
70
  this.searchInput.setAttribute('id', `${cssPrefix}-searchInput-${Math.random()}`);
@@ -1,5 +1,6 @@
1
1
  import { Rect2, Vec2 } from '@js-draw/math';
2
2
  import { cssPrefix } from './SelectionTool.mjs';
3
+ import createButton from '../../util/dom/createButton.mjs';
3
4
  const verticalOffset = 40;
4
5
  export default class SelectionMenuShortcut {
5
6
  constructor(parent, viewport, icon, showContextMenu, localization) {
@@ -20,8 +21,9 @@ export default class SelectionMenuShortcut {
20
21
  this.updatePosition();
21
22
  }
22
23
  initUI() {
23
- const button = document.createElement('button');
24
- this.icon.classList.add('icon');
24
+ const button = createButton({
25
+ classList: ['icon'],
26
+ });
25
27
  button.replaceChildren(this.icon);
26
28
  button.ariaLabel = this.localization.selectionMenu__show;
27
29
  button.title = button.ariaLabel;
@@ -1,5 +1,6 @@
1
1
  import { LineSegment2, Color4 } from '@js-draw/math';
2
2
  import BaseTool from './BaseTool.mjs';
3
+ import createButton from '../util/dom/createButton.mjs';
3
4
  class SoundFeedback {
4
5
  constructor() {
5
6
  this.closed = false;
@@ -92,10 +93,11 @@ export default class SoundUITool extends BaseTool {
92
93
  // Create a screen-reader-usable method of toggling the tool:
93
94
  this.toggleButtonContainer = document.createElement('div');
94
95
  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
- };
96
+ this.toggleButton = createButton({
97
+ onClick: () => {
98
+ this.setEnabled(!this.isEnabled());
99
+ },
100
+ });
99
101
  this.toggleButtonContainer.appendChild(this.toggleButton);
100
102
  this.updateToggleButtonText();
101
103
  editor.createHTMLOverlay(this.toggleButtonContainer);
@@ -1,5 +1,6 @@
1
1
  import waitForTimeout from '../../util/waitForTimeout.mjs';
2
2
  import { EditorEventType } from '../../types.mjs';
3
+ import createButton from '../../util/dom/createButton.mjs';
3
4
  let idCounter = 0;
4
5
  const createMenuOverlay = async (editor, canvasAnchor, options) => {
5
6
  const overlay = document.createElement('div');
@@ -96,16 +97,17 @@ const createMenuOverlay = async (editor, canvasAnchor, options) => {
96
97
  }
97
98
  });
98
99
  for (const option of options) {
99
- const optionElement = document.createElement('button');
100
+ const optionElement = createButton({
101
+ classList: ['option', 'editor-popup-menu-option'],
102
+ onClick: (event) => {
103
+ if (event.defaultPrevented)
104
+ return;
105
+ onOptionSelected(option.key);
106
+ },
107
+ });
100
108
  optionElement.id = `menu-overlay-option-${idCounter++}`;
101
109
  optionElement.role = 'menuitem';
102
- optionElement.classList.add('option', 'editor-popup-menu-option');
103
110
  optionElement.replaceChildren(option.icon(), document.createTextNode(option.text));
104
- optionElement.onclick = (event) => {
105
- if (event.defaultPrevented)
106
- return;
107
- onOptionSelected(option.key);
108
- };
109
111
  contentElement.appendChild(optionElement);
110
112
  if (optionElements.length === 0) {
111
113
  optionElement.autofocus = true;
@@ -0,0 +1,7 @@
1
+ interface Options {
2
+ onClick?: (event: MouseEvent) => void;
3
+ text?: string;
4
+ classList?: string[];
5
+ }
6
+ declare const createButton: ({ onClick, text, classList }?: Options) => HTMLButtonElement;
7
+ export default createButton;
@@ -0,0 +1,15 @@
1
+ import createElement from './createElement.mjs';
2
+ const createButton = ({ onClick, text, classList = [] } = {}) => {
3
+ const button = createElement('button', { type: 'button' });
4
+ if (onClick) {
5
+ button.onclick = onClick;
6
+ }
7
+ if (text) {
8
+ button.textContent = text;
9
+ }
10
+ for (const className of classList) {
11
+ button.classList.add(className);
12
+ }
13
+ return button;
14
+ };
15
+ export default createButton;
@@ -11,6 +11,9 @@ interface ElementToPropertiesMap {
11
11
  'stroke-width': string;
12
12
  transform: string;
13
13
  };
14
+ button: {
15
+ type: 'button';
16
+ };
14
17
  rect: {
15
18
  stroke: string;
16
19
  fill: string;
@@ -5,5 +5,5 @@
5
5
  */
6
6
  export default {
7
7
  // Note: Auto-updated by prebuild.js:
8
- number: '1.30.0',
8
+ number: '1.30.1',
9
9
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "js-draw",
3
- "version": "1.30.0",
3
+ "version": "1.30.1",
4
4
  "description": "Draw pictures using a pen, touchscreen, or mouse! JS-draw is a drawing library for JavaScript and TypeScript. ",
5
5
  "types": "./dist/mjs/lib.d.ts",
6
6
  "main": "./dist/cjs/lib.js",
@@ -64,11 +64,11 @@
64
64
  "postpack": "ts-node tools/copyREADME.ts revert"
65
65
  },
66
66
  "dependencies": {
67
- "@js-draw/math": "^1.30.0",
67
+ "@js-draw/math": "^1.30.1",
68
68
  "@melloware/coloris": "0.22.0"
69
69
  },
70
70
  "devDependencies": {
71
- "@js-draw/build-tool": "^1.30.0",
71
+ "@js-draw/build-tool": "^1.30.1",
72
72
  "@types/jest": "29.5.5",
73
73
  "@types/jsdom": "21.1.3"
74
74
  },
@@ -86,5 +86,5 @@
86
86
  "freehand",
87
87
  "svg"
88
88
  ],
89
- "gitHead": "66eec6d2c16262c5397ab158967afb55428f7008"
89
+ "gitHead": "a416de226b49ee0c9244ec7f7b9522515a49bcb7"
90
90
  }