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,56 +1,76 @@
1
1
  import CoreInjector from '../editorInjector/_core';
2
- import { domUtils, env } from '../helper';
2
+ import { dom, env, keyCodeMap } from '../helper';
3
3
 
4
4
  const MENU_MIN_HEIGHT = 38;
5
5
 
6
6
  /**
7
- *
8
- * @param {*} inst
9
- * @param {object} params { checkList: boolean, position: "[left|right]-[middle|top|bottom] | [top|bottom]-[center|left|right]", dir?: "rtl" | "ltr" }
7
+ * @typedef {Object} SelectMenuParams
8
+ * @property {string} position Position of the select menu, specified as "[left|right]-[middle|top|bottom]" or "[top|bottom]-[center|left|right]"
9
+ * @property {boolean} [checkList=false] Flag to determine if the checklist is enabled (true or false)
10
+ * @property {"rtl" | "ltr"} [dir="ltr"] Optional text direction: "rtl" for right-to-left, "ltr" for left-to-right
11
+ * @property {number} [splitNum=0] Optional split number for horizontal positioning; defines how many items per row
12
+ * @property {() => void=} openMethod Optional method to call when the menu is opened
13
+ * @property {() => void=} closeMethod Optional method to call when the menu is closed
10
14
  */
11
- const SelectMenu = function (inst, params) {
12
- // plugin bisic properties
13
- CoreInjector.call(this, inst.editor);
14
-
15
- // members
16
- this.kink = inst.constructor.key || inst.constructor.name;
17
- this.inst = inst;
18
- const positionItems = params.position.split('-');
19
- this.form = null;
20
- this.items = [];
21
- this.menus = [];
22
- this.menuLen = 0;
23
- this.index = -1;
24
- this.item = null;
25
- this.isOpen = false;
26
- this.checkList = !!params.checkList;
27
- this.position = positionItems[0];
28
- this.subPosition = positionItems[1];
29
- this._dirPosition = /^(left|right)$/.test(this.position) ? (this.position === 'left' ? 'right' : 'left') : this.position;
30
- this._dirSubPosition = /^(left|right)$/.test(this.subPosition) ? (this.subPosition === 'left' ? 'right' : 'left') : this.subPosition;
31
- this._textDirDiff = params.dir === 'ltr' ? false : params.dir === 'rtl' ? true : null;
32
- this.splitNum = params.splitNum || 0;
33
- this.horizontal = !!this.splitNum;
34
- this.openMethod = params.openMethod;
35
- this.closeMethod = params.closeMethod;
36
- this._refer = null;
37
- this._keydownTarget = null;
38
- this._selectMethod = null;
39
- this._bindClose_key = null;
40
- this._bindClose_mousedown = null;
41
- this._bindClose_click = null;
42
- this._closeSignal = false;
43
- this.__events = [];
44
- this.__eventHandlers = {
45
- mousedown: OnMousedown_list.bind(this.eventManager),
46
- mousemove: OnMouseMove_list.bind(this),
47
- click: OnClick_list.bind(this),
48
- keydown: OnKeyDown_refer.bind(this)
49
- };
50
- this.__globalEventHandlers = { keydown: CloseListener_key.bind(this), mousedown: CloseListener_mousedown.bind(this), click: CloseListener_click.bind(this) };
51
- };
52
-
53
- SelectMenu.prototype = {
15
+
16
+ /**
17
+ * @class
18
+ * @description Creates a select menu
19
+ */
20
+ class SelectMenu extends CoreInjector {
21
+ /**
22
+ * @constructor
23
+ * @param {*} inst The instance object that called the constructor.
24
+ * @param {SelectMenuParams} params Select menu options
25
+ */
26
+ constructor(inst, params) {
27
+ // plugin bisic properties
28
+ super(inst.editor);
29
+
30
+ // members
31
+ this.kink = inst.constructor.key || inst.constructor.name;
32
+ this.inst = inst;
33
+ const positionItems = params.position.split('-');
34
+ this.form = null;
35
+ this.items = [];
36
+ /** @type {HTMLLIElement[]} */
37
+ this.menus = null;
38
+ this.menuLen = 0;
39
+ this.index = -1;
40
+ this.item = null;
41
+ this.isOpen = false;
42
+ this.checkList = !!params.checkList;
43
+ this.position = positionItems[0];
44
+ this.subPosition = positionItems[1];
45
+ this._dirPosition = /^(left|right)$/.test(this.position) ? (this.position === 'left' ? 'right' : 'left') : this.position;
46
+ this._dirSubPosition = /^(left|right)$/.test(this.subPosition) ? (this.subPosition === 'left' ? 'right' : 'left') : this.subPosition;
47
+ this._textDirDiff = params.dir === 'ltr' ? false : params.dir === 'rtl' ? true : null;
48
+ this.splitNum = params.splitNum || 0;
49
+ this.horizontal = !!this.splitNum;
50
+ this.openMethod = params.openMethod;
51
+ this.closeMethod = params.closeMethod;
52
+ this._refer = null;
53
+ this._keydownTarget = null;
54
+ this._selectMethod = null;
55
+ this._bindClose_key = null;
56
+ this._bindClose_mousedown = null;
57
+ this._bindClose_click = null;
58
+ this._closeSignal = false;
59
+ this.__events = null;
60
+ this.__eventHandlers = {
61
+ mousedown: this.#OnMousedown_list.bind(this),
62
+ mousemove: this.#OnMouseMove_list.bind(this),
63
+ click: this.#OnClick_list.bind(this),
64
+ keydown: this.#OnKeyDown_refer.bind(this)
65
+ };
66
+ this.__globalEventHandlers = { keydown: this.#CloseListener_key.bind(this), mousedown: this.#CloseListener_mousedown.bind(this), click: this.#CloseListener_click.bind(this) };
67
+ }
68
+
69
+ /**
70
+ * @description Creates the select menu items.
71
+ * @param {Array<string>|__se__NodeCollection} items - Command list of selectable items.
72
+ * @param {Array<string>|__se__NodeCollection} [menus] - Optional list of menu display elements; defaults to `items`.
73
+ */
54
74
  create(items, menus) {
55
75
  this.form.firstElementChild.innerHTML = '';
56
76
  menus = menus || items;
@@ -60,21 +80,27 @@ SelectMenu.prototype = {
60
80
  this._createFormat(html);
61
81
  html = '';
62
82
  }
63
- html += `<li class="se-select-item" data-index="${i}">${typeof menus[i] === 'string' ? menus[i] : menus[i].outerHTML}</li>`;
83
+ html += `<li class="se-select-item" data-index="${i}">${typeof menus[i] === 'string' ? menus[i] : /** @type {HTMLElement} */ (menus[i]).outerHTML}</li>`;
64
84
  }
65
85
  this._createFormat(html);
66
86
 
67
- this.items = items;
68
- this.menus = this.form.querySelectorAll('li');
87
+ this.items = /** @type {Array<string|Node>} */ (items);
88
+ this.menus = Array.from(this.form.querySelectorAll('li'));
69
89
  this.menuLen = this.menus.length;
70
- },
90
+ }
71
91
 
92
+ /**
93
+ * @description Initializes the select menu and attaches it to a reference element.
94
+ * @param {Node} referElement - The element that triggers the select menu.
95
+ * @param {(command: string) => void} selectMethod - The function to execute when an item is selected.
96
+ * @param {{class?: string, style?: string}} [attr={}] - Additional attributes for the select menu container.
97
+ */
72
98
  on(referElement, selectMethod, attr) {
73
99
  if (!attr) attr = {};
74
- this._refer = referElement;
75
- this._keydownTarget = domUtils.isInputElement(referElement) ? referElement : this._w;
100
+ this._refer = /** @type {HTMLElement} */ (referElement);
101
+ this._keydownTarget = dom.check.isInputElement(referElement) ? referElement : this._w;
76
102
  this._selectMethod = selectMethod;
77
- this.form = domUtils.createElement(
103
+ this.form = dom.utils.createElement(
78
104
  'DIV',
79
105
  {
80
106
  class: 'se-select-menu' + (attr.class ? ' ' + attr.class : ''),
@@ -83,12 +109,12 @@ SelectMenu.prototype = {
83
109
  '<div class="se-list-inner"></div>'
84
110
  );
85
111
  referElement.parentNode.insertBefore(this.form, referElement);
86
- },
112
+ }
87
113
 
88
114
  /**
89
115
  * @description Select menu open
90
- * @param {string|null|undefined} position "[left|right]-[middle|top|bottom] | [top|bottom]-[center|left|right]"
91
- * @param {string|null|undefined} onItemQuerySelector The querySelector string of the menu to be activated
116
+ * @param {?string=} position "[left|right]-[middle|top|bottom] | [top|bottom]-[center|left|right]"
117
+ * @param {?string=} onItemQuerySelector The querySelector string of the menu to be activated
92
118
  */
93
119
  open(position, onItemQuerySelector) {
94
120
  this.editor.selectMenuOn = true;
@@ -100,69 +126,102 @@ SelectMenu.prototype = {
100
126
  const subPosition = positionItems[1] || (this._textDirDiff !== null && this._textDirDiff !== this.options.get('_rtl') ? this._dirSubPosition : this.subPosition);
101
127
  this._setPosition(mainPosition, subPosition, onItemQuerySelector);
102
128
  this.isOpen = true;
103
- },
129
+ }
104
130
 
131
+ /**
132
+ * @description Select menu close
133
+ */
105
134
  close() {
106
135
  this.editor.selectMenuOn = false;
107
- domUtils.removeClass(this._refer, 'on');
136
+ dom.utils.removeClass(this._refer, 'on');
108
137
  this._init();
109
138
  if (this.form) this.form.style.cssText = '';
110
139
  this.isOpen = false;
111
140
  if (typeof this.closeMethod === 'function') this.closeMethod();
112
- },
141
+ }
113
142
 
143
+ /**
144
+ * @description Get the index of the selected item
145
+ * @param {number} index Item index
146
+ * @returns
147
+ */
114
148
  getItem(index) {
115
149
  return this.items[index];
116
- },
150
+ }
117
151
 
152
+ /**
153
+ * @description Set the index of the selected item
154
+ * @param {number} index Item index
155
+ */
118
156
  setItem(index) {
119
157
  this._selectItem(index);
120
- },
158
+ }
121
159
 
