suneditor 3.0.0-alpha.9 → 3.0.0-beta.2

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 (315) hide show
  1. package/CONTRIBUTING.md +170 -22
  2. package/{LICENSE.txt → LICENSE} +9 -9
  3. package/README.md +168 -30
  4. package/dist/suneditor.min.css +1 -1
  5. package/dist/suneditor.min.js +1 -1
  6. package/package.json +47 -21
  7. package/src/assets/design/color.css +121 -0
  8. package/src/assets/design/index.css +3 -0
  9. package/src/assets/design/size.css +35 -0
  10. package/src/assets/design/typography.css +37 -0
  11. package/src/assets/icons/defaultIcons.js +232 -0
  12. package/src/assets/suneditor-contents.css +181 -46
  13. package/src/assets/suneditor.css +1403 -650
  14. package/src/core/base/eventHandlers/handler_toolbar.js +35 -14
  15. package/src/core/base/eventHandlers/handler_ww_clipboard.js +23 -4
  16. package/src/core/base/eventHandlers/handler_ww_dragDrop.js +49 -10
  17. package/src/core/base/eventHandlers/handler_ww_key_input.js +422 -224
  18. package/src/core/base/eventHandlers/handler_ww_mouse.js +83 -36
  19. package/src/core/base/eventManager.js +520 -179
  20. package/src/core/base/history.js +95 -41
  21. package/src/core/class/char.js +26 -11
  22. package/src/core/class/component.js +345 -137
  23. package/src/core/class/format.js +683 -519
  24. package/src/core/class/html.js +485 -305
  25. package/src/core/class/menu.js +133 -47
  26. package/src/core/class/nodeTransform.js +90 -71
  27. package/src/core/class/offset.js +408 -92
  28. package/src/core/class/selection.js +216 -106
  29. package/src/core/class/shortcuts.js +68 -8
  30. package/src/core/class/toolbar.js +106 -116
  31. package/src/core/class/ui.js +422 -0
  32. package/src/core/class/viewer.js +178 -74
  33. package/src/core/editor.js +496 -389
  34. package/src/core/section/actives.js +123 -27
  35. package/src/core/section/constructor.js +615 -206
  36. package/src/core/section/context.js +28 -23
  37. package/src/core/section/documentType.js +561 -0
  38. package/src/editorInjector/_classes.js +19 -5
  39. package/src/editorInjector/_core.js +71 -7
  40. package/src/editorInjector/index.js +63 -1
  41. package/src/events.js +622 -0
  42. package/src/helper/clipboard.js +59 -0
  43. package/src/helper/converter.js +202 -26
  44. package/src/helper/dom/domCheck.js +304 -0
  45. package/src/helper/dom/domQuery.js +669 -0
  46. package/src/helper/dom/domUtils.js +557 -0
  47. package/src/helper/dom/index.js +12 -0
  48. package/src/helper/env.js +46 -56
  49. package/src/helper/index.js +10 -4
  50. package/src/helper/keyCodeMap.js +183 -0
  51. package/src/helper/numbers.js +12 -8
  52. package/src/helper/unicode.js +9 -5
  53. package/src/langs/ckb.js +74 -4
  54. package/src/langs/cs.js +72 -2
  55. package/src/langs/da.js +73 -3
  56. package/src/langs/de.js +73 -4
  57. package/src/langs/en.js +23 -3
  58. package/src/langs/es.js +73 -4
  59. package/src/langs/fa.js +75 -3
  60. package/src/langs/fr.js +73 -3
  61. package/src/langs/he.js +73 -4
  62. package/src/langs/hu.js +230 -0
  63. package/src/langs/index.js +7 -3
  64. package/src/langs/it.js +70 -1
  65. package/src/langs/ja.js +72 -4
  66. package/src/langs/km.js +230 -0
  67. package/src/langs/ko.js +22 -2
  68. package/src/langs/lv.js +74 -5
  69. package/src/langs/nl.js +73 -4
  70. package/src/langs/pl.js +73 -4
  71. package/src/langs/pt_br.js +70 -1
  72. package/src/langs/ro.js +74 -5
  73. package/src/langs/ru.js +73 -4
  74. package/src/langs/se.js +73 -4
  75. package/src/langs/tr.js +73 -1
  76. package/src/langs/{ua.js → uk.js} +75 -6
  77. package/src/langs/ur.js +77 -8
  78. package/src/langs/zh_cn.js +74 -5
  79. package/src/modules/ApiManager.js +77 -54
  80. package/src/modules/Browser.js +667 -0
  81. package/src/modules/ColorPicker.js +162 -102
  82. package/src/modules/Controller.js +273 -142
  83. package/src/modules/Figure.js +925 -484
  84. package/src/modules/FileManager.js +121 -69
  85. package/src/modules/HueSlider.js +113 -61
  86. package/src/modules/Modal.js +291 -122
  87. package/src/modules/ModalAnchorEditor.js +383 -234
  88. package/src/modules/SelectMenu.js +270 -168
  89. package/src/modules/_DragHandle.js +2 -1
  90. package/src/modules/index.js +3 -3
  91. package/src/plugins/browser/audioGallery.js +83 -0
  92. package/src/plugins/browser/fileBrowser.js +103 -0
  93. package/src/plugins/browser/fileGallery.js +83 -0
  94. package/src/plugins/browser/imageGallery.js +81 -0
  95. package/src/plugins/browser/videoGallery.js +103 -0
  96. package/src/plugins/command/blockquote.js +40 -27
  97. package/src/plugins/command/exportPDF.js +134 -0
  98. package/src/plugins/command/fileUpload.js +229 -162
  99. package/src/plugins/command/list_bulleted.js +83 -47
  100. package/src/plugins/command/list_numbered.js +83 -47
  101. package/src/plugins/dropdown/align.js +66 -54
  102. package/src/plugins/dropdown/backgroundColor.js +63 -49
  103. package/src/plugins/dropdown/font.js +71 -47
  104. package/src/plugins/dropdown/fontColor.js +63 -48
  105. package/src/plugins/dropdown/formatBlock.js +70 -33
  106. package/src/plugins/dropdown/hr.js +92 -51
  107. package/src/plugins/dropdown/layout.js +37 -26
  108. package/src/plugins/dropdown/lineHeight.js +54 -38
  109. package/src/plugins/dropdown/list.js +60 -45
  110. package/src/plugins/dropdown/paragraphStyle.js +51 -30
  111. package/src/plugins/dropdown/table.js +2003 -813
  112. package/src/plugins/dropdown/template.js +38 -26
  113. package/src/plugins/dropdown/textStyle.js +43 -31
  114. package/src/plugins/field/mention.js +147 -86
  115. package/src/plugins/index.js +32 -6
  116. package/src/plugins/input/fontSize.js +161 -108
  117. package/src/plugins/input/pageNavigator.js +70 -0
  118. package/src/plugins/modal/audio.js +358 -173
  119. package/src/plugins/modal/drawing.js +531 -0
  120. package/src/plugins/modal/embed.js +886 -0
  121. package/src/plugins/modal/image.js +674 -362
  122. package/src/plugins/modal/link.js +100 -71
  123. package/src/plugins/modal/math.js +367 -167
  124. package/src/plugins/modal/video.js +691 -335
  125. package/src/plugins/popup/anchor.js +222 -0
  126. package/src/suneditor.js +50 -13
  127. package/src/themes/dark.css +122 -0
  128. package/src/typedef.js +130 -0
  129. package/types/assets/icons/defaultIcons.d.ts +153 -0
  130. package/types/core/base/eventHandlers/handler_toolbar.d.ts +41 -0
  131. package/types/core/base/eventHandlers/handler_ww_clipboard.d.ts +40 -0
  132. package/types/core/base/eventHandlers/handler_ww_dragDrop.d.ts +35 -0
  133. package/types/core/base/eventHandlers/handler_ww_key_input.d.ts +45 -0
  134. package/types/core/base/eventHandlers/handler_ww_mouse.d.ts +39 -0
  135. package/types/core/base/eventManager.d.ts +385 -0
  136. package/types/core/base/history.d.ts +81 -0
  137. package/types/core/class/char.d.ts +60 -0
  138. package/types/core/class/component.d.ts +212 -0
  139. package/types/core/class/format.d.ts +616 -0
  140. package/types/core/class/html.d.ts +422 -0
  141. package/types/core/class/menu.d.ts +126 -0
  142. package/types/core/class/nodeTransform.d.ts +93 -0
  143. package/types/core/class/offset.d.ts +522 -0
  144. package/types/core/class/selection.d.ts +188 -0
  145. package/types/core/class/shortcuts.d.ts +142 -0
  146. package/types/core/class/toolbar.d.ts +189 -0
  147. package/types/core/class/ui.d.ts +164 -0
  148. package/types/core/class/viewer.d.ts +140 -0
  149. package/types/core/editor.d.ts +610 -0
  150. package/types/core/section/actives.d.ts +46 -0
  151. package/types/core/section/constructor.d.ts +777 -0
  152. package/types/core/section/context.d.ts +45 -0
  153. package/types/core/section/documentType.d.ts +178 -0
  154. package/types/editorInjector/_classes.d.ts +41 -0
  155. package/types/editorInjector/_core.d.ts +92 -0
  156. package/types/editorInjector/index.d.ts +71 -0
  157. package/types/events.d.ts +273 -0
  158. package/types/helper/clipboard.d.ts +12 -0
  159. package/types/helper/converter.d.ts +197 -0
  160. package/types/helper/dom/domCheck.d.ts +189 -0
  161. package/types/helper/dom/domQuery.d.ts +223 -0
  162. package/types/helper/dom/domUtils.d.ts +226 -0
  163. package/types/helper/dom/index.d.ts +9 -0
  164. package/types/helper/env.d.ts +132 -0
  165. package/types/helper/index.d.ts +174 -0
  166. package/types/helper/keyCodeMap.d.ts +110 -0
  167. package/types/helper/numbers.d.ts +46 -0
  168. package/types/helper/unicode.d.ts +28 -0
  169. package/types/index.d.ts +120 -0
  170. package/{typings/Lang.d.ts → types/langs/_Lang.d.ts} +173 -103
  171. package/types/langs/ckb.d.ts +3 -0
  172. package/types/langs/cs.d.ts +3 -0
  173. package/types/langs/da.d.ts +3 -0
  174. package/types/langs/de.d.ts +3 -0
  175. package/types/langs/en.d.ts +3 -0
  176. package/types/langs/es.d.ts +3 -0
  177. package/types/langs/fa.d.ts +3 -0
  178. package/types/langs/fr.d.ts +3 -0
  179. package/types/langs/he.d.ts +3 -0
  180. package/types/langs/hu.d.ts +3 -0
  181. package/types/langs/index.d.ts +54 -0
  182. package/types/langs/it.d.ts +3 -0
  183. package/types/langs/ja.d.ts +3 -0
  184. package/types/langs/km.d.ts +3 -0
  185. package/types/langs/ko.d.ts +3 -0
  186. package/types/langs/lv.d.ts +3 -0
  187. package/types/langs/nl.d.ts +3 -0
  188. package/types/langs/pl.d.ts +3 -0
  189. package/types/langs/pt_br.d.ts +3 -0
  190. package/types/langs/ro.d.ts +3 -0
  191. package/types/langs/ru.d.ts +3 -0
  192. package/types/langs/se.d.ts +3 -0
  193. package/types/langs/tr.d.ts +3 -0
  194. package/types/langs/uk.d.ts +3 -0
  195. package/types/langs/ur.d.ts +3 -0
  196. package/types/langs/zh_cn.d.ts +3 -0
  197. package/types/modules/ApiManager.d.ts +125 -0
  198. package/types/modules/Browser.d.ts +326 -0
  199. package/types/modules/ColorPicker.d.ts +131 -0
  200. package/types/modules/Controller.d.ts +251 -0
  201. package/types/modules/Figure.d.ts +517 -0
  202. package/types/modules/FileManager.d.ts +202 -0
  203. package/types/modules/HueSlider.d.ts +136 -0
  204. package/types/modules/Modal.d.ts +111 -0
  205. package/types/modules/ModalAnchorEditor.d.ts +236 -0
  206. package/types/modules/SelectMenu.d.ts +194 -0
  207. package/types/modules/_DragHandle.d.ts +7 -0
  208. package/types/modules/index.d.ts +26 -0
  209. package/types/plugins/browser/audioGallery.d.ts +55 -0
  210. package/types/plugins/browser/fileBrowser.d.ts +64 -0
  211. package/types/plugins/browser/fileGallery.d.ts +55 -0
  212. package/types/plugins/browser/imageGallery.d.ts +51 -0
  213. package/types/plugins/browser/videoGallery.d.ts +57 -0
  214. package/types/plugins/command/blockquote.d.ts +28 -0
  215. package/types/plugins/command/exportPDF.d.ts +46 -0
  216. package/types/plugins/command/fileUpload.d.ts +156 -0
  217. package/types/plugins/command/list_bulleted.d.ts +46 -0
  218. package/types/plugins/command/list_numbered.d.ts +46 -0
  219. package/types/plugins/dropdown/align.d.ts +60 -0
  220. package/types/plugins/dropdown/backgroundColor.d.ts +63 -0
  221. package/types/plugins/dropdown/font.d.ts +54 -0
  222. package/types/plugins/dropdown/fontColor.d.ts +63 -0
  223. package/types/plugins/dropdown/formatBlock.d.ts +54 -0
  224. package/types/plugins/dropdown/hr.d.ts +71 -0
  225. package/types/plugins/dropdown/layout.d.ts +40 -0
  226. package/types/plugins/dropdown/lineHeight.d.ts +50 -0
  227. package/types/plugins/dropdown/list.d.ts +39 -0
  228. package/types/plugins/dropdown/paragraphStyle.d.ts +54 -0
  229. package/types/plugins/dropdown/table.d.ts +627 -0
  230. package/types/plugins/dropdown/template.d.ts +40 -0
  231. package/types/plugins/dropdown/textStyle.d.ts +41 -0
  232. package/types/plugins/field/mention.d.ts +102 -0
  233. package/types/plugins/index.d.ts +107 -0
  234. package/types/plugins/input/fontSize.d.ts +170 -0
  235. package/types/plugins/input/pageNavigator.d.ts +28 -0
  236. package/types/plugins/modal/audio.d.ts +269 -0
  237. package/types/plugins/modal/drawing.d.ts +246 -0
  238. package/types/plugins/modal/embed.d.ts +387 -0
  239. package/types/plugins/modal/image.d.ts +451 -0
  240. package/types/plugins/modal/link.d.ts +128 -0
  241. package/types/plugins/modal/math.d.ts +193 -0
  242. package/types/plugins/modal/video.d.ts +485 -0
  243. package/types/plugins/popup/anchor.d.ts +56 -0
  244. package/types/suneditor.d.ts +51 -0
  245. package/types/typedef.d.ts +233 -0
  246. package/.eslintignore +0 -7
  247. package/.eslintrc.json +0 -64
  248. package/src/assets/icons/_default.js +0 -194
  249. package/src/core/base/events.js +0 -320
  250. package/src/core/class/notice.js +0 -42
  251. package/src/helper/domUtils.js +0 -1177
  252. package/src/modules/FileBrowser.js +0 -271
  253. package/src/plugins/command/exportPdf.js +0 -168
  254. package/src/plugins/fileBrowser/imageGallery.js +0 -81
  255. package/src/themes/test.css +0 -61
  256. package/typings/CommandPlugin.d.ts +0 -8
  257. package/typings/DialogPlugin.d.ts +0 -20
  258. package/typings/FileBrowserPlugin.d.ts +0 -30
  259. package/typings/Module.d.ts +0 -15
  260. package/typings/Plugin.d.ts +0 -42
  261. package/typings/SubmenuPlugin.d.ts +0 -8
  262. package/typings/_classes.d.ts +0 -17
  263. package/typings/_colorPicker.d.ts +0 -60
  264. package/typings/_core.d.ts +0 -55
  265. package/typings/align.d.ts +0 -5
  266. package/typings/audio.d.ts +0 -5
  267. package/typings/backgroundColor.d.ts +0 -5
  268. package/typings/blockquote.d.ts +0 -5
  269. package/typings/char.d.ts +0 -39
  270. package/typings/component.d.ts +0 -38
  271. package/typings/context.d.ts +0 -39
  272. package/typings/converter.d.ts +0 -33
  273. package/typings/dialog.d.ts +0 -28
  274. package/typings/domUtils.d.ts +0 -361
  275. package/typings/editor.d.ts +0 -7
  276. package/typings/editor.ts +0 -542
  277. package/typings/env.d.ts +0 -70
  278. package/typings/eventManager.d.ts +0 -37
  279. package/typings/events.d.ts +0 -262
  280. package/typings/fileBrowser.d.ts +0 -42
  281. package/typings/fileManager.d.ts +0 -67
  282. package/typings/font.d.ts +0 -5
  283. package/typings/fontColor.d.ts +0 -5
  284. package/typings/fontSize.d.ts +0 -5
  285. package/typings/format.d.ts +0 -191
  286. package/typings/formatBlock.d.ts +0 -5
  287. package/typings/history.d.ts +0 -48
  288. package/typings/horizontalRule.d.ts +0 -5
  289. package/typings/image.d.ts +0 -5
  290. package/typings/imageGallery.d.ts +0 -5
  291. package/typings/index.d.ts +0 -21
  292. package/typings/index.modules.d.ts +0 -11
  293. package/typings/index.plugins.d.ts +0 -58
  294. package/typings/lineHeight.d.ts +0 -5
  295. package/typings/link.d.ts +0 -5
  296. package/typings/list.d.ts +0 -5
  297. package/typings/math.d.ts +0 -5
  298. package/typings/mediaContainer.d.ts +0 -25
  299. package/typings/mention.d.ts +0 -5
  300. package/typings/node.d.ts +0 -57
  301. package/typings/notice.d.ts +0 -16
  302. package/typings/numbers.d.ts +0 -29
  303. package/typings/offset.d.ts +0 -24
  304. package/typings/options.d.ts +0 -589
  305. package/typings/paragraphStyle.d.ts +0 -5
  306. package/typings/resizing.d.ts +0 -141
  307. package/typings/selection.d.ts +0 -94
  308. package/typings/shortcuts.d.ts +0 -13
  309. package/typings/suneditor.d.ts +0 -9
  310. package/typings/table.d.ts +0 -5
  311. package/typings/template.d.ts +0 -5
  312. package/typings/textStyle.d.ts +0 -5
  313. package/typings/toolbar.d.ts +0 -32
  314. package/typings/unicode.d.ts +0 -25
  315. package/typings/video.d.ts +0 -5
