@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,296 @@
1
+ import en from './locale/en.js'
2
+
3
+ /**
4
+ * @typedef {import('./types').I18nMessages} I18nMessages
5
+ * @typedef {import('./types').MessageKey} MessageKey
6
+ * @typedef {import('./types').PluralForms} PluralForms
7
+ * @typedef {import('./types').LocaleValue} LocaleValue
8
+ */
9
+
10
+ /**
11
+ * Pluralization rules per language. Returns the CLDR plural category for a count.
12
+ * Add new languages here as needed; default falls through to English rules.
13
+ *
14
+ * @type {Record<string, (n: number) => 'zero' | 'one' | 'two' | 'few' | 'many' | 'other'>}
15
+ */
16
+ const PLURAL_RULES = {
17
+ en: (n) => (n === 1 ? 'one' : 'other'),
18
+ ru: (n) => {
19
+ const mod10 = n % 10
20
+ const mod100 = n % 100
21
+ if (mod10 === 1 && mod100 !== 11) return 'one'
22
+ if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) return 'few'
23
+ return 'many'
24
+ },
25
+ }
26
+
27
+ /**
28
+ * Interpolate `{name}` placeholders in a message string.
29
+ * @param {string} msg
30
+ * @param {Record<string, string | number>} [params]
31
+ * @returns {string}
32
+ */
33
+ function interpolate(msg, params) {
34
+ if (!params) return msg
35
+ let result = msg
36
+ for (const [k, v] of Object.entries(params)) {
37
+ result = result.replaceAll(`{${k}}`, String(v))
38
+ }
39
+ return result
40
+ }
41
+
42
+ /**
43
+ * Translation dictionary with:
44
+ * - fallback chain (primary → fallback language → key)
45
+ * - explicit `has()` for missing-key detection
46
+ * - plural rules per language (CLDR categories)
47
+ * - scoped sub-instances for plugin namespacing
48
+ * - immutable freeze after init
49
+ * - dev-mode warnings on missing keys
50
+ *
51
+ * Architecturally: ONE instance per editor, shared by core and all plugins.
52
+ * Plugins receive a `ScopedI18n` wrapper that auto-prefixes keys with their
53
+ * type (e.g. `plugin.heading.*`), so plugin code uses short local keys
54
+ * without worrying about cross-plugin collisions.
55
+ */
56
+ export class I18n {
57
+ /** @type {Record<string, LocaleValue>} */
58
+ #messages
59
+
60
+ /** @type {Record<string, LocaleValue> | null} */
61
+ #fallback
62
+
63
+ /** @type {string} */
64
+ #lang
65
+
66
+ /** @type {boolean} */
67
+ #frozen = false
68
+
69
+ /**
70
+ * @param {Partial<I18nMessages>} [messages] primary locale (e.g. ru)
71
+ * @param {Partial<I18nMessages>} [fallback] fallback locale (e.g. en) used when a key is missing in primary
72
+ * @param {string} [lang] language code for plural rules ('en', 'ru', ...)
73
+ */
74
+ constructor(messages, fallback, lang = 'en') {
75
+ this.#messages = /** @type {Record<string, LocaleValue>} */ ({ ...(messages || en) })
76
+ this.#fallback = fallback ? /** @type {Record<string, LocaleValue>} */ ({ ...fallback }) : null
77
+ this.#lang = lang
78
+ }
79
+
80
+ /**
81
+ * Merge additional messages into the primary dictionary.
82
+ * Plugins call this to register their own keys at runtime.
83
+ * Throws after `freeze()`.
84
+ *
85
+ * @param {Partial<I18nMessages>} messages
86
+ */
87
+ merge(messages) {
88
+ if (this.#frozen) throw new Error('[I18n] Dictionary is frozen — cannot merge after init')
89
+ Object.assign(this.#messages, messages)
90
+ }
91
+
92
+ /**
93
+ * Merge additional messages into the fallback dictionary.
94
+ * Used so plugin English locales become the fallback for other languages.
95
+ * Throws after `freeze()`.
96
+ *
97
+ * @param {Partial<I18nMessages>} messages
98
+ */
99
+ mergeFallback(messages) {
100
+ if (this.#frozen) throw new Error('[I18n] Dictionary is frozen — cannot merge after init')
101
+ if (!this.#fallback) this.#fallback = {}
102
+ Object.assign(this.#fallback, messages)
103
+ }
104
+
105
+ /**
106
+ * Lock the dictionary against further mutation. Called by `createEditor`
107
+ * after all plugins have registered. Subsequent `merge()` calls throw,
108
+ * and the underlying objects are deep-frozen.
109
+ */
110
+ freeze() {
111
+ if (this.#frozen) return
112
+ this.#frozen = true
113
+ Object.freeze(this.#messages)
114
+ if (this.#fallback) Object.freeze(this.#fallback)
115
+ }
116
+
117
+ /**
118
+ * @returns {boolean} true if the i18n dictionary has been frozen
119
+ */
120
+ get isFrozen() {
121
+ return this.#frozen
122
+ }
123
+
124
+ /**
125
+ * Check whether a key resolves to anything (primary or fallback).
126
+ * Use this to distinguish "missing" from "intentionally returns the key".
127
+ *
128
+ * @param {MessageKey | (string & {})} key
129
+ * @returns {boolean}
130
+ */
131
+ has(key) {
132
+ if (key in this.#messages) return true
133
+ return !!(this.#fallback && key in this.#fallback);
134
+ }
135
+
136
+ /**
137
+ * Resolve a translation key with optional `{name}` interpolation.
138
+ *
139
+ * Resolution order:
140
+ * 1. primary dictionary
141
+ * 2. fallback dictionary (if set)
142
+ * 3. `defaultValue` from options (if provided)
143
+ * 4. the key itself, verbatim
144
+ *
145
+ * For string values, returns the interpolated message.
146
+ * For plural-form values (object with `one`/`few`/`many`/`other`), returns the
147
+ * `other` form interpolated — callers wanting count-aware selection should use `plural()`.
148
+ *
149
+ * @param {MessageKey | (string & {})} key
150
+ * @param {Record<string, string | number>} [params] interpolation params
151
+ * @returns {string}
152
+ */
153
+ t(key, params) {
154
+ const value = this.#resolve(key)
155
+ if (value === undefined) {
156
+ this.#warnMissing(key)
157
+ return key
158
+ }
159
+ if (typeof value === 'string') return interpolate(value, params)
160
+ // Plural object accessed via t() — fall back to "other" form.
161
+ return interpolate(value.other ?? Object.values(value)[0] ?? '', params)
162
+ }
163
+
164
+ /**
165
+ * Resolve a key as a pluralized message.
166
+ *
167
+ * The locale value should be a `PluralForms` object (`{ one, few, many, other }`).
168
+ * If it's a plain string, it's interpolated with `{count}` like a regular message.
169
+ *
170
+ * The plural form is chosen by CLDR rules for the current language. `count` is
171
+ * automatically merged into `params` so messages can use `{count}`.
172
+ *
173
+ * @param {MessageKey | (string & {})} key
174
+ * @param {number} count
175
+ * @param {Record<string, string | number>} [params]
176
+ * @returns {string}
177
+ */
178
+ plural(key, count, params) {
179
+ const value = this.#resolve(key)
180
+ if (value === undefined) {
181
+ this.#warnMissing(key)
182
+ return key
183
+ }
184
+ const merged = { ...params, count }
185
+ if (typeof value === 'string') return interpolate(value, merged)
186
+
187
+ const rule = PLURAL_RULES[this.#lang] ?? PLURAL_RULES.en
188
+ const category = /** @type {(n: number) => keyof PluralForms} */ (rule)(count)
189
+ const form = value[category] ?? value.other ?? Object.values(value)[0] ?? ''
190
+ return interpolate(form, merged)
191
+ }
192
+
193
+ /**
194
+ * Create a scoped wrapper that auto-prefixes every key with `prefix.`
195
+ * (e.g. `i18n.scope('plugin.heading')` makes `t('title')` resolve `plugin.heading.title`).
196
+ *
197
+ * Backward-compat: keys that already start with `prefix.` are passed through
198
+ * untouched, so legacy plugin code using full keys keeps working alongside
199
+ * new code using short keys.
200
+ *
201
+ * @param {string} prefix
202
+ * @returns {ScopedI18n}
203
+ */
204
+ scope(prefix) {
205
+ return new ScopedI18n(this, prefix)
206
+ }
207
+
208
+ // ── private ────────────────────────────────────────────────────────────────
209
+
210
+ /**
211
+ * @param {string} key
212
+ * @returns {LocaleValue | undefined}
213
+ */
214
+ #resolve(key) {
215
+ if (key in this.#messages) return this.#messages[key]
216
+ if (this.#fallback && key in this.#fallback) return this.#fallback[key]
217
+ return undefined
218
+ }
219
+
220
+ /** @param {string} key */
221
+ #warnMissing(key) {
222
+ // Dev warning — surfaces missing keys early during plugin development.
223
+ // Disabled when frozen has run AND we're not in dev (heuristic: warn if window
224
+ // exists, since this is a browser-side library).
225
+ if (typeof console !== 'undefined' && console.warn) {
226
+ console.warn(`[I18n] Missing translation key: "${key}"`)
227
+ }
228
+ }
229
+ }
230
+
231
+ /**
232
+ * Plugin-facing i18n wrapper. Auto-prefixes every key with the plugin's
233
+ * namespace, so plugin code can write `_t('title')` instead of
234
+ * `_t('plugin.heading.title')`.
235
+ *
236
+ * Backward-compat: if a caller passes a key that already starts with the
237
+ * prefix, it's left untouched. This lets old code coexist with new code
238
+ * during incremental migration.
239
+ */
240
+ export class ScopedI18n {
241
+ /** @type {I18n} */
242
+ #parent
243
+
244
+ /** @type {string} */
245
+ #prefix
246
+
247
+ /**
248
+ * @param {I18n} parent
249
+ * @param {string} prefix
250
+ */
251
+ constructor(parent, prefix) {
252
+ this.#parent = parent
253
+ this.#prefix = prefix
254
+ }
255
+
256
+ /** @param {string} key */
257
+ #fullKey(key) {
258
+ return key.startsWith(this.#prefix + '.') ? key : `${this.#prefix}.${key}`
259
+ }
260
+
261
+ /**
262
+ * @param {string} key
263
+ * @param {Record<string, string | number>} [params]
264
+ * @returns {string}
265
+ */
266
+ t(key, params) {
267
+ return this.#parent.t(this.#fullKey(key), params)
268
+ }
269
+
270
+ /**
271
+ * @param {string} key
272
+ * @returns {boolean}
273
+ */
274
+ has(key) {
275
+ return this.#parent.has(this.#fullKey(key))
276
+ }
277
+
278
+ /**
279
+ * @param {string} key
280
+ * @param {number} count
281
+ * @param {Record<string, string | number>} [params]
282
+ * @returns {string}
283
+ */
284
+ plural(key, count, params) {
285
+ return this.#parent.plural(this.#fullKey(key), count, params)
286
+ }
287
+
288
+ /**
289
+ * Create a sub-scope under the current prefix.
290
+ * @param {string} sub
291
+ * @returns {ScopedI18n}
292
+ */
293
+ scope(sub) {
294
+ return new ScopedI18n(this.#parent, `${this.#prefix}.${sub}`)
295
+ }
296
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @typedef {{ plugin: import('./types.js').InlinePlugin, pattern: RegExp }} PatternEntry
3
+ */
4
+ /**
5
+ * Matches text patterns in contenteditable blocks and replaces them with inline plugin widgets.
6
+ * Handles:
7
+ * - Paste: scan all text nodes after paste for pattern matches
8
+ * - Input: when space/Enter is typed, check previous word for pattern match
9
+ */
10
+ export class InlinePatternMatcher {
11
+ /**
12
+ * @param {HTMLElement} rootEl
13
+ * @param {import('./types.js').IInlinePluginRegistry} registry
14
+ * @param {import('./types.js').InlinePluginContext} ctx
15
+ * @param {import('./types.js').IEventBus} events
16
+ * @param {import('./types.js').IBlockManager} blocks
17
+ * @param {import('./CommandDispatcher.js').CommandDispatcher} commands
18
+ */
19
+ constructor(rootEl: HTMLElement, registry: import("./types.js").IInlinePluginRegistry, ctx: import("./types.js").InlinePluginContext, events: import("./types.js").IEventBus, blocks: import("./types.js").IBlockManager, commands: import("./CommandDispatcher.js").CommandDispatcher);
20
+ destroy(): void;
21
+ #private;
22
+ }
23
+ export type PatternEntry = {
24
+ plugin: import("./types.js").InlinePlugin;
25
+ pattern: RegExp;
26
+ };
@@ -0,0 +1,267 @@
1
+ import { EditorEvent } from './editorEvents.js'
2
+ import { hydrateInlinePlugins } from './hydrateInlinePlugins.js'
3
+
4
+ /**
5
+ * @typedef {{ plugin: import('./types').InlinePlugin, pattern: RegExp }} PatternEntry
6
+ */
7
+
8
+ /**
9
+ * Matches text patterns in contenteditable blocks and replaces them with inline plugin widgets.
10
+ * Handles:
11
+ * - Paste: scan all text nodes after paste for pattern matches
12
+ * - Input: when space/Enter is typed, check previous word for pattern match
13
+ */
14
+ export class InlinePatternMatcher {
15
+ /** @type {HTMLElement} */
16
+ #rootEl
17
+
18
+ /** @type {import('./types').IInlinePluginRegistry} */
19
+ #registry
20
+
21
+ /** @type {import('./types').InlinePluginContext} */
22
+ #ctx
23
+
24
+ /** @type {import('./types').IEventBus} */
25
+ #events
26
+
27
+ /** @type {import('./types').IBlockManager} */
28
+ #blocks
29
+
30
+ /** @type {import('./CommandDispatcher').CommandDispatcher} */
31
+ #mutations
32
+
33
+ /** @type {() => void} */
34
+ #unsubscribePasteApplied
35
+
36
+ /** @type {PatternEntry[]} */
37
+ #patterns = []
38
+
39
+ /**
40
+ * @param {HTMLElement} rootEl
41
+ * @param {import('./types').IInlinePluginRegistry} registry
42
+ * @param {import('./types').InlinePluginContext} ctx
43
+ * @param {import('./types').IEventBus} events
44
+ * @param {import('./types').IBlockManager} blocks
45
+ * @param {import('./CommandDispatcher').CommandDispatcher} commands
46
+ */
47
+ constructor(rootEl, registry, ctx, events, blocks, commands) {
48
+ this.#rootEl = rootEl
49
+ this.#registry = registry
50
+ this.#ctx = ctx
51
+ this.#events = events
52
+ this.#blocks = blocks
53
+ this.#mutations = commands
54
+
55
+ // Collect all patterns from plugins
56
+ for (const plugin of registry.values()) {
57
+ if (plugin.pasteConfig?.patterns) {
58
+ for (const pattern of plugin.pasteConfig.patterns) {
59
+ this.#patterns.push({ plugin, pattern })
60
+ }
61
+ }
62
+ }
63
+
64
+ if (this.#patterns.length === 0) return
65
+
66
+ this.#unsubscribePasteApplied = events.on(EditorEvent.PASTE_APPLIED, this.#onPasteApplied)
67
+ rootEl.addEventListener('keydown', this.#onKeyDown)
68
+ }
69
+
70
+ destroy() {
71
+ this.#unsubscribePasteApplied?.()
72
+ this.#rootEl.removeEventListener('keydown', this.#onKeyDown)
73
+ }
74
+
75
+ /**
76
+ * Scan the exact block interval affected by Clipboard while its undo batch
77
+ * is still open, so paste + automatic widgets remain one history step.
78
+ * @param {{ startBlockId?: string, endBlockId?: string }} payload
79
+ */
80
+ #onPasteApplied = (payload = {}) => {
81
+ const start = payload.startBlockId
82
+ ? this.#blocks.getBlockIndex(payload.startBlockId)
83
+ : this.#blocks.getCurrentIndex()
84
+ const end = payload.endBlockId
85
+ ? this.#blocks.getBlockIndex(payload.endBlockId)
86
+ : this.#blocks.getCurrentIndex()
87
+ if (start < 0 || end < 0) return
88
+
89
+ const candidates = []
90
+ for (let index = Math.min(start, end); index <= Math.max(start, end); index++) {
91
+ const block = this.#blocks.getBlockByIndex(index)
92
+ if (block) candidates.push(block)
93
+ }
94
+ this.#replacePatterns(candidates)
95
+ }
96
+
97
+ /**
98
+ * On space/Enter, check if the word before caret matches a pattern.
99
+ */
100
+ #onKeyDown = (/** @type {KeyboardEvent} */ e) => {
101
+ if (e.key !== ' ' && e.key !== 'Enter') return
102
+
103
+ const sel = window.getSelection()
104
+ if (!sel || !sel.isCollapsed || !sel.rangeCount) return
105
+
106
+ const node = sel.anchorNode
107
+ if (!node || node.nodeType !== Node.TEXT_NODE) return
108
+ const textNode = /** @type {import('./types').DOMText} */ (node)
109
+ // Skip inside inline plugin widgets
110
+ if (/** @type {Element | null} */ (node.parentElement)?.closest('[data-inline-plugin]')) return
111
+
112
+ const offset = sel.anchorOffset
113
+ const text = textNode.data
114
+ if (!text || offset === 0) return
115
+
116
+ // Extract the word before caret (back to previous space or start)
117
+ let wordStart = offset - 1
118
+ while (wordStart > 0 && text[wordStart - 1] !== ' ' && text[wordStart - 1] !== '\u00A0') {
119
+ wordStart--
120
+ }
121
+
122
+ const word = text.slice(wordStart, offset)
123
+ if (!word) return
124
+
125
+ // Check against patterns
126
+ for (const { plugin, pattern } of this.#patterns) {
127
+ if (this.#matches(pattern, word)) {
128
+ e.preventDefault()
129
+ e.stopPropagation()
130
+ const block = this.#blocks.getBlockByChildNode(node)
131
+ if (!block) return
132
+ this.#mutations.runForBlock(block, () => {
133
+ this.#replaceMatch(textNode, wordStart, offset, plugin, word)
134
+
135
+ // Insert the space that was suppressed by preventDefault
136
+ if (e.key === ' ') {
137
+ const r = sel.getRangeAt(0)
138
+ const spaceNode = document.createTextNode(' ')
139
+ r.insertNode(spaceNode)
140
+ r.setStartAfter(spaceNode)
141
+ r.collapse(true)
142
+ sel.removeAllRanges()
143
+ sel.addRange(r)
144
+ }
145
+ })
146
+ return
147
+ }
148
+ }
149
+ }
150
+
151
+ /** @param {import('./types').IBlock[]} blocks */
152
+ #replacePatterns(blocks) {
153
+ /** @type {Map<import('./types').IBlock, { node: import('./types').DOMText, match: string, start: number, end: number, plugin: import('./types').InlinePlugin }[]>} */
154
+ const matchesByBlock = new Map()
155
+ for (const block of blocks) {
156
+ const matches = []
157
+ const walker = document.createTreeWalker(block.contentElement, NodeFilter.SHOW_TEXT)
158
+ while (walker.nextNode()) {
159
+ const node = /** @type {import('./types').DOMText} */ (walker.currentNode)
160
+ if (node.parentElement?.closest('[data-inline-plugin]')) continue
161
+ this.#findMatches(node.textContent || '', node, matches)
162
+ }
163
+ if (matches.length > 0) matchesByBlock.set(block, matches)
164
+ }
165
+ if (matchesByBlock.size === 0) return
166
+
167
+ this.#mutations.runForBlocks(matchesByBlock.keys(), () => {
168
+ for (const [block, matches] of matchesByBlock) {
169
+ for (let index = matches.length - 1; index >= 0; index--) {
170
+ const match = matches[index]
171
+ if (match) this.#replaceMatch(match.node, match.start, match.end, match.plugin, match.match)
172
+ }
173
+ hydrateInlinePlugins(block.contentElement, this.#registry, this.#ctx)
174
+ }
175
+ })
176
+ }
177
+
178
+ /**
179
+ * Find all pattern matches in a text string.
180
+ * @param {string} text
181
+ * @param {import('./types').DOMText} node
182
+ * @param {{ node: import('./types').DOMText, match: string, start: number, end: number, plugin: import('./types').InlinePlugin }[]} results
183
+ */
184
+ #findMatches(text, node, results) {
185
+ // Split text by whitespace and check each word
186
+ const words = text.split(/(\s+)/)
187
+ let pos = 0
188
+
189
+ for (const segment of words) {
190
+ if (/^\s+$/.test(segment)) {
191
+ pos += segment.length
192
+ continue
193
+ }
194
+
195
+ for (const { plugin, pattern } of this.#patterns) {
196
+ if (this.#matches(pattern, segment)) {
197
+ results.push({
198
+ node,
199
+ match: segment,
200
+ start: pos,
201
+ end: pos + segment.length,
202
+ plugin,
203
+ })
204
+ break // One match per word
205
+ }
206
+ }
207
+
208
+ pos += segment.length
209
+ }
210
+ }
211
+
212
+ /**
213
+ * RegExp instances are plugin-owned and may use `g` or `y`. Calling
214
+ * `test()` on those expressions mutates `lastIndex`, which otherwise makes
215
+ * identical adjacent patterns match only intermittently.
216
+ * @param {RegExp} pattern
217
+ * @param {string} value
218
+ */
219
+ #matches(pattern, value) {
220
+ pattern.lastIndex = 0
221
+ const matched = pattern.test(value)
222
+ pattern.lastIndex = 0
223
+ return matched
224
+ }
225
+
226
+ /**
227
+ * Replace a text range with an inline plugin widget.
228
+ * @param {import('./types').DOMText} textNode
229
+ * @param {number} start
230
+ * @param {number} end
231
+ * @param {import('./types').InlinePlugin} plugin
232
+ * @param {string} matchText
233
+ */
234
+ #replaceMatch(textNode, start, end, plugin, matchText) {
235
+ const data = plugin.onPatternMatch?.(matchText) ?? { value: matchText }
236
+ const widget = plugin.createWidget(data)
237
+ if (!(widget instanceof HTMLElement)) {
238
+ throw new TypeError(`Inline plugin "${plugin.type}" createWidget() must return an HTMLElement`)
239
+ }
240
+
241
+ // Split text node to isolate the match
242
+ if (end < textNode.length) {
243
+ textNode.splitText(end)
244
+ }
245
+ const targetNode = start > 0
246
+ ? /** @type {import('./types').DOMText} */ (textNode.splitText(start))
247
+ : textNode
248
+
249
+ // Replace the matched text with widget
250
+ targetNode.parentNode?.insertBefore(widget, targetNode)
251
+ targetNode.remove()
252
+
253
+ // Hydrate immediately
254
+ plugin.hydrate(widget, this.#ctx)
255
+ widget.dataset.hydrated = '1'
256
+
257
+ // Place caret after widget
258
+ const sel = window.getSelection()
259
+ if (sel) {
260
+ const range = document.createRange()
261
+ range.setStartAfter(widget)
262
+ range.collapse(true)
263
+ sel.removeAllRanges()
264
+ sel.addRange(range)
265
+ }
266
+ }
267
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @typedef {import('./types.js').InlinePlugin} InlinePlugin
3
+ * @typedef {import('./types.js').InlinePluginContext} InlinePluginContext
4
+ */
5
+ /** @typedef {import('./types.js').IInlinePluginRegistry} IInlinePluginRegistryContract */
6
+ /**
7
+ * Registry for inline plugins (widgets inside text blocks).
8
+ * Inline plugins are different from block plugins (full blocks) and inline tools (text formatting).
9
+ * @implements {IInlinePluginRegistryContract}
10
+ */
11
+ export class InlinePluginRegistry implements IInlinePluginRegistryContract {
12
+ /**
13
+ * @param {InlinePlugin[]} plugins
14
+ */
15
+ constructor(plugins?: InlinePlugin[]);
16
+ /**
17
+ * @param {InlinePlugin} plugin
18
+ */
19
+ register(plugin: InlinePlugin): void;
20
+ /**
21
+ * @param {string} type
22
+ * @returns {InlinePlugin | undefined}
23
+ */
24
+ get(type: string): InlinePlugin | undefined;
25
+ /**
26
+ * @param {string} char
27
+ * @returns {InlinePlugin | undefined}
28
+ */
29
+ getByTrigger(char: string): InlinePlugin | undefined;
30
+ /** @returns {IterableIterator<InlinePlugin>} */
31
+ values(): IterableIterator<InlinePlugin>;
32
+ /** @returns {number} */
33
+ get size(): number;
34
+ /** @returns {boolean} */
35
+ get hasTriggers(): boolean;
36
+ /**
37
+ * Acquire resources that must be scoped to one live editor root.
38
+ * @param {HTMLElement} rootElement
39
+ * @param {import('./types.js').InlinePluginContext} ctx
40
+ */
41
+ mount(rootElement: HTMLElement, ctx: import("./types.js").InlinePluginContext): void;
42
+ /**
43
+ * Get all registered trigger characters.
44
+ * @returns {string[]}
45
+ */
46
+ triggerKeys(): string[];
47
+ /**
48
+ * Release plugin-level resources such as global listeners and shared styles.
49
+ */
50
+ destroy(): void;
51
+ #private;
52
+ }
53
+ export type InlinePlugin = import("./types.js").InlinePlugin;
54
+ export type InlinePluginContext = import("./types.js").InlinePluginContext;
55
+ export type IInlinePluginRegistryContract = import("./types.js").IInlinePluginRegistry;