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,131 @@
1
+ import { dom } from '../../../../helper';
2
+ import { Modal } from '../../../../modules/contract';
3
+
4
+ /**
5
+ * @typedef {object} ModalReturns_video
6
+ * @property {HTMLElement} html
7
+ * @property {HTMLElement} alignForm
8
+ * @property {HTMLElement} fileModalWrapper
9
+ * @property {HTMLInputElement} videoInputFile
10
+ * @property {HTMLInputElement} videoUrlFile
11
+ * @property {HTMLElement} previewSrc
12
+ * @property {HTMLButtonElement} galleryButton
13
+ * @property {HTMLInputElement} proportion
14
+ * @property {HTMLSelectElement} frameRatioOption
15
+ * @property {HTMLInputElement} inputX
16
+ * @property {HTMLInputElement} inputY
17
+ * @property {HTMLButtonElement} revertBtn
18
+ * @property {HTMLButtonElement} fileRemoveBtn
19
+ *
20
+ * @param {SunEditor.Deps} $
21
+ * @param {*} pluginOptions
22
+ * @returns {ModalReturns_video}
23
+ */
24
+ export function CreateHTML_modal({ lang, icons, plugins }, pluginOptions) {
25
+ let html = /*html*/ `
26
+ <form method="post" enctype="multipart/form-data">
27
+ <div class="se-modal-header">
28
+ <button type="button" data-command="close" class="se-btn se-close-btn" title="${lang.close}" aria-label="${lang.close}">
29
+ ${icons.cancel}
30
+ </button>
31
+ <span class="se-modal-title">${lang.video_modal_title}</span>
32
+ </div>
33
+ <div class="se-modal-body">`;
34
+
35
+ if (pluginOptions.createFileInput) {
36
+ html += /*html*/ `
37
+ <div class="se-modal-form">
38
+ <label>${lang.video_modal_file}</label>
39
+ ${Modal.CreateFileInput({ lang, icons }, pluginOptions)}
40
+ </div>`;
41
+ }
42
+
43
+ if (pluginOptions.createUrlInput) {
44
+ html += /*html*/ `
45
+ <div class="se-modal-form">
46
+ <label>${lang.video_modal_url}</label>
47
+ <div class="se-modal-form-files">
48
+ <input class="se-input-form se-input-url" type="text" data-focus />
49
+ ${
50
+ plugins.videoGallery
51
+ ? `<button type="button" class="se-btn se-tooltip se-modal-files-edge-button __se__gallery" aria-label="${lang.videoGallery}">
52
+ ${icons.video_gallery}
53
+ ${dom.utils.createTooltipInner(lang.videoGallery)}
54
+ </button>`
55
+ : ''
56
+ }
57
+ </div>
58
+ <pre class="se-link-preview"></pre>
59
+ </div>`;
60
+ }
61
+
62
+ if (pluginOptions.canResize) {
63
+ const ratioList = pluginOptions.ratioOptions || [
64
+ { name: '16:9', value: 0.5625 },
65
+ { name: '4:3', value: 0.75 },
66
+ { name: '21:9', value: 0.4285 },
67
+ { name: '9:16', value: 1.78 },
68
+ ];
69
+ const ratio = pluginOptions.defaultRatio;
70
+ const onlyPercentage = pluginOptions.percentageOnlySize;
71
+ const onlyPercentDisplay = onlyPercentage ? ' style="display: none !important;"' : '';
72
+ const heightDisplay = !pluginOptions.showHeightInput ? ' style="display: none !important;"' : '';
73
+ const ratioDisplay = !pluginOptions.showRatioOption ? ' style="display: none !important;"' : '';
74
+ const onlyWidthDisplay = !onlyPercentage && !pluginOptions.showHeightInput && !pluginOptions.showRatioOption ? ' style="display: none !important;"' : '';
75
+ html += /*html*/ `
76
+ <div class="se-modal-form">
77
+ <div class="se-modal-size-text">
78
+ <label class="size-w">${lang.width}</label>
79
+ <label class="se-modal-size-x">&nbsp;</label>
80
+ <label class="size-h"${heightDisplay}>${lang.height}</label>
81
+ <label class="size-h"${ratioDisplay}>(${lang.ratio})</label>
82
+ </div>
83
+ <input class="se-input-control _se_size_x" placeholder="100%"${onlyPercentage ? ' type="number" min="1"' : 'type="text"'}${onlyPercentage ? ' max="100"' : ''}/>
84
+ <label class="se-modal-size-x"${onlyWidthDisplay}>${onlyPercentage ? '%' : 'x'}</label>
85
+ <input class="se-input-control _se_size_y" placeholder="${pluginOptions.defaultRatio * 100}%"
86
+ ${onlyPercentage ? ' type="number" min="1"' : 'type="text"'}${onlyPercentage ? ' max="100"' : ''}${heightDisplay}/>
87
+ <select class="se-input-select se-modal-ratio" title="${lang.ratio}" aria-label="${lang.ratio}"${ratioDisplay}>
88
+ ${!heightDisplay ? '<option value=""> - </option>' : ''}
89
+ ${ratioList.map((ratioOption) => `<option value="${ratioOption.value}"${ratio.toString() === ratioOption.value.toString() ? ' selected' : ''}>${ratioOption.name}</option>`).join('')}
90
+ </select>
91
+ <button type="button" title="${lang.revert}" aria-label="${lang.revert}" class="se-btn se-modal-btn-revert">${icons.revert}</button>
92
+ </div>
93
+ <div class="se-modal-form se-modal-form-footer"${onlyPercentDisplay}${onlyWidthDisplay}>
94
+ <label>
95
+ <input type="checkbox" class="se-modal-btn-check _se_check_proportion" />&nbsp;
96
+ <span>${lang.proportion}</span>
97
+ </label>
98
+ </div>`;
99
+ }
100
+
101
+ html += /*html*/ `
102
+ </div>
103
+ <div class="se-modal-footer">
104
+ <div class="se-figure-align">
105
+ <label><input type="radio" name="suneditor_video_radio" class="se-modal-btn-radio" value="none" checked>${lang.basic}</label>
106
+ <label><input type="radio" name="suneditor_video_radio" class="se-modal-btn-radio" value="left">${lang.left}</label>
107
+ <label><input type="radio" name="suneditor_video_radio" class="se-modal-btn-radio" value="center">${lang.center}</label>
108
+ <label><input type="radio" name="suneditor_video_radio" class="se-modal-btn-radio" value="right">${lang.right}</label>
109
+ </div>
110
+ <button type="submit" class="se-btn-primary" title="${lang.submitButton}" aria-label="${lang.submitButton}"><span>${lang.submitButton}</span></button>
111
+ </div>
112
+ </form>`;
113
+
114
+ const content = dom.utils.createElement('DIV', { class: 'se-modal-content' }, html);
115
+
116
+ return {
117
+ html: content,
118
+ alignForm: content.querySelector('.se-figure-align'),
119
+ fileModalWrapper: content.querySelector('.se-flex-input-wrapper'),
120
+ videoInputFile: content.querySelector('.__se__file_input'),
121
+ videoUrlFile: content.querySelector('.se-input-url'),
122
+ previewSrc: content.querySelector('.se-link-preview'),
123
+ galleryButton: content.querySelector('.__se__gallery'),
124
+ proportion: content.querySelector('._se_check_proportion'),
125
+ frameRatioOption: content.querySelector('.se-modal-ratio'),
126
+ inputX: content.querySelector('._se_size_x'),
127
+ inputY: content.querySelector('._se_size_y'),
128
+ revertBtn: content.querySelector('.se-modal-btn-revert'),
129
+ fileRemoveBtn: content.querySelector('.se-file-remove'),
130
+ };
131
+ }
@@ -0,0 +1,281 @@
1
+ import { keyCodeMap, numbers, dom } from '../../../../helper';
2
+ import { Figure } from '../../../../modules/contract';
3
+
4
+ /**
5
+ * @class VideoSizeService
6
+ * @description Handles video size operations including ratio management and size input controls.
7
+ */
8
+ export class VideoSizeService {
9
+ #main;
10
+ #$;
11
+ #state;
12
+ #pluginOptions;
13
+ #resizing;
14
+
15
+ #frameRatio;
16
+ #defaultSizeX;
17
+ #defaultSizeY;
18
+ #origin_w;
19
+ #origin_h;
20
+
21
+ #ratio = { w: 0, h: 0 };
22
+ #proportion = null;
23
+ #inputX = null;
24
+ #inputY = null;
25
+ #initRatioValue = null;
26
+
27
+ /**
28
+ * @param {import('../index').default} main - The main Video plugin instance.
29
+ * @param {import('../render/video.html').ModalReturns_video} modalEl - Modal element
30
+ */
31
+ constructor(main, modalEl) {
32
+ this.#main = main;
33
+ this.#$ = main.$;
34
+ this.#state = main.state;
35
+ this.#pluginOptions = main.pluginOptions;
36
+ this.#resizing = this.#pluginOptions.canResize;
37
+
38
+ this.#frameRatio = this.#state.defaultRatio;
39
+ this.#defaultSizeX = '100%';
40
+ this.#defaultSizeY = this.#pluginOptions.defaultRatio * 100 + '%';
41
+ this.#origin_w = this.#pluginOptions.defaultWidth === '100%' ? '' : this.#pluginOptions.defaultWidth;
42
+ this.#origin_h = this.#pluginOptions.defaultHeight === this.#state.defaultRatio ? '' : this.#pluginOptions.defaultHeight;
43
+
44
+ if (this.#resizing) {
45
+ this.#proportion = modalEl.proportion;
46
+ this.frameRatioOption = modalEl.frameRatioOption;
47
+ this.#inputX = modalEl.inputX;
48
+ this.#inputY = modalEl.inputY;
49
+ this.#inputX.value = this.#pluginOptions.defaultWidth;
50
+ this.#inputY.value = this.#pluginOptions.defaultHeight;
51
+
52
+ const ratioChange = this.#OnChangeRatio.bind(this);
53
+ this.#$.eventManager.addEvent(this.#inputX, 'keyup', this.#OnInputSize.bind(this, 'x'));
54
+ this.#$.eventManager.addEvent(this.#inputY, 'keyup', this.#OnInputSize.bind(this, 'y'));
55
+ this.#$.eventManager.addEvent(this.#inputX, 'change', ratioChange);
56
+ this.#$.eventManager.addEvent(this.#inputY, 'change', ratioChange);
57
+ this.#$.eventManager.addEvent(this.#proportion, 'change', ratioChange);
58
+ this.#$.eventManager.addEvent(this.frameRatioOption, 'change', this.#SetRatio.bind(this));
59
+ this.#$.eventManager.addEvent(modalEl.revertBtn, 'click', this.#OnClickRevert.bind(this));
60
+ }
61
+ }
62
+
63
+ /**
64
+ * @description Sets the width and height input values.
65
+ * @param {string} w - Width value
66
+ * @param {string} h - Height value
67
+ */
68
+ setInputSize(w, h) {
69
+ this.#inputX.value = w === this.#defaultSizeX ? '' : w;
70
+
71
+ if (this.#state.onlyPercentage) return;
72
+ this.#inputY.value = h === this.#defaultSizeY ? '' : h;
73
+ }
74
+
75
+ /**
76
+ * @description Gets the current width and height input values.
77
+ * @returns {{w: string, h: string}}
78
+ */
79
+ getInputSize() {
80
+ return {
81
+ w: this.#inputX?.value || '',
82
+ h: this.#inputY?.value || '',
83
+ };
84
+ }
85
+
86
+ /**
87
+ * @description Sets the original width and height of the video.
88
+ * @param {string} w - Original width
89
+ * @param {string} h - Original height
90
+ */
91
+ setOriginSize(w, h) {
92
+ this.#origin_w = w;
93
+ this.#origin_h = h;
94
+ }
95
+
96
+ /**
97
+ * @description Sets the size of the video element.
98
+ * @param {string|number} w - The width of the video.
99
+ * @param {string|number} h - The height of the video.
100
+ */
101
+ applySize(w, h) {
102
+ w ||= this.#inputX?.value || this.#pluginOptions.defaultWidth;
103
+ h ||= this.#inputY?.value || this.#pluginOptions.defaultHeight;
104
+
105
+ if (this.#state.onlyPercentage) {
106
+ if (!w) w = '100%';
107
+ else if (!/%$/.test(w + '')) w += '%';
108
+ }
109
+ this.#main.figure.setSize(w, h);
110
+ }
111
+
112
+ /**
113
+ * @description Resolves the final size of the video element, checking if it has changed from the current size.
114
+ * @param {string} width - Desired width
115
+ * @param {string} height - Desired height
116
+ * @param {HTMLElement} oFrame - The video/iframe element
117
+ * @param {boolean} isUpdate - Whether we are updating an existing component
118
+ * @returns {{width: string, height: string, isChanged: boolean}} Resolved size info
119
+ */
120
+
121
+ resolveSize(width, height, oFrame, isUpdate) {
122
+ width ||= this.#defaultSizeX;
123
+ height ||= this.#frameRatio;
124
+
125
+ const size = this.#main.figure.getSize(oFrame);
126
+ const inputUpdate = size.w !== width || size.h !== height;
127
+ const isChanged = !isUpdate || inputUpdate;
128
+
129
+ // set size
130
+ if (isChanged) {
131
+ if (this.#initRatioValue !== this.frameRatioOption?.value) this.#main.figure.deleteTransform();
132
+ this.applySize(width, height);
133
+ }
134
+
135
+ return { width, height, isChanged };
136
+ }
137
+
138
+ /**
139
+ * @description Called when the modal is opened. Initializes inputs and ratio options.
140
+ * @param {boolean} isUpdate - Indicates whether the modal is for editing an existing component (`true`) or registering a new one (`false`).
141
+ */
142
+ on(isUpdate) {
143
+ if (!this.#resizing) return;
144
+
145
+ if (!isUpdate) {
146
+ const x = this.#pluginOptions.defaultWidth;
147
+ const y = this.#pluginOptions.defaultHeight;
148
+ this.setInputSize(x, y);
149
+ this.setOriginSize(x, y);
150
+ this.#proportion.disabled = true;
151
+ }
152
+
153
+ this.#setRatioSelect(this.#main.figure.isVertical ? '' : this.#origin_h || this.#state.defaultRatio);
154
+ this.#initRatioValue = this.frameRatioOption?.value;
155
+ }
156
+
157
+ /**
158
+ * @description Prepares the size inputs and options when a video component is selected.
159
+ * @param {import('../../../../modules/contract/Figure').FigureTargetInfo} figureInfo - Figure size information
160
+ * @param {HTMLElement} target - The selected video/iframe element
161
+ */
162
+ ready(figureInfo, target) {
163
+ const { dw, dh } = this.#main.figure.getSize(target);
164
+ this.setInputSize(dw, dh);
165
+
166
+ const h = figureInfo.height || figureInfo.h || this.#origin_h || '';
167
+ if (!this.#setRatioSelect(h)) this.#inputY.value = String(this.#state.onlyPercentage ? numbers.get(h, 2) : h);
168
+
169
+ const percentageRotation = this.#state.onlyPercentage && this.#main.figure.isVertical;
170
+ this.#inputX.disabled = percentageRotation;
171
+ this.#inputY.disabled = percentageRotation;
172
+ this.#proportion.checked = !figureInfo.isVertical;
173
+ this.#proportion.disabled = percentageRotation;
174
+
175
+ this.#ratio = this.#proportion.checked ? figureInfo.ratio : { w: 0, h: 0 };
176
+ }
177
+
178
+ /**
179
+ * @description Initializes the size service state.
180
+ */
181
+ init() {
182
+ this.#ratio = { w: 0, h: 0 };
183
+
184
+ if (!this.#resizing) return;
185
+
186
+ this.setInputSize(this.#pluginOptions.defaultWidth, this.#pluginOptions.defaultHeight);
187
+ this.#proportion.checked = false;
188
+ this.#proportion.disabled = true;
189
+ this.#setRatioSelect(this.#state.defaultRatio);
190
+ }
191
+
192
+ /**
193
+ * @description Reverts the size inputs to the original video size.
194
+ */
195
+ #OnClickRevert() {
196
+ if (this.#state.onlyPercentage) {
197
+ this.#inputX.value = Number(this.#origin_w) > 100 ? '100' : this.#origin_w;
198
+ } else {
199
+ this.#inputX.value = this.#origin_w;
200
+ this.#inputY.value = this.#origin_h;
201
+ }
202
+ }
203
+
204
+ /**
205
+ * @description Selects a ratio option in the ratio dropdown.
206
+ * @param {string|number} value - The selected ratio value.
207
+ * @returns {boolean} Returns `true` if a ratio was selected.
208
+ */
209
+ #setRatioSelect(value) {
210
+ if (!this.frameRatioOption) return;
211
+
212
+ let ratioSelected = false;
213
+ const ratioOption = this.frameRatioOption.options;
214
+
215
+ if (/%$/.test(value + '') || this.#state.onlyPercentage) value = numbers.get(value, 2) / 100 + '';
216
+ else if (!numbers.is(value) || Number(value) >= 1) value = '';
217
+
218
+ this.#inputY.placeholder = '';
219
+ for (let i = 0, len = ratioOption.length; i < len; i++) {
220
+ if (ratioOption[i].value === value) {
221
+ ratioSelected = ratioOption[i].selected = true;
222
+ this.#inputY.placeholder = !value ? '' : Number(value) * 100 + '%';
223
+ } else {
224
+ ratioOption[i].selected = false;
225
+ }
226
+ }
227
+
228
+ return ratioSelected;
229
+ }
230
+
231
+ /**
232
+ * @description Handles the ratio selection change event.
233
+ * @param {InputEvent} e - Event object
234
+ */
235
+ #SetRatio(e) {
236
+ /** @type {HTMLSelectElement} */
237
+ const eventTarget = dom.query.getEventTarget(e);
238
+ const value = eventTarget.options[eventTarget.selectedIndex].value;
239
+ this.#defaultSizeY = this.#main.figure.autoRatio.current = this.#frameRatio = !value ? this.#defaultSizeY : Number(value) * 100 + '%';
240
+ this.#inputY.placeholder = !value ? '' : Number(value) * 100 + '%';
241
+ this.#inputY.value = '';
242
+ }
243
+
244
+ /**
245
+ * @description Updates the ratio based on current input values.
246
+ */
247
+ #OnChangeRatio() {
248
+ this.#ratio = this.#proportion.checked ? Figure.GetRatio(this.#inputX.value, this.#inputY.value, this.#state.sizeUnit) : { w: 0, h: 0 };
249
+ }
250
+
251
+ /**
252
+ * @description Handles keyup events on size inputs to calculate proportion or update ratio selection.
253
+ * @param {'x'|'y'} xy - Axis (`'x'` for width, `'y'` for height)
254
+ * @param {KeyboardEvent} e - Event object
255
+ */
256
+ #OnInputSize(xy, e) {
257
+ if (keyCodeMap.isSpace(e.code)) {
258
+ e.preventDefault();
259
+ return;
260
+ }
261
+
262
+ /** @type {HTMLInputElement} */
263
+ const eventTarget = dom.query.getEventTarget(e);
264
+ if (xy === 'x' && this.#state.onlyPercentage && Number(eventTarget.value) > 100) {
265
+ eventTarget.value = '100';
266
+ } else if (this.#proportion.checked && !this.frameRatioOption?.value) {
267
+ const ratioSize = Figure.CalcRatio(this.#inputX.value, this.#inputY.value, this.#state.sizeUnit, this.#ratio);
268
+ if (xy === 'x') {
269
+ this.#inputY.value = String(ratioSize.h);
270
+ } else {
271
+ this.#inputX.value = String(ratioSize.w);
272
+ }
273
+ }
274
+
275
+ if (xy === 'y') {
276
+ this.#setRatioSelect(eventTarget.value || this.#state.defaultRatio);
277
+ }
278
+ }
279
+ }
280
+
281
+ export default VideoSizeService;
@@ -0,0 +1,92 @@
1
+ import { env } from '../../../../helper';
2
+ const { NO_EVENT } = env;
3
+
4
+ /**
5
+ * @class VideoUploadService
6
+ * @description Handles video upload operations including server upload and registration.
7
+ */
8
+ export class VideoUploadService {
9
+ #main;
10
+ #$;
11
+ #pluginOptions;
12
+
13
+ /**
14
+ * @param {import('../index').default} main - The main Video plugin instance.
15
+ */
16
+ constructor(main) {
17
+ this.#main = main;
18
+ this.#$ = main.$;
19
+ this.#pluginOptions = main.pluginOptions;
20
+ }
21
+
22
+ /**
23
+ * @description Uploads a video to the server using an external upload handler.
24
+ * @param {SunEditor.EventParams.VideoInfo} info - Video information object.
25
+ * @param {FileList} files - The video files to upload.
26
+ */
27
+ serverUpload(info, files) {
28
+ if (!files) return;
29
+
30
+ const videoUploadUrl = this.#pluginOptions.uploadUrl;
31
+ if (typeof videoUploadUrl === 'string' && videoUploadUrl.length > 0) {
32
+ this.#main.fileManager.upload(videoUploadUrl, this.#pluginOptions.uploadHeaders, files, this.#UploadCallBack.bind(this, info), this.#error.bind(this));
33
+ }
34
+ }
35
+
36
+ /**
37
+ * @description Registers the uploaded video in the editor.
38
+ * @param {SunEditor.EventParams.VideoInfo} info - Video information object.
39
+ * @param {Object<string, *>} response - Server response containing video data.
40
+ */
41
+ #register(info, response) {
42
+ const fileList = response.result;
43
+ const videoTag = this.#main.createVideoTag();
44
+
45
+ for (let i = 0, len = fileList.length; i < len; i++) {
46
+ const ctag = info.isUpdate ? info.element : /** @type {HTMLIFrameElement|HTMLVideoElement} */ (videoTag.cloneNode(false));
47
+ this.#main.create(
48
+ ctag,
49
+ fileList[i].url,
50
+ info.inputWidth,
51
+ info.inputHeight,
52
+ info.align,
53
+ info.isUpdate,
54
+ {
55
+ name: fileList[i].name,
56
+ size: fileList[i].size,
57
+ },
58
+ i === len - 1,
59
+ );
60
+ }
61
+ }
62
+
63
+ /**
64
+ * @description Handles video upload errors.
65
+ * @param {Object<string, *>} response - The error response object.
66
+ * @returns {Promise<void>}
67
+ */
68
+ async #error(response) {
69
+ const message = await this.#$.eventManager.triggerEvent('onVideoUploadError', { error: response });
70
+ const err = message === NO_EVENT ? response.errorMessage : message || response.errorMessage;
71
+ this.#$.ui.alertOpen(err, 'error');
72
+ console.error('[SUNEDITOR.plugin.video.error]', message);
73
+ }
74
+
75
+ /**
76
+ * @description Handles the callback function for video upload completion.
77
+ * @param {SunEditor.EventParams.VideoInfo} info - Video information.
78
+ * @param {XMLHttpRequest} xmlHttp - The XMLHttpRequest object.
79
+ */
80
+ async #UploadCallBack(info, xmlHttp) {
81
+ if ((await this.#$.eventManager.triggerEvent('videoUploadHandler', { xmlHttp, info })) === NO_EVENT) {
82
+ const response = JSON.parse(xmlHttp.responseText);
83
+ if (response.errorMessage) {
84
+ this.#error(response);
85
+ } else {
86
+ this.#register(info, response);
87
+ }
88
+ }
89
+ }
90
+ }
91
+
92
+ export default VideoUploadService;