@@ -1,14 +1,25 @@
1
1
  /**
2
- * @fileoverview Menu class
2
+ * @fileoverview Toolbar Menu class
3
3
  */
4
4
 
5
5
  import CoreInjector from '../../editorInjector/_core';
6
- import { domUtils, converter } from '../../helper';
6
+ import { dom, converter } from '../../helper';
7
7
 
8
- const Menu = function (editor) {
8
+ /**
9
+ * @typedef {Omit<Menu & Partial<__se__EditorInjector>, 'menu'>} MenuThis
10
+ */
11
+
12
+ /**
13
+ * @constructor
14
+ * @this {MenuThis}
15
+ * @description Dropdown and container menu management class
16
+ * @param {__se__EditorCore} editor - The root editor instance
17
+ */
18
+ function Menu(editor) {
9
19
  CoreInjector.call(this, editor);
10
20
 
11
- // members--
21
+ // members
22
+ /** @type {Object<string, HTMLElement>} */
12
23
  this.targetMap = {};
13
24
  this.index = -1;
14
25
  this.menus = [];
@@ -20,6 +31,7 @@ const Menu = function (editor) {
20
31
  // container
21
32
  this.currentContainer = null;
22
33
  this.currentContainerActiveButton = null;
34
+ this.currentContainerName = '';
23
35
  // event
24
36
  this._dropdownCommands = [];
25
37
  this.__globalEventHandler = {
@@ -33,37 +45,43 @@ const Menu = function (editor) {
33
45
  this._bindClose_dropdown_key = null;
34
46
  this._bindClose_cons_mouse = null;
35
47
  this.currentDropdownPlugin = null;
36
- };
48
+
49
+ // eventManager member (viewport)
50
+ this.__menuBtn = null;
51
+ this.__menuContainer = null;
52
+ }
37
53
 
38
54
  Menu.prototype = {
39
55
  /**
56
+ * @this {MenuThis}
40
57
  * @description Method for managing dropdown element.
41
- * You must add the "dropdown" element using the this method at custom plugin.
58
+ * - You must add the "dropdown" element using the this method at custom plugin.
42
59
  * @param {{key: string, type: string}} classObj Class object
43
- * @param {Element} menu Dropdown element
60
+ * @param {Node} menu Dropdown element
44
61
  */
45
62
  initDropdownTarget({ key, type }, menu) {
46
63
  if (key) {
47
64
  if (!/free$/.test(type)) {
48
- menu.setAttribute('data-key', key);
65
+ /** @type {HTMLElement} */ (menu).setAttribute('data-key', key);
49
66
  this._dropdownCommands.push(key);
50
67
  }
51
68
  this.context.get('menuTray').appendChild(menu);
52
- this.targetMap[key] = menu;
69
+ this.targetMap[key] = /** @type {HTMLElement} */ (menu);
53
70
  } else {
54
71
  throw Error("[SUNEDITOR.init.fail] The plugin's key is not added.");
55
72
  }
56
73
  },
57
74
 
58
75
  /**
76
+ * @this {MenuThis}
59
77
  * @description On dropdown
60
- * @param {Element} button Dropdown's button element to call
78
+ * @param {Node} button Dropdown's button element to call
61
79
  */
62
80
  dropdownOn(button) {
63
81
  this.__removeGlobalEvent();
64
82
  const moreBtn = this._checkMoreLayer(button);
65
83
  if (moreBtn) {
66
- const target = domUtils.getParentElement(moreBtn, '.se-btn-tray').querySelector('[data-command="' + moreBtn.getAttribute('data-ref') + '"]');
84
+ const target = dom.query.getParentElement(moreBtn, '.se-btn-tray').querySelector('[data-command="' + moreBtn.getAttribute('data-ref') + '"]');
67
85
  if (target) {
68
86
  this.editor.runFromTarget(target);
69
87
  this.dropdownOn(button);
@@ -71,15 +89,16 @@ Menu.prototype = {
71
89
  }
72
90
  }
73
91
 
74
- const dropdownName = (this.currentDropdownName = button.getAttribute('data-command'));
75
- this.currentDropdownType = button.getAttribute('data-type');
92
+ const btnEl = /** @type {HTMLButtonElement} */ (button);
93
+ const dropdownName = (this.currentDropdownName = btnEl.getAttribute('data-command'));
94
+ this.currentDropdownType = btnEl.getAttribute('data-type');
76
95
  const menu = (this.currentDropdown = this.targetMap[dropdownName]);
77
- this.currentDropdownActiveButton = button;
78
- this._setMenuPosition(button, menu);
96
+ this.currentDropdownActiveButton = btnEl;
97
+ this._setMenuPosition(btnEl, menu);
79
98
 
80
99
  this._bindClose_dropdown_mouse = this.eventManager.addGlobalEvent('mousedown', this.__globalEventHandler.mousedown, false);
81
100
  if (this._dropdownCommands.includes(dropdownName)) {
82
- this.menus = converter.nodeListToArray(menu.querySelectorAll('.se-toolbar-btn[data-command]'));
101
+ this.menus = converter.nodeListToArray(menu.querySelectorAll('[data-command]'));
83
102
  if (this.menus.length > 0) {
84
103
  this._bindClose_dropdown_key = this.eventManager.addGlobalEvent('keydown', this.__globalEventHandler.keydown, false);
85
104
  menu.addEventListener('mousemove', this.__globalEventHandler.mousemove, false);
@@ -88,17 +107,20 @@ Menu.prototype = {
88
107
  }
89
108
 
90
109
  this.currentDropdownPlugin = this.plugins[dropdownName];
91
- if (typeof this.currentDropdownPlugin?.on === 'function') this.currentDropdownPlugin.on(button);
92
- this.editor._antiBlur = true;
110
+ if (typeof this.currentDropdownPlugin?.on === 'function') this.currentDropdownPlugin.on(btnEl);
111
+ this.editor._preventBlur = true;
93
112
  },
94
113
 
95
114
  /**
115
+ * @this {MenuThis}
96
116
  * @description Off dropdown
97
117
  */
98
118
  dropdownOff() {
99
119
  this.__removeGlobalEvent();
100
120
  this.index = -1;
101
121
  this.menus = [];
122
+ this.__menuBtn = null;
123
+ this.__menuContainer = null;
102
124
 
103
125
  if (this.currentDropdown) {
104
126
  this.currentDropdownName = '';
@@ -106,72 +128,95 @@ Menu.prototype = {
106
128
  this.currentDropdown.style.display = 'none';
107
129
  this.currentDropdown = null;
108
130
  if (this.currentDropdownActiveButton) {
109
- domUtils.removeClass(this.currentDropdownActiveButton.parentElement.children, 'on');
131
+ dom.utils.removeClass(this.currentDropdownActiveButton.parentElement.children, 'on');
110
132
  }
111
133
  this.currentDropdownActiveButton = null;
112
134
  this.editor._notHideToolbar = false;
113
135
  }
114
136
 
115
- this.editor._antiBlur = false;
137
+ this.editor._preventBlur = false;
116
138
 
117
139
  if (typeof this.currentDropdownPlugin?.off === 'function') this.currentDropdownPlugin.off();
118
140
  this.currentDropdownPlugin = null;
119
141
  },
120
142
 
121
143
  /**
144
+ * @this {MenuThis}
122
145
  * @description On menu container
123
- * @param {Element} button Container's button element to call
146
+ * @param {Node} button Container's button element to call
124
147
  */
125
148
  containerOn(button) {
126
149
  this.__removeGlobalEvent();
127
150
 
128
- const containerName = (this._containerName = button.getAttribute('data-command'));
129
- this.currentContainerActiveButton = button;
151
+ this.currentContainerActiveButton = /** @type {HTMLButtonElement} */ (button);
152
+ const containerName = (this.currentContainerName = this.currentContainerActiveButton.getAttribute('data-command'));
130
153
  this._setMenuPosition(button, (this.currentContainer = this.targetMap[containerName]));
131
154
 
132
155
  this._bindClose_cons_mouse = this.eventManager.addGlobalEvent('mousedown', this.__globalEventHandler.containerDown, false);
133
156
 
134
157
  if (this.plugins[containerName].on) this.plugins[containerName].on(button);
135
- this.editor._antiBlur = true;
158
+ this.editor._preventBlur = true;
136
159
  },
137
160
 
138
161
  /**
162
+ * @this {MenuThis}
139
163
  * @description Off menu container
140
164
  */
141
165
  containerOff() {
142
166
  this.__removeGlobalEvent();
143
167
 
144
168
  if (this.currentContainer) {
145
- this._containerName = '';
169
+ this.currentContainerName = '';
146
170
  this.currentContainer.style.display = 'none';
147
171
  this.currentContainer = null;
148
- domUtils.removeClass(this.currentContainerActiveButton, 'on');
172
+ dom.utils.removeClass(this.currentContainerActiveButton, 'on');
149
173
  this.currentContainerActiveButton = null;
150
174
  this.editor._notHideToolbar = false;
151
175
  }
152
176
 
153
- this.editor._antiBlur = false;
177
+ this.editor._preventBlur = false;
154
178
  },
155
179
 
156
180
  /**
157
- * @description Set the menu position. (dropdown, container)
158
- * @param {*} element Button element
159
- * @param {*} menu Menu element
160
181
  * @private
182
+ * @this {MenuThis}
183
+ * @description Set the menu position.
184
+ * @param {Node} element Button element
185
+ * @param {HTMLElement} menu Menu element
161
186
  */
162
187
  _setMenuPosition(element, menu) {
163
188
  menu.style.visibility = 'hidden';
164
189
  menu.style.display = 'block';
165
190
  menu.style.height = '';
166
- domUtils.addClass(element.parentElement.children, 'on');
191
+ dom.utils.addClass(element.parentElement.children, 'on');
167
192
 
168
- this.offset.setRelPosition(menu, this.carrierWrapper, element.parentElement, domUtils.getParentElement(element, '.se-toolbar'), false);
193
+ this.offset.setRelPosition(menu, this.carrierWrapper, element.parentElement, dom.query.getParentElement(element, '.se-toolbar'), false);
169
194
 
170
195
  menu.style.visibility = '';
196
+
197
+ this.__menuBtn = element;
198
+ this.__menuContainer = menu;
199
+ },
200
+
201
+ /**
202
+ * @private
203
+ * @this {MenuThis}
204
+ * @description Restore the last menu position using previously stored button and menu elements.
205
+ */
206
+ _restoreMenuPosition() {
207
+ if (!this.__menuBtn || !this.__menuContainer) return;
208
+ this._setMenuPosition(this.__menuBtn, this.__menuContainer);
171
209
  },
172
210
 
211
+ /**
212
+ * @private
213
+ * @this {MenuThis}
214
+ * @description Check if the element is part of a more layer
215
+ * @param {Node} element The element to check
216
+ * @returns {HTMLElement|null} The more layer element or null
217
+ */
173
218
  _checkMoreLayer(element) {
174
- const more = domUtils.getParentElement(element, '.se-more-layer');
219
+ const more = dom.query.getParentElement(element, '.se-more-layer');
175
220
  if (more && more.style.display !== 'block') {
176
221
  return more.getAttribute('data-ref') ? more : null;
177
222
  } else {
@@ -179,29 +224,40 @@ Menu.prototype = {
179
224
  }
180
225
  },
181
226
 
227
+ /**
228
+ * @private
229
+ * @this {MenuThis}
230
+ * @description Move the selected item in the dropdown menu
231
+ * @param {number} num Direction and amount to move (-1 for up, 1 for down)
232
+ */
182
233
  _moveItem(num) {
183
- domUtils.removeClass(this.currentDropdown, 'se-select-menu-mouse-move');
184
- domUtils.addClass(this.currentDropdown, 'se-select-menu-key-action');
234
+ dom.utils.removeClass(this.currentDropdown, 'se-select-menu-mouse-move');
235
+ dom.utils.addClass(this.currentDropdown, 'se-select-menu-key-action');
185
236
  num = this.index + num;
186
237
  const len = this.menus.length;
187
238
  const selectIndex = (this.index = num >= len ? 0 : num < 0 ? len - 1 : num);
188
239
 
189
240
  for (let i = 0; i < len; i++) {
190
241
  if (i === selectIndex) {
191
- domUtils.addClass(this.menus[i], 'on');
242
+ dom.utils.addClass(this.menus[i], 'on');
192
243
  } else {
193
- domUtils.removeClass(this.menus[i], 'on');
244
+ dom.utils.removeClass(this.menus[i], 'on');
194
245
  }
195
246
  }
196
247
  },
197
248
 
249
+ /**
250
+ * @private
251
+ * @this {MenuThis}
252
+ * @description Remove global event listeners
253
+ */
198
254
  __removeGlobalEvent() {
199
255
  if (this._bindClose_dropdown_mouse) this._bindClose_dropdown_mouse = this.eventManager.removeGlobalEvent(this._bindClose_dropdown_mouse);
200
256
  if (this._bindClose_cons_mouse) this._bindClose_cons_mouse = this.eventManager.removeGlobalEvent(this._bindClose_cons_mouse);
201
257
  if (this._bindClose_dropdown_key) {
202
258
  this._bindClose_dropdown_key = this.eventManager.removeGlobalEvent(this._bindClose_dropdown_key);
203
- domUtils.removeClass(this.menus, 'on');
204
- domUtils.removeClass(this.currentDropdown, 'se-select-menu-key-action|se-select-menu-mouse-move');
259
+ dom.utils.removeClass(this.menus, 'on');
260
+ dom.utils.removeClass(this.currentDropdown, 'se-select-menu-key-action|se-select-menu-mouse-move');
205
261
  this.currentDropdown.removeEventListener('mousemove', this.__globalEventHandler.mousemove, false);
206
262
  this.currentDropdown.removeEventListener('mouseout', this.__globalEventHandler.mouseout, false);
207
263
  }
@@ -210,30 +266,55 @@ Menu.prototype = {
210
266
  constructor: Menu
211
267
  };
212
268
 
269
+ /**
270
+ * @private
271
+ * @this {MenuThis}
272
+ * @param {MouseEvent} e - Event object
273
+ */
213
274
  function OnMouseDown_dropdown(e) {
214
- if (domUtils.getParentElement(e.target, '.se-dropdown')) return;
275
+ const eventTarget = dom.query.getEventTarget(e);
276
+ if (dom.query.getParentElement(eventTarget, '.se-dropdown')) return;
215
277
  this.dropdownOff();
216
278
  }
217
279
 
280
+ /**
281
+ * @private
282
+ * @this {MenuThis}
283
+ */
218
284
  function OnMouseout_dropdown() {
219
285
  this.index = -1;
220
286
  }
221
287
 
288
+ /**
289
+ * @private
290
+ * @this {MenuThis}
291
+ * @param {KeyboardEvent} e - Event object
292
+ */
222
293
  function OnKeyDown_dropdown(e) {
223
- const keyCode = e.keyCode;
294
+ const keyCode = e.code;
224
295
  switch (keyCode) {
225
- case 38: // up
296
+ case 'ArrowUp': // up
226
297
  e.preventDefault();
227
298
  e.stopPropagation();
228
299
  this._moveItem(-1);
229
300
  break;
230
- case 40: // down
301
+ case 'ArrowDown': // down
231
302
  e.preventDefault();
232
303
  e.stopPropagation();
233
304
  this._moveItem(1);
234
305
  break;
235
- case 13:
236
- case /* enter, space */ 32: {
306
+ case 'ArrowLeft': // left
307
+ e.preventDefault();
308
+ e.stopPropagation();
309
+ this._moveItem(-1);
310
+ break;
311
+ case 'ArrowRight': //right
312
+ e.preventDefault();
313
+ e.stopPropagation();
314
+ this._moveItem(1);
315
+ break;
316
+ case 'Enter':
317
+ case 'Space': /* enter, space */ {
237
318
  if (this.index < 0) break;
238
319
 
239
320
  const target = this.menus[this.index];
@@ -248,9 +329,14 @@ function OnKeyDown_dropdown(e) {
248
329
  }
249
330
  }
250
331
 
332
+ /**
333
+ * @private
334
+ * @this {MenuThis}
335
+ * @param {MouseEvent} e - Event object
336
+ */
251
337
  function OnMousemove_dropdown(e) {
252
- domUtils.addClass(this.currentDropdown, 'se-select-menu-mouse-move');
253
- domUtils.removeClass(this.currentDropdown, 'se-select-menu-key-action');
338
+ dom.utils.addClass(this.currentDropdown, 'se-select-menu-mouse-move');
339
+ dom.utils.removeClass(this.currentDropdown, 'se-select-menu-key-action');
254
340
 
255
341
  const index = this.menus.indexOf(e.target);
256
342
  if (index === -1) return;