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,380 @@
1
+ import { dom, env, keyCodeMap } from '../../../helper';
2
+ import { isTable, isList } from '../../../helper/dom/domCheck';
3
+
4
+ const { NO_EVENT } = env;
5
+
6
+ /**
7
+ * @constant {Object.<string, string[]>} StyleMap - Map of font styles to CSS properties.
8
+ */
9
+ const StyleMap = {
10
+ bold: ['font-weight'],
11
+ underline: ['text-decoration'],
12
+ italic: ['font-style'],
13
+ strike: ['text-decoration'],
14
+ };
15
+
16
+ /**
17
+ * @description Executes built-in editor commands (formatting, undo/redo, save, codeView, etc.)
18
+ * - and manages copy-format state.
19
+ */
20
+ export default class CommandExecutor {
21
+ #kernel;
22
+ #$;
23
+ #store;
24
+
25
+ #frameContext;
26
+ #options;
27
+ #eventManager;
28
+
29
+ #globalEventKeydown = null;
30
+ #globalEventMousedown = null;
31
+
32
+ /**
33
+ * @description Copy format info
34
+ * - `eventManager.__cacheStyleNodes` copied
35
+ * @type {?Array<Node>}
36
+ */
37
+ #onCopyFormatInfo = null;
38
+
39
+ /**
40
+ * @description Copy format init method
41
+ * @type {?(...args: *) => *}
42
+ */
43
+ #onCopyFormatInitMethod = null;
44
+
45
+ /**
46
+ * @constructor
47
+ * @param {SunEditor.Kernel} kernel
48
+ */
49
+ constructor(kernel) {
50
+ this.#kernel = kernel;
51
+ this.#$ = kernel.$;
52
+ this.#store = kernel.store;
53
+ this.#frameContext = this.#$.frameContext;
54
+ this.#options = this.#$.options;
55
+ this.#eventManager = this.#$.eventManager;
56
+ }
57
+
58
+ /**
59
+ * @description Execute default command of command button
60
+ */
61
+ async execute(command, button) {
62
+ if (this.#frameContext.get('isReadOnly') && !/copy|cut|selectAll|codeView|fullScreen|print|preview|showBlocks/.test(command)) return;
63
+
64
+ switch (command) {
65
+ case 'selectAll':
66
+ this.#SELECT_ALL();
67
+ break;
68
+ case 'copy': {
69
+ const range = this.#$.selection.getRange();
70
+ if (range.collapsed) break;
71
+
72
+ const container = dom.utils.createElement('div', null, range.cloneContents());
73
+ await this.#$.html.copy(container.innerHTML);
74
+
75
+ break;
76
+ }
77
+ case 'newDocument':
78
+ this.#$.html.set(`<${this.#options.get('defaultLine')}><br></${this.#options.get('defaultLine')}>`);
79
+ this.#$.focusManager.focus();
80
+ this.#$.history.push(false);
81
+ // document type
82
+ if (this.#frameContext.has('documentType_use_header')) {
83
+ this.#frameContext.get('documentType').reHeader();
84
+ }
85
+ break;
86
+ case 'codeView':
87
+ this.#$.viewer.codeView(!this.#frameContext.get('isCodeView'));
88
+ break;
89
+ case 'fullScreen':
90
+ this.#$.viewer.fullScreen(!this.#frameContext.get('isFullScreen'));
91
+ break;
92
+ case 'indent':
93
+ this.#$.format.indent();
94
+ break;
95
+ case 'outdent':
96
+ this.#$.format.outdent();
97
+ break;
98
+ case 'undo':
99
+ this.#$.history.undo();
100
+ break;
101
+ case 'redo':
102
+ this.#$.history.redo();
103
+ break;
104
+ case 'removeFormat':
105
+ this.#$.inline.remove();
106
+ this.#$.focusManager.focus();
107
+ break;
108
+ case 'print':
109
+ this.#$.viewer.print();
110
+ break;
111
+ case 'preview':
112
+ this.#$.viewer.preview();
113
+ break;
114
+ case 'showBlocks':
115
+ this.#$.viewer.showBlocks(!this.#frameContext.get('isShowBlocks'));
116
+ break;
117
+ case 'dir':
118
+ this.#$.ui.setDir(this.#options.get('_rtl') ? 'ltr' : 'rtl');
119
+ break;
120
+ case 'dir_ltr':
121
+ this.#$.ui.setDir('ltr');
122
+ break;
123
+ case 'dir_rtl':
124
+ this.#$.ui.setDir('rtl');
125
+ break;
126
+ case 'save':
127
+ await this.#SAVE();
128
+ break;
129
+ case 'copyFormat':
130
+ this.#COPY_FORMAT(button);
131
+ break;
132
+ case 'pageBreak':
133
+ this.#PAGE_BREAK();
134
+ break;
135
+ case 'pageUp':
136
+ this.#frameContext.get('documentType').pageUp();
137
+ break;
138
+ case 'pageDown':
139
+ this.#frameContext.get('documentType').pageDown();
140
+ break;
141
+ default:
142
+ this.#FONT_STYLE(command);
143
+ }
144
+ }
145
+
146
+ copyFormat() {
147
+ if (!this.#onCopyFormatInfo?.length) return;
148
+
149
+ try {
150
+ const _styleNode = [...this.#onCopyFormatInfo];
151
+ const n = _styleNode.pop();
152
+
153
+ this.#$.inline.remove();
154
+
155
+ if (n) {
156
+ const insertedNode = this.#$.inline.apply(n, { stylesToModify: null, nodesToRemove: [n.nodeName], strictRemove: false });
157
+ const { parent, inner } = this.#$.nodeTransform.createNestedNode(_styleNode);
158
+ insertedNode.parentNode.insertBefore(parent, insertedNode);
159
+ inner.appendChild(insertedNode);
160
+
161
+ this.#$.selection.setRange(insertedNode, dom.check.isZeroWidth(insertedNode) ? 1 : 0, insertedNode, 1);
162
+ }
163
+
164
+ if (this.#options.get('copyFormatKeepOn')) return;
165
+
166
+ this.#onCopyFormatInitMethod();
167
+ } catch (err) {
168
+ console.warn('[SUNEDITOR.copyFormat.error] ', err);
169
+ if (!this.#onCopyFormatInitMethod?.()) {
170
+ this.#onCopyFormatInfo = null;
171
+ this.#onCopyFormatInitMethod = null;
172
+ }
173
+ }
174
+ }
175
+
176
+ /**
177
+ * @description Selects all content in the editor.
178
+ */
179
+ #SELECT_ALL() {
180
+ this.#$.ui.offCurrentController();
181
+ this.#$.menu.containerOff();
182
+
183
+ // check all tags
184
+ const ww = this.#frameContext.get('wysiwyg');
185
+ let prevScopeTag = null;
186
+ let prevScopeTagName = '';
187
+ const scopeSelectionTags = this.#options.get('scopeSelectionTags');
188
+ const range = this.#$.selection.getRange();
189
+ if (!range.collapsed) {
190
+ let commonNode = (prevScopeTag = range.commonAncestorContainer);
191
+ let commonNodeName = (prevScopeTagName = commonNode.nodeName?.toLowerCase());
192
+ if (range.startOffset === 0 && range.endOffset === range.endContainer.textContent?.length) {
193
+ const commonParent = commonNode.parentElement;
194
+ if ((dom.check.isList(commonParent) || dom.check.isListCell(commonParent)) && commonParent.firstChild.contains?.(range.startContainer) && commonParent.lastChild?.contains(range.endContainer)) {
195
+ prevScopeTag = commonNode = commonParent.parentElement;
196
+ prevScopeTagName = commonNode.nodeName?.toLowerCase();
197
+ }
198
+ }
199
+
200
+ commonNodeName = commonNode.nodeName?.toLowerCase();
201
+ while (commonNode && ((!commonNode.nextSibling && !commonNode.previousSibling && !scopeSelectionTags.includes(commonNodeName)) || dom.check.isContentLess(commonNodeName)) && commonNode !== ww) {
202
+ commonNode = commonNode.parentElement;
203
+ commonNodeName = commonNode.nodeName?.toLowerCase();
204
+ }
205
+
206
+ if (scopeSelectionTags.includes(commonNodeName)) {
207
+ prevScopeTag = commonNode;
208
+ prevScopeTagName = commonNodeName;
209
+ }
210
+ }
211
+
212
+ // select all
213
+ const scopeTagList = scopeSelectionTags.filter((tagName) => tagName !== prevScopeTagName);
214
+ const scopeBaseTag = dom.query.getParentElement(prevScopeTag || this.#$.selection.getNode(), (current) => scopeTagList.includes(current.nodeName?.toLowerCase()));
215
+
216
+ let selectArea = scopeBaseTag || ww;
217
+ let { first, last } = __findFirstAndLast(selectArea);
218
+
219
+ if (!first || !last) return;
220
+
221
+ const isZeroWidth = dom.check.isZeroWidth;
222
+ while (isZeroWidth(first) && isZeroWidth(last) && selectArea !== ww) {
223
+ selectArea = selectArea.parentElement;
224
+ ({ first, last } = __findFirstAndLast(dom.query.getParentElement(selectArea, (current) => scopeTagList.includes(current.nodeName?.toLowerCase())) || ww));
225
+ }
226
+
227
+ if (!first || !last) return;
228
+
229
+ let info = null;
230
+ if (dom.check.isMedia(first) || (info = this.#$.component.get(first)) || dom.check.isTableElements(first)) {
231
+ info ||= this.#$.component.get(first);
232
+ const br = dom.utils.createElement('BR');
233
+ const format = dom.utils.createElement(this.#options.get('defaultLine'), null, br);
234
+ first = info ? info.container || info.cover : first;
235
+ first.parentElement.insertBefore(format, first);
236
+ first = br;
237
+ }
238
+
239
+ if (dom.check.isMedia(last) || (info = this.#$.component.get(last)) || dom.check.isTableElements(last)) {
240
+ info ||= this.#$.component.get(last);
241
+ const br = dom.utils.createElement('BR');
242
+ const format = dom.utils.createElement(this.#options.get('defaultLine'), null, br);
243
+ last = info ? info.container || info.cover : last;
244
+ last.parentElement.appendChild(format);
245
+ last = br;
246
+ }
247
+
248
+ this.#$.toolbar._showBalloon(this.#$.selection.setRange(first, 0, last, last.textContent.length));
249
+ }
250
+
251
+ /**
252
+ * @description Saves the editor content.
253
+ * @returns {Promise<void>}
254
+ */
255
+ async #SAVE() {
256
+ const fc = this.#frameContext;
257
+ if (!fc.get('isChanged')) return;
258
+
259
+ const data = this.#$.html.get();
260
+ const saved = await this.#eventManager.triggerEvent('onSave', { frameContext: fc, data });
261
+ if (saved === NO_EVENT) {
262
+ const origin = fc.get('originElement');
263
+ if (/^TEXTAREA$/i.test(origin.nodeName)) {
264
+ origin.value = data;
265
+ } else {
266
+ origin.innerHTML = data;
267
+ }
268
+ } else if (saved === false) {
269
+ return;
270
+ }
271
+
272
+ fc.set('isChanged', false);
273
+ fc.set('savedIndex', this.#$.history.getRootStack()[this.#store.get('rootKey')].index);
274
+
275
+ // set save button disable
276
+ this.#$.commandDispatcher.applyTargets('save', (e) => {
277
+ e.disabled = true;
278
+ });
279
+ }
280
+
281
+ /**
282
+ * @description Copies formatting from selected text.
283
+ * @param {Node} button - The button triggering the copy format function.
284
+ */
285
+ #COPY_FORMAT(button) {
286
+ if (typeof this.#onCopyFormatInitMethod === 'function') {
287
+ this.#onCopyFormatInitMethod();
288
+ return;
289
+ }
290
+
291
+ const ww = this.#frameContext.get('wysiwyg');
292
+ this.#onCopyFormatInfo = [...this.#kernel._eventOrchestrator.__cacheStyleNodes];
293
+ this.#onCopyFormatInitMethod = this.#removeCopyformt.bind(this, this.#eventManager, ww, button);
294
+ dom.utils.addClass(ww, 'se-copy-format-cursor');
295
+ dom.utils.addClass(button, 'on');
296
+
297
+ this.#globalEventKeydown = this.#eventManager.addGlobalEvent('keydown', (e) => {
298
+ if (!keyCodeMap.isEsc(e.code)) return;
299
+ this.#onCopyFormatInitMethod?.();
300
+ });
301
+ this.#globalEventMousedown = this.#eventManager.addGlobalEvent('mousedown', (e) => {
302
+ if (ww.contains(e.target) || e.target === button) return;
303
+ this.#onCopyFormatInitMethod?.();
304
+ });
305
+ }
306
+
307
+ /**
308
+ * @param {import('../../config/eventManager').default} eventManager
309
+ * @param {Node} ww Wywsiwyg element
310
+ * @param {Node} button Button element
311
+ */
312
+ #removeCopyformt(eventManager, ww, button) {
313
+ this.#globalEventKeydown = eventManager.removeGlobalEvent(this.#globalEventKeydown);
314
+ this.#globalEventMousedown = eventManager.removeGlobalEvent(this.#globalEventMousedown);
315
+ this.#onCopyFormatInfo = null;
316
+ this.#onCopyFormatInitMethod = null;
317
+ dom.utils.removeClass(ww, 'se-copy-format-cursor');
318
+ dom.utils.removeClass(button, 'on');
319
+
320
+ return true;
321
+ }
322
+
323
+ /**
324
+ * @description Applies font styling to selected text.
325
+ * @param {string} command - The font style command (e.g., bold, italic, underline).
326
+ */
327
+ #FONT_STYLE(command) {
328
+ command = this.#options.get('_defaultTagCommand')[command.toLowerCase()] || command;
329
+ let nodeName = this.#options.get('convertTextTags')[command] || command;
330
+ const nodesMap = this.#store.get('currentNodesMap');
331
+ const el = nodesMap.includes(this.#options.get('_styleCommandMap')[nodeName]) ? null : dom.utils.createElement(nodeName);
332
+
333
+ if (/^sub$/i.test(nodeName) && nodesMap.includes('superscript')) {
334
+ nodeName = 'sup';
335
+ } else if (/^sup$/i.test(nodeName) && nodesMap.includes('subscript')) {
336
+ nodeName = 'sub';
337
+ }
338
+
339
+ this.#$.inline.apply(el, { stylesToModify: StyleMap[command] || null, nodesToRemove: [nodeName], strictRemove: false });
340
+ this.#$.focusManager.focus();
341
+ }
342
+
343
+ /**
344
+ * @description Inserts a page break element into the editor.
345
+ */
346
+ #PAGE_BREAK() {
347
+ const pageBreak = dom.utils.createElement('DIV', { class: 'se-component se-component-line-break se-page-break' });
348
+ this.#$.component.insert(pageBreak, { skipCharCount: true, insertBehavior: 'line' });
349
+ const line = pageBreak.nextElementSibling || this.#$.format.addLine(pageBreak);
350
+ this.#$.selection.setRange(line, 1, line, 1);
351
+ this.#$.history.push(false);
352
+ }
353
+ }
354
+
355
+ /**
356
+ * @description Finds the first and last child elements in a selection area.
357
+ * @param {Element} selectArea Selection area element
358
+ * @returns {{ first: Node, last: Node}} Object containing the first and last child elements
359
+ */
360
+ const __findFirstAndLast = function (selectArea) {
361
+ const isContentLess = dom.check.isContentLess;
362
+ const first =
363
+ dom.query.getEdgeChild(
364
+ dom.query.getEdgeChild(selectArea, (current) => !isContentLess(current), false),
365
+ (current) => {
366
+ return current.childNodes.length === 0 || current.nodeType === 3 || isTable(current) || isList(current);
367
+ },
368
+ false,
369
+ ) || selectArea.firstChild;
370
+ const last =
371
+ dom.query.getEdgeChild(
372
+ selectArea.lastChild,
373
+ (current) => {
374
+ return current.childNodes.length === 0 || current.nodeType === 3 || isTable(current) || isList(current);
375
+ },
376
+ true,
377
+ ) || selectArea.lastChild;
378
+
379
+ return { first, last };
380
+ };
@@ -0,0 +1,241 @@
1
+ import { dom } from '../../../helper';
2
+ import CommandExecutor from './_commandExecutor';
3
+ import { CreateShortcuts } from '../../section/constructor';
4
+
5
+ export const COMMAND_BUTTONS = '.se-menu-list .se-toolbar-btn[data-command]';
6
+
7
+ /**
8
+ * @description List of commands that trigger active event handling in the editor.
9
+ * - These commands typically apply inline formatting or structural changes.
10
+ * @constant {string[]}
11
+ */
12
+ const ACTIVE_EVENT_COMMANDS = ['bold', 'underline', 'italic', 'strike', 'subscript', 'superscript', 'indent', 'outdent'];
13
+
14
+ /**
15
+ * @description List of basic editor commands, including active event commands and additional actions
16
+ * - such as undo, redo, saving, full-screen toggle, and text direction commands.
17
+ * @constant {string[]}
18
+ */
19
+ const BASIC_COMMANDS = ACTIVE_EVENT_COMMANDS.concat(['undo', 'redo', 'save', 'fullScreen', 'showBlocks', 'codeView', 'dir', 'dir_ltr', 'dir_rtl']);
20
+
21
+ /**
22
+ * @description Routes toolbar button commands to their handlers and manages active button states.
23
+ */
24
+ export default class CommandDispatcher {
25
+ #$;
26
+ #context;
27
+ #options;
28
+
29
+ #commandExecutor;
30
+
31
+ /**
32
+ * @description A map with the plugin's buttons having an `active` method and the default command buttons with an `active` action.
33
+ * - Each button is contained in an array.
34
+ * @type {Map<string, Array<HTMLButtonElement>>}
35
+ */
36
+ #commandTargets = new Map();
37
+
38
+ /** @type {Array<string>} */
39
+ #activeCommands = ACTIVE_EVENT_COMMANDS;
40
+
41
+ /**
42
+ * @constructor
43
+ * @param {SunEditor.Kernel} kernel
44
+ */
45
+ constructor(kernel) {
46
+ this.#$ = kernel.$;
47
+ this.#context = this.#$.context;
48
+ this.#options = this.#$.options;
49
+
50
+ this.#commandExecutor = new CommandExecutor(kernel);
51
+
52
+ /**
53
+ * @description All command buttons map
54
+ * @type {Map<string, HTMLElement>}
55
+ */
56
+ this.allCommandButtons = new Map();
57
+
58
+ /**
59
+ * @description All command buttons map
60
+ * @type {Map<string, HTMLElement>}
61
+ */
62
+ this.subAllCommandButtons = new Map();
63
+ }
64
+
65
+ get targets() {
66
+ return this.#commandTargets;
67
+ }
68
+
69
+ /**
70
+ * @description Returns the active commands array.
71
+ * @returns {Array<string>}
72
+ */
73
+ get activeCommands() {
74
+ return this.#activeCommands;
75
+ }
76
+
77
+ /**
78
+ * @description Run plugin calls and basic commands.
79
+ * @param {string} command Command string
80
+ * @param {string} type Display type string (`command`, `dropdown`, `modal`, `container`)
81
+ * @param {?Node} [button] The element of command button
82
+ */
83
+ run(command, type, button) {
84
+ if (type) {
85
+ if (/more/i.test(type)) {
86
+ const toolbar = dom.query.getParentElement(button, '.se-toolbar');
87
+ const toolInst = dom.utils.hasClass(toolbar, 'se-toolbar-sub') ? this.#$.subToolbar : this.#$.toolbar;
88
+ if (button !== toolInst.currentMoreLayerActiveButton) {
89
+ const layer = toolbar.querySelector('.' + command);
90
+ if (layer) {
91
+ toolInst._moreLayerOn(button, layer);
92
+ toolInst._showBalloon();
93
+ toolInst._showInline();
94
+ }
95
+ dom.utils.addClass(button, 'on');
96
+ } else if (toolInst.currentMoreLayerActiveButton) {
97
+ toolInst._moreLayerOff();
98
+ toolInst._showBalloon();
99
+ toolInst._showInline();
100
+ }
101
+
102
+ this.#$.viewer._resetFullScreenHeight();
103
+ return;
104
+ }
105
+
106
+ if (/container/.test(type) && (this.#$.menu.targetMap[command] === null || button !== this.#$.menu.currentContainerActiveButton)) {
107
+ this.#$.menu.containerOn(button);
108
+ return;
109
+ }
110
+
111
+ if (this.#$.ui.isButtonDisabled(button)) return;
112
+
113
+ if (/dropdown/.test(type) && (this.#$.menu.targetMap[command] === null || button !== this.#$.menu.currentDropdownActiveButton)) {
114
+ this.#$.menu.dropdownOn(button);
115
+ return;
116
+ } else if (/modal/.test(type)) {
117
+ this.#$.plugins[command].open(button);
118
+ return;
119
+ } else if (/command/.test(type)) {
120
+ this.#$.plugins[command].action(button);
121
+ } else if (/browser/.test(type)) {
122
+ this.#$.plugins[command].open(null);
123
+ } else if (/popup/.test(type)) {
124
+ this.#$.plugins[command].show();
125
+ }
126
+ } else if (command) {
127
+ this.#commandExecutor.execute(command, button);
128
+ }
129
+
130
+ if (/dropdown/.test(type)) {
131
+ this.#$.menu.dropdownOff();
132
+ } else if (!/command/.test(type)) {
133
+ this.#$.menu.dropdownOff();
134
+ this.#$.menu.containerOff();
135
+ }
136
+ }
137
+
138
+ /**
139
+ * @description Execute `editor.run` with command button.
140
+ * @param {Node} target Command target
141
+ */
142
+ runFromTarget(target) {
143
+ if (dom.check.isInputElement(target)) return;
144
+
145
+ const targetBtn = /** @type {HTMLButtonElement} */ (dom.query.getCommandTarget(target));
146
+ if (!targetBtn) return;
147
+
148
+ const command = targetBtn.getAttribute('data-command');
149
+ const type = targetBtn.getAttribute('data-type');
150
+
151
+ if (!command && !type) return;
152
+ if (targetBtn.disabled) return;
153
+
154
+ this.run(command, type, target);
155
+ }
156
+
157
+ /**
158
+ * @description It is executed by inserting the button of `commandTargets` as the argument value of the `func` function.
159
+ * - `func` is called as long as the button array's length.
160
+ * @param {string} cmd data-command
161
+ * @param {(...args: *) => *} func Function.
162
+ */
163
+ applyTargets(cmd, func) {
164
+ if (this.#commandTargets.has(cmd)) {
165
+ this.#commandTargets.get(cmd).forEach(func);
166
+ }
167
+ }
168
+
169
+ /**
170
+ * @description Sets command target elements.
171
+ * @param {string} cmd - The command identifier.
172
+ * @param {HTMLButtonElement} target - The associated command button.
173
+ */
174
+ registerTargets(cmd, target) {
175
+ if (!cmd || !target) return;
176
+
177
+ const isBasicCmd = BASIC_COMMANDS.includes(cmd);
178
+ if (!isBasicCmd && !this.#$.plugins[cmd]) return;
179
+
180
+ if (!this.#commandTargets.get(cmd)) {
181
+ this.#commandTargets.set(cmd, [target]);
182
+ } else if (!this.#commandTargets.get(cmd).includes(target)) {
183
+ this.#commandTargets.get(cmd).push(target);
184
+ }
185
+ }
186
+
187
+ resetTargets() {
188
+ this.#commandTargets = new Map();
189
+ this._initCommandButtons();
190
+ }
191
+
192
+ /**
193
+ * @internal
194
+ * @description Caching basic buttons to use
195
+ */
196
+ _initCommandButtons() {
197
+ const ctx = this.#context;
198
+
199
+ this.#saveCommandButtons(this.allCommandButtons, ctx.get('toolbar_buttonTray'));
200
+ this.#saveCommandButtons(this.subAllCommandButtons, ctx.get('toolbar_sub_buttonTray'));
201
+ }
202
+
203
+ _copyFormat() {
204
+ this.#commandExecutor.copyFormat();
205
+ }
206
+
207
+ /**
208
+ * @description Save the current buttons
209
+ * @param {Map<string, Element>} cmdButtons Command button map
210
+ * @param {?Element} tray Button tray
211
+ */
212
+ #saveCommandButtons(cmdButtons, tray) {
213
+ if (!tray) return;
214
+
215
+ const currentButtons = tray.querySelectorAll(COMMAND_BUTTONS);
216
+ const shortcuts = this.#options.get('shortcuts');
217
+ const reverseCommandArray = this.#options.get('_reverseCommandArray');
218
+ const keyMap = this.#$.shortcuts.keyMap;
219
+ const reverseKeys = this.#$.shortcuts.reverseKeys;
220
+
221
+ for (let i = 0, len = currentButtons.length, e, c; i < len; i++) {
222
+ e = /** @type {HTMLButtonElement} */ (currentButtons[i]);
223
+ c = e.getAttribute('data-command');
224
+ // command set
225
+ cmdButtons.set(c, e);
226
+ this.registerTargets(c, e);
227
+ // shortcuts
228
+ CreateShortcuts(c, e, shortcuts[c], keyMap, reverseCommandArray, reverseKeys);
229
+ }
230
+ }
231
+
232
+ /**
233
+ * @description Destroy the CommandDispatcher
234
+ */
235
+ _destroy() {
236
+ this.#commandTargets.clear();
237
+ this.allCommandButtons.clear();
238
+ this.subAllCommandButtons.clear();
239
+ this.#activeCommands = null;
240
+ }
241
+ }