suneditor 3.0.0-alpha.2 → 3.0.0-alpha.20

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 (306) hide show
  1. package/.eslintrc.json +4 -3
  2. package/CONTRIBUTING.md +4 -2
  3. package/README.md +19 -11
  4. package/README_V3_TEMP.md +705 -0
  5. package/dist/suneditor.min.css +1 -0
  6. package/dist/suneditor.min.js +1 -0
  7. package/example.md +587 -0
  8. package/package.json +15 -9
  9. package/src/assets/icons/_default.js +166 -131
  10. package/src/assets/{suneditor-content.css → suneditor-contents.css} +182 -45
  11. package/src/assets/suneditor.css +1195 -556
  12. package/src/assets/variables.css +138 -0
  13. package/src/core/base/eventHandlers/handler_toolbar.js +35 -14
  14. package/src/core/base/eventHandlers/handler_ww_clipboard.js +29 -4
  15. package/src/core/base/eventHandlers/handler_ww_dragDrop.js +59 -15
  16. package/src/core/base/eventHandlers/handler_ww_key_input.js +426 -212
  17. package/src/core/base/eventHandlers/handler_ww_mouse.js +108 -32
  18. package/src/core/base/eventManager.js +540 -209
  19. package/src/core/base/events.js +616 -320
  20. package/src/core/base/history.js +93 -39
  21. package/src/core/class/char.js +29 -13
  22. package/src/core/class/component.js +332 -145
  23. package/src/core/class/format.js +671 -509
  24. package/src/core/class/html.js +504 -290
  25. package/src/core/class/menu.js +114 -47
  26. package/src/core/class/nodeTransform.js +111 -66
  27. package/src/core/class/offset.js +409 -105
  28. package/src/core/class/selection.js +220 -108
  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 +330 -0
  32. package/src/core/class/viewer.js +178 -74
  33. package/src/core/editor.js +489 -384
  34. package/src/core/section/actives.js +118 -22
  35. package/src/core/section/constructor.js +504 -170
  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/helper/converter.js +137 -19
  42. package/src/helper/dom/domCheck.js +294 -0
  43. package/src/helper/dom/domQuery.js +609 -0
  44. package/src/helper/dom/domUtils.js +533 -0
  45. package/src/helper/dom/index.js +12 -0
  46. package/src/helper/env.js +42 -19
  47. package/src/helper/index.js +7 -4
  48. package/src/helper/keyCodeMap.js +183 -0
  49. package/src/helper/numbers.js +8 -8
  50. package/src/helper/unicode.js +5 -5
  51. package/src/langs/ckb.js +69 -3
  52. package/src/langs/cs.js +67 -1
  53. package/src/langs/da.js +68 -2
  54. package/src/langs/de.js +68 -3
  55. package/src/langs/en.js +29 -1
  56. package/src/langs/es.js +68 -3
  57. package/src/langs/fa.js +70 -2
  58. package/src/langs/fr.js +68 -2
  59. package/src/langs/he.js +68 -3
  60. package/src/langs/hu.js +226 -0
  61. package/src/langs/index.js +3 -2
  62. package/src/langs/it.js +65 -0
  63. package/src/langs/ja.js +68 -3
  64. package/src/langs/ko.js +66 -1
  65. package/src/langs/lv.js +68 -3
  66. package/src/langs/nl.js +68 -3
  67. package/src/langs/pl.js +68 -3
  68. package/src/langs/pt_br.js +65 -0
  69. package/src/langs/ro.js +69 -4
  70. package/src/langs/ru.js +68 -3
  71. package/src/langs/se.js +68 -3
  72. package/src/langs/tr.js +68 -0
  73. package/src/langs/ua.js +68 -3
  74. package/src/langs/ur.js +71 -6
  75. package/src/langs/zh_cn.js +69 -4
  76. package/src/modules/ApiManager.js +77 -54
  77. package/src/modules/Browser.js +667 -0
  78. package/src/modules/ColorPicker.js +162 -102
  79. package/src/modules/Controller.js +233 -136
  80. package/src/modules/Figure.js +913 -489
  81. package/src/modules/FileManager.js +141 -72
  82. package/src/modules/HueSlider.js +113 -61
  83. package/src/modules/Modal.js +292 -113
  84. package/src/modules/ModalAnchorEditor.js +380 -230
  85. package/src/modules/SelectMenu.js +270 -168
  86. package/src/modules/_DragHandle.js +2 -1
  87. package/src/modules/index.js +3 -3
  88. package/src/plugins/browser/audioGallery.js +83 -0
  89. package/src/plugins/browser/fileBrowser.js +103 -0
  90. package/src/plugins/browser/fileGallery.js +83 -0
  91. package/src/plugins/browser/imageGallery.js +81 -0
  92. package/src/plugins/browser/videoGallery.js +103 -0
  93. package/src/plugins/command/blockquote.js +40 -27
  94. package/src/plugins/command/exportPDF.js +134 -0
  95. package/src/plugins/command/fileUpload.js +226 -158
  96. package/src/plugins/command/list_bulleted.js +93 -47
  97. package/src/plugins/command/list_numbered.js +93 -47
  98. package/src/plugins/dropdown/align.js +66 -54
  99. package/src/plugins/dropdown/backgroundColor.js +76 -45
  100. package/src/plugins/dropdown/font.js +71 -47
  101. package/src/plugins/dropdown/fontColor.js +78 -46
  102. package/src/plugins/dropdown/formatBlock.js +74 -33
  103. package/src/plugins/dropdown/hr.js +102 -51
  104. package/src/plugins/dropdown/layout.js +37 -26
  105. package/src/plugins/dropdown/lineHeight.js +54 -38
  106. package/src/plugins/dropdown/list.js +60 -45
  107. package/src/plugins/dropdown/paragraphStyle.js +51 -30
  108. package/src/plugins/dropdown/table.js +1269 -777
  109. package/src/plugins/dropdown/template.js +38 -26
  110. package/src/plugins/dropdown/textStyle.js +43 -31
  111. package/src/plugins/field/mention.js +144 -82
  112. package/src/plugins/index.js +32 -6
  113. package/src/plugins/input/fontSize.js +161 -108
  114. package/src/plugins/input/pageNavigator.js +70 -0
  115. package/src/plugins/modal/audio.js +341 -169
  116. package/src/plugins/modal/drawing.js +530 -0
  117. package/src/plugins/modal/embed.js +886 -0
  118. package/src/plugins/modal/image.js +673 -358
  119. package/src/plugins/modal/link.js +100 -71
  120. package/src/plugins/modal/math.js +384 -168
  121. package/src/plugins/modal/video.js +693 -336
  122. package/src/plugins/popup/anchor.js +222 -0
  123. package/src/suneditor.js +54 -12
  124. package/src/themes/dark.css +85 -0
  125. package/src/typedef.js +86 -0
  126. package/types/assets/icons/_default.d.ts +152 -0
  127. package/types/core/base/eventHandlers/handler_toolbar.d.ts +41 -0
  128. package/types/core/base/eventHandlers/handler_ww_clipboard.d.ts +40 -0
  129. package/types/core/base/eventHandlers/handler_ww_dragDrop.d.ts +35 -0
  130. package/types/core/base/eventHandlers/handler_ww_key_input.d.ts +45 -0
  131. package/types/core/base/eventHandlers/handler_ww_mouse.d.ts +39 -0
  132. package/types/core/base/eventManager.d.ts +377 -0
  133. package/types/core/base/events.d.ts +297 -0
  134. package/types/core/base/history.d.ts +81 -0
  135. package/types/core/class/char.d.ts +60 -0
  136. package/types/core/class/component.d.ts +259 -0
  137. package/types/core/class/format.d.ts +615 -0
  138. package/types/core/class/html.d.ts +377 -0
  139. package/types/core/class/menu.d.ts +118 -0
  140. package/types/core/class/nodeTransform.d.ts +93 -0
  141. package/types/core/class/offset.d.ts +512 -0
  142. package/types/core/class/selection.d.ts +188 -0
  143. package/types/core/class/shortcuts.d.ts +142 -0
  144. package/types/core/class/toolbar.d.ts +189 -0
  145. package/types/core/class/ui.d.ts +144 -0
  146. package/types/core/class/viewer.d.ts +140 -0
  147. package/types/core/editor.d.ts +606 -0
  148. package/types/core/section/actives.d.ts +46 -0
  149. package/types/core/section/constructor.d.ts +748 -0
  150. package/types/core/section/context.d.ts +45 -0
  151. package/types/core/section/documentType.d.ts +178 -0
  152. package/types/editorInjector/_classes.d.ts +41 -0
  153. package/types/editorInjector/_core.d.ts +92 -0
  154. package/types/editorInjector/index.d.ts +71 -0
  155. package/types/helper/converter.d.ts +150 -0
  156. package/types/helper/dom/domCheck.d.ts +182 -0
  157. package/types/helper/dom/domQuery.d.ts +214 -0
  158. package/types/helper/dom/domUtils.d.ts +211 -0
  159. package/types/helper/dom/index.d.ts +9 -0
  160. package/types/helper/env.d.ts +149 -0
  161. package/types/helper/index.d.ts +163 -0
  162. package/types/helper/keyCodeMap.d.ts +110 -0
  163. package/types/helper/numbers.d.ts +43 -0
  164. package/types/helper/unicode.d.ts +28 -0
  165. package/types/index.d.ts +0 -0
  166. package/{typings/Lang.d.ts → types/langs/_Lang.d.ts} +170 -103
  167. package/types/langs/ckb.d.ts +384 -0
  168. package/types/langs/cs.d.ts +384 -0
  169. package/types/langs/da.d.ts +384 -0
  170. package/types/langs/de.d.ts +384 -0
  171. package/types/langs/en.d.ts +384 -0
  172. package/types/langs/es.d.ts +384 -0
  173. package/types/langs/fa.d.ts +384 -0
  174. package/types/langs/fr.d.ts +384 -0
  175. package/types/langs/he.d.ts +384 -0
  176. package/types/langs/hu.d.ts +384 -0
  177. package/types/langs/index.d.ts +48 -0
  178. package/types/langs/it.d.ts +384 -0
  179. package/types/langs/ja.d.ts +384 -0
  180. package/types/langs/ko.d.ts +384 -0
  181. package/types/langs/lv.d.ts +384 -0
  182. package/types/langs/nl.d.ts +384 -0
  183. package/types/langs/pl.d.ts +384 -0
  184. package/types/langs/pt_br.d.ts +384 -0
  185. package/types/langs/ro.d.ts +384 -0
  186. package/types/langs/ru.d.ts +384 -0
  187. package/types/langs/se.d.ts +384 -0
  188. package/types/langs/tr.d.ts +384 -0
  189. package/types/langs/ua.d.ts +384 -0
  190. package/types/langs/ur.d.ts +384 -0
  191. package/types/langs/zh_cn.d.ts +384 -0
  192. package/types/modules/ApiManager.d.ts +125 -0
  193. package/types/modules/Browser.d.ts +326 -0
  194. package/types/modules/ColorPicker.d.ts +131 -0
  195. package/types/modules/Controller.d.ts +231 -0
  196. package/types/modules/Figure.d.ts +504 -0
  197. package/types/modules/FileManager.d.ts +202 -0
  198. package/types/modules/HueSlider.d.ts +136 -0
  199. package/types/modules/Modal.d.ts +117 -0
  200. package/types/modules/ModalAnchorEditor.d.ts +236 -0
  201. package/types/modules/SelectMenu.d.ts +194 -0
  202. package/types/modules/_DragHandle.d.ts +7 -0
  203. package/types/modules/index.d.ts +26 -0
  204. package/types/plugins/browser/audioGallery.d.ts +55 -0
  205. package/types/plugins/browser/fileBrowser.d.ts +64 -0
  206. package/types/plugins/browser/fileGallery.d.ts +55 -0
  207. package/types/plugins/browser/imageGallery.d.ts +51 -0
  208. package/types/plugins/browser/videoGallery.d.ts +57 -0
  209. package/types/plugins/command/blockquote.d.ts +28 -0
  210. package/types/plugins/command/exportPDF.d.ts +46 -0
  211. package/types/plugins/command/fileUpload.d.ts +156 -0
  212. package/types/plugins/command/list_bulleted.d.ts +56 -0
  213. package/types/plugins/command/list_numbered.d.ts +56 -0
  214. package/types/plugins/dropdown/align.d.ts +60 -0
  215. package/types/plugins/dropdown/backgroundColor.d.ts +63 -0
  216. package/types/plugins/dropdown/font.d.ts +54 -0
  217. package/types/plugins/dropdown/fontColor.d.ts +63 -0
  218. package/types/plugins/dropdown/formatBlock.d.ts +58 -0
  219. package/types/plugins/dropdown/hr.d.ts +81 -0
  220. package/types/plugins/dropdown/layout.d.ts +40 -0
  221. package/types/plugins/dropdown/lineHeight.d.ts +50 -0
  222. package/types/plugins/dropdown/list.d.ts +39 -0
  223. package/types/plugins/dropdown/paragraphStyle.d.ts +54 -0
  224. package/types/plugins/dropdown/table.d.ts +579 -0
  225. package/types/plugins/dropdown/template.d.ts +40 -0
  226. package/types/plugins/dropdown/textStyle.d.ts +41 -0
  227. package/types/plugins/field/mention.d.ts +102 -0
  228. package/types/plugins/index.d.ts +107 -0
  229. package/types/plugins/input/fontSize.d.ts +170 -0
  230. package/types/plugins/input/pageNavigator.d.ts +28 -0
  231. package/types/plugins/modal/audio.d.ts +269 -0
  232. package/types/plugins/modal/drawing.d.ts +246 -0
  233. package/types/plugins/modal/embed.d.ts +387 -0
  234. package/types/plugins/modal/image.d.ts +451 -0
  235. package/types/plugins/modal/link.d.ts +128 -0
  236. package/types/plugins/modal/math.d.ts +193 -0
  237. package/types/plugins/modal/video.d.ts +485 -0
  238. package/types/plugins/popup/anchor.d.ts +56 -0
  239. package/types/suneditor.d.ts +51 -0
  240. package/types/typedef-global.d.ts +144 -0
  241. package/src/core/class/notice.js +0 -42
  242. package/src/helper/domUtils.js +0 -1177
  243. package/src/modules/FileBrowser.js +0 -271
  244. package/src/plugins/command/exportPdf.js +0 -168
  245. package/src/plugins/fileBrowser/imageGallery.js +0 -81
  246. package/src/themes/test.css +0 -61
  247. package/typings/CommandPlugin.d.ts +0 -8
  248. package/typings/DialogPlugin.d.ts +0 -20
  249. package/typings/FileBrowserPlugin.d.ts +0 -30
  250. package/typings/Module.d.ts +0 -15
  251. package/typings/Plugin.d.ts +0 -42
  252. package/typings/SubmenuPlugin.d.ts +0 -8
  253. package/typings/_classes.d.ts +0 -17
  254. package/typings/_colorPicker.d.ts +0 -60
  255. package/typings/_core.d.ts +0 -55
  256. package/typings/align.d.ts +0 -5
  257. package/typings/audio.d.ts +0 -5
  258. package/typings/backgroundColor.d.ts +0 -5
  259. package/typings/blockquote.d.ts +0 -5
  260. package/typings/char.d.ts +0 -39
  261. package/typings/component.d.ts +0 -38
  262. package/typings/context.d.ts +0 -39
  263. package/typings/converter.d.ts +0 -33
  264. package/typings/dialog.d.ts +0 -28
  265. package/typings/domUtils.d.ts +0 -361
  266. package/typings/editor.d.ts +0 -7
  267. package/typings/editor.ts +0 -542
  268. package/typings/env.d.ts +0 -70
  269. package/typings/eventManager.d.ts +0 -37
  270. package/typings/events.d.ts +0 -262
  271. package/typings/fileBrowser.d.ts +0 -42
  272. package/typings/fileManager.d.ts +0 -67
  273. package/typings/font.d.ts +0 -5
  274. package/typings/fontColor.d.ts +0 -5
  275. package/typings/fontSize.d.ts +0 -5
  276. package/typings/format.d.ts +0 -191
  277. package/typings/formatBlock.d.ts +0 -5
  278. package/typings/history.d.ts +0 -48
  279. package/typings/horizontalRule.d.ts +0 -5
  280. package/typings/image.d.ts +0 -5
  281. package/typings/imageGallery.d.ts +0 -5
  282. package/typings/index.d.ts +0 -21
  283. package/typings/index.modules.d.ts +0 -11
  284. package/typings/index.plugins.d.ts +0 -58
  285. package/typings/lineHeight.d.ts +0 -5
  286. package/typings/link.d.ts +0 -5
  287. package/typings/list.d.ts +0 -5
  288. package/typings/math.d.ts +0 -5
  289. package/typings/mediaContainer.d.ts +0 -25
  290. package/typings/mention.d.ts +0 -5
  291. package/typings/node.d.ts +0 -57
  292. package/typings/notice.d.ts +0 -16
  293. package/typings/numbers.d.ts +0 -29
  294. package/typings/offset.d.ts +0 -24
  295. package/typings/options.d.ts +0 -589
  296. package/typings/paragraphStyle.d.ts +0 -5
  297. package/typings/resizing.d.ts +0 -141
  298. package/typings/selection.d.ts +0 -94
  299. package/typings/shortcuts.d.ts +0 -13
  300. package/typings/suneditor.d.ts +0 -9
  301. package/typings/table.d.ts +0 -5
  302. package/typings/template.d.ts +0 -5
  303. package/typings/textStyle.d.ts +0 -5
  304. package/typings/toolbar.d.ts +0 -32
  305. package/typings/unicode.d.ts +0 -25
  306. package/typings/video.d.ts +0 -5
