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
@@ -0,0 +1,422 @@
1
+ /**
2
+ * @fileoverview UI class
3
+ */
4
+
5
+ import CoreInjector from '../../editorInjector/_core';
6
+ import { dom, converter, keyCodeMap, env } from '../../helper';
7
+ const { _w } = env;
8
+
9
+ /**
10
+ * @typedef {Omit<UI & Partial<__se__EditorInjector>, 'ui'>} UIThis
11
+ */
12
+
13
+ /**
14
+ * @constructor
15
+ * @this {UIThis}
16
+ * @description The UI class is a class that handles operations related to the user interface of SunEditor.
17
+ * - This class sets the editor's style, theme, editor mode, etc., and controls the state of various UI elements.
18
+ * @param {__se__EditorCore} editor - The root editor instance
19
+ */
20
+ function UI(editor) {
21
+ CoreInjector.call(this, editor);
22
+
23
+ // members
24
+ this._controllerOnBtnDisabled = false;
25
+
26
+ // members - modal
27
+ const alertModal = CreateAlertHTML(editor);
28
+ this.alertModal = alertModal;
29
+ this.alertMessage = alertModal.querySelector('span');
30
+ this._alertArea = /** @type {HTMLElement} */ (this.carrierWrapper.querySelector('.se-alert'));
31
+ this._alertInner = /** @type {HTMLElement} */ (this.carrierWrapper.querySelector('.se-alert .se-modal-inner'));
32
+ this._alertInner.appendChild(alertModal);
33
+
34
+ this._closeListener = [CloseListener.bind(this), OnClick_alert.bind(this)];
35
+ this._closeSignal = !this.eventManager.addEvent(alertModal.querySelector('[data-command="close"]'), 'click', this.alertClose.bind(this));
36
+ this._bindClose = null;
37
+ this._backWrapper = /** @type {HTMLElement} */ (this.carrierWrapper.querySelector('.se-back-wrapper'));
38
+
39
+ // members - toast
40
+ const toastPopup = CreateToastHTML();
41
+ this.toastPopup = toastPopup;
42
+ this.toastContainer = toastPopup.querySelector('.se-toast-container');
43
+ this.toastMessage = toastPopup.querySelector('span');
44
+ this.carrierWrapper.appendChild(toastPopup);
45
+ this._toastToggle = null;
46
+ }
47
+
48
+ UI.prototype = {
49
+ /**
50
+ * @this {UIThis}
51
+ * @description Set "options.get('editorStyle')" style.
52
+ * - Define the style of the edit area
53
+ * - It can also be defined with the "setOptions" method, but the "setEditorStyle" method does not render the editor again.
54
+ * @param {string} style Style string
55
+ * @param {__se__FrameContext|null} fc Frame context
56
+ */
57
+ setEditorStyle(style, fc) {
58
+ fc = fc || this.editor.frameContext;
59
+ const fo = fc.get('options');
60
+
61
+ const newStyles = converter._setDefaultOptionStyle(fo, style);
62
+ fo.set('_defaultStyles', newStyles);
63
+
64
+ // top area
65
+ fc.get('topArea').style.cssText = newStyles.top;
66
+
67
+ // code view
68
+ const code = fc.get('code');
69
+ code.style.cssText = fo.get('_defaultStyles').frame;
70
+ code.style.display = 'none';
71
+
72
+ // wysiwyg frame
73
+ if (!fo.get('iframe')) {
74
+ fc.get('wysiwygFrame').style.cssText = newStyles.frame + newStyles.editor;
75
+ } else {
76
+ fc.get('wysiwygFrame').style.cssText = newStyles.frame;
77
+ fc.get('wysiwyg').style.cssText = newStyles.editor;
78
+ }
79
+ },
80
+
81
+ /**
82
+ * @this {UIThis}
83
+ * @description Set the theme to the editor
84
+ * @param {string} theme Theme name
85
+ */
86
+ setTheme(theme) {
87
+ if (typeof theme !== 'string') return;
88
+ const o = this.options;
89
+ const prevTheme = o.get('_themeClass').trim();
90
+ o.set('theme', theme || '');
91
+ o.set('_themeClass', theme ? ` se-theme-${theme}` : '');
92
+ theme = o.get('_themeClass').trim();
93
+
94
+ const applyTheme = (target) => {
95
+ if (!target) return;
96
+ if (prevTheme) dom.utils.removeClass(target, prevTheme);
97
+ if (theme) dom.utils.addClass(target, theme);
98
+ };
99
+
100
+ applyTheme(this.carrierWrapper);
101
+ this.editor.applyFrameRoots((e) => {
102
+ applyTheme(e.get('topArea'));
103
+ applyTheme(e.get('wysiwyg'));
104
+ });
105
+
106
+ applyTheme(this.context.get('statusbar._wrapper'));
107
+ applyTheme(this.context.get('toolbar._wrapper'));
108
+ },
109
+
110
+ /**
111
+ * @this {UIThis}
112
+ * @description Switch to or off "ReadOnly" mode.
113
+ * @param {boolean} value "readOnly" boolean value.
114
+ * @param {string|undefined} rootKey Root key
115
+ */
116
+ readOnly(value, rootKey) {
117
+ const fc = rootKey ? this.frameRoots.get(rootKey) : this.editor.frameContext;
118
+
119
+ fc.set('isReadOnly', !!value);
120
+ dom.utils.setDisabled(this.editor._controllerOnDisabledButtons, !!value);
121
+
122
+ if (value) {
123
+ this._offCurrentController();
124
+ this._offCurrentModal();
125
+
126
+ if (this.toolbar?.currentMoreLayerActiveButton?.disabled) this.toolbar._moreLayerOff();
127
+ if (this.subToolbar?.currentMoreLayerActiveButton?.disabled) this.subToolbar._moreLayerOff();
128
+ if (this.menu?.currentDropdownActiveButton?.disabled) this.menu.dropdownOff();
129
+ if (this.menu?.currentContainerActiveButton?.disabled) this.menu.containerOff();
130
+
131
+ fc.get('code').setAttribute('readOnly', 'true');
132
+ dom.utils.addClass(fc.get('wysiwyg'), 'se-read-only');
133
+ } else {
134
+ fc.get('code').removeAttribute('readOnly');
135
+ dom.utils.removeClass(fc.get('wysiwyg'), 'se-read-only');
136
+ }
137
+
138
+ if (this.options.get('hasCodeMirror')) {
139
+ this.viewer._codeMirrorEditor('readonly', !!value, rootKey);
140
+ }
141
+ },
142
+
143
+ /**
144
+ * @this {UIThis}
145
+ * @description Disable the suneditor
146
+ * @param {string|undefined} rootKey Root key
147
+ */
148
+ disable(rootKey) {
149
+ const fc = rootKey ? this.frameRoots.get(rootKey) : this.editor.frameContext;
150
+
151
+ this.toolbar.disable();
152
+ this._offCurrentController();
153
+ this._offCurrentModal();
154
+
155
+ fc.get('wysiwyg').setAttribute('contenteditable', false);
156
+ fc.set('isDisabled', true);
157
+
158
+ if (this.options.get('hasCodeMirror')) {
159
+ this.viewer._codeMirrorEditor('readonly', true, rootKey);
160
+ } else {
161
+ fc.get('code').disabled = true;
162
+ }
163
+ },
164
+
165
+ /**
166
+ * @this {UIThis}
167
+ * @description Enable the suneditor
168
+ * @param {string|undefined} rootKey Root key
169
+ */
170
+ enable(rootKey) {
171
+ const fc = rootKey ? this.frameRoots.get(rootKey) : this.editor.frameContext;
172
+
173
+ this.toolbar.enable();
174
+ fc.get('wysiwyg').setAttribute('contenteditable', true);
175
+ fc.set('isDisabled', false);
176
+
177
+ if (this.options.get('hasCodeMirror')) {
178
+ this.viewer._codeMirrorEditor('readonly', false, rootKey);
179
+ } else {
180
+ fc.get('code').disabled = false;
181
+ }
182
+ },
183
+
184
+ /**
185
+ * @this {UIThis}
186
+ * @description Show the suneditor
187
+ * @param {string|undefined} rootKey Root key
188
+ */
189
+ show(rootKey) {
190
+ const fc = rootKey ? this.frameRoots.get(rootKey) : this.editor.frameContext;
191
+ const topAreaStyle = fc.get('topArea').style;
192
+ if (topAreaStyle.display === 'none') topAreaStyle.display = 'block';
193
+ },
194
+
195
+ /**
196
+ * @this {UIThis}
197
+ * @description Hide the suneditor
198
+ * @param {string|undefined} rootKey Root key
199
+ */
200
+ hide(rootKey) {
201
+ const fc = rootKey ? this.frameRoots.get(rootKey) : this.editor.frameContext;
202
+ fc.get('topArea').style.display = 'none';
203
+ },
204
+
205
+ /**
206
+ * @this {UIThis}
207
+ * @description Show loading box
208
+ * @param {string=} rootKey Root key
209
+ */
210
+ showLoading(rootKey) {
211
+ (rootKey ? this.frameRoots.get(rootKey).get('container') : this.carrierWrapper).querySelector('.se-loading-box').style.display = 'block';
212
+ },
213
+
214
+ /**
215
+ * @this {UIThis}
216
+ * @description Hide loading box
217
+ * @param {string=} rootKey Root key
218
+ */
219
+ hideLoading(rootKey) {
220
+ (rootKey ? this.frameRoots.get(rootKey).get('container') : this.carrierWrapper).querySelector('.se-loading-box').style.display = 'none';
221
+ },
222
+
223
+ /**
224
+ * @this {UIThis}
225
+ * @description This method disables or enables the toolbar buttons when the controller is activated or deactivated.
226
+ * - When the controller is activated, the toolbar buttons are disabled; when the controller is deactivated, the buttons are enabled.
227
+ * @param {boolean} active If `true`, the toolbar buttons will be disabled. If `false`, the toolbar buttons will be enabled.
228
+ */
229
+ setControllerOnDisabledButtons(active) {
230
+ if (active && !this._controllerOnBtnDisabled) {
231
+ dom.utils.setDisabled(this.editor._controllerOnDisabledButtons, true);
232
+ this._controllerOnBtnDisabled = true;
233
+ } else if (!active && this._controllerOnBtnDisabled) {
234
+ dom.utils.setDisabled(this.editor._controllerOnDisabledButtons, false);
235
+ this._controllerOnBtnDisabled = false;
236
+ }
237
+ },
238
+
239
+ /**
240
+ * @this {UIThis}
241
+ * @description Activate the transparent background "div" so that other elements are not affected during resizing.
242
+ * @param {string} cursor cursor css property
243
+ */
244
+ enableBackWrapper(cursor) {
245
+ this._backWrapper.style.cursor = cursor;
246
+ this._backWrapper.style.display = 'block';
247
+ },
248
+
249
+ /**
250
+ * @this {UIThis}
251
+ * @description Disabled background "div"
252
+ */
253
+ disableBackWrapper() {
254
+ this._backWrapper.style.display = 'none';
255
+ this._backWrapper.style.cursor = 'default';
256
+ },
257
+
258
+ /**
259
+ * @this {UIThis}
260
+ * @description Open the alert panel
261
+ * @param {string} text alert message
262
+ * @param {""|"error"|"success"} type alert type
263
+ */
264
+ alertOpen(text, type) {
265
+ this.alertMessage.textContent = text;
266
+
267
+ dom.utils.removeClass(this.alertModal, 'se-alert-error|se-alert-success');
268
+ if (type) dom.utils.addClass(this.alertModal, `se-alert-${type}`);
269
+
270
+ if (this._closeSignal) this._alertInner.addEventListener('click', this._closeListener[1]);
271
+ if (this._bindClose) this._bindClose = this.eventManager.removeGlobalEvent(this._bindClose);
272
+ this._bindClose = this.eventManager.addGlobalEvent('keydown', this._closeListener[0]);
273
+
274
+ this._alertArea.style.display = 'block';
275
+ dom.utils.addClass(this.alertModal, 'se-modal-show');
276
+ },
277
+
278
+ /**
279
+ * @this {UIThis}
280
+ * @description Close the alert panel
281
+ */
282
+ alertClose() {
283
+ dom.utils.removeClass(this.alertModal, 'se-modal-show');
284
+ dom.utils.removeClass(this.alertModal, 'se-alert-*');
285
+ this._alertArea.style.display = 'none';
286
+ if (this._closeSignal) this._alertInner.removeEventListener('click', this._closeListener[1]);
287
+ if (this._bindClose) this._bindClose = this.eventManager.removeGlobalEvent(this._bindClose);
288
+ },
289
+
290
+ /**
291
+ * @description Show toast
292
+ * @param {string} message toast message
293
+ * @param {number} [duration=1000] duration time(ms)
294
+ * @param {""|"error"|"success"} [type=""] duration time(ms)
295
+ */
296
+ showToast(message, duration = 1000, type) {
297
+ if (dom.utils.hasClass(this.toastContainer, 'se-toast-show')) {
298
+ this.closeToast();
299
+ }
300
+
301
+ dom.utils.removeClass(this.toastPopup, 'se-toast-error|se-toast-success');
302
+ if (type) dom.utils.addClass(this.toastPopup, `se-toast-${type}`);
303
+
304
+ this.toastPopup.style.display = 'block';
305
+ this.toastMessage.textContent = message;
306
+ dom.utils.addClass(this.toastContainer, 'se-toast-show');
307
+
308
+ // remove after animation
309
+ this._toastToggle = _w.setTimeout(() => {
310
+ this.closeToast();
311
+ }, duration);
312
+ },
313
+
314
+ /**
315
+ * @description Close toast
316
+ */
317
+ closeToast() {
318
+ if (this._toastToggle) _w.clearTimeout(this._toastToggle);
319
+ this._toastToggle = null;
320
+ dom.utils.removeClass(this.toastContainer, 'se-toast-show');
321
+ this.toastPopup.style.display = 'none';
322
+ },
323
+
324
+ /**
325
+ * @private
326
+ * @this {UIThis}
327
+ * @description visible controllers
328
+ * @param {boolean} value hidden/show
329
+ * @param {?boolean=} lineBreakShow Line break hidden/show (default: Follows the value "value".)
330
+ */
331
+ _visibleControllers(value, lineBreakShow) {
332
+ const visible = value ? '' : 'hidden';
333
+ const breakerVisible = lineBreakShow ?? visible ? '' : 'hidden';
334
+
335
+ const cont = this.editor.opendControllers;
336
+ for (let i = 0, c; i < cont.length; i++) {
337
+ c = cont[i];
338
+ if (c.form) c.form.style.visibility = visible;
339
+ }
340
+
341
+ this.editor._lineBreaker_t.style.visibility = breakerVisible;
342
+ this.editor._lineBreaker_b.style.visibility = breakerVisible;
343
+ },
344
+
345
+ /**
346
+ * @private
347
+ * @this {UIThis}
348
+ * @description Off current controllers
349
+ */
350
+ _offCurrentController() {
351
+ this.component.__deselect();
352
+ },
353
+
354
+ /**
355
+ * @private
356
+ * @this {UIThis}
357
+ * @description Off controllers
358
+ */
359
+ __offControllers() {
360
+ const cont = this.editor.opendControllers;
361
+ const fixedCont = [];
362
+ for (let i = 0, c; i < cont.length; i++) {
363
+ c = cont[i];
364
+ if (c.fixed) {
365
+ fixedCont.push(c);
366
+ continue;
367
+ }
368
+ if (typeof c.inst.close === 'function') c.inst.close();
369
+ if (c.form) c.form.style.display = 'none';
370
+ }
371
+ this.editor.opendControllers = fixedCont;
372
+ this.editor.currentControllerName = '';
373
+ this.editor._preventBlur = false;
374
+ },
375
+
376
+ /**
377
+ * @private
378
+ * @this {UIThis}
379
+ * @description Off current modal
380
+ */
381
+ _offCurrentModal() {
382
+ if (this.editor.opendModal) {
383
+ this.editor.opendModal.close();
384
+ }
385
+ },
386
+
387
+ constructor: UI
388
+ };
389
+
390
+ /**
391
+ * @private
392
+ * @this {UIThis}
393
+ * @param {MouseEvent} e - Event object
394
+ */
395
+ function OnClick_alert(e) {
396
+ const eventTarget = dom.query.getEventTarget(e);
397
+ if (/close/.test(eventTarget.getAttribute('data-command')) || eventTarget === this._alertInner) {
398
+ this.alertClose();
399
+ }
400
+ }
401
+
402
+ /**
403
+ * @private
404
+ * @this {UIThis}
405
+ * @param {KeyboardEvent} e - Event object
406
+ */
407
+ function CloseListener(e) {
408
+ if (!keyCodeMap.isEsc(e.code)) return;
409
+ this.alertClose();
410
+ }
411
+
412
+ function CreateAlertHTML({ lang, icons }) {
413
+ const html = '<div><button class="close" data-command="close" title="' + lang.close + '">' + icons.cancel + '</button></div><div><span></span></div>';
414
+ return dom.utils.createElement('DIV', { class: 'se-alert-content' }, html);
415
+ }
416
+
417
+ function CreateToastHTML() {
418
+ const html = '<div class="se-toast-container"><span></span></div>';
419
+ return dom.utils.createElement('DIV', { class: 'se-toast' }, html);
420
+ }
421
+
422
+ export default UI;