suneditor 3.0.0-beta.3 → 3.0.0-beta.30

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 (241) hide show
  1. package/CONTRIBUTING.md +8 -8
  2. package/README.md +44 -49
  3. package/dist/suneditor.min.css +1 -1
  4. package/dist/suneditor.min.js +1 -1
  5. package/package.json +95 -53
  6. package/src/assets/design/color.css +2 -2
  7. package/src/assets/design/size.css +2 -0
  8. package/src/assets/icons/defaultIcons.js +16 -1
  9. package/src/assets/suneditor-contents.css +9 -8
  10. package/src/assets/suneditor.css +29 -26
  11. package/src/core/{section → base}/actives.js +20 -12
  12. package/src/core/base/history.js +4 -4
  13. package/src/core/class/char.js +10 -10
  14. package/src/core/class/component.js +146 -57
  15. package/src/core/class/format.js +94 -2458
  16. package/src/core/class/html.js +187 -129
  17. package/src/core/class/inline.js +1853 -0
  18. package/src/core/class/listFormat.js +582 -0
  19. package/src/core/class/menu.js +14 -3
  20. package/src/core/class/nodeTransform.js +9 -14
  21. package/src/core/class/offset.js +162 -197
  22. package/src/core/class/selection.js +137 -34
  23. package/src/core/class/toolbar.js +73 -52
  24. package/src/core/class/ui.js +11 -11
  25. package/src/core/class/viewer.js +56 -55
  26. package/src/core/config/context.js +122 -0
  27. package/src/core/config/frameContext.js +204 -0
  28. package/src/core/config/options.js +639 -0
  29. package/src/core/editor.js +181 -108
  30. package/src/core/event/actions/index.js +229 -0
  31. package/src/core/event/effects/common.registry.js +60 -0
  32. package/src/core/event/effects/keydown.registry.js +551 -0
  33. package/src/core/event/effects/ruleHelpers.js +145 -0
  34. package/src/core/{base → event}/eventManager.js +119 -201
  35. package/src/core/event/executor.js +21 -0
  36. package/src/core/{base/eventHandlers → event/handlers}/handler_toolbar.js +4 -4
  37. package/src/core/{base/eventHandlers → event/handlers}/handler_ww_dragDrop.js +2 -2
  38. package/src/core/event/handlers/handler_ww_input.js +77 -0
  39. package/src/core/event/handlers/handler_ww_key.js +228 -0
  40. package/src/core/{base/eventHandlers → event/handlers}/handler_ww_mouse.js +3 -3
  41. package/src/core/event/ports.js +211 -0
  42. package/src/core/event/reducers/keydown.reducer.js +89 -0
  43. package/src/core/event/rules/keydown.rule.arrow.js +54 -0
  44. package/src/core/event/rules/keydown.rule.backspace.js +202 -0
  45. package/src/core/event/rules/keydown.rule.delete.js +126 -0
  46. package/src/core/event/rules/keydown.rule.enter.js +144 -0
  47. package/src/core/event/rules/keydown.rule.tab.js +29 -0
  48. package/src/core/section/constructor.js +79 -388
  49. package/src/core/section/documentType.js +47 -26
  50. package/src/core/util/instanceCheck.js +59 -0
  51. package/src/editorInjector/_classes.js +4 -0
  52. package/src/editorInjector/_core.js +17 -7
  53. package/src/editorInjector/index.js +10 -2
  54. package/src/events.js +6 -0
  55. package/src/helper/clipboard.js +24 -10
  56. package/src/helper/converter.js +17 -12
  57. package/src/helper/dom/domCheck.js +22 -3
  58. package/src/helper/dom/domQuery.js +91 -45
  59. package/src/helper/dom/domUtils.js +93 -19
  60. package/src/helper/dom/index.js +4 -0
  61. package/src/helper/env.js +11 -7
  62. package/src/helper/keyCodeMap.js +4 -3
  63. package/src/langs/ckb.js +1 -1
  64. package/src/langs/cs.js +1 -1
  65. package/src/langs/da.js +1 -1
  66. package/src/langs/de.js +1 -1
  67. package/src/langs/en.js +1 -1
  68. package/src/langs/es.js +1 -1
  69. package/src/langs/fa.js +1 -1
  70. package/src/langs/fr.js +1 -1
  71. package/src/langs/he.js +1 -1
  72. package/src/langs/hu.js +1 -1
  73. package/src/langs/it.js +1 -1
  74. package/src/langs/ja.js +1 -1
  75. package/src/langs/km.js +1 -1
  76. package/src/langs/ko.js +1 -1
  77. package/src/langs/lv.js +1 -1
  78. package/src/langs/nl.js +1 -1
  79. package/src/langs/pl.js +1 -1
  80. package/src/langs/pt_br.js +10 -10
  81. package/src/langs/ro.js +1 -1
  82. package/src/langs/ru.js +1 -1
  83. package/src/langs/se.js +1 -1
  84. package/src/langs/tr.js +1 -1
  85. package/src/langs/uk.js +1 -1
  86. package/src/langs/ur.js +1 -1
  87. package/src/langs/zh_cn.js +1 -1
  88. package/src/modules/ApiManager.js +25 -18
  89. package/src/modules/Browser.js +52 -61
  90. package/src/modules/ColorPicker.js +37 -38
  91. package/src/modules/Controller.js +85 -79
  92. package/src/modules/Figure.js +275 -187
  93. package/src/modules/FileManager.js +86 -92
  94. package/src/modules/HueSlider.js +67 -35
  95. package/src/modules/Modal.js +84 -77
  96. package/src/modules/ModalAnchorEditor.js +62 -79
  97. package/src/modules/SelectMenu.js +89 -86
  98. package/src/plugins/browser/audioGallery.js +9 -5
  99. package/src/plugins/browser/fileBrowser.js +10 -6
  100. package/src/plugins/browser/fileGallery.js +9 -5
  101. package/src/plugins/browser/imageGallery.js +9 -5
  102. package/src/plugins/browser/videoGallery.js +11 -6
  103. package/src/plugins/command/blockquote.js +1 -0
  104. package/src/plugins/command/exportPDF.js +11 -8
  105. package/src/plugins/command/fileUpload.js +41 -29
  106. package/src/plugins/command/list_bulleted.js +2 -1
  107. package/src/plugins/command/list_numbered.js +2 -1
  108. package/src/plugins/dropdown/align.js +8 -2
  109. package/src/plugins/dropdown/backgroundColor.js +19 -11
  110. package/src/plugins/dropdown/font.js +15 -9
  111. package/src/plugins/dropdown/fontColor.js +19 -11
  112. package/src/plugins/dropdown/formatBlock.js +7 -2
  113. package/src/plugins/dropdown/hr.js +7 -3
  114. package/src/plugins/dropdown/layout.js +6 -2
  115. package/src/plugins/dropdown/lineHeight.js +8 -3
  116. package/src/plugins/dropdown/list.js +2 -1
  117. package/src/plugins/dropdown/paragraphStyle.js +15 -11
  118. package/src/plugins/dropdown/{table.js → table/index.js} +514 -362
  119. package/src/plugins/dropdown/template.js +6 -2
  120. package/src/plugins/dropdown/textStyle.js +7 -3
  121. package/src/plugins/field/mention.js +33 -27
  122. package/src/plugins/input/fontSize.js +44 -37
  123. package/src/plugins/input/pageNavigator.js +3 -2
  124. package/src/plugins/modal/audio.js +90 -85
  125. package/src/plugins/modal/drawing.js +58 -66
  126. package/src/plugins/modal/embed.js +193 -180
  127. package/src/plugins/modal/image.js +441 -439
  128. package/src/plugins/modal/link.js +31 -8
  129. package/src/plugins/modal/math.js +23 -22
  130. package/src/plugins/modal/video.js +233 -230
  131. package/src/plugins/popup/anchor.js +24 -18
  132. package/src/suneditor.js +69 -24
  133. package/src/typedef.js +42 -19
  134. package/types/assets/icons/defaultIcons.d.ts +8 -0
  135. package/types/core/class/char.d.ts +1 -1
  136. package/types/core/class/component.d.ts +29 -7
  137. package/types/core/class/format.d.ts +4 -354
  138. package/types/core/class/html.d.ts +13 -4
  139. package/types/core/class/inline.d.ts +263 -0
  140. package/types/core/class/listFormat.d.ts +135 -0
  141. package/types/core/class/menu.d.ts +10 -2
  142. package/types/core/class/offset.d.ts +24 -26
  143. package/types/core/class/selection.d.ts +2 -0
  144. package/types/core/class/toolbar.d.ts +24 -11
  145. package/types/core/class/ui.d.ts +1 -1
  146. package/types/core/class/viewer.d.ts +1 -1
  147. package/types/core/config/context.d.ts +157 -0
  148. package/types/core/config/frameContext.d.ts +367 -0
  149. package/types/core/config/options.d.ts +1119 -0
  150. package/types/core/editor.d.ts +101 -66
  151. package/types/core/event/actions/index.d.ts +47 -0
  152. package/types/core/event/effects/common.registry.d.ts +50 -0
  153. package/types/core/event/effects/keydown.registry.d.ts +73 -0
  154. package/types/core/event/effects/ruleHelpers.d.ts +31 -0
  155. package/types/core/{base → event}/eventManager.d.ts +15 -46
  156. package/types/core/event/executor.d.ts +6 -0
  157. package/types/core/event/handlers/handler_ww_input.d.ts +41 -0
  158. package/types/core/{base/eventHandlers/handler_ww_key_input.d.ts → event/handlers/handler_ww_key.d.ts} +4 -6
  159. package/types/core/event/ports.d.ts +255 -0
  160. package/types/core/event/reducers/keydown.reducer.d.ts +75 -0
  161. package/types/core/event/rules/keydown.rule.arrow.d.ts +8 -0
  162. package/types/core/event/rules/keydown.rule.backspace.d.ts +9 -0
  163. package/types/core/event/rules/keydown.rule.delete.d.ts +9 -0
  164. package/types/core/event/rules/keydown.rule.enter.d.ts +9 -0
  165. package/types/core/event/rules/keydown.rule.tab.d.ts +9 -0
  166. package/types/core/section/constructor.d.ts +101 -631
  167. package/types/core/section/documentType.d.ts +14 -4
  168. package/types/core/util/instanceCheck.d.ts +50 -0
  169. package/types/editorInjector/_classes.d.ts +4 -0
  170. package/types/editorInjector/_core.d.ts +17 -7
  171. package/types/editorInjector/index.d.ts +10 -2
  172. package/types/events.d.ts +1 -0
  173. package/types/helper/clipboard.d.ts +2 -2
  174. package/types/helper/converter.d.ts +6 -9
  175. package/types/helper/dom/domCheck.d.ts +7 -0
  176. package/types/helper/dom/domQuery.d.ts +19 -8
  177. package/types/helper/dom/domUtils.d.ts +24 -2
  178. package/types/helper/dom/index.d.ts +86 -1
  179. package/types/helper/env.d.ts +6 -1
  180. package/types/helper/index.d.ts +7 -1
  181. package/types/helper/keyCodeMap.d.ts +3 -3
  182. package/types/index.d.ts +23 -117
  183. package/types/langs/index.d.ts +2 -2
  184. package/types/modules/ApiManager.d.ts +1 -8
  185. package/types/modules/Browser.d.ts +4 -62
  186. package/types/modules/ColorPicker.d.ts +4 -21
  187. package/types/modules/Controller.d.ts +8 -64
  188. package/types/modules/Figure.d.ts +54 -50
  189. package/types/modules/FileManager.d.ts +1 -13
  190. package/types/modules/HueSlider.d.ts +13 -3
  191. package/types/modules/Modal.d.ts +0 -43
  192. package/types/modules/ModalAnchorEditor.d.ts +0 -73
  193. package/types/modules/SelectMenu.d.ts +0 -85
  194. package/types/modules/index.d.ts +3 -3
  195. package/types/plugins/browser/audioGallery.d.ts +29 -18
  196. package/types/plugins/browser/fileBrowser.d.ts +38 -27
  197. package/types/plugins/browser/fileGallery.d.ts +29 -18
  198. package/types/plugins/browser/imageGallery.d.ts +24 -16
  199. package/types/plugins/browser/videoGallery.d.ts +29 -18
  200. package/types/plugins/command/blockquote.d.ts +1 -0
  201. package/types/plugins/command/exportPDF.d.ts +18 -18
  202. package/types/plugins/command/fileUpload.d.ts +65 -45
  203. package/types/plugins/command/list_bulleted.d.ts +1 -0
  204. package/types/plugins/command/list_numbered.d.ts +1 -0
  205. package/types/plugins/dropdown/align.d.ts +13 -8
  206. package/types/plugins/dropdown/backgroundColor.d.ts +30 -19
  207. package/types/plugins/dropdown/font.d.ts +13 -12
  208. package/types/plugins/dropdown/fontColor.d.ts +30 -19
  209. package/types/plugins/dropdown/formatBlock.d.ts +13 -8
  210. package/types/plugins/dropdown/hr.d.ts +15 -11
  211. package/types/plugins/dropdown/layout.d.ts +15 -11
  212. package/types/plugins/dropdown/lineHeight.d.ts +16 -11
  213. package/types/plugins/dropdown/list.d.ts +1 -0
  214. package/types/plugins/dropdown/paragraphStyle.d.ts +31 -27
  215. package/types/plugins/dropdown/table/index.d.ts +582 -0
  216. package/types/plugins/dropdown/table.d.ts +41 -86
  217. package/types/plugins/dropdown/template.d.ts +15 -11
  218. package/types/plugins/dropdown/textStyle.d.ts +19 -11
  219. package/types/plugins/field/mention.d.ts +58 -56
  220. package/types/plugins/index.d.ts +38 -38
  221. package/types/plugins/input/fontSize.d.ts +46 -50
  222. package/types/plugins/modal/audio.d.ts +26 -56
  223. package/types/plugins/modal/drawing.d.ts +0 -85
  224. package/types/plugins/modal/embed.d.ts +15 -79
  225. package/types/plugins/modal/image.d.ts +24 -136
  226. package/types/plugins/modal/link.d.ts +34 -15
  227. package/types/plugins/modal/math.d.ts +0 -16
  228. package/types/plugins/modal/video.d.ts +17 -86
  229. package/types/plugins/popup/anchor.d.ts +1 -8
  230. package/types/suneditor.d.ts +70 -19
  231. package/types/typedef.d.ts +60 -46
  232. package/src/core/base/eventHandlers/handler_ww_key_input.js +0 -1200
  233. package/src/core/section/context.js +0 -102
  234. package/types/core/section/context.d.ts +0 -45
  235. package/types/langs/_Lang.d.ts +0 -194
  236. /package/src/core/{base/eventHandlers → event/handlers}/handler_ww_clipboard.js +0 -0
  237. /package/types/core/{section → base}/actives.d.ts +0 -0
  238. /package/types/core/{base/eventHandlers → event/handlers}/handler_toolbar.d.ts +0 -0
  239. /package/types/core/{base/eventHandlers → event/handlers}/handler_ww_clipboard.d.ts +0 -0
  240. /package/types/core/{base/eventHandlers → event/handlers}/handler_ww_dragDrop.d.ts +0 -0
  241. /package/types/core/{base/eventHandlers → event/handlers}/handler_ww_mouse.d.ts +0 -0
