js-draw 1.30.0 → 1.31.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.
- package/README.md +5 -3
- package/dist/bundle.js +34 -34
- package/dist/cjs/Editor.js +1 -1
- package/dist/cjs/components/ImageComponent.js +1 -1
- package/dist/cjs/dialogs/makeMessageDialog.js +5 -3
- package/dist/cjs/localizations/getLocalizationTable.js +2 -0
- package/dist/cjs/localizations/zh.d.ts +3 -0
- package/dist/cjs/localizations/zh.js +170 -0
- package/dist/cjs/rendering/Display.js +5 -3
- package/dist/cjs/toolbar/EdgeToolbar.js +3 -2
- package/dist/cjs/toolbar/IconProvider.js +1 -1
- package/dist/cjs/toolbar/utils/HelpDisplay.js +7 -6
- package/dist/cjs/toolbar/widgets/BaseWidget.js +1 -1
- package/dist/cjs/toolbar/widgets/DocumentPropertiesWidget.js +5 -3
- package/dist/cjs/toolbar/widgets/HandToolWidget.js +4 -3
- package/dist/cjs/toolbar/widgets/InsertImageWidget/InsertImageWidget.js +14 -11
- package/dist/cjs/toolbar/widgets/PenToolWidget.js +2 -1
- package/dist/cjs/toolbar/widgets/components/makeButtonGrid.js +3 -2
- package/dist/cjs/toolbar/widgets/components/makeColorInput.js +2 -1
- package/dist/cjs/toolbar/widgets/components/makeGridSelector.js +2 -2
- package/dist/cjs/toolbar/widgets/components/makeSnappedList.js +1 -1
- package/dist/cjs/tools/FindTool.js +3 -2
- package/dist/cjs/tools/PanZoom.js +8 -2
- package/dist/cjs/tools/SelectionTool/SelectionMenuShortcut.js +7 -2
- package/dist/cjs/tools/SoundUITool.js +6 -4
- package/dist/cjs/tools/util/createMenuOverlay.js +9 -7
- package/dist/cjs/util/dom/createButton.d.ts +7 -0
- package/dist/cjs/util/dom/createButton.js +20 -0
- package/dist/cjs/util/{createElement.d.ts → dom/createElement.d.ts} +3 -0
- package/dist/cjs/version.js +1 -1
- package/dist/mjs/Editor.mjs +1 -1
- package/dist/mjs/components/ImageComponent.mjs +1 -1
- package/dist/mjs/dialogs/makeMessageDialog.mjs +5 -3
- package/dist/mjs/localizations/getLocalizationTable.mjs +2 -0
- package/dist/mjs/localizations/zh.d.ts +3 -0
- package/dist/mjs/localizations/zh.mjs +168 -0
- package/dist/mjs/rendering/Display.mjs +5 -3
- package/dist/mjs/toolbar/EdgeToolbar.mjs +3 -2
- package/dist/mjs/toolbar/IconProvider.mjs +1 -1
- package/dist/mjs/toolbar/utils/HelpDisplay.mjs +7 -6
- package/dist/mjs/toolbar/widgets/BaseWidget.mjs +1 -1
- package/dist/mjs/toolbar/widgets/DocumentPropertiesWidget.mjs +5 -3
- package/dist/mjs/toolbar/widgets/HandToolWidget.mjs +4 -3
- package/dist/mjs/toolbar/widgets/InsertImageWidget/InsertImageWidget.mjs +14 -11
- package/dist/mjs/toolbar/widgets/PenToolWidget.mjs +2 -1
- package/dist/mjs/toolbar/widgets/components/makeButtonGrid.mjs +3 -2
- package/dist/mjs/toolbar/widgets/components/makeColorInput.mjs +2 -1
- package/dist/mjs/toolbar/widgets/components/makeGridSelector.mjs +2 -2
- package/dist/mjs/toolbar/widgets/components/makeSnappedList.mjs +1 -1
- package/dist/mjs/tools/FindTool.mjs +3 -2
- package/dist/mjs/tools/PanZoom.mjs +8 -2
- package/dist/mjs/tools/SelectionTool/SelectionMenuShortcut.mjs +4 -2
- package/dist/mjs/tools/SoundUITool.mjs +6 -4
- package/dist/mjs/tools/util/createMenuOverlay.mjs +9 -7
- package/dist/mjs/util/dom/createButton.d.ts +7 -0
- package/dist/mjs/util/dom/createButton.mjs +15 -0
- package/dist/mjs/util/{createElement.d.ts → dom/createElement.d.ts} +3 -0
- package/dist/mjs/version.mjs +1 -1
- package/package.json +4 -4
- /package/dist/cjs/util/{addLongPressOrHoverCssClasses.d.ts → dom/addLongPressOrHoverCssClasses.d.ts} +0 -0
- /package/dist/cjs/util/{addLongPressOrHoverCssClasses.js → dom/addLongPressOrHoverCssClasses.js} +0 -0
- /package/dist/cjs/util/{cloneElementWithStyles.d.ts → dom/cloneElementWithStyles.d.ts} +0 -0
- /package/dist/cjs/util/{cloneElementWithStyles.js → dom/cloneElementWithStyles.js} +0 -0
- /package/dist/cjs/util/{createElement.js → dom/createElement.js} +0 -0
- /package/dist/cjs/util/{listenForKeyboardEventsFrom.d.ts → dom/listenForKeyboardEventsFrom.d.ts} +0 -0
- /package/dist/cjs/util/{listenForKeyboardEventsFrom.js → dom/listenForKeyboardEventsFrom.js} +0 -0
- /package/dist/cjs/util/{listenForLongPressOrHover.d.ts → dom/listenForLongPressOrHover.d.ts} +0 -0
- /package/dist/cjs/util/{listenForLongPressOrHover.js → dom/listenForLongPressOrHover.js} +0 -0
- /package/dist/cjs/util/{listenForLongPressOrHover.test.d.ts → dom/listenForLongPressOrHover.test.d.ts} +0 -0
- /package/dist/cjs/util/{stopPropagationOfScrollingWheelEvents.d.ts → dom/stopPropagationOfScrollingWheelEvents.d.ts} +0 -0
- /package/dist/cjs/util/{stopPropagationOfScrollingWheelEvents.js → dom/stopPropagationOfScrollingWheelEvents.js} +0 -0
- /package/dist/cjs/util/{waitForImageLoaded.d.ts → dom/waitForImageLoaded.d.ts} +0 -0
- /package/dist/cjs/util/{waitForImageLoaded.js → dom/waitForImageLoaded.js} +0 -0
- /package/dist/mjs/util/{addLongPressOrHoverCssClasses.d.ts → dom/addLongPressOrHoverCssClasses.d.ts} +0 -0
- /package/dist/mjs/util/{addLongPressOrHoverCssClasses.mjs → dom/addLongPressOrHoverCssClasses.mjs} +0 -0
- /package/dist/mjs/util/{cloneElementWithStyles.d.ts → dom/cloneElementWithStyles.d.ts} +0 -0
- /package/dist/mjs/util/{cloneElementWithStyles.mjs → dom/cloneElementWithStyles.mjs} +0 -0
- /package/dist/mjs/util/{createElement.mjs → dom/createElement.mjs} +0 -0
- /package/dist/mjs/util/{listenForKeyboardEventsFrom.d.ts → dom/listenForKeyboardEventsFrom.d.ts} +0 -0
- /package/dist/mjs/util/{listenForKeyboardEventsFrom.mjs → dom/listenForKeyboardEventsFrom.mjs} +0 -0
- /package/dist/mjs/util/{listenForLongPressOrHover.d.ts → dom/listenForLongPressOrHover.d.ts} +0 -0
- /package/dist/mjs/util/{listenForLongPressOrHover.mjs → dom/listenForLongPressOrHover.mjs} +0 -0
- /package/dist/mjs/util/{listenForLongPressOrHover.test.d.ts → dom/listenForLongPressOrHover.test.d.ts} +0 -0
- /package/dist/mjs/util/{stopPropagationOfScrollingWheelEvents.d.ts → dom/stopPropagationOfScrollingWheelEvents.d.ts} +0 -0
- /package/dist/mjs/util/{stopPropagationOfScrollingWheelEvents.mjs → dom/stopPropagationOfScrollingWheelEvents.mjs} +0 -0
- /package/dist/mjs/util/{waitForImageLoaded.d.ts → dom/waitForImageLoaded.d.ts} +0 -0
- /package/dist/mjs/util/{waitForImageLoaded.mjs → dom/waitForImageLoaded.mjs} +0 -0
package/dist/cjs/Editor.js
CHANGED
@@ -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 =
|
18
|
-
|
19
|
-
|
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.
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
exports.matchingLocalizationTable = exports.allLocales = void 0;
|
7
7
|
const localization_1 = require("../localization");
|
8
|
+
const zh_1 = __importDefault(require("./zh"));
|
8
9
|
const de_1 = __importDefault(require("./de"));
|
9
10
|
const en_1 = __importDefault(require("./en"));
|
10
11
|
const es_1 = __importDefault(require("./es"));
|
@@ -14,6 +15,7 @@ exports.allLocales = {
|
|
14
15
|
en: en_1.default,
|
15
16
|
es: es_1.default,
|
16
17
|
sk: sk_1.default,
|
18
|
+
zh: zh_1.default,
|
17
19
|
};
|
18
20
|
// [locale]: A string in the format languageCode_Region or just languageCode. For example, en_US.
|
19
21
|
const languageFromLocale = (locale) => {
|
@@ -0,0 +1,170 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const localization_1 = require("../localization");
|
4
|
+
// Chinese localization
|
5
|
+
const localization = {
|
6
|
+
...localization_1.defaultEditorLocalization,
|
7
|
+
help: '帮助',
|
8
|
+
helpHidden: '帮助已隐藏',
|
9
|
+
next: '下一页',
|
10
|
+
previous: '上一页',
|
11
|
+
close: '关闭',
|
12
|
+
helpScreenNavigationHelp: '点击控件查看更多信息。',
|
13
|
+
helpControlsAccessibilityLabel: '控件:激活控件以显示帮助。',
|
14
|
+
pen: '画笔',
|
15
|
+
eraser: '橡皮擦',
|
16
|
+
select: '选择',
|
17
|
+
handTool: '平移',
|
18
|
+
zoom: '缩放',
|
19
|
+
image: '图片',
|
20
|
+
reformatSelection: '格式化选区',
|
21
|
+
inputAltText: '替代文本',
|
22
|
+
decreaseImageSize: '减小尺寸',
|
23
|
+
resetImage: '重置',
|
24
|
+
chooseFile: '选择文件',
|
25
|
+
dragAndDropHereOrBrowse: '将文件拖拽到此处或{{浏览}}',
|
26
|
+
submit: '提交',
|
27
|
+
addAll: '全部添加',
|
28
|
+
cancel: '取消',
|
29
|
+
resetView: '重置视图',
|
30
|
+
thicknessLabel: '粗细',
|
31
|
+
colorLabel: '颜色',
|
32
|
+
fontLabel: '字体',
|
33
|
+
textSize: '字号',
|
34
|
+
resizeImageToSelection: '按选区调整图片大小',
|
35
|
+
deleteSelection: '删除选区',
|
36
|
+
duplicateSelection: '复制选区',
|
37
|
+
exit: '退出',
|
38
|
+
save: '保存',
|
39
|
+
undo: '撤销',
|
40
|
+
redo: '重做',
|
41
|
+
fullStrokeEraser: '全笔划橡皮擦',
|
42
|
+
selectPenType: '工具类型',
|
43
|
+
selectShape: '形状',
|
44
|
+
pickColorFromScreen: '从屏幕取色',
|
45
|
+
clickToPickColorAnnouncement: '点击屏幕以选取颜色',
|
46
|
+
colorSelectionCanceledAnnouncement: '颜色选择已取消',
|
47
|
+
selectionTool__lassoSelect: '自由选区',
|
48
|
+
selectionTool__lassoSelect__help: '启用后,拖拽将创建自由形式(套索)选区。',
|
49
|
+
selectionToolKeyboardShortcuts: '选择工具:使用方向键移动所选项目,使用小写/大写 “i” 和 “o” 调整大小。',
|
50
|
+
documentProperties: '页面',
|
51
|
+
backgroundColor: '背景色',
|
52
|
+
imageWidthOption: '宽度',
|
53
|
+
imageHeightOption: '高度',
|
54
|
+
useGridOption: '网格',
|
55
|
+
enableAutoresizeOption: '自动调整大小',
|
56
|
+
toggleOverflow: '更多',
|
57
|
+
about: '关于',
|
58
|
+
inputStabilization: '稳定',
|
59
|
+
strokeAutocorrect: '自动更正',
|
60
|
+
pressureSensitivity: '压力',
|
61
|
+
touchPanning: '触屏平移',
|
62
|
+
roundedTipPen: '自由画笔',
|
63
|
+
roundedTipPen2: '折线',
|
64
|
+
flatTipPen: '平头笔',
|
65
|
+
arrowPen: '箭头',
|
66
|
+
linePen: '直线',
|
67
|
+
outlinedRectanglePen: '空心矩形',
|
68
|
+
filledRectanglePen: '实心矩形',
|
69
|
+
outlinedCirclePen: '空心圆',
|
70
|
+
lockRotation: '锁定旋转',
|
71
|
+
paste: '粘v贴',
|
72
|
+
errorImageHasZeroSize: '错误:图片尺寸为零',
|
73
|
+
describeTheImage: '图像描述',
|
74
|
+
fileInput__loading: '加载中...',
|
75
|
+
fileInput__andNMoreFiles: (n) => `(还有 ${n} 个)`,
|
76
|
+
closeSidebar: (toolName) => `关闭 ${toolName} 的侧边栏`,
|
77
|
+
dropdownShown: (toolName) => `已显示 ${toolName} 下拉菜单`,
|
78
|
+
dropdownHidden: (toolName) => `已隐藏 ${toolName} 下拉菜单`,
|
79
|
+
zoomLevel: (zoomPercent) => `缩放:${zoomPercent}%`,
|
80
|
+
colorChangedAnnouncement: (color) => `颜色已更改为 ${color}`,
|
81
|
+
imageSize: (size, units) => `图片尺寸:${size} ${units}`,
|
82
|
+
imageLoadError: (message) => `图片加载错误:${message}`,
|
83
|
+
penTool: (penId) => `画笔 ${penId}`,
|
84
|
+
selectionTool: '选择工具',
|
85
|
+
selectAllTool: '全选',
|
86
|
+
eraserTool: '橡皮擦工具',
|
87
|
+
touchPanTool: '触屏平移工具',
|
88
|
+
twoFingerPanZoomTool: '双指平移与缩放',
|
89
|
+
undoRedoTool: '撤销/重做工具',
|
90
|
+
rightClickDragPanTool: '右键拖拽',
|
91
|
+
pipetteTool: '取色器',
|
92
|
+
keyboardPanZoom: '键盘平移与缩放快捷键',
|
93
|
+
selectionMenu__show: '显示选择菜单',
|
94
|
+
selectionMenu__copyToClipboard: '复制到剪贴板',
|
95
|
+
selectionMenu__duplicate: '复制',
|
96
|
+
selectionMenu__delete: '删除',
|
97
|
+
selectionMenu__paste: '粘贴',
|
98
|
+
copyPasteError__heading: '复制/粘贴',
|
99
|
+
copyPasteError__description: '出错了——此工具可能无法访问剪贴板。',
|
100
|
+
copyPasteError__errorDetails: '显示错误',
|
101
|
+
copyPasteError__pasteRetry: '请重试:在下方输入框中粘贴:',
|
102
|
+
copyPasteError__copyRetry: '请重试:在下方输入框中复制文本:',
|
103
|
+
copyPasteError__copyMe: '点我复制!',
|
104
|
+
autocorrectedTo: (strokeDescription) => `已自动更正为 ${strokeDescription}`,
|
105
|
+
autocorrectionCanceled: '自动更正已取消',
|
106
|
+
textTool: '文本工具',
|
107
|
+
enterTextToInsert: '输入要插入的文本',
|
108
|
+
changeTool: '切换工具',
|
109
|
+
pasteHandler: '复制粘贴处理器',
|
110
|
+
soundExplorer: '声音探索',
|
111
|
+
disableAccessibilityExploreTool: '关闭声音探索',
|
112
|
+
enableAccessibilityExploreTool: '开启声音探索',
|
113
|
+
soundExplorerUsageAnnouncement: '已启用声音图像探索:点击或拖拽屏幕,即可通过声音感受图像不同区域。',
|
114
|
+
findLabel: '查找',
|
115
|
+
toNextMatch: '下一个',
|
116
|
+
closeDialog: '关闭',
|
117
|
+
findDialogShown: '已显示查找对话框',
|
118
|
+
findDialogHidden: '已隐藏查找对话框',
|
119
|
+
focusedFoundText: (matchIdx, totalMatches) => `第 ${matchIdx} 条结果,共 ${totalMatches} 条`,
|
120
|
+
anyDevicePanning: '任意设备平移',
|
121
|
+
copied: (count) => `已复制 ${count} 个项目`,
|
122
|
+
pasted: (count) => `已粘贴 ${count} 个项目`,
|
123
|
+
toolEnabledAnnouncement: (toolName) => `${toolName} 已启用`,
|
124
|
+
toolDisabledAnnouncement: (toolName) => `${toolName} 已禁用`,
|
125
|
+
updatedViewport: '已更新视口',
|
126
|
+
transformedElements: (elemCount, action) => `${elemCount} 个元素已变换 (${action})`,
|
127
|
+
resizeOutputCommand: (newSize) => `图片尺寸已更改为 ${newSize.w}×${newSize.h}`,
|
128
|
+
enabledAutoresizeOutputCommand: '已启用输出自动调整大小',
|
129
|
+
disabledAutoresizeOutputCommand: '已禁用输出自动调整大小',
|
130
|
+
addComponentAction: (componentDescription) => `已添加 ${componentDescription}`,
|
131
|
+
eraseAction: (componentDescription, countErased) => `已删除 ${countErased} 个 ${componentDescription}`,
|
132
|
+
duplicateAction: (componentDescription, countErased) => `已复制 ${countErased} 个 ${componentDescription}`,
|
133
|
+
unionOf: (actionDescription, actionCount) => `合并:${actionCount} 个 ${actionDescription}`,
|
134
|
+
inverseOf: (actionDescription) => `${actionDescription} 已反向`,
|
135
|
+
elements: '元素',
|
136
|
+
erasedNoElements: '未v删除任何内容',
|
137
|
+
duplicatedNoElements: '未复制任何内容',
|
138
|
+
rotatedBy: (degrees) => `已旋转 ${Math.abs(degrees)} 度 ${degrees < 0 ? '顺时针' : '逆时针'}`,
|
139
|
+
movedLeft: '已向左移动',
|
140
|
+
movedUp: '已向上移动',
|
141
|
+
movedDown: '已向下移动',
|
142
|
+
movedRight: '已向右移动',
|
143
|
+
zoomedOut: '已缩小',
|
144
|
+
zoomedIn: '已放大',
|
145
|
+
andNMoreCommands: (count) => `还有 ${count} 条命令。`,
|
146
|
+
selectedElements: (count) => `已选 ${count} 个元素`,
|
147
|
+
unlabeledImageNode: '未命名图片',
|
148
|
+
stroke: '笔画',
|
149
|
+
svgObject: 'SVG 对象',
|
150
|
+
emptyBackground: '空白背景',
|
151
|
+
gridBackground: '网格背景',
|
152
|
+
filledBackgroundWithColor: (color) => `已填充背景(${color})`,
|
153
|
+
text: (text) => `文本对象:${text}`,
|
154
|
+
imageNode: (label) => `图片:${label}`,
|
155
|
+
restyledElement: (elementDescription) => `已重新样式化 ${elementDescription}`,
|
156
|
+
pathNodeCount: (count) => `可见路径对象:${count} 个`,
|
157
|
+
textNodeCount: (count) => `可见文本节点:${count} 个`,
|
158
|
+
imageNodeCount: (nodeCount) => `可见图片节点:${nodeCount} 个`,
|
159
|
+
textNode: (content) => `文本:${content}`,
|
160
|
+
rerenderAsText: '以文本形式重绘',
|
161
|
+
accessibilityInputInstructions: '按“t”将视口内容朗读为文本。使用方向键移动视口,点击并拖拽绘制笔画。按“w”放大,按“s”缩小。',
|
162
|
+
loading: (percentage) => `加载中 ${percentage}%...`,
|
163
|
+
imageEditor: '图片编辑器',
|
164
|
+
doneLoading: '加载完成',
|
165
|
+
undoAnnouncement: (commandDescription) => `已撤销 ${commandDescription}`,
|
166
|
+
redoAnnouncement: (commandDescription) => `已重做 ${commandDescription}`,
|
167
|
+
softwareLibraries: '软件库',
|
168
|
+
developerInformation: '开发者信息',
|
169
|
+
};
|
170
|
+
exports.default = localization;
|
@@ -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 =
|
187
|
-
|
188
|
-
|
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 =
|
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 =
|
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 =
|
282
|
-
const previousButton =
|
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 =
|
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 =
|
258
|
-
|
259
|
-
|
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 =
|
50
|
-
const decreaseButton =
|
51
|
-
const resetViewButton =
|
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 =
|
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 =
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
resetSizeButton
|
180
|
-
|
181
|
-
|
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 =
|
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 =
|
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 =
|
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 =
|
71
|
-
const closeBtn =
|
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()}`);
|
@@ -131,9 +131,15 @@ class PanZoom extends BaseTool_1.default {
|
|
131
131
|
this.inertialScroller?.stop();
|
132
132
|
this.velocity = inertialScrollerVelocity;
|
133
133
|
this.lastPointerDownTimestamp = currentPointer.timeStamp;
|
134
|
-
const allAreTouch = this.allPointersAreOfType(pointers, Pointer_1.PointerDevice.Touch);
|
135
134
|
const isRightClick = this.allPointersAreOfType(pointers, Pointer_1.PointerDevice.RightButtonMouse);
|
136
|
-
|
135
|
+
// Work around a Chromium bug where touch events are reported to have unknown type.
|
136
|
+
// See https://issues.chromium.org/u/1/issues/428153664.
|
137
|
+
const allAreTouch = this.allPointersAreOfType(pointers, Pointer_1.PointerDevice.Touch);
|
138
|
+
const allAreUnknown = this.allPointersAreOfType(pointers, Pointer_1.PointerDevice.Other);
|
139
|
+
const allAreProbablyTouch = allAreTouch || allAreUnknown;
|
140
|
+
if (allAreProbablyTouch &&
|
141
|
+
pointers.length === 2 &&
|
142
|
+
this.mode & PanZoomMode.TwoFingerTouchGestures) {
|
137
143
|
const { screenCenter, angle, dist } = this.computePinchData(pointers[0], pointers[1]);
|
138
144
|
this.lastTouchDist = dist;
|
139
145
|
this.startTouchDist = dist;
|
@@ -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 =
|
26
|
-
|
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 =
|
101
|
-
|
102
|
-
|
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 =
|
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;
|