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
@@ -0,0 +1,463 @@
1
+ import { dom, numbers, converter, env, keyCodeMap } from '../../../../helper';
2
+ import { _DragHandle } from '../../../../modules/ui';
3
+
4
+ import * as Constants from '../shared/table.constants';
5
+ import { CheckCellEdge, CheckRowEdge } from '../shared/table.utils';
6
+
7
+ const { _w } = env;
8
+
9
+ /**
10
+ * @description Manages table and cell resizing with drag-based dimension adjustments and visual guide lines.
11
+ */
12
+ export class TableResizeService {
13
+ #main;
14
+ #$;
15
+ #state;
16
+
17
+ #globalEvents;
18
+
19
+ #resizing = false;
20
+ #resizeLine = null;
21
+ #resizeLinePrev = null;
22
+
23
+ /**
24
+ * @param {import('../index').default} main Table index
25
+ */
26
+ constructor(main) {
27
+ this.#main = main;
28
+ this.#$ = main.$;
29
+ this.#state = main.state;
30
+
31
+ // member - global events
32
+ this.#globalEvents = {
33
+ resize: null,
34
+ resizeStop: null,
35
+ resizeKeyDown: null,
36
+ };
37
+ }
38
+
39
+ get #selectionService() {
40
+ return this.#main.selectionService;
41
+ }
42
+
43
+ /**
44
+ * @description Checks if the table is currently being resized.
45
+ * @returns {boolean}
46
+ */
47
+ isResizing() {
48
+ return this.#resizing;
49
+ }
50
+
51
+ /**
52
+ * @description Display a guide line during resize operations logic.
53
+ * @param {MouseEvent} event - Mouse event
54
+ * @param {HTMLElement} target - Target element (table cell or row)
55
+ * @returns {boolean|undefined} Returns `false` if resizing started, otherwise `undefined`.
56
+ */
57
+ onResizeGuide(event, target) {
58
+ const cellEdge = CheckCellEdge(event, target);
59
+ if (cellEdge.is) {
60
+ if (this.#main._element) this.#main._element.style.cursor = '';
61
+ this.#removeGlobalEvents();
62
+ if (this.#resizeLine?.style.display === 'block') this.#resizeLine.style.display = 'none';
63
+ this.#resizeLine = this.#$.frameContext.get('wrapper').querySelector(Constants.RESIZE_CELL_CLASS);
64
+ this.#setResizeLinePosition(dom.query.getParentElement(target, dom.check.isTable), target, this.#resizeLine, cellEdge.isLeft);
65
+ this.#resizeLine.style.display = 'block';
66
+ return false;
67
+ }
68
+
69
+ const rowEdge = CheckRowEdge(event, target);
70
+ if (rowEdge.is) {
71
+ this.#removeGlobalEvents();
72
+ this.#main._element = dom.query.getParentElement(target, dom.check.isTable);
73
+ this.#main._element.style.cursor = 'ns-resize';
74
+ if (this.#resizeLine?.style.display === 'block') this.#resizeLine.style.display = 'none';
75
+ this.#resizeLine = this.#$.frameContext.get('wrapper').querySelector(Constants.RESIZE_ROW_CLASS);
76
+ this.#setResizeRowPosition(dom.query.getParentElement(target, dom.check.isTable), target, this.#resizeLine);
77
+ this.#resizeLine.style.display = 'block';
78
+ return false;
79
+ }
80
+ }
81
+
82
+ /**
83
+ * @description Hides the resize guide line.
84
+ */
85
+ offResizeGuide() {
86
+ this.#hideResizeLine();
87
+ }
88
+
89
+ /**
90
+ * @description Prepares for resizing from the edge of a cell or row.
91
+ * @param {MouseEvent} event - Mouse event
92
+ * @param {HTMLTableCellElement} target - Target element
93
+ * @returns {boolean|undefined} Returns `false` if resizing started.
94
+ */
95
+ readyResizeFromEdge(event, target) {
96
+ const cellEdge = CheckCellEdge(event, target);
97
+ if (cellEdge.is) {
98
+ try {
99
+ this.#selectionService.deleteStyleSelectedCells();
100
+ this.#main.setCellInfo(target, true);
101
+ const colIndex = this.#state.logical_cellIndex + this.#state.current_colSpan - (cellEdge.isLeft ? 1 : 0);
102
+
103
+ // ready
104
+ this.#$.ui.enableBackWrapper('ew-resize');
105
+ this.#resizeLine ||= this.#$.frameContext.get('wrapper').querySelector(Constants.RESIZE_CELL_CLASS);
106
+ this.#resizeLinePrev = this.#$.frameContext.get('wrapper').querySelector(Constants.RESIZE_CELL_PREV_CLASS);
107
+
108
+ // select figure
109
+ if (colIndex < 0 || colIndex === this.#state.logical_cellCnt - 1) {
110
+ this._startFigureResizing(cellEdge.startX, colIndex < 0);
111
+ this.#main._editorEnable(false);
112
+ return false;
113
+ }
114
+
115
+ const col = this.#main._element.querySelector('colgroup').querySelectorAll('col')[colIndex < 0 ? 0 : colIndex];
116
+ this._startCellResizing(col, cellEdge.startX, numbers.get(_w.getComputedStyle(col).width, Constants.CELL_DECIMAL_END), cellEdge.isLeft);
117
+ this.#main._editorEnable(false);
118
+ } catch (err) {
119
+ console.warn('[SUNEDITOR.plugins.table.error]', err);
120
+ this.#main._editorEnable(true);
121
+ this.#removeGlobalEvents();
122
+ } finally {
123
+ this.#main.setState('fixedCell', null);
124
+ this.#main.setState('selectedCell', null);
125
+ this.#main.controller_table.hide();
126
+ this.#main.controller_cell.hide();
127
+ }
128
+
129
+ return false;
130
+ }
131
+
132
+ const rowEdge = CheckRowEdge(event, target);
133
+ if (rowEdge.is) {
134
+ try {
135
+ /** @type {HTMLTableRowElement} */
136
+ let row = dom.query.getParentElement(target, dom.check.isTableRow);
137
+ let rowSpan = target.rowSpan;
138
+ if (rowSpan > 1) {
139
+ while (dom.check.isTableRow(row) && rowSpan > 1) {
140
+ row = /** @type {HTMLTableRowElement} */ (row.nextElementSibling);
141
+ --rowSpan;
142
+ }
143
+ }
144
+
145
+ this.#selectionService.deleteStyleSelectedCells();
146
+ this.#main.setRowInfo(row);
147
+
148
+ // ready
149
+ this.#$.ui.enableBackWrapper('ns-resize');
150
+ this.#resizeLine ||= this.#$.frameContext.get('wrapper').querySelector(Constants.RESIZE_ROW_CLASS);
151
+ this.#resizeLinePrev = this.#$.frameContext.get('wrapper').querySelector(Constants.RESIZE_ROW_PREV_CLASS);
152
+
153
+ this._startRowResizing(row, rowEdge.startY, numbers.get(_w.getComputedStyle(row).height, Constants.CELL_DECIMAL_END));
154
+ this.#main._editorEnable(false);
155
+ } catch (err) {
156
+ console.warn('[SUNEDITOR.plugins.table.error]', err);
157
+ this.#main._editorEnable(true);
158
+ this.#removeGlobalEvents();
159
+ } finally {
160
+ this.#main.setState('fixedCell', null);
161
+ this.#main.setState('selectedCell', null);
162
+ this.#main.controller_table.hide();
163
+ this.#main.controller_cell.hide();
164
+ }
165
+
166
+ return false;
167
+ }
168
+ }
169
+
170
+ /**
171
+ * @description Converts the width of `<col>` elements to percentages.
172
+ * @param {HTMLTableElement} target - The target table element.
173
+ */
174
+ #resizePercentCol(target) {
175
+ const cols = target.querySelector('colgroup').querySelectorAll('col');
176
+ const tableTotalWidth = target.offsetWidth;
177
+
178
+ cols.forEach((col) => {
179
+ const colWidthString = col.style.width;
180
+
181
+ if (!colWidthString.endsWith('%')) {
182
+ const pixelWidth = col.offsetWidth || numbers.get(colWidthString, Constants.CELL_DECIMAL_END);
183
+ const percentage = (pixelWidth / tableTotalWidth) * 100;
184
+ col.style.width = percentage + '%';
185
+ }
186
+ });
187
+ }
188
+
189
+ /**
190
+ * @internal
191
+ * @description Starts resizing a table cell.
192
+ * @param {HTMLElement} col The column element.
193
+ * @param {number} startX The starting X position.
194
+ * @param {number} startWidth The initial width of the column.
195
+ * @param {boolean} isLeftEdge Whether the resizing is on the left edge.
196
+ */
197
+ _startCellResizing(col, startX, startWidth, isLeftEdge) {
198
+ const figureElement = this.#state.figureElement;
199
+ dom.utils.removeClass(figureElement, 'se-component-selected');
200
+
201
+ this.#resizePercentCol(this.#main._element);
202
+ this.#setResizeLinePosition(figureElement, this.#state.tdElement, this.#resizeLinePrev, isLeftEdge);
203
+ this.#resizeLinePrev.style.display = 'block';
204
+ const prevValue = col.style.width;
205
+ const nextCol = /** @type {HTMLElement} */ (col.nextElementSibling);
206
+ const nextColPrevValue = nextCol.style.width;
207
+ const realWidth = dom.utils.hasClass(this.#main._element, 'se-table-layout-fixed') ? nextColPrevValue : converter.getWidthInPercentage(nextCol || col);
208
+
209
+ if (_DragHandle.get('__dragHandler')) _DragHandle.get('__dragHandler').style.display = 'none';
210
+ this.#addResizeGlobalEvents(
211
+ this.#cellResize.bind(
212
+ this,
213
+ col,
214
+ nextCol,
215
+ figureElement,
216
+ this.#state.tdElement,
217
+ this.#resizeLine,
218
+ isLeftEdge,
219
+ startX,
220
+ startWidth,
221
+ numbers.get(prevValue, Constants.CELL_DECIMAL_END),
222
+ numbers.get(realWidth, Constants.CELL_DECIMAL_END),
223
+ this.#main._element.offsetWidth,
224
+ ),
225
+ () => {
226
+ this.#removeGlobalEvents();
227
+ this.#resizePercentCol(this.#main._element);
228
+ this.#$.history.push(true);
229
+ this.#$.component.hoverSelect(this.#main._element);
230
+ this.#main._editorEnable(true);
231
+ },
232
+ (e) => {
233
+ this._stopResize(col, prevValue, 'width', e);
234
+ this._stopResize(nextCol, nextColPrevValue, 'width', e);
235
+ },
236
+ );
237
+ }
238
+
239
+ /**
240
+ * @description Resizes a table cell.
241
+ * @param {HTMLElement} col The column element.
242
+ * @param {HTMLElement} nextCol The next column element.
243
+ * @param {HTMLElement} figure The table figure element.
244
+ * @param {HTMLElement} tdEl The table cell element.
245
+ * @param {HTMLElement} resizeLine The resize line element.
246
+ * @param {boolean} isLeftEdge Whether the resizing is on the left edge.
247
+ * @param {number} startX The starting X position.
248
+ * @param {number} startWidth The initial width of the column.
249
+ * @param {number} prevWidthPercent The previous width percentage.
250
+ * @param {number} nextColWidthPercent The next column's width percentage.
251
+ * @param {number} tableWidth The total width of the table.
252
+ * @param {MouseEvent} e The mouse event.
253
+ */
254
+ #cellResize(col, nextCol, figure, tdEl, resizeLine, isLeftEdge, startX, startWidth, prevWidthPercent, nextColWidthPercent, tableWidth, e) {
255
+ const deltaX = e.clientX - startX;
256
+ const newWidthPx = startWidth + deltaX;
257
+ const newWidthPercent = (newWidthPx / tableWidth) * 100;
258
+
259
+ if (newWidthPercent > 0) {
260
+ col.style.width = `${newWidthPercent}%`;
261
+ const delta = prevWidthPercent - newWidthPercent;
262
+ nextCol.style.width = `${nextColWidthPercent + delta}%`;
263
+ this.#setResizeLinePosition(figure, tdEl, resizeLine, isLeftEdge);
264
+ }
265
+ }
266
+
267
+ /**
268
+ * @internal
269
+ * @description Starts resizing a table row.
270
+ * @param {HTMLElement} row The table row element.
271
+ * @param {number} startY The starting Y position.
272
+ * @param {number} startHeight The initial height of the row.
273
+ */
274
+ _startRowResizing(row, startY, startHeight) {
275
+ const figureElement = this.#state.figureElement;
276
+ dom.utils.removeClass(figureElement, 'se-component-selected');
277
+
278
+ this.#setResizeRowPosition(figureElement, row, this.#resizeLinePrev);
279
+ this.#resizeLinePrev.style.display = 'block';
280
+ const prevValue = row.style.height;
281
+
282
+ if (_DragHandle.get('__dragHandler')) _DragHandle.get('__dragHandler').style.display = 'none';
283
+ this.#addResizeGlobalEvents(
284
+ this.#rowResize.bind(this, row, figureElement, this.#resizeLine, startY, startHeight),
285
+ () => {
286
+ this.#removeGlobalEvents();
287
+ this.#$.history.push(true);
288
+ this.#$.component.hoverSelect(this.#main._element);
289
+ this.#main._editorEnable(true);
290
+ },
291
+ this._stopResize.bind(this, row, prevValue, 'height'),
292
+ );
293
+ }
294
+
295
+ /**
296
+ * @description Resizes a table row.
297
+ * @param {HTMLElement} row The table row element.
298
+ * @param {HTMLElement} figure The table figure element.
299
+ * @param {HTMLElement} resizeLine The resize line element.
300
+ * @param {number} startY The starting Y position.
301
+ * @param {number} startHeight The initial height of the row.
302
+ * @param {MouseEvent} e The mouse event.
303
+ */
304
+ #rowResize(row, figure, resizeLine, startY, startHeight, e) {
305
+ const deltaY = e.clientY - startY;
306
+ const newHeightPx = startHeight + deltaY;
307
+ row.style.height = `${newHeightPx}px`;
308
+ this.#setResizeRowPosition(figure, row, resizeLine);
309
+ }
310
+
311
+ /**
312
+ * @internal
313
+ * @description Starts resizing the table figure.
314
+ * @param {number} startX The starting X position.
315
+ * @param {boolean} isLeftEdge Whether the resizing is on the left edge.
316
+ */
317
+ _startFigureResizing(startX, isLeftEdge) {
318
+ const figure = this.#state.figureElement;
319
+ dom.utils.removeClass(figure, 'se-component-selected');
320
+
321
+ this.#setResizeLinePosition(figure, figure, this.#resizeLinePrev, isLeftEdge);
322
+ this.#resizeLinePrev.style.display = 'block';
323
+ const realWidth = converter.getWidthInPercentage(figure);
324
+
325
+ if (_DragHandle.get('__dragHandler')) _DragHandle.get('__dragHandler').style.display = 'none';
326
+ this.#addResizeGlobalEvents(
327
+ this.#figureResize.bind(this, figure, this.#resizeLine, isLeftEdge, startX, figure.offsetWidth, numbers.get(realWidth, Constants.CELL_DECIMAL_END)),
328
+ () => {
329
+ this.#removeGlobalEvents();
330
+ if (numbers.get(figure.style.width, 0) > 100) figure.style.width = '100%';
331
+ this.#$.history.push(true);
332
+ this.#$.component.hoverSelect(this.#main._element);
333
+ this.#main._editorEnable(true);
334
+ },
335
+ this._stopResize.bind(this, figure, figure.style.width, 'width'),
336
+ );
337
+ }
338
+
339
+ /**
340
+ * @description Resizes the table figure.
341
+ * @param {HTMLElement} figure The table figure element.
342
+ * @param {HTMLElement} resizeLine The resize line element.
343
+ * @param {boolean} isLeftEdge Whether the resizing is on the left edge.
344
+ * @param {number} startX The starting X position.
345
+ * @param {number} startWidth The initial width of the figure.
346
+ * @param {number} constNum A constant number used for width calculation.
347
+ * @param {MouseEvent} e The mouse event.
348
+ */
349
+ #figureResize(figure, resizeLine, isLeftEdge, startX, startWidth, constNum, e) {
350
+ const deltaX = isLeftEdge ? startX - e.clientX : e.clientX - startX;
351
+ const newWidthPx = startWidth + deltaX;
352
+ const newWidthPercent = (newWidthPx / startWidth) * constNum;
353
+
354
+ if (newWidthPercent > 0) {
355
+ figure.style.width = `${newWidthPercent}%`;
356
+ this.#setResizeLinePosition(figure, figure, resizeLine, isLeftEdge);
357
+ }
358
+ }
359
+
360
+ /**
361
+ * @description Sets the resize line position.
362
+ * @param {HTMLElement} figure The table figure element.
363
+ * @param {HTMLElement} target The target element.
364
+ * @param {HTMLElement} resizeLine The resize line element.
365
+ * @param {boolean} isLeftEdge Whether the resizing is on the left edge.
366
+ */
367
+ #setResizeLinePosition(figure, target, resizeLine, isLeftEdge) {
368
+ const tdOffset = this.#$.offset.getLocal(target);
369
+ const tableOffset = this.#$.offset.getLocal(figure);
370
+ resizeLine.style.left = `${tdOffset.left + (isLeftEdge ? 0 : target.offsetWidth)}px`;
371
+ resizeLine.style.top = `${tableOffset.top}px`;
372
+ resizeLine.style.height = `${figure.offsetHeight}px`;
373
+ }
374
+
375
+ /**
376
+ * @description Sets the resize row position.
377
+ * @param {HTMLElement} figure The table figure element.
378
+ * @param {HTMLElement} target The target row element.
379
+ * @param {HTMLElement} resizeLine The resize line element.
380
+ */
381
+ #setResizeRowPosition(figure, target, resizeLine) {
382
+ const rowOffset = this.#$.offset.getLocal(target);
383
+ const tableOffset = this.#$.offset.getLocal(figure);
384
+ resizeLine.style.top = `${rowOffset.top + target.offsetHeight}px`;
385
+ resizeLine.style.left = `${tableOffset.left}px`;
386
+ resizeLine.style.width = `${figure.offsetWidth}px`;
387
+ }
388
+
389
+ /**
390
+ * @internal
391
+ * @description Stops resizing the table.
392
+ * @param {HTMLElement} target The target element.
393
+ * @param {string} prevValue The previous style value.
394
+ * @param {string} styleProp The CSS property being changed.
395
+ * @param {KeyboardEvent} e The keyboard event.
396
+ */
397
+ _stopResize(target, prevValue, styleProp, e) {
398
+ if (!keyCodeMap.isEsc(e.code)) return;
399
+ this.#removeGlobalEvents();
400
+ this.#$.component.hoverSelect(this.#main._element);
401
+ this.#main._editorEnable(true);
402
+ target.style[styleProp] = prevValue;
403
+ // figure reopen
404
+ if (styleProp === 'width') {
405
+ this.#$.component.select(this.#main._element, this.#main.constructor['key'], { isInput: true });
406
+ }
407
+ }
408
+
409
+ /**
410
+ * @description Adds global event listeners for resizing.
411
+ * @param {(...args: *) => void} resizeFn The function handling the resize event.
412
+ * @param {(...args: *) => void} stopFn The function handling the stop event.
413
+ * @param {(...args: *) => void} keyDownFn The function handling the keydown event.
414
+ */
415
+ #addResizeGlobalEvents(resizeFn, stopFn, keyDownFn) {
416
+ this.#globalEvents.resize = this.#$.eventManager.addGlobalEvent('mousemove', resizeFn, false);
417
+ this.#globalEvents.resizeStop = this.#$.eventManager.addGlobalEvent('mouseup', stopFn, false);
418
+ this.#globalEvents.resizeKeyDown = this.#$.eventManager.addGlobalEvent('keydown', keyDownFn, false);
419
+ this.#resizing = true;
420
+ }
421
+
422
+ /**
423
+ * @description Removes global event listeners and resets resize-related properties.
424
+ */
425
+ #removeGlobalEvents() {
426
+ this.#resizing = false;
427
+ this.#$.ui.disableBackWrapper();
428
+ this.#hideResizeLine();
429
+ if (this.#resizeLinePrev) {
430
+ this.#resizeLinePrev.style.display = 'none';
431
+ this.#resizeLinePrev = null;
432
+ }
433
+ const globalEvents = this.#globalEvents;
434
+ for (const k in globalEvents) {
435
+ globalEvents[k] &&= this.#$.eventManager.removeGlobalEvent(globalEvents[k]);
436
+ }
437
+
438
+ this.#resizing = false;
439
+ this.#resizeLine = null;
440
+ }
441
+
442
+ /**
443
+ * @description Hides the resize line if it is visible.
444
+ */
445
+ #hideResizeLine() {
446
+ if (this.#resizeLine) {
447
+ this.#resizeLine.style.display = 'none';
448
+ this.#resizeLine = null;
449
+ }
450
+ if (this.#main._element) {
451
+ this.#main._element.style.cursor = '';
452
+ }
453
+ }
454
+
455
+ /**
456
+ * @description Initialize the resize service (remove global events).
457
+ */
458
+ init() {
459
+ this.#removeGlobalEvents();
460
+ }
461
+ }
462
+
463
+ export default TableResizeService;