160
+ /**
161
+ * @private
162
+ * @description Appends a formatted list of items to the menu.
163
+ * @param {string} html - The HTML string representing the menu items.
164
+ */
122
165
  _createFormat(html) {
123
166
  this.form.firstElementChild.innerHTML += `<ul class="se-list-basic se-list-checked${this.horizontal ? ' se-list-horizontal' : ''}">${html}</ul>`;
124
- },
167
+ }
125
168
 
169
+ /**
170
+ * @private
171
+ * @description Resets the menu state and removes event listeners.
172
+ */
126
173
  _init() {
127
174
  this.__removeEvents();
128
175
  this.__removeGlobalEvent();
129
176
  this.index = -1;
130
177
  this.item = null;
131
178
  if (this._onItem) {
132
- domUtils.removeClass(this._onItem, 'se-select-on');
179
+ dom.utils.removeClass(this._onItem, 'se-select-on');
133
180
  this._onItem = null;
134
181
  }
135
- },
182
+ }
136
183
 
184
+ /**
185
+ * @private
186
+ * @description Moves the selection up or down by a specified number of items.
187
+ * @param {number} num - The number of items to move (negative for up, positive for down).
188
+ */
137
189
  _moveItem(num) {
138
190
  num = this.index + num;
139
191
  const len = this.menuLen;
140
192
  const selectIndex = (this.index = num >= len ? 0 : num < 0 ? len - 1 : num);
141
193
 
142
194
  this._selectItem(selectIndex);
143
- },
195
+ }
144
196
 
