@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,307 @@
1
+ /**
2
+ * Handles mouse-driven selection across blocks:
3
+ * - Cross-block text selection via mouse drag
4
+ * - Click-area handling (clicking below all blocks)
5
+ * - CSS Highlight API for cross-contenteditable selection
6
+ */
7
+ import { BLOCK_SELECTOR } from './constants.js'
8
+ import { EditorEvent } from './editorEvents.js'
9
+
10
+ export class MouseSelectionManager {
11
+ /** @type {HTMLElement} */
12
+ #rootEl
13
+
14
+ /** @type {HTMLElement} */
15
+ #blocksEl
16
+
17
+ /** @type {HTMLElement} */
18
+ #clickArea
19
+
20
+ /** @type {import('./types').IBlockManager} */
21
+ #blocks
22
+
23
+ /** @type {import('./types').ISelectionManager} */
24
+ #selection
25
+
26
+ /** @type {import('./types').IEventBus} */
27
+ #events
28
+
29
+ /** @type {import('./types').ICrossBlockSelection} */
30
+ #crossBlockSelection
31
+
32
+ /** @type {string} */
33
+ #defaultBlockType
34
+
35
+ /** @type {import('./types').IBlock | null} */
36
+ #mouseStartBlock = null
37
+
38
+ /** @type {import('./types').DOMNode | null} exact DOM node of mousedown caret */
39
+ #mouseStartNode = null
40
+
41
+ /** @type {number} offset within mouseStartNode */
42
+ #mouseStartOffset = 0
43
+
44
+ /** @type {boolean} */
45
+ #isBlockSelecting = false
46
+
47
+ /**
48
+ * @typedef {Object} MouseSelectionConfig
49
+ * @property {HTMLElement} blocksEl
50
+ * @property {HTMLElement} clickArea
51
+ * @property {import('./types').IBlockManager} blocks
52
+ * @property {import('./types').ISelectionManager} selection
53
+ * @property {import('./types').IEventBus} events
54
+ * @property {import('./types').ICrossBlockSelection} crossBlockSelection
55
+ * @property {string} defaultBlockType
56
+ */
57
+
58
+ /**
59
+ * @param {HTMLElement} rootEl
60
+ * @param {MouseSelectionConfig} config
61
+ */
62
+ constructor(rootEl, config) {
63
+ const { blocksEl, clickArea, blocks, selection, events, crossBlockSelection, defaultBlockType } = config
64
+ this.#rootEl = rootEl
65
+ this.#blocksEl = blocksEl
66
+ this.#clickArea = clickArea
67
+ this.#blocks = blocks
68
+ this.#selection = selection
69
+ this.#events = events
70
+ this.#crossBlockSelection = crossBlockSelection
71
+ this.#defaultBlockType = defaultBlockType
72
+
73
+ rootEl.addEventListener('mousedown', this.#onMouseDown)
74
+ rootEl.addEventListener('click', this.#onClickArea)
75
+ document.addEventListener('mousemove', this.#onMouseMove)
76
+ document.addEventListener('mouseup', this.#onMouseUp)
77
+ // Outside-click handler: clears cross-block selection + native text
78
+ // selection when the user clicks anywhere outside the editor, mirroring
79
+ // how plain text fields lose selection on outside focus.
80
+ document.addEventListener('mousedown', this.#onDocumentMouseDown, true)
81
+ }
82
+
83
+ /**
84
+ * Clean up all event listeners.
85
+ */
86
+ destroy() {
87
+ this.#rootEl.removeEventListener('mousedown', this.#onMouseDown)
88
+ this.#rootEl.removeEventListener('click', this.#onClickArea)
89
+ document.removeEventListener('mousemove', this.#onMouseMove)
90
+ document.removeEventListener('mouseup', this.#onMouseUp)
91
+ document.removeEventListener('mousedown', this.#onDocumentMouseDown, true)
92
+ }
93
+
94
+ /**
95
+ * Clear any active block selection state.
96
+ */
97
+ #clearBlockSelection() {
98
+ this.#blocks.clearSelection()
99
+ this.#isBlockSelecting = false
100
+ this.#crossBlockSelection.deactivate(this.#rootEl)
101
+ }
102
+
103
+ /**
104
+ * Document-level mousedown. Clears block/cross-block selection and any
105
+ * native text selection that lives inside the editor when the user
106
+ * clicks ANYWHERE outside the editor root — matching the standard
107
+ * text-field UX where clicking elsewhere drops the selection.
108
+ *
109
+ * Events originating INSIDE the editor are left alone: the `rootEl`
110
+ * mousedown listener (`#onMouseDown`) already handles them.
111
+ *
112
+ * @param {MouseEvent} e
113
+ */
114
+ #onDocumentMouseDown = (e) => {
115
+ const target = e.target
116
+ if (!(target instanceof Node) || this.#rootEl.contains(target)) return
117
+
118
+ // Drop block + cross-block selection.
119
+ this.#clearBlockSelection()
120
+
121
+ // If the native text selection is still anchored inside the editor,
122
+ // collapse it so the user sees the selection disappear visually.
123
+ const nativeSel = window.getSelection()
124
+ if (nativeSel && nativeSel.rangeCount > 0) {
125
+ const anchor = nativeSel.anchorNode
126
+ if (anchor && this.#rootEl.contains(anchor)) {
127
+ nativeSel.removeAllRanges()
128
+ }
129
+ }
130
+ }
131
+
132
+ /**
133
+ * Get caret position under a point.
134
+ * @param {number} x
135
+ * @param {number} y
136
+ * @returns {{ node: import('./types').DOMNode, offset: number } | null}
137
+ */
138
+ #caretFromPoint(x, y) {
139
+ if (typeof document.caretPositionFromPoint === 'function') {
140
+ const p = document.caretPositionFromPoint(x, y)
141
+ return p ? { node: p.offsetNode, offset: p.offset } : null
142
+ }
143
+ // Compatibility fallback for engines that expose only the legacy API.
144
+ // Reflective access keeps the deprecated member out of the core contract.
145
+ const legacyCaretRangeFromPoint = /** @type {((x: number, y: number) => Range | null) | undefined} */ (
146
+ Reflect.get(document, 'caretRangeFromPoint')
147
+ )
148
+ if (typeof legacyCaretRangeFromPoint === 'function') {
149
+ const r = legacyCaretRangeFromPoint.call(document, x, y)
150
+ return r ? { node: r.startContainer, offset: r.startOffset } : null
151
+ }
152
+ return null
153
+ }
154
+
155
+ /** Check if target is the click area below all blocks */
156
+ #isClickAreaTarget(/** @type {HTMLElement} */ target) {
157
+ return target === this.#clickArea
158
+ }
159
+
160
+ /** Check if target is any empty space (gaps, root, blocks container, click area) */
161
+ #isEmptySpace(/** @type {HTMLElement} */ target) {
162
+ return target === this.#rootEl || target === this.#blocksEl || target === this.#clickArea
163
+ }
164
+
165
+ #onMouseDown = (/** @type {MouseEvent} */ e) => {
166
+ const target = e.target
167
+ if (!(target instanceof HTMLElement)) return
168
+
169
+ // Only clear cross-block selection when clicking inside content area,
170
+ // not on toolbar buttons or other UI elements
171
+ if (target.closest(BLOCK_SELECTOR) || target.closest('.oe-blocks') || this.#isClickAreaTarget(target)) {
172
+ this.#clearBlockSelection()
173
+ }
174
+
175
+ this.#mouseStartNode = null
176
+ this.#mouseStartOffset = 0
177
+
178
+ if (this.#isEmptySpace(target)) {
179
+ if (this.#isClickAreaTarget(target)) {
180
+ const lastBlock = this.#blocks.getBlockByIndex(this.#blocks.getBlockCount() - 1)
181
+ this.#mouseStartBlock = lastBlock || null
182
+ } else {
183
+ this.#mouseStartBlock = null
184
+ }
185
+ return
186
+ }
187
+
188
+ this.#mouseStartBlock = this.#blocks.getBlockByChildNode(target) ?? null
189
+
190
+ const caret = this.#caretFromPoint(e.clientX, e.clientY)
191
+ if (caret) {
192
+ this.#mouseStartNode = caret.node
193
+ this.#mouseStartOffset = caret.offset
194
+ }
195
+ }
196
+
197
+ #onClickArea = (/** @type {MouseEvent} */ e) => {
198
+ if (this.#isBlockSelecting) return
199
+
200
+ const target = e.target
201
+ if (!(target instanceof HTMLElement)) return
202
+ if (!this.#isClickAreaTarget(target)) return
203
+
204
+ const blocks = this.#blocks
205
+ const lastBlock = blocks.getBlockByIndex(blocks.getBlockCount() - 1)
206
+
207
+ if (lastBlock && lastBlock.isEmpty() && lastBlock.type === this.#defaultBlockType) {
208
+ const idx = blocks.getBlockIndex(lastBlock.id)
209
+ blocks.setCurrentIndex(idx)
210
+ lastBlock.focus()
211
+ this.#selection.setCaretToBlock(lastBlock.id, 'start')
212
+ return
213
+ }
214
+
215
+ const focusBlock = blocks.insert(this.#defaultBlockType, undefined, blocks.getBlockCount())
216
+ const idx = blocks.getBlockIndex(focusBlock.id)
217
+ blocks.setCurrentIndex(idx)
218
+ focusBlock.focus()
219
+ this.#selection.setCaretToBlock(focusBlock.id, 'start')
220
+ }
221
+
222
+ #onMouseMove = (/** @type {MouseEvent} */ e) => {
223
+ if (!this.#mouseStartBlock || (e.buttons & 1) === 0) return
224
+
225
+ const blocks = this.#blocks
226
+ const currentBlock = blocks.getBlockByY(e.clientY)
227
+ if (!currentBlock) return
228
+
229
+ if (currentBlock.id === this.#mouseStartBlock.id) {
230
+ if (this.#isBlockSelecting) {
231
+ const rect = this.#mouseStartBlock.element.getBoundingClientRect()
232
+ if (e.clientY >= rect.top && e.clientY <= rect.bottom) {
233
+ this.#clearBlockSelection()
234
+ }
235
+ }
236
+ return
237
+ }
238
+
239
+ e.preventDefault()
240
+ if (!this.#mouseStartNode) return
241
+
242
+ this.#isBlockSelecting = true
243
+
244
+ const endContent = currentBlock.contentElement
245
+ const contentRect = endContent.getBoundingClientRect()
246
+ const clampedY = Math.max(contentRect.top + 1, Math.min(contentRect.bottom - 1, e.clientY))
247
+ let endCaret = this.#caretFromPoint(e.clientX, clampedY)
248
+ if (!endCaret) return
249
+
250
+ const range = document.createRange()
251
+ const startIdx = blocks.getBlockIndex(this.#mouseStartBlock.id)
252
+ const endIdx = blocks.getBlockIndex(currentBlock.id)
253
+
254
+ try {
255
+ if (startIdx <= endIdx) {
256
+ range.setStart(this.#mouseStartNode, this.#mouseStartOffset)
257
+ range.setEnd(endCaret.node, endCaret.offset)
258
+ } else {
259
+ range.setStart(endCaret.node, endCaret.offset)
260
+ range.setEnd(this.#mouseStartNode, this.#mouseStartOffset)
261
+ }
262
+ } catch {
263
+ return
264
+ }
265
+
266
+ this.#crossBlockSelection.activate(range, this.#rootEl)
267
+
268
+ const sel = window.getSelection()
269
+ if (sel) {
270
+ try {
271
+ sel.removeAllRanges()
272
+ sel.setBaseAndExtent(
273
+ this.#mouseStartNode, this.#mouseStartOffset,
274
+ endCaret.node, endCaret.offset,
275
+ )
276
+ } catch {
277
+ // Native selection across editing hosts not supported
278
+ }
279
+ }
280
+
281
+ const from = Math.min(startIdx, endIdx)
282
+ let to = Math.max(startIdx, endIdx)
283
+
284
+ const lastBlockIdx = blocks.getBlockCount() - 1
285
+ if (to === lastBlockIdx) {
286
+ const lb = blocks.getBlockByIndex(lastBlockIdx)
287
+ if (lb?.isEmpty()) to = Math.max(from, to - 1)
288
+ }
289
+
290
+ const ids = []
291
+ blocks.clearSelection()
292
+ for (let i = from; i <= to; i++) {
293
+ const b = blocks.getBlockByIndex(i)
294
+ if (b) {
295
+ b.selected = true
296
+ ids.push(b.id)
297
+ }
298
+ }
299
+ this.#events.emit(EditorEvent.BLOCK_SELECTED, { blockIds: ids })
300
+ }
301
+
302
+ #onMouseUp = () => {
303
+ this.#mouseStartBlock = null
304
+ this.#mouseStartNode = null
305
+ this.#mouseStartOffset = 0
306
+ }
307
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Prevent mutable plugin instances from being shared by live editors and
3
+ * release optional editor-scoped resources when ownership ends.
4
+ * @param {unknown[]} instances
5
+ * @returns {{ destroy(): void }}
6
+ */
7
+ export function claimPluginInstances(instances: unknown[]): {
8
+ destroy(): void;
9
+ };
@@ -0,0 +1,40 @@
1
+ /** Plugin instances carry mutable locale/config and belong to one live editor. */
2
+ const owned = new WeakSet()
3
+
4
+ /**
5
+ * Prevent mutable plugin instances from being shared by live editors and
6
+ * release optional editor-scoped resources when ownership ends.
7
+ * @param {unknown[]} instances
8
+ * @returns {{ destroy(): void }}
9
+ */
10
+ export function claimPluginInstances(instances) {
11
+ const claimed = []
12
+ const pending = new Set()
13
+ for (const instance of instances) {
14
+ if ((typeof instance !== 'object' || instance === null) && typeof instance !== 'function') continue
15
+ if (owned.has(instance) || pending.has(instance)) {
16
+ throw new Error('A plugin instance cannot be shared by multiple live editors')
17
+ }
18
+ pending.add(instance)
19
+ claimed.push(instance)
20
+ }
21
+ for (const instance of claimed) owned.add(instance)
22
+
23
+ let released = false
24
+ return {
25
+ destroy() {
26
+ if (released) return
27
+ released = true
28
+ for (const instance of claimed) {
29
+ try {
30
+ const disposable = /** @type {{ dispose?: () => void }} */ (instance)
31
+ disposable.dispose?.()
32
+ } catch (error) {
33
+ console.warn('[PluginOwnership] Failed to dispose plugin:', error)
34
+ } finally {
35
+ owned.delete(instance)
36
+ }
37
+ }
38
+ },
39
+ }
40
+ }
@@ -0,0 +1,50 @@
1
+ /** @typedef {import('./types.js').InlinePluginContext} InlinePluginContextContract */
2
+ /**
3
+ * Manages floating popups for inline plugins (color picker, etc.).
4
+ * Positions popup near an anchor element, handles outside-click dismissal.
5
+ *
6
+ * @implements {InlinePluginContextContract}
7
+ */
8
+ export class PopupManager implements InlinePluginContextContract {
9
+ /**
10
+ * @param {import('./types.js').IEventBus} events
11
+ * @param {string} changedEvent
12
+ * @param {import('./types.js').IBlockManager} blocks
13
+ * @param {import('./CommandDispatcher.js').CommandDispatcher} commands
14
+ * @param {() => boolean} [isReadOnly]
15
+ */
16
+ constructor(events: import("./types.js").IEventBus, changedEvent: string, blocks: import("./types.js").IBlockManager, commands: import("./CommandDispatcher.js").CommandDispatcher, isReadOnly?: () => boolean);
17
+ get readOnly(): boolean;
18
+ /**
19
+ * Set the editor root element (popup inherits CSS variables from it).
20
+ * @param {HTMLElement} rootEl
21
+ */
22
+ setRoot(rootEl: HTMLElement): void;
23
+ /**
24
+ * Show a popup near an anchor element.
25
+ * @param {HTMLElement} anchor
26
+ * @param {HTMLElement} content
27
+ * @param {(() => void) | undefined} cleanup
28
+ */
29
+ showPopup(anchor: HTMLElement, content: HTMLElement, cleanup: (() => void) | undefined): void;
30
+ hidePopup(): void;
31
+ /**
32
+ * Notify through the concrete editing host whenever one can be resolved.
33
+ * This lets the editor invalidate the exact block cache rather than only
34
+ * scheduling a document-level change callback.
35
+ * @param {import('./types.js').DOMNode} [target]
36
+ */
37
+ notifyChanged(target?: import("./types.js").DOMNode): void;
38
+ /**
39
+ * Execute one inline-widget command against its exact owning block.
40
+ * Detached/stale widget callbacks are ignored.
41
+ * @template T
42
+ * @param {import('./types.js').DOMNode} target
43
+ * @param {() => T} operation
44
+ * @returns {T | undefined}
45
+ */
46
+ mutate<T>(target: import("./types.js").DOMNode, operation: () => T): T | undefined;
47
+ destroy(): void;
48
+ #private;
49
+ }
50
+ export type InlinePluginContextContract = import("./types.js").InlinePluginContext;
@@ -0,0 +1,183 @@
1
+ /** @typedef {import('./types').InlinePluginContext} InlinePluginContextContract */
2
+ /**
3
+ * Manages floating popups for inline plugins (color picker, etc.).
4
+ * Positions popup near an anchor element, handles outside-click dismissal.
5
+ *
6
+ * @implements {InlinePluginContextContract}
7
+ */
8
+ export class PopupManager {
9
+ /** @type {HTMLElement | null} */
10
+ #activePopup = null
11
+
12
+ /** @type {((e: MouseEvent) => void) | null} */
13
+ #outsideClickHandler = null
14
+
15
+ /** @type {(() => void) | null} */
16
+ #activeCleanup = null
17
+
18
+ /** @type {import('./types').IEventBus} */
19
+ #events
20
+
21
+ /** @type {string} */
22
+ #changedEvent
23
+
24
+ /** @type {HTMLElement | null} */
25
+ #rootEl = null
26
+
27
+ /** @type {import('./types').IBlockManager} */
28
+ #blocks
29
+
30
+ /** @type {import('./CommandDispatcher').CommandDispatcher} */
31
+ #mutations
32
+
33
+ /** @type {() => boolean} */
34
+ #isReadOnly
35
+
36
+ /**
37
+ * @param {import('./types').IEventBus} events
38
+ * @param {string} changedEvent
39
+ * @param {import('./types').IBlockManager} blocks
40
+ * @param {import('./CommandDispatcher').CommandDispatcher} commands
41
+ * @param {() => boolean} [isReadOnly]
42
+ */
43
+ constructor(events, changedEvent, blocks, commands, isReadOnly = () => false) {
44
+ this.#events = events
45
+ this.#changedEvent = /** @type {*} */ (changedEvent)
46
+ this.#blocks = blocks
47
+ this.#mutations = commands
48
+ this.#isReadOnly = isReadOnly
49
+ }
50
+
51
+ get readOnly() {
52
+ return this.#isReadOnly()
53
+ }
54
+
55
+ /**
56
+ * Set the editor root element (popup inherits CSS variables from it).
57
+ * @param {HTMLElement} rootEl
58
+ */
59
+ setRoot(rootEl) {
60
+ this.#rootEl = rootEl
61
+ }
62
+
63
+ /**
64
+ * Show a popup near an anchor element.
65
+ * @param {HTMLElement} anchor
66
+ * @param {HTMLElement} content
67
+ * @param {(() => void) | undefined} cleanup
68
+ */
69
+ showPopup(anchor, content, cleanup) {
70
+ if (this.readOnly) {
71
+ this.#runCleanup(cleanup)
72
+ return
73
+ }
74
+ this.hidePopup()
75
+
76
+ const popup = document.createElement('div')
77
+ popup.className = 'oe-ip-popup'
78
+ popup.appendChild(content)
79
+
80
+ // Append inside editor root to inherit CSS variables (theme)
81
+ const container = this.#rootEl || document.body
82
+ container.appendChild(popup)
83
+
84
+ // Measure after append so offsetHeight is available.
85
+ // Popup uses position:fixed, so viewport coordinates are correct.
86
+ const rect = anchor.getBoundingClientRect()
87
+ const popupHeight = popup.offsetHeight || 260
88
+ const spaceBelow = window.innerHeight - rect.bottom - 8
89
+
90
+ popup.style.left = `${rect.left}px`
91
+ if (spaceBelow >= popupHeight) {
92
+ popup.style.top = `${rect.bottom + 4}px`
93
+ } else {
94
+ popup.style.top = `${rect.top - popupHeight - 4}px`
95
+ }
96
+
97
+ this.#activePopup = popup
98
+ this.#activeCleanup = cleanup || null
99
+
100
+ // Arm after the opening event finishes, without depending on a rendered
101
+ // animation frame (background tabs may suspend rAF indefinitely).
102
+ queueMicrotask(() => {
103
+ if (this.#activePopup !== popup) return
104
+ this.#outsideClickHandler = (/** @type {MouseEvent} */ e) => {
105
+ const target = e.target
106
+ if (!(target instanceof Node)) return
107
+ if (popup.contains(target)) return
108
+ if (anchor.contains(target)) return
109
+ this.hidePopup()
110
+ }
111
+ document.addEventListener('mousedown', this.#outsideClickHandler, true)
112
+ })
113
+ }
114
+
115
+ hidePopup() {
116
+ if (this.#outsideClickHandler) {
117
+ document.removeEventListener('mousedown', this.#outsideClickHandler, true)
118
+ this.#outsideClickHandler = null
119
+ }
120
+ if (this.#activePopup) {
121
+ this.#activePopup.remove()
122
+ this.#activePopup = null
123
+ }
124
+
125
+ const cleanup = this.#activeCleanup
126
+ this.#activeCleanup = null
127
+ this.#runCleanup(cleanup)
128
+ }
129
+
130
+ /**
131
+ * A plugin disposer must not interrupt a mode switch or editor teardown.
132
+ * @param {(() => void) | null | undefined} cleanup
133
+ */
134
+ #runCleanup(cleanup) {
135
+ if (!cleanup) return
136
+ try {
137
+ cleanup()
138
+ } catch (error) {
139
+ console.error('Inline popup cleanup failed', error)
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Notify through the concrete editing host whenever one can be resolved.
145
+ * This lets the editor invalidate the exact block cache rather than only
146
+ * scheduling a document-level change callback.
147
+ * @param {import('./types').DOMNode} [target]
148
+ */
149
+ notifyChanged(target) {
150
+ if (this.readOnly) return
151
+ const candidate = target
152
+ ?? window.getSelection()?.anchorNode
153
+ ?? document.activeElement
154
+ const element = candidate?.nodeType === Node.ELEMENT_NODE
155
+ ? /** @type {Element} */ (candidate)
156
+ : candidate?.parentElement
157
+ const editable = element?.closest?.('[contenteditable="true"]')
158
+ if (editable && (!this.#rootEl || this.#rootEl.contains(editable))) {
159
+ editable.dispatchEvent(new InputEvent('input', { bubbles: true }))
160
+ return
161
+ }
162
+ this.#events.emit(/** @type {string} */ (this.#changedEvent))
163
+ }
164
+
165
+ /**
166
+ * Execute one inline-widget command against its exact owning block.
167
+ * Detached/stale widget callbacks are ignored.
168
+ * @template T
169
+ * @param {import('./types').DOMNode} target
170
+ * @param {() => T} operation
171
+ * @returns {T | undefined}
172
+ */
173
+ mutate(target, operation) {
174
+ if (this.readOnly) return undefined
175
+ const block = this.#blocks.getBlockByChildNode(target)
176
+ if (!block) return undefined
177
+ return this.#mutations.runForBlock(block, operation)
178
+ }
179
+
180
+ destroy() {
181
+ this.hidePopup()
182
+ }
183
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Create an inert plugin for a document block whose implementation is not
3
+ * registered in this editor instance. The block remains removable and
4
+ * reorderable, but its plugin-owned payload is preserved byte-for-byte at the
5
+ * JSON value level instead of being handed to an unrelated default plugin.
6
+ *
7
+ * @param {string} type
8
+ * @param {(type: string) => string} label
9
+ * @returns {import('./types.js').BlockPlugin}
10
+ */
11
+ export function createPreservedBlockPlugin(type: string, label: (type: string) => string): import("./types.js").BlockPlugin;
@@ -0,0 +1,42 @@
1
+ import { cloneEditorData } from '../shared/cloneEditorData.js'
2
+
3
+ /**
4
+ * Create an inert plugin for a document block whose implementation is not
5
+ * registered in this editor instance. The block remains removable and
6
+ * reorderable, but its plugin-owned payload is preserved byte-for-byte at the
7
+ * JSON value level instead of being handed to an unrelated default plugin.
8
+ *
9
+ * @param {string} type
10
+ * @param {(type: string) => string} label
11
+ * @returns {import('./types').BlockPlugin}
12
+ */
13
+ export function createPreservedBlockPlugin(type, label) {
14
+ /** @type {WeakMap<HTMLElement, Record<string, unknown>>} */
15
+ const dataByElement = new WeakMap()
16
+
17
+ return {
18
+ type,
19
+ title: type,
20
+ icon: '',
21
+ inlineTools: false,
22
+ render(data) {
23
+ const element = document.createElement('div')
24
+ element.className = 'oe-unsupported-block'
25
+ element.setAttribute('role', 'note')
26
+ const message = label(type)
27
+ element.setAttribute('aria-label', message)
28
+ element.textContent = message
29
+ dataByElement.set(element, cloneEditorData(data))
30
+ return element
31
+ },
32
+ save(element) {
33
+ return cloneEditorData(dataByElement.get(element) ?? {})
34
+ },
35
+ validate() {
36
+ return true
37
+ },
38
+ destroy(element) {
39
+ dataByElement.delete(element)
40
+ },
41
+ }
42
+ }