@shelamkoff/rector 1.0.0

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 (668) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +17 -0
  3. package/README.md +23 -0
  4. package/THIRD_PARTY_LICENSES.txt +298 -0
  5. package/dist/I18n.d.ts +1 -0
  6. package/dist/core/Block.d.ts +110 -0
  7. package/dist/core/Block.js +390 -0
  8. package/dist/core/BlockAnimator.d.ts +39 -0
  9. package/dist/core/BlockAnimator.js +106 -0
  10. package/dist/core/BlockManager.d.ts +163 -0
  11. package/dist/core/BlockManager.js +640 -0
  12. package/dist/core/BlockOperations.d.ts +67 -0
  13. package/dist/core/BlockOperations.js +238 -0
  14. package/dist/core/ChangeNotifier.d.ts +15 -0
  15. package/dist/core/ChangeNotifier.js +55 -0
  16. package/dist/core/CommandDispatcher.d.ts +52 -0
  17. package/dist/core/CommandDispatcher.js +208 -0
  18. package/dist/core/CrossBlockSelection.d.ts +30 -0
  19. package/dist/core/CrossBlockSelection.js +74 -0
  20. package/dist/core/Diagnostics.d.ts +23 -0
  21. package/dist/core/Diagnostics.js +62 -0
  22. package/dist/core/DocumentSchema.d.ts +29 -0
  23. package/dist/core/DocumentSchema.js +147 -0
  24. package/dist/core/DocumentSnapshotStore.d.ts +34 -0
  25. package/dist/core/DocumentSnapshotStore.js +153 -0
  26. package/dist/core/DragManager.d.ts +17 -0
  27. package/dist/core/DragManager.js +223 -0
  28. package/dist/core/EditorFacade.d.ts +154 -0
  29. package/dist/core/EditorFacade.js +361 -0
  30. package/dist/core/EditorHolderOwnership.d.ts +12 -0
  31. package/dist/core/EditorHolderOwnership.js +28 -0
  32. package/dist/core/I18n.d.ts +147 -0
  33. package/dist/core/I18n.js +296 -0
  34. package/dist/core/InlinePatternMatcher.d.ts +26 -0
  35. package/dist/core/InlinePatternMatcher.js +267 -0
  36. package/dist/core/InlinePluginRegistry.d.ts +55 -0
  37. package/dist/core/InlinePluginRegistry.js +128 -0
  38. package/dist/core/KeyboardManager.d.ts +17 -0
  39. package/dist/core/KeyboardManager.js +231 -0
  40. package/dist/core/LifecycleScope.d.ts +19 -0
  41. package/dist/core/LifecycleScope.js +41 -0
  42. package/dist/core/MouseSelectionManager.d.ts +30 -0
  43. package/dist/core/MouseSelectionManager.js +307 -0
  44. package/dist/core/PluginOwnership.d.ts +9 -0
  45. package/dist/core/PluginOwnership.js +40 -0
  46. package/dist/core/PopupManager.d.ts +50 -0
  47. package/dist/core/PopupManager.js +183 -0
  48. package/dist/core/PreservedBlockPlugin.d.ts +11 -0
  49. package/dist/core/PreservedBlockPlugin.js +42 -0
  50. package/dist/core/PublicEditorApi.d.ts +82 -0
  51. package/dist/core/PublicEditorApi.js +158 -0
  52. package/dist/core/SelectionManager.d.ts +50 -0
  53. package/dist/core/SelectionManager.js +205 -0
  54. package/dist/core/ShortcutRegistry.d.ts +29 -0
  55. package/dist/core/ShortcutRegistry.js +106 -0
  56. package/dist/core/SlashCommands.d.ts +34 -0
  57. package/dist/core/SlashCommands.js +483 -0
  58. package/dist/core/StyleInjector.d.ts +1 -0
  59. package/dist/core/StyleInjector.js +1 -0
  60. package/dist/core/Tooltip.d.ts +17 -0
  61. package/dist/core/Tooltip.js +60 -0
  62. package/dist/core/TriggerManager.d.ts +17 -0
  63. package/dist/core/TriggerManager.js +159 -0
  64. package/dist/core/TypeSelector.d.ts +31 -0
  65. package/dist/core/TypeSelector.js +464 -0
  66. package/dist/core/UndoManager.d.ts +72 -0
  67. package/dist/core/UndoManager.js +383 -0
  68. package/dist/core/block-settings-menu/BlockActions.d.ts +81 -0
  69. package/dist/core/block-settings-menu/BlockActions.js +233 -0
  70. package/dist/core/block-settings-menu/BlockSettingsMenu.d.ts +46 -0
  71. package/dist/core/block-settings-menu/BlockSettingsMenu.js +205 -0
  72. package/dist/core/block-settings-menu/MenuBuilder.d.ts +43 -0
  73. package/dist/core/block-settings-menu/MenuBuilder.js +203 -0
  74. package/dist/core/block-settings-menu/MenuPositioner.d.ts +22 -0
  75. package/dist/core/block-settings-menu/MenuPositioner.js +79 -0
  76. package/dist/core/clipboard/Clipboard.d.ts +47 -0
  77. package/dist/core/clipboard/Clipboard.js +653 -0
  78. package/dist/core/clipboard/CrossBlockEditor.d.ts +43 -0
  79. package/dist/core/clipboard/CrossBlockEditor.js +198 -0
  80. package/dist/core/clipboard/PasteRouter.d.ts +27 -0
  81. package/dist/core/clipboard/PasteRouter.js +86 -0
  82. package/dist/core/clipboard/pasteInsert.d.ts +35 -0
  83. package/dist/core/clipboard/pasteInsert.js +215 -0
  84. package/dist/core/clipboard/pasteUtils.d.ts +25 -0
  85. package/dist/core/clipboard/pasteUtils.js +98 -0
  86. package/dist/core/config.d.ts +77 -0
  87. package/dist/core/config.js +100 -0
  88. package/dist/core/constants.d.ts +23 -0
  89. package/dist/core/constants.js +30 -0
  90. package/dist/core/crossBlockConvert.d.ts +38 -0
  91. package/dist/core/crossBlockConvert.js +253 -0
  92. package/dist/core/dom.d.ts +35 -0
  93. package/dist/core/dom.js +65 -0
  94. package/dist/core/editorEvents.d.ts +89 -0
  95. package/dist/core/editorEvents.js +60 -0
  96. package/dist/core/hydrateInlinePlugins.d.ts +9 -0
  97. package/dist/core/hydrateInlinePlugins.js +36 -0
  98. package/dist/core/icons.d.ts +10 -0
  99. package/dist/core/icons.js +21 -0
  100. package/dist/core/index.d.ts +59 -0
  101. package/dist/core/index.js +703 -0
  102. package/dist/core/inline-toolbar/ActionsPanel.d.ts +61 -0
  103. package/dist/core/inline-toolbar/ActionsPanel.js +132 -0
  104. package/dist/core/inline-toolbar/InlinePositioner.d.ts +20 -0
  105. package/dist/core/inline-toolbar/InlinePositioner.js +63 -0
  106. package/dist/core/inline-toolbar/InlineToolbar.d.ts +45 -0
  107. package/dist/core/inline-toolbar/InlineToolbar.js +456 -0
  108. package/dist/core/inline-toolbar/PluginControlsSlot.d.ts +52 -0
  109. package/dist/core/inline-toolbar/PluginControlsSlot.js +118 -0
  110. package/dist/core/inline-toolbar/SelectionTracker.d.ts +63 -0
  111. package/dist/core/inline-toolbar/SelectionTracker.js +173 -0
  112. package/dist/core/inlinePluginInsert.d.ts +13 -0
  113. package/dist/core/inlinePluginInsert.js +56 -0
  114. package/dist/core/locale/en.d.ts +35 -0
  115. package/dist/core/locale/en.js +37 -0
  116. package/dist/core/locale/ru.d.ts +35 -0
  117. package/dist/core/locale/ru.js +37 -0
  118. package/dist/core/menuKeyboardNav.d.ts +15 -0
  119. package/dist/core/menuKeyboardNav.js +52 -0
  120. package/dist/core/sanitize.d.ts +2 -0
  121. package/dist/core/sanitize.js +6 -0
  122. package/dist/core/splitConvert.d.ts +46 -0
  123. package/dist/core/splitConvert.js +190 -0
  124. package/dist/core/textOffset.d.ts +46 -0
  125. package/dist/core/textOffset.js +180 -0
  126. package/dist/core/themes/dark.css +30 -0
  127. package/dist/core/themes/light.css +33 -0
  128. package/dist/core/themes/variables.css +1170 -0
  129. package/dist/core/toolbar/OffcanvasRoot.d.ts +37 -0
  130. package/dist/core/toolbar/OffcanvasRoot.js +127 -0
  131. package/dist/core/toolbar/Toolbar.d.ts +70 -0
  132. package/dist/core/toolbar/Toolbar.js +432 -0
  133. package/dist/core/toolbar/ToolbarPositioner.d.ts +60 -0
  134. package/dist/core/toolbar/ToolbarPositioner.js +188 -0
  135. package/dist/core/toolbar/ToolboxBuilder.d.ts +44 -0
  136. package/dist/core/toolbar/ToolboxBuilder.js +260 -0
  137. package/dist/core/types.d.ts +747 -0
  138. package/dist/core/uid.d.ts +6 -0
  139. package/dist/core/uid.js +29 -0
  140. package/dist/index.d.ts +2 -0
  141. package/dist/index.js +1 -0
  142. package/dist/inline-plugins/README.md +35 -0
  143. package/dist/inline-plugins/README.ru.md +35 -0
  144. package/dist/inline-plugins/color/README.md +61 -0
  145. package/dist/inline-plugins/color/README.ru.md +61 -0
  146. package/dist/inline-plugins/color.d.ts +8 -0
  147. package/dist/inline-plugins/color.js +184 -0
  148. package/dist/inline-plugins/locale/en.d.ts +7 -0
  149. package/dist/inline-plugins/locale/en.js +6 -0
  150. package/dist/inline-plugins/locale/ru.d.ts +7 -0
  151. package/dist/inline-plugins/locale/ru.js +6 -0
  152. package/dist/inline-plugins/mention/README.md +97 -0
  153. package/dist/inline-plugins/mention/README.ru.md +97 -0
  154. package/dist/inline-plugins/mention/index.d.ts +110 -0
  155. package/dist/inline-plugins/mention/index.js +1897 -0
  156. package/dist/inline-plugins/mention/styles.css +183 -0
  157. package/dist/inline-plugins/mention/widget.d.ts +16 -0
  158. package/dist/inline-plugins/mention/widget.js +75 -0
  159. package/dist/inline-tools/align.d.ts +14 -0
  160. package/dist/inline-tools/align.js +120 -0
  161. package/dist/inline-tools/bold.d.ts +8 -0
  162. package/dist/inline-tools/bold.js +12 -0
  163. package/dist/inline-tools/caseTransform.d.ts +8 -0
  164. package/dist/inline-tools/caseTransform.js +87 -0
  165. package/dist/inline-tools/clearFormatting.d.ts +8 -0
  166. package/dist/inline-tools/clearFormatting.js +74 -0
  167. package/dist/inline-tools/code.d.ts +8 -0
  168. package/dist/inline-tools/code.js +12 -0
  169. package/dist/inline-tools/colorPicker.d.ts +7 -0
  170. package/dist/inline-tools/colorPicker.js +271 -0
  171. package/dist/inline-tools/defaults.d.ts +10 -0
  172. package/dist/inline-tools/defaults.js +57 -0
  173. package/dist/inline-tools/fontSize.d.ts +7 -0
  174. package/dist/inline-tools/fontSize.js +524 -0
  175. package/dist/inline-tools/italic.d.ts +8 -0
  176. package/dist/inline-tools/italic.js +12 -0
  177. package/dist/inline-tools/link.d.ts +12 -0
  178. package/dist/inline-tools/link.js +251 -0
  179. package/dist/inline-tools/marker.d.ts +8 -0
  180. package/dist/inline-tools/marker.js +12 -0
  181. package/dist/inline-tools/scriptTool.d.ts +11 -0
  182. package/dist/inline-tools/scriptTool.js +149 -0
  183. package/dist/inline-tools/strikethrough.d.ts +8 -0
  184. package/dist/inline-tools/strikethrough.js +12 -0
  185. package/dist/inline-tools/utils.d.ts +220 -0
  186. package/dist/inline-tools/utils.js +992 -0
  187. package/dist/locale/en.d.ts +311 -0
  188. package/dist/locale/en.js +52 -0
  189. package/dist/locale/ru.d.ts +315 -0
  190. package/dist/locale/ru.js +52 -0
  191. package/dist/plugins/BlockPluginAbstract.d.ts +82 -0
  192. package/dist/plugins/BlockPluginAbstract.js +111 -0
  193. package/dist/plugins/README.md +44 -0
  194. package/dist/plugins/README.ru.md +40 -0
  195. package/dist/plugins/async.d.ts +35 -0
  196. package/dist/plugins/async.js +79 -0
  197. package/dist/plugins/attaches/README.md +86 -0
  198. package/dist/plugins/attaches/README.ru.md +87 -0
  199. package/dist/plugins/attaches/attaches.css +374 -0
  200. package/dist/plugins/attaches/index.d.ts +133 -0
  201. package/dist/plugins/attaches/index.js +921 -0
  202. package/dist/plugins/attaches/locale/en.d.ts +23 -0
  203. package/dist/plugins/attaches/locale/en.js +19 -0
  204. package/dist/plugins/attaches/locale/keys.d.ts +5 -0
  205. package/dist/plugins/attaches/locale/ru.d.ts +25 -0
  206. package/dist/plugins/attaches/locale/ru.js +19 -0
  207. package/dist/plugins/carousel/README.md +108 -0
  208. package/dist/plugins/carousel/README.ru.md +109 -0
  209. package/dist/plugins/carousel/carousel.css +198 -0
  210. package/dist/plugins/carousel/icons.d.ts +12 -0
  211. package/dist/plugins/carousel/icons.js +13 -0
  212. package/dist/plugins/carousel/index.d.ts +137 -0
  213. package/dist/plugins/carousel/index.js +859 -0
  214. package/dist/plugins/carousel/locale/en.d.ts +41 -0
  215. package/dist/plugins/carousel/locale/en.js +40 -0
  216. package/dist/plugins/carousel/locale/keys.d.ts +2 -0
  217. package/dist/plugins/carousel/locale/ru.d.ts +41 -0
  218. package/dist/plugins/carousel/locale/ru.js +40 -0
  219. package/dist/plugins/carousel/state.d.ts +29 -0
  220. package/dist/plugins/carousel/state.js +42 -0
  221. package/dist/plugins/checklist/README.md +54 -0
  222. package/dist/plugins/checklist/README.ru.md +55 -0
  223. package/dist/plugins/checklist/checklist.css +80 -0
  224. package/dist/plugins/checklist/index.d.ts +75 -0
  225. package/dist/plugins/checklist/index.js +407 -0
  226. package/dist/plugins/checklist/locale/en.d.ts +5 -0
  227. package/dist/plugins/checklist/locale/en.js +4 -0
  228. package/dist/plugins/checklist/locale/keys.d.ts +5 -0
  229. package/dist/plugins/checklist/locale/ru.d.ts +5 -0
  230. package/dist/plugins/checklist/locale/ru.js +4 -0
  231. package/dist/plugins/checklist/mapTextFields.d.ts +1 -0
  232. package/dist/plugins/checklist/mapTextFields.js +1 -0
  233. package/dist/plugins/code/README.md +59 -0
  234. package/dist/plugins/code/README.ru.md +60 -0
  235. package/dist/plugins/code/code.css +360 -0
  236. package/dist/plugins/code/index.d.ts +109 -0
  237. package/dist/plugins/code/index.js +1012 -0
  238. package/dist/plugins/code/locale/en.d.ts +11 -0
  239. package/dist/plugins/code/locale/en.js +10 -0
  240. package/dist/plugins/code/locale/keys.d.ts +5 -0
  241. package/dist/plugins/code/locale/ru.d.ts +11 -0
  242. package/dist/plugins/code/locale/ru.js +10 -0
  243. package/dist/plugins/columns/README.md +55 -0
  244. package/dist/plugins/columns/README.ru.md +56 -0
  245. package/dist/plugins/columns/columns.css +103 -0
  246. package/dist/plugins/columns/index.d.ts +58 -0
  247. package/dist/plugins/columns/index.js +236 -0
  248. package/dist/plugins/columns/locale/en.d.ts +6 -0
  249. package/dist/plugins/columns/locale/en.js +5 -0
  250. package/dist/plugins/columns/locale/keys.d.ts +5 -0
  251. package/dist/plugins/columns/locale/ru.d.ts +6 -0
  252. package/dist/plugins/columns/locale/ru.js +5 -0
  253. package/dist/plugins/delimiter/README.md +48 -0
  254. package/dist/plugins/delimiter/README.ru.md +49 -0
  255. package/dist/plugins/delimiter/delimiter.css +22 -0
  256. package/dist/plugins/delimiter/index.d.ts +38 -0
  257. package/dist/plugins/delimiter/index.js +69 -0
  258. package/dist/plugins/delimiter/locale/en.d.ts +4 -0
  259. package/dist/plugins/delimiter/locale/en.js +3 -0
  260. package/dist/plugins/delimiter/locale/keys.d.ts +5 -0
  261. package/dist/plugins/delimiter/locale/ru.d.ts +4 -0
  262. package/dist/plugins/delimiter/locale/ru.js +3 -0
  263. package/dist/plugins/embed/README.md +81 -0
  264. package/dist/plugins/embed/README.ru.md +82 -0
  265. package/dist/plugins/embed/embed.css +558 -0
  266. package/dist/plugins/embed/index.d.ts +271 -0
  267. package/dist/plugins/embed/index.js +967 -0
  268. package/dist/plugins/embed/locale/en.d.ts +20 -0
  269. package/dist/plugins/embed/locale/en.js +19 -0
  270. package/dist/plugins/embed/locale/keys.d.ts +5 -0
  271. package/dist/plugins/embed/locale/ru.d.ts +20 -0
  272. package/dist/plugins/embed/locale/ru.js +19 -0
  273. package/dist/plugins/embed/player.d.ts +1 -0
  274. package/dist/plugins/embed/player.js +1 -0
  275. package/dist/plugins/gallery/README.md +92 -0
  276. package/dist/plugins/gallery/README.ru.md +93 -0
  277. package/dist/plugins/gallery/css.d.ts +52 -0
  278. package/dist/plugins/gallery/css.js +67 -0
  279. package/dist/plugins/gallery/gallery.css +860 -0
  280. package/dist/plugins/gallery/icons.d.ts +13 -0
  281. package/dist/plugins/gallery/icons.js +45 -0
  282. package/dist/plugins/gallery/index.d.ts +126 -0
  283. package/dist/plugins/gallery/index.js +355 -0
  284. package/dist/plugins/gallery/layout.d.ts +35 -0
  285. package/dist/plugins/gallery/layout.js +79 -0
  286. package/dist/plugins/gallery/locale/en.d.ts +36 -0
  287. package/dist/plugins/gallery/locale/en.js +35 -0
  288. package/dist/plugins/gallery/locale/keys.d.ts +5 -0
  289. package/dist/plugins/gallery/locale/ru.d.ts +36 -0
  290. package/dist/plugins/gallery/locale/ru.js +35 -0
  291. package/dist/plugins/gallery/settings.d.ts +25 -0
  292. package/dist/plugins/gallery/settings.js +199 -0
  293. package/dist/plugins/gallery/slot.d.ts +73 -0
  294. package/dist/plugins/gallery/slot.js +260 -0
  295. package/dist/plugins/gallery/state.d.ts +67 -0
  296. package/dist/plugins/gallery/state.js +133 -0
  297. package/dist/plugins/gallery/styles.d.ts +10 -0
  298. package/dist/plugins/gallery/styles.js +24 -0
  299. package/dist/plugins/gallery/uploader.d.ts +31 -0
  300. package/dist/plugins/gallery/uploader.js +111 -0
  301. package/dist/plugins/gallery/view-empty.d.ts +41 -0
  302. package/dist/plugins/gallery/view-empty.js +56 -0
  303. package/dist/plugins/gallery/view-filled.d.ts +55 -0
  304. package/dist/plugins/gallery/view-filled.js +353 -0
  305. package/dist/plugins/heading/HeadingLevelSelect.d.ts +16 -0
  306. package/dist/plugins/heading/HeadingLevelSelect.js +183 -0
  307. package/dist/plugins/heading/README.md +58 -0
  308. package/dist/plugins/heading/README.ru.md +59 -0
  309. package/dist/plugins/heading/heading.css +76 -0
  310. package/dist/plugins/heading/index.d.ts +124 -0
  311. package/dist/plugins/heading/index.js +273 -0
  312. package/dist/plugins/heading/locale/en.d.ts +11 -0
  313. package/dist/plugins/heading/locale/en.js +10 -0
  314. package/dist/plugins/heading/locale/keys.d.ts +5 -0
  315. package/dist/plugins/heading/locale/ru.d.ts +11 -0
  316. package/dist/plugins/heading/locale/ru.js +10 -0
  317. package/dist/plugins/heading/mapTextFields.d.ts +1 -0
  318. package/dist/plugins/heading/mapTextFields.js +1 -0
  319. package/dist/plugins/image/README.md +93 -0
  320. package/dist/plugins/image/README.ru.md +94 -0
  321. package/dist/plugins/image/css.d.ts +47 -0
  322. package/dist/plugins/image/css.js +47 -0
  323. package/dist/plugins/image/icons.d.ts +13 -0
  324. package/dist/plugins/image/icons.js +26 -0
  325. package/dist/plugins/image/image.css +559 -0
  326. package/dist/plugins/image/index.d.ts +129 -0
  327. package/dist/plugins/image/index.js +346 -0
  328. package/dist/plugins/image/locale/en.d.ts +39 -0
  329. package/dist/plugins/image/locale/en.js +38 -0
  330. package/dist/plugins/image/locale/keys.d.ts +5 -0
  331. package/dist/plugins/image/locale/ru.d.ts +39 -0
  332. package/dist/plugins/image/locale/ru.js +38 -0
  333. package/dist/plugins/image/settings.d.ts +23 -0
  334. package/dist/plugins/image/settings.js +347 -0
  335. package/dist/plugins/image/state.d.ts +86 -0
  336. package/dist/plugins/image/state.js +151 -0
  337. package/dist/plugins/image/styles.d.ts +21 -0
  338. package/dist/plugins/image/styles.js +58 -0
  339. package/dist/plugins/image/uploader.d.ts +31 -0
  340. package/dist/plugins/image/uploader.js +92 -0
  341. package/dist/plugins/image/view-empty.d.ts +44 -0
  342. package/dist/plugins/image/view-empty.js +61 -0
  343. package/dist/plugins/image/view-filled.d.ts +49 -0
  344. package/dist/plugins/image/view-filled.js +282 -0
  345. package/dist/plugins/index.d.ts +21 -0
  346. package/dist/plugins/index.js +22 -0
  347. package/dist/plugins/link-preview/README.md +69 -0
  348. package/dist/plugins/link-preview/README.ru.md +70 -0
  349. package/dist/plugins/link-preview/index.d.ts +169 -0
  350. package/dist/plugins/link-preview/index.js +698 -0
  351. package/dist/plugins/link-preview/link-preview.css +254 -0
  352. package/dist/plugins/link-preview/locale/en.d.ts +14 -0
  353. package/dist/plugins/link-preview/locale/en.js +13 -0
  354. package/dist/plugins/link-preview/locale/keys.d.ts +5 -0
  355. package/dist/plugins/link-preview/locale/ru.d.ts +14 -0
  356. package/dist/plugins/link-preview/locale/ru.js +13 -0
  357. package/dist/plugins/list/README.md +59 -0
  358. package/dist/plugins/list/README.ru.md +60 -0
  359. package/dist/plugins/list/index.d.ts +134 -0
  360. package/dist/plugins/list/index.js +566 -0
  361. package/dist/plugins/list/list.css +57 -0
  362. package/dist/plugins/list/locale/en.d.ts +5 -0
  363. package/dist/plugins/list/locale/en.js +4 -0
  364. package/dist/plugins/list/locale/keys.d.ts +5 -0
  365. package/dist/plugins/list/locale/ru.d.ts +5 -0
  366. package/dist/plugins/list/locale/ru.js +4 -0
  367. package/dist/plugins/list/mapTextFields.d.ts +1 -0
  368. package/dist/plugins/list/mapTextFields.js +1 -0
  369. package/dist/plugins/paragraph/README.md +57 -0
  370. package/dist/plugins/paragraph/README.ru.md +58 -0
  371. package/dist/plugins/paragraph/index.d.ts +112 -0
  372. package/dist/plugins/paragraph/index.js +158 -0
  373. package/dist/plugins/paragraph/locale/en.d.ts +5 -0
  374. package/dist/plugins/paragraph/locale/en.js +4 -0
  375. package/dist/plugins/paragraph/locale/keys.d.ts +5 -0
  376. package/dist/plugins/paragraph/locale/ru.d.ts +5 -0
  377. package/dist/plugins/paragraph/locale/ru.js +4 -0
  378. package/dist/plugins/paragraph/mapTextFields.d.ts +1 -0
  379. package/dist/plugins/paragraph/mapTextFields.js +1 -0
  380. package/dist/plugins/paragraph/paragraph.css +56 -0
  381. package/dist/plugins/person/README.md +72 -0
  382. package/dist/plugins/person/README.ru.md +73 -0
  383. package/dist/plugins/person/index.d.ts +189 -0
  384. package/dist/plugins/person/index.js +777 -0
  385. package/dist/plugins/person/locale/en.d.ts +18 -0
  386. package/dist/plugins/person/locale/en.js +17 -0
  387. package/dist/plugins/person/locale/keys.d.ts +5 -0
  388. package/dist/plugins/person/locale/ru.d.ts +18 -0
  389. package/dist/plugins/person/locale/ru.js +17 -0
  390. package/dist/plugins/person/person.css +431 -0
  391. package/dist/plugins/person/socialResolver.d.ts +18 -0
  392. package/dist/plugins/person/socialResolver.js +69 -0
  393. package/dist/plugins/poll/README.md +96 -0
  394. package/dist/plugins/poll/README.ru.md +97 -0
  395. package/dist/plugins/poll/index.d.ts +134 -0
  396. package/dist/plugins/poll/index.js +825 -0
  397. package/dist/plugins/poll/locale/en.d.ts +23 -0
  398. package/dist/plugins/poll/locale/en.js +22 -0
  399. package/dist/plugins/poll/locale/keys.d.ts +5 -0
  400. package/dist/plugins/poll/locale/ru.d.ts +23 -0
  401. package/dist/plugins/poll/locale/ru.js +22 -0
  402. package/dist/plugins/poll/poll.css +400 -0
  403. package/dist/plugins/quote/README.md +55 -0
  404. package/dist/plugins/quote/README.ru.md +56 -0
  405. package/dist/plugins/quote/index.d.ts +81 -0
  406. package/dist/plugins/quote/index.js +165 -0
  407. package/dist/plugins/quote/locale/en.d.ts +6 -0
  408. package/dist/plugins/quote/locale/en.js +5 -0
  409. package/dist/plugins/quote/locale/keys.d.ts +5 -0
  410. package/dist/plugins/quote/locale/ru.d.ts +6 -0
  411. package/dist/plugins/quote/locale/ru.js +5 -0
  412. package/dist/plugins/quote/mapTextFields.d.ts +1 -0
  413. package/dist/plugins/quote/mapTextFields.js +1 -0
  414. package/dist/plugins/quote/quote.css +72 -0
  415. package/dist/plugins/raw/README.md +54 -0
  416. package/dist/plugins/raw/README.ru.md +55 -0
  417. package/dist/plugins/raw/index.d.ts +62 -0
  418. package/dist/plugins/raw/index.js +227 -0
  419. package/dist/plugins/raw/locale/en.d.ts +7 -0
  420. package/dist/plugins/raw/locale/en.js +6 -0
  421. package/dist/plugins/raw/locale/keys.d.ts +5 -0
  422. package/dist/plugins/raw/locale/ru.d.ts +7 -0
  423. package/dist/plugins/raw/locale/ru.js +6 -0
  424. package/dist/plugins/raw/raw.css +127 -0
  425. package/dist/plugins/shared/actionBar.d.ts +19 -0
  426. package/dist/plugins/shared/actionBar.js +35 -0
  427. package/dist/plugins/shared/dropzone.d.ts +106 -0
  428. package/dist/plugins/shared/dropzone.js +107 -0
  429. package/dist/plugins/shared/fileInput.d.ts +44 -0
  430. package/dist/plugins/shared/fileInput.js +62 -0
  431. package/dist/plugins/spoiler/README.md +55 -0
  432. package/dist/plugins/spoiler/README.ru.md +56 -0
  433. package/dist/plugins/spoiler/index.d.ts +61 -0
  434. package/dist/plugins/spoiler/index.js +169 -0
  435. package/dist/plugins/spoiler/locale/en.d.ts +7 -0
  436. package/dist/plugins/spoiler/locale/en.js +6 -0
  437. package/dist/plugins/spoiler/locale/keys.d.ts +5 -0
  438. package/dist/plugins/spoiler/locale/ru.d.ts +7 -0
  439. package/dist/plugins/spoiler/locale/ru.js +6 -0
  440. package/dist/plugins/spoiler/spoiler.css +101 -0
  441. package/dist/plugins/table/README.md +55 -0
  442. package/dist/plugins/table/README.ru.md +56 -0
  443. package/dist/plugins/table/index.d.ts +85 -0
  444. package/dist/plugins/table/index.js +399 -0
  445. package/dist/plugins/table/locale/en.d.ts +9 -0
  446. package/dist/plugins/table/locale/en.js +8 -0
  447. package/dist/plugins/table/locale/keys.d.ts +5 -0
  448. package/dist/plugins/table/locale/ru.d.ts +9 -0
  449. package/dist/plugins/table/locale/ru.js +8 -0
  450. package/dist/plugins/table/table.css +58 -0
  451. package/dist/plugins/toggle/README.md +56 -0
  452. package/dist/plugins/toggle/README.ru.md +57 -0
  453. package/dist/plugins/toggle/index.d.ts +69 -0
  454. package/dist/plugins/toggle/index.js +191 -0
  455. package/dist/plugins/toggle/locale/en.d.ts +7 -0
  456. package/dist/plugins/toggle/locale/en.js +6 -0
  457. package/dist/plugins/toggle/locale/keys.d.ts +5 -0
  458. package/dist/plugins/toggle/locale/ru.d.ts +7 -0
  459. package/dist/plugins/toggle/locale/ru.js +6 -0
  460. package/dist/plugins/toggle/toggle.css +101 -0
  461. package/dist/plugins/warning/README.md +55 -0
  462. package/dist/plugins/warning/README.ru.md +56 -0
  463. package/dist/plugins/warning/index.d.ts +66 -0
  464. package/dist/plugins/warning/index.js +167 -0
  465. package/dist/plugins/warning/locale/en.d.ts +6 -0
  466. package/dist/plugins/warning/locale/en.js +5 -0
  467. package/dist/plugins/warning/locale/keys.d.ts +5 -0
  468. package/dist/plugins/warning/locale/ru.d.ts +6 -0
  469. package/dist/plugins/warning/locale/ru.js +5 -0
  470. package/dist/plugins/warning/warning.css +63 -0
  471. package/dist/renderer/async.d.ts +1 -0
  472. package/dist/renderer/async.js +7 -0
  473. package/dist/renderer/errors.d.ts +27 -0
  474. package/dist/renderer/errors.js +48 -0
  475. package/dist/renderer/index.d.ts +82 -0
  476. package/dist/renderer/index.js +413 -0
  477. package/dist/renderer/inline.d.ts +5 -0
  478. package/dist/renderer/inline.js +61 -0
  479. package/dist/renderer/locale/en.d.ts +35 -0
  480. package/dist/renderer/locale/en.js +29 -0
  481. package/dist/renderer/locale/ru.d.ts +37 -0
  482. package/dist/renderer/locale/ru.js +29 -0
  483. package/dist/renderer/renderers/README.md +7 -0
  484. package/dist/renderer/renderers/README.ru.md +5 -0
  485. package/dist/renderer/renderers/async.d.ts +51 -0
  486. package/dist/renderer/renderers/async.js +99 -0
  487. package/dist/renderer/renderers/attaches/README.md +48 -0
  488. package/dist/renderer/renderers/attaches/README.ru.md +48 -0
  489. package/dist/renderer/renderers/attaches/index.d.ts +37 -0
  490. package/dist/renderer/renderers/attaches/index.js +451 -0
  491. package/dist/renderer/renderers/attaches/locale/en.d.ts +11 -0
  492. package/dist/renderer/renderers/attaches/locale/en.js +7 -0
  493. package/dist/renderer/renderers/attaches/locale/ru.d.ts +13 -0
  494. package/dist/renderer/renderers/attaches/locale/ru.js +7 -0
  495. package/dist/renderer/renderers/attaches/styles.css +196 -0
  496. package/dist/renderer/renderers/carousel/README.md +43 -0
  497. package/dist/renderer/renderers/carousel/README.ru.md +43 -0
  498. package/dist/renderer/renderers/carousel/index.d.ts +7 -0
  499. package/dist/renderer/renderers/carousel/index.js +110 -0
  500. package/dist/renderer/renderers/carousel/styles.css +7 -0
  501. package/dist/renderer/renderers/checklist/README.md +33 -0
  502. package/dist/renderer/renderers/checklist/README.ru.md +33 -0
  503. package/dist/renderer/renderers/checklist/index.d.ts +7 -0
  504. package/dist/renderer/renderers/checklist/index.js +55 -0
  505. package/dist/renderer/renderers/checklist/styles.css +54 -0
  506. package/dist/renderer/renderers/code/README.md +33 -0
  507. package/dist/renderer/renderers/code/README.ru.md +33 -0
  508. package/dist/renderer/renderers/code/index.d.ts +9 -0
  509. package/dist/renderer/renderers/code/index.js +137 -0
  510. package/dist/renderer/renderers/code/locale/en.d.ts +5 -0
  511. package/dist/renderer/renderers/code/locale/en.js +4 -0
  512. package/dist/renderer/renderers/code/locale/ru.d.ts +5 -0
  513. package/dist/renderer/renderers/code/locale/ru.js +4 -0
  514. package/dist/renderer/renderers/code/styles.css +330 -0
  515. package/dist/renderer/renderers/columns/README.md +33 -0
  516. package/dist/renderer/renderers/columns/README.ru.md +33 -0
  517. package/dist/renderer/renderers/columns/index.d.ts +7 -0
  518. package/dist/renderer/renderers/columns/index.js +53 -0
  519. package/dist/renderer/renderers/columns/styles.css +5 -0
  520. package/dist/renderer/renderers/delimiter/README.md +33 -0
  521. package/dist/renderer/renderers/delimiter/README.ru.md +33 -0
  522. package/dist/renderer/renderers/delimiter/index.d.ts +7 -0
  523. package/dist/renderer/renderers/delimiter/index.js +28 -0
  524. package/dist/renderer/renderers/delimiter/styles.css +12 -0
  525. package/dist/renderer/renderers/embed/README.md +35 -0
  526. package/dist/renderer/renderers/embed/README.ru.md +35 -0
  527. package/dist/renderer/renderers/embed/index.d.ts +8 -0
  528. package/dist/renderer/renderers/embed/index.js +66 -0
  529. package/dist/renderer/renderers/embed/styles.css +217 -0
  530. package/dist/renderer/renderers/gallery/README.md +41 -0
  531. package/dist/renderer/renderers/gallery/README.ru.md +41 -0
  532. package/dist/renderer/renderers/gallery/index.d.ts +8 -0
  533. package/dist/renderer/renderers/gallery/index.js +329 -0
  534. package/dist/renderer/renderers/gallery/styles.css +419 -0
  535. package/dist/renderer/renderers/heading/README.md +33 -0
  536. package/dist/renderer/renderers/heading/README.ru.md +33 -0
  537. package/dist/renderer/renderers/heading/index.d.ts +8 -0
  538. package/dist/renderer/renderers/heading/index.js +38 -0
  539. package/dist/renderer/renderers/heading/styles.css +26 -0
  540. package/dist/renderer/renderers/image/README.md +42 -0
  541. package/dist/renderer/renderers/image/README.ru.md +42 -0
  542. package/dist/renderer/renderers/image/index.d.ts +7 -0
  543. package/dist/renderer/renderers/image/index.js +93 -0
  544. package/dist/renderer/renderers/image/styles.css +40 -0
  545. package/dist/renderer/renderers/index.d.ts +47 -0
  546. package/dist/renderer/renderers/index.js +125 -0
  547. package/dist/renderer/renderers/link-preview/README.md +43 -0
  548. package/dist/renderer/renderers/link-preview/README.ru.md +43 -0
  549. package/dist/renderer/renderers/link-preview/index.d.ts +9 -0
  550. package/dist/renderer/renderers/link-preview/index.js +118 -0
  551. package/dist/renderer/renderers/link-preview/styles.css +246 -0
  552. package/dist/renderer/renderers/list/README.md +33 -0
  553. package/dist/renderer/renderers/list/README.ru.md +33 -0
  554. package/dist/renderer/renderers/list/index.d.ts +8 -0
  555. package/dist/renderer/renderers/list/index.js +42 -0
  556. package/dist/renderer/renderers/list/styles.css +20 -0
  557. package/dist/renderer/renderers/paragraph/README.md +33 -0
  558. package/dist/renderer/renderers/paragraph/README.ru.md +33 -0
  559. package/dist/renderer/renderers/paragraph/index.d.ts +7 -0
  560. package/dist/renderer/renderers/paragraph/index.js +35 -0
  561. package/dist/renderer/renderers/paragraph/styles.css +3 -0
  562. package/dist/renderer/renderers/person/README.md +44 -0
  563. package/dist/renderer/renderers/person/README.ru.md +44 -0
  564. package/dist/renderer/renderers/person/index.d.ts +7 -0
  565. package/dist/renderer/renderers/person/index.js +213 -0
  566. package/dist/renderer/renderers/person/locale/en.d.ts +6 -0
  567. package/dist/renderer/renderers/person/locale/en.js +5 -0
  568. package/dist/renderer/renderers/person/locale/ru.d.ts +6 -0
  569. package/dist/renderer/renderers/person/locale/ru.js +5 -0
  570. package/dist/renderer/renderers/person/styles.css +47 -0
  571. package/dist/renderer/renderers/poll/README.md +68 -0
  572. package/dist/renderer/renderers/poll/README.ru.md +68 -0
  573. package/dist/renderer/renderers/poll/index.d.ts +9 -0
  574. package/dist/renderer/renderers/poll/index.js +339 -0
  575. package/dist/renderer/renderers/poll/styles.css +148 -0
  576. package/dist/renderer/renderers/quote/README.md +33 -0
  577. package/dist/renderer/renderers/quote/README.ru.md +33 -0
  578. package/dist/renderer/renderers/quote/index.d.ts +7 -0
  579. package/dist/renderer/renderers/quote/index.js +59 -0
  580. package/dist/renderer/renderers/quote/styles.css +43 -0
  581. package/dist/renderer/renderers/raw/README.md +33 -0
  582. package/dist/renderer/renderers/raw/README.ru.md +33 -0
  583. package/dist/renderer/renderers/raw/index.d.ts +7 -0
  584. package/dist/renderer/renderers/raw/index.js +27 -0
  585. package/dist/renderer/renderers/spoiler/README.md +33 -0
  586. package/dist/renderer/renderers/spoiler/README.ru.md +33 -0
  587. package/dist/renderer/renderers/spoiler/index.d.ts +9 -0
  588. package/dist/renderer/renderers/spoiler/index.js +84 -0
  589. package/dist/renderer/renderers/spoiler/locale/en.d.ts +4 -0
  590. package/dist/renderer/renderers/spoiler/locale/en.js +3 -0
  591. package/dist/renderer/renderers/spoiler/locale/ru.d.ts +4 -0
  592. package/dist/renderer/renderers/spoiler/locale/ru.js +3 -0
  593. package/dist/renderer/renderers/spoiler/styles.css +61 -0
  594. package/dist/renderer/renderers/table/README.md +33 -0
  595. package/dist/renderer/renderers/table/README.ru.md +33 -0
  596. package/dist/renderer/renderers/table/index.d.ts +7 -0
  597. package/dist/renderer/renderers/table/index.js +83 -0
  598. package/dist/renderer/renderers/table/styles.css +34 -0
  599. package/dist/renderer/renderers/toggle/README.md +33 -0
  600. package/dist/renderer/renderers/toggle/README.ru.md +33 -0
  601. package/dist/renderer/renderers/toggle/index.d.ts +7 -0
  602. package/dist/renderer/renderers/toggle/index.js +59 -0
  603. package/dist/renderer/renderers/toggle/styles.css +49 -0
  604. package/dist/renderer/renderers/warning/README.md +33 -0
  605. package/dist/renderer/renderers/warning/README.ru.md +33 -0
  606. package/dist/renderer/renderers/warning/index.d.ts +7 -0
  607. package/dist/renderer/renderers/warning/index.js +62 -0
  608. package/dist/renderer/renderers/warning/styles.css +41 -0
  609. package/dist/renderer/styles/base.css +168 -0
  610. package/dist/renderer/types.d.ts +464 -0
  611. package/dist/shared/blockDataNormalizers.d.ts +14 -0
  612. package/dist/shared/blockDataNormalizers.js +235 -0
  613. package/dist/shared/blockDataValidators.d.ts +81 -0
  614. package/dist/shared/blockDataValidators.js +313 -0
  615. package/dist/shared/blockTypes.d.ts +2 -0
  616. package/dist/shared/blockTypes.js +26 -0
  617. package/dist/shared/carouselData.d.ts +34 -0
  618. package/dist/shared/carouselData.js +111 -0
  619. package/dist/shared/cloneEditorData.d.ts +11 -0
  620. package/dist/shared/cloneEditorData.js +20 -0
  621. package/dist/shared/documentTypes.d.ts +35 -0
  622. package/dist/shared/embedPlayer.d.ts +42 -0
  623. package/dist/shared/embedPlayer.js +141 -0
  624. package/dist/shared/fileUtils.d.ts +33 -0
  625. package/dist/shared/fileUtils.js +109 -0
  626. package/dist/shared/highlightRuntime.d.ts +38 -0
  627. package/dist/shared/highlightRuntime.js +75 -0
  628. package/dist/shared/inlineMarshal.d.ts +82 -0
  629. package/dist/shared/inlineMarshal.js +215 -0
  630. package/dist/shared/jsonData.d.ts +11 -0
  631. package/dist/shared/jsonData.js +53 -0
  632. package/dist/shared/localeTypes.d.ts +11 -0
  633. package/dist/shared/mapTextFields.d.ts +89 -0
  634. package/dist/shared/mapTextFields.js +119 -0
  635. package/dist/shared/pollData.d.ts +90 -0
  636. package/dist/shared/pollData.js +231 -0
  637. package/dist/shared/resolvePath.d.ts +8 -0
  638. package/dist/shared/resolvePath.js +10 -0
  639. package/dist/shared/runtime/dompurify.js +2424 -0
  640. package/dist/shared/runtime/highlightBundle.js +10 -0
  641. package/dist/shared/runtime/jszip.js +13 -0
  642. package/dist/shared/sanitize/allowlist.d.ts +21 -0
  643. package/dist/shared/sanitize/allowlist.js +40 -0
  644. package/dist/shared/sanitize/escapeHtml.d.ts +6 -0
  645. package/dist/shared/sanitize/escapeHtml.js +11 -0
  646. package/dist/shared/sanitize/index.d.ts +8 -0
  647. package/dist/shared/sanitize/index.js +8 -0
  648. package/dist/shared/sanitize/parseInline.d.ts +11 -0
  649. package/dist/shared/sanitize/parseInline.js +25 -0
  650. package/dist/shared/sanitize/sanitizeHtml.d.ts +8 -0
  651. package/dist/shared/sanitize/sanitizeHtml.js +19 -0
  652. package/dist/shared/sanitize/sanitizeRawHtml.d.ts +15 -0
  653. package/dist/shared/sanitize/sanitizeRawHtml.js +162 -0
  654. package/dist/shared/sanitize/sanitizeStyle.d.ts +9 -0
  655. package/dist/shared/sanitize/sanitizeStyle.js +39 -0
  656. package/dist/shared/sanitize/sanitizeUrl.d.ts +28 -0
  657. package/dist/shared/sanitize/sanitizeUrl.js +86 -0
  658. package/dist/shared/sanitize/walker.d.ts +15 -0
  659. package/dist/shared/sanitize/walker.js +98 -0
  660. package/dist/shared/styleRegistry.d.ts +4 -0
  661. package/dist/shared/styleRegistry.js +38 -0
  662. package/dist/shared/textFormat.d.ts +32 -0
  663. package/dist/shared/textFormat.js +48 -0
  664. package/dist/shared/zipRuntime.d.ts +19 -0
  665. package/dist/shared/zipRuntime.js +54 -0
  666. package/dist/styles/editor.css +3 -0
  667. package/dist/types.d.ts +1 -0
  668. package/package.json +149 -0
