suneditor 2.46.1 → 3.0.0-alpha.1

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 (290) hide show
  1. package/.eslintignore +7 -0
  2. package/.eslintrc.json +64 -0
  3. package/CONTRIBUTING.md +36 -0
  4. package/LICENSE.txt +1 -1
  5. package/README.md +174 -805
  6. package/dist/suneditor.min.css +1 -0
  7. package/dist/suneditor.min.js +1 -2
  8. package/package.json +96 -70
  9. package/src/assets/icons/_default.js +194 -0
  10. package/src/assets/suneditor-content.css +646 -0
  11. package/src/assets/suneditor.css +3378 -0
  12. package/src/core/base/eventHandlers/handler_toolbar.js +114 -0
  13. package/src/core/base/eventHandlers/handler_ww_clipboard.js +31 -0
  14. package/src/core/base/eventHandlers/handler_ww_dragDrop.js +69 -0
  15. package/src/core/base/eventHandlers/handler_ww_key_input.js +975 -0
  16. package/src/core/base/eventHandlers/handler_ww_mouse.js +118 -0
  17. package/src/core/base/eventManager.js +1115 -0
  18. package/src/core/base/events.js +320 -0
  19. package/src/core/base/history.js +301 -0
  20. package/src/core/class/char.js +146 -0
  21. package/src/core/class/component.js +627 -0
  22. package/src/core/class/format.js +3255 -0
  23. package/src/core/class/html.js +1621 -0
  24. package/src/core/class/menu.js +260 -0
  25. package/src/core/class/nodeTransform.js +379 -0
  26. package/src/core/class/notice.js +42 -0
  27. package/src/core/class/offset.js +578 -0
  28. package/src/core/class/selection.js +508 -0
  29. package/src/core/class/shortcuts.js +38 -0
  30. package/src/core/class/toolbar.js +440 -0
  31. package/src/core/class/viewer.js +646 -0
  32. package/src/core/editor.js +1593 -0
  33. package/src/core/section/actives.js +107 -0
  34. package/src/core/section/constructor.js +1237 -0
  35. package/src/core/section/context.js +97 -0
  36. package/src/editorInjector/_classes.js +22 -0
  37. package/src/editorInjector/_core.js +28 -0
  38. package/src/editorInjector/index.js +13 -0
  39. package/src/helper/converter.js +313 -0
  40. package/src/helper/domUtils.js +1177 -0
  41. package/src/helper/env.js +250 -0
  42. package/src/helper/index.js +19 -0
  43. package/src/helper/numbers.js +68 -0
  44. package/src/helper/unicode.js +43 -0
  45. package/src/langs/ckb.js +161 -0
  46. package/src/langs/cs.js +161 -0
  47. package/src/langs/da.js +161 -0
  48. package/src/langs/de.js +162 -0
  49. package/src/langs/en.js +199 -0
  50. package/src/langs/es.js +162 -0
  51. package/src/langs/fa.js +159 -0
  52. package/src/langs/fr.js +161 -0
  53. package/src/langs/he.js +162 -0
  54. package/src/{lang → langs}/index.js +0 -2
  55. package/src/langs/it.js +162 -0
  56. package/src/langs/ja.js +162 -0
  57. package/src/langs/ko.js +162 -0
  58. package/src/langs/lv.js +162 -0
  59. package/src/langs/nl.js +162 -0
  60. package/src/langs/pl.js +162 -0
  61. package/src/langs/pt_br.js +162 -0
  62. package/src/langs/ro.js +162 -0
  63. package/src/langs/ru.js +162 -0
  64. package/src/langs/se.js +162 -0
  65. package/src/langs/tr.js +159 -0
  66. package/src/langs/ua.js +162 -0
  67. package/src/langs/ur.js +162 -0
  68. package/src/langs/zh_cn.js +162 -0
  69. package/src/modules/ApiManager.js +168 -0
  70. package/src/modules/ColorPicker.js +302 -0
  71. package/src/modules/Controller.js +315 -0
  72. package/src/modules/Figure.js +1160 -0
  73. package/src/modules/FileBrowser.js +271 -0
  74. package/src/modules/FileManager.js +290 -0
  75. package/src/modules/HueSlider.js +513 -0
  76. package/src/modules/Modal.js +177 -0
  77. package/src/modules/ModalAnchorEditor.js +494 -0
  78. package/src/modules/SelectMenu.js +447 -0
  79. package/src/modules/_DragHandle.js +16 -0
  80. package/src/modules/index.js +14 -0
  81. package/src/plugins/command/blockquote.js +47 -47
  82. package/src/plugins/command/exportPdf.js +168 -0
  83. package/src/plugins/command/fileUpload.js +389 -0
  84. package/src/plugins/command/list_bulleted.js +112 -0
  85. package/src/plugins/command/list_numbered.js +115 -0
  86. package/src/plugins/dropdown/align.js +143 -0
  87. package/src/plugins/dropdown/backgroundColor.js +73 -0
  88. package/src/plugins/dropdown/font.js +113 -0
  89. package/src/plugins/dropdown/fontColor.js +73 -0
  90. package/src/plugins/dropdown/formatBlock.js +141 -0
  91. package/src/plugins/dropdown/hr.js +111 -0
  92. package/src/plugins/dropdown/layout.js +72 -0
  93. package/src/plugins/dropdown/lineHeight.js +114 -0
  94. package/src/plugins/dropdown/list.js +107 -0
  95. package/src/plugins/dropdown/paragraphStyle.js +117 -0
  96. package/src/plugins/dropdown/table.js +2810 -0
  97. package/src/plugins/dropdown/template.js +71 -0
  98. package/src/plugins/dropdown/textStyle.js +137 -0
  99. package/src/plugins/field/mention.js +172 -0
  100. package/src/plugins/fileBrowser/imageGallery.js +76 -59
  101. package/src/plugins/index.js +86 -24
  102. package/src/plugins/input/fontSize.js +357 -0
  103. package/src/plugins/modal/audio.js +510 -0
  104. package/src/plugins/modal/image.js +1062 -0
  105. package/src/plugins/modal/link.js +211 -0
  106. package/src/plugins/modal/math.js +347 -0
  107. package/src/plugins/modal/video.js +870 -0
  108. package/src/suneditor.js +62 -67
  109. package/src/themes/test.css +61 -0
  110. package/typings/CommandPlugin.d.ts +8 -0
  111. package/typings/DialogPlugin.d.ts +20 -0
  112. package/typings/FileBrowserPlugin.d.ts +30 -0
  113. package/typings/Lang.d.ts +124 -0
  114. package/typings/Module.d.ts +15 -0
  115. package/typings/Plugin.d.ts +42 -0
  116. package/typings/SubmenuPlugin.d.ts +8 -0
  117. package/typings/_classes.d.ts +17 -0
  118. package/typings/_colorPicker.d.ts +60 -0
  119. package/typings/_core.d.ts +55 -0
  120. package/typings/align.d.ts +5 -0
  121. package/{src/plugins/dialog → typings}/audio.d.ts +1 -1
  122. package/typings/backgroundColor.d.ts +5 -0
  123. package/{src/plugins/command → typings}/blockquote.d.ts +1 -1
  124. package/typings/char.d.ts +39 -0
  125. package/typings/component.d.ts +38 -0
  126. package/typings/context.d.ts +39 -0
  127. package/typings/converter.d.ts +33 -0
  128. package/typings/dialog.d.ts +28 -0
  129. package/typings/domUtils.d.ts +361 -0
  130. package/typings/editor.d.ts +7 -0
  131. package/typings/editor.ts +542 -0
  132. package/typings/env.d.ts +70 -0
  133. package/typings/eventManager.d.ts +37 -0
  134. package/typings/events.d.ts +262 -0
  135. package/typings/fileBrowser.d.ts +42 -0
  136. package/typings/fileManager.d.ts +67 -0
  137. package/typings/font.d.ts +5 -0
  138. package/typings/fontColor.d.ts +5 -0
  139. package/typings/fontSize.d.ts +5 -0
  140. package/typings/format.d.ts +191 -0
  141. package/typings/formatBlock.d.ts +5 -0
  142. package/typings/history.d.ts +48 -0
  143. package/typings/horizontalRule.d.ts +5 -0
  144. package/{src/plugins/dialog → typings}/image.d.ts +1 -1
  145. package/{src/plugins/fileBrowser → typings}/imageGallery.d.ts +1 -1
  146. package/typings/index.d.ts +21 -0
  147. package/{src/plugins/modules/index.d.ts → typings/index.modules.d.ts} +3 -3
  148. package/typings/index.plugins.d.ts +58 -0
  149. package/typings/lineHeight.d.ts +5 -0
  150. package/{src/plugins/dialog → typings}/link.d.ts +1 -1
  151. package/typings/list.d.ts +5 -0
  152. package/{src/plugins/dialog → typings}/math.d.ts +1 -1
  153. package/typings/mediaContainer.d.ts +25 -0
  154. package/typings/node.d.ts +57 -0
  155. package/typings/notice.d.ts +16 -0
  156. package/typings/numbers.d.ts +29 -0
  157. package/typings/offset.d.ts +24 -0
  158. package/typings/options.d.ts +589 -0
  159. package/typings/paragraphStyle.d.ts +5 -0
  160. package/typings/resizing.d.ts +141 -0
  161. package/typings/selection.d.ts +94 -0
  162. package/typings/shortcuts.d.ts +13 -0
  163. package/typings/suneditor.d.ts +9 -0
  164. package/typings/table.d.ts +5 -0
  165. package/typings/template.d.ts +5 -0
  166. package/typings/textStyle.d.ts +5 -0
  167. package/typings/toolbar.d.ts +32 -0
  168. package/typings/unicode.d.ts +25 -0
  169. package/{src/plugins/dialog → typings}/video.d.ts +1 -1
  170. package/dist/css/suneditor.min.css +0 -1
  171. package/src/assets/css/suneditor-contents.css +0 -562
  172. package/src/assets/css/suneditor.css +0 -566
  173. package/src/assets/defaultIcons.js +0 -103
  174. package/src/lang/Lang.d.ts +0 -144
  175. package/src/lang/ckb.d.ts +0 -5
  176. package/src/lang/ckb.js +0 -188
  177. package/src/lang/cs.d.ts +0 -5
  178. package/src/lang/cs.js +0 -188
  179. package/src/lang/da.d.ts +0 -5
  180. package/src/lang/da.js +0 -191
  181. package/src/lang/de.d.ts +0 -5
  182. package/src/lang/de.js +0 -188
  183. package/src/lang/en.d.ts +0 -5
  184. package/src/lang/en.js +0 -188
  185. package/src/lang/es.d.ts +0 -5
  186. package/src/lang/es.js +0 -188
  187. package/src/lang/fa.d.ts +0 -5
  188. package/src/lang/fa.js +0 -188
  189. package/src/lang/fr.d.ts +0 -5
  190. package/src/lang/fr.js +0 -188
  191. package/src/lang/he.d.ts +0 -5
  192. package/src/lang/he.js +0 -188
  193. package/src/lang/index.d.ts +0 -23
  194. package/src/lang/it.d.ts +0 -5
  195. package/src/lang/it.js +0 -188
  196. package/src/lang/ja.d.ts +0 -5
  197. package/src/lang/ja.js +0 -188
  198. package/src/lang/ko.d.ts +0 -5
  199. package/src/lang/ko.js +0 -188
  200. package/src/lang/lv.d.ts +0 -5
  201. package/src/lang/lv.js +0 -188
  202. package/src/lang/nl.d.ts +0 -5
  203. package/src/lang/nl.js +0 -188
  204. package/src/lang/pl.d.ts +0 -5
  205. package/src/lang/pl.js +0 -188
  206. package/src/lang/pt_br.d.ts +0 -5
  207. package/src/lang/pt_br.js +0 -189
  208. package/src/lang/ro.d.ts +0 -5
  209. package/src/lang/ro.js +0 -188
  210. package/src/lang/ru.d.ts +0 -5
  211. package/src/lang/ru.js +0 -188
  212. package/src/lang/se.d.ts +0 -5
  213. package/src/lang/se.js +0 -191
  214. package/src/lang/tr.d.ts +0 -5
  215. package/src/lang/tr.js +0 -191
  216. package/src/lang/ua.d.ts +0 -5
  217. package/src/lang/ua.js +0 -188
  218. package/src/lang/ur.d.ts +0 -5
  219. package/src/lang/ur.js +0 -188
  220. package/src/lang/zh_cn.d.ts +0 -5
  221. package/src/lang/zh_cn.js +0 -187
  222. package/src/lib/constructor.js +0 -954
  223. package/src/lib/context.d.ts +0 -42
  224. package/src/lib/context.js +0 -71
  225. package/src/lib/core.d.ts +0 -1135
  226. package/src/lib/core.js +0 -9395
  227. package/src/lib/history.d.ts +0 -48
  228. package/src/lib/history.js +0 -219
  229. package/src/lib/util.d.ts +0 -678
  230. package/src/lib/util.js +0 -2131
  231. package/src/options.d.ts +0 -608
  232. package/src/plugins/CommandPlugin.d.ts +0 -8
  233. package/src/plugins/DialogPlugin.d.ts +0 -20
  234. package/src/plugins/FileBrowserPlugin.d.ts +0 -30
  235. package/src/plugins/Module.d.ts +0 -15
  236. package/src/plugins/Plugin.d.ts +0 -42
  237. package/src/plugins/SubmenuPlugin.d.ts +0 -8
  238. package/src/plugins/dialog/audio.js +0 -559
  239. package/src/plugins/dialog/image.js +0 -1126
  240. package/src/plugins/dialog/link.js +0 -223
  241. package/src/plugins/dialog/math.js +0 -295
  242. package/src/plugins/dialog/mention.js +0 -242
  243. package/src/plugins/dialog/video.js +0 -979
  244. package/src/plugins/index.d.ts +0 -79
  245. package/src/plugins/modules/_anchor.js +0 -461
  246. package/src/plugins/modules/_colorPicker.d.ts +0 -60
  247. package/src/plugins/modules/_colorPicker.js +0 -201
  248. package/src/plugins/modules/_notice.d.ts +0 -21
  249. package/src/plugins/modules/_notice.js +0 -72
  250. package/src/plugins/modules/_selectMenu.js +0 -119
  251. package/src/plugins/modules/component.d.ts +0 -25
  252. package/src/plugins/modules/component.js +0 -81
  253. package/src/plugins/modules/dialog.d.ts +0 -28
  254. package/src/plugins/modules/dialog.js +0 -175
  255. package/src/plugins/modules/fileBrowser.d.ts +0 -42
  256. package/src/plugins/modules/fileBrowser.js +0 -374
  257. package/src/plugins/modules/fileManager.d.ts +0 -67
  258. package/src/plugins/modules/fileManager.js +0 -326
  259. package/src/plugins/modules/index.js +0 -9
  260. package/src/plugins/modules/resizing.d.ts +0 -154
  261. package/src/plugins/modules/resizing.js +0 -903
  262. package/src/plugins/submenu/align.d.ts +0 -5
  263. package/src/plugins/submenu/align.js +0 -160
  264. package/src/plugins/submenu/font.d.ts +0 -5
  265. package/src/plugins/submenu/font.js +0 -123
  266. package/src/plugins/submenu/fontColor.d.ts +0 -5
  267. package/src/plugins/submenu/fontColor.js +0 -101
  268. package/src/plugins/submenu/fontSize.d.ts +0 -5
  269. package/src/plugins/submenu/fontSize.js +0 -112
  270. package/src/plugins/submenu/formatBlock.d.ts +0 -5
  271. package/src/plugins/submenu/formatBlock.js +0 -273
  272. package/src/plugins/submenu/hiliteColor.d.ts +0 -5
  273. package/src/plugins/submenu/hiliteColor.js +0 -102
  274. package/src/plugins/submenu/horizontalRule.d.ts +0 -5
  275. package/src/plugins/submenu/horizontalRule.js +0 -98
  276. package/src/plugins/submenu/lineHeight.d.ts +0 -5
  277. package/src/plugins/submenu/lineHeight.js +0 -104
  278. package/src/plugins/submenu/list.d.ts +0 -5
  279. package/src/plugins/submenu/list.js +0 -456
  280. package/src/plugins/submenu/paragraphStyle.d.ts +0 -5
  281. package/src/plugins/submenu/paragraphStyle.js +0 -135
  282. package/src/plugins/submenu/table.d.ts +0 -5
  283. package/src/plugins/submenu/table.js +0 -1431
  284. package/src/plugins/submenu/template.d.ts +0 -5
  285. package/src/plugins/submenu/template.js +0 -72
  286. package/src/plugins/submenu/textStyle.d.ts +0 -5
  287. package/src/plugins/submenu/textStyle.js +0 -167
  288. package/src/suneditor.d.ts +0 -9
  289. package/src/suneditor_build.js +0 -18
  290. /package/{src/plugins/dialog → typings}/mention.d.ts +0 -0
