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,5 +1,5 @@
1
1
  import EditorInjector from '../../editorInjector';
2
- import { domUtils } from '../../helper';
2
+ import { dom, numbers, keyCodeMap } from '../../helper';
3
3
 
4
4
  const DEFAULT_UNIT_MAP = {
5
5
  text: {
@@ -85,76 +85,100 @@ const DEFAULT_UNIT_MAP = {
85
85
  }
86
86
  };
87
87
 
88
- const FontSize = function (editor, pluginOptions) {
89
- EditorInjector.call(this, editor);
90
-
91
- // create HTML
92
- this.unitMap = { ...DEFAULT_UNIT_MAP, ...(pluginOptions.unitMap || {}) };
93
- this.sizeUnit = /text/.test(pluginOptions.sizeUnit) ? '' : pluginOptions.sizeUnit || this.options.get('fontSizeUnits')[0];
94
-
95
- const unitMap = this.unitMap[this.sizeUnit || 'text'];
96
- const menu = CreateHTML(editor, unitMap, this.sizeUnit, pluginOptions.showDefaultSizeLabel);
97
-
98
- // plugin basic properties
99
- const showIncDec = this.sizeUnit ? pluginOptions.showIncDecControls ?? false : false;
100
- const disableInput = this.sizeUnit ? pluginOptions.disableInput ?? false : true;
101
-
102
- this.title = this.lang.fontSize;
103
- this.inner =
104
- disableInput && !showIncDec
105
- ? false
106
- : disableInput
107
- ? `<span class="se-txt se-not-arrow-text __se__font_size">${this.lang.fontSize}</span>`
108
- : `<input type="text" class="__se__font_size se-not-arrow-text" placeholder="${this.lang.fontSize}" />`;
109
-
110
- // increase, decrease buttons
111
- if (showIncDec) {
112
- this.beforeButton = domUtils.createElement(
113
- 'button',
114
- { class: 'se-btn se-tooltip se-sub-btn', 'data-command': FontSize.key, 'data-type': 'command', 'data-value': 'dec' },
115
- `${this.icons.minus}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.decrease}</span></span>`
116
- );
117
- this.afterButton = domUtils.createElement(
118
- 'button',
119
- { class: 'se-btn se-tooltip se-sub-btn', 'data-command': FontSize.key, 'data-type': 'command', 'data-value': 'inc' },
120
- `${this.icons.plus}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.increase}</span></span>`
121
- );
122
- } else if (!disableInput) {
123
- this.afterButton = domUtils.createElement(
124
- 'button',
125
- { class: 'se-btn se-tooltip se-sub-arrow-btn', 'data-command': FontSize.key, 'data-type': 'dropdown' },
126
- `${this.icons.arrow_down}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.fontSize}</span></span>`
127
- );
128
- this.menu.initDropdownTarget({ key: FontSize.key, type: 'dropdown' }, menu);
129
- } else if (disableInput && !showIncDec) {
130
- this.replaceButton = domUtils.createElement(
131
- 'button',
132
- { class: 'se-btn se-tooltip se-btn-select se-btn-tool-font-size', 'data-command': FontSize.key, 'data-type': 'dropdown' },
133
- `<span class="se-txt __se__font_size">${this.lang.fontSize}</span>${this.icons.arrow_down}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.fontSize}</span></span>`
134
- );
135
- this.menu.initDropdownTarget({ key: FontSize.key, type: 'dropdown' }, menu);
136
- }
88
+ /**
89
+ * @class
90
+ * @description FontSize Plugin
91
+ * - This plugin enables users to modify the font size of selected text within the editor.
92
+ * - It supports various measurement units (e.g., 'px', 'pt', 'em', 'rem', 'vw', 'vh', '%') and
93
+ * - provides multiple interfaces: dropdown menus, direct input, and optional increment/decrement buttons.
94
+ */
95
+ class FontSize extends EditorInjector {
96
+ static key = 'fontSize';
97
+ static type = 'input';
98
+ static className = 'se-btn-select se-btn-input se-btn-tool-font-size';
99
+
100
+ /**
101
+ * @constructor
102
+ * @param {__se__EditorCore} editor - The root editor instance
103
+ * @param {Object} pluginOptions - Configuration options for the FontSize plugin.
104
+ * @param {string=} [pluginOptions.sizeUnit='px'] - The unit for the font size.
105
+ * - Accepted values include: 'px', 'pt', 'em', 'rem', 'vw', 'vh', '%' or 'text'.
106
+ * - If 'text' is used, a text-based font size list is applied.
107
+ * @param {boolean=} [pluginOptions.showDefaultSizeLabel=true] - Determines whether the default size label is displayed in the dropdown menu.
108
+ * @param {boolean=} [pluginOptions.showIncDecControls=false] - When true, displays increase and decrease buttons for font size adjustments.
109
+ * @param {boolean=} [pluginOptions.disableInput=true] - When true, disables the direct font size input box.
110
+ * @param {Object<string, {default: number, inc: number, min: number, max: number, list: Array<number>}>} [pluginOptions.unitMap={}] - Optional object to override or extend the default unit mapping for font sizes.
111
+ */
112
+ constructor(editor, pluginOptions) {
113
+ super(editor);
114
+
115
+ // create HTML
116
+ this.unitMap = { ...DEFAULT_UNIT_MAP, ...(pluginOptions.unitMap || {}) };
117
+ this.sizeUnit = /text/.test(pluginOptions.sizeUnit) ? '' : pluginOptions.sizeUnit || this.options.get('fontSizeUnits')[0];
118
+
119
+ const unitMap = this.unitMap[this.sizeUnit || 'text'];
120
+ const menu = CreateHTML(editor, unitMap, this.sizeUnit, pluginOptions.showDefaultSizeLabel);
121
+
122
+ // plugin basic properties
123
+ const showIncDec = this.sizeUnit ? pluginOptions.showIncDecControls ?? false : false;
124
+ const disableInput = this.sizeUnit ? pluginOptions.disableInput ?? false : true;
125
+
126
+ this.title = this.lang.fontSize;
127
+ this.inner =
128
+ disableInput && !showIncDec
129
+ ? false
130
+ : disableInput
131
+ ? `<span class="se-txt se-not-arrow-text __se__font_size">${this.lang.fontSize}</span>`
132
+ : `<input type="text" class="__se__font_size se-not-arrow-text" placeholder="${this.lang.fontSize}" />`;
133
+
134
+ // increase, decrease buttons
135
+ if (showIncDec) {
136
+ this.beforeItem = dom.utils.createElement(
137
+ 'button',
138
+ { class: 'se-btn se-tooltip se-sub-btn', 'data-command': FontSize.key, 'data-type': 'command', 'data-value': 'dec' },
139
+ `${this.icons.minus}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.decrease}</span></span>`
140
+ );
141
+ this.afterItem = dom.utils.createElement(
142
+ 'button',
143
+ { class: 'se-btn se-tooltip se-sub-btn', 'data-command': FontSize.key, 'data-type': 'command', 'data-value': 'inc' },
144
+ `${this.icons.plus}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.increase}</span></span>`
145
+ );
146
+ } else if (!disableInput) {
147
+ this.afterItem = dom.utils.createElement(
148
+ 'button',
149
+ { class: 'se-btn se-tooltip se-sub-arrow-btn', 'data-command': FontSize.key, 'data-type': 'dropdown' },
150
+ `${this.icons.arrow_down}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.fontSize}</span></span>`
151
+ );
152
+ this.menu.initDropdownTarget({ key: FontSize.key, type: 'dropdown' }, menu);
153
+ } else if (disableInput && !showIncDec) {
154
+ this.replaceButton = dom.utils.createElement(
155
+ 'button',
156
+ { class: 'se-btn se-tooltip se-btn-select se-btn-tool-font-size', 'data-command': FontSize.key, 'data-type': 'dropdown' },
157
+ `<span class="se-txt __se__font_size">${this.lang.fontSize}</span>${this.icons.arrow_down}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.fontSize}</span></span>`
158
+ );
159
+ this.menu.initDropdownTarget({ key: FontSize.key, type: 'dropdown' }, menu);
160
+ }
137
161
 
138
- // members
139
- this.currentSize = '';
140
- this.sizeList = menu.querySelectorAll('li button');
141
- this.hasInputFocus = false;
142
- this.isInputActive = false; // input target event
143
- this._disableInput = disableInput;
162
+ // members
163
+ this.currentSize = '';
164
+ this.sizeList = menu.querySelectorAll('li button');
165
+ this.hasInputFocus = false;
166
+ this.isInputActive = false; // input target event
167
+ this._disableInput = disableInput;
144
168
 
145
- // init
146
- this.menu.initDropdownTarget(FontSize, menu);
147
- };
169
+ // init
170
+ this.menu.initDropdownTarget(FontSize, menu);
171
+ }
148
172
 
149
- FontSize.key = 'fontSize';
150
- FontSize.type = 'input';
151
- FontSize.className = 'se-btn-select se-btn-input se-btn-tool-font-size';
152
- FontSize.prototype = {
153
173
  /**
154
- * @override core
174
+ * @editorMethod Editor.EventManager
175
+ * @description Executes the method that is called whenever the cursor position changes.
176
+ * @param {?HTMLElement=} element - Node element where the cursor is currently located
177
+ * @param {?HTMLElement=} target - The plugin's toolbar button element
178
+ * @returns {boolean} - Whether the plugin is active
155
179
  */
156
180
  active(element, target) {
157
- if (!domUtils.hasClass(target, '__se__font_size')) return false;
181
+ if (!dom.utils.hasClass(target, '__se__font_size')) return false;
158
182
 
159
183
  if (!element) {
160
184
  this._setSize(target, this._getDefaultSize());
@@ -164,15 +188,19 @@ FontSize.prototype = {
164
188
  }
165
189
 
166
190
  return false;
167
- },
191
+ }
168
192
 
169
193
  /**
170
- * @override core
194
+ * @editorMethod Editor.Toolbar
195
+ * @description Executes the event function of toolbar's input tag - "keydown".
196
+ * @param {Object} params
197
+ * @param {HTMLElement} params.target Input element
198
+ * @param {KeyboardEvent} params.event Event object
171
199
  */
172
200
  onInputKeyDown({ target, event }) {
173
- const keyCode = event.keyCode;
201
+ const keyCode = event.code;
174
202
 
175
- if (this._disableInput || keyCode === 32) {
203
+ if (this._disableInput || keyCodeMap.isSpace(keyCode)) {
176
204
  event.preventDefault();
177
205
  return;
178
206
  }
@@ -182,16 +210,17 @@ FontSize.prototype = {
182
210
  const { value, unit } = this._getSize(target);
183
211
  if (!value) return;
184
212
 
213
+ const numValue = numbers.get(value);
185
214
  const unitMap = this.unitMap[unit];
186
- let changeValue = value;
215
+ let changeValue = numValue;
187
216
  switch (keyCode) {
188
- case 38: //up
217
+ case 'ArrowUp': //up
189
218
  changeValue += unitMap.inc;
190
- if (changeValue > unitMap.max) changeValue = value;
219
+ if (changeValue > unitMap.max) changeValue = numValue;
191
220
  break;
192
- case 40: //down
221
+ case 'ArrowDown': //down
193
222
  changeValue -= unitMap.inc;
194
- if (changeValue < unitMap.min) changeValue = value;
223
+ if (changeValue < unitMap.min) changeValue = numValue;
195
224
  }
196
225
 
197
226
  event.preventDefault();
@@ -201,17 +230,19 @@ FontSize.prototype = {
201
230
  const size = this._setSize(target, changeValue + unit);
202
231
  if (this._disableInput) return;
203
232
 
204
- const newNode = domUtils.createElement('SPAN', { style: 'font-size: ' + size + ';' });
205
- this.format.applyTextStyle(newNode, ['font-size'], null, null);
233
+ const newNode = dom.utils.createElement('SPAN', { style: 'font-size: ' + size + ';' });
234
+ this.format.applyInlineElement(newNode, { stylesToModify: ['font-size'], nodesToRemove: null, strictRemove: null });
206
235
 
207
- if (keyCode !== 13) target.focus();
236
+ if (!keyCodeMap.isEnter(keyCode)) target.focus();
208
237
  } finally {
209
238
  this.isInputActive = false;
210
239
  }
211
- },
240
+ }
212
241
 
213
242
  /**
214
- * @override core
243
+ * @editorMethod Editor.Toolbar
244
+ * @description Executes the event function of toolbar's input tag - "change".
245
+ * @param {__se__PluginToolbarInputChangeEventInfo} params
215
246
  */
216
247
  onInputChange({ target, value: changeValue, event }) {
217
248
  if (this._disableInput) return;
@@ -224,17 +255,19 @@ FontSize.prototype = {
224
255
  const { max, min } = this.unitMap[unit];
225
256
  value = value > max ? max : value < min ? min : value;
226
257
 
227
- const newNode = domUtils.createElement('SPAN', { style: 'font-size: ' + this._setSize(target, value + unit) + ';' });
228
- this.format.applyTextStyle(newNode, ['font-size'], null, null);
258
+ const newNode = dom.utils.createElement('SPAN', { style: 'font-size: ' + this._setSize(target, value + unit) + ';' });
259
+ this.format.applyInlineElement(newNode, { stylesToModify: ['font-size'], nodesToRemove: null, strictRemove: null });
229
260
  } finally {
230
261
  this.isInputActive = false;
231
262
  event.preventDefault();
232
263
  this.editor.focus();
233
264
  }
234
- },
265
+ }
235
266
 
236
267
  /**
237
- * @override dropdown
268
+ * @editorMethod Modules.Dropdown
269
+ * @description Executes the method that is called when a plugin's dropdown menu is opened.
270
+ * @param {HTMLElement} target Line element at the current cursor position
238
271
  */
239
272
  on(target) {
240
273
  const { value, unit } = this._getSize(target);
@@ -245,44 +278,59 @@ FontSize.prototype = {
245
278
  const sizeList = this.sizeList;
246
279
  for (let i = 0, len = sizeList.length; i < len; i++) {
247
280
  if (currentSize === sizeList[i].getAttribute('data-value')) {
248
- domUtils.addClass(sizeList[i], 'active');
281
+ dom.utils.addClass(sizeList[i], 'active');
249
282
  } else {
250
- domUtils.removeClass(sizeList[i], 'active');
283
+ dom.utils.removeClass(sizeList[i], 'active');
251
284
  }
252
285
  }
253
286
 
254
287
  this.currentSize = currentSize;
255
- },
288
+ }
256
289
 
257
290
  /**
258
- * @override
259
- * @param {Element} target Target command button
291
+ * @editorMethod Editor.core
292
+ * @description Executes the main execution method of the plugin.
293
+ * - Called when an item in the "dropdown" menu is clicked.
294
+ * @param {HTMLElement} target - The plugin's toolbar button element
260
295
  */
261
296
  action(target) {
262
297
  const commandValue = target.getAttribute('data-command');
263
298
 
264
299
  if (commandValue === FontSize.key) {
265
300
  const { value, unit } = this._getSize(target);
266
- let newSize = value + (target.getAttribute('data-value') === 'inc' ? 1 : -1);
301
+ let newSize = numbers.get(value) + (target.getAttribute('data-value') === 'inc' ? 1 : -1);
267
302
  const { min, max } = this.unitMap[unit];
268
303
  newSize = newSize < min ? min : newSize > max ? max : newSize;
269
304
 
270
- const newNode = domUtils.createElement('SPAN', { style: 'font-size: ' + newSize + unit + ';' });
271
- this.format.applyTextStyle(newNode, ['font-size'], null, null);
305
+ const newNode = dom.utils.createElement('SPAN', { style: 'font-size: ' + newSize + unit + ';' });
306
+ this.format.applyInlineElement(newNode, { stylesToModify: ['font-size'], nodesToRemove: null, strictRemove: null });
272
307
  } else if (commandValue) {
273
- const newNode = domUtils.createElement('SPAN', { style: 'font-size: ' + commandValue + ';' });
274
- this.format.applyTextStyle(newNode, ['font-size'], null, null);
308
+ const newNode = dom.utils.createElement('SPAN', { style: 'font-size: ' + commandValue + ';' });
309
+ this.format.applyInlineElement(newNode, { stylesToModify: ['font-size'], nodesToRemove: null, strictRemove: null });
275
310
  } else {
276
- this.format.applyTextStyle(null, ['font-size'], ['span'], true);
311
+ this.format.applyInlineElement(null, { stylesToModify: ['font-size'], nodesToRemove: ['span'], strictRemove: true });
277
312
  }
278
313
 
279
314
  this.menu.dropdownOff();
280
- },
315
+ }
281
316
 
317
+ /**
318
+ * @private
319
+ * @description Retrieves the default font size of the editor.
320
+ * @returns {string} - The computed font size from the editor.
321
+ */
282
322
  _getDefaultSize() {
283
323
  return this.editor.frameContext.get('wwComputedStyle').fontSize;
284
- },
324
+ }
285
325
 
326
+ /**
327
+ * @private
328
+ * @description Extracts the font size and unit from the given element or input value.
329
+ * @param {string|Element} target - The target input or element.
330
+ * @returns {{ unit: string, value: number|string }} - An object containing:
331
+ * - `unit` (string): The detected font size unit.
332
+ * - `value` (number|string): The numeric font size value or text-based size.
333
+ */
286
334
  _getSize(target) {
287
335
  target = typeof target === 'string' ? target : target.parentElement.querySelector('.__se__font_size');
288
336
  if (!target)
@@ -291,34 +339,39 @@ FontSize.prototype = {
291
339
  value: this.sizeUnit ? 0 : ''
292
340
  };
293
341
 
294
- const size = typeof target === 'string' ? target : /^INPUT$/i.test(target.nodeName) ? target.value : target.textContent;
342
+ const size = typeof target === 'string' ? target : dom.check.isInputElement(target) ? target.value : target.textContent;
295
343
  const splitValue = this.sizeUnit ? size.split(/(\d+)/) : [size, ''];
296
344
 
297
345
  let unit = (splitValue.pop() || '').trim().toLowerCase();
298
346
  unit = this.options.get('fontSizeUnits').includes(unit) ? unit : this.sizeUnit;
299
347
 
300
- let value = splitValue.pop();
301
- value = unit ? value * 1 : value;
348
+ const tempValue = splitValue.pop();
349
+ const value = unit ? Number(tempValue) : tempValue;
302
350
 
303
351
  return {
304
352
  unit,
305
353
  value
306
354
  };
307
- },
355
+ }
308
356
 
