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
@@ -65,7 +65,7 @@ const makeAboutDialog_1 = __importDefault(require("./dialogs/makeAboutDialog"));
65
65
  const version_1 = __importDefault(require("./version"));
66
66
  const editorImageToSVG_1 = require("./image/export/editorImageToSVG");
67
67
  const ReactiveValue_1 = __importStar(require("./util/ReactiveValue"));
68
- const listenForKeyboardEventsFrom_1 = __importDefault(require("./util/listenForKeyboardEventsFrom"));
68
+ const listenForKeyboardEventsFrom_1 = __importDefault(require("./util/dom/listenForKeyboardEventsFrom"));
69
69
  const mitLicenseAttribution_1 = __importDefault(require("./util/mitLicenseAttribution"));
70
70
  const ClipboardHandler_1 = __importDefault(require("./util/ClipboardHandler"));
71
71
  const ContextMenuRecognizer_1 = __importDefault(require("./tools/InputFilter/ContextMenuRecognizer"));
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const math_1 = require("@js-draw/math");
7
7
  const assertions_1 = require("../util/assertions");
8
8
  const AbstractComponent_1 = __importDefault(require("./AbstractComponent"));
9
- const waitForImageLoaded_1 = __importDefault(require("../util/waitForImageLoaded"));
9
+ const waitForImageLoaded_1 = __importDefault(require("../util/dom/waitForImageLoaded"));
10
10
  /**
11
11
  * Represents a raster image.
12
12
  *
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const createButton_1 = __importDefault(require("../util/dom/createButton"));
6
7
  const waitForTimeout_1 = __importDefault(require("../util/waitForTimeout"));
7
8
  const makeAboutDialog = (editor, options) => {
8
9
  const overlay = document.createElement('div');
@@ -14,9 +15,10 @@ const makeAboutDialog = (editor, options) => {
14
15
  const heading = document.createElement('h1');
15
16
  heading.textContent = options.title;
16
17
  heading.setAttribute('autofocus', 'true');
17
- const closeButton = document.createElement('button');
18
- closeButton.innerText = editor.localization.closeDialog;
19
- closeButton.classList.add('close');
18
+ const closeButton = (0, createButton_1.default)({
19
+ text: editor.localization.closeDialog,
20
+ classList: ['close'],
21
+ });
20
22
  const scrollRegion = document.createElement('div');
21
23
  scrollRegion.classList.add('scroll');
22
24
  // Allow scrolling in the scrollable container -- don't forward wheel events.
@@ -11,6 +11,7 @@ const math_1 = require("@js-draw/math");
11
11
  const RenderingCache_1 = __importDefault(require("./caching/RenderingCache"));
12
12
  const TextOnlyRenderer_1 = __importDefault(require("./renderers/TextOnlyRenderer"));
13
13
  const AcceleratedInkingCanvasRenderer_1 = __importDefault(require("./renderers/AcceleratedInkingCanvasRenderer"));
14
+ const createButton_1 = __importDefault(require("../util/dom/createButton"));
14
15
  var RenderingMode;
15
16
  (function (RenderingMode) {
16
17
  RenderingMode[RenderingMode["DummyRenderer"] = 0] = "DummyRenderer";
@@ -183,9 +184,10 @@ class Display {
183
184
  initializeTextRendering() {
184
185
  const textRendererOutputContainer = document.createElement('div');
185
186
  textRendererOutputContainer.classList.add('textRendererOutputContainer');
186
- const rerenderButton = document.createElement('button');
187
- rerenderButton.classList.add('rerenderButton');
188
- rerenderButton.innerText = this.editor.localization.rerenderAsText;
187
+ const rerenderButton = (0, createButton_1.default)({
188
+ classList: ['rerenderButton'],
189
+ text: this.editor.localization.rerenderAsText,
190
+ });
189
191
  this.textRerenderOutput = document.createElement('div');
190
192
  this.textRerenderOutput.setAttribute('aria-live', 'polite');
191
193
  rerenderButton.onclick = () => {
@@ -9,8 +9,9 @@ const constants_1 = require("./constants");
9
9
  const EdgeToolbarLayoutManager_1 = __importDefault(require("./widgets/layout/EdgeToolbarLayoutManager"));
10
10
  const ReactiveValue_1 = require("../util/ReactiveValue");
11
11
  const AbstractToolbar_1 = __importDefault(require("./AbstractToolbar"));
12
- const stopPropagationOfScrollingWheelEvents_1 = __importDefault(require("../util/stopPropagationOfScrollingWheelEvents"));
12
+ const stopPropagationOfScrollingWheelEvents_1 = __importDefault(require("../util/dom/stopPropagationOfScrollingWheelEvents"));
13
13
  const makeDraggable_1 = __importDefault(require("./utils/makeDraggable"));
14
+ const createButton_1 = __importDefault(require("../util/dom/createButton"));
14
15
  /**
15
16
  * Creates an `EdgeToolbar`.
16
17
  *
@@ -92,7 +93,7 @@ class EdgeToolbar extends AbstractToolbar_1.default {
92
93
  this.menuContainer.classList.remove(belowEdgeClassName);
93
94
  }
94
95
  });
95
- this.closeButton = document.createElement('button');
96
+ this.closeButton = (0, createButton_1.default)();
96
97
  this.closeButton.classList.add('drag-elem');
97
98
  // The close button has default focus -- forward its events to the main editor so that keyboard
98
99
  // shortcuts still work.
@@ -15,7 +15,7 @@ const Viewport_1 = __importDefault(require("../Viewport"));
15
15
  const FreehandLineBuilder_1 = require("../components/builders/FreehandLineBuilder");
16
16
  const PolylineBuilder_1 = require("../components/builders/PolylineBuilder");
17
17
  const Eraser_1 = require("../tools/Eraser");
18
- const createElement_1 = require("../util/createElement");
18
+ const createElement_1 = require("../util/dom/createElement");
19
19
  const types_1 = require("../tools/SelectionTool/types");
20
20
  const svgNamespace = 'http://www.w3.org/2000/svg';
21
21
  let checkerboardIdCounter = 0;
@@ -12,8 +12,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  const math_1 = require("@js-draw/math");
13
13
  const makeDraggable_1 = __importDefault(require("./makeDraggable"));
14
14
  const ReactiveValue_1 = require("../../util/ReactiveValue");
15
- const cloneElementWithStyles_1 = __importDefault(require("../../util/cloneElementWithStyles"));
16
- const addLongPressOrHoverCssClasses_1 = __importDefault(require("../../util/addLongPressOrHoverCssClasses"));
15
+ const cloneElementWithStyles_1 = __importDefault(require("../../util/dom/cloneElementWithStyles"));
16
+ const addLongPressOrHoverCssClasses_1 = __importDefault(require("../../util/dom/addLongPressOrHoverCssClasses"));
17
+ const createButton_1 = __importDefault(require("../../util/dom/createButton"));
17
18
  /**
18
19
  * Creates the main content of the help overlay.
19
20
  *
@@ -219,7 +220,7 @@ class HelpDisplay {
219
220
  }
220
221
  };
221
222
  const makeCloseButton = () => {
222
- const closeButton = document.createElement('button');
223
+ const closeButton = (0, createButton_1.default)();
223
224
  closeButton.classList.add('close-button');
224
225
  closeButton.appendChild(this.context.icons.makeCloseIcon());
225
226
  const label = this.context.localization.close;
@@ -278,8 +279,8 @@ class HelpDisplay {
278
279
  const makeNavigationButtons = (navigation) => {
279
280
  const navigationButtonContainer = document.createElement('div');
280
281
  navigationButtonContainer.classList.add('navigation-buttons');
281
- const nextButton = document.createElement('button');
282
- const previousButton = document.createElement('button');
282
+ const nextButton = (0, createButton_1.default)();
283
+ const previousButton = (0, createButton_1.default)();
283
284
  nextButton.textContent = this.context.localization.next;
284
285
  previousButton.textContent = this.context.localization.previous;
285
286
  nextButton.classList.add('next');
@@ -429,7 +430,7 @@ class HelpDisplay {
429
430
  createToggleButton() {
430
431
  const buttonContainer = document.createElement('div');
431
432
  buttonContainer.classList.add('toolbar-help-overlay-button');
432
- const helpButton = document.createElement('button');
433
+ const helpButton = (0, createButton_1.default)();
433
434
  helpButton.classList.add('button');
434
435
  const icon = this.context.icons.makeHelpIcon();
435
436
  icon.classList.add('icon');
@@ -20,7 +20,7 @@ const ToolbarShortcutHandler_1 = __importDefault(require("../../tools/ToolbarSho
20
20
  const inputEvents_1 = require("../../inputEvents");
21
21
  const constants_1 = require("../constants");
22
22
  const DropdownLayoutManager_1 = __importDefault(require("./layout/DropdownLayoutManager"));
23
- const addLongPressOrHoverCssClasses_1 = __importDefault(require("../../util/addLongPressOrHoverCssClasses"));
23
+ const addLongPressOrHoverCssClasses_1 = __importDefault(require("../../util/dom/addLongPressOrHoverCssClasses"));
24
24
  const HelpDisplay_1 = __importDefault(require("../utils/HelpDisplay"));
25
25
  const assertions_1 = require("../../util/assertions");
26
26
  /**
@@ -45,6 +45,7 @@ const types_1 = require("../../types");
45
45
  const constants_1 = require("../constants");
46
46
  const makeColorInput_1 = __importDefault(require("./components/makeColorInput"));
47
47
  const BaseWidget_1 = __importDefault(require("./BaseWidget"));
48
+ const createButton_1 = __importDefault(require("../../util/dom/createButton"));
48
49
  class DocumentPropertiesWidget extends BaseWidget_1.default {
49
50
  constructor(editor, localizationTable) {
50
51
  super(editor, 'document-properties-widget', localizationTable);
@@ -254,9 +255,10 @@ class DocumentPropertiesWidget extends BaseWidget_1.default {
254
255
  this.editor.dispatch(image.setAutoresizeEnabled(checked));
255
256
  });
256
257
  // The "About..." button
257
- const aboutButton = document.createElement('button');
258
- aboutButton.classList.add('about-button');
259
- aboutButton.innerText = this.localizationTable.about;
258
+ const aboutButton = (0, createButton_1.default)({
259
+ classList: ['about-button'],
260
+ text: this.localizationTable.about,
261
+ });
260
262
  aboutButton.onclick = () => {
261
263
  this.editor.showAboutDialog();
262
264
  };
@@ -44,11 +44,12 @@ const constants_1 = require("../constants");
44
44
  const BaseToolWidget_1 = __importDefault(require("./BaseToolWidget"));
45
45
  const BaseWidget_1 = __importDefault(require("./BaseWidget"));
46
46
  const makeSeparator_1 = __importDefault(require("./components/makeSeparator"));
47
+ const createButton_1 = __importDefault(require("../../util/dom/createButton"));
47
48
  const makeZoomControl = (localizationTable, editor, helpDisplay) => {
48
49
  const zoomLevelRow = document.createElement('div');
49
- const increaseButton = document.createElement('button');
50
- const decreaseButton = document.createElement('button');
51
- const resetViewButton = document.createElement('button');
50
+ const increaseButton = (0, createButton_1.default)();
51
+ const decreaseButton = (0, createButton_1.default)();
52
+ const resetViewButton = (0, createButton_1.default)();
52
53
  const zoomLevelDisplay = document.createElement('span');
53
54
  increaseButton.innerText = '+';
54
55
  decreaseButton.innerText = '-';
@@ -18,6 +18,7 @@ const bytesToSizeString_1 = __importDefault(require("../../../util/bytesToSizeSt
18
18
  const ImageWrapper_1 = require("./ImageWrapper");
19
19
  const makeSnappedList_1 = __importDefault(require("../components/makeSnappedList"));
20
20
  const fileToImages_1 = __importDefault(require("./fileToImages"));
21
+ const createButton_1 = __importDefault(require("../../../util/dom/createButton"));
21
22
  /**
22
23
  * Provides a widget that allows inserting or modifying raster images.
23
24
  *
@@ -83,7 +84,7 @@ class InsertImageWidget extends BaseWidget_1.default {
83
84
  const actionButtonRow = document.createElement('div');
84
85
  actionButtonRow.classList.add('action-button-row');
85
86
  this.statusView.classList.add('insert-image-image-status-view');
86
- this.submitButton = document.createElement('button');
87
+ this.submitButton = (0, createButton_1.default)();
87
88
  this.selectedFiles = selectedFiles;
88
89
  this.imageAltTextInput = document.createElement('input');
89
90
  // Label the alt text input
@@ -170,16 +171,18 @@ class InsertImageWidget extends BaseWidget_1.default {
170
171
  const sizeText = document.createElement('span');
171
172
  sizeText.innerText = this.localizationTable.imageSize(Math.round(size), units);
172
173
  // Add a button to allow decreasing the size of large images.
173
- const decreaseSizeButton = document.createElement('button');
174
- decreaseSizeButton.innerText = this.localizationTable.decreaseImageSize;
175
- decreaseSizeButton.onclick = () => {
176
- currentImage?.decreaseSize();
177
- };
178
- const resetSizeButton = document.createElement('button');
179
- resetSizeButton.innerText = this.localizationTable.resetImage;
180
- resetSizeButton.onclick = () => {
181
- currentImage?.reset();
182
- };
174
+ const decreaseSizeButton = (0, createButton_1.default)({
175
+ text: this.localizationTable.decreaseImageSize,
176
+ onClick: () => {
177
+ currentImage?.decreaseSize();
178
+ },
179
+ });
180
+ const resetSizeButton = (0, createButton_1.default)({
181
+ text: this.localizationTable.resetImage,
182
+ onClick: () => {
183
+ currentImage?.reset();
184
+ },
185
+ });
183
186
  this.statusView.replaceChildren(sizeText);
184
187
  if (currentImage?.isLarge()) {
185
188
  this.statusView.appendChild(decreaseSizeButton);
@@ -18,6 +18,7 @@ const constants_1 = require("../constants");
18
18
  const makeThicknessSlider_1 = __importDefault(require("./components/makeThicknessSlider"));
19
19
  const makeGridSelector_1 = __importDefault(require("./components/makeGridSelector"));
20
20
  const PolylineBuilder_1 = require("../../components/builders/PolylineBuilder");
21
+ const createElement_1 = __importDefault(require("../../util/dom/createElement"));
21
22
  /**
22
23
  * This toolbar widget allows a user to control a single {@link Pen} tool.
23
24
  *
@@ -184,7 +185,7 @@ class PenToolWidget extends BaseToolWidget_1.default {
184
185
  const container = document.createElement('div');
185
186
  container.classList.add('action-button-row', `${constants_1.toolbarCSSPrefix}-pen-tool-toggle-buttons`);
186
187
  const addToggleButton = (labelText, icon) => {
187
- const button = document.createElement('button');
188
+ const button = (0, createElement_1.default)('button', { type: 'button' });
188
189
  button.classList.add(`${constants_1.toolbarCSSPrefix}-toggle-button`);
189
190
  const iconElement = icon.cloneNode(true);
190
191
  iconElement.classList.add('icon');
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const addLongPressOrHoverCssClasses_1 = __importDefault(require("../../../util/addLongPressOrHoverCssClasses"));
6
+ const addLongPressOrHoverCssClasses_1 = __importDefault(require("../../../util/dom/addLongPressOrHoverCssClasses"));
7
+ const createButton_1 = __importDefault(require("../../../util/dom/createButton"));
7
8
  /**
8
9
  * Creates HTML `button` elements from `buttonSpecs` and displays them in a
9
10
  * grid with `columnCount` columns.
@@ -13,7 +14,7 @@ const makeButtonGrid = (buttonSpecs, columnCount) => {
13
14
  container.classList.add('toolbar-button-grid');
14
15
  container.style.setProperty('--column-count', `${columnCount}`);
15
16
  const makeButton = (buttonSpec) => {
16
- const buttonElement = document.createElement('button');
17
+ const buttonElement = (0, createButton_1.default)();
17
18
  buttonElement.classList.add('button');
18
19
  const iconElement = buttonSpec.icon();
19
20
  iconElement.classList.add('icon');
@@ -7,6 +7,7 @@ exports.makeColorInput = void 0;
7
7
  const math_1 = require("@js-draw/math");
8
8
  const PipetteTool_1 = __importDefault(require("../../../tools/PipetteTool"));
9
9
  const types_1 = require("../../../types");
10
+ const createButton_1 = __importDefault(require("../../../util/dom/createButton"));
10
11
  // Returns [ color input, input container, callback to change the color value ].
11
12
  const makeColorInput = (editor, onColorChange) => {
12
13
  const container = document.createElement('span');
@@ -100,7 +101,7 @@ const makeColorInput = (editor, onColorChange) => {
100
101
  };
101
102
  exports.makeColorInput = makeColorInput;
102
103
  const addPipetteTool = (editor, container, onColorChange) => {
103
- const pipetteButton = document.createElement('button');
104
+ const pipetteButton = (0, createButton_1.default)();
104
105
  pipetteButton.classList.add('pipetteButton');
105
106
  pipetteButton.title = editor.localization.pickColorFromScreen;
106
107
  pipetteButton.setAttribute('alt', pipetteButton.title);
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const ReactiveValue_1 = require("../../../util/ReactiveValue");
7
- const stopPropagationOfScrollingWheelEvents_1 = __importDefault(require("../../../util/stopPropagationOfScrollingWheelEvents"));
8
- const addLongPressOrHoverCssClasses_1 = __importDefault(require("../../../util/addLongPressOrHoverCssClasses"));
7
+ const stopPropagationOfScrollingWheelEvents_1 = __importDefault(require("../../../util/dom/stopPropagationOfScrollingWheelEvents"));
8
+ const addLongPressOrHoverCssClasses_1 = __importDefault(require("../../../util/dom/addLongPressOrHoverCssClasses"));
9
9
  const constants_1 = require("../../constants");
10
10
  let idCounter = 0;
11
11
  /**
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const stopPropagationOfScrollingWheelEvents_1 = __importDefault(require("../../../util/stopPropagationOfScrollingWheelEvents"));
6
+ const stopPropagationOfScrollingWheelEvents_1 = __importDefault(require("../../../util/dom/stopPropagationOfScrollingWheelEvents"));
7
7
  const ReactiveValue_1 = require("../../../util/ReactiveValue");
8
8
  /**
9
9
  * Creates a list that snaps to each item and reports the selected item.
@@ -10,6 +10,7 @@ const TextComponent_1 = __importDefault(require("../components/TextComponent"));
10
10
  const ImageComponent_1 = __importDefault(require("../components/ImageComponent"));
11
11
  const BaseTool_1 = __importDefault(require("./BaseTool"));
12
12
  const keybindings_1 = require("./keybindings");
13
+ const createButton_1 = __importDefault(require("../util/dom/createButton"));
13
14
  const cssPrefix = 'find-tool';
14
15
  class FindTool extends BaseTool_1.default {
15
16
  constructor(editor) {
@@ -67,8 +68,8 @@ class FindTool extends BaseTool_1.default {
67
68
  fillOverlay() {
68
69
  const label = document.createElement('label');
69
70
  this.searchInput = document.createElement('input');
70
- const nextBtn = document.createElement('button');
71
- const closeBtn = document.createElement('button');
71
+ const nextBtn = (0, createButton_1.default)();
72
+ const closeBtn = (0, createButton_1.default)();
72
73
  // Math.random() ensures that the ID is unique (to allow us to refer to it
73
74
  // with an htmlFor).
74
75
  this.searchInput.setAttribute('id', `${cssPrefix}-searchInput-${Math.random()}`);
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  const math_1 = require("@js-draw/math");
4
7
  const SelectionTool_1 = require("./SelectionTool");
8
+ const createButton_1 = __importDefault(require("../../util/dom/createButton"));
5
9
  const verticalOffset = 40;
6
10
  class SelectionMenuShortcut {
7
11
  constructor(parent, viewport, icon, showContextMenu, localization) {
@@ -22,8 +26,9 @@ class SelectionMenuShortcut {
22
26
  this.updatePosition();
23
27
  }
24
28
  initUI() {
25
- const button = document.createElement('button');
26
- this.icon.classList.add('icon');
29
+ const button = (0, createButton_1.default)({
30
+ classList: ['icon'],
31
+ });
27
32
  button.replaceChildren(this.icon);
28
33
  button.ariaLabel = this.localization.selectionMenu__show;
29
34
  button.title = button.ariaLabel;
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const math_1 = require("@js-draw/math");
7
7
  const BaseTool_1 = __importDefault(require("./BaseTool"));
8
+ const createButton_1 = __importDefault(require("../util/dom/createButton"));
8
9
  class SoundFeedback {
9
10
  constructor() {
10
11
  this.closed = false;
@@ -97,10 +98,11 @@ class SoundUITool extends BaseTool_1.default {
97
98
  // Create a screen-reader-usable method of toggling the tool:
98
99
  this.toggleButtonContainer = document.createElement('div');
99
100
  this.toggleButtonContainer.classList.add('js-draw-sound-ui-toggle');
100
- this.toggleButton = document.createElement('button');
101
- this.toggleButton.onclick = () => {
102
- this.setEnabled(!this.isEnabled());
103
- };
101
+ this.toggleButton = (0, createButton_1.default)({
102
+ onClick: () => {
103
+ this.setEnabled(!this.isEnabled());
104
+ },
105
+ });
104
106
  this.toggleButtonContainer.appendChild(this.toggleButton);
105
107
  this.updateToggleButtonText();
106
108
  editor.createHTMLOverlay(this.toggleButtonContainer);
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const waitForTimeout_1 = __importDefault(require("../../util/waitForTimeout"));
7
7
  const types_1 = require("../../types");
8
+ const createButton_1 = __importDefault(require("../../util/dom/createButton"));
8
9
  let idCounter = 0;
9
10
  const createMenuOverlay = async (editor, canvasAnchor, options) => {
10
11
  const overlay = document.createElement('div');
@@ -101,16 +102,17 @@ const createMenuOverlay = async (editor, canvasAnchor, options) => {
101
102
  }
102
103
  });
103
104
  for (const option of options) {
104
- const optionElement = document.createElement('button');
105
+ const optionElement = (0, createButton_1.default)({
106
+ classList: ['option', 'editor-popup-menu-option'],
107
+ onClick: (event) => {
108
+ if (event.defaultPrevented)
109
+ return;
110
+ onOptionSelected(option.key);
111
+ },
112
+ });
105
113
  optionElement.id = `menu-overlay-option-${idCounter++}`;
106
114
  optionElement.role = 'menuitem';
107
- optionElement.classList.add('option', 'editor-popup-menu-option');
108
115
  optionElement.replaceChildren(option.icon(), document.createTextNode(option.text));
109
- optionElement.onclick = (event) => {
110
- if (event.defaultPrevented)
111
- return;
112
- onOptionSelected(option.key);
113
- };
114
116
  contentElement.appendChild(optionElement);
115
117
  if (optionElements.length === 0) {
116
118
  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,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const createElement_1 = __importDefault(require("./createElement"));
7
+ const createButton = ({ onClick, text, classList = [] } = {}) => {
8
+ const button = (0, createElement_1.default)('button', { type: 'button' });
9
+ if (onClick) {
10
+ button.onclick = onClick;
11
+ }
12
+ if (text) {
13
+ button.textContent = text;
14
+ }
15
+ for (const className of classList) {
16
+ button.classList.add(className);
17
+ }
18
+ return button;
19
+ };
20
+ exports.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;
@@ -7,5 +7,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  */
8
8
  exports.default = {
9
9
  // Note: Auto-updated by prebuild.js:
10
- number: '1.30.0',
10
+ number: '1.30.1',
11
11
  };
