@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,390 @@
1
+ import { uid } from './uid.js'
2
+ import { cloneEditorData } from '../shared/cloneEditorData.js'
3
+ import { el } from './dom.js'
4
+ import {
5
+ BLOCK_CLASS,
6
+ READ_ONLY_INTERACTIVE_ATTRIBUTE,
7
+ TEXT_ALIGN_TUNE_ATTRIBUTE,
8
+ } from './constants.js'
9
+ import { normalizeTextAlign } from '../shared/textFormat.js'
10
+
11
+ /** @typedef {import('./types').IBlock} IBlockContract */
12
+ /** @implements {IBlockContract} */
13
+ export class Block {
14
+ /** @type {string} */
15
+ #id
16
+
17
+ /** @type {string} */
18
+ #type
19
+
20
+ /** @type {import('./types').BlockPlugin} */
21
+ #plugin
22
+
23
+ /** @type {HTMLElement} wrapper div.oe-block */
24
+ #element
25
+
26
+ /** @type {HTMLElement} inner element from plugin.render() */
27
+ #contentElement
28
+
29
+ /** @type {boolean} */
30
+ #focused = false
31
+
32
+ /** @type {boolean} */
33
+ #selected = false
34
+ /** @type {Record<string, unknown> | null} */
35
+ #cachedData = null
36
+ /** @type {boolean} */
37
+ #dirty = true
38
+ /** @type {number} */
39
+ #version = 0
40
+ #readOnly
41
+
42
+ /** @type {Record<string, unknown> | undefined} */
43
+ #tunes
44
+
45
+ /** @type {string | number | undefined} */
46
+ #revision
47
+
48
+ /** @type {Record<string, import('../renderer/types').InlineWidget> | undefined} */
49
+ #preservedInline
50
+
51
+ /** @type {import('./CommandDispatcher').CommandDispatcher} */
52
+ #commands
53
+
54
+ /** @type {boolean} */
55
+ #destroyed = false
56
+
57
+ /** @type {(() => void) | null} */
58
+ #splitBlock = null
59
+
60
+ /** @type {(() => boolean) | null} */
61
+ #exitEmptyBlock = null
62
+
63
+ /**
64
+ * @param {import('./types').BlockPlugin} plugin
65
+ * @param {import('./CommandDispatcher').CommandDispatcher} commands
66
+ * @param {Record<string, unknown>} [data]
67
+ * @param {string} [id]
68
+ * @param {boolean} [readOnly]
69
+ * @param {{ tunes?: Record<string, unknown>, revision?: string | number, inline?: Record<string, import('../renderer/types').InlineWidget>, preserveInline?: boolean }} [metadata]
70
+ */
71
+ constructor(plugin, commands, data, id, readOnly = false, metadata = {}) {
72
+ this.#id = id || uid()
73
+ this.#type = plugin.type
74
+ this.#plugin = plugin
75
+ this.#readOnly = readOnly
76
+ this.#commands = commands
77
+ this.#tunes = metadata.tunes === undefined ? undefined : cloneEditorData(metadata.tunes)
78
+ this.#revision = metadata.revision
79
+ this.#preservedInline = metadata.preserveInline && metadata.inline
80
+ ? cloneEditorData(metadata.inline)
81
+ : undefined
82
+
83
+ this.#element = el('div', BLOCK_CLASS, {
84
+ 'data-block-id': this.#id,
85
+ 'data-block-type': this.#type,
86
+ })
87
+
88
+ const contentElement = plugin.render(data || {}, {
89
+ mutate: (operation) => this.#runMutation(operation),
90
+ splitBlock: () => this.#splitBlock?.(),
91
+ exitEmptyBlock: () => this.#exitEmptyBlock?.() ?? false,
92
+ readOnly: this.#readOnly,
93
+ })
94
+ if (!(contentElement instanceof HTMLElement)) {
95
+ throw new TypeError(`Block plugin "${this.#type}" render() must return an HTMLElement`)
96
+ }
97
+ this.#contentElement = contentElement
98
+ this.#applyTextAlignTune()
99
+ this.#applyReadOnly()
100
+ this.#element.appendChild(this.#contentElement)
101
+ }
102
+
103
+ /**
104
+ * Core-owned command boundary for interactive block-plugin controls.
105
+ * Plugins mutate their own DOM, while the Block remains responsible for
106
+ * cache invalidation, change events, and the final history commit.
107
+ * @template T
108
+ * @param {() => T} operation
109
+ * @returns {T | undefined}
110
+ */
111
+ #runMutation(operation) {
112
+ if (this.#destroyed || this.#readOnly) return undefined
113
+ return this.#commands.runForBlock(this, operation)
114
+ }
115
+
116
+ /**
117
+ * Connect core structural commands used by interactive plugin controls.
118
+ * The callbacks are cleared while the editor is in read-only mode.
119
+ * @param {{ splitBlock: (() => void) | null, exitEmptyBlock: (() => boolean) | null }} commands
120
+ * @returns {void}
121
+ */
122
+ setStructuralCommands(commands) {
123
+ this.#splitBlock = commands.splitBlock
124
+ this.#exitEmptyBlock = commands.exitEmptyBlock
125
+ }
126
+
127
+ get id() {
128
+ return this.#id
129
+ }
130
+
131
+ get type() {
132
+ return this.#type
133
+ }
134
+
135
+ get plugin() {
136
+ return this.#plugin
137
+ }
138
+
139
+ get element() {
140
+ return this.#element
141
+ }
142
+
143
+ get contentElement() {
144
+ return this.#contentElement
145
+ }
146
+
147
+ get focused() {
148
+ return this.#focused
149
+ }
150
+
151
+ set focused(value) {
152
+ this.#focused = value
153
+ this.#element.classList.toggle('oe-block--focused', value)
154
+ }
155
+
156
+ get selected() {
157
+ return this.#selected
158
+ }
159
+
160
+ set selected(value) {
161
+ this.#selected = value
162
+ this.#element.classList.toggle('oe-block--selected', value)
163
+ }
164
+
165
+ /**
166
+ * Extract block data from DOM.
167
+ * @returns {import('./types').BlockData}
168
+ */
169
+ save() {
170
+ if (this.#dirty || !this.#cachedData) {
171
+ const saved = this.#plugin.save(this.#contentElement)
172
+ if (!saved || typeof saved !== 'object' || Array.isArray(saved)) {
173
+ throw new TypeError(`Block plugin "${this.#type}" save() must return a data object`)
174
+ }
175
+ this.#cachedData = cloneEditorData(saved)
176
+ this.#syncTextAlignTune()
177
+ this.#dirty = false
178
+ }
179
+ const data = cloneEditorData(this.#cachedData)
180
+ const result = { id: this.#id, type: this.#type, data }
181
+ if (this.#revision !== undefined) result.revision = this.#revision
182
+ if (this.#tunes !== undefined) result.tunes = cloneEditorData(this.#tunes)
183
+ if (this.#preservedInline !== undefined) result.inline = cloneEditorData(this.#preservedInline)
184
+ return result
185
+ }
186
+
187
+ /** Mark cached serialization stale after a block-local mutation. */
188
+ markDirty() {
189
+ this.#dirty = true
190
+ // A producer-owned revision only describes the input block. Once the
191
+ // editor changes that block it can no longer claim the old revision.
192
+ this.#revision = undefined
193
+ this.#version++
194
+ }
195
+
196
+ /** Monotonic version used by incremental consumers. */
197
+ get version() {
198
+ return this.#version
199
+ }
200
+
201
+ /**
202
+ * Merge another block's data into this one.
203
+ * @param {Record<string, unknown>} data
204
+ */
205
+ merge(data) {
206
+ if (this.#plugin.merge) {
207
+ this.#plugin.merge(this.#contentElement, data)
208
+ }
209
+ this.markDirty()
210
+ }
211
+
212
+ /**
213
+ * Whether this block's plugin supports merge.
214
+ * @returns {boolean}
215
+ */
216
+ get canMerge() {
217
+ return typeof this.#plugin.merge === 'function'
218
+ }
219
+
220
+ /**
221
+ * Check if the block content is empty.
222
+ * Delegates to plugin.isEmpty() if defined, else checks textContent.
223
+ * @returns {boolean}
224
+ */
225
+ isEmpty() {
226
+ if (typeof this.#plugin.isEmpty === 'function') {
227
+ return this.#plugin.isEmpty(this.#contentElement)
228
+ }
229
+ const text = (this.#contentElement.textContent || '').trim()
230
+ return text.length === 0
231
+ }
232
+
233
+ /**
234
+ * Check if the plugin supports inline tools.
235
+ * @returns {boolean}
236
+ */
237
+ get hasInlineTools() {
238
+ const setting = this.#plugin.inlineTools
239
+ return setting !== false && (!Array.isArray(setting) || setting.length > 0)
240
+ }
241
+
242
+ /**
243
+ * Tool types allowed by this block, or null when the editor-wide set applies.
244
+ * @returns {readonly string[] | null}
245
+ */
246
+ get inlineToolTypes() {
247
+ return Array.isArray(this.#plugin.inlineTools)
248
+ ? this.#plugin.inlineTools
249
+ : null
250
+ }
251
+
252
+ /**
253
+ * Get the block's settings UI (if plugin provides one).
254
+ * @returns {HTMLElement | HTMLElement[] | null}
255
+ */
256
+ renderSettings() {
257
+ return this.#plugin.renderSettings?.(this.#contentElement) ?? null
258
+ }
259
+
260
+ /**
261
+ * Adopt a new content element as this block's content.
262
+ *
263
+ * Two paths, automatically chosen:
264
+ * 1. The plugin already swapped the DOM itself (`oldEl.replaceWith(newEl)`),
265
+ * so `newEl` is already a child of `#element` — we only need to update
266
+ * the internal reference. This is the case for Heading.changeLevel.
267
+ * 2. The plugin returned a fresh detached element — we swap it in via
268
+ * `replaceChild`.
269
+ *
270
+ * Without the first branch, calling this after a DOM swap performed by the plugin
271
+ * throws `NotFoundError: replaceChild — node is not a child of this node`,
272
+ * because the old contentElement is already detached.
273
+ *
274
+ * @param {HTMLElement} newEl
275
+ */
276
+ replaceContentElement(newEl) {
277
+ if (newEl === this.#contentElement) return
278
+ if (newEl.parentNode === this.#element) {
279
+ this.markDirty()
280
+ // Plugin already performed the DOM swap; just track the new ref.
281
+ this.#contentElement = newEl
282
+ this.#applyTextAlignTune()
283
+ return
284
+ }
285
+ this.#element.replaceChild(newEl, this.#contentElement)
286
+ this.markDirty()
287
+ this.#contentElement = newEl
288
+ this.#applyTextAlignTune()
289
+ }
290
+
291
+ /** Apply a valid serialized block alignment to the plugin root. */
292
+ #applyTextAlignTune() {
293
+ const align = normalizeTextAlign(this.#tunes?.textAlign)
294
+ if (!align) return
295
+ this.#contentElement.style.textAlign = align
296
+ this.#contentElement.setAttribute(TEXT_ALIGN_TUNE_ATTRIBUTE, align)
297
+ }
298
+
299
+ /**
300
+ * Copy an alignment explicitly changed by the toolbar into block tunes.
301
+ * Plugin-owned `data.align` remains readable and writable for Paragraph and
302
+ * Heading, while the tune gives every other text block one stable contract.
303
+ */
304
+ #syncTextAlignTune() {
305
+ if (!this.#contentElement.hasAttribute(TEXT_ALIGN_TUNE_ATTRIBUTE)) return
306
+
307
+ const align = normalizeTextAlign(this.#contentElement.getAttribute(TEXT_ALIGN_TUNE_ATTRIBUTE))
308
+ const nextTunes = this.#tunes ? cloneEditorData(this.#tunes) : {}
309
+ if (align) nextTunes.textAlign = align
310
+ else delete nextTunes.textAlign
311
+ this.#tunes = Object.keys(nextTunes).length > 0 ? nextTunes : undefined
312
+ }
313
+
314
+
315
+ /**
316
+ * Enforce read-only as a DOM invariant instead of relying on pointer events.
317
+ */
318
+ #applyReadOnly() {
319
+ if (!this.#readOnly) return
320
+
321
+ this.#contentElement.setAttribute('aria-readonly', 'true')
322
+ /** @type {HTMLElement[]} */
323
+ const editableElements = []
324
+ if (this.#contentElement.matches('[contenteditable]')) {
325
+ editableElements.push(this.#contentElement)
326
+ }
327
+ for (const editableElement of this.#contentElement.querySelectorAll('[contenteditable]')) {
328
+ if (editableElement instanceof HTMLElement) editableElements.push(editableElement)
329
+ }
330
+ for (const editableElement of editableElements) {
331
+ editableElement.contentEditable = 'false'
332
+ }
333
+
334
+ for (const field of this.#contentElement.querySelectorAll('input, textarea')) {
335
+ if (field instanceof HTMLInputElement) field.readOnly = true
336
+ else if (field instanceof HTMLTextAreaElement) field.readOnly = true
337
+ }
338
+ for (const control of this.#contentElement.querySelectorAll('button, select')) {
339
+ if (control.hasAttribute(READ_ONLY_INTERACTIVE_ATTRIBUTE)) continue
340
+ if (control instanceof HTMLButtonElement) control.disabled = true
341
+ else if (control instanceof HTMLSelectElement) control.disabled = true
342
+ }
343
+ }
344
+
345
+ /**
346
+ * Clean up the plugin without removing the block element from DOM.
347
+ * Used by BlockManager.convert() which handles element removal separately.
348
+ */
349
+ disposePlugin() {
350
+ if (this.#destroyed) return
351
+ this.#destroyed = true
352
+ if (this.#plugin.destroy) {
353
+ try {
354
+ this.#plugin.destroy(this.#contentElement)
355
+ } catch (err) {
356
+ console.warn(`[Block] Plugin destroy failed for ${this.#id} (${this.#type}):`, err)
357
+ }
358
+ }
359
+ }
360
+
361
+ /**
362
+ * Focus the first editable or focusable element within the block.
363
+ */
364
+ focus() {
365
+ if (this.#contentElement.contentEditable === 'true' || this.#contentElement.tabIndex >= 0) {
366
+ this.#contentElement.focus()
367
+ return
368
+ }
369
+ const editable = this.#contentElement.querySelector('[contenteditable="true"]')
370
+ if (editable instanceof HTMLElement) {
371
+ editable.focus()
372
+ return
373
+ }
374
+ const focusable = this.#contentElement.querySelector('input, textarea, [tabindex]')
375
+ if (focusable instanceof HTMLElement) {
376
+ focusable.focus()
377
+ return
378
+ }
379
+ this.#contentElement.setAttribute('tabindex', '-1')
380
+ this.#contentElement.focus()
381
+ }
382
+
383
+ /**
384
+ * Clean up plugin resources. Does NOT remove the element from DOM —
385
+ * BlockAnimator handles animated removal separately.
386
+ */
387
+ destroy() {
388
+ this.disposePlugin()
389
+ }
390
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Handles all block-level animations: insert (scale+fade in),
3
+ * move (FLIP), and remove (collapse+fade out).
4
+ *
5
+ * Extracted from BlockManager to separate animation concern from
6
+ * block state management (SRP).
7
+ */
8
+ export class BlockAnimator {
9
+ /**
10
+ * @param {{ blockInsertMs: number, blockMoveMs: number, blockRemoveMs: number }} durations
11
+ */
12
+ constructor(durations: {
13
+ blockInsertMs: number;
14
+ blockMoveMs: number;
15
+ blockRemoveMs: number;
16
+ });
17
+ /** Enable animations (call after initial load so initial blocks don't animate). */
18
+ enable(): void;
19
+ /**
20
+ * Animate a newly inserted block element.
21
+ * @param {HTMLElement} element
22
+ */
23
+ animateInsert(element: HTMLElement): void;
24
+ /**
25
+ * FLIP-animate blocks that shifted after a move operation.
26
+ * @param {import('./types.js').IBlock[]} blocks — ordered block array
27
+ * @param {number} lo — first affected index
28
+ * @param {number} hi — last affected index
29
+ * @param {Map<string, DOMRect>} firstRects — pre-move bounding rects keyed by block ID
30
+ */
31
+ animateMove(blocks: import("./types.js").IBlock[], lo: number, hi: number, firstRects: Map<string, DOMRect>): void;
32
+ /**
33
+ * Animate a block element's removal (collapse + fade out), then remove from DOM.
34
+ * @param {HTMLElement} element
35
+ * @returns {Promise<void>} resolves when the element is removed from DOM
36
+ */
37
+ animateRemove(element: HTMLElement): Promise<void>;
38
+ #private;
39
+ }
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Handles all block-level animations: insert (scale+fade in),
3
+ * move (FLIP), and remove (collapse+fade out).
4
+ *
5
+ * Extracted from BlockManager to separate animation concern from
6
+ * block state management (SRP).
7
+ */
8
+ export class BlockAnimator {
9
+ /** @type {{ blockInsertMs: number, blockMoveMs: number, blockRemoveMs: number }} */
10
+ #durations
11
+
12
+ /** @type {boolean} */
13
+ #enabled = false
14
+
15
+ /**
16
+ * @param {{ blockInsertMs: number, blockMoveMs: number, blockRemoveMs: number }} durations
17
+ */
18
+ constructor(durations) {
19
+ this.#durations = durations
20
+ }
21
+
22
+ /** Enable animations (call after initial load so initial blocks don't animate). */
23
+ enable() {
24
+ this.#enabled = true
25
+ }
26
+
27
+ /**
28
+ * Animate a newly inserted block element.
29
+ * @param {HTMLElement} element
30
+ */
31
+ animateInsert(element) {
32
+ if (!this.#enabled) return
33
+ element.animate([
34
+ { opacity: 0, transform: 'scale(0.95) translateY(-6px)' },
35
+ { opacity: 1, transform: 'scale(1) translateY(0)' },
36
+ ], {
37
+ duration: this.#durations.blockInsertMs,
38
+ easing: 'cubic-bezier(0.16, 1, 0.3, 1)',
39
+ fill: 'forwards',
40
+ })
41
+ }
42
+
43
+ /**
44
+ * FLIP-animate blocks that shifted after a move operation.
45
+ * @param {import('./types').IBlock[]} blocks — ordered block array
46
+ * @param {number} lo — first affected index
47
+ * @param {number} hi — last affected index
48
+ * @param {Map<string, DOMRect>} firstRects — pre-move bounding rects keyed by block ID
49
+ */
50
+ animateMove(blocks, lo, hi, firstRects) {
51
+ for (let i = lo; i <= hi; i++) {
52
+ const b = blocks[i]
53
+ if (!b) continue
54
+ const first = firstRects.get(b.id)
55
+ if (!first) continue
56
+ const last = b.element.getBoundingClientRect()
57
+ const dy = first.top - last.top
58
+ if (Math.abs(dy) < 1) continue
59
+
60
+ b.element.animate(
61
+ [
62
+ { transform: `translateY(${dy}px)` },
63
+ { transform: 'translateY(0)' },
64
+ ],
65
+ { duration: this.#durations.blockMoveMs, easing: 'cubic-bezier(0.22, 1, 0.36, 1)' },
66
+ )
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Animate a block element's removal (collapse + fade out), then remove from DOM.
72
+ * @param {HTMLElement} element
73
+ * @returns {Promise<void>} resolves when the element is removed from DOM
74
+ */
75
+ animateRemove(element) {
76
+ // Skip animation if element is not in DOM or not visible
77
+ if (!element.parentNode || !element.offsetHeight) {
78
+ element.remove()
79
+ return Promise.resolve()
80
+ }
81
+
82
+ const height = element.offsetHeight
83
+ const margin = parseFloat(getComputedStyle(element).marginBottom) || 0
84
+ element.style.overflow = 'hidden'
85
+ element.style.pointerEvents = 'none'
86
+ element.style.transformOrigin = 'top center'
87
+
88
+ const anim = element.animate([
89
+ { opacity: 1, transform: 'scale(1) translateY(0)', maxHeight: `${height}px`, marginBottom: `${margin}px` },
90
+ { opacity: 0, transform: 'scale(0.96) translateY(-4px)', maxHeight: `${height}px`, marginBottom: `${margin}px`, offset: 0.4 },
91
+ { opacity: 0, transform: 'scale(0.96) translateY(-4px)', maxHeight: '0px', marginBottom: '0px' },
92
+ ], {
93
+ duration: this.#durations.blockRemoveMs,
94
+ easing: 'cubic-bezier(0.22, 1, 0.36, 1)',
95
+ fill: 'forwards',
96
+ })
97
+
98
+ // Undo/render may synchronously detach the element while this animation
99
+ // is running. A cancelled Web Animation rejects `finished`; normalize
100
+ // that lifecycle path so toolbar cleanup subscribed to `animDone` still
101
+ // runs and no unhandled rejection escapes.
102
+ return anim.finished
103
+ .catch(() => undefined)
104
+ .then(() => element.remove())
105
+ }
106
+ }
@@ -0,0 +1,163 @@
1
+ /** @typedef {import('./types.js').IBlockManager} IBlockManagerContract */
2
+ /** @implements {IBlockManagerContract} */
3
+ export class BlockManager implements IBlockManagerContract {
4
+ /**
5
+ * @param {HTMLElement} container - .oe-blocks element
6
+ * @param {Map<string, import('./types.js').BlockPlugin>} plugins
7
+ * @param {import('./types.js').IEventBus} events
8
+ * @param {{ blockInsertMs: number, blockMoveMs: number, blockRemoveMs: number }} [animations]
9
+ * @param {boolean} [readOnly]
10
+ * @param {(type: string) => string} [unknownBlockLabel]
11
+ */
12
+ constructor(container: HTMLElement, plugins: Map<string, import("./types.js").BlockPlugin>, events: import("./types.js").IEventBus, animations?: {
13
+ blockInsertMs: number;
14
+ blockMoveMs: number;
15
+ blockRemoveMs: number;
16
+ }, readOnly?: boolean, unknownBlockLabel?: (type: string) => string);
17
+ /**
18
+ * Wire in the inline plugin registry. Called once by `createEditor` after
19
+ * the registry is built. BlockManager uses it to rehydrate inline widget
20
+ * placeholder tokens (`{{<id>}}`) into live widget DOM when blocks are
21
+ * created from saved data.
22
+ *
23
+ * @param {import('./InlinePluginRegistry.js').InlinePluginRegistry} registry
24
+ */
25
+ setInlinePluginRegistry(registry: import("./InlinePluginRegistry.js").InlinePluginRegistry): void;
26
+ /** @param {import('./CommandDispatcher.js').CommandDispatcher} commands */
27
+ setCommandDispatcher(commands: import("./CommandDispatcher.js").CommandDispatcher): void;
28
+ /**
29
+ * Wire structural commands into existing and subsequently created blocks.
30
+ * @param {{ splitBlock: (() => void) | null, exitEmptyBlock: (() => boolean) | null }} commands
31
+ * @returns {void}
32
+ */
33
+ setPluginStructuralCommands(commands: {
34
+ splitBlock: (() => void) | null;
35
+ exitEmptyBlock: (() => boolean) | null;
36
+ }): void;
37
+ /** Select the render context used for subsequently created blocks. */
38
+ setReadOnly(readOnly: any): void;
39
+ /** Enable insert/remove animations (call after initial load). */
40
+ enableAnimations(): void;
41
+ /**
42
+ * Insert a new block.
43
+ * @param {string} type
44
+ * @param {Record<string, unknown>} [data]
45
+ * @param {number} [index] - insert position, defaults to after current or end
46
+ * @param {string} [id] - optional block ID (for restoring saved data)
47
+ * @param {Record<string, import('../renderer/types.js').InlineWidget>} [inline]
48
+ * @returns {Block}
49
+ */
50
+ insert(type: string, data?: Record<string, unknown>, index?: number, id?: string, inline?: Record<string, import("../renderer/types.js").InlineWidget>): Block;
51
+ /**
52
+ * Build a complete replacement document off-DOM. The returned transaction
53
+ * owns the staged blocks until commit() or dispose() is called.
54
+ * @param {import('./types.js').BlockData[] | undefined} blockList
55
+ * @param {string} defaultBlockType
56
+ * @param {string} [logPrefix]
57
+ */
58
+ prepareReplacement(blockList: import("./types.js").BlockData[] | undefined, defaultBlockType: string, logPrefix?: string): {
59
+ blocks: readonly Block[];
60
+ commit: (options?: {}) => void;
61
+ dispose: () => void;
62
+ };
63
+ /**
64
+ * Remove a block by index.
65
+ * @param {number} index
66
+ */
67
+ remove(index: number): void;
68
+ /**
69
+ * Move a block from one position to another.
70
+ * @param {number} fromIndex
71
+ * @param {number} toIndex
72
+ */
73
+ move(fromIndex: number, toIndex: number): void;
74
+ /**
75
+ * Convert a block to a different type, preserving transferable data.
76
+ * @param {number} index
77
+ * @param {string} newType
78
+ * @param {Record<string, unknown>} [extraData] - e.g. { level: 2 } from toolbox entry
79
+ * @returns {Block | undefined}
80
+ */
81
+ convert(index: number, newType: string, extraData?: Record<string, unknown>): Block | undefined;
82
+ /**
83
+ * Set focus to a block by index.
84
+ * @param {number} index
85
+ */
86
+ setCurrentIndex(index: number): void;
87
+ /**
88
+ * @param {number} index
89
+ * @returns {Block | undefined}
90
+ */
91
+ getBlockByIndex(index: number): Block | undefined;
92
+ /**
93
+ * @param {string} id
94
+ * @returns {Block | undefined}
95
+ */
96
+ getBlockById(id: string): Block | undefined;
97
+ /**
98
+ * @returns {Block | undefined}
99
+ */
100
+ getCurrentBlock(): Block | undefined;
101
+ /**
102
+ * @returns {number}
103
+ */
104
+ getCurrentIndex(): number;
105
+ /**
106
+ * @returns {number}
107
+ */
108
+ getBlockCount(): number;
109
+ /**
110
+ * Get the index of a block by its ID. O(1) via reverse index map.
111
+ * @param {string} id
112
+ * @returns {number}
113
+ */
114
+ getBlockIndex(id: string): number;
115
+ /**
116
+ * Find the block that contains a given DOM node.
117
+ * @param {import('./types.js').DOMNode} node
118
+ * @returns {Block | undefined}
119
+ */
120
+ getBlockByChildNode(node: import("./types.js").DOMNode): Block | undefined;
121
+ /**
122
+ * Find the closest block by Y coordinate.
123
+ * Used for cross-block mouse selection when the cursor may be
124
+ * in gaps between blocks or outside block elements.
125
+ * @param {number} y - clientY from mouse event
126
+ * @returns {Block | undefined}
127
+ */
128
+ getBlockByY(y: number): Block | undefined;
129
+ /**
130
+ * Get all blocks in selected state.
131
+ * @returns {Block[]}
132
+ */
133
+ getSelectedBlocks(): Block[];
134
+ /**
135
+ * Check if any blocks are in selected state.
136
+ * @returns {boolean}
137
+ */
138
+ hasSelectedBlocks(): boolean;
139
+ /**
140
+ * Clear selection state from all blocks.
141
+ */
142
+ clearSelection(): void;
143
+ /**
144
+ * Remove all selected blocks and ensure at least one block remains.
145
+ * @param {string} defaultBlockType — block type to insert if all blocks are removed
146
+ * @returns {{ focusIndex: number } | null} — index to focus after removal, or null if nothing was selected
147
+ */
148
+ removeSelected(defaultBlockType: string): {
149
+ focusIndex: number;
150
+ } | null;
151
+ /**
152
+ * Remove all blocks.
153
+ */
154
+ clear(): void;
155
+ /**
156
+ * Iterator support.
157
+ * @returns {IterableIterator<Block>}
158
+ */
159
+ [Symbol.iterator](): IterableIterator<Block>;
160
+ #private;
161
+ }
162
+ export type IBlockManagerContract = import("./types.js").IBlockManager;
163
+ import { Block } from './Block.js';