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
@@ -3,17 +3,23 @@
3
3
  */
4
4
 
5
5
  import { _w } from '../../helper/env';
6
- import { getNodeFromPath, getNodePath } from '../../helper/domUtils';
6
+ import { getNodeFromPath, getNodePath } from '../../helper/dom/domQuery';
7
7
  import { numbers } from '../../helper';
8
8
 
9
- export default function (editor) {
9
+ /**
10
+ * @description History stack closure
11
+ * @param {__se__EditorCore} editor - The root editor instance
12
+ */
13
+ export default function History(editor) {
10
14
  const frameRoots = editor.frameRoots;
11
15
  let delayTime = editor.options.get('historyStackDelayTime');
12
16
  let pushDelay = null;
13
17
  let stackIndex, stack, rootStack, rootInitContents;
18
+ let waiting = false;
19
+ let waitingTime = null;
14
20
 
15
- function change(fc, index) {
16
- if (editor.status.hasFocus) editor.eventManager.applyTagEffect();
21
+ function change(fc, index, isSetFocus) {
22
+ if (isSetFocus && editor.status.hasFocus) editor.eventManager.applyTagEffect();
17
23
  editor.history.resetButtons(fc.get('key'), index);
18
24
 
19
25
  // user event
@@ -25,6 +31,7 @@ export default function (editor) {
25
31
  function setContentFromStack(increase) {
26
32
  const prevKey = stack[stackIndex];
27
33
  const prevRoot = rootStack[prevKey];
34
+ const fc = editor.frameContext;
28
35
 
29
36
  stackIndex += increase;
30
37
  const rootKey = increase < 0 && prevKey !== stack[stackIndex] && prevRoot.index > 0 ? prevKey : stack[stackIndex];
@@ -60,13 +67,18 @@ export default function (editor) {
60
67
  if (stackIndex < 0) stackIndex = 0;
61
68
  else if (stackIndex >= stack.length) stackIndex = stack.length - 1;
62
69
 
63
- editor._offCurrentController();
64
- editor._checkComponents();
70
+ editor.ui._offCurrentController();
71
+ editor._checkComponents(false);
65
72
  editor.char.display();
66
- editor._resourcesStateChange(editor.frameContext);
73
+ editor._resourcesStateChange(fc);
74
+
75
+ // document type
76
+ if (fc.has('documentType-use-header')) {
77
+ fc.get('documentType').reHeader();
78
+ }
67
79
 
68
80
  // onChange
69
- change(editor.frameContext, root.index);
81
+ change(fc, root.index, true);
70
82
  }
71
83
 
72
84
  function setStack(content, range, rootKey, increase) {
@@ -126,7 +138,7 @@ export default function (editor) {
126
138
  stack = stack.slice(0, stackIndex + 1);
127
139
  root.value.splice(stackIndex + 1);
128
140
  editor.applyCommandTargets('redo', (e) => {
129
- e.setAttribute('disabled', true);
141
+ e.disabled = true;
130
142
  });
131
143
 
132
144
  for (let i = 0, len = deleteRoot.length; i < len; i++) {
@@ -135,7 +147,7 @@ export default function (editor) {
135
147
  }
136
148
 
137
149
  function pushStack(rootKey, range) {
138
- editor._checkComponents();
150
+ editor._checkComponents(false);
139
151
 
140
152
  const fc = frameRoots.get(rootKey);
141
153
  const current = fc.get('wysiwyg').innerHTML;
@@ -148,23 +160,26 @@ export default function (editor) {
148
160
 
149
161
  if (stackIndex === 1) {
150
162
  editor.applyCommandTargets('undo', (e) => {
151
- e.removeAttribute('disabled');
163
+ e.disabled = false;
152
164
  });
153
165
  }
154
166
 
155
167
  editor.char.display();
156
- change(fc, root.index);
168
+ change(fc, root.index, false);
157
169
  }
158
170
 
159
171
  return {
160
172
  /**
161
173
  * @description Saving the current status to the history object stack
162
- * If "delay" is true, it will be saved after (options.get('historyStackDelayTime') || 400) miliseconds
163
- * If the function is called again with the "delay" argument true before it is saved, the delay time is renewal
164
- * You can specify the delay time by sending a number.
165
- * @param {Boolean|Number} delay If true, Add stack without delay time.
174
+ * - If "delay" is true, it will be saved after (options.get('historyStackDelayTime') || 400) milliseconds.
175
+ * - If the function is called again with the "delay" argument true before it is saved, the delay time is renewed.
176
+ * - You can specify the delay time by sending a number.
177
+ * @param {boolean|number} delay If true, add stack without delay time.
178
+ * @param {*=} [rootKey] The key of the root frame to save history for.
166
179
  */
167
180
  push(delay, rootKey) {
181
+ if (waiting) return;
182
+
168
183
  rootKey = rootKey || editor.status.rootKey;
169
184
  const range = editor.status._range;
170
185
 
@@ -186,6 +201,11 @@ export default function (editor) {
186
201
  }, time);
187
202
  },
188
203
 
204
+ /**
205
+ * @description Immediately saves the current state to the history stack if a delayed save is pending.
206
+ * @param {*} rootKey The key of the root frame.
207
+ * @param {Range} range The selection range object.
208
+ */
189
209
  check(rootKey, range) {
190
210
  if (pushDelay) {
191
211
  _w.clearTimeout(pushDelay);
@@ -195,7 +215,7 @@ export default function (editor) {
195
215
  },
196
216
 
197
217
  /**
198
- * @description Undo function
218
+ * @description Undo function that restores the previous state from the history stack.
199
219
  */
200
220
  undo() {
201
221
  if (stackIndex > 0) {
@@ -204,7 +224,7 @@ export default function (editor) {
204
224
  },
205
225
 
206
226
  /**
207
- * @description Redo function
227
+ * @description Redo function that re-applies a previously undone state from the history stack.
208
228
  */
209
229
  redo() {
210
230
  if (stack.length - 1 > stackIndex) {
@@ -212,24 +232,47 @@ export default function (editor) {
212
232
  }
213
233
  },
214
234
 
235
+ /**
236
+ * @description Overwrites the current state in the history stack with the latest content.
237
+ * @param {string=} [rootKey] The key of the root frame to overwrite.
238
+ */
215
239
  overwrite(rootKey) {
216
240
  setStack(frameRoots.get(rootKey || editor.status.rootKey).get('wysiwyg').innerHTML, null, editor.status.rootKey, 0);
217
241
  },
218
242
 
219
243
  /**
220
- * @description Reset the history object
244
+ * @description Pauses the history stack, preventing new entries from being added for up to 5 seconds.
221
245
  */
222
- reset() {
223
- editor.applyCommandTargets('undo', (e) => {
224
- e.setAttribute('disabled', true);
225
- });
226
- editor.applyCommandTargets('redo', (e) => {
227
- e.setAttribute('disabled', true);
228
- });
246
+ pause() {
247
+ waiting = true;
229
248
 
230
- editor.applyCommandTargets('save', (e) => {
231
- e.setAttribute('disabled', true);
232
- });
249
+ if (waitingTime) {
250
+ _w.clearTimeout(waitingTime);
251
+ waitingTime = null;
252
+ }
253
+ waitingTime = _w.setTimeout(() => {
254
+ waiting = false;
255
+ }, 5000);
256
+ },
257
+
258
+ /**
259
+ * @description Resumes history tracking by allowing new entries to be added to the stack.
260
+ */
261
+ resume() {
262
+ if (waitingTime) {
263
+ _w.clearTimeout(waitingTime);
264
+ waitingTime = null;
265
+ }
266
+ waiting = false;
267
+ },
268
+
269
+ /**
270
+ * @description Resets the history stack and disables related UI buttons.
271
+ */
272
+ reset() {
273
+ editor.applyCommandTargets('undo', (e) => (e.disabled = true));
274
+ editor.applyCommandTargets('redo', (e) => (e.disabled = true));
275
+ editor.applyCommandTargets('save', (e) => (e.disabled = true));
233
276
 
234
277
  editor.applyFrameRoots((e) => e.set('historyIndex', -1));
235
278
  editor.applyFrameRoots((e) => e.set('isChanged', false));
@@ -238,6 +281,7 @@ export default function (editor) {
238
281
  stack = [];
239
282
  rootStack = {};
240
283
  rootInitContents = {};
284
+ waiting = false;
241
285
 
242
286
  const rootKeys = editor.rootKeys;
243
287
  for (let i = 0, len = rootKeys.length; i < len; i++) {
@@ -246,7 +290,9 @@ export default function (editor) {
246
290
  },
247
291
 
248
292
  /**
249
- * @description Reset the disabled state of the buttons to fit the current stack.
293
+ * @description Updates the state of history-related buttons (undo, redo, save) based on the current history stack.
294
+ * @param {*} rootKey The key of the root frame.
295
+ * @param {number} [index] The index of the current history state.
250
296
  */
251
297
  resetButtons(rootKey, index) {
252
298
  const isReset = !numbers.is(index);
@@ -256,12 +302,12 @@ export default function (editor) {
256
302
  const rootLen = root.value.length - 1;
257
303
 
258
304
  editor.applyCommandTargets('undo', (e) => {
259
- if (index > 0 && index <= rootLen) e.removeAttribute('disabled');
260
- else e.setAttribute('disabled', true);
305
+ if (index > 0 && index <= rootLen) e.disabled = false;
306
+ else e.disabled = true;
261
307
  });
262
308
  editor.applyCommandTargets('redo', (e) => {
263
- if (index > -1 && index < rootLen) e.removeAttribute('disabled');
264
- else e.setAttribute('disabled', true);
309
+ if (index > -1 && index < rootLen) e.disabled = false;
310
+ else e.disabled = true;
265
311
  });
266
312
 
267
313
  const savedIndex = target.get('savedIndex');
@@ -271,27 +317,35 @@ export default function (editor) {
271
317
  target.set('historyIndex', index);
272
318
  target.set('isChanged', isChanged);
273
319
  editor.applyCommandTargets('save', (e) => {
274
- if (isChanged) e.removeAttribute('disabled');
275
- else e.setAttribute('disabled', true);
320
+ if (isChanged) e.disabled = false;
321
+ else e.disabled = true;
276
322
  });
277
323
 
278
324
  editor.triggerEvent('onResetButtons', { rootKey });
279
325
  },
280
326
 
327
+ /**
328
+ * @description Returns the root stack containing the history of each frame.
329
+ * @returns {{content: string, s: {path: number|number[], offset: number|number[]}, e: {path: number|number[], offset: number|number[]}, frame: HTMLElement}} The root stack object.
330
+ * - content: content html string
331
+ * - s: depth info of the "start" range
332
+ * - e: depth info of the "end" range
333
+ * - frame: wysiwyg editable element.
334
+ */
281
335
  getRootStack() {
282
336
  return rootStack;
283
337
  },
284
338
 
285
339
  /**
286
- * @description Reset the delay time.
287
- * @param {number} time millisecond
340
+ * @description Resets the delay time for saving history.
341
+ * @param {number} ms The new delay time in milliseconds.
288
342
  */
289
- resetDelayTime(time) {
290
- delayTime = time;
343
+ resetDelayTime(ms) {
344
+ delayTime = ms;
291
345
  },
292
346
 
293
347
  /**
294
- * @description Remove all stacks and remove the timeout function.
348
+ * @description Clears the entire history stack and cancels any pending save operations.
295
349
  */
296
350
  destroy() {
297
351
  if (pushDelay) _w.clearTimeout(pushDelay);
@@ -4,22 +4,33 @@
4
4
 
5
5
  import CoreInjector from '../../editorInjector/_core';
6
6
  import { _w, isEdge } from '../../helper/env';
7
- import { addClass, removeClass, hasClass } from '../../helper/domUtils';
7
+ import { addClass, removeClass, hasClass } from '../../helper/dom/domUtils';
8
8
 
9
- const Char = function (editor) {
9
+ /**
10
+ * @typedef {Omit<Char & Partial<__se__EditorInjector>, 'char'>} CharThis
11
+ */
12
+
13
+ /**
14
+ * @constructor
15
+ * @this {CharThis}
16
+ * @description character count, character limit, etc. management class
17
+ * @param {__se__EditorCore} editor - The root editor instance
18
+ */
19
+ function Char(editor) {
10
20
  CoreInjector.call(this, editor);
11
- };
21
+ }
12
22
 
13
23
  Char.prototype = {
14
24
  /**
25
+ * @this {CharThis}
15
26
  * @description Returns false if char count is greater than "frameOptions.get('charCounter_max')" when "html" is added to the current editor.
16
- * @param {Node|String} html Element node or String.
27
+ * @param {Node|string} html Element node or String.
17
28
  * @returns {boolean}
18
29
  */
19
30
  check(html) {
20
31
  const maxCharCount = this.editor.frameOptions.get('charCounter_max');
21
32
  if (maxCharCount) {
22
- const length = this.getLength(typeof html === 'string' ? html : this.editor.frameOptions.get('charCounter_type') === 'byte-html' && html.nodeType === 1 ? html.outerHTML : html.textContent);
33
+ const length = this.getLength(typeof html === 'string' ? html : this.editor.frameOptions.get('charCounter_type') === 'byte-html' && html.nodeType === 1 ? /** @type {HTMLElement} */ (html).outerHTML : html.textContent);
23
34
  if (length > 0 && length + this.getLength() > maxCharCount) {
24
35
  CounterBlink(this.editor.frameContext.get('charWrapper'));
25
36
  return false;
@@ -29,9 +40,10 @@ Char.prototype = {
29
40
  },
30
41
 
31
42
  /**
43
+ * @this {CharThis}
32
44
  * @description Get the [content]'s number of characters or binary data size. (frameOptions.get('charCounter_type'))
33
- * If [content] is undefined, get the current editor's number of characters or binary data size.
34
- * @param {string|undefined} content Content to count. (defalut: this.editor.frameContext.get('wysiwyg'))
45
+ * - If [content] is undefined, get the current editor's number of characters or binary data size.
46
+ * @param {string=} content Content to count. (defalut: this.editor.frameContext.get('wysiwyg'))
35
47
  * @returns {number}
36
48
  */
37
49
  getLength(content) {
@@ -42,6 +54,7 @@ Char.prototype = {
42
54
  },
43
55
 
44
56
  /**
57
+ * @this {CharThis}
45
58
  * @descriptionGets Get the length in bytes of a string.
46
59
  * @param {string} text String text
47
60
  * @returns {number}
@@ -61,7 +74,7 @@ Char.prototype = {
61
74
 
62
75
  return cl + cr;
63
76
  } else {
64
- cl = new TextEncoder('utf-8').encode(text).length;
77
+ cl = new TextEncoder().encode(text).length;
65
78
  cr = 0;
66
79
 
67
80
  if (encodeURIComponent(text).match(/(%0A|%0D)/gi) !== null) {
@@ -73,6 +86,7 @@ Char.prototype = {
73
86
  },
74
87
 
75
88
  /**
89
+ * @this {CharThis}
76
90
  * @description Set the char count to charCounter element textContent.
77
91
  */
78
92
  display() {
@@ -85,8 +99,9 @@ Char.prototype = {
85
99
  },
86
100
 
87
101
  /**
102
+ * @this {CharThis}
88
103
  * @description Returns false if char count is greater than "frameOptions.get('charCounter_max')" when "inputText" is added to the current editor.
89
- * If the current number of characters is greater than "charCounter_max", the excess characters are removed.
104
+ * - If the current number of characters is greater than "charCounter_max", the excess characters are removed.
90
105
  * And call the char.display()
91
106
  * @param {string} inputText Text added.
92
107
  * @returns {boolean}
@@ -131,9 +146,9 @@ Char.prototype = {
131
146
  };
132
147
 
133
148
  /**
134
- * @description The character counter blinks.
135
- * @param charWrapper {Element} this.editor.frameContext.get('charWrapper')
136
149
  * @private
150
+ * @description The character counter blinks.
151
+ * @param {Element} charWrapper this.editor.frameContext.get('charWrapper')
137
152
  */
138
153
  function CounterBlink(charWrapper) {
139
154
  if (charWrapper && !hasClass(charWrapper, 'se-blink')) {