197
+ /**
198
+ * @private
199
+ * @description Highlights and selects an item by index.
200
+ * @param {number} selectIndex - The index of the item to select.
201
+ */
145
202
  _selectItem(selectIndex) {
146
- domUtils.removeClass(this.form, 'se-select-menu-mouse-move');
203
+ dom.utils.removeClass(this.form, 'se-select-menu-mouse-move');
147
204
 
148
205
  const len = this.menuLen;
149
206
  for (let i = 0; i < len; i++) {
150
207
  if (i === selectIndex) {
151
- domUtils.addClass(this.menus[i], 'active');
208
+ dom.utils.addClass(this.menus[i], 'active');
152
209
  } else {
153
- domUtils.removeClass(this.menus[i], 'active');
210
+ dom.utils.removeClass(this.menus[i], 'active');
154
211
  }
155
212
  }
156
213
 
157
214
  this.index = selectIndex;
158
215
  this.item = this.items[selectIndex];
159
- },
216
+ }
160
217
 
161
218
  /**
162
- * @description Menu open
163
- * @param {["left"|"right"] | ["top"|"bottom"]} position Menu position
164
- * @param {["middle"|"top"|"bottom"] | ["center"|"left"|"right"]} subPosition Sub position
165
219
  * @private
220
+ * @description Sets the position of the select menu relative to the reference element.
221
+ * @param {string} position Menu position ("left"|"right") | ("top"|"bottom")
222
+ * @param {string} subPosition Sub position ("middle"|"top"|"bottom") | ("center"|"left"|"right")
223
+ * @param {string} [onItemQuerySelector] - A query selector string to highlight a specific item.
224
+ * @param {boolean} [_re=false] - Whether this is a retry after adjusting the position.
166
225
  */