@@ -0,0 +1,440 @@
1
+ /**
2
+ * @fileoverview Toolbar class
3
+ */
4
+
5
+ import { domUtils, env } from '../../helper';
6
+ import CoreInjector from '../../editorInjector/_core';
7
+ import { CreateToolBar, UpdateButton } from '../section/constructor';
8
+
9
+ const { _w, _d } = env;
10
+
11
+ const Toolbar = function (editor, { keyName, balloon, inline, balloonAlways, res }) {
12
+ CoreInjector.call(this, editor);
13
+
14
+ // members
15
+ this.keyName = keyName;
16
+ this.isSub = /sub/.test(keyName);
17
+ this.currentMoreLayerActiveButton = null;
18
+ this._isBalloon = balloon;
19
+ this._isInline = inline;
20
+ this._isBalloonAlways = balloonAlways;
21
+ this._responsiveCurrentSize = 'default';
22
+ this._originRes = res;
23
+ this._rButtonArray = res;
24
+ this._rButtonsize = null;
25
+ this._sticky = false;
26
+ this._isViewPortSize = 'visualViewport' in _w;
27
+ this._inlineToolbarAttr = {
28
+ top: '',
29
+ width: '',
30
+ isShow: false
31
+ };
32
+ this._balloonOffset = {
33
+ top: 0,
34
+ left: 0
35
+ };
36
+
37
+ this._setResponsive();
38
+ };
39
+
40
+ Toolbar.prototype = {
41
+ /**
42
+ * @description Disable the toolbar
43
+ */
44
+ disable() {
45
+ /** off menus */
46
+ this._moreLayerOff();
47
+ this.menu.dropdownOff();
48
+ this.menu.containerOff();
49
+ domUtils.setDisabled(this.context.get(this.keyName + '.buttonTray').querySelectorAll('.se-menu-list .se-toolbar-btn[data-type]'), true);
50
+ },
51
+
52
+ /**
53
+ * @description Enable the toolbar
54
+ */
55
+ enable() {
56
+ domUtils.setDisabled(this.context.get(this.keyName + '.buttonTray').querySelectorAll('.se-menu-list .se-toolbar-btn[data-type]'), false);
57
+ },
58
+
59
+ /**
60
+ * @description Show the toolbar
61
+ */
62
+ show() {
63
+ if (this._isInline) {
64
+ this._showInline();
65
+ } else if (this._isBalloon) {
66
+ this._showBalloon();
67
+ } else {
68
+ this.context.get(this.keyName + '.main').style.display = '';
69
+ if (!this.isSub) this.editor.frameContext.get('_stickyDummy').style.display = '';
70
+ }
71
+
72
+ if (!this.isSub) this.resetResponsiveToolbar();
73
+ },
74
+
75
+ /**
76
+ * @description Hide the toolbar
77
+ */
78
+ hide() {
79
+ if (this._isInline) {
80
+ this.context.get(this.keyName + '.main').style.display = 'none';
81
+ this.context.get(this.keyName + '.main').style.top = '0px';
82
+ this._inlineToolbarAttr.isShow = false;
83
+ } else {
84
+ this.context.get(this.keyName + '.main').style.display = 'none';
85
+ if (!this.isSub) this.editor.frameContext.get('_stickyDummy').style.display = 'none';
86
+ if (this.editorisBalloon) {
87
+ this._balloonOffset = {
88
+ top: 0,
89
+ left: 0
90
+ };
91
+ }
92
+ }
93
+ },
94
+
95
+ /**
96
+ * @desscription Show or hide the toolbar
97
+ * @param {boolean} isShow Show or hide
98
+ * @private
99
+ */
100
+ _visible(isShow) {
101
+ const toolbar = this.context.get(this.keyName + '.main');
102
+ if (isShow) {
103
+ domUtils.removeClass(toolbar, 'se-toolbar-onscroll-hide');
104
+ } else {
105
+ domUtils.addClass(toolbar, 'se-toolbar-onscroll-hide');
106
+ }
107
+ },
108
+
109
+ /**
110
+ * @description Reset buttons of the responsive toolbar.
111
+ */
112
+ resetResponsiveToolbar() {
113
+ this.menu.containerOff();
114
+
115
+ const responsiveSize = this._rButtonsize;
116
+ if (responsiveSize) {
117
+ let w = 0;
118
+ if (((this._isBalloon || this._isInline) && this.options.get('toolbar_width') === 'auto') || (this._isSubBalloon && this.options.get('toolbar.sub_width') === 'auto')) {
119
+ w = this.editor.frameContext.get('topArea').offsetWidth;
120
+ } else {
121
+ w = this.context.get(this.keyName + '.main').offsetWidth;
122
+ }
123
+
124
+ let responsiveWidth = 'default';
125
+ for (let i = 1, len = responsiveSize.length; i < len; i++) {
126
+ if (w < responsiveSize[i]) {
127
+ responsiveWidth = responsiveSize[i] + '';
128
+ break;
129
+ }
130
+ }
131
+
132
+ if (this._responsiveCurrentSize !== responsiveWidth) {
133
+ this._responsiveCurrentSize = responsiveWidth;
134
+ this.setButtons(this._rButtonArray[responsiveWidth]);
135
+ // this.viewer._resetFullScreenHeight();
136
+ }
137
+ }
138
+ },
139
+
140
+ /**
141
+ * @description Reset the buttons on the toolbar. (Editor is not reloaded)
142
+ * You cannot set a new plugin for the button.
143
+ * @param {Array} buttonList Button list
144
+ */
145
+ setButtons(buttonList) {
146
+ this._moreLayerOff();
147
+ this.menu.dropdownOff();
148
+ this.menu.containerOff();
149
+
150
+ const { options, icons, lang, isSub } = this;
151
+ const newToolbar = CreateToolBar(buttonList, this.plugins, options, icons, lang, true);
152
+
153
+ const shortcutss = options.get('shortcuts');
154
+ newToolbar.updateButtons.forEach((v) => UpdateButton(v.button, v.plugin, this.icons, this.lang, shortcutss[v.key]));
155
+
156
+ let cmdButtons;
157
+ if (isSub) cmdButtons = this.editor.subAllCommandButtons = new Map();
158
+ else cmdButtons = this.editor.allCommandButtons = new Map();
159
+ this.editor.commandTargets = new Map();
160
+ this.editor.__saveCommandButtons(cmdButtons, newToolbar.buttonTray);
161
+
162
+ this.context.get(this.keyName + '.main').replaceChild(newToolbar.buttonTray, this.context.get(this.keyName + '.buttonTray'));
163
+ this.context.set(this.keyName + '.buttonTray', newToolbar.buttonTray);
164
+
165
+ this.editor.__setDisabledButtons();
166
+
167
+ this.history.resetButtons(this.editor.frameContext.get('key'), null);
168
+ this._resetSticky();
169
+
170
+ this.editor.effectNode = null;
171
+ this.viewer._setButtonsActive();
172
+ if (this.status.hasFocus) this.eventManager.applyTagEffect();
173
+ if (this.editor.frameContext.get('isReadOnly')) domUtils.setDisabled(this.editor._controllerOnDisabledButtons, true);
174
+
175
+ this.triggerEvent('onSetToolbarButtons', { buttonTray: newToolbar.buttonTray, frameContext: this.editor.frameContext });
176
+ },
177
+
178
+ _resetSticky() {
179
+ const toolbar = this.context.get(this.keyName + '.main');
180
+ if (this.editor.frameContext.get('isFullScreen') || toolbar.offsetWidth === 0 || this.options.get('toolbar_sticky') < 0) return;
181
+
182
+ const currentScrollY = this._isViewPortSize ? _w.visualViewport.pageTop : _w.scrollY;
183
+
184
+ const minHeight = this.editor.frameContext.get('_minHeight');
185
+ const editorHeight = this.editor.frameContext.get('wrapper').offsetHeight;
186
+ const editorOffset = this.offset.getGlobal(this.editor.frameContext.get('topArea'));
187
+ const y = currentScrollY + this.options.get('toolbar_sticky');
188
+ const t = (this._isBalloon || this._isInline ? editorOffset.top : this.offset.getGlobal(this.options.get('toolbar_container')).top) - (this._isInline ? toolbar.offsetHeight : 0);
189
+ const inlineOffset = 1;
190
+
191
+ const offSticky = !this.options.get('toolbar_container')
192
+ ? editorHeight + t + this.options.get('toolbar_sticky') - y - minHeight
193
+ : editorOffset.top - currentScrollY + editorHeight - minHeight - this.options.get('toolbar_sticky') - toolbar.offsetHeight;
194
+ if (y < t) {
195
+ this._offSticky();
196
+ } else if (offSticky < 0) {
197
+ if (!this._sticky) this._onSticky(inlineOffset);
198
+ toolbar.style.top = inlineOffset + offSticky + this.__getViewportTop() + 'px';
199
+ } else {
200
+ this._onSticky(inlineOffset);
201
+ }
202
+ },
203
+
204
+ _onSticky(inlineOffset) {
205
+ const toolbar = this.context.get(this.keyName + '.main');
206
+
207
+ if (!this._isInline) {
208
+ const stickyDummy = !this.options.get('toolbar_container') ? this.editor.frameContext.get('_stickyDummy') : this.context.get('_stickyDummy');
209
+ stickyDummy.style.height = toolbar.offsetHeight + 'px';
210
+ stickyDummy.style.display = 'block';
211
+ }
212
+
213
+ const toolbarTopPosition = this.options.get('toolbar_sticky') + inlineOffset + this.__getViewportTop();
214
+ toolbar.style.top = `${toolbarTopPosition}px`;
215
+ toolbar.style.width = this._isInline ? this._inlineToolbarAttr.width : toolbar.offsetWidth + 'px';
216
+ domUtils.addClass(toolbar, 'se-toolbar-sticky');
217
+ this._sticky = true;
218
+ },
219
+
220
+ __getViewportTop() {
221
+ if (this._isViewPortSize) {
222
+ return _w.visualViewport.offsetTop;
223
+ }
224
+ return 0;
225
+ },
226
+
227
+ _offSticky() {
228
+ const stickyDummy = !this.options.get('toolbar_container') ? this.editor.frameContext.get('_stickyDummy') : this.context.get('_stickyDummy');
229
+ stickyDummy.style.display = 'none';
230
+
231
+ const toolbar = this.context.get(this.keyName + '.main');
232
+ toolbar.style.top = this._isInline ? this._inlineToolbarAttr.top : '';
233
+ toolbar.style.width = this._isInline ? this._inlineToolbarAttr.width : '';
234
+ this.editor.frameContext.get('wrapper').style.marginTop = '';
235
+
236
+ domUtils.removeClass(toolbar, 'se-toolbar-sticky');
237
+ this._sticky = false;
238
+ },
239
+
240
+ _setResponsive() {
241
+ if (this._rButtonArray?.length === 0) {
242
+ this._rButtonArray = null;
243
+ return;
244
+ }
245
+
246
+ this._responsiveCurrentSize = 'default';
247
+ const _rButtonsize = (this._rButtonsize = []);
248
+ const _responsiveButtons = this._originRes;
249
+ const buttonsObj = (this._rButtonArray = {
250
+ default: _responsiveButtons[0]
251
+ });
252
+
253
+ for (let i = 1, len = _responsiveButtons.length, size, buttonGroup; i < len; i++) {
254
+ buttonGroup = _responsiveButtons[i];
255
+ size = buttonGroup[0] * 1;
256
+ _rButtonsize.push(size);
257
+ buttonsObj[size] = buttonGroup[1];
258
+ }
259
+
260
+ _rButtonsize
261
+ .sort(function (a, b) {
262
+ return a - b;
263
+ })
264
+ .unshift('default');
265
+ },
266
+
267
+ _showBalloon(rangeObj) {
268
+ if (!this._isBalloon || this.editor.opendControllers.length > 0) {
269
+ return;
270
+ }
271
+ if (this.isSub) this.resetResponsiveToolbar();
272
+
273
+ const range = rangeObj || this.selection.getRange();
274
+ const toolbar = this.context.get(this.keyName + '.main');
275
+ const selection = this.selection.get();
276
+
277
+ let isDirTop;
278
+ if (this._isBalloonAlways && range.collapsed) {
279
+ isDirTop = true;
280
+ } else if (selection.focusNode === selection.anchorNode) {
281
+ isDirTop = selection.focusOffset < selection.anchorOffset;
282
+ } else {
283
+ const childNodes = domUtils.getListChildNodes(range.commonAncestorContainer, null);
284
+ isDirTop = domUtils.getArrayIndex(childNodes, selection.focusNode) < domUtils.getArrayIndex(childNodes, selection.anchorNode);
285
+ }
286
+
287
+ toolbar.style.top = '-10000px';
288
+ if (toolbar.style.display !== 'block') {
289
+ toolbar.style.visibility = 'hidden';
290
+ toolbar.style.display = 'block';
291
+ }
292
+
293
+ this._setBalloonOffset(isDirTop, range);
294
+
295
+ this.triggerEvent('onShowToolbar', { toolbar, mode: 'balloon', frameContext: this.editor.frameContext });
296
+
297
+ _w.setTimeout(() => {
298
+ toolbar.style.visibility = '';
299
+ }, 0);
300
+ },
301
+
302
+ _setBalloonOffset(positionTop, range) {
303
+ const isFullScreen = this.editor.frameContext.get('isFullScreen');
304
+ range = range || this.selection.getRange();
305
+ const rectsObj = this.selection.getRects(range, positionTop ? 'start' : 'end');
306
+ positionTop = rectsObj.position === 'start';
307
+ const toolbar = this.context.get(this.keyName + '.main');
308
+ const topArea = this.editor.frameContext.get('topArea');
309
+ const rects = rectsObj.rects;
310
+ const scrollLeft = isFullScreen ? 0 : rectsObj.scrollLeft;
311
+ const scrollTop = isFullScreen ? 0 : rectsObj.scrollTop;
312
+ const editorWidth = topArea.offsetWidth;
313
+ const offsets = this.offset.getGlobal(topArea);
314
+ const stickyTop = offsets.top;
315
+ const editorLeft = offsets.left;
316
+ const toolbarWidth = toolbar.offsetWidth;
317
+ const toolbarHeight = toolbar.offsetHeight;
318
+
319
+ this._setBalloonPosition(positionTop, rects, toolbar, editorLeft, editorWidth, scrollLeft, scrollTop, stickyTop);
320
+ if (this.isSub && this.offset.getGlobal(toolbar).top - offsets.top < 0) {
321
+ positionTop = !positionTop;
322
+ this._setBalloonPosition(positionTop, rects, toolbar, editorLeft, editorWidth, scrollLeft, scrollTop, stickyTop);
323
+ }
324
+
325
+ if (toolbarWidth !== toolbar.offsetWidth || toolbarHeight !== toolbar.offsetHeight) {
326
+ this._setBalloonPosition(positionTop, rects, toolbar, editorLeft, editorWidth, scrollLeft, scrollTop, stickyTop);
327
+ }
328
+
329
+ if (this.options.get('toolbar_container')) {
330
+ const editorParent = topArea.parentElement;
331
+
332
+ let container = this.options.get('toolbar_container');
333
+ let left = container.offsetLeft;
334
+ let top = container.offsetTop;
335
+
336
+ while (!container.parentElement.contains(editorParent) || !/^(BODY|HTML)$/i.test(container.parentElement.nodeName)) {
337
+ container = container.offsetParent;
338
+ left += container.offsetLeft;
339
+ top += container.offsetTop;
340
+ }
341
+
342
+ toolbar.style.left = toolbar.offsetLeft - left + topArea.offsetLeft + 'px';
343
+ toolbar.style.top = toolbar.offsetTop - top + topArea.offsetTop + 'px';
344
+ }
345
+
346
+ const wwScroll = this.offset.getWWScroll();
347
+ this._balloonOffset = {
348
+ top: toolbar.offsetTop + wwScroll.top,
349
+ left: toolbar.offsetLeft + wwScroll.left,
350
+ position: positionTop ? 'top' : 'bottom'
351
+ };
352
+ },
353
+
354
+ _setBalloonPosition(isDirTop, rects, toolbarEl, editorLeft, editorWidth, scrollLeft, scrollTop, stickyTop) {
355
+ const padding = 1;
356
+ const arrow = this.context.get(this.keyName + '._arrow');
357
+ const arrowMargin = Math.round(arrow.offsetWidth / 2);
358
+ const toolbarWidth = toolbarEl.offsetWidth;
359
+ const toolbarHeight = rects.noText && !isDirTop ? 0 : toolbarEl.offsetHeight;
360
+
361
+ const absoluteLeft = (isDirTop ? rects.left : rects.right) - editorLeft - toolbarWidth / 2 + scrollLeft;
362
+ const overRight = absoluteLeft + toolbarWidth - editorWidth;
363
+
364
+ let t = (isDirTop ? rects.top - toolbarHeight - arrowMargin : rects.bottom + arrowMargin) - (rects.noText ? 0 : stickyTop) + scrollTop;
365
+ const l = absoluteLeft < 0 ? padding : overRight < 0 ? absoluteLeft : absoluteLeft - overRight - padding - 1;
366
+
367
+ let resetTop = false;
368
+ const space = t + (isDirTop ? this.offset.getGlobal(this.editor.frameContext.get('topArea')).top : toolbarEl.offsetHeight - this.editor.frameContext.get('wysiwyg').offsetHeight);
369
+ if (!isDirTop && space > 0 && this._getPageBottomSpace() < space) {
370
+ isDirTop = true;
371
+ resetTop = true;
372
+ } else if (isDirTop && _d.documentElement.offsetTop > space) {
373
+ isDirTop = false;
374
+ resetTop = true;
375
+ }
376
+
377
+ if (resetTop) t = (isDirTop ? rects.top - toolbarHeight - arrowMargin : rects.bottom + arrowMargin) - (rects.noText ? 0 : stickyTop) + scrollTop;
378
+
379
+ toolbarEl.style.left = Math.floor(l) + 'px';
380
+ toolbarEl.style.top = Math.floor(t) + 'px';
381
+
382
+ if (isDirTop) {
383
+ domUtils.removeClass(arrow, 'se-arrow-up');
384
+ domUtils.addClass(arrow, 'se-arrow-down');
385
+ } else {
386
+ domUtils.removeClass(arrow, 'se-arrow-down');
387
+ domUtils.addClass(arrow, 'se-arrow-up');
388
+ }
389
+
390
+ const arrow_left = Math.floor(toolbarWidth / 2 + (absoluteLeft - l));
391
+ arrow.style.left = (arrow_left + arrowMargin > toolbarEl.offsetWidth ? toolbarEl.offsetWidth - arrowMargin : arrow_left < arrowMargin ? arrowMargin : arrow_left) + 'px';
392
+ },
393
+
394
+ _getPageBottomSpace() {
395
+ const topArea = this.editor.frameContext.get('topArea');
396
+ return _d.documentElement.scrollHeight - (this.offset.getGlobal(topArea).top + topArea.offsetHeight);
397
+ },
398
+
399
+ _showInline() {
400
+ if (!this._isInline) return;
401
+
402
+ const toolbar = this.context.get(this.keyName + '.main');
403
+ toolbar.style.visibility = 'hidden';
404
+ this._offSticky();
405
+
406
+ toolbar.style.display = 'block';
407
+ toolbar.style.top = '0px';
408
+ this._inlineToolbarAttr.width = toolbar.style.width = this.options.get(this.keyName + '_width');
409
+ this._inlineToolbarAttr.top = toolbar.style.top = -1 + (this.offset.getGlobal(this.editor.frameContext.get('topArea')).top - this.offset.getGlobal(toolbar).top - toolbar.offsetHeight) + 'px';
410
+
411
+ this._resetSticky();
412
+ this._inlineToolbarAttr.isShow = true;
413
+
414
+ this.triggerEvent('onShowToolbar', { toolbar, mode: 'inline' });
415
+
416
+ toolbar.style.visibility = '';
417
+ },
418
+
419
+ _moreLayerOn(button, layer) {
420
+ this._moreLayerOff();
421
+ this.currentMoreLayerActiveButton = button;
422
+ layer.style.display = 'block';
423
+ },
424
+
425
+ /**
426
+ * @description Disable more layer
427
+ */
428
+ _moreLayerOff() {
429
+ if (this.currentMoreLayerActiveButton) {
430
+ const layer = this.context.get(this.keyName + '.main').querySelector('.' + this.currentMoreLayerActiveButton.getAttribute('data-command'));
431
+ layer.style.display = 'none';
432
+ domUtils.removeClass(this.currentMoreLayerActiveButton, 'on');
433
+ this.currentMoreLayerActiveButton = null;
434
+ }
435
+ },
436
+
437
+ constructor: Toolbar
438
+ };
439
+
440
+ export default Toolbar;