357
+ /**
358
+ * @private
359
+ * @description Sets the font size in the toolbar input field or button label.
360
+ * @param {HTMLElement} target - The target element in the toolbar.
361
+ * @param {string|number} value - The font size value.
362
+ * @returns {string|number} - The applied font size.
363
+ */
309
364
  _setSize(target, value) {
310
365
  target = target.parentElement.querySelector('.__se__font_size');
311
366
  if (!target) return 0;
312
367
 
313
- if (/^INPUT$/i.test(target.nodeName)) {
314
- return (target.value = value);
368
+ if (dom.check.isInputElement(target)) {
369
+ return (target.value = String(value));
315
370
  } else {
316
- return (target.textContent = this.sizeUnit ? value : this.unitMap.text.list.find((v) => v.size === value)?.title || value);
371
+ return (target.textContent = String(this.sizeUnit ? value : this.unitMap.text.list.find((v) => v.size === value)?.title || value));
317
372
  }
318
- },
319
-
320
- constructor: FontSize
321
- };
373
+ }
374
+ }
322
375
 
323
376
  function CreateHTML({ lang }, unitMap, sizeUnit, showDefaultSizeLabel) {
324
377
  const sizeList = unitMap.list;
@@ -351,7 +404,7 @@ function CreateHTML({ lang }, unitMap, sizeUnit, showDefaultSizeLabel) {
351
404
  </ul>
352
405
  </div>`;
353
406
 
354
- return domUtils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-font-size' }, list);
407
+ return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-font-size' }, list);
355
408
  }
356
409
 
357
410
  export default FontSize;
@@ -0,0 +1,70 @@
1
+ import EditorInjector from '../../editorInjector';
2
+ import { dom } from '../../helper';
3
+
4
+ /**
5
+ * @class
6
+ * @description PageNavigator Plugin
7
+ * - This plugin provides functionality for navigating between pages within the editor's document.
8
+ * - It features an input field for entering the desired page number and a display element showing
9
+ * - the total number of pages. When the user changes the value in the input field, the plugin triggers
10
+ * - a page navigation event through the editor's document context.
11
+ */
12
+ class PageNavigator extends EditorInjector {
13
+ static key = 'pageNavigator';
14
+ static type = 'input';
15
+ static className = 'se-btn-input se-btn-tool-pageNavigator';
16
+
17
+ /**
18
+ * @constructor
19
+ * @param {__se__EditorCore} editor - The root editor instance
20
+ */
21
+ constructor(editor) {
22
+ super(editor);
23
+
24
+ // create HTML
25
+ this.title = this.lang.pageNumber;
26
+ this.inner = CreateInner();
27
+ this.afterItem = dom.utils.createElement('span', { class: 'se-btn se-sub-btn' }, ``);
28
+
29
+ // members
30
+ this.pageNum = 1;
31
+ this.totalPages = 1;
32
+
33
+ // init
34
+ this.eventManager.addEvent(this.inner, 'change', this.#OnChangeInner.bind(this));
35
+ }
36
+ /**
37
+ * @editorMethod Editor.documentType
38
+ * @description Updates the displayed page number and total pages in the navigator.
39
+ * @param {number} pageNum - The current page number to display.
40
+ * @param {number} totalPages - The total number of pages in the document.
41
+ */
42
+ display(pageNum, totalPages) {
43
+ // data update
44
+ this.pageNum = pageNum;
45
+ this.totalPages = totalPages;
46
+ // display
47
+ this.inner.value = String(pageNum);
48
+ this.afterItem.textContent = this.inner.max = String(totalPages);
49
+ }
50
+
51
+ /**
52
+ * @description Page number change event handler
53
+ * @param {InputEvent} e - Event object
54
+ */
55
+ #OnChangeInner(e) {
56
+ if (!this.editor.frameContext.has('documentType-use-page')) return;
57
+
58
+ /** @type {HTMLInputElement} */
59
+ const eventTarget = dom.query.getEventTarget(e);
60
+
61
+ const value = Number(eventTarget.value) || 1;
62
+ this.editor.frameContext.get('documentType').pageGo(value);
63
+ }
64
+ }
65
+
66
+ function CreateInner() {
67
+ return /** @type {HTMLInputElement} */ (dom.utils.createElement('input', { type: 'number', class: 'se-not-arrow-text', placeholder: '1', value: '1', min: '1' }, null));
68
+ }
69
+
70
+ export default PageNavigator;