167
226
  _setPosition(position, subPosition, onItemQuerySelector, _re) {
168
227
  const originP = position;
@@ -170,8 +229,8 @@ SelectMenu.prototype = {
170
229
  const target = this._refer;
171
230
  form.style.visibility = 'hidden';
172
231
  form.style.display = 'block';
173
- domUtils.removeClass(form, 'se-select-menu-scroll');
174
- domUtils.addClass(target, 'on');
232
+ dom.utils.removeClass(form, 'se-select-menu-scroll');
233
+ dom.utils.addClass(target, 'on');
175
234
 
176
235
  const formW = form.offsetWidth;
177
236
  const targetW = target.offsetWidth;
@@ -195,7 +254,7 @@ SelectMenu.prototype = {
195
254
  const targetOffsetTop = target.offsetTop;
196
255
  const targetGlobalTop = globalTarget.top;
197
256
  const targetHeight = target.offsetHeight;
198
- const wbottom = domUtils.getClientSize().h - (targetGlobalTop - this._w.scrollY + targetHeight);
257
+ const wbottom = dom.utils.getClientSize().h - (targetGlobalTop - this._w.scrollY + targetHeight);
199
258
  const sideAddH = side ? targetHeight : 0;
200
259
  let overH = 10000;
201
260
  switch (position) {
@@ -300,20 +359,29 @@ SelectMenu.prototype = {
300
359
  const item = form.firstElementChild.querySelector(onItemQuerySelector);
301
360
  if (item) {
302
361
  this._onItem = item;
303
- domUtils.addClass(item, 'se-select-on');
362
+ dom.utils.addClass(item, 'se-select-on');
304
363
  }
305
364
  }
306
365
 
307
366
  form.style.left = l + 'px';
308
367
  form.style.top = t + 'px';
309
368
  form.style.visibility = '';
310
- },
369
+ }
311
370
 
371
+ /**
372
+ * @private
373
+ * @description Selects an item and triggers the callback function.
374
+ * @param {number} index - The index of the item to select.
375
+ */
312
376
  _select(index) {
313
- if (this.checkList) domUtils.toggleClass(this.menus[index], 'se-checked');
377
+ if (this.checkList) dom.utils.toggleClass(this.menus[index], 'se-checked');
314
378
  this._selectMethod(this.getItem(index));
315
- },
379
+ }
316
380
 
381
+ /**
382
+ * @private
383
+ * @description Adds event listeners for menu interactions.
384
+ */
317
385
  __addEvents() {
318
386
  this.__removeEvents();
319
387
  this.__events = this.__eventHandlers;
@@ -321,126 +389,160 @@ SelectMenu.prototype = {
321
389
  this.form.addEventListener('mousemove', this.__events.mousemove);
322
390
  this.form.addEventListener('click', this.__events.click);
323
391
  this._keydownTarget.addEventListener('keydown', this.__events.keydown);
324
- },
392
+ }
325
393
 
394
+ /**
395
+ * @private
396
+ * @description Removes event listeners for menu interactions.
397
+ */
326
398
  __removeEvents() {
327
- if (this.__events.length === 0) return;
399
+ if (!this.__events) return;
328
400
  this.form.removeEventListener('mousedown', this.__events.mousedown);
329
401
  this.form.removeEventListener('mousemove', this.__events.mousemove);
330
402
  this.form.removeEventListener('click', this.__events.click);
331
403
  this._keydownTarget.removeEventListener('keydown', this.__events.keydown);
332
- this.__events = [];
333
- },
404
+ this.__events = null;
405
+ }
334
406
 