@@ -0,0 +1,456 @@
1
+ import { el } from '../dom.js'
2
+ import { Tooltip } from '../Tooltip.js'
3
+ import { EditorEvent } from '../editorEvents.js'
4
+ import { ActionsPanel } from './ActionsPanel.js'
5
+ import { InlinePositioner } from './InlinePositioner.js'
6
+ import { PluginControlsSlot } from './PluginControlsSlot.js'
7
+ import { SelectionTracker } from './SelectionTracker.js'
8
+
9
+ const VIEW_BUTTONS = 'buttons'
10
+ const VIEW_ACTIONS = 'actions'
11
+
12
+ /**
13
+ * Format a keyboard shortcut for display in tooltips.
14
+ * @param {string} combo
15
+ * @returns {string}
16
+ */
17
+ function formatShortcut(combo) {
18
+ if (!combo) return ''
19
+ // noinspection JSDeprecatedSymbols — navigator.platform is needed as a fallback for older browsers.
20
+ const isMac = typeof navigator !== 'undefined'
21
+ && /Mac|iPhone|iPad/.test(navigator.userAgent || navigator.platform || '')
22
+ const parts = combo.split('+')
23
+ const formatted = parts.map((p) => {
24
+ if (p === 'Mod') return isMac ? '⌘' : 'Ctrl'
25
+ if (p === 'Shift') return isMac ? '⇧' : 'Shift'
26
+ if (p === 'Alt') return isMac ? '⌥' : 'Alt'
27
+ return p
28
+ })
29
+ return isMac ? formatted.join('') : formatted.join('+')
30
+ }
31
+
32
+ /**
33
+ * Floating toolbar that appears above non-collapsed text selections.
34
+ *
35
+ * Coordinates four collaborators:
36
+ * - `SelectionTracker` — when to show/hide based on the user's selection
37
+ * - `InlinePositioner` — where to render relative to the selection rect
38
+ * - `PluginControlsSlot` — plugin-provided buttons (e.g. heading level)
39
+ * - `ActionsPanel` — drill-down panels for tools that need a UI
40
+ * (link editor, font size, etc.)
41
+ *
42
+ * The Toolbar itself owns the lifecycle, the buttons panel build, and the
43
+ * public API (`show`, `hide`, `openTool`, `destroy`).
44
+ */
45
+ export class InlineToolbar {
46
+ /** @type {HTMLElement} */
47
+ #rootEl
48
+
49
+ /** @type {import('../types').ISelectionManager} */
50
+ #selection
51
+
52
+ /** @type {import('../types').IBlockManager} */
53
+ #blocks
54
+
55
+ /** @type {import('../types').IEventBus} */
56
+ #events
57
+
58
+ /** @type {import('../types').InlineTool[]} */
59
+ #tools
60
+
61
+ /** @type {import('../types').ICrossBlockSelection} */
62
+ #crossBlockSelection
63
+
64
+ /** @type {HTMLElement} */
65
+ #el
66
+
67
+ /** @type {HTMLElement} */
68
+ #buttonsPanel
69
+
70
+ /** @type {Map<string, HTMLElement>} */
71
+ #buttons = new Map()
72
+
73
+ /** @type {boolean} */
74
+ #visible = false
75
+
76
+ /** @type {'buttons' | 'actions'} */
77
+ #currentView = VIEW_BUTTONS
78
+
79
+ /** @type {Tooltip} */
80
+ #tooltip
81
+
82
+ /** @type {import('../TypeSelector').TypeSelector} */
83
+ #typeSelector
84
+
85
+ /** @type {ActionsPanel} */
86
+ #actionsPanel
87
+
88
+ /** @type {InlinePositioner} */
89
+ #positioner
90
+
91
+ /** @type {PluginControlsSlot} */
92
+ #pluginControls
93
+
94
+ /** @type {SelectionTracker} */
95
+ #selectionTracker
96
+
97
+ /** @type {import('../CommandDispatcher').CommandDispatcher} */
98
+ #mutations
99
+
100
+ /** @type {import('../types').InlineMutationContext} */
101
+ #mutationContext
102
+
103
+ /**
104
+ * @param {HTMLElement} rootEl
105
+ * @param {import('../types').ISelectionManager} selection
106
+ * @param {import('../types').IBlockManager} blocks
107
+ * @param {import('../types').IEventBus} events
108
+ * @param {import('../types').InlineTool[]} tools
109
+ * @param {(type: string) => import('../types').BlockPlugin['renderInlineControls'] | undefined} getInlineControls
110
+ * @param {import('../TypeSelector').TypeSelector} typeSelector
111
+ * @param {import('../types').ICrossBlockSelection} crossBlockSelection
112
+ * @param {import('../CommandDispatcher').CommandDispatcher} commands
113
+ */
114
+ constructor(rootEl, selection, blocks, events, tools, getInlineControls, typeSelector, crossBlockSelection, commands) {
115
+ this.#rootEl = rootEl
116
+ this.#selection = selection
117
+ this.#blocks = blocks
118
+ this.#events = events
119
+ this.#tools = tools
120
+ this.#crossBlockSelection = crossBlockSelection
121
+ this.#typeSelector = typeSelector
122
+ this.#tooltip = new Tooltip()
123
+ this.#mutations = commands
124
+ this.#mutationContext = {
125
+ mutate: (range, operation) => this.#mutations.runForRange(range, operation),
126
+ }
127
+
128
+ // ── DOM scaffold ─────────────────────────────────────────────────────────
129
+ this.#el = el('div', 'oe-inline-toolbar')
130
+ this.#el.style.display = 'none'
131
+
132
+ this.#buttonsPanel = el('div', 'oe-inline-toolbar__panel')
133
+
134
+ // Type selector is injected (constructed in createEditor with the full
135
+ // plugin map; InlineToolbar deliberately doesn't depend on that).
136
+ this.#typeSelector.onConvert = () => {
137
+ this.#typeSelector.update()
138
+ this.hide()
139
+ }
140
+ this.#buttonsPanel.appendChild(this.#typeSelector.selectButton)
141
+
142
+ // Divider after type selector.
143
+ this.#buttonsPanel.appendChild(el('div', 'oe-inline-toolbar__divider'))
144
+
145
+ // Plugin controls zone (filled by the focused block's plugin, if any).
146
+ const pluginZone = el('div', 'oe-inline-toolbar__plugin-zone')
147
+ const pluginDivider = el('div', 'oe-inline-toolbar__divider')
148
+ pluginDivider.style.display = 'none'
149
+ this.#buttonsPanel.appendChild(pluginZone)
150
+ this.#buttonsPanel.appendChild(pluginDivider)
151
+
152
+ // Tool buttons.
153
+ this.#buildToolButtons()
154
+
155
+ this.#el.appendChild(this.#buttonsPanel)
156
+ this.#el.appendChild(this.#typeSelector.dropdownElement)
157
+ rootEl.appendChild(this.#el)
158
+
159
+ // ── Collaborators ────────────────────────────────────────────────────────
160
+ this.#positioner = new InlinePositioner(this.#el, rootEl)
161
+
162
+ this.#actionsPanel = new ActionsPanel({
163
+ events,
164
+ crossBlockSelection,
165
+ tooltip: this.#tooltip,
166
+ updateActiveStates: () => this.#updateActiveStates(),
167
+ hideTypeSelector: () => this.#typeSelector.close(),
168
+ mutate: (range, operation) => this.#mutations.runForRange(range, operation),
169
+ // After the drill-down panel closes, restore the buttons view so the
170
+ // toolbar visually reappears (otherwise it stays stuck in actions mode
171
+ // with nothing inside, which looks like the toolbar disappeared).
172
+ onClosed: () => {
173
+ this.#currentView = VIEW_BUTTONS
174
+ this.#buttonsPanel.style.display = ''
175
+ },
176
+ })
177
+
178
+ this.#pluginControls = new PluginControlsSlot(pluginZone, pluginDivider, {
179
+ blocks,
180
+ getInlineControls,
181
+ events,
182
+ typeSelector: this.#typeSelector,
183
+ setSuppressSelectionChange: (value) => this.#selectionTracker.setSuppressSelectionChange(value),
184
+ mutations: this.#mutations,
185
+ })
186
+
187
+ this.#selectionTracker = new SelectionTracker(this.#el, {
188
+ rootEl,
189
+ blocks,
190
+ crossBlockSelection,
191
+ show: () => this.show(),
192
+ hide: () => this.hide(),
193
+ updateActiveStates: () => this.#updateActiveStates(),
194
+ isInActionsView: () => this.#currentView === VIEW_ACTIONS,
195
+ isTypeSelectorOpen: () => this.#typeSelector.isOpen,
196
+ hasOpenToolDropdown: () => this.#hasOpenToolDropdown(),
197
+ })
198
+
199
+ // Notify tools after DOM is fully assembled.
200
+ for (const tool of this.#tools) {
201
+ const btn = this.#buttons.get(tool.type)
202
+ if (tool.onMount && btn) tool.onMount(btn, this.#mutationContext)
203
+ }
204
+ }
205
+
206
+ // ── Public API ─────────────────────────────────────────────────────────────
207
+
208
+ /** @returns {boolean} */
209
+ // noinspection JSUnusedGlobalSymbols
210
+ get isVisible() {
211
+ return this.#visible
212
+ }
213
+
214
+ show() {
215
+ this.#visible = true
216
+ this.#currentView = VIEW_BUTTONS
217
+ this.#buttonsPanel.style.display = ''
218
+ this.#actionsPanel.reset()
219
+ this.#typeSelector.close()
220
+ this.#tooltip.hide()
221
+ this.#typeSelector.update()
222
+ this.#pluginControls.update()
223
+ this.#el.style.display = ''
224
+ this.#updateActiveStates()
225
+ this.#positioner.position()
226
+ this.#events.emit(EditorEvent.TOOLBAR_OPENED, { type: 'inline' })
227
+ }
228
+
229
+ hide() {
230
+ if (!this.#visible) return
231
+ // Don't hide while a cross-block selection is active.
232
+ if (this.#crossBlockSelection.range) return
233
+ this.#visible = false
234
+ this.#currentView = VIEW_BUTTONS
235
+ this.#el.style.display = 'none'
236
+ this.#buttonsPanel.style.display = ''
237
+ this.#actionsPanel.reset()
238
+ this.#typeSelector.close()
239
+ this.#pluginControls.clear()
240
+ this.#tooltip.hide()
241
+ this.#events.emit(EditorEvent.TOOLBAR_CLOSED, { type: 'inline' })
242
+ }
243
+
244
+ /**
245
+ * Programmatically open a tool by name (e.g. from a keyboard shortcut).
246
+ * @param {string} toolName
247
+ */
248
+ openTool(toolName) {
249
+ const sel = this.#resolveSelection()
250
+ if (!sel) return
251
+
252
+ if (sel.blockId) {
253
+ const block = this.#blocks.getBlockById(sel.blockId)
254
+ if (!block?.hasInlineTools) return
255
+ }
256
+
257
+ const allowedTypes = this.#resolveAllowedToolTypes(sel)
258
+ if (allowedTypes && !allowedTypes.has(toolName)) return
259
+
260
+ const tool = this.#tools.find((t) => t.type === toolName)
261
+ if (!tool) return
262
+
263
+ if (!this.#visible) this.show()
264
+
265
+ if (tool.renderActions) {
266
+ this.#openActions(tool)
267
+ } else {
268
+ this.#mutations.runForRange(sel.range, () => tool.toggle(sel))
269
+ this.#updateActiveStates()
270
+ }
271
+ }
272
+
273
+ /**
274
+ * Returns true when the inline toolbar has an interactive UI open
275
+ * (actions panel or a tool dropdown like font-size).
276
+ * Used by KeyboardManager to yield control to the overlay.
277
+ * @returns {boolean}
278
+ */
279
+ hasActiveUI() {
280
+ return this.#currentView === VIEW_ACTIONS || this.#hasOpenToolDropdown()
281
+ }
282
+
283
+ destroy() {
284
+ this.#selectionTracker.destroy()
285
+ this.#pluginControls.clear()
286
+
287
+ for (const tool of this.#tools) {
288
+ tool.destroy?.()
289
+ }
290
+
291
+ this.#typeSelector.destroy()
292
+ this.#tooltip.destroy()
293
+ this.#el.remove()
294
+ }
295
+
296
+ // ── Tool button construction ───────────────────────────────────────────────
297
+
298
+ #buildToolButtons() {
299
+ for (const tool of this.#tools) {
300
+ const btn = el('button', 'oe-inline-tool', {
301
+ type: 'button',
302
+ 'data-tool': tool.type,
303
+ })
304
+ btn.innerHTML = tool.icon
305
+
306
+ btn.addEventListener('mouseenter', () => {
307
+ const active = btn.classList.contains('oe-inline-tool--active')
308
+ const label = tool.getTitle?.(active) ?? tool.title ?? tool.type
309
+ const shortcut = tool.shortcut ? formatShortcut(tool.shortcut) : undefined
310
+ this.#tooltip.show(btn, label, shortcut)
311
+ })
312
+ btn.addEventListener('mouseleave', () => this.#tooltip.hide())
313
+
314
+ btn.addEventListener('mousedown', (e) => {
315
+ e.preventDefault()
316
+ e.stopPropagation()
317
+ })
318
+
319
+ btn.addEventListener('click', (e) => {
320
+ e.preventDefault()
321
+ e.stopPropagation()
322
+ this.#tooltip.hide()
323
+
324
+ // Close any open dropdowns first.
325
+ this.#typeSelector.close()
326
+
327
+ const sel = this.#resolveSelection()
328
+ const allowedTypes = sel ? this.#resolveAllowedToolTypes(sel) : null
329
+ if (allowedTypes && !allowedTypes.has(tool.type)) return
330
+ if (tool.renderActions) {
331
+ this.#openActions(tool)
332
+ } else {
333
+ // Clear any block-selection overlay (Ctrl+A) to prevent double-highlight.
334
+ this.#blocks.clearSelection()
335
+ if (sel) this.#mutations.runForRange(sel.range, () => tool.toggle(sel))
336
+ this.#updateActiveStates()
337
+ }
338
+ })
339
+
340
+ this.#buttonsPanel.appendChild(btn)
341
+ this.#buttons.set(tool.type, btn)
342
+ }
343
+ }
344
+
345
+ // ── Internal helpers ───────────────────────────────────────────────────────
346
+
347
+ /**
348
+ * Open a tool's actions panel (drill-down view) — or fall back to toggle
349
+ * semantics if the tool returns null from `renderActions`.
350
+ *
351
+ * @param {import('../types').InlineTool} tool
352
+ */
353
+ #openActions(tool) {
354
+ const panel = this.#actionsPanel.open(tool)
355
+ if (!panel) {
356
+ // The tool wants toggle semantics rather than a panel.
357
+ const sel = this.#selection.getSelection() ?? this.#resolveSelection()
358
+ if (sel) {
359
+ this.#mutations.runForRange(sel.range, () => tool.toggle(sel))
360
+ this.#updateActiveStates()
361
+ }
362
+ return
363
+ }
364
+
365
+ this.#currentView = VIEW_ACTIONS
366
+ this.#buttonsPanel.style.display = 'none'
367
+ this.#el.appendChild(panel)
368
+ }
369
+
370
+ /** @returns {import('../types').InlineSelection | null} */
371
+ #resolveSelection() {
372
+ const crossRange = this.#crossBlockSelection.range
373
+ if (crossRange) {
374
+ return { range: crossRange, text: crossRange.toString(), blockId: '' }
375
+ }
376
+ const sel = this.#selection.getSelection()
377
+ if (sel) return sel
378
+ const nativeSel = window.getSelection()
379
+ if (nativeSel && !nativeSel.isCollapsed && nativeSel.rangeCount > 0) {
380
+ return { range: nativeSel.getRangeAt(0), text: nativeSel.toString(), blockId: '' }
381
+ }
382
+ return null
383
+ }
384
+
385
+ #updateActiveStates() {
386
+ const selection = this.#resolveSelection()
387
+ const allowedTypes = selection ? this.#resolveAllowedToolTypes(selection) : null
388
+
389
+ for (const tool of this.#tools) {
390
+ const btn = this.#buttons.get(tool.type)
391
+ if (!btn) continue
392
+
393
+ const allowed = !allowedTypes || allowedTypes.has(tool.type)
394
+ btn.hidden = !allowed
395
+ if (!allowed) {
396
+ btn.classList.remove('oe-inline-tool--active')
397
+ continue
398
+ }
399
+
400
+ let active = false
401
+ if (selection && tool.isActive) {
402
+ active = tool.isActive(selection)
403
+ }
404
+ btn.classList.toggle('oe-inline-tool--active', active)
405
+
406
+ // Update dynamic icon if the tool provides one (e.g. alignment, link toggle).
407
+ if (tool.getIcon) {
408
+ btn.innerHTML = tool.getIcon(active)
409
+ }
410
+ }
411
+ }
412
+
413
+ /**
414
+ * Intersect per-block tool allowlists across the selected range.
415
+ * null means every editor-configured tool is allowed.
416
+ * @param {import('../types').InlineSelection} selection
417
+ * @returns {Set<string> | null}
418
+ */
419
+ #resolveAllowedToolTypes(selection) {
420
+ const startBlock = selection.blockId
421
+ ? this.#blocks.getBlockById(selection.blockId)
422
+ : this.#blocks.getBlockByChildNode(selection.range.startContainer)
423
+ const endBlock = this.#blocks.getBlockByChildNode(selection.range.endContainer) ?? startBlock
424
+ if (!startBlock) return null
425
+
426
+ const startIndex = this.#blocks.getBlockIndex(startBlock.id)
427
+ const endIndex = endBlock ? this.#blocks.getBlockIndex(endBlock.id) : startIndex
428
+ if (startIndex < 0 || endIndex < 0) return null
429
+ const from = Math.min(startIndex, endIndex)
430
+ const to = Math.max(startIndex, endIndex)
431
+ /** @type {Set<string> | null} */
432
+ let allowed = null
433
+
434
+ for (let index = from; index <= to; index++) {
435
+ const block = this.#blocks.getBlockByIndex(index)
436
+ const blockTypes = block?.inlineToolTypes
437
+ if (!blockTypes) continue
438
+
439
+ const blockSet = new Set(blockTypes)
440
+ if (allowed === null) {
441
+ allowed = blockSet
442
+ } else {
443
+ for (const type of allowed) {
444
+ if (!blockSet.has(type)) allowed.delete(type)
445
+ }
446
+ }
447
+ }
448
+
449
+ return allowed
450
+ }
451
+
452
+ /** @returns {boolean} true if any tool has an open dropdown */
453
+ #hasOpenToolDropdown() {
454
+ return this.#tools.some((t) => t.isDropdownOpen?.())
455
+ }
456
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @typedef {Object} PluginControlsSlotDeps
3
+ * @property {import('../types.js').IBlockManager} blocks
4
+ * @property {(type: string) => import('../types.js').BlockPlugin['renderInlineControls'] | undefined} getInlineControls
5
+ * @property {import('../types.js').IEventBus} events
6
+ * @property {import('../TypeSelector.js').TypeSelector} typeSelector
7
+ * @property {(suppress: boolean) => void} setSuppressSelectionChange
8
+ * @property {import('../CommandDispatcher.js').CommandDispatcher} mutations
9
+ * Hint to the SelectionTracker to skip the next few selectionchange events
10
+ * (used while a plugin control swaps the contenteditable element).
11
+ */
12
+ /**
13
+ * The "plugin controls" zone in the inline toolbar — the area where each
14
+ * block plugin can render its own buttons (e.g. heading level switcher,
15
+ * paragraph alignment).
16
+ *
17
+ * Owns mounting/unmounting of the current plugin's control group:
18
+ * builds an `InlineControlContext`, calls `plugin.renderInlineControls`,
19
+ * appends returned elements into `pluginZone`, and tears them down
20
+ * (calling the group's optional `destroy()`) when the focus moves to
21
+ * a block whose plugin doesn't provide controls.
22
+ */
23
+ export class PluginControlsSlot {
24
+ /**
25
+ * @param {HTMLElement} zoneEl container that holds the rendered controls
26
+ * @param {HTMLElement} dividerEl divider element shown only when controls are present
27
+ * @param {PluginControlsSlotDeps} deps
28
+ */
29
+ constructor(zoneEl: HTMLElement, dividerEl: HTMLElement, deps: PluginControlsSlotDeps);
30
+ /**
31
+ * Re-query the current block's plugin and render its inline controls.
32
+ * Idempotent — clears any existing controls before rendering new ones.
33
+ */
34
+ update(): void;
35
+ /**
36
+ * Tear down the active control group (if any) and hide the divider.
37
+ */
38
+ clear(): void;
39
+ #private;
40
+ }
41
+ export type PluginControlsSlotDeps = {
42
+ blocks: import("../types.js").IBlockManager;
43
+ getInlineControls: (type: string) => import("../types.js").BlockPlugin["renderInlineControls"] | undefined;
44
+ events: import("../types.js").IEventBus;
45
+ typeSelector: import("../TypeSelector.js").TypeSelector;
46
+ setSuppressSelectionChange: (suppress: boolean) => void;
47
+ /**
48
+ * Hint to the SelectionTracker to skip the next few selectionchange events
49
+ * (used while a plugin control swaps the contenteditable element).
50
+ */
51
+ mutations: import("../CommandDispatcher.js").CommandDispatcher;
52
+ };
@@ -0,0 +1,118 @@
1
+ /**
2
+ * @typedef {Object} PluginControlsSlotDeps
3
+ * @property {import('../types').IBlockManager} blocks
4
+ * @property {(type: string) => import('../types').BlockPlugin['renderInlineControls'] | undefined} getInlineControls
5
+ * @property {import('../types').IEventBus} events
6
+ * @property {import('../TypeSelector').TypeSelector} typeSelector
7
+ * @property {(suppress: boolean) => void} setSuppressSelectionChange
8
+ * @property {import('../CommandDispatcher').CommandDispatcher} mutations
9
+ * Hint to the SelectionTracker to skip the next few selectionchange events
10
+ * (used while a plugin control swaps the contenteditable element).
11
+ */
12
+
13
+ /**
14
+ * The "plugin controls" zone in the inline toolbar — the area where each
15
+ * block plugin can render its own buttons (e.g. heading level switcher,
16
+ * paragraph alignment).
17
+ *
18
+ * Owns mounting/unmounting of the current plugin's control group:
19
+ * builds an `InlineControlContext`, calls `plugin.renderInlineControls`,
20
+ * appends returned elements into `pluginZone`, and tears them down
21
+ * (calling the group's optional `destroy()`) when the focus moves to
22
+ * a block whose plugin doesn't provide controls.
23
+ */
24
+ export class PluginControlsSlot {
25
+ /** @type {HTMLElement} */
26
+ #zoneEl
27
+
28
+ /** @type {HTMLElement} */
29
+ #dividerEl
30
+
31
+ /** @type {PluginControlsSlotDeps} */
32
+ #deps
33
+
34
+ /** @type {import('../types').InlineControlGroup | null} */
35
+ #current = null
36
+
37
+ /**
38
+ * @param {HTMLElement} zoneEl container that holds the rendered controls
39
+ * @param {HTMLElement} dividerEl divider element shown only when controls are present
40
+ * @param {PluginControlsSlotDeps} deps
41
+ */
42
+ constructor(zoneEl, dividerEl, deps) {
43
+ this.#zoneEl = zoneEl
44
+ this.#dividerEl = dividerEl
45
+ this.#deps = deps
46
+ }
47
+
48
+ /**
49
+ * Re-query the current block's plugin and render its inline controls.
50
+ * Idempotent — clears any existing controls before rendering new ones.
51
+ */
52
+ update() {
53
+ this.clear()
54
+
55
+ const currentBlock = this.#deps.blocks.getCurrentBlock()
56
+ if (!currentBlock) return
57
+
58
+ const renderInlineControls = this.#deps.getInlineControls(currentBlock.type)
59
+ if (!renderInlineControls) return
60
+
61
+ /** @type {import('../types').InlineControlContext} */
62
+ const ctx = {
63
+ suppressSelectionChange: () => {
64
+ this.#deps.setSuppressSelectionChange(true)
65
+ // Re-enable on the second rAF — gives DOM swaps a couple of frames
66
+ // to settle before we start tracking selectionchange again.
67
+ requestAnimationFrame(() => {
68
+ requestAnimationFrame(() => {
69
+ this.#deps.setSuppressSelectionChange(false)
70
+ })
71
+ })
72
+ },
73
+ mutate: (operation) => this.#deps.mutations.runForBlock(currentBlock, operation),
74
+ onContentElementChanged: (newEl) => {
75
+ const externalMutation = !this.#deps.mutations.active
76
+ if (newEl && newEl !== currentBlock.contentElement) {
77
+ currentBlock.replaceContentElement(newEl)
78
+ }
79
+ this.#deps.typeSelector.update()
80
+ if (externalMutation) this.#deps.mutations.commitExternal(currentBlock)
81
+ },
82
+ }
83
+
84
+ let group
85
+ try {
86
+ group = renderInlineControls(currentBlock.contentElement, ctx)
87
+ } catch (err) {
88
+ console.warn(`[PluginControlsSlot] Failed to render controls for "${currentBlock.type}":`, err)
89
+ return
90
+ }
91
+ if (!group || !group.elements.length) return
92
+
93
+ this.#current = group
94
+ for (const element of group.elements) {
95
+ this.#zoneEl.appendChild(element)
96
+ }
97
+ this.#dividerEl.style.display = ''
98
+ }
99
+
100
+ /**
101
+ * Tear down the active control group (if any) and hide the divider.
102
+ */
103
+ clear() {
104
+ if (this.#current) {
105
+ try {
106
+ this.#current.destroy?.()
107
+ } catch (err) {
108
+ console.warn('[PluginControlsSlot] Failed to destroy plugin controls:', err)
109
+ } finally {
110
+ for (const element of this.#current.elements) {
111
+ element.remove()
112
+ }
113
+ this.#current = null
114
+ }
115
+ }
116
+ this.#dividerEl.style.display = 'none'
117
+ }
118
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @typedef {Object} SelectionTrackerDeps
3
+ * @property {HTMLElement} rootEl
4
+ * @property {import('../types.js').IBlockReader} blocks
5
+ * @property {import('../types.js').ICrossBlockSelection} crossBlockSelection
6
+ * @property {() => void} show
7
+ * @property {() => void} hide
8
+ * @property {() => void} updateActiveStates
9
+ * @property {() => boolean} isInActionsView
10
+ * Returns true while the actions panel is open — selectionchange should be ignored.
11
+ * @property {() => boolean} isTypeSelectorOpen
12
+ * @property {() => boolean} hasOpenToolDropdown
13
+ */
14
+ /**
15
+ * Tracks the user's selection and decides when the inline toolbar should
16
+ * appear or disappear.
17
+ *
18
+ * Listens to:
19
+ * - `selectionchange` on document — fires when the caret moves or text
20
+ * is selected. Filtered through several "is something else interactive"
21
+ * checks (actions panel, type selector, tool dropdown, mouse-down).
22
+ * - `mousedown`/`mouseup` on document — defers checks until the user
23
+ * finishes their drag-select. Without this we'd flicker the toolbar
24
+ * while the selection is still growing.
25
+ * - `mousedown` on document (capture) — closes the toolbar when the
26
+ * user clicks outside it.
27
+ *
28
+ * Decision logic in `checkSelection`:
29
+ * - empty/no selection → hide (unless cross-block selection is active)
30
+ * - single text block with `hasInlineTools` → show
31
+ * - cross-block range covering only text-blocks → show
32
+ * - any non-text block in the range → hide
33
+ */
34
+ export class SelectionTracker {
35
+ /**
36
+ * @param {HTMLElement} toolbarEl
37
+ * @param {SelectionTrackerDeps} deps
38
+ */
39
+ constructor(toolbarEl: HTMLElement, deps: SelectionTrackerDeps);
40
+ destroy(): void;
41
+ /**
42
+ * Suppress the next round of selectionchange events. Used by plugin
43
+ * controls during DOM swaps that would otherwise trigger a hide.
44
+ *
45
+ * @param {boolean} value
46
+ */
47
+ setSuppressSelectionChange(value: boolean): void;
48
+ #private;
49
+ }
50
+ export type SelectionTrackerDeps = {
51
+ rootEl: HTMLElement;
52
+ blocks: import("../types.js").IBlockReader;
53
+ crossBlockSelection: import("../types.js").ICrossBlockSelection;
54
+ show: () => void;
55
+ hide: () => void;
56
+ updateActiveStates: () => void;
57
+ /**
58
+ * Returns true while the actions panel is open — selectionchange should be ignored.
59
+ */
60
+ isInActionsView: () => boolean;
61
+ isTypeSelectorOpen: () => boolean;
62
+ hasOpenToolDropdown: () => boolean;
63
+ };