@@ -1,6 +1,7 @@
1
1
  import CoreInjector from '../editorInjector/_core';
2
2
  import { dom, env, keyCodeMap } from '../helper';
3
3
 
4
+ const { _w } = env;
4
5
  const MENU_MIN_HEIGHT = 38;
5
6
 
6
7
  /**
@@ -18,6 +19,19 @@ const MENU_MIN_HEIGHT = 38;
18
19
  * @description Creates a select menu
19
20
  */
20
21
  class SelectMenu extends CoreInjector {
22
+ #dirPosition;
23
+ #dirSubPosition;
24
+ #textDirDiff;
25
+ #refer;
26
+ #keydownTarget;
27
+ #selectMethod;
28
+ #bindClose_key;
29
+ #bindClose_mousedown;
30
+ #bindClose_click;
31
+ #events;
32
+ #eventHandlers;
33
+ #globalEventHandlers;
34
+
21
35
  /**
22
36
  * @constructor
23
37
  * @param {*} inst The instance object that called the constructor.
@@ -42,28 +56,28 @@ class SelectMenu extends CoreInjector {
42
56
  this.checkList = !!params.checkList;
43
57
  this.position = positionItems[0];
44
58
  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
59
  this.splitNum = params.splitNum || 0;
49
60
  this.horizontal = !!this.splitNum;
50
61
  this.openMethod = params.openMethod;
51
62
  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 = {
63
+
64
+ this.#dirPosition = /^(left|right)$/.test(this.position) ? (this.position === 'left' ? 'right' : 'left') : this.position;
65
+ this.#dirSubPosition = /^(left|right)$/.test(this.subPosition) ? (this.subPosition === 'left' ? 'right' : 'left') : this.subPosition;
66
+ this.#textDirDiff = params.dir === 'ltr' ? false : params.dir === 'rtl' ? true : null;
67
+ this.#refer = null;
68
+ this.#keydownTarget = null;
69
+ this.#selectMethod = null;
70
+ this.#bindClose_key = null;
71
+ this.#bindClose_mousedown = null;
72
+ this.#bindClose_click = null;
73
+ this.#events = null;
74
+ this.#eventHandlers = {
61
75
  mousedown: this.#OnMousedown_list.bind(this),
62
76
  mousemove: this.#OnMouseMove_list.bind(this),
63
77
  click: this.#OnClick_list.bind(this),
64
78
  keydown: this.#OnKeyDown_refer.bind(this)
65
79
  };
66
- this.__globalEventHandlers = { keydown: this.#CloseListener_key.bind(this), mousedown: this.#CloseListener_mousedown.bind(this), click: this.#CloseListener_click.bind(this) };
80
+ this.#globalEventHandlers = { keydown: this.#CloseListener_key.bind(this), mousedown: this.#CloseListener_mousedown.bind(this), click: this.#CloseListener_click.bind(this) };
67
81
  }
68
82
 
69
83
  /**
@@ -73,16 +87,16 @@ class SelectMenu extends CoreInjector {
73
87
  */
74
88
  create(items, menus) {
75
89
  this.form.firstElementChild.innerHTML = '';
76
- menus = menus || items;
90
+ menus ||= items;
77
91
  let html = '';
78
92
  for (let i = 0, len = menus.length; i < len; i++) {
79
93
  if (i > 0 && i % this.splitNum === 0) {
80
- this._createFormat(html);
94
+ this.#createFormat(html);
81
95
  html = '';
82
96
  }
83
97
  html += `<li class="se-select-item" data-index="${i}">${typeof menus[i] === 'string' ? menus[i] : /** @type {HTMLElement} */ (menus[i]).outerHTML}</li>`;
84
98
  }
85
- this._createFormat(html);
99
+ this.#createFormat(html);
86
100
 
87
101
  this.items = /** @type {Array<string|Node>} */ (items);
88
102
  this.menus = Array.from(this.form.querySelectorAll('li'));
@@ -95,11 +109,10 @@ class SelectMenu extends CoreInjector {
95
109
  * @param {(command: string) => void} selectMethod - The function to execute when an item is selected.
96
110
  * @param {{class?: string, style?: string}} [attr={}] - Additional attributes for the select menu container.
97
111
  */
98
- on(referElement, selectMethod, attr) {
99
- if (!attr) attr = {};
100
- this._refer = /** @type {HTMLElement} */ (referElement);
101
- this._keydownTarget = dom.check.isInputElement(referElement) ? referElement : this._w;
102
- this._selectMethod = selectMethod;
112
+ on(referElement, selectMethod, attr = {}) {
113
+ this.#refer = /** @type {HTMLElement} */ (referElement);
114
+ this.#keydownTarget = dom.check.isInputElement(referElement) ? referElement : this.frameContext.get('_ww');
115
+ this.#selectMethod = selectMethod;
103
116
  this.form = dom.utils.createElement(
104
117
  'DIV',
105
118
  {
@@ -119,12 +132,12 @@ class SelectMenu extends CoreInjector {
119
132
  open(position, onItemQuerySelector) {
120
133
  this.editor.selectMenuOn = true;
121
134
  if (typeof this.openMethod === 'function') this.openMethod();
122
- this.__addEvents();
123
- this.__addGlobalEvent();
135
+ this.#addEvents();
136
+ this.#addGlobalEvent();
124
137
  const positionItems = position ? position.split('-') : [];
125
- const mainPosition = positionItems[0] || (this._textDirDiff !== null && this._textDirDiff !== this.options.get('_rtl') ? this._dirPosition : this.position);
126
- const subPosition = positionItems[1] || (this._textDirDiff !== null && this._textDirDiff !== this.options.get('_rtl') ? this._dirSubPosition : this.subPosition);
127
- this._setPosition(mainPosition, subPosition, onItemQuerySelector);
138
+ const mainPosition = positionItems[0] || (this.#textDirDiff !== null && this.#textDirDiff !== this.options.get('_rtl') ? this.#dirPosition : this.position);
139
+ const subPosition = positionItems[1] || (this.#textDirDiff !== null && this.#textDirDiff !== this.options.get('_rtl') ? this.#dirSubPosition : this.subPosition);
140
+ this.#setPosition(mainPosition, subPosition, onItemQuerySelector);
128
141
  this.isOpen = true;
129
142
  }
130
143
 
@@ -133,9 +146,9 @@ class SelectMenu extends CoreInjector {
133
146
  */
134
147
  close() {
135
148
  this.editor.selectMenuOn = false;
136
- dom.utils.removeClass(this._refer, 'on');
137
- this._init();
138
- if (this.form) this.form.style.cssText = '';
149
+ dom.utils.removeClass(this.#refer, 'on');
150
+ this.#init();
151
+ this.form?.removeAttribute('style');
139
152
  this.isOpen = false;
140
153
  if (typeof this.closeMethod === 'function') this.closeMethod();
141
154
  }
@@ -154,25 +167,23 @@ class SelectMenu extends CoreInjector {
154
167
  * @param {number} index Item index
155
168
  */
156
169
  setItem(index) {
157
- this._selectItem(index);
170
+ this.#selectItem(index);
158
171
  }
159
172
 
160
173
  /**
161
- * @private
162
174
  * @description Appends a formatted list of items to the menu.
163
175
  * @param {string} html - The HTML string representing the menu items.
164
176
  */
165
- _createFormat(html) {
177
+ #createFormat(html) {
166
178
  this.form.firstElementChild.innerHTML += `<ul class="se-list-basic se-list-checked${this.horizontal ? ' se-list-horizontal' : ''}">${html}</ul>`;
167
179
  }
168
180
 
169
181
  /**
170
- * @private
171
182
  * @description Resets the menu state and removes event listeners.
172
183
  */
173
- _init() {
174
- this.__removeEvents();
175
- this.__removeGlobalEvent();
184
+ #init() {
185
+ this.#removeEvents();
186
+ this.#removeGlobalEvent();
176
187
  this.index = -1;
177
188
  this.item = null;
178
189
  if (this._onItem) {
@@ -182,24 +193,22 @@ class SelectMenu extends CoreInjector {
182
193
  }
183
194
 
184
195
  /**
185
- * @private
186
196
  * @description Moves the selection up or down by a specified number of items.
187
197
  * @param {number} num - The number of items to move (negative for up, positive for down).
188
198
  */
189
- _moveItem(num) {
199
+ #moveItem(num) {
190
200
  num = this.index + num;
191
201
  const len = this.menuLen;
192
202
  const selectIndex = (this.index = num >= len ? 0 : num < 0 ? len - 1 : num);
193
203
 
194
- this._selectItem(selectIndex);
204
+ this.#selectItem(selectIndex);
195
205
  }
196
206
 
197
207
  /**
198
- * @private
199
208
  * @description Highlights and selects an item by index.
200
209
  * @param {number} selectIndex - The index of the item to select.
201
210
  */
202
- _selectItem(selectIndex) {
211
+ #selectItem(selectIndex) {
203
212
  dom.utils.removeClass(this.form, 'se-select-menu-mouse-move');
204
213
 
205
214
  const len = this.menuLen;
@@ -216,17 +225,16 @@ class SelectMenu extends CoreInjector {
216
225
  }
217
226
 
218
227
  /**
219
- * @private
220
228
  * @description Sets the position of the select menu relative to the reference element.
221
229
  * @param {string} position Menu position ("left"|"right") | ("top"|"bottom")
222
230
  * @param {string} subPosition Sub position ("middle"|"top"|"bottom") | ("center"|"left"|"right")
223
231
  * @param {string} [onItemQuerySelector] - A query selector string to highlight a specific item.
224
232
  * @param {boolean} [_re=false] - Whether this is a retry after adjusting the position.
225
233
  */
226
- _setPosition(position, subPosition, onItemQuerySelector, _re) {
234
+ #setPosition(position, subPosition, onItemQuerySelector, _re) {
227
235
  const originP = position;
228
236
  const form = this.form;
229
- const target = this._refer;
237
+ const target = this.#refer;
230
238
  form.style.visibility = 'hidden';
231
239
  form.style.display = 'block';
232
240
  dom.utils.removeClass(form, 'se-select-menu-scroll');
@@ -254,7 +262,7 @@ class SelectMenu extends CoreInjector {
254
262
  const targetOffsetTop = target.offsetTop;
255
263
  const targetGlobalTop = globalTarget.top;
256
264
  const targetHeight = target.offsetHeight;
257
- const wbottom = dom.utils.getClientSize().h - (targetGlobalTop - this._w.scrollY + targetHeight);
265
+ const wbottom = dom.utils.getClientSize().h - (targetGlobalTop - _w.scrollY + targetHeight);
258
266
  const sideAddH = side ? targetHeight : 0;
259
267
  let overH = 10000;
260
268
  switch (position) {
@@ -308,7 +316,7 @@ class SelectMenu extends CoreInjector {
308
316
  }
309
317
 
310
318
  if (overH < MENU_MIN_HEIGHT && !_re && position !== 'middle') {
311
- this._setPosition(position === 'top' ? 'bottpm' : 'top', subPosition, onItemQuerySelector, true);
319
+ this.#setPosition(position === 'top' ? 'bottpm' : 'top', subPosition, onItemQuerySelector, true);
312
320
  return;
313
321
  }
314
322
 
@@ -331,15 +339,15 @@ class SelectMenu extends CoreInjector {
331
339
  let overW = 0;
332
340
  switch (side + '-' + (side ? originP : subPosition)) {
333
341
  case 'true-left':
334
- overW = globalTarget.left - this._w.scrollX + fl;
342
+ overW = globalTarget.left - _w.scrollX + fl;
335
343
  if (overW < 0) l = l = targetL + targetW + 1;
336
344
  break;
337
345
  case 'true-right':
338
- overW = this._w.innerWidth - (fl + formW);
346
+ overW = _w.innerWidth - (fl + formW);
339
347
  if (overW < 0) l = targetL - formW - 1;
340
348
  break;
341
349
  case 'false-center': {
342
- overW = this._w.innerWidth - (fl + formW);
350
+ overW = _w.innerWidth - (fl + formW);
343
351
  if (overW < 0) l += overW - 4;
344
352
  form.style.left = l + 'px';
345
353
  const centerfl = this.editor.offset.getGlobal(form).left;
@@ -347,7 +355,7 @@ class SelectMenu extends CoreInjector {
347
355
  break;
348
356
  }
349
357
  case 'false-left':
350
- overW = this._w.innerWidth - (globalTarget.left - this._w.scrollX + formW);
358
+ overW = _w.innerWidth - (globalTarget.left - _w.scrollX + formW);
351
359
  if (overW < 0) l += overW - 4;
352
360
  break;
353
361
  case 'false-right':
@@ -369,59 +377,54 @@ class SelectMenu extends CoreInjector {
369
377
  }
370
378
 
371
379
  /**
372
- * @private
373
380
  * @description Selects an item and triggers the callback function.
374
381
  * @param {number} index - The index of the item to select.
375
382
  */
376
- _select(index) {
383
+ #select(index) {
377
384
  if (this.checkList) dom.utils.toggleClass(this.menus[index], 'se-checked');
378
- this._selectMethod(this.getItem(index));
385
+ this.#selectMethod(this.getItem(index));
379
386
  }
380
387
 
381
388
  /**
382
- * @private
383
389
  * @description Adds event listeners for menu interactions.
384
390
  */
385
- __addEvents() {
386
- this.__removeEvents();
387
- this.__events = this.__eventHandlers;
388
- this.form.addEventListener('mousedown', this.__events.mousedown);
389
- this.form.addEventListener('mousemove', this.__events.mousemove);
390
- this.form.addEventListener('click', this.__events.click);
391
- this._keydownTarget.addEventListener('keydown', this.__events.keydown);
391
+ #addEvents() {
392
+ this.#removeEvents();
393
+ this.#events = this.#eventHandlers;
394
+ this.form.addEventListener('mousedown', this.#events.mousedown);
395
+ this.form.addEventListener('mousemove', this.#events.mousemove);
396
+ this.form.addEventListener('click', this.#events.click);
397
+ this.#keydownTarget.addEventListener('keydown', this.#events.keydown);
392
398
  }
393
399
 
394
400
  /**
395
- * @private
396
401
  * @description Removes event listeners for menu interactions.
397
402
  */
398
- __removeEvents() {
399
- if (!this.__events) return;
400
- this.form.removeEventListener('mousedown', this.__events.mousedown);
401
- this.form.removeEventListener('mousemove', this.__events.mousemove);
402
- this.form.removeEventListener('click', this.__events.click);
403
- this._keydownTarget.removeEventListener('keydown', this.__events.keydown);
404
- this.__events = null;
403
+ #removeEvents() {
404
+ if (!this.#events) return;
405
+ this.form.removeEventListener('mousedown', this.#events.mousedown);
406
+ this.form.removeEventListener('mousemove', this.#events.mousemove);
407
+ this.form.removeEventListener('click', this.#events.click);
408
+ this.#keydownTarget.removeEventListener('keydown', this.#events.keydown);
409
+ this.#events = null;
405
410
  }
406
411
 
407
412
  /**
408
- * @private
409
413
  * @description Adds global event listeners for closing the menu.
410
414
  */
411
- __addGlobalEvent() {
412
- this.__removeGlobalEvent();
413
- this._bindClose_key = this.eventManager.addGlobalEvent('keydown', this.__globalEventHandlers.keydown, true);
414
- this._bindClose_mousedown = this.eventManager.addGlobalEvent('mousedown', this.__globalEventHandlers.mousedown, true);
415
+ #addGlobalEvent() {
416
+ this.#removeGlobalEvent();
417
+ this.#bindClose_key = this.eventManager.addGlobalEvent('keydown', this.#globalEventHandlers.keydown, true);
418
+ this.#bindClose_mousedown = this.eventManager.addGlobalEvent('mousedown', this.#globalEventHandlers.mousedown, true);
415
419
  }
416
420
 
417
421
  /**
418
- * @private
419
422
  * @description Removes global event listeners for closing the menu.
420
423
  */
421
- __removeGlobalEvent() {
422
- if (this._bindClose_key) this._bindClose_key = this.eventManager.removeGlobalEvent(this._bindClose_key);
423
- if (this._bindClose_mousedown) this._bindClose_mousedown = this.eventManager.removeGlobalEvent(this._bindClose_mousedown);
424
- if (this._bindClose_click) this._bindClose_click = this.eventManager.removeGlobalEvent(this._bindClose_click);
424
+ #removeGlobalEvent() {
425
+ this.#bindClose_key &&= this.eventManager.removeGlobalEvent(this.#bindClose_key);
426
+ this.#bindClose_mousedown &&= this.eventManager.removeGlobalEvent(this.#bindClose_mousedown);
427
+ this.#bindClose_click &&= this.eventManager.removeGlobalEvent(this.#bindClose_click);
425
428
  }
426
429
 
427
430
  /**
@@ -465,14 +468,14 @@ class SelectMenu extends CoreInjector {
465
468
  if (this.index > -1) {
466
469
  e.preventDefault();
467
470
  e.stopPropagation();
468
- this._select(this.index);
471
+ this.#select(this.index);
469
472
  } else {
470
473
  this.close();
471
474
  }
472
475
  break;
473
476
  }
474
477
 
475
- if (moveIndex) this._moveItem(moveIndex);
478
+ if (moveIndex) this.#moveItem(moveIndex);
476
479
  }
477
480
 
478
481
  /**
@@ -510,7 +513,7 @@ class SelectMenu extends CoreInjector {
510
513
  }
511
514
 
512
515
  if (!index) return;
513
- this._select(Number(index));
516
+ this.#select(Number(index));
514
517
  }
515
518
 
516
519
  /**
@@ -527,10 +530,10 @@ class SelectMenu extends CoreInjector {
527
530
  #CloseListener_mousedown(e) {
528
531
  const eventTarget = dom.query.getEventTarget(e);
529
532
  if (this.form.contains(eventTarget)) return;
530
- if (e.target !== this._refer) {
533
+ if (e.target !== this.#refer) {
531
534
  this.close();
532
535
  } else if (!dom.check.isInputElement(eventTarget)) {
533
- this._bindClose_click = this.eventManager.addGlobalEvent('click', this.__globalEventHandlers.click, true);
536
+ this.#bindClose_click = this.eventManager.addGlobalEvent('click', this.#globalEventHandlers.click, true);
534
537
  }
535
538
  }
536
539
 
@@ -538,8 +541,8 @@ class SelectMenu extends CoreInjector {
538
541
  * @param {MouseEvent} e - Event object
539
542
  */
540
543
  #CloseListener_click(e) {
541
- this._bindClose_click = this.eventManager.removeGlobalEvent(this._bindClose_click);
542
- if (e.target === this._refer) {
544
+ this.#bindClose_click = this.eventManager.removeGlobalEvent(this.#bindClose_click);
545
+ if (e.target === this.#refer) {
543
546
  e.stopPropagation();
544
547
  this.close();
545
548
  }
@@ -5,6 +5,14 @@ import { Browser } from '../../modules';
5
5
  * @typedef {import('../../modules/Browser').BrowserFile} BrowserFile_audioGallery
6
6
  */
7
7
 
8
+ /**
9
+ * @typedef {Object} AudioGalleryPluginOptions
10
+ * @property {Array<BrowserFile_audioGallery>} [data] - Direct data without server calls
11
+ * @property {string} [url] - Server request URL
12
+ * @property {Object<string, string>} [headers] - Server request headers
13
+ * @property {string|((item: BrowserFile_audioGallery) => string)} [thumbnail] - Default thumbnail
14
+ */
15
+
8
16
  /**
9
17
  * @class
10
18
  * @extends EditorInjector
@@ -18,11 +26,7 @@ class AudioGallery extends EditorInjector {
18
26
  /**
19
27
  * @constructor
20
28
  * @param {__se__EditorCore} editor - The root editor instance
21
- * @param {Object} pluginOptions
22
- * @param {Array<*>=} pluginOptions.data - direct data without server calls
23
- * @param {string} pluginOptions.url - server request url
24
- * @param {Object<string, string>=} pluginOptions.headers - server request headers
25
- * @param {string|((item: BrowserFile_audioGallery) => string)} pluginOptions.thumbnail - default thumbnail
29
+ * @param {AudioGalleryPluginOptions} pluginOptions
26
30
  */
27
31
  constructor(editor, pluginOptions) {
28
32
  // plugin bisic properties
@@ -5,6 +5,15 @@ import { Browser } from '../../modules';
5
5
  * @typedef {import('../../modules/Browser').BrowserFile} BrowserFile_fileBrowser
6
6
  */
7
7
 
8
+ /**
9
+ * @typedef {Object} FileBrowserPluginOptions
10
+ * @property {Object<string, *>|Array<*>} [data] - Direct data without server calls
11
+ * @property {string} [url] - Server request URL
12
+ * @property {Object<string, string>} [headers] - Server request headers
13
+ * @property {string|((item: BrowserFile_fileBrowser) => string)} [thumbnail] - Default thumbnail
14
+ * @property {Array<string>} [props] - Additional tag names
15
+ */
16
+
8
17
  /**
9
18
  * @class
10
19
  * @extends EditorInjector
@@ -18,12 +27,7 @@ class FileBrowser extends EditorInjector {
18
27
  /**
19
28
  * @constructor
20
29
  * @param {__se__EditorCore} editor - The root editor instance
21
- * @param {Object} pluginOptions
22
- * @param {Object<string, *>|Array<*>=} pluginOptions.data - direct data without server calls
23
- * @param {string} pluginOptions.url - server request url
24
- * @param {Object<string, string>=} pluginOptions.headers - server request headers
25
- * @param {string|((item: BrowserFile_fileBrowser) => string)} pluginOptions.thumbnail - default thumbnail
26
- * @param {Array<string>} pluginOptions.props - additional tag names
30
+ * @param {FileBrowserPluginOptions} pluginOptions
27
31
  */
28
32
  constructor(editor, pluginOptions) {
29
33
  // plugin bisic properties
@@ -5,6 +5,14 @@ import { Browser } from '../../modules';
5
5
  * @typedef {import('../../modules/Browser').BrowserFile} BrowserFile_fileGallery
6
6
  */
7
7
 
8
+ /**
9
+ * @typedef {Object} FileGalleryPluginOptions
10
+ * @property {Array<BrowserFile_fileGallery>} [data] - Direct data without server calls
11
+ * @property {string} [url] - Server request URL
12
+ * @property {Object<string, string>} [headers] - Server request headers
13
+ * @property {string|((item: BrowserFile_fileGallery) => string)} [thumbnail] - Default thumbnail
14
+ */
15
+
8
16
  /**
9
17
  * @class
10
18
  * @extends EditorInjector
@@ -18,11 +26,7 @@ class FileGallery extends EditorInjector {
18
26
  /**
19
27
  * @constructor
20
28
  * @param {__se__EditorCore} editor - The root editor instance
21
- * @param {Object} pluginOptions
22
- * @param {Array<*>=} pluginOptions.data - direct data without server calls
23
- * @param {string} pluginOptions.url - server request url
24
- * @param {Object<string, string>=} pluginOptions.headers - server request headers
25
- * @param {string|((item: BrowserFile_fileGallery) => string)} pluginOptions.thumbnail - default thumbnail
29
+ * @param {FileGalleryPluginOptions} pluginOptions
26
30
  */
27
31
  constructor(editor, pluginOptions) {
28
32
  // plugin bisic properties
@@ -1,6 +1,13 @@
1
1
  import EditorInjector from '../../editorInjector';
2
2
  import { Browser } from '../../modules';
3
3
 
4
+ /**
5
+ * @typedef ImageGalleryPluginOptions
6
+ * @property {Array<*>} [data] - Direct data without server calls
7
+ * @property {string} [url] - Server request URL
8
+ * @property {Object<string, string>} [headers] - Server request headers
9
+ */
10
+
4
11
  /**
5
12
  * @class
6
13
  * @extends EditorInjector
@@ -14,10 +21,7 @@ class ImageGallery extends EditorInjector {
14
21
  /**
15
22
  * @constructor
16
23
  * @param {__se__EditorCore} editor - The root editor instance
17
- * @param {Object} pluginOptions
18
- * @param {Array<*>=} pluginOptions.data - direct data without server calls
19
- * @param {string=} pluginOptions.url - server request url
20
- * @param {Object<string, string>=} pluginOptions.headers - server request headers
24
+ * @param {ImageGalleryPluginOptions} pluginOptions
21
25
  */
22
26
  constructor(editor, pluginOptions) {
23
27
  // plugin bisic properties
@@ -73,7 +77,7 @@ class ImageGallery extends EditorInjector {
73
77
  } else {
74
78
  const file = { name: target.getAttribute('data-name'), size: 0 };
75
79
  this.plugins.image.init();
76
- this.plugins.image.create(target.getAttribute('data-command'), null, this.width, this.height, 'none', file, target.alt);
80
+ this.plugins.image.create(target.getAttribute('data-command'), null, this.width, this.height, 'none', file, target.alt, true);
77
81
  }
78
82
  }
79
83
  }
@@ -5,6 +5,14 @@ import { Browser } from '../../modules';
5
5
  * @typedef {import('../../modules/Browser').BrowserFile} BrowserFile_videoGallery
6
6
  */
7
7
 
8
+ /**
9
+ * @typedef {Object} VideoGalleryPluginOptions
10
+ * @property {Array<BrowserFile_videoGallery>} [data] - Direct data without server calls
11
+ * @property {string} [url] - Server request URL
12
+ * @property {Object<string, string>} [headers] - Server request headers
13
+ * @property {string|((item: BrowserFile_videoGallery) => string)} [thumbnail] - Default thumbnail
14
+ */
15
+
8
16
  /**
9
17
  * @class
10
18
  * @extends EditorInjector
@@ -18,11 +26,7 @@ class VideoGallery extends EditorInjector {
18
26
  /**
19
27
  * @constructor
20
28
  * @param {__se__EditorCore} editor - The root editor instance
21
- * @param {Object} pluginOptions
22
- * @param {Array<*>=} pluginOptions.data - direct data without server calls
23
- * @param {string=} pluginOptions.url - server request url
24
- * @param {Object<string, string>=} pluginOptions.headers - server request headers
25
- * @param {string|((item: BrowserFile_videoGallery) => string)} pluginOptions.thumbnail - default thumbnail
29
+ * @param {VideoGalleryPluginOptions} pluginOptions
26
30
  */
27
31
  constructor(editor, pluginOptions) {
28
32
  // plugin bisic properties
@@ -94,7 +98,8 @@ class VideoGallery extends EditorInjector {
94
98
  this.width,
95
99
  this.height,
96
100
  false,
97
- file
101
+ file,
102
+ true
98
103
  );
99
104
  }
100
105
  }
@@ -30,6 +30,7 @@ class Blockquote extends EditorInjector {
30
30
  * @param {?HTMLElement=} element - Node element where the cursor is currently located
31
31
  * @param {?HTMLElement=} target - The plugin's toolbar button element
32
32
  * @returns {boolean} - Whether the plugin is active
33
+ * - If it returns "undefined", it will no longer be called in this scope.
33
34
  */
34
35
  active(element, target) {
35
36
  if (/blockquote/i.test(element?.nodeName)) {
@@ -4,6 +4,12 @@ import { ApiManager } from '../../modules';
4
4
 
5
5
  const { _w, _d } = env;
6
6
 
7
+ /**
8
+ * @typedef ExportPDFPluginOptions
9
+ * @property {string} apiUrl - Server request URL for PDF generation
10
+ * @property {string} [fileName="suneditor-pdf"] - Name of the generated PDF file
11
+ */
12
+
7
13
  /**
8
14
  * @class
9
15
  * @description Export PDF plugin
@@ -16,9 +22,7 @@ class ExportPDF extends EditorInjector {
16
22
  /**
17
23
  * @constructor
18
24
  * @param {__se__EditorCore} editor - The root editor instance
19
- * @param {Object} pluginOptions - plugin options
20
- * @param {string} pluginOptions.apiUrl - server request url
21
- * @param {string} pluginOptions.fileName - file name
25
+ * @param {ExportPDFPluginOptions} pluginOptions - plugin options
22
26
  */
23
27
  constructor(editor, pluginOptions) {
24
28
  super(editor);
@@ -61,11 +65,11 @@ class ExportPDF extends EditorInjector {
61
65
  let ww = null;
62
66
 
63
67
  try {
64
- const standardWW = this.editor.frameContext.get('documentTypePageMirror') || this.editor.frameContext.get('wysiwygFrame');
68
+ const standardWW = this.frameContext.get('documentTypePageMirror') || this.frameContext.get('wysiwygFrame');
65
69
  const editableDiv = dom.utils.createElement('div', { class: standardWW.className }, standardWW.innerHTML);
66
70
  ww = dom.utils.createElement('div', { style: `position: absolute; top: -10000px; left: -10000px; width: 21cm; columns: 21cm; height: auto;` }, editableDiv);
67
71
 
68
- const innerPadding = this._w.getComputedStyle(standardWW).padding;
72
+ const innerPadding = _w.getComputedStyle(standardWW).padding;
69
73
  const inlineWW = dom.utils.applyInlineStylesAll(editableDiv, true, this.options.get('allUsedStyles'));
70
74
  inlineWW.style.padding = inlineWW.style.paddingTop = inlineWW.style.paddingBottom = inlineWW.style.paddingLeft = inlineWW.style.paddingRight = '0';
71
75
  ww.innerHTML = `
@@ -83,7 +87,7 @@ class ExportPDF extends EditorInjector {
83
87
  if ((await this.triggerEvent('onExportPDFBefore', { target: ww })) === false) return;
84
88
 
85
89
  // at server
86
- await this._createByServer(ww);
90
+ await this.#createByServer(ww);
87
91
  return;
88
92
  } catch (error) {
89
93
  console.error('[SUNEDITOR.plugins.exportPDF.error]', error.message);
@@ -94,13 +98,12 @@ class ExportPDF extends EditorInjector {
94
98
  }
95
99
 
96
100
  /**
97
- * @private
98
101
  * @description Sends the editor content to the server for PDF generation.
99
102
  * @param {HTMLElement} ww - A temporary container holding the formatted editor content.
100
103
  * @returns {Promise<void>} Resolves when the PDF file is successfully downloaded.
101
104
  * @throws {Error} Throws an error if the server response indicates a failure.
102
105
  */
103
- async _createByServer(ww) {
106
+ async #createByServer(ww) {
104
107
  const data = {
105
108
  fileName: this.fileName,
106
109
  htmlContent: ww.innerHTML