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,357 @@
1
+ import { dom, env, keyCodeMap } from '../../helper';
2
+
3
+ const { _w } = env;
4
+ const DIRECTION_CURSOR_MAP = { w: 'ns-resize', h: 'ew-resize', c: 'nwse-resize', wRTL: 'ns-resize', hRTL: 'ew-resize', cRTL: 'nesw-resize' };
5
+
6
+ /**
7
+ * @class
8
+ * @description Modal window module
9
+ */
10
+ class Modal {
11
+ #$;
12
+
13
+ /** @type {HTMLElement} */
14
+ #modalArea;
15
+ /** @type {HTMLElement} */
16
+ #modalInner;
17
+ /** @type {HTMLElement} */
18
+ #resizeBody;
19
+ #closeListener;
20
+ #globalEventHandlers;
21
+
22
+ #bindClose = null;
23
+ #hasNoCloseButton = false;
24
+ #bindCloseClick = null;
25
+ #currentHandle = null;
26
+ #resizeDir = '';
27
+ #offetTop = 0;
28
+ #offetLeft = 0;
29
+ #bindClose_mousemove = null;
30
+ #bindClose_mouseup = null;
31
+
32
+ /**
33
+ * @description Modal window module
34
+ * @param {*} inst The instance object that called the constructor.
35
+ * @param {SunEditor.Deps} $ Kernel dependencies
36
+ * @param {Element} element Modal element
37
+ */
38
+ constructor(inst, $, element) {
39
+ this.#$ = $;
40
+
41
+ // members
42
+ this.inst = inst;
43
+ this.kind = inst.constructor.key || inst.constructor.name;
44
+ this.form = /** @type {HTMLElement} */ (element);
45
+ this.isUpdate = false;
46
+
47
+ /** @type {HTMLInputElement} */
48
+ this.focusElement = element.querySelector('[data-focus]');
49
+
50
+ this.#modalArea = this.#$.contextProvider.carrierWrapper.querySelector('.se-modal');
51
+ this.#modalInner = this.#$.contextProvider.carrierWrapper.querySelector('.se-modal .se-modal-inner');
52
+ this.#closeListener = [this.#CloseListener.bind(this), this.#OnClick_dialog.bind(this)];
53
+
54
+ // add element
55
+ this.#modalInner.appendChild(element);
56
+
57
+ // init
58
+ this.#$.eventManager.addEvent(element.querySelector('form'), 'submit', this.#Action.bind(this));
59
+ this.#hasNoCloseButton = !this.#$.eventManager.addEvent(element.querySelector('[data-command="close"]'), 'click', this.close.bind(this));
60
+
61
+ // resize
62
+ if (element.querySelector('.se-modal-resize-handle-w') || element.querySelector('.se-modal-resize-handle-h') || element.querySelector('.se-modal-resize-handle-c') || element.querySelector('.se-modal-resize-form')) {
63
+ if (!(this.#resizeBody = element.querySelector('.se-modal-resize-form')) && (this.#resizeBody = element.querySelector('.se-modal-body'))) {
64
+ this.#$.eventManager.addEvent(element.querySelector('.se-modal-resize-handle-w'), 'mousedown', this.#OnResizeMouseDown.bind(this, 'w'));
65
+ this.#$.eventManager.addEvent(element.querySelector('.se-modal-resize-handle-h'), 'mousedown', this.#OnResizeMouseDown.bind(this, 'h'));
66
+ this.#$.eventManager.addEvent(element.querySelector('.se-modal-resize-handle-c'), 'mousedown', this.#OnResizeMouseDown.bind(this, 'c'));
67
+
68
+ this.#globalEventHandlers = {
69
+ mousemove: this.#OnResize.bind(this),
70
+ mouseup: this.#OnResizeMouseUp.bind(this),
71
+ };
72
+ }
73
+ }
74
+ }
75
+
76
+ /**
77
+ * @description Create a file input tag in the modal window.
78
+ * @param {{icons: SunEditor.Deps['icons'], lang: SunEditor.Deps['lang']}} param0 - icons and language object
79
+ * @param {{acceptedFormats?: string, allowMultiple?: boolean}} param1 - options
80
+ * - acceptedFormats: `"image/*, video/*, audio/*"`, etc.
81
+ * - allowMultiple: `true` or `false`
82
+ * @returns {string} HTML string
83
+ */
84
+ static CreateFileInput({ icons, lang }, { acceptedFormats, allowMultiple }) {
85
+ return /*html*/ `
86
+ <div class="se-modal-form-files">
87
+ <div class="se-flex-input-wrapper">
88
+ <div class="se-input-form-abs">
89
+ <div>
90
+ <div class="se-input-file-w">
91
+ <div class="se-input-file-icon-up">${icons.upload_tray}</div>
92
+ <div class="se-input-file-icon-files">${icons.file_plus}</div>
93
+ <span class="se-input-file-cnt"></span>
94
+ </div>
95
+ </div>
96
+ </div>
97
+ <input class="se-input-form __se__file_input" data-focus type="file" accept="${acceptedFormats}"${allowMultiple ? ' multiple="multiple"' : ''}/>
98
+ </div>
99
+ <button type="button" class="se-btn se-modal-files-edge-button se-file-remove se-tooltip" aria-label="${lang.remove}">
100
+ ${icons.selection_remove}
101
+ ${dom.utils.createTooltipInner(lang.remove)}
102
+ </button>
103
+ </div>`;
104
+ }
105
+
106
+ /**
107
+ * @description A function called when the contents of `input` have changed and you want to adjust the style.
108
+ * @param {Element} wrapper - Modal file input wrapper(`.se-flex-input-wrapper`)
109
+ * @param {FileList|File[]} files - FileList object
110
+ */
111
+ static OnChangeFile(wrapper, files) {
112
+ if (!wrapper || !files) return;
113
+
114
+ const fileCnt = /** @type {HTMLElement} */ (wrapper.querySelector('.se-input-file-cnt'));
115
+ const fileUp = /** @type {HTMLElement} */ (wrapper.querySelector('.se-input-file-icon-up'));
116
+ const fileSelected = /** @type {HTMLElement} */ (wrapper.querySelector('.se-input-file-icon-files'));
117
+
118
+ if (files.length > 1) {
119
+ fileUp.style.display = 'none';
120
+ fileSelected.style.display = 'inline-block';
121
+ fileCnt.style.display = '';
122
+ fileCnt.textContent = ` ..${files.length}`;
123
+ } else if (files.length > 0) {
124
+ fileUp.style.display = 'none';
125
+ fileSelected.style.display = 'none';
126
+ fileCnt.style.display = 'block';
127
+ fileCnt.textContent = files[0].name;
128
+ } else {
129
+ fileUp.style.display = 'inline-block';
130
+ fileSelected.style.display = 'none';
131
+ fileCnt.style.display = '';
132
+ fileCnt.textContent = '';
133
+ }
134
+ }
135
+
136
+ /**
137
+ * @description Open a modal plugin
138
+ * - The plugin's `init` method is called.
139
+ */
140
+ open() {
141
+ this.#$.ui.offCurrentModal();
142
+ this.#fixCurrentController(true);
143
+
144
+ if (this.#hasNoCloseButton) {
145
+ if (this.#bindCloseClick) this.#$.eventManager.removeEvent(this.#bindCloseClick);
146
+ this.#bindCloseClick = this.#$.eventManager.addEvent(this.#modalInner, 'click', this.#closeListener[1]);
147
+ }
148
+
149
+ this.#bindClose &&= this.#$.eventManager.removeGlobalEvent(this.#bindClose);
150
+ this.#bindClose = this.#$.eventManager.addGlobalEvent('keydown', this.#closeListener[0]);
151
+ this.isUpdate = this.kind === this.#$.ui.currentControllerName;
152
+ this.#$.ui.opendModal = this;
153
+
154
+ if (!this.isUpdate) this.inst.modalInit?.();
155
+ this.inst.modalOn?.(this.isUpdate);
156
+
157
+ dom.utils.addClass(this.#modalArea, 'se-backdrop-show');
158
+ dom.utils.addClass(this.form, 'se-modal-show');
159
+
160
+ if (this.#resizeBody) {
161
+ const offset = this.#saveOffset();
162
+ const { maxWidth, maxHeight } = _w.getComputedStyle(this.form);
163
+ const mw = `${this.form.offsetWidth - offset.width}px`;
164
+ const mh = `${this.form.offsetTop + (this.form.offsetHeight - this.#resizeBody.offsetHeight)}px`;
165
+ // set max
166
+ if (maxWidth && typeof this.#resizeDir === 'string') dom.utils.setStyle(this.#resizeBody, 'max-width', `calc(${maxWidth} - ${mw})`);
167
+ if (maxHeight) dom.utils.setStyle(this.#resizeBody, 'max-height', `calc(${maxHeight} - ${mh})`);
168
+ }
169
+
170
+ if (this.focusElement) this.focusElement.focus();
171
+ }
172
+
173
+ /**
174
+ * @description Close a modal plugin
175
+ * - The plugin's `init` and `modalOff` method is called.
176
+ */
177
+ close() {
178
+ this.#removeGlobalEvent();
179
+ this.#fixCurrentController(false);
180
+ _w.setTimeout(() => {
181
+ this.#$.ui.opendModal = null;
182
+ }, 0);
183
+
184
+ if (this.#hasNoCloseButton) {
185
+ if (this.#bindCloseClick) {
186
+ this.#$.eventManager.removeEvent(this.#bindCloseClick);
187
+ this.#bindCloseClick = null;
188
+ }
189
+ }
190
+
191
+ this.#bindClose &&= this.#$.eventManager.removeGlobalEvent(this.#bindClose);
192
+
193
+ // close
194
+ dom.utils.removeClass(this.#modalArea, 'se-backdrop-show');
195
+ dom.utils.removeClass(this.form, 'se-modal-show');
196
+
197
+ this.inst.modalInit?.();
198
+ this.inst.modalOff?.(this.isUpdate);
199
+
200
+ if (!this.isUpdate) this.#$.focusManager.focus();
201
+ }
202
+
203
+ /**
204
+ * @description Fixes the current controller's display state when the modal is opened or closed.
205
+ * @param {boolean} fixed - Whether to fix or unfix the controller.
206
+ */
207
+ #fixCurrentController(fixed) {
208
+ const cont = this.#$.ui.opendControllers;
209
+ for (let i = 0; i < cont.length; i++) {
210
+ cont[i].fixed = fixed;
211
+ cont[i].form.style.display = fixed ? 'none' : 'block';
212
+ }
213
+ }
214
+
215
+ /**
216
+ * @description Saves the current offset position of the modal for resizing calculations.
217
+ * @returns {import('../../core/logic/dom/offset').OffsetGlobalInfo} The offset position of the modal.
218
+ */
219
+ #saveOffset() {
220
+ const offset = this.#$.offset.getGlobal(this.#resizeBody);
221
+ this.#offetTop = offset.top;
222
+ this.#offetLeft = offset.left;
223
+ return offset;
224
+ }
225
+
226
+ /**
227
+ * @description Adds global event listeners for resizing the modal.
228
+ * @param {string} dir - The direction in which resizing is occurring.
229
+ */
230
+ #addGlobalEvent(dir) {
231
+ this.#removeGlobalEvent();
232
+ this.#$.ui.enableBackWrapper(DIRECTION_CURSOR_MAP[dir]);
233
+ this.#bindClose_mousemove = this.#$.eventManager.addGlobalEvent('mousemove', this.#globalEventHandlers.mousemove, true);
234
+ this.#bindClose_mouseup = this.#$.eventManager.addGlobalEvent('mouseup', this.#globalEventHandlers.mouseup, true);
235
+ }
236
+
237
+ /**
238
+ * @description Removes global event listeners related to modal resizing.
239
+ */
240
+ #removeGlobalEvent() {
241
+ this.#$.ui.disableBackWrapper();
242
+ this.#bindClose_mousemove &&= this.#$.eventManager.removeGlobalEvent(this.#bindClose_mousemove);
243
+ this.#bindClose_mouseup &&= this.#$.eventManager.removeGlobalEvent(this.#bindClose_mouseup);
244
+ }
245
+
246
+ /**
247
+ * The loading bar is executed before `modalAction` is executed.
248
+ * return type -
249
+ * `true` : the loading bar and modal window are closed.
250
+ * `false` : only the loading bar is closed.
251
+ * `undefined` : only the modal window is closed.
252
+ * -
253
+ * exception occurs : the modal window and loading bar are closed.
254
+ * @param {SubmitEvent} e - Event object
255
+ */
256
+ async #Action(e) {
257
+ e.preventDefault();
258
+ e.stopPropagation();
259
+
260
+ this.#$.ui.showLoading();
261
+
262
+ try {
263
+ const result = await this.inst.modalAction();
264
+ if (result === false) {
265
+ this.#$.ui.hideLoading();
266
+ } else if (result === undefined) {
267
+ this.close();
268
+ } else {
269
+ this.close();
270
+ this.#$.ui.hideLoading();
271
+ }
272
+ } catch (error) {
273
+ this.close();
274
+ this.#$.ui.hideLoading();
275
+ throw Error(`[SUNEDITOR.Modal[${this.kind}].warn] ${error.message}`);
276
+ }
277
+ }
278
+
279
+ /**
280
+ * @param {MouseEvent} e - Event object
281
+ */
282
+ #OnClick_dialog(e) {
283
+ const eventTarget = dom.query.getEventTarget(e);
284
+ if (/close/.test(eventTarget.getAttribute('data-command')) || eventTarget === this.#modalInner) {
285
+ this.close();
286
+ }
287
+ }
288
+
289
+ /**
290
+ * @param {KeyboardEvent} e - Event object
291
+ */
292
+ #CloseListener(e) {
293
+ if (!keyCodeMap.isEsc(e.code)) return;
294
+ this.close();
295
+ }
296
+
297
+ /** ---------- Resize events ---------- */
298
+ /**
299
+ * @param {string} dir - The direction in which the resize handle is located.
300
+ * @param {MouseEvent} e - Event object
301
+ */
302
+ #OnResizeMouseDown(dir, e) {
303
+ this.#currentHandle = dom.query.getEventTarget(e);
304
+ dom.utils.addClass(this.#currentHandle, 'active');
305
+ this.#addGlobalEvent((this.#resizeDir = dir + (this.#$.options.get('_rtl') ? 'RTL' : '')));
306
+ }
307
+
308
+ /**
309
+ * @param {MouseEvent} e - Event object
310
+ */
311
+ #OnResize(e) {
312
+ switch (this.#resizeDir) {
313
+ case 'w':
314
+ case 'wRTL': {
315
+ const h = e.clientY - this.#offetTop - this.#resizeBody.offsetHeight;
316
+ this.#resizeBody.style.height = this.#resizeBody.offsetHeight + h + 'px';
317
+ break;
318
+ }
319
+ case 'h': {
320
+ const w = e.clientX - this.#offetLeft - this.#resizeBody.offsetWidth;
321
+ this.#resizeBody.style.width = this.#resizeBody.offsetWidth + w + 'px';
322
+ break;
323
+ }
324
+ case 'hRTL': {
325
+ const w = this.#offetLeft - e.clientX;
326
+ this.#resizeBody.style.width = this.#resizeBody.offsetWidth + w + 'px';
327
+ break;
328
+ }
329
+ case 'c': {
330
+ const w = e.clientX - this.#offetLeft - this.#resizeBody.offsetWidth;
331
+ const h = e.clientY - this.#offetTop - this.#resizeBody.offsetHeight;
332
+ this.#resizeBody.style.width = this.#resizeBody.offsetWidth + w + 'px';
333
+ this.#resizeBody.style.height = this.#resizeBody.offsetHeight + h + 'px';
334
+ break;
335
+ }
336
+ case 'cRTL': {
337
+ const w = this.#offetLeft - e.clientX;
338
+ const h = e.clientY - this.#offetTop - this.#resizeBody.offsetHeight;
339
+ this.#resizeBody.style.width = this.#resizeBody.offsetWidth + w + 'px';
340
+ this.#resizeBody.style.height = this.#resizeBody.offsetHeight + h + 'px';
341
+ break;
342
+ }
343
+ }
344
+
345
+ this.#saveOffset();
346
+
347
+ this.inst.modalResize?.();
348
+ }
349
+
350
+ #OnResizeMouseUp() {
351
+ dom.utils.removeClass(this.#currentHandle, 'active');
352
+ this.#currentHandle = null;
353
+ this.#removeGlobalEvent();
354
+ }
355
+ }
356
+
357
+ export default Modal;
@@ -0,0 +1,9 @@
1
+ // ============================================================
2
+ // Contract Modules - Plugins must implement required callbacks
3
+ // ============================================================
4
+ export { default as Browser } from './Browser.js';
5
+ export { default as ColorPicker } from './ColorPicker.js';
6
+ export { default as Controller } from './Controller.js';
7
+ export { default as Figure } from './Figure.js';
8
+ export { default as HueSlider } from './HueSlider.js';
9
+ export { default as Modal } from './Modal.js';
@@ -0,0 +1,197 @@
1
+ import { env } from '../../helper';
2
+
3
+ /**
4
+ * @typedef ApiManagerParams
5
+ * @property {string} [method] - HTTP method (GET, POST, PUT, DELETE...)
6
+ * @property {string} [url] - API's URL
7
+ * @property {Object<string, string>} [headers] - HTTP headers
8
+ * @property {*} [data] - API data
9
+ * @property {(xmlHttp: XMLHttpRequest) => boolean} [callBack] - API success callback
10
+ * @property {(res: *, xmlHttp: XMLHttpRequest) => string} [errorCallBack] - API fail callback
11
+ * @property {XMLHttpRequestResponseType} [responseType] - XMLHttpRequest.responseType
12
+ */
13
+
14
+ /**
15
+ * @class
16
+ * @description API Manager
17
+ */
18
+ class ApiManager {
19
+ #$;
20
+
21
+ /** @type {XMLHttpRequest} */
22
+ #xhr;
23
+
24
+ /**
25
+ * @constructor
26
+ * @param {*} inst The instance object that called the constructor.
27
+ * @param {SunEditor.Deps} $ Kernel dependencies
28
+ * @param {ApiManagerParams} [params] API options
29
+ */
30
+ constructor(inst, $, params) {
31
+ this.#$ = $;
32
+
33
+ /**
34
+ * @description Caller instance key name
35
+ * @type {string}
36
+ */
37
+ this.kind = inst.constructor.key || inst.constructor.name;
38
+
39
+ // members
40
+ this.#xhr = env.getXMLHttpRequest();
41
+ // members - option
42
+ this.method = params?.method;
43
+ this.url = params?.url;
44
+ this.headers = params?.headers;
45
+ this.data = params?.data;
46
+ this.callBack = params?.callBack;
47
+ this.errorCallBack = params?.errorCallBack;
48
+ this.responseType = params?.responseType;
49
+ }
50
+
51
+ /**
52
+ * @description Call API
53
+ * @param {ApiManagerParams} params
54
+ */
55
+ call({ method, url, headers, data, callBack, errorCallBack, responseType }) {
56
+ this.cancel();
57
+
58
+ method ||= this.method;
59
+ url = this.#normalizeUrl(url || this.url);
60
+ headers ||= this.headers;
61
+ data ||= this.data;
62
+ callBack ||= this.callBack;
63
+ errorCallBack ||= this.errorCallBack;
64
+ responseType ||= this.responseType;
65
+
66
+ // Validate required callback parameter
67
+ if (typeof callBack !== 'function') {
68
+ throw new Error(`[SUNEDITOR.ApiManager[${this.kind}].upload.callBack.fail] callBack is not a function`);
69
+ }
70
+
71
+ const xhr = this.#xhr;
72
+ if (responseType) xhr.responseType = responseType;
73
+ xhr.onreadystatechange = this.#CallBackApi.bind(this, xhr, callBack, errorCallBack);
74
+ xhr.open(method, url, true);
75
+ if (headers !== null && typeof headers === 'object' && Object.keys(headers).length > 0) {
76
+ for (const key in headers) {
77
+ xhr.setRequestHeader(key, headers[key]);
78
+ }
79
+ }
80
+
81
+ xhr.send(data);
82
+ }
83
+
84
+ /**
85
+ * @description Call Async API
86
+ * @param {Object} params
87
+ * @param {string} [params.method] - HTTP method (GET, POST, PUT, DELETE...)
88
+ * @param {string} [params.url] - API's URL
89
+ * @param {Object<string, string>} [params.headers] - HTTP headers
90
+ * @param {*} [params.data] - API data
91
+ * @param {XMLHttpRequestResponseType} [params.responseType] - XMLHttpRequest.responseType
92
+ * @returns {Promise<XMLHttpRequest>}
93
+ */
94
+ asyncCall({ method, url, headers, data, responseType }) {
95
+ this.cancel();
96
+
97
+ method ||= this.method;
98
+ url = this.#normalizeUrl(url || this.url);
99
+ headers ||= this.headers;
100
+ data ||= this.data;
101
+ responseType ||= this.responseType;
102
+
103
+ const xhr = this.#xhr;
104
+ if (responseType) xhr.responseType = responseType;
105
+
106
+ return new Promise((resolve, reject) => {
107
+ xhr.open(method, url, true);
108
+ if (headers !== null && typeof headers === 'object' && Object.keys(headers).length > 0) {
109
+ for (const key in headers) {
110
+ xhr.setRequestHeader(key, headers[key]);
111
+ }
112
+ }
113
+ xhr.onload = () => {
114
+ if (xhr.status === 200) {
115
+ try {
116
+ resolve(xhr);
117
+ } finally {
118
+ this.#$.ui.hideLoading();
119
+ }
120
+ } else {
121
+ try {
122
+ const res = !xhr.responseText ? xhr : JSON.parse(xhr.responseText);
123
+ reject(res);
124
+ } finally {
125
+ this.#$.ui.hideLoading();
126
+ }
127
+ }
128
+ };
129
+
130
+ xhr.onerror = () => {
131
+ this.#$.ui.hideLoading();
132
+ reject(new Error('Network error'));
133
+ };
134
+
135
+ xhr.send(data);
136
+ });
137
+ }
138
+
139
+ /**
140
+ * @description Cancel API (xhr.abort())
141
+ */
142
+ cancel() {
143
+ if (this.#xhr) {
144
+ this.#xhr.onreadystatechange = null;
145
+ this.#xhr.onload = null;
146
+ this.#xhr.onerror = null;
147
+ this.#xhr.abort();
148
+ }
149
+ }
150
+
151
+ /**
152
+ * @description Remove unnecessary slashes in API URL.
153
+ * @param {string} url url
154
+ * @returns
155
+ */
156
+ #normalizeUrl(url) {
157
+ return url.replace(/([^:])\/+/g, '$1/').replace(/\/(\?|#|$)/, '$1');
158
+ }
159
+
160
+ /**
161
+ * @description API callback
162
+ * @param {XMLHttpRequest} xmlHttp - XMLHttpRequest
163
+ * @param {(xmlHttp: XMLHttpRequest) => Promise<void>} callBack - Callback function
164
+ * @param {(res: *, xmlHttp: XMLHttpRequest) => Promise<string>} errorCallBack - Error callback function
165
+ */
166
+ async #CallBackApi(xmlHttp, callBack, errorCallBack) {
167
+ if (xmlHttp.readyState === 4) {
168
+ if (xmlHttp.status === 200) {
169
+ try {
170
+ await callBack(xmlHttp);
171
+ } catch (error) {
172
+ throw Error(`[SUNEDITOR.ApiManager[${this.kind}].upload.callBack.fail] ${error.message}`);
173
+ } finally {
174
+ this.#$.ui.hideLoading();
175
+ }
176
+ } else {
177
+ // exception
178
+ console.error(`[SUNEDITOR.ApiManager[${this.kind}].upload.serverException]`, xmlHttp);
179
+ try {
180
+ const res = !xmlHttp.responseText ? xmlHttp : JSON.parse(xmlHttp.responseText);
181
+ let message = '';
182
+ if (typeof errorCallBack === 'function') {
183
+ message = await errorCallBack(res, xmlHttp);
184
+ }
185
+ const err = `[SUNEDITOR.ApiManager[${this.kind}].upload.serverException] status: ${xmlHttp.status}, response: ${message || res.errorMessage || xmlHttp.responseText}`;
186
+ this.#$.ui.alertOpen(err, 'error');
187
+ } catch (error) {
188
+ throw Error(`[SUNEDITOR.ApiManager[${this.kind}].upload.errorCallBack.fail] ${error.message}`);
189
+ } finally {
190
+ this.#$.ui.hideLoading();
191
+ }
192
+ }
193
+ }
194
+ }
195
+ }
196
+
197
+ export default ApiManager;