407
+ /**
408
+ * @private
409
+ * @description Adds global event listeners for closing the menu.
410
+ */
335
411
  __addGlobalEvent() {
336
412
  this.__removeGlobalEvent();
337
413
  this._bindClose_key = this.eventManager.addGlobalEvent('keydown', this.__globalEventHandlers.keydown, true);
338
414
  this._bindClose_mousedown = this.eventManager.addGlobalEvent('mousedown', this.__globalEventHandlers.mousedown, true);
339
- },
415
+ }
340
416
 
417
+ /**
418
+ * @private
419
+ * @description Removes global event listeners for closing the menu.
420
+ */
341
421
  __removeGlobalEvent() {
342
422
  if (this._bindClose_key) this._bindClose_key = this.eventManager.removeGlobalEvent(this._bindClose_key);
343
423
  if (this._bindClose_mousedown) this._bindClose_mousedown = this.eventManager.removeGlobalEvent(this._bindClose_mousedown);
344
424
  if (this._bindClose_click) this._bindClose_click = this.eventManager.removeGlobalEvent(this._bindClose_click);
345
- },
346
-
347
- constructor: SelectMenu
348
- };
425
+ }
349
426
 
350
- function OnKeyDown_refer(e) {
351
- let moveIndex;
352
- switch (e.keyCode) {
353
- case 38: // up
354
- e.preventDefault();
355
- e.stopPropagation();
356
- if (this.horizontal && this.index > -1) {
357
- const num = this.splitNum;
358
- moveIndex = this.index - num < 0 ? num : -num;
359
- } else {
427
+ /**
428
+ * @param {KeyboardEvent} e - Event object
429
+ */
430
+ #OnKeyDown_refer(e) {
431
+ let moveIndex;
432
+ switch (e.code) {
433
+ case 'ArrowUp': // up
434
+ e.preventDefault();
435
+ e.stopPropagation();
436
+ if (this.horizontal && this.index > -1) {
437
+ const num = this.splitNum;
438
+ moveIndex = this.index - num < 0 ? num : -num;
439
+ } else {
440
+ moveIndex = -1;
441
+ }
442
+ break;
443
+ case 'ArrowDown': // down
444
+ e.preventDefault();
445
+ e.stopPropagation();
446
+ if (this.horizontal && this.index > -1) {
447
+ const num = this.splitNum;
448
+ moveIndex = this.index + num > this.menuLen ? -num : num;
449
+ } else {
450
+ moveIndex = 1;
451
+ }
452
+ break;
453
+ case 'ArrowLeft': // left
454
+ e.preventDefault();
455
+ e.stopPropagation();
360
456
  moveIndex = -1;
361
- }
362
- break;
363
- case 40: // down
364
- e.preventDefault();
365
- e.stopPropagation();
366
- if (this.horizontal && this.index > -1) {
367
- const num = this.splitNum;
368
- moveIndex = this.index + num > this.menuLen ? -num : num;
369
- } else {
370
- moveIndex = 1;
371
- }
372
- break;
373
- case 37: // left
374
- e.preventDefault();
375
- e.stopPropagation();
376
- moveIndex = -1;
377
- break;
378
- case 39: //right
379
- e.preventDefault();
380
- e.stopPropagation();
381
- moveIndex = 1;
382
- break;
383
- case 13:
384
- case 32: // enter, space
385
- if (this.index > -1) {
457
+ break;
458
+ case 'ArrowRight': //right
386
459
  e.preventDefault();
387
460
  e.stopPropagation();
388
- this._select(this.index);
389
- } else {
390
- this.close();
391
- }
392
- break;
461
+ moveIndex = 1;
462
+ break;
463
+ case 'Enter':
464
+ case 'Space': // enter, space
465
+ if (this.index > -1) {
466
+ e.preventDefault();
467
+ e.stopPropagation();
468
+ this._select(this.index);
469
+ } else {
470
+ this.close();
471
+ }
472
+ break;
473
+ }
474
+
475
+ if (moveIndex) this._moveItem(moveIndex);
393
476
  }
394
477
 
395
- if (moveIndex) this._moveItem(moveIndex);
396
- }
478
+ /**
479
+ * @param {MouseEvent} e - Event object
480
+ */
481
+ #OnMousedown_list(e) {
482
+ if (env.isGecko) {
483
+ const eventTarget = dom.query.getEventTarget(e);
484
+ const target = dom.query.getParentElement(eventTarget, '.se-select-item');
485
+ if (target) this.eventManager._injectActiveEvent(target);
486
+ }
487
+ }
397
488
 