@@ -1,6 +1,9 @@
1
- import { domUtils, env } from '../../helper';
1
+ import { dom, env, keyCodeMap } from '../../helper';
2
2
  const { NO_EVENT } = env;
3
3
 
4
+ /**
5
+ * @constant {Object.<string, string[]>} StyleMap - Map of font styles to CSS properties.
6
+ */
4
7
  const StyleMap = {
5
8
  bold: ['font-weight'],
6
9
  underline: ['text-decoration'],
@@ -8,37 +11,77 @@ const StyleMap = {
8
11
  strike: ['text-decoration']
9
12
  };
10
13
 
14
+ let __globalEventKeydown = null;
15
+ let __globalEventMousedown = null;
16
+
17
+ /**
18
+ * @private
19
+ * @this {__se__EditorCore}
20
+ * @param {Node} ww Wywsiwyg element
21
+ * @param {Node} button Button element
22
+ */
23
+ const __RemoveCopyformt = function (ww, button) {
24
+ __globalEventKeydown = this.eventManager.removeGlobalEvent('keydown', __globalEventKeydown);
25
+ __globalEventMousedown = this.eventManager.removeGlobalEvent('mousedown', __globalEventMousedown);
26
+ this._onCopyFormatInfo = null;
27
+ this._onCopyFormatInitMethod = null;
28
+ dom.utils.removeClass(ww, 'se-copy-format-cursor');
29
+ dom.utils.removeClass(button, 'on');
30
+
31
+ return true;
32
+ };
33
+
34
+ /**
35
+ * @description List of commands that trigger active event handling in the editor.
36
+ * - These commands typically apply inline formatting or structural changes.
37
+ * @constant {string[]}
38
+ */
11
39
  export const ACTIVE_EVENT_COMMANDS = ['bold', 'underline', 'italic', 'strike', 'subscript', 'superscript', 'indent', 'outdent'];
40
+
41
+ /**
42
+ * @description List of basic editor commands, including active event commands and additional actions
43
+ * - such as undo, redo, saving, full-screen toggle, and text direction commands.
44
+ * @constant {string[]}
45
+ */
12
46
  export const BASIC_COMMANDS = ACTIVE_EVENT_COMMANDS.concat(['undo', 'redo', 'save', 'fullScreen', 'showBlocks', 'codeView', 'dir', 'dir_ltr', 'dir_rtl']);
13
47
 
48
+ /**
49
+ * @description Selects all content in the editor.
50
+ * @param {__se__EditorCore} editor - The root editor instance
51
+ */
14
52
  export function SELECT_ALL(editor) {
15
- editor._offCurrentController();
53
+ editor.ui._offCurrentController();
16
54
  editor.menu.containerOff();
17
- const figcaption = domUtils.getParentElement(editor.selection.getNode(), 'FIGCAPTION');
55
+ const figcaption = dom.query.getParentElement(editor.selection.getNode(), 'FIGCAPTION');
18
56
  const selectArea = figcaption || editor.frameContext.get('wysiwyg');
19
57
 
20
- let first = domUtils.getEdgeChild(selectArea.firstChild, (current) => current.childNodes.length === 0 || current.nodeType === 3 || domUtils.isTable(current), false) || selectArea.firstChild;
21
- let last = domUtils.getEdgeChild(selectArea.lastChild, (current) => current.childNodes.length === 0 || current.nodeType === 3 || domUtils.isTable(current), true) || selectArea.lastChild;
58
+ let first = dom.query.getEdgeChild(selectArea.firstChild, (current) => current.childNodes.length === 0 || current.nodeType === 3 || dom.check.isTable(current), false) || selectArea.firstChild;
59
+ let last = dom.query.getEdgeChild(selectArea.lastChild, (current) => current.childNodes.length === 0 || current.nodeType === 3 || dom.check.isTable(current), true) || selectArea.lastChild;
22
60
 
23
61
  if (!first || !last) return;
24
62
 
25
- if (domUtils.isMedia(first) || domUtils.isTableElements(first)) {
26
- const info = editor.component.get(first);
27
- const br = domUtils.createElement('BR');
28
- const format = domUtils.createElement(editor.options.get('defaultLine'), null, br);
63
+ if (dom.check.isMedia(first) || editor.component.is(first.parentElement) || dom.check.isTableElements(first)) {
64
+ const info = editor.component.get(first) || editor.component.get(first.parentElement);
65
+ const br = dom.utils.createElement('BR');
66
+ const format = dom.utils.createElement(editor.options.get('defaultLine'), null, br);
29
67
  first = info ? info.container || info.cover : first;
30
68
  first.parentNode.insertBefore(format, first);
31
69
  first = br;
32
70
  }
33
71
 
34
- if (domUtils.isMedia(last) || domUtils.isTableElements(last)) {
35
- last = domUtils.createElement('BR');
36
- selectArea.appendChild(domUtils.createElement(editor.options.get('defaultLine'), null, last));
72
+ if (dom.check.isMedia(last) || editor.component.is(last.parentElement) || dom.check.isTableElements(last)) {
73
+ last = dom.utils.createElement('BR');
74
+ selectArea.appendChild(dom.utils.createElement(editor.options.get('defaultLine'), null, last));
37
75
  }
38
76
 
39
77
  editor.toolbar._showBalloon(editor.selection.setRange(first, 0, last, last.textContent.length));
40
78
  }
41
79
 
80
+ /**
81
+ * @description Toggles direction button active state.
82
+ * @param {__se__EditorCore} editor - The root editor instance
83
+ * @param {boolean} rtl - Whether the text direction is right-to-left.
84
+ */
42
85
  export function DIR_BTN_ACTIVE(editor, rtl) {
43
86
  const icons = editor.icons;
44
87
  const commandTargets = editor.commandTargets;
@@ -55,30 +98,39 @@ export function DIR_BTN_ACTIVE(editor, rtl) {
55
98
 
56
99
  // change dir buttons
57
100
  editor.applyCommandTargets('dir', (e) => {
58
- domUtils.changeTxt(e.querySelector('.se-tooltip-text'), editor.lang[rtl ? 'dir_ltr' : 'dir_rtl']);
59
- domUtils.changeElement(e.firstElementChild, icons[rtl ? 'dir_ltr' : 'dir_rtl']);
101
+ dom.utils.changeTxt(e.querySelector('.se-tooltip-text'), editor.lang[rtl ? 'dir_ltr' : 'dir_rtl']);
102
+ dom.utils.changeElement(e.firstElementChild, icons[rtl ? 'dir_ltr' : 'dir_rtl']);
60
103
  });
104
+
61
105
  if (rtl) {
62
- domUtils.addClass(commandTargets.get('dir_rtl'), 'active');
63
- domUtils.removeClass(commandTargets.get('dir_ltr'), 'active');
106
+ dom.utils.addClass(commandTargets.get('dir_rtl'), 'active');
107
+ dom.utils.removeClass(commandTargets.get('dir_ltr'), 'active');
64
108
  } else {
65
- domUtils.addClass(commandTargets.get('dir_ltr'), 'active');
66
- domUtils.removeClass(commandTargets.get('dir_rtl'), 'active');
109
+ dom.utils.addClass(commandTargets.get('dir_ltr'), 'active');
110
+ dom.utils.removeClass(commandTargets.get('dir_rtl'), 'active');
67
111
  }
68
112
  }
69
113
 
114
+ /**
115
+ * @description Saves the editor content.
116
+ * @param {__se__EditorCore} editor - The root editor instance
117
+ * @returns {Promise<void>}
118
+ */
70
119
  export async function SAVE(editor) {
71
120
  const fc = editor.frameContext;
72
121
  if (!fc.get('isChanged')) return;
73
122
 
74
123
  const data = editor.html.get();
75
- if ((await editor.triggerEvent('onSave', { frameContext: fc, data })) === NO_EVENT) {
124
+ const saved = await editor.triggerEvent('onSave', { frameContext: fc, data });
125
+ if (saved === NO_EVENT) {
76
126
  const origin = fc.get('originElement');
77
127
  if (/^TEXTAREA$/i.test(origin.nodeName)) {
78
128
  origin.value = data;
79
129
  } else {
80
130
  origin.innerHTML = data;
81
131
  }
132
+ } else if (saved === false) {
133
+ return;
82
134
  }
83
135
 
84
136
  fc.set('isChanged', false);
@@ -86,15 +138,47 @@ export async function SAVE(editor) {
86
138
 
87
139
  // set save button disable
88
140
  editor.applyCommandTargets('save', (e) => {
89
- e.setAttribute('disabled', true);
141
+ e.disabled = true;
90
142
  });
91
143
  }
92
144
 
145
+ /**
146
+ * @description Copies formatting from selected text.
147
+ * @param {__se__EditorCore} editor - The root editor instance
148
+ * @param {Node} button - The button triggering the copy format function.
149
+ */
150
+ export function COPY_FORMAT(editor, button) {
151
+ if (typeof editor._onCopyFormatInitMethod === 'function') {
152
+ editor._onCopyFormatInitMethod();
153
+ return;
154
+ }
155
+
156
+ const ww = editor.frameContext.get('wysiwyg');
157
+ editor._onCopyFormatInfo = [...editor.eventManager.__cacheStyleNodes];
158
+ editor._onCopyFormatInitMethod = __RemoveCopyformt.bind(editor, ww, button);
159
+ dom.utils.addClass(ww, 'se-copy-format-cursor');
160
+ dom.utils.addClass(button, 'on');
161
+
162
+ __globalEventKeydown = editor.eventManager.addGlobalEvent('keydown', (e) => {
163
+ if (!keyCodeMap.isEsc(e.code)) return;
164
+ editor._onCopyFormatInitMethod?.();
165
+ });
166
+ __globalEventMousedown = editor.eventManager.addGlobalEvent('mousedown', (e) => {
167
+ if (ww.contains(e.target) || e.target === button) return;
168
+ editor._onCopyFormatInitMethod?.();
169
+ });
170
+ }
171
+
172
+ /**
173
+ * @description Applies font styling to selected text.
174
+ * @param {__se__EditorCore} editor - The root editor instance
175
+ * @param {string} command - The font style command (e.g., bold, italic, underline).
176
+ */
93
177
  export function FONT_STYLE(editor, command) {
94
178
  command = editor.options.get('_defaultTagCommand')[command.toLowerCase()] || command;
95
179
  let nodeName = editor.options.get('convertTextTags')[command] || command;
96
180
  const nodesMap = editor.status.currentNodesMap;
97
- const el = nodesMap.includes(editor.options.get('_styleCommandMap')[nodeName]) ? null : domUtils.createElement(nodeName);
181
+ const el = nodesMap.includes(editor.options.get('_styleCommandMap')[nodeName]) ? null : dom.utils.createElement(nodeName);
98
182
 
99
183
  if (/^sub$/i.test(nodeName) && nodesMap.includes('superscript')) {
100
184
  nodeName = 'sup';
@@ -102,6 +186,18 @@ export function FONT_STYLE(editor, command) {
102
186
  nodeName = 'sub';
103
187
  }
104
188
 
105
- editor.format.applyTextStyle(el, StyleMap[command] || null, [nodeName], false);
189
+ editor.format.applyInlineElement(el, { stylesToModify: StyleMap[command] || null, nodesToRemove: [nodeName], strictRemove: false });
106
190
  editor.focus();
107
191
  }
192
+
193
+ /**
194
+ * @description Inserts a page break element into the editor.
195
+ * @param {__se__EditorCore} editor - The root editor instance
196
+ */
197
+ export function PAGE_BREAK(editor) {
198
+ const pageBreak = dom.utils.createElement('DIV', { class: 'se-component se-component-line-break se-page-break' });
199
+ editor.component.insert(pageBreak, { skipCharCount: true, skipSelection: true, skipHistory: false });
200
+ const line = pageBreak.nextElementSibling || editor.format.addLine(pageBreak);
201
+ editor.selection.setRange(line, 1, line, 1);
202
+ editor.history.push(false);
203
+ }