@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,640 @@
1
+ import { Block } from './Block.js'
2
+ import { BlockAnimator } from './BlockAnimator.js'
3
+ import { closestBlock } from './dom.js'
4
+ import { EditorEvent } from './editorEvents.js'
5
+ import { deserializeInlineHtml } from '../shared/inlineMarshal.js'
6
+ import { cloneEditorData } from '../shared/cloneEditorData.js'
7
+ import { uid } from './uid.js'
8
+ import { createPreservedBlockPlugin } from './PreservedBlockPlugin.js'
9
+
10
+ /** @typedef {import('./types').IBlockManager} IBlockManagerContract */
11
+ /** @implements {IBlockManagerContract} */
12
+ export class BlockManager {
13
+ /** @type {Block[]} */
14
+ #blocks = []
15
+
16
+ /** @type {Map<string, Block>} */
17
+ #blockMap = new Map()
18
+
19
+ /** @type {Map<string, number>} block ID → array index for O(1) lookup */
20
+ #indexMap = new Map()
21
+
22
+ /** @type {Map<string, import('./types').BlockPlugin>} */
23
+ #plugins
24
+
25
+ /** @type {import('./types').IEventBus} */
26
+ #events
27
+
28
+ /** @type {HTMLElement} */
29
+ #container
30
+
31
+ /** @type {number} current focused block index, -1 if none */
32
+ #currentIndex = -1
33
+
34
+ /** @type {BlockAnimator} */
35
+ #animator
36
+
37
+ /** @type {import('./InlinePluginRegistry').InlinePluginRegistry | null} */
38
+ #inlinePluginRegistry = null
39
+ /** @type {boolean} */
40
+ #readOnly
41
+
42
+ /** @type {import('./CommandDispatcher').CommandDispatcher | null} */
43
+ #commands = null
44
+
45
+ /** @type {{ splitBlock: (() => void) | null, exitEmptyBlock: (() => boolean) | null }} */
46
+ #structuralCommands = { splitBlock: null, exitEmptyBlock: null }
47
+
48
+ /** @type {Map<string, import('./types').BlockPlugin>} */
49
+ #preservedPlugins = new Map()
50
+
51
+ /** @type {(type: string) => string} */
52
+ #unknownBlockLabel
53
+
54
+
55
+ /**
56
+ * @param {HTMLElement} container - .oe-blocks element
57
+ * @param {Map<string, import('./types').BlockPlugin>} plugins
58
+ * @param {import('./types').IEventBus} events
59
+ * @param {{ blockInsertMs: number, blockMoveMs: number, blockRemoveMs: number }} [animations]
60
+ * @param {boolean} [readOnly]
61
+ * @param {(type: string) => string} [unknownBlockLabel]
62
+ */
63
+ constructor(container, plugins, events, animations, readOnly = false, unknownBlockLabel = type => `Unsupported block type: ${type}`) {
64
+ this.#container = container
65
+ this.#plugins = plugins
66
+ this.#events = events
67
+ this.#animator = new BlockAnimator(animations ?? { blockInsertMs: 350, blockMoveMs: 200, blockRemoveMs: 350 })
68
+ this.#readOnly = readOnly
69
+ this.#unknownBlockLabel = unknownBlockLabel
70
+ }
71
+
72
+ /**
73
+ * Wire in the inline plugin registry. Called once by `createEditor` after
74
+ * the registry is built. BlockManager uses it to rehydrate inline widget
75
+ * placeholder tokens (`{{<id>}}`) into live widget DOM when blocks are
76
+ * created from saved data.
77
+ *
78
+ * @param {import('./InlinePluginRegistry').InlinePluginRegistry} registry
79
+ */
80
+ setInlinePluginRegistry(registry) {
81
+ this.#inlinePluginRegistry = registry
82
+ }
83
+
84
+ /** @param {import('./CommandDispatcher').CommandDispatcher} commands */
85
+ setCommandDispatcher(commands) {
86
+ this.#commands = commands
87
+ }
88
+
89
+ /**
90
+ * Wire structural commands into existing and subsequently created blocks.
91
+ * @param {{ splitBlock: (() => void) | null, exitEmptyBlock: (() => boolean) | null }} commands
92
+ * @returns {void}
93
+ */
94
+ setPluginStructuralCommands(commands) {
95
+ this.#structuralCommands = commands
96
+ for (const block of this.#blocks) block.setStructuralCommands(commands)
97
+ }
98
+
99
+ /** Select the render context used for subsequently created blocks. */
100
+ setReadOnly(readOnly) {
101
+ this.#readOnly = readOnly
102
+ }
103
+
104
+ /** Build a block without mutating the live manager. */
105
+ #createBlock(type, data, id, inline, metadata = {}, preserveUnknown = false) {
106
+ if (!this.#commands) throw new Error('[BlockManager] CommandDispatcher is not configured')
107
+ let plugin = this.#plugins.get(type)
108
+ if (!plugin && preserveUnknown) {
109
+ plugin = this.#preservedPlugins.get(type)
110
+ if (!plugin) {
111
+ plugin = createPreservedBlockPlugin(type, this.#unknownBlockLabel)
112
+ this.#preservedPlugins.set(type, plugin)
113
+ }
114
+ }
115
+ if (!plugin) throw new Error(`[BlockManager] Unknown block type: "${type}"`)
116
+
117
+ const blockData = data === undefined ? undefined : cloneEditorData(data)
118
+ if (inline && typeof plugin.mapTextFields === 'function' && this.#inlinePluginRegistry && blockData) {
119
+ const registry = this.#inlinePluginRegistry
120
+ plugin.mapTextFields(blockData, (html) => deserializeInlineHtml(html, inline, registry))
121
+ }
122
+ const block = new Block(plugin, this.#commands, blockData, id, this.#readOnly, {
123
+ ...metadata,
124
+ inline,
125
+ preserveInline: preserveUnknown,
126
+ })
127
+ block.setStructuralCommands(this.#structuralCommands)
128
+ return block
129
+ }
130
+
131
+ /** Resolve a collision-safe block id. */
132
+ #uniqueId(requested, occupied) {
133
+ let id = requested || uid()
134
+ if (occupied.has(id) && requested) {
135
+ console.warn(`[BlockManager] Duplicate block id "${requested}" was remapped`)
136
+ }
137
+ while (occupied.has(id)) id = uid()
138
+ return id
139
+ }
140
+
141
+ /** Rebuild the reverse index map after any structural change. */
142
+ #rebuildIndexMap() {
143
+ this.#indexMap.clear()
144
+ for (let i = 0; i < this.#blocks.length; i++) {
145
+ this.#indexMap.set(this.#blocks[i].id, i)
146
+ }
147
+ }
148
+
149
+ /**
150
+ * Place an active block element according to the model order.
151
+ *
152
+ * Removed blocks may remain in the container while their exit animation is
153
+ * running, so `container.children[index]` is not a valid model index. Use
154
+ * neighboring live Block instances as anchors instead.
155
+ * @param {HTMLElement} element
156
+ * @param {number} index
157
+ */
158
+ #placeElementAtIndex(element, index) {
159
+ const next = /** @type {HTMLElement | undefined} */ (this.#blocks[index + 1]?.element)
160
+ if (next?.parentNode === this.#container) {
161
+ this.#container.insertBefore(element, next)
162
+ return
163
+ }
164
+
165
+ const previous = /** @type {HTMLElement | undefined} */ (this.#blocks[index - 1]?.element)
166
+ if (previous?.parentNode === this.#container) {
167
+ previous.after(element)
168
+ return
169
+ }
170
+
171
+ this.#container.prepend(element)
172
+ }
173
+
174
+ /** Enable insert/remove animations (call after initial load). */
175
+ enableAnimations() {
176
+ this.#animator.enable()
177
+ }
178
+
179
+ /**
180
+ * Insert a new block.
181
+ * @param {string} type
182
+ * @param {Record<string, unknown>} [data]
183
+ * @param {number} [index] - insert position, defaults to after current or end
184
+ * @param {string} [id] - optional block ID (for restoring saved data)
185
+ * @param {Record<string, import('../renderer/types').InlineWidget>} [inline]
186
+ * @returns {Block}
187
+ */
188
+ insert(type, data, index, id, inline) {
189
+ if (!this.#commands) throw new Error('[BlockManager] CommandDispatcher is not configured')
190
+ const blockId = this.#uniqueId(id, this.#blockMap)
191
+
192
+ if (index === undefined || index < 0 || index > this.#blocks.length) {
193
+ index = this.#currentIndex >= 0 ? this.#currentIndex + 1 : this.#blocks.length
194
+ }
195
+ const insertIndex = index
196
+
197
+ return this.#commands.execute({
198
+ name: 'block.insert',
199
+ markDirty: false,
200
+ apply: () => {
201
+ const block = this.#createBlock(type, data, blockId, inline)
202
+ this.#blocks.splice(insertIndex, 0, block)
203
+ this.#blockMap.set(block.id, block)
204
+ this.#rebuildIndexMap()
205
+
206
+ // Adjust currentIndex if inserting before or at the current block.
207
+ if (this.#currentIndex >= 0 && insertIndex <= this.#currentIndex) {
208
+ this.#currentIndex++
209
+ }
210
+
211
+ this.#placeElementAtIndex(block.element, insertIndex)
212
+ this.#animator.animateInsert(block.element)
213
+ this.#events.emit(EditorEvent.BLOCK_ADDED, { blockId: block.id, index: insertIndex })
214
+ return block
215
+ },
216
+ })
217
+ }
218
+
219
+ /**
220
+ * Build a complete replacement document off-DOM. The returned transaction
221
+ * owns the staged blocks until commit() or dispose() is called.
222
+ * @param {import('./types').BlockData[] | undefined} blockList
223
+ * @param {string} defaultBlockType
224
+ * @param {string} [logPrefix]
225
+ */
226
+ prepareReplacement(blockList, defaultBlockType, logPrefix = 'Editor') {
227
+ /** @type {Block[]} */
228
+ const staged = []
229
+ /** @type {Map<string, Block>} */
230
+ const stagedMap = new Map()
231
+ let settled = false
232
+
233
+ const disposeStaged = () => {
234
+ for (const block of staged) block.destroy()
235
+ }
236
+
237
+ const add = (type, data, requestedId, inline, tunes, revision, preserveUnknown) => {
238
+ const id = this.#uniqueId(requestedId, stagedMap)
239
+ const block = this.#createBlock(type, data, id, inline, { tunes, revision }, preserveUnknown)
240
+ staged.push(block)
241
+ stagedMap.set(id, block)
242
+ }
243
+
244
+ try {
245
+ if (Array.isArray(blockList) && blockList.length > 0) {
246
+ for (const candidate of blockList) {
247
+ if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {
248
+ console.warn(`[${logPrefix}] Skipping malformed block entry`)
249
+ continue
250
+ }
251
+
252
+ const blockData = /** @type {import('./types').BlockData} */ (candidate)
253
+ const type = typeof blockData.type === 'string' ? blockData.type : ''
254
+ const data = blockData.data && typeof blockData.data === 'object' && !Array.isArray(blockData.data)
255
+ ? blockData.data
256
+ : undefined
257
+ const id = typeof blockData.id === 'string' && blockData.id ? blockData.id : undefined
258
+ const inline = blockData.inline && typeof blockData.inline === 'object' && !Array.isArray(blockData.inline)
259
+ ? blockData.inline
260
+ : undefined
261
+ const tunes = blockData.tunes && typeof blockData.tunes === 'object' && !Array.isArray(blockData.tunes)
262
+ ? blockData.tunes
263
+ : undefined
264
+ const revision = typeof blockData.revision === 'string' || typeof blockData.revision === 'number'
265
+ ? blockData.revision
266
+ : undefined
267
+ if (!type) {
268
+ console.warn(`[${logPrefix}] Skipping block without a type`)
269
+ continue
270
+ }
271
+ const preserveUnknown = !this.#plugins.has(type)
272
+ if (preserveUnknown) {
273
+ console.warn(`[${logPrefix}] Preserving unregistered block type "${type}" as read-only`)
274
+ }
275
+ add(type, data, id, inline, tunes, revision, preserveUnknown)
276
+ }
277
+ }
278
+
279
+ if (staged.length === 0) add(defaultBlockType, undefined, undefined, undefined, undefined, undefined, false)
280
+ } catch (error) {
281
+ disposeStaged()
282
+ settled = true
283
+ throw error
284
+ }
285
+
286
+ return {
287
+ blocks: /** @type {readonly Block[]} */ (staged),
288
+ commit: (options = {}) => {
289
+ if (settled) throw new Error('[BlockManager] Replacement transaction is already settled')
290
+ if (!this.#commands) throw new Error('[BlockManager] CommandDispatcher is not configured')
291
+ this.#commands.execute({
292
+ name: 'document.replace',
293
+ markDirty: false,
294
+ notifyChange: options.notifyChange,
295
+ apply: () => {
296
+ settled = true
297
+ for (const block of this.#blocks) block.destroy()
298
+
299
+ this.#blocks = staged
300
+ this.#blockMap = stagedMap
301
+ this.#rebuildIndexMap()
302
+ this.#currentIndex = -1
303
+ this.#container.replaceChildren(...staged.map(block => block.element))
304
+ },
305
+ })
306
+ },
307
+ dispose: () => {
308
+ if (settled) return
309
+ settled = true
310
+ disposeStaged()
311
+ },
312
+ }
313
+ }
314
+
315
+ /**
316
+ * Remove a block by index.
317
+ * @param {number} index
318
+ */
319
+ remove(index) {
320
+ const block = this.#blocks[index]
321
+ if (!block) return
322
+ if (!this.#commands) throw new Error('[BlockManager] CommandDispatcher is not configured')
323
+
324
+ this.#commands.execute({
325
+ name: 'block.remove',
326
+ markDirty: false,
327
+ apply: () => {
328
+ this.#blocks.splice(index, 1)
329
+ this.#blockMap.delete(block.id)
330
+ this.#rebuildIndexMap()
331
+ block.destroy()
332
+ const animDone = this.#animator.animateRemove(block.element)
333
+
334
+ // Adjust current index to keep tracking the same block.
335
+ if (index < this.#currentIndex) {
336
+ this.#currentIndex--
337
+ } else if (index === this.#currentIndex || this.#currentIndex >= this.#blocks.length) {
338
+ this.#currentIndex = Math.min(this.#currentIndex, this.#blocks.length - 1)
339
+ }
340
+
341
+ this.#events.emit(EditorEvent.BLOCK_REMOVED, { blockId: block.id, index, animDone })
342
+ },
343
+ })
344
+ }
345
+
346
+ /**
347
+ * Move a block from one position to another.
348
+ * @param {number} fromIndex
349
+ * @param {number} toIndex
350
+ */
351
+ move(fromIndex, toIndex) {
352
+ if (fromIndex === toIndex) return
353
+ const block = this.#blocks[fromIndex]
354
+ if (!block) return
355
+ if (fromIndex < 0 || toIndex < 0 || toIndex > this.#blocks.length) return
356
+
357
+ if (!this.#commands) throw new Error('[BlockManager] CommandDispatcher is not configured')
358
+
359
+ this.#commands.execute({
360
+ name: 'block.move',
361
+ markDirty: false,
362
+ apply: () => {
363
+ // FLIP animation: snapshot positions before move.
364
+ const adjustedTo = fromIndex < toIndex ? toIndex - 1 : toIndex
365
+ const lo = Math.min(fromIndex, adjustedTo)
366
+ const hi = Math.max(fromIndex, adjustedTo)
367
+
368
+ /** @type {Map<string, DOMRect>} */
369
+ const firstRects = new Map()
370
+ for (let i = lo; i <= hi; i++) {
371
+ const candidate = this.#blocks[i]
372
+ if (candidate) firstRects.set(candidate.id, candidate.element.getBoundingClientRect())
373
+ }
374
+
375
+ block.element.remove()
376
+ this.#blocks.splice(fromIndex, 1)
377
+ this.#blocks.splice(adjustedTo, 0, block)
378
+ this.#rebuildIndexMap()
379
+ this.#placeElementAtIndex(block.element, adjustedTo)
380
+
381
+ // Recalculate currentIndex to track the same block after move.
382
+ if (this.#currentIndex === fromIndex) {
383
+ this.#currentIndex = adjustedTo
384
+ } else if (fromIndex < this.#currentIndex && adjustedTo >= this.#currentIndex) {
385
+ this.#currentIndex--
386
+ } else if (fromIndex > this.#currentIndex && adjustedTo <= this.#currentIndex) {
387
+ this.#currentIndex++
388
+ }
389
+
390
+ this.#animator.animateMove(this.#blocks, lo, hi, firstRects)
391
+ this.#events.emit(EditorEvent.BLOCK_MOVED, { blockId: block.id, from: fromIndex, to: toIndex })
392
+ this.#events.emit(EditorEvent.BLOCK_FOCUSED, { blockId: block.id })
393
+ },
394
+ })
395
+ }
396
+
397
+ /**
398
+ * Convert a block to a different type, preserving transferable data.
399
+ * @param {number} index
400
+ * @param {string} newType
401
+ * @param {Record<string, unknown>} [extraData] - e.g. { level: 2 } from toolbox entry
402
+ * @returns {Block | undefined}
403
+ */
404
+ convert(index, newType, extraData) {
405
+ const block = this.#blocks[index]
406
+ if (!block) return undefined
407
+
408
+ const plugin = this.#plugins.get(newType)
409
+ if (!plugin) {
410
+ throw new Error(`[BlockManager] Unknown block type: "${newType}"`)
411
+ }
412
+
413
+ // Extract transferable data from old block
414
+ let oldData
415
+ try {
416
+ oldData = block.plugin.exportData
417
+ ? block.plugin.exportData(block.contentElement)
418
+ : block.save().data
419
+ } catch (err) {
420
+ console.warn(`[BlockManager] Failed to export data from ${block.type}:`, err)
421
+ oldData = {}
422
+ }
423
+
424
+ const newData = { ...oldData, ...extraData }
425
+ const oldType = block.type
426
+ const blockId = block.id
427
+
428
+ // Build the replacement before touching the live model. A plugin render
429
+ // failure must leave the original block fully usable and attached.
430
+ if (!this.#commands) throw new Error('[BlockManager] CommandDispatcher is not configured')
431
+ return this.#commands.execute({
432
+ name: 'block.convert',
433
+ markDirty: false,
434
+ apply: () => {
435
+ const newBlock = new Block(plugin, this.#commands, newData, blockId, this.#readOnly)
436
+ newBlock.setStructuralCommands(this.#structuralCommands)
437
+ block.disposePlugin()
438
+ block.element.remove()
439
+ this.#blocks.splice(index, 1, newBlock)
440
+ this.#blockMap.set(blockId, newBlock)
441
+ this.#indexMap.set(blockId, index)
442
+ this.#placeElementAtIndex(newBlock.element, index)
443
+
444
+ // Preserve focused state.
445
+ if (this.#currentIndex === index) newBlock.focused = true
446
+
447
+ this.#events.emit(EditorEvent.BLOCK_CONVERTED, { blockId, from: oldType, to: newType })
448
+ return newBlock
449
+ },
450
+ })
451
+ }
452
+
453
+ /**
454
+ * Set focus to a block by index.
455
+ * @param {number} index
456
+ */
457
+ setCurrentIndex(index) {
458
+ if (this.#currentIndex >= 0 && this.#currentIndex < this.#blocks.length) {
459
+ const prev = this.#blocks[this.#currentIndex]
460
+ if (prev) {
461
+ prev.focused = false
462
+ this.#events.emit(EditorEvent.BLOCK_BLURRED, { blockId: prev.id })
463
+ }
464
+ }
465
+
466
+ this.#currentIndex = index
467
+
468
+ if (index >= 0 && index < this.#blocks.length) {
469
+ const block = this.#blocks[index]
470
+ if (block) {
471
+ block.focused = true
472
+ this.#events.emit(EditorEvent.BLOCK_FOCUSED, { blockId: block.id })
473
+ }
474
+ }
475
+ }
476
+
477
+ /**
478
+ * @param {number} index
479
+ * @returns {Block | undefined}
480
+ */
481
+ getBlockByIndex(index) {
482
+ return this.#blocks[index]
483
+ }
484
+
485
+ /**
486
+ * @param {string} id
487
+ * @returns {Block | undefined}
488
+ */
489
+ getBlockById(id) {
490
+ return this.#blockMap.get(id)
491
+ }
492
+
493
+ /**
494
+ * @returns {Block | undefined}
495
+ */
496
+ getCurrentBlock() {
497
+ return this.#blocks[this.#currentIndex]
498
+ }
499
+
500
+ /**
501
+ * @returns {number}
502
+ */
503
+ getCurrentIndex() {
504
+ return this.#currentIndex
505
+ }
506
+
507
+ /**
508
+ * @returns {number}
509
+ */
510
+ getBlockCount() {
511
+ return this.#blocks.length
512
+ }
513
+
514
+ /**
515
+ * Get the index of a block by its ID. O(1) via reverse index map.
516
+ * @param {string} id
517
+ * @returns {number}
518
+ */
519
+ getBlockIndex(id) {
520
+ return this.#indexMap.get(id) ?? -1
521
+ }
522
+
523
+ /**
524
+ * Find the block that contains a given DOM node.
525
+ * @param {import('./types').DOMNode} node
526
+ * @returns {Block | undefined}
527
+ */
528
+ getBlockByChildNode(node) {
529
+ const blockEl = closestBlock(node)
530
+ if (!blockEl) return undefined
531
+ const id = blockEl.dataset.blockId
532
+ return id ? this.getBlockById(id) : undefined
533
+ }
534
+
535
+ /**
536
+ * Find the closest block by Y coordinate.
537
+ * Used for cross-block mouse selection when the cursor may be
538
+ * in gaps between blocks or outside block elements.
539
+ * @param {number} y - clientY from mouse event
540
+ * @returns {Block | undefined}
541
+ */
542
+ getBlockByY(y) {
543
+ let closest = undefined
544
+ let minDist = Infinity
545
+
546
+ for (const block of this.#blocks) {
547
+ const rect = block.element.getBoundingClientRect()
548
+ // If Y is inside the block rect, return immediately
549
+ if (y >= rect.top && y <= rect.bottom) {
550
+ return block
551
+ }
552
+ // Otherwise find the nearest block
553
+ const dist = y < rect.top ? rect.top - y : y - rect.bottom
554
+ if (dist < minDist) {
555
+ minDist = dist
556
+ closest = block
557
+ }
558
+ }
559
+
560
+ return closest
561
+ }
562
+
563
+ /**
564
+ * Get all blocks in selected state.
565
+ * @returns {Block[]}
566
+ */
567
+ getSelectedBlocks() {
568
+ /** @type {Block[]} */
569
+ const result = []
570
+ for (const block of this.#blocks) {
571
+ if (block.selected) result.push(block)
572
+ }
573
+ return result
574
+ }
575
+
576
+ /**
577
+ * Check if any blocks are in selected state.
578
+ * @returns {boolean}
579
+ */
580
+ hasSelectedBlocks() {
581
+ for (const block of this.#blocks) {
582
+ if (block.selected) return true
583
+ }
584
+ return false
585
+ }
586
+
587
+ /**
588
+ * Clear selection state from all blocks.
589
+ */
590
+ clearSelection() {
591
+ for (const block of this.#blocks) {
592
+ block.selected = false
593
+ }
594
+ }
595
+
596
+ /**
597
+ * Remove all selected blocks and ensure at least one block remains.
598
+ * @param {string} defaultBlockType — block type to insert if all blocks are removed
599
+ * @returns {{ focusIndex: number } | null} — index to focus after removal, or null if nothing was selected
600
+ */
601
+ removeSelected(defaultBlockType) {
602
+ const selected = this.getSelectedBlocks()
603
+ if (selected.length === 0) return null
604
+
605
+ const firstIdx = this.getBlockIndex(selected[0].id)
606
+
607
+ for (let i = selected.length - 1; i >= 0; i--) {
608
+ const idx = this.getBlockIndex(selected[i].id)
609
+ if (idx >= 0) this.remove(idx)
610
+ }
611
+
612
+ if (this.#blocks.length === 0) {
613
+ this.insert(defaultBlockType)
614
+ }
615
+
616
+ return { focusIndex: Math.min(firstIdx, this.#blocks.length - 1) }
617
+ }
618
+
619
+ /**
620
+ * Remove all blocks.
621
+ */
622
+ clear() {
623
+ for (const block of this.#blocks) {
624
+ block.destroy()
625
+ }
626
+ this.#blocks = []
627
+ this.#blockMap.clear()
628
+ this.#indexMap.clear()
629
+ this.#currentIndex = -1
630
+ this.#container.innerHTML = ''
631
+ }
632
+
633
+ /**
634
+ * Iterator support.
635
+ * @returns {IterableIterator<Block>}
636
+ */
637
+ [Symbol.iterator]() {
638
+ return this.#blocks.values()
639
+ }
640
+ }
@@ -0,0 +1,67 @@
1
+ /** @typedef {import('./types.js').IBlockOperations} IBlockOperationsContract */
2
+ /** @implements {IBlockOperationsContract} */
3
+ export class BlockOperations implements IBlockOperationsContract {
4
+ /**
5
+ * @param {import('./types.js').IBlockManager} blocks
6
+ * @param {import('./types.js').ISelectionManager} selection
7
+ * @param {string} defaultBlockType
8
+ * @param {import('./types.js').IEventBus} events
9
+ */
10
+ constructor(blocks: import("./types.js").IBlockManager, selection: import("./types.js").ISelectionManager, defaultBlockType: string, events: import("./types.js").IEventBus);
11
+ /**
12
+ * Insert a new block, set it as current, place the caret, and focus.
13
+ * @param {string} type
14
+ * @param {Record<string, unknown>} [data]
15
+ * @param {number} [index]
16
+ * @param {'start' | 'end'} [caretPosition='start']
17
+ * @returns {import('./types.js').IBlock}
18
+ */
19
+ insertAndFocus(type: string, data?: Record<string, unknown>, index?: number, caretPosition?: "start" | "end"): import("./types.js").IBlock;
20
+ /**
21
+ * If the current block is empty and of the default type, convert it in place.
22
+ * Otherwise, insert a new block after it. Focuses the result.
23
+ * @param {string} type
24
+ * @param {Record<string, unknown>} [data]
25
+ * @param {'start' | 'end'} [caretPosition='start']
26
+ * @returns {import('./types.js').IBlock}
27
+ */
28
+ replaceEmptyOrInsert(type: string, data?: Record<string, unknown>, caretPosition?: "start" | "end"): import("./types.js").IBlock;
29
+ /**
30
+ * Split the current block at the caret position (Enter key).
31
+ * Extracts content after caret into a new block of the same type.
32
+ */
33
+ splitBlock(): void;
34
+ /**
35
+ * Convert the current empty non-default block to the configured default
36
+ * block and preserve focus. This is the common "exit block" operation used
37
+ * by list-like plugins and by Backspace handling.
38
+ * @returns {boolean} Whether a block was converted.
39
+ */
40
+ exitEmptyBlock(): boolean;
41
+ /**
42
+ * Merge the current block with the previous one (Backspace at start).
43
+ * If current block is empty — removes it and focuses previous.
44
+ * If both are the same type and support merge — merges content.
45
+ * @returns {boolean} Whether the merge was handled
46
+ */
47
+ mergeWithPrevious(): boolean;
48
+ /**
49
+ * Merge the next block into the current one (Delete at end).
50
+ * If next block is empty - removes it.
51
+ * If both are the same type and support merge - merges content.
52
+ * @returns {boolean} Whether the merge was handled
53
+ */
54
+ mergeWithNext(): boolean;
55
+ /**
56
+ * Move the caret to the end of the previous block (ArrowUp at start).
57
+ * @returns {boolean} Whether navigation happened
58
+ */
59
+ navigateToPrevious(): boolean;
60
+ /**
61
+ * Move the caret to the start of the next block (ArrowDown at end).
62
+ * @returns {boolean} Whether navigation happened
63
+ */
64
+ navigateToNext(): boolean;
65
+ #private;
66
+ }
67
+ export type IBlockOperationsContract = import("./types.js").IBlockOperations;