398
- function OnMousedown_list(e) {
399
- if (env.isGecko) {
400
- const target = domUtils.getParentElement(e.target, '.se-select-item');
401
- if (target) this._injectActiveEvent(target);
489
+ /**
490
+ * @param {MouseEvent} e - Event object
491
+ */
492
+ #OnMouseMove_list(e) {
493
+ const eventTarget = dom.query.getEventTarget(e);
494
+ dom.utils.addClass(this.form, 'se-select-menu-mouse-move');
495
+ const index = eventTarget.getAttribute('data-index');
496
+ if (!index) return;
497
+ this.index = Number(index);
402
498
  }
403
- }
404
499
 
405
- function OnMouseMove_list(e) {
406
- domUtils.addClass(this.form, 'se-select-menu-mouse-move');
407
- const index = e.target.getAttribute('data-index');
408
- if (!index) return;
409
- this.index = index * 1;
410
- }
500
+ /**
501
+ * @param {MouseEvent} e - Event object
502
+ */
503
+ #OnClick_list(e) {
504
+ let target = dom.query.getEventTarget(e);
505
+ let index = null;
411
506
 
412
- function OnClick_list(e) {
413
- let target = e.target;
414
- let index = null;
507
+ while (!index && !/UL/i.test(target.tagName) && !dom.utils.hasClass(target, 'se-select-menu')) {
508
+ index = target.getAttribute('data-index');
509
+ target = target.parentElement;
510
+ }
415
511
 
416
- while (!index && !/UL/i.test(target.tagName) && !domUtils.hasClass(target, 'se-select-menu')) {
417
- index = target.getAttribute('data-index');
418
- target = target.parentNode;
512
+ if (!index) return;
513
+ this._select(Number(index));
419
514
  }
420
515
 
421
- if (!index) return;
422
- this._select(index * 1);
423
- }
424
-
425
- function CloseListener_key(e) {
426
- if (!/27/.test(e.keyCode)) return;
427
- this.close();
428
- }
429
-
430
- function CloseListener_mousedown(e) {
431
- if (this.form.contains(e.target)) return;
432
- if (e.target !== this._refer) {
516
+ /**
517
+ * @param {KeyboardEvent} e - Event object
518
+ */
519
+ #CloseListener_key(e) {
520
+ if (!keyCodeMap.isEsc(e.code)) return;
433
521
  this.close();
434
- } else if (!domUtils.isInputElement(e.target)) {
435
- this._bindClose_click = this.eventManager.addGlobalEvent('click', this.__globalEventHandlers.click, true);
436
522
  }
437
- }
438
523
 
