suneditor 3.0.0-beta.9 → 3.0.0-rc.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 (380) hide show
  1. package/README.md +65 -57
  2. package/dist/suneditor-contents.min.css +1 -0
  3. package/dist/suneditor.min.css +1 -1
  4. package/dist/suneditor.min.js +1 -1
  5. package/package.json +110 -61
  6. package/src/assets/design/color.css +36 -17
  7. package/src/assets/design/size.css +2 -0
  8. package/src/assets/icons/defaultIcons.js +17 -2
  9. package/src/assets/suneditor-contents.css +51 -16
  10. package/src/assets/suneditor.css +116 -43
  11. package/src/core/config/contextProvider.js +288 -0
  12. package/src/core/config/eventManager.js +188 -0
  13. package/src/core/config/instanceCheck.js +59 -0
  14. package/src/core/config/optionProvider.js +452 -0
  15. package/src/core/editor.js +166 -1637
  16. package/src/core/event/actions/index.js +229 -0
  17. package/src/core/event/effects/common.registry.js +74 -0
  18. package/src/core/event/effects/keydown.registry.js +573 -0
  19. package/src/core/event/effects/ruleHelpers.js +148 -0
  20. package/src/core/event/eventOrchestrator.js +944 -0
  21. package/src/core/event/executor.js +27 -0
  22. package/src/core/{base/eventHandlers → event/handlers}/handler_toolbar.js +27 -28
  23. package/src/core/{base/eventHandlers → event/handlers}/handler_ww_clipboard.js +10 -8
  24. package/src/core/{base/eventHandlers → event/handlers}/handler_ww_dragDrop.js +22 -23
  25. package/src/core/event/handlers/handler_ww_input.js +75 -0
  26. package/src/core/event/handlers/handler_ww_key.js +228 -0
  27. package/src/core/event/handlers/handler_ww_mouse.js +166 -0
  28. package/src/core/event/ports.js +211 -0
  29. package/src/core/event/reducers/keydown.reducer.js +97 -0
  30. package/src/core/event/rules/keydown.rule.arrow.js +63 -0
  31. package/src/core/event/rules/keydown.rule.backspace.js +208 -0
  32. package/src/core/event/rules/keydown.rule.delete.js +132 -0
  33. package/src/core/event/rules/keydown.rule.enter.js +150 -0
  34. package/src/core/event/rules/keydown.rule.tab.js +35 -0
  35. package/src/core/event/support/defaultLineManager.js +136 -0
  36. package/src/core/event/support/selectionState.js +204 -0
  37. package/src/core/kernel/coreKernel.js +320 -0
  38. package/src/core/kernel/kernelInjector.js +19 -0
  39. package/src/core/kernel/store.js +173 -0
  40. package/src/core/{class → logic/dom}/char.js +42 -45
  41. package/src/core/logic/dom/format.js +1075 -0
  42. package/src/core/{class → logic/dom}/html.js +743 -624
  43. package/src/core/logic/dom/inline.js +1847 -0
  44. package/src/core/logic/dom/listFormat.js +601 -0
  45. package/src/core/{class → logic/dom}/nodeTransform.js +92 -72
  46. package/src/core/{class → logic/dom}/offset.js +254 -317
  47. package/src/core/logic/dom/selection.js +754 -0
  48. package/src/core/logic/panel/menu.js +389 -0
  49. package/src/core/logic/panel/toolbar.js +449 -0
  50. package/src/core/logic/panel/viewer.js +761 -0
  51. package/src/core/logic/shell/_commandExecutor.js +380 -0
  52. package/src/core/logic/shell/commandDispatcher.js +241 -0
  53. package/src/core/logic/shell/component.js +970 -0
  54. package/src/core/logic/shell/focusManager.js +110 -0
  55. package/src/core/{base → logic/shell}/history.js +110 -60
  56. package/src/core/logic/shell/pluginManager.js +363 -0
  57. package/src/core/logic/shell/shortcuts.js +130 -0
  58. package/src/core/logic/shell/ui.js +904 -0
  59. package/src/core/schema/context.js +66 -0
  60. package/src/core/schema/frameContext.js +160 -0
  61. package/src/core/schema/options.js +628 -0
  62. package/src/core/section/constructor.js +194 -500
  63. package/src/core/section/documentType.js +297 -222
  64. package/src/events.js +808 -543
  65. package/src/helper/clipboard.js +27 -16
  66. package/src/helper/converter.js +100 -78
  67. package/src/helper/dom/domCheck.js +56 -30
  68. package/src/helper/dom/domQuery.js +159 -89
  69. package/src/helper/dom/domUtils.js +114 -49
  70. package/src/helper/dom/index.js +5 -1
  71. package/src/helper/env.js +26 -26
  72. package/src/helper/index.js +1 -1
  73. package/src/helper/keyCodeMap.js +25 -28
  74. package/src/helper/numbers.js +4 -8
  75. package/src/helper/unicode.js +4 -8
  76. package/src/hooks/base.js +307 -0
  77. package/src/hooks/params.js +130 -0
  78. package/src/interfaces/contracts.js +227 -0
  79. package/src/interfaces/index.js +7 -0
  80. package/src/interfaces/plugins.js +239 -0
  81. package/src/langs/ckb.js +4 -4
  82. package/src/langs/cs.js +4 -4
  83. package/src/langs/da.js +4 -4
  84. package/src/langs/de.js +4 -4
  85. package/src/langs/en.js +4 -4
  86. package/src/langs/es.js +4 -4
  87. package/src/langs/fa.js +4 -4
  88. package/src/langs/fr.js +4 -4
  89. package/src/langs/he.js +4 -4
  90. package/src/langs/hu.js +4 -4
  91. package/src/langs/it.js +4 -4
  92. package/src/langs/ja.js +4 -4
  93. package/src/langs/km.js +4 -4
  94. package/src/langs/ko.js +4 -4
  95. package/src/langs/lv.js +4 -4
  96. package/src/langs/nl.js +4 -4
  97. package/src/langs/pl.js +4 -4
  98. package/src/langs/pt_br.js +13 -13
  99. package/src/langs/ro.js +4 -4
  100. package/src/langs/ru.js +4 -4
  101. package/src/langs/se.js +4 -4
  102. package/src/langs/tr.js +4 -4
  103. package/src/langs/uk.js +4 -4
  104. package/src/langs/ur.js +4 -4
  105. package/src/langs/zh_cn.js +4 -4
  106. package/src/modules/{Browser.js → contract/Browser.js} +119 -128
  107. package/src/modules/{ColorPicker.js → contract/ColorPicker.js} +132 -142
  108. package/src/modules/contract/Controller.js +589 -0
  109. package/src/modules/{Figure.js → contract/Figure.js} +591 -411
  110. package/src/modules/{HueSlider.js → contract/HueSlider.js} +125 -86
  111. package/src/modules/contract/Modal.js +357 -0
  112. package/src/modules/contract/index.js +9 -0
  113. package/src/modules/manager/ApiManager.js +197 -0
  114. package/src/modules/{FileManager.js → manager/FileManager.js} +128 -160
  115. package/src/modules/manager/index.js +5 -0
  116. package/src/modules/{ModalAnchorEditor.js → ui/ModalAnchorEditor.js} +108 -138
  117. package/src/modules/{SelectMenu.js → ui/SelectMenu.js} +119 -120
  118. package/src/modules/{_DragHandle.js → ui/_DragHandle.js} +1 -1
  119. package/src/modules/ui/index.js +6 -0
  120. package/src/plugins/browser/audioGallery.js +23 -26
  121. package/src/plugins/browser/fileBrowser.js +25 -28
  122. package/src/plugins/browser/fileGallery.js +20 -23
  123. package/src/plugins/browser/imageGallery.js +24 -23
  124. package/src/plugins/browser/videoGallery.js +27 -29
  125. package/src/plugins/command/blockquote.js +11 -17
  126. package/src/plugins/command/exportPDF.js +26 -26
  127. package/src/plugins/command/fileUpload.js +138 -133
  128. package/src/plugins/command/list_bulleted.js +48 -44
  129. package/src/plugins/command/list_numbered.js +48 -44
  130. package/src/plugins/dropdown/align.js +64 -50
  131. package/src/plugins/dropdown/backgroundColor.js +34 -35
  132. package/src/plugins/dropdown/{formatBlock.js → blockStyle.js} +43 -37
  133. package/src/plugins/dropdown/font.js +50 -36
  134. package/src/plugins/dropdown/fontColor.js +34 -35
  135. package/src/plugins/dropdown/hr.js +55 -50
  136. package/src/plugins/dropdown/layout.js +20 -15
  137. package/src/plugins/dropdown/lineHeight.js +46 -30
  138. package/src/plugins/dropdown/list.js +32 -33
  139. package/src/plugins/dropdown/paragraphStyle.js +40 -34
  140. package/src/plugins/dropdown/table/index.js +915 -0
  141. package/src/plugins/dropdown/table/render/table.html.js +308 -0
  142. package/src/plugins/dropdown/table/render/table.menu.js +121 -0
  143. package/src/plugins/dropdown/table/services/table.cell.js +465 -0
  144. package/src/plugins/dropdown/table/services/table.clipboard.js +414 -0
  145. package/src/plugins/dropdown/table/services/table.grid.js +504 -0
  146. package/src/plugins/dropdown/table/services/table.resize.js +463 -0
  147. package/src/plugins/dropdown/table/services/table.selection.js +466 -0
  148. package/src/plugins/dropdown/table/services/table.style.js +844 -0
  149. package/src/plugins/dropdown/table/shared/table.constants.js +109 -0
  150. package/src/plugins/dropdown/table/shared/table.utils.js +219 -0
  151. package/src/plugins/dropdown/template.js +20 -15
  152. package/src/plugins/dropdown/textStyle.js +28 -22
  153. package/src/plugins/field/mention.js +54 -49
  154. package/src/plugins/index.js +5 -5
  155. package/src/plugins/input/fontSize.js +100 -97
  156. package/src/plugins/input/pageNavigator.js +13 -10
  157. package/src/plugins/modal/audio.js +208 -219
  158. package/src/plugins/modal/drawing.js +99 -104
  159. package/src/plugins/modal/embed.js +323 -312
  160. package/src/plugins/modal/image/index.js +942 -0
  161. package/src/plugins/modal/image/render/image.html.js +150 -0
  162. package/src/plugins/modal/image/services/image.size.js +198 -0
  163. package/src/plugins/modal/image/services/image.upload.js +216 -0
  164. package/src/plugins/modal/image/shared/image.constants.js +20 -0
  165. package/src/plugins/modal/link.js +74 -54
  166. package/src/plugins/modal/math.js +126 -119
  167. package/src/plugins/modal/video/index.js +858 -0
  168. package/src/plugins/modal/video/render/video.html.js +131 -0
  169. package/src/plugins/modal/video/services/video.size.js +281 -0
  170. package/src/plugins/modal/video/services/video.upload.js +92 -0
  171. package/src/plugins/popup/anchor.js +57 -49
  172. package/src/suneditor.js +73 -61
  173. package/src/themes/cobalt.css +155 -0
  174. package/src/themes/dark.css +143 -120
  175. package/src/typedef.js +214 -63
  176. package/types/assets/icons/defaultIcons.d.ts +8 -0
  177. package/types/assets/suneditor-contents.css.d.ts +1 -0
  178. package/types/assets/suneditor.css.d.ts +1 -0
  179. package/types/core/config/contextProvider.d.ts +148 -0
  180. package/types/core/config/eventManager.d.ts +68 -0
  181. package/types/core/config/instanceCheck.d.ts +33 -0
  182. package/types/core/config/optionProvider.d.ts +147 -0
  183. package/types/core/editor.d.ts +27 -586
  184. package/types/core/event/actions/index.d.ts +50 -0
  185. package/types/core/event/effects/common.registry.d.ts +56 -0
  186. package/types/core/event/effects/keydown.registry.d.ts +80 -0
  187. package/types/core/event/effects/ruleHelpers.d.ts +36 -0
  188. package/types/core/event/eventOrchestrator.d.ts +191 -0
  189. package/types/core/event/executor.d.ts +13 -0
  190. package/types/core/event/handlers/handler_toolbar.d.ts +38 -0
  191. package/types/core/event/handlers/handler_ww_clipboard.d.ts +36 -0
  192. package/types/core/event/handlers/handler_ww_dragDrop.d.ts +26 -0
  193. package/types/core/event/handlers/handler_ww_input.d.ts +38 -0
  194. package/types/core/event/handlers/handler_ww_key.d.ts +40 -0
  195. package/types/core/event/handlers/handler_ww_mouse.d.ts +47 -0
  196. package/types/core/event/ports.d.ts +256 -0
  197. package/types/core/event/reducers/keydown.reducer.d.ts +84 -0
  198. package/types/core/event/rules/keydown.rule.arrow.d.ts +19 -0
  199. package/types/core/event/rules/keydown.rule.backspace.d.ts +18 -0
  200. package/types/core/event/rules/keydown.rule.delete.d.ts +18 -0
  201. package/types/core/event/rules/keydown.rule.enter.d.ts +18 -0
  202. package/types/core/event/rules/keydown.rule.tab.d.ts +18 -0
  203. package/types/core/event/support/defaultLineManager.d.ts +22 -0
  204. package/types/core/event/support/selectionState.d.ts +29 -0
  205. package/types/core/kernel/coreKernel.d.ts +219 -0
  206. package/types/core/kernel/kernelInjector.d.ts +16 -0
  207. package/types/core/kernel/store.d.ts +170 -0
  208. package/types/core/logic/dom/char.d.ts +46 -0
  209. package/types/core/logic/dom/format.d.ts +234 -0
  210. package/types/core/logic/dom/html.d.ts +290 -0
  211. package/types/core/logic/dom/inline.d.ts +93 -0
  212. package/types/core/logic/dom/listFormat.d.ts +101 -0
  213. package/types/core/logic/dom/nodeTransform.d.ts +110 -0
  214. package/types/core/logic/dom/offset.d.ts +335 -0
  215. package/types/core/logic/dom/selection.d.ts +165 -0
  216. package/types/core/logic/panel/menu.d.ts +93 -0
  217. package/types/core/logic/panel/toolbar.d.ts +128 -0
  218. package/types/core/logic/panel/viewer.d.ts +89 -0
  219. package/types/core/logic/shell/_commandExecutor.d.ts +18 -0
  220. package/types/core/logic/shell/commandDispatcher.d.ts +65 -0
  221. package/types/core/logic/shell/component.d.ts +182 -0
  222. package/types/core/logic/shell/focusManager.d.ts +31 -0
  223. package/types/core/{base → logic/shell}/history.d.ts +13 -12
  224. package/types/core/logic/shell/pluginManager.d.ts +115 -0
  225. package/types/core/logic/shell/shortcuts.d.ts +131 -0
  226. package/types/core/logic/shell/ui.d.ts +261 -0
  227. package/types/core/schema/context.d.ts +104 -0
  228. package/types/core/schema/frameContext.d.ts +320 -0
  229. package/types/core/schema/options.d.ts +1241 -0
  230. package/types/core/section/constructor.d.ts +117 -652
  231. package/types/core/section/documentType.d.ts +43 -61
  232. package/types/events.d.ts +796 -65
  233. package/types/helper/clipboard.d.ts +5 -4
  234. package/types/helper/converter.d.ts +55 -43
  235. package/types/helper/dom/domCheck.d.ts +27 -19
  236. package/types/helper/dom/domQuery.d.ts +76 -57
  237. package/types/helper/dom/domUtils.d.ts +62 -39
  238. package/types/helper/dom/index.d.ts +87 -1
  239. package/types/helper/env.d.ts +16 -13
  240. package/types/helper/index.d.ts +8 -2
  241. package/types/helper/keyCodeMap.d.ts +24 -23
  242. package/types/helper/numbers.d.ts +4 -6
  243. package/types/helper/unicode.d.ts +4 -3
  244. package/types/hooks/base.d.ts +239 -0
  245. package/types/hooks/params.d.ts +65 -0
  246. package/types/index.d.ts +20 -117
  247. package/types/interfaces/contracts.d.ts +183 -0
  248. package/types/interfaces/index.d.ts +3 -0
  249. package/types/interfaces/plugins.d.ts +168 -0
  250. package/types/langs/_Lang.d.ts +2 -2
  251. package/types/langs/index.d.ts +2 -2
  252. package/types/modules/contract/Browser.d.ts +262 -0
  253. package/types/modules/contract/ColorPicker.d.ts +99 -0
  254. package/types/modules/contract/Controller.d.ts +204 -0
  255. package/types/modules/contract/Figure.d.ts +529 -0
  256. package/types/modules/{HueSlider.d.ts → contract/HueSlider.d.ts} +39 -28
  257. package/types/modules/contract/Modal.d.ts +62 -0
  258. package/types/modules/contract/index.d.ts +7 -0
  259. package/types/modules/manager/ApiManager.d.ts +106 -0
  260. package/types/modules/manager/FileManager.d.ts +124 -0
  261. package/types/modules/manager/index.d.ts +3 -0
  262. package/types/modules/ui/ModalAnchorEditor.d.ts +152 -0
  263. package/types/modules/ui/SelectMenu.d.ts +107 -0
  264. package/types/modules/{_DragHandle.d.ts → ui/_DragHandle.d.ts} +1 -0
  265. package/types/modules/ui/index.d.ts +4 -0
  266. package/types/plugins/browser/audioGallery.d.ts +33 -41
  267. package/types/plugins/browser/fileBrowser.d.ts +42 -50
  268. package/types/plugins/browser/fileGallery.d.ts +33 -41
  269. package/types/plugins/browser/imageGallery.d.ts +30 -37
  270. package/types/plugins/browser/videoGallery.d.ts +33 -41
  271. package/types/plugins/command/blockquote.d.ts +4 -21
  272. package/types/plugins/command/exportPDF.d.ts +23 -33
  273. package/types/plugins/command/fileUpload.d.ts +80 -100
  274. package/types/plugins/command/list_bulleted.d.ts +9 -35
  275. package/types/plugins/command/list_numbered.d.ts +9 -35
  276. package/types/plugins/dropdown/align.d.ts +23 -46
  277. package/types/plugins/dropdown/backgroundColor.d.ts +35 -53
  278. package/types/plugins/dropdown/blockStyle.d.ts +45 -0
  279. package/types/plugins/dropdown/font.d.ts +18 -41
  280. package/types/plugins/dropdown/fontColor.d.ts +35 -53
  281. package/types/plugins/dropdown/hr.d.ts +26 -52
  282. package/types/plugins/dropdown/layout.d.ts +19 -25
  283. package/types/plugins/dropdown/lineHeight.d.ts +21 -39
  284. package/types/plugins/dropdown/list.d.ts +6 -34
  285. package/types/plugins/dropdown/paragraphStyle.d.ts +34 -45
  286. package/types/plugins/dropdown/table/index.d.ts +158 -0
  287. package/types/plugins/dropdown/table/render/table.html.d.ts +71 -0
  288. package/types/plugins/dropdown/table/render/table.menu.d.ts +59 -0
  289. package/types/plugins/dropdown/table/services/table.cell.d.ts +76 -0
  290. package/types/plugins/dropdown/table/services/table.clipboard.d.ts +26 -0
  291. package/types/plugins/dropdown/table/services/table.grid.d.ts +77 -0
  292. package/types/plugins/dropdown/table/services/table.resize.d.ts +72 -0
  293. package/types/plugins/dropdown/table/services/table.selection.d.ts +59 -0
  294. package/types/plugins/dropdown/table/services/table.style.d.ts +162 -0
  295. package/types/plugins/dropdown/table/shared/table.constants.d.ts +134 -0
  296. package/types/plugins/dropdown/table/shared/table.utils.d.ts +91 -0
  297. package/types/plugins/dropdown/template.d.ts +19 -25
  298. package/types/plugins/dropdown/textStyle.d.ts +23 -30
  299. package/types/plugins/field/mention.d.ts +66 -72
  300. package/types/plugins/index.d.ts +41 -40
  301. package/types/plugins/input/fontSize.d.ts +57 -96
  302. package/types/plugins/input/pageNavigator.d.ts +5 -8
  303. package/types/plugins/modal/audio.d.ts +60 -153
  304. package/types/plugins/modal/drawing.d.ts +16 -118
  305. package/types/plugins/modal/embed.d.ts +46 -166
  306. package/types/plugins/modal/image/index.d.ts +281 -0
  307. package/types/plugins/modal/image/render/image.html.d.ts +45 -0
  308. package/types/plugins/modal/image/services/image.size.d.ts +55 -0
  309. package/types/plugins/modal/image/services/image.upload.d.ts +24 -0
  310. package/types/plugins/modal/image/shared/image.constants.d.ts +17 -0
  311. package/types/plugins/modal/link.d.ts +46 -66
  312. package/types/plugins/modal/math.d.ts +17 -86
  313. package/types/plugins/modal/{video.d.ts → video/index.d.ts} +89 -221
  314. package/types/plugins/modal/video/render/video.html.d.ts +37 -0
  315. package/types/plugins/modal/video/services/video.size.d.ts +74 -0
  316. package/types/plugins/modal/video/services/video.upload.d.ts +19 -0
  317. package/types/plugins/popup/anchor.d.ts +8 -38
  318. package/types/suneditor.d.ts +55 -24
  319. package/types/typedef.d.ts +344 -228
  320. package/CONTRIBUTING.md +0 -186
  321. package/src/core/base/eventHandlers/handler_ww_key_input.js +0 -1200
  322. package/src/core/base/eventHandlers/handler_ww_mouse.js +0 -194
  323. package/src/core/base/eventManager.js +0 -1523
  324. package/src/core/class/component.js +0 -856
  325. package/src/core/class/format.js +0 -3433
  326. package/src/core/class/menu.js +0 -346
  327. package/src/core/class/selection.js +0 -610
  328. package/src/core/class/shortcuts.js +0 -98
  329. package/src/core/class/toolbar.js +0 -431
  330. package/src/core/class/ui.js +0 -424
  331. package/src/core/class/viewer.js +0 -750
  332. package/src/core/section/actives.js +0 -266
  333. package/src/core/section/context.js +0 -102
  334. package/src/editorInjector/_classes.js +0 -36
  335. package/src/editorInjector/_core.js +0 -87
  336. package/src/editorInjector/index.js +0 -73
  337. package/src/modules/ApiManager.js +0 -191
  338. package/src/modules/Controller.js +0 -474
  339. package/src/modules/Modal.js +0 -346
  340. package/src/modules/index.js +0 -14
  341. package/src/plugins/dropdown/table.js +0 -4034
  342. package/src/plugins/modal/image.js +0 -1376
  343. package/src/plugins/modal/video.js +0 -1226
  344. package/types/core/base/eventHandlers/handler_toolbar.d.ts +0 -41
  345. package/types/core/base/eventHandlers/handler_ww_clipboard.d.ts +0 -40
  346. package/types/core/base/eventHandlers/handler_ww_dragDrop.d.ts +0 -35
  347. package/types/core/base/eventHandlers/handler_ww_key_input.d.ts +0 -45
  348. package/types/core/base/eventHandlers/handler_ww_mouse.d.ts +0 -39
  349. package/types/core/base/eventManager.d.ts +0 -401
  350. package/types/core/class/char.d.ts +0 -61
  351. package/types/core/class/component.d.ts +0 -213
  352. package/types/core/class/format.d.ts +0 -623
  353. package/types/core/class/html.d.ts +0 -430
  354. package/types/core/class/menu.d.ts +0 -126
  355. package/types/core/class/nodeTransform.d.ts +0 -93
  356. package/types/core/class/offset.d.ts +0 -522
  357. package/types/core/class/selection.d.ts +0 -188
  358. package/types/core/class/shortcuts.d.ts +0 -142
  359. package/types/core/class/toolbar.d.ts +0 -189
  360. package/types/core/class/ui.d.ts +0 -164
  361. package/types/core/class/viewer.d.ts +0 -140
  362. package/types/core/section/actives.d.ts +0 -46
  363. package/types/core/section/context.d.ts +0 -45
  364. package/types/editorInjector/_classes.d.ts +0 -41
  365. package/types/editorInjector/_core.d.ts +0 -87
  366. package/types/editorInjector/index.d.ts +0 -69
  367. package/types/modules/ApiManager.d.ts +0 -125
  368. package/types/modules/Browser.d.ts +0 -326
  369. package/types/modules/ColorPicker.d.ts +0 -135
  370. package/types/modules/Controller.d.ts +0 -251
  371. package/types/modules/Figure.d.ts +0 -517
  372. package/types/modules/FileManager.d.ts +0 -202
  373. package/types/modules/Modal.d.ts +0 -111
  374. package/types/modules/ModalAnchorEditor.d.ts +0 -236
  375. package/types/modules/SelectMenu.d.ts +0 -194
  376. package/types/modules/index.d.ts +0 -26
  377. package/types/plugins/dropdown/formatBlock.d.ts +0 -55
  378. package/types/plugins/dropdown/table.d.ts +0 -627
  379. package/types/plugins/modal/image.d.ts +0 -451
  380. /package/{LICENSE → LICENSE.txt} +0 -0
@@ -1,7 +1,3 @@
1
- /**
2
- * @fileoverview DocumentType class
3
- */
4
-
5
1
  import { dom, numbers, converter, env } from '../../helper';
6
2
 
7
3
  const { _w } = env;
@@ -13,72 +9,95 @@ const A4_HEIGHT_MM = 297;
13
9
  const A4_PAGE_HEIGHT = Math.floor(A4_HEIGHT_MM * MM_TO_POINTS * POINTS_TO_PIXELS);
14
10
 
15
11
  /**
16
- * @constructor
17
12
  * @description DocumentType, page, header management class
18
- * @param {__se__EditorCore} editor - The root editor instance
19
- * @param {__se__FrameContext} fc - frame context object
20
13
  */
21
- function DocumentType(editor, fc) {
22
- // members
23
- this.editor = editor;
24
- this.context = editor.context;
25
- this.selection = editor.selection;
26
- this.offset = editor.offset;
27
- this.fc = fc;
28
- this.ww = fc.get('wysiwyg');
29
- this.wwFrame = fc.get('wysiwygFrame');
30
- this.wwWidth = -1;
31
- this.wwHeight = -1;
32
- this.isAutoHeight = fc.get('options').get('height') === 'auto';
33
- this.displayPage = this.isAutoHeight ? _w : fc.get('wysiwyg');
34
- this.innerHeaders = [];
35
- this._wwHeaders = [];
36
- this.documentTypeInner = fc.get('documentTypeInner');
37
- this.inner = null;
38
- this.page = null;
39
- this.totalPages = 0;
40
- this.pageNum = 0;
41
- this.pageHeight = -1;
42
- this.pageBreaksCnt = 0;
43
- this.pages = [];
44
- this.pages_line = [];
45
- this.prevScrollTop = 0;
46
- this.useHeader = editor.options.get('_type_options').includes('header');
47
- this.usePage = editor.options.get('_type_options').includes('page');
48
- this.navigatorButtons = [];
49
- this.pageNavigator = null;
50
- this._mirror = fc.get('documentTypePageMirror');
51
- this._mirrorCache = 0;
52
- this._positionCache = new Map();
53
- this._rePageTimeout = null;
54
-
55
- const mirrorStyles = _w.getComputedStyle(this._mirror);
56
- this._paddingTop = numbers.get(mirrorStyles.paddingTop);
57
- this._paddingBottom = numbers.get(mirrorStyles.paddingBottom);
58
-
59
- // init header
60
- if (this.useHeader) {
61
- const headers = this._getHeaders();
62
- const inner = (this.inner = this.documentTypeInner.querySelector('.se-document-lines-inner'));
63
- let headerHTML = '';
64
- for (let i = 0, len = headers.length, h; i < len; i++) {
65
- h = headers[i];
66
- headerHTML += `<div class="se-doc-item se-doc-h${numbers.get(h.nodeName)}" title="${h.textContent}">${h.textContent}</div>`;
67
- }
68
- inner.innerHTML = headerHTML;
69
- this.innerHeaders = inner.querySelectorAll('div');
14
+ class DocumentType {
15
+ #store;
16
+ #context;
17
+ #isScrollable;
18
+
19
+ #offset;
20
+ #selection;
21
+ #toolbar;
22
+
23
+ #fc;
24
+ #ww;
25
+ #wwFrame;
26
+ #documentTypeInner;
27
+ #inner;
28
+ #page;
29
+ #pageNavigator;
30
+ #mirror;
31
+ #paddingTop;
32
+ #paddingBottom;
33
+
34
+ #wwWidth = -1;
35
+ #wwHeight = -1;
36
+ #innerHeaders = null;
37
+ #wwHeaders = null;
38
+ #totalPages = 0;
39
+ #pageNum = 0;
40
+ #pageHeight = -1;
41
+ #pageBreaksCnt = 0;
42
+ #pages = [];
43
+ #pagesLine = null;
44
+ #prevScrollTop = 0;
45
+ #mirrorCache = 0;
46
+ #positionCache = new Map();
47
+ #rePageTimeout = null;
70
48
 
71
- this.editor.eventManager.addEvent(inner, 'click', OnClickHeader.bind(this, this.ww));
72
- }
49
+ /**
50
+ * @constructor
51
+ * @param {SunEditor.Kernel} kernel
52
+ * @param {SunEditor.FrameContext} fc - Frame context object
53
+ */
54
+ constructor(kernel, fc) {
55
+ const $ = kernel.$;
56
+
57
+ this.#store = $.store;
58
+ this.#context = $.context;
59
+ this.#isScrollable = this.#store.get('isScrollable');
60
+
61
+ this.#offset = $.offset;
62
+ this.#selection = $.selection;
63
+ this.#toolbar = $.toolbar;
64
+
65
+ // members
66
+ this.useHeader = $.options.get('_type_options').includes('header');
67
+ this.usePage = $.options.get('_type_options').includes('page');
68
+
69
+ this.#fc = fc;
70
+ this.#ww = fc.get('wysiwyg');
71
+ this.#wwFrame = fc.get('wysiwygFrame');
72
+ this.#documentTypeInner = fc.get('documentTypeInner');
73
+ this.#mirror = fc.get('documentTypePageMirror');
74
+
75
+ const mirrorStyles = _w.getComputedStyle(this.#mirror);
76
+ this.#paddingTop = numbers.get(mirrorStyles.paddingTop);
77
+ this.#paddingBottom = numbers.get(mirrorStyles.paddingBottom);
78
+
79
+ // init header
80
+ if (this.useHeader) {
81
+ const headers = this._getHeaders();
82
+ const inner = (this.#inner = this.#documentTypeInner.querySelector('.se-document-lines-inner'));
83
+ let headerHTML = '';
84
+ for (let i = 0, len = headers.length, h; i < len; i++) {
85
+ h = headers[i];
86
+ headerHTML += `<div class="se-doc-item se-doc-h${numbers.get(h.nodeName)}" title="${h.textContent}">${h.textContent}</div>`;
87
+ }
88
+ inner.innerHTML = headerHTML;
89
+ this.#innerHeaders = inner.querySelectorAll('div');
90
+
91
+ $.eventManager.addEvent(inner, 'click', this.#OnClickHeader.bind(this, this.#ww));
92
+ }
73
93
 
74
- // init page
75
- if (this.usePage) {
76
- this.page = fc.get('documentTypePage');
77
- this.pageNavigator = editor.plugins.pageNavigator;
94
+ // init page
95
+ if (this.usePage) {
96
+ this.#page = fc.get('documentTypePage');
97
+ this.#pageNavigator = $.plugins.pageNavigator;
98
+ }
78
99
  }
79
- }
80
100
 
81
- DocumentType.prototype = {
82
101
  /**
83
102
  * @description Refresh the document header area
84
103
  */
@@ -86,8 +105,8 @@ DocumentType.prototype = {
86
105
  if (!this.useHeader) return;
87
106
 
88
107
  const headers = this._getHeaders();
89
- const inner = this.inner;
90
- const innerHeaders = this.innerHeaders;
108
+ const inner = this.#inner;
109
+ const innerHeaders = this.#innerHeaders;
91
110
 
92
111
  // update or new headers
93
112
  for (let i = 0, len = headers.length, h, hClass, innerH; i < len; i++) {
@@ -115,8 +134,8 @@ DocumentType.prototype = {
115
134
  }
116
135
  }
117
136
 
118
- this.innerHeaders = inner.querySelectorAll('div');
119
- },
137
+ this.#innerHeaders = inner.querySelectorAll('div');
138
+ }
120
139
 
121
140
  /**
122
141
  * @description Refresh the document page
@@ -124,17 +143,20 @@ DocumentType.prototype = {
124
143
  * @returns {Promise<void>}
125
144
  */
126
145
  async rePage(force) {
127
- if (!this.page) return;
128
- if (this._rePageTimeout) _w.clearTimeout(this._rePageTimeout);
146
+ if (!this.#page) return;
147
+ if (this.#rePageTimeout) _w.clearTimeout(this.#rePageTimeout);
148
+
149
+ // Debounced page re-render — waits for media to load and coalesces rapid calls (cleared on next rePage)
150
+ this.#rePageTimeout = _w.setTimeout(async () => {
151
+ await dom.utils.waitForMediaLoad(this.#mirror, 1500);
129
152
 
130
- this._rePageTimeout = _w.setTimeout(async () => {
131
- await dom.utils.waitForMediaLoad(this._mirror, 1500);
153
+ const heightGap = this.#ww.scrollHeight > this.#mirror.scrollHeight ? this.#ww.scrollHeight - this.#mirror.scrollHeight : 0;
154
+ const mirrorHeight = this.#mirror.scrollHeight + heightGap;
155
+ const pageBreaks = /** @type { NodeListOf<HTMLElement>} */ (this.#ww.querySelectorAll('.se-page-break'));
156
+ if (!force && this.#pageHeight === mirrorHeight && this.#pageBreaksCnt === pageBreaks.length) return;
132
157
 
133
- const mirrorHeight = this._mirror.scrollHeight;
134
- const pageBreaks = this._mirror.querySelectorAll('.se-page-break');
135
- if (!force && this.pageHeight === mirrorHeight && this.pageBreaksCnt === pageBreaks.length) return;
136
- this.pageHeight = mirrorHeight;
137
- this.pageBreaksCnt = pageBreaks.length;
158
+ this.#pageHeight = mirrorHeight;
159
+ this.#pageBreaksCnt = pageBreaks.length;
138
160
 
139
161
  // page break
140
162
  let pageBreakHeight = 0;
@@ -145,119 +167,142 @@ DocumentType.prototype = {
145
167
  for (let i = 0; i < pageBreaks.length; i++) {
146
168
  const breakPosition = pageBreaks[i].offsetTop;
147
169
  const sectionHeight = breakPosition - lastBreakPosition;
148
-
149
- if (sectionHeight % A4_PAGE_HEIGHT !== 0) {
150
- additionalPages++;
151
- }
152
-
170
+ if (sectionHeight % A4_PAGE_HEIGHT !== 0) additionalPages++;
153
171
  lastBreakPosition = breakPosition;
154
172
  }
155
173
 
156
174
  const lastSectionHeight = mirrorHeight - lastBreakPosition;
157
- if (lastSectionHeight > 0 && lastSectionHeight % A4_PAGE_HEIGHT !== 0) {
158
- additionalPages++;
159
- }
175
+ if (lastSectionHeight > 0 && lastSectionHeight % A4_PAGE_HEIGHT !== 0) additionalPages++;
160
176
  }
161
177
 
162
- const scrollTop = this.isAutoHeight ? 0 : this._getWWScrollTop();
178
+ const scrollTop = !this.#isScrollable(this.#fc) ? 0 : this._getWWScrollTop();
163
179
  const totalPages = Math.ceil(mirrorHeight / A4_PAGE_HEIGHT) + additionalPages;
164
- const wwWidth = this.wwFrame.offsetWidth + 1;
180
+ const wwWidth = this.#wwFrame.offsetWidth + 1;
165
181
  const pages = [];
166
182
 
167
183
  for (let i = 0; i < pageBreaks.length; i++) {
168
- pages.push({ number: i, top: pageBreaks[i].offsetTop + pageBreakHeight - scrollTop });
184
+ pages.push({ number: i, top: pageBreaks[i].offsetTop + pageBreakHeight / 2 - scrollTop });
169
185
  }
170
186
 
171
- // A4 position
172
- this._mirrorCache = 0;
173
- const chr = this.ww.children;
174
- const mChr = this._mirror.children;
187
+ this.#mirrorCache = 0;
188
+ const chr = this.#ww.children;
189
+ const mChr = this.#mirror.children;
175
190
  this._initializeCache(mChr);
191
+
176
192
  pages.push({ number: 0, top: 0 });
177
- for (let i = 1, t = 0; i < totalPages; i++) {
178
- t += A4_PAGE_HEIGHT + (i === 1 ? this._paddingTop + this._paddingBottom : this._paddingTop);
179
- if (!pages.some((p) => Math.abs(p.top - t) < 1)) {
180
- const { ci, cm, ch } = this._getElementAtPosition(t, mChr);
181
- const el = chr[ci];
182
- if (!el) break;
183
-
184
- if (chr[this._mirrorCache]) {
185
- t += numbers.get(_w.getComputedStyle(chr[this._mirrorCache]).marginBottom);
186
- }
187
193
 
188
- const elBottom = el.offsetTop + el.offsetHeight;
189
- const top = elBottom + cm + (el.offsetHeight - ch);
194
+ for (let i = 1, t = 0; i < totalPages; i++) {
195
+ t += A4_PAGE_HEIGHT + (i === 1 ? this.#paddingTop + this.#paddingBottom : this.#paddingTop);
196
+ if (!pages.some((p) => Math.abs(p.top - t) < 3)) {
197
+ const top = this._calcPageBreakTop(t, chr, mChr);
198
+ if (top === null) break;
190
199
  pages.push({ number: i, top });
191
200
  }
192
201
  }
193
202
 
194
203
  if (pages.length === 0) {
195
- this.pages_line = [];
196
- this.totalPages = 1;
204
+ this.#pagesLine = null;
205
+ this.#totalPages = 1;
197
206
  this._displayCurrentPage();
198
207
  return;
199
208
  }
200
209
 
201
210
  // numbering
202
211
  pages.sort((a, b) => a.top - b.top);
203
- this.page.innerHTML = '';
204
- this.pages = [];
212
+ this.#page.innerHTML = '';
213
+ this.#pages = [];
214
+
205
215
  for (let i = 0, t; i < totalPages; i++) {
206
216
  if (!pages[i]) continue;
207
217
  t = pages[i].top;
208
218
  if (mirrorHeight < t) break;
209
- const pageNumber = dom.utils.createElement('DIV', { style: `top:${t - scrollTop}px`, innerHTML: String(i + 1) }, `<div class="se-document-page-line" style="width: ${wwWidth}px;"></div>${i + 1}`);
210
- this.page.appendChild(pageNumber);
211
- this.pages.push(pageNumber);
219
+
220
+ const pageNumber = dom.utils.createElement(
221
+ 'DIV',
222
+ {
223
+ style: `top:${t - scrollTop}px`,
224
+ innerHTML: String(i + 1),
225
+ },
226
+ `<div class="se-document-page-line" style="width: ${wwWidth}px;"></div>${i + 1}`,
227
+ );
228
+
229
+ this.#page.appendChild(pageNumber);
230
+ this.#pages.push(pageNumber);
212
231
  }
213
232
 
214
- this.pages_line = this.page.querySelectorAll('.se-document-page-line');
215
- this.totalPages = this.pages.length;
233
+ this.#pagesLine = this.#page.querySelectorAll('.se-document-page-line');
234
+ this.#totalPages = this.#pages.length;
216
235
  this._displayCurrentPage();
217
236
  }, 400);
218
- },
237
+ }
238
+
239
+ _getDisplayPage() {
240
+ return /** @type {SunEditor.EventWysiwyg} */ (!this.#isScrollable(this.#fc) ? _w : this.#fc.get('wysiwyg'));
241
+ }
242
+
243
+ /**
244
+ * @internal
245
+ * @description Calculates and compensates for the vertical gap between the rendered content (current page)
246
+ * - and the mirrored preview page due to differences in width and layout.
247
+ * @param {number} t - The initial top position value to be adjusted.
248
+ * @param {HTMLCollection} chr - The elements array in the current (main) page.
249
+ * @param {HTMLCollection} mChr - The elements array in the mirrored page.
250
+ * @returns {number|null} The adjusted top value.
251
+ */
252
+ _calcPageBreakTop(t, chr, mChr) {
253
+ const { ci } = this._getElementAtPosition(t, mChr);
254
+ const mel = /** @type {HTMLElement} */ (mChr[ci]);
255
+ const el = /** @type {HTMLElement} */ (chr[ci]);
256
+ if (!mel || !el) return null;
257
+
258
+ const offsetDiff = el.offsetTop - mel.offsetTop;
259
+ const heightDiff = el.offsetHeight - mel.offsetHeight;
260
+
261
+ const top = t + offsetDiff + heightDiff / 2;
262
+ return Math.round(top);
263
+ }
219
264
 
220
265
  /**
221
- * @private
266
+ * @internal
222
267
  * @description Initializes the cache for document elements.
223
- * @param {Array<HTMLElement>} mChr - List of mirrored elements.
268
+ * @param {HTMLCollection} mChr - List of mirrored elements.
224
269
  */
225
270
  _initializeCache(mChr) {
226
- this._positionCache.clear();
271
+ this.#positionCache.clear();
227
272
  for (let i = 0, len = mChr.length; i < len; i++) {
228
- const element = mChr[i];
273
+ const element = /** @type {HTMLElement} */ (mChr[i]);
229
274
  const top = element.offsetTop;
230
275
  const height = element.offsetHeight;
231
276
  const bottom = top + height;
232
277
 
233
- this._positionCache.set(i, {
278
+ this.#positionCache.set(i, {
234
279
  top,
235
280
  height,
236
- bottom: bottom
281
+ bottom: bottom,
237
282
  });
238
283
  }
239
- },
284
+ }
240
285
 
241
286
  /**
242
- * @private
287
+ * @internal
243
288
  * @description Retrieves the element at a given position.
244
289
  * @param {number} pageTop - The vertical position to check.
245
- * @param {NodeList} mChr - List of mirrored elements.
290
+ * @param {HTMLCollection} mChr - List of mirrored elements.
246
291
  * @returns {{ci: number, cm: number, ch: number}} The closest element and its related data.
247
292
  * - ci: The index of the closest element.
248
293
  * - cm: The distance between the top of the closest element and the given position.
249
294
  * - ch: The height of the closest element.
250
295
  */
251
296
  _getElementAtPosition(pageTop, mChr) {
252
- let start = this._mirrorCache;
297
+ let start = this.#mirrorCache;
253
298
  let end = mChr.length - 1;
254
299
 
255
300
  while (start <= end) {
256
301
  const mid = Math.floor((start + end) / 2);
257
- const { top, height, bottom } = this._positionCache.get(mid);
302
+ const { top, height, bottom } = this.#positionCache.get(mid);
258
303
 
259
304
  if (pageTop >= top && pageTop <= bottom) {
260
- this._mirrorCache = mid;
305
+ this.#mirrorCache = mid;
261
306
  return { ci: mid, cm: pageTop - bottom, ch: height };
262
307
  }
263
308
 
@@ -269,103 +314,103 @@ DocumentType.prototype = {
269
314
  }
270
315
 
271
316
  const closestIndex = mChr[start] ? start : end;
272
- this._mirrorCache = closestIndex;
273
- const iElement = this._positionCache.get(closestIndex);
317
+ this.#mirrorCache = closestIndex;
318
+ const iElement = this.#positionCache.get(closestIndex);
274
319
  return { ci: closestIndex, cm: pageTop - iElement.bottom, ch: iElement.height };
275
- },
320
+ }
276
321
 
277
322
  /**
278
323
  * @description Resizes the document page dynamically.
279
324
  */
280
325
  resizePage() {
281
- const wwWidth = this.wwFrame.offsetWidth + 1;
282
- const wwHeight = this.wwFrame.offsetHeight + 1;
326
+ const wwWidth = this.#wwFrame.offsetWidth + 1;
327
+ const wwHeight = this.#wwFrame.offsetHeight + 1;
283
328
  let rh = false;
284
- if (wwWidth === this.wwWidth && (rh = wwHeight === this.wwHeight)) return;
329
+ if (wwWidth === this.#wwWidth && (rh = wwHeight === this.#wwHeight)) return;
285
330
 
286
331
  if (wwWidth > 800) {
287
- dom.utils.removeClass(this.documentTypeInner, 'se-document-responsible');
332
+ dom.utils.removeClass(this.#documentTypeInner, 'se-document-responsible');
288
333
  } else {
289
- dom.utils.addClass(this.documentTypeInner, 'se-document-responsible');
334
+ dom.utils.addClass(this.#documentTypeInner, 'se-document-responsible');
290
335
  }
291
336
 
292
- this.wwWidth = wwWidth;
293
- this.wwHeight = wwHeight;
294
- const pages_line = this.pages_line;
295
- for (let i = 0, len = pages_line.length; i < len; i++) {
337
+ this.#wwWidth = wwWidth;
338
+ this.#wwHeight = wwHeight;
339
+ const pages_line = this.#pagesLine;
340
+ for (let i = 0, len = pages_line?.length; i < len; i++) {
296
341
  pages_line[i].style.width = `${wwWidth}px`;
297
342
  }
298
343
 
299
344
  if (!rh) this.rePage(true);
300
345
  this._displayCurrentPage();
301
- },
346
+ }
302
347
 
303
348
  /**
304
349
  * @description Scrolls the document page.
305
350
  */
306
351
  scrollPage() {
307
- const prevScrollTop = this.prevScrollTop;
352
+ const prevScrollTop = this.#prevScrollTop;
308
353
  const scrollTop = this._getWWScrollTop();
309
354
  if (prevScrollTop === scrollTop) return;
310
355
 
311
- const pages = this.pages;
356
+ const pages = this.#pages;
312
357
  for (let i = 0, len = pages.length; i < len; i++) {
313
358
  pages[i].style.top = `${numbers.get(pages[i].style.top) - (scrollTop - prevScrollTop)}px`;
314
359
  }
315
360
 
316
- this.prevScrollTop = scrollTop;
361
+ this.#prevScrollTop = scrollTop;
317
362
  this._displayCurrentPage();
318
- },
363
+ }
319
364
 
320
365
  /**
321
366
  * @description Scrolls the window to a specific position.
322
367
  */
323
368
  scrollWindow() {
324
- if (!this.isAutoHeight) return;
369
+ if (this.#isScrollable(this.#fc)) return;
325
370
  this._displayCurrentPage();
326
- },
371
+ }
327
372
 
328
373
  /**
329
374
  * @description Retrieves the current page number.
330
375
  * @returns {number} The current page number.
331
376
  */
332
377
  getCurrentPageNumber() {
333
- if (this.totalPages <= 1) return 1;
378
+ if (this.#totalPages <= 1) return 1;
334
379
 
335
380
  let targetPosition = 0;
336
- if (this.isAutoHeight) {
381
+ if (!this.#isScrollable(this.#fc)) {
337
382
  const globalTop = this._getGlobalTop();
338
383
  targetPosition = _w.scrollY - globalTop + A4_PAGE_HEIGHT / 2;
339
384
  if (targetPosition <= 0) return 1;
340
385
  } else {
341
- targetPosition = this.wwHeight / 2;
386
+ targetPosition = this.#wwHeight / 2;
342
387
  }
343
388
 
344
- const pages = this.pages;
389
+ const pages = this.#pages;
345
390
  for (let i = 0, len = pages.length; i < len; i++) {
346
391
  if (pages[i].offsetTop >= targetPosition) {
347
- return (this.pageNum = i);
392
+ return (this.#pageNum = i);
348
393
  }
349
394
  }
350
395
 
351
- return (this.pageNum = this.totalPages);
352
- },
396
+ return (this.#pageNum = this.#totalPages);
397
+ }
353
398
 
354
399
  /**
355
400
  * @description Moves to the previous page.
356
401
  */
357
402
  pageUp() {
358
- const pageNum = this.pageNum - 1 <= 1 ? 1 : this.pageNum - 1;
403
+ const pageNum = this.#pageNum - 1 <= 1 ? 1 : this.#pageNum - 1;
359
404
  this._movePage(pageNum, false);
360
- },
405
+ }
361
406
 
362
407
  /**
363
408
  * @description Moves to the next page.
364
409
  */
365
410
  pageDown() {
366
- const pageNum = this.pageNum + 1 > this.pages.length ? this.pages.length : this.pageNum + 1;
411
+ const pageNum = this.#pageNum + 1 > this.#pages.length ? this.#pages.length : this.#pageNum + 1;
367
412
  this._movePage(pageNum, false);
368
- },
413
+ }
369
414
 
370
415
  /**
371
416
  * @description Moves to a specific page.
@@ -373,14 +418,14 @@ DocumentType.prototype = {
373
418
  */
374
419
  pageGo(pageNum) {
375
420
  if (pageNum < 1) pageNum = 1;
376
- else if (pageNum > this.pages.length) pageNum = this.pages.length;
421
+ else if (pageNum > this.#pages.length) pageNum = this.#pages.length;
377
422
 
378
423
  this._movePage(pageNum, true);
379
- },
424
+ }
380
425
 
381
426
  /**
382
427
  * @description Highlights the header of the current line.
383
- * @param {Node} line - The "line" element to be highlighted.
428
+ * @param {Node} line - The `line` element to be highlighted.
384
429
  */
385
430
  on(line) {
386
431
  if (!this.useHeader) return;
@@ -391,9 +436,9 @@ DocumentType.prototype = {
391
436
  const item = this._findItem(line);
392
437
  if (!item) return;
393
438
 
394
- dom.utils.removeClass(this.innerHeaders, 'active');
439
+ dom.utils.removeClass(this.#innerHeaders, 'active');
395
440
  dom.utils.addClass(item, 'active');
396
- },
441
+ }
397
442
 
398
443
  /**
399
444
  * @description Handles text changes in the document.
@@ -405,60 +450,64 @@ DocumentType.prototype = {
405
450
  const item = this._findItem(header);
406
451
  if (!item) return;
407
452
  item.textContent = header.textContent;
408
- },
453
+ }
409
454
 
410
455
  /**
411
- * @private
456
+ * @internal
412
457
  * @description Displays the current page number.
413
458
  */
414
459
  _displayCurrentPage() {
415
460
  const pageNum = this.getCurrentPageNumber();
416
- this.pageNavigator?.display(pageNum, this.totalPages);
417
- },
461
+ this.#pageNavigator?.display(pageNum, this.#totalPages);
462
+ }
418
463
 
419
464
  /**
420
- * @private
465
+ * @internal
421
466
  * @description Retrieves the scroll position in WYSIWYG mode.
422
467
  * @returns {number} The current scroll position.
423
468
  */
424
469
  _getWWScrollTop() {
425
- return this.displayPage.scrollTop || this.displayPage.scrollY || 0;
426
- },
470
+ const displayPage = this._getDisplayPage();
471
+ return displayPage.scrollTop || displayPage.scrollY || 0;
472
+ }
427
473
 
428
474
  /**
429
- * @private
475
+ * @internal
430
476
  * @description Moves to a specific page and updates the view.
431
477
  * @param {number} pageNum - The target page number.
432
478
  */
433
479
  _movePage(pageNum, force) {
434
480
  const globalTop = this._getGlobalTop();
435
- const children = converter.nodeListToArray(this.ww.children);
436
- const pageTop = this.page.offsetTop + numbers.get(this.pages[pageNum - 1].style.top) + (this.isAutoHeight ? 0 : this._getWWScrollTop());
481
+ const isScrollable = this.#isScrollable(this.#fc);
482
+ const children = converter.nodeListToArray(this.#ww.children);
483
+ const pageTop = this.#page.offsetTop + numbers.get(this.#pages[pageNum - 1].style.top) + (!isScrollable ? 0 : this._getWWScrollTop());
437
484
  for (let i = 0, len = children.length, c; i < len; i++) {
438
485
  c = children[i];
439
486
  if (c.offsetTop >= pageTop) {
440
- if (!force) this.selection.setRange(c, 0, c, 0);
441
- const scrollTop = i === 0 && !this.isAutoHeight ? 0 : c.offsetTop - this.page.offsetTop - c.offsetHeight + globalTop;
487
+ if (!force) this.#selection.setRange(c, 0, c, 0);
488
+ const scrollTop = i === 0 && isScrollable ? 0 : c.offsetTop - this.#page.offsetTop - c.offsetHeight + globalTop;
442
489
  this._applyPageScroll(scrollTop, () => {
443
- if (this.editor.toolbar._sticky) {
444
- this.displayPage.scrollTo({ top: scrollTop - this.context.get('toolbar.main').offsetHeight, behavior: 'smooth' });
490
+ if (this.#toolbar.isSticky) {
491
+ this._getDisplayPage().scrollTo({ top: scrollTop - this.#context.get('toolbar_main').offsetHeight, behavior: 'smooth' });
445
492
  }
446
493
  });
447
494
 
448
- this.pageNum = pageNum;
495
+ this.#pageNum = pageNum;
449
496
  break;
450
497
  }
451
498
  }
452
- },
499
+ }
453
500
 
454
501
  /**
455
- * @private
502
+ * @internal
456
503
  * @description Applies smooth scrolling for page navigation.
457
504
  */
458
505
  _applyPageScroll(top, callback) {
459
- this.displayPage.scrollTo({ top, behavior: 'smooth' });
506
+ const displayPage = this._getDisplayPage();
507
+
508
+ displayPage.scrollTo({ top, behavior: 'smooth' });
460
509
  const checkScrollEnd = () => {
461
- if (Math.abs((this.displayPage.scrollY ?? this.displayPage.scrollTop) - top) < 1) {
510
+ if (Math.abs((displayPage.scrollY ?? displayPage.scrollTop) - top) < 1) {
462
511
  callback();
463
512
  } else {
464
513
  _w.requestAnimationFrame(checkScrollEnd);
@@ -466,42 +515,42 @@ DocumentType.prototype = {
466
515
  };
467
516
 
468
517
  _w.requestAnimationFrame(checkScrollEnd);
469
- },
518
+ }
470
519
 
471
520
  /**
472
- * @private
521
+ * @internal
473
522
  * @description Retrieves the global top offset of an element.
474
523
  * @returns {number} The top offset of the element.
475
524
  */
476
525
  _getGlobalTop() {
477
- return this.isAutoHeight ? this.offset.getGlobal(this.wwFrame).top : 0;
478
- },
526
+ return !this.#isScrollable(this.#fc) ? this.#offset.getGlobal(this.#wwFrame).top : 0;
527
+ }
479
528
 
480
529
  /**
481
- * @private
530
+ * @internal
482
531
  * @description Finds an header element of innerHeaders element.
483
532
  * @param {Node} header - H tag element to find.
484
533
  * @returns {HTMLElement|null} The found element, or null if not found.
485
534
  */
486
535
  _findItem(header) {
487
- const headers = this._wwHeaders;
536
+ const headers = this.#wwHeaders;
488
537
  const index = Array.prototype.indexOf.call(headers, header);
489
538
 
490
- if (index !== -1 && this.innerHeaders[index]) {
491
- return this.innerHeaders[index];
539
+ if (index !== -1 && this.#innerHeaders[index]) {
540
+ return this.#innerHeaders[index];
492
541
  }
493
542
 
494
543
  return null;
495
- },
544
+ }
496
545
 
497
546
  /**
498
- * @private
547
+ * @internal
499
548
  * @description Finds the closest header element from a given line.
500
- * @param {Node} line - The "line" to check.
549
+ * @param {Node} line - The `line` to check.
501
550
  * @returns {Node|null} The closest header element, or null if not found.
502
551
  */
503
552
  _findLinesHeader(line) {
504
- while (line && line !== this.ww) {
553
+ while (line && line !== this.#ww) {
505
554
  if (this._is(line)) {
506
555
  return line;
507
556
  }
@@ -509,52 +558,78 @@ DocumentType.prototype = {
509
558
  }
510
559
 
511
560
  return null;
512
- },
561
+ }
513
562
 
514
563
  /**
515
- * @private
564
+ * @internal
516
565
  * @description Checks if an element is a header.
517
566
  * @param {Node} element - The element to check.
518
567
  * @returns {boolean} True if the element is a header, otherwise false.
519
568
  */
520
569
  _is(element) {
521
570
  return /^h[1-6]$/i.test(element?.nodeName);
522
- },
571
+ }
523
572
 
524
573
  /**
525
- * @private
574
+ * @internal
526
575
  * @description Retrieves all headers in the document.
527
- * @returns {Array<HTMLElement>} An array of header elements.
576
+ * @returns {NodeListOf<Element>} An array of header elements.
528
577
  */
529
578
  _getHeaders() {
530
- return (this._wwHeaders = this.ww.querySelectorAll('h1, h2, h3, h4, h5, h6'));
531
- },
532
-
533
- constructor: DocumentType
534
- };
579
+ return (this.#wwHeaders = this.#ww.querySelectorAll('h1, h2, h3, h4, h5, h6'));
580
+ }
535
581
 
536
- /**
537
- * @private
538
- * @param {HTMLElement} ww WYSIWYG element
539
- * @param {Event} e Event object
540
- */
541
- function OnClickHeader(ww, e) {
542
- e.preventDefault();
543
-
544
- try {
545
- this.editor._preventBlur = true;
546
- const clickedHeader = dom.query.getEventTarget(e);
547
- if (dom.utils.hasClass(clickedHeader, 'se-doc-item')) {
548
- const innerIndex = Array.prototype.indexOf.call(this.innerHeaders, clickedHeader);
549
- if (innerIndex === -1) return;
550
-
551
- const header = this._wwHeaders[innerIndex];
552
- if (header) {
553
- this.selection.scrollTo(header);
582
+ /**
583
+ * @param {HTMLElement} ww WYSIWYG element
584
+ * @param {Event} e Event object
585
+ */
586
+ #OnClickHeader(ww, e) {
587
+ e.preventDefault();
588
+
589
+ try {
590
+ this.#store.set('_preventBlur', true);
591
+ const clickedHeader = dom.query.getEventTarget(e);
592
+ if (dom.utils.hasClass(clickedHeader, 'se-doc-item')) {
593
+ const innerIndex = Array.prototype.indexOf.call(this.#innerHeaders, clickedHeader);
594
+ if (innerIndex === -1) return;
595
+
596
+ const header = this.#wwHeaders[innerIndex];
597
+ if (header) {
598
+ this.#selection.scrollTo(header);
599
+ }
554
600
  }
601
+ } finally {
602
+ this.#store.set('_preventBlur', false);
555
603
  }
556
- } finally {
557
- this.editor._preventBlur = false;
604
+ }
605
+
606
+ /**
607
+ * @internal
608
+ * @description Destroy the DocumentType instance and release memory
609
+ */
610
+ _destroy() {
611
+ if (this.#rePageTimeout) {
612
+ _w.clearTimeout(this.#rePageTimeout);
613
+ this.#rePageTimeout = null;
614
+ }
615
+
616
+ if (this.#positionCache) {
617
+ this.#positionCache.clear();
618
+ this.#positionCache = null;
619
+ }
620
+
621
+ this.#fc = null;
622
+ this.#ww = null;
623
+ this.#wwFrame = null;
624
+ this.#documentTypeInner = null;
625
+ this.#inner = null;
626
+ this.#page = null;
627
+ this.#pages = null;
628
+ this.#pagesLine = null;
629
+ this.#innerHeaders = null;
630
+ this.#wwHeaders = null;
631
+ this.#pageNavigator = null;
632
+ this.#mirror = null;
558
633
  }
559
634
  }
560
635