@@ -26,7 +26,7 @@ import makeAboutDialog from './dialogs/makeAboutDialog.mjs';
26
26
  import version from './version.mjs';
27
27
  import { editorImageToSVGSync, editorImageToSVGAsync } from './image/export/editorImageToSVG.mjs';
28
28
  import ReactiveValue, { MutableReactiveValue } from './util/ReactiveValue.mjs';
29
- import listenForKeyboardEventsFrom from './util/listenForKeyboardEventsFrom.mjs';
29
+ import listenForKeyboardEventsFrom from './util/dom/listenForKeyboardEventsFrom.mjs';
30
30
  import mitLicenseAttribution from './util/mitLicenseAttribution.mjs';
31
31
  import ClipboardHandler from './util/ClipboardHandler.mjs';
32
32
  import ContextMenuRecognizer from './tools/InputFilter/ContextMenuRecognizer.mjs';
@@ -1,7 +1,7 @@
1
1
  import { Rect2, Mat33 } from '@js-draw/math';
2
2
  import { assertIsNumber, assertIsNumberArray } from '../util/assertions.mjs';
3
3
  import AbstractComponent from './AbstractComponent.mjs';
4
- import waitForImageLoaded from '../util/waitForImageLoaded.mjs';
4
+ import waitForImageLoaded from '../util/dom/waitForImageLoaded.mjs';
5
5
  /**
6
6
  * Represents a raster image.
7
7
  *
@@ -1,3 +1,4 @@
1
+ import createButton from '../util/dom/createButton.mjs';
1
2
  import waitForTimeout from '../util/waitForTimeout.mjs';
2
3
  const makeAboutDialog = (editor, options) => {
3
4
  const overlay = document.createElement('div');
@@ -9,9 +10,10 @@ const makeAboutDialog = (editor, options) => {
9
10
  const heading = document.createElement('h1');
10
11
  heading.textContent = options.title;
11
12
  heading.setAttribute('autofocus', 'true');
12
- const closeButton = document.createElement('button');
13
- closeButton.innerText = editor.localization.closeDialog;
14
- closeButton.classList.add('close');
13
+ const closeButton = createButton({
14
+ text: editor.localization.closeDialog,
15
+ classList: ['close'],
16
+ });
15
17
  const scrollRegion = document.createElement('div');
16
18
  scrollRegion.classList.add('scroll');
17
19
  // Allow scrolling in the scrollable container -- don't forward wheel events.
@@ -5,6 +5,7 @@ import { Vec2, Color4 } from '@js-draw/math';
5
5
  import RenderingCache from './caching/RenderingCache.mjs';
6
6
  import TextOnlyRenderer from './renderers/TextOnlyRenderer.mjs';
7
7
  import AcceleratedInkingCanvasRenderer from './renderers/AcceleratedInkingCanvasRenderer.mjs';
8
+ import createButton from '../util/dom/createButton.mjs';
8
9
  export var RenderingMode;
9
10
  (function (RenderingMode) {
10
11
  RenderingMode[RenderingMode["DummyRenderer"] = 0] = "DummyRenderer";
@@ -177,9 +178,10 @@ export default class Display {
177
178
  initializeTextRendering() {
178
179
  const textRendererOutputContainer = document.createElement('div');
179
180
  textRendererOutputContainer.classList.add('textRendererOutputContainer');
180
- const rerenderButton = document.createElement('button');
181
- rerenderButton.classList.add('rerenderButton');
182
- rerenderButton.innerText = this.editor.localization.rerenderAsText;
181
+ const rerenderButton = createButton({
182
+ classList: ['rerenderButton'],
183
+ text: this.editor.localization.rerenderAsText,
184
+ });
183
185
  this.textRerenderOutput = document.createElement('div');
184
186
  this.textRerenderOutput.setAttribute('aria-live', 'polite');
185
187
  rerenderButton.onclick = () => {
@@ -3,8 +3,9 @@ import { toolbarCSSPrefix } from './constants.mjs';
3
3
  import EdgeToolbarLayoutManager from './widgets/layout/EdgeToolbarLayoutManager.mjs';
4
4
  import { MutableReactiveValue, ReactiveValue } from '../util/ReactiveValue.mjs';
5
5
  import AbstractToolbar from './AbstractToolbar.mjs';
6
- import stopPropagationOfScrollingWheelEvents from '../util/stopPropagationOfScrollingWheelEvents.mjs';
6
+ import stopPropagationOfScrollingWheelEvents from '../util/dom/stopPropagationOfScrollingWheelEvents.mjs';
7
7
  import makeDraggable from './utils/makeDraggable.mjs';
8
+ import createButton from '../util/dom/createButton.mjs';
8
9
  /**
9
10
  * Creates an `EdgeToolbar`.
10
11
  *
@@ -85,7 +86,7 @@ export default class EdgeToolbar extends AbstractToolbar {
85
86
  this.menuContainer.classList.remove(belowEdgeClassName);
86
87
  }
87
88
  });
88
- this.closeButton = document.createElement('button');
89
+ this.closeButton = createButton();
89
90
  this.closeButton.classList.add('drag-elem');
90
91
  // The close button has default focus -- forward its events to the main editor so that keyboard
91
92
  // shortcuts still work.
@@ -10,7 +10,7 @@ import Viewport from '../Viewport.mjs';
10
10
  import { makeFreehandLineBuilder } from '../components/builders/FreehandLineBuilder.mjs';
11
11
  import { makePolylineBuilder } from '../components/builders/PolylineBuilder.mjs';
12
12
  import { EraserMode } from '../tools/Eraser.mjs';
13
- import { createSvgElement, createSvgElements, createSvgPaths } from '../util/createElement.mjs';
13
+ import { createSvgElement, createSvgElements, createSvgPaths } from '../util/dom/createElement.mjs';
14
14
  import { SelectionMode } from '../tools/SelectionTool/types.mjs';
15
15
  const svgNamespace = 'http://www.w3.org/2000/svg';
16
16
  let checkerboardIdCounter = 0;
@@ -7,8 +7,9 @@ var _HelpDisplay_helpData;
7
7
  import { Rect2 } from '@js-draw/math';
8
8
  import makeDraggable from './makeDraggable.mjs';
9
9
  import { MutableReactiveValue } from '../../util/ReactiveValue.mjs';
10
- import cloneElementWithStyles from '../../util/cloneElementWithStyles.mjs';
11
- import addLongPressOrHoverCssClasses from '../../util/addLongPressOrHoverCssClasses.mjs';
10
+ import cloneElementWithStyles from '../../util/dom/cloneElementWithStyles.mjs';
11
+ import addLongPressOrHoverCssClasses from '../../util/dom/addLongPressOrHoverCssClasses.mjs';
12
+ import createButton from '../../util/dom/createButton.mjs';
12
13
  /**
13
14
  * Creates the main content of the help overlay.
14
15
  *
@@ -214,7 +215,7 @@ class HelpDisplay {
214
215
  }
215
216
  };
216
217
  const makeCloseButton = () => {
217
- const closeButton = document.createElement('button');
218
+ const closeButton = createButton();
218
219
  closeButton.classList.add('close-button');
219
220
  closeButton.appendChild(this.context.icons.makeCloseIcon());
220
221
  const label = this.context.localization.close;
@@ -273,8 +274,8 @@ class HelpDisplay {
273
274
  const makeNavigationButtons = (navigation) => {
274
275
  const navigationButtonContainer = document.createElement('div');
275
276
  navigationButtonContainer.classList.add('navigation-buttons');
276
- const nextButton = document.createElement('button');
277
- const previousButton = document.createElement('button');
277
+ const nextButton = createButton();
278
+ const previousButton = createButton();
278
279
  nextButton.textContent = this.context.localization.next;
279
280
  previousButton.textContent = this.context.localization.previous;
280
281
  nextButton.classList.add('next');
@@ -424,7 +425,7 @@ class HelpDisplay {
424
425
  createToggleButton() {
425
426
  const buttonContainer = document.createElement('div');
426
427
  buttonContainer.classList.add('toolbar-help-overlay-button');
427
- const helpButton = document.createElement('button');
428
+ const helpButton = createButton();
428
429
  helpButton.classList.add('button');
429
430
  const icon = this.context.icons.makeHelpIcon();
430
431
  icon.classList.add('icon');
@@ -14,7 +14,7 @@ import ToolbarShortcutHandler from '../../tools/ToolbarShortcutHandler.mjs';
14
14
  import { keyPressEventFromHTMLEvent, keyUpEventFromHTMLEvent, } from '../../inputEvents.mjs';
15
15
  import { toolbarCSSPrefix } from '../constants.mjs';
16
16
  import DropdownLayoutManager from './layout/DropdownLayoutManager.mjs';
17
- import addLongPressOrHoverCssClasses from '../../util/addLongPressOrHoverCssClasses.mjs';
17
+ import addLongPressOrHoverCssClasses from '../../util/dom/addLongPressOrHoverCssClasses.mjs';
18
18
  import HelpDisplay from '../utils/HelpDisplay.mjs';
19
19
  import { assertIsObject } from '../../util/assertions.mjs';
20
20
  /**