439
- function CloseListener_click(e) {
440
- this._bindClose_click = this.eventManager.removeGlobalEvent(this._bindClose_click);
441
- if (e.target === this._refer) {
442
- e.stopPropagation();
443
- this.close();
524
+ /**
525
+ * @param {MouseEvent} e - Event object
526
+ */
527
+ #CloseListener_mousedown(e) {
528
+ const eventTarget = dom.query.getEventTarget(e);
529
+ if (this.form.contains(eventTarget)) return;
530
+ if (e.target !== this._refer) {
531
+ this.close();
532
+ } else if (!dom.check.isInputElement(eventTarget)) {
533
+ this._bindClose_click = this.eventManager.addGlobalEvent('click', this.__globalEventHandlers.click, true);
534
+ }
535
+ }
536
+
537
+ /**
538
+ * @param {MouseEvent} e - Event object
539
+ */
540
+ #CloseListener_click(e) {
541
+ this._bindClose_click = this.eventManager.removeGlobalEvent(this._bindClose_click);
542
+ if (e.target === this._refer) {
543
+ e.stopPropagation();
544
+ this.close();
545
+ }
444
546
  }
445
547
  }
446
548
 
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * @module _DragHandle
3
3
  * @description A module that handles drag and drop events.
4
- * this module is initialize in the `classes/component.js`.
4
+ * - this module is initialize in the `classes/component.js`.
5
5
  */
6
+
6
7
  export const _DragHandle = new Map([
7
8
  ['__figureInst', null],
8
9
  ['__dragInst', null],
@@ -3,12 +3,12 @@ import ApiManager from './ApiManager';
3
3
  import ColorPicker from './ColorPicker';
4
4
  import Controller from './Controller';
5
5
  import Figure from './Figure';
6
- import FileBrowser from './FileBrowser';
6
+ import Browser from './Browser';
7
7
  import FileManager from './FileManager';
8
8
  import HueSlider from './HueSlider';
9
9
  import Modal from './Modal';
10
10
  import ModalAnchorEditor from './ModalAnchorEditor';
11
11
  import SelectMenu from './SelectMenu';
12
12
 
13
- export { _DragHandle, ApiManager, ColorPicker, Controller, FileBrowser, FileManager, HueSlider, Figure, Modal, ModalAnchorEditor, SelectMenu };
14
- export default { _DragHandle, ApiManager, ColorPicker, Controller, FileBrowser, FileManager, HueSlider, Figure, Modal, ModalAnchorEditor, SelectMenu };
13
+ export { _DragHandle, ApiManager, ColorPicker, Controller, Browser, FileManager, HueSlider, Figure, Modal, ModalAnchorEditor, SelectMenu };
14
+ export default { _DragHandle, ApiManager, ColorPicker, Controller, Browser, FileManager, HueSlider, Figure, Modal, ModalAnchorEditor, SelectMenu };