@jackuait/blok 0.4.1-beta.0 → 0.4.1-beta.11

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 (402) hide show
  1. package/README.md +138 -17
  2. package/codemod/README.md +45 -7
  3. package/codemod/migrate-editorjs-to-blok.js +960 -92
  4. package/codemod/test.js +780 -77
  5. package/dist/blok.mjs +5 -2
  6. package/dist/chunks/blok-oNSQ3HA6.mjs +13217 -0
  7. package/dist/chunks/i18next-CugVlwWp.mjs +1292 -0
  8. package/dist/chunks/i18next-loader-BdNRw4n4.mjs +43 -0
  9. package/dist/{index-OwEtDFlk.mjs → chunks/index-DHgXmfki.mjs} +2 -2
  10. package/dist/chunks/inline-tool-convert-CRqgjRim.mjs +1989 -0
  11. package/dist/chunks/messages-0tDXLuyH.mjs +48 -0
  12. package/dist/chunks/messages-2_xedlYw.mjs +48 -0
  13. package/dist/chunks/messages-AHESHJm_.mjs +48 -0
  14. package/dist/chunks/messages-B5hdXZwA.mjs +48 -0
  15. package/dist/chunks/messages-B5jGUnOy.mjs +48 -0
  16. package/dist/chunks/messages-B5puUm7R.mjs +48 -0
  17. package/dist/chunks/messages-B66ZSDCJ.mjs +48 -0
  18. package/dist/chunks/messages-B9Oba7sq.mjs +48 -0
  19. package/dist/chunks/messages-BA0rcTCY.mjs +48 -0
  20. package/dist/chunks/messages-BBJgd5jG.mjs +48 -0
  21. package/dist/chunks/messages-BPqWKx5Z.mjs +48 -0
  22. package/dist/chunks/messages-Bdv-IkfG.mjs +48 -0
  23. package/dist/chunks/messages-BeUhMpsr.mjs +48 -0
  24. package/dist/chunks/messages-Bf6Y3_GI.mjs +48 -0
  25. package/dist/chunks/messages-BiExzWJv.mjs +48 -0
  26. package/dist/chunks/messages-BlpqL8vG.mjs +48 -0
  27. package/dist/chunks/messages-BmKCChWZ.mjs +48 -0
  28. package/dist/chunks/messages-Bn253WWC.mjs +48 -0
  29. package/dist/chunks/messages-BrJHUxQL.mjs +48 -0
  30. package/dist/chunks/messages-C5b7hr_E.mjs +48 -0
  31. package/dist/chunks/messages-C7I_AVH2.mjs +48 -0
  32. package/dist/chunks/messages-CJoBtXU6.mjs +48 -0
  33. package/dist/chunks/messages-CQj2JU2j.mjs +48 -0
  34. package/dist/chunks/messages-CUZ1x1QD.mjs +48 -0
  35. package/dist/chunks/messages-CUy1vn-b.mjs +48 -0
  36. package/dist/chunks/messages-CVeWVKsV.mjs +48 -0
  37. package/dist/chunks/messages-CXHd9SUK.mjs +48 -0
  38. package/dist/chunks/messages-CbMyJSzS.mjs +48 -0
  39. package/dist/chunks/messages-CbhuIWRJ.mjs +48 -0
  40. package/dist/chunks/messages-CeCjVKMW.mjs +48 -0
  41. package/dist/chunks/messages-Cj-t1bdy.mjs +48 -0
  42. package/dist/chunks/messages-CkFT2gle.mjs +48 -0
  43. package/dist/chunks/messages-Cm9aLHeX.mjs +48 -0
  44. package/dist/chunks/messages-CnvW8Slp.mjs +48 -0
  45. package/dist/chunks/messages-Cr-RJ7YB.mjs +48 -0
  46. package/dist/chunks/messages-CrsJ1TEJ.mjs +48 -0
  47. package/dist/chunks/messages-Cu08aLS3.mjs +48 -0
  48. package/dist/chunks/messages-CvaqJFN-.mjs +48 -0
  49. package/dist/chunks/messages-CyDU5lz9.mjs +48 -0
  50. package/dist/chunks/messages-CySyfkMU.mjs +48 -0
  51. package/dist/chunks/messages-Cyi2AMmz.mjs +48 -0
  52. package/dist/chunks/messages-D00OjS2n.mjs +48 -0
  53. package/dist/chunks/messages-DDLgIPDF.mjs +48 -0
  54. package/dist/chunks/messages-DMQIHGRj.mjs +48 -0
  55. package/dist/chunks/messages-DOlC_Tty.mjs +48 -0
  56. package/dist/chunks/messages-DV6shA9b.mjs +48 -0
  57. package/dist/chunks/messages-DY94ykcE.mjs +48 -0
  58. package/dist/chunks/messages-DbVquYKN.mjs +48 -0
  59. package/dist/chunks/messages-DcKOuncK.mjs +48 -0
  60. package/dist/chunks/messages-Dg92dXZ5.mjs +48 -0
  61. package/dist/chunks/messages-DnbbyJT3.mjs +48 -0
  62. package/dist/chunks/messages-DteYq0rv.mjs +48 -0
  63. package/dist/chunks/messages-GC2PhgV3.mjs +48 -0
  64. package/dist/chunks/messages-JGsXAReJ.mjs +48 -0
  65. package/dist/chunks/messages-JZUhXTuV.mjs +48 -0
  66. package/dist/chunks/messages-LvFKBBPa.mjs +48 -0
  67. package/dist/chunks/messages-NP1myMGI.mjs +48 -0
  68. package/dist/chunks/messages-Q4kc_ZtL.mjs +48 -0
  69. package/dist/chunks/messages-RvMHb2Ht.mjs +48 -0
  70. package/dist/chunks/messages-ftMcCEuO.mjs +48 -0
  71. package/dist/chunks/messages-o24dK6CU.mjs +48 -0
  72. package/dist/chunks/messages-pA5TvcAj.mjs +48 -0
  73. package/dist/chunks/messages-rRSHQDCX.mjs +48 -0
  74. package/dist/chunks/messages-srxrv8Yh.mjs +48 -0
  75. package/dist/chunks/messages-wdqp4610.mjs +48 -0
  76. package/dist/chunks/messages-zS1AXZ0y.mjs +48 -0
  77. package/dist/chunks/messages-zSzDzXej.mjs +48 -0
  78. package/dist/full.mjs +50 -0
  79. package/dist/locales.mjs +228 -0
  80. package/dist/messages-0tDXLuyH.mjs +48 -0
  81. package/dist/messages-2_xedlYw.mjs +48 -0
  82. package/dist/messages-AHESHJm_.mjs +48 -0
  83. package/dist/messages-B5hdXZwA.mjs +48 -0
  84. package/dist/messages-B5jGUnOy.mjs +48 -0
  85. package/dist/messages-B5puUm7R.mjs +48 -0
  86. package/dist/messages-B66ZSDCJ.mjs +48 -0
  87. package/dist/messages-B9Oba7sq.mjs +48 -0
  88. package/dist/messages-BA0rcTCY.mjs +48 -0
  89. package/dist/messages-BBJgd5jG.mjs +48 -0
  90. package/dist/messages-BPqWKx5Z.mjs +48 -0
  91. package/dist/messages-Bdv-IkfG.mjs +48 -0
  92. package/dist/messages-BeUhMpsr.mjs +48 -0
  93. package/dist/messages-Bf6Y3_GI.mjs +48 -0
  94. package/dist/messages-BiExzWJv.mjs +48 -0
  95. package/dist/messages-BlpqL8vG.mjs +48 -0
  96. package/dist/messages-BmKCChWZ.mjs +48 -0
  97. package/dist/messages-Bn253WWC.mjs +48 -0
  98. package/dist/messages-BrJHUxQL.mjs +48 -0
  99. package/dist/messages-C5b7hr_E.mjs +48 -0
  100. package/dist/messages-C7I_AVH2.mjs +48 -0
  101. package/dist/messages-CJoBtXU6.mjs +48 -0
  102. package/dist/messages-CQj2JU2j.mjs +48 -0
  103. package/dist/messages-CUZ1x1QD.mjs +48 -0
  104. package/dist/messages-CUy1vn-b.mjs +48 -0
  105. package/dist/messages-CVeWVKsV.mjs +48 -0
  106. package/dist/messages-CXHd9SUK.mjs +48 -0
  107. package/dist/messages-CbMyJSzS.mjs +48 -0
  108. package/dist/messages-CbhuIWRJ.mjs +48 -0
  109. package/dist/messages-CeCjVKMW.mjs +48 -0
  110. package/dist/messages-Cj-t1bdy.mjs +48 -0
  111. package/dist/messages-CkFT2gle.mjs +48 -0
  112. package/dist/messages-Cm9aLHeX.mjs +48 -0
  113. package/dist/messages-CnvW8Slp.mjs +48 -0
  114. package/dist/messages-Cr-RJ7YB.mjs +48 -0
  115. package/dist/messages-CrsJ1TEJ.mjs +48 -0
  116. package/dist/messages-Cu08aLS3.mjs +48 -0
  117. package/dist/messages-CvaqJFN-.mjs +48 -0
  118. package/dist/messages-CyDU5lz9.mjs +48 -0
  119. package/dist/messages-CySyfkMU.mjs +48 -0
  120. package/dist/messages-Cyi2AMmz.mjs +48 -0
  121. package/dist/messages-D00OjS2n.mjs +48 -0
  122. package/dist/messages-DDLgIPDF.mjs +48 -0
  123. package/dist/messages-DMQIHGRj.mjs +48 -0
  124. package/dist/messages-DOlC_Tty.mjs +48 -0
  125. package/dist/messages-DV6shA9b.mjs +48 -0
  126. package/dist/messages-DY94ykcE.mjs +48 -0
  127. package/dist/messages-DbVquYKN.mjs +48 -0
  128. package/dist/messages-DcKOuncK.mjs +48 -0
  129. package/dist/messages-Dg92dXZ5.mjs +48 -0
  130. package/dist/messages-DnbbyJT3.mjs +48 -0
  131. package/dist/messages-DteYq0rv.mjs +48 -0
  132. package/dist/messages-GC2PhgV3.mjs +48 -0
  133. package/dist/messages-JGsXAReJ.mjs +48 -0
  134. package/dist/messages-JZUhXTuV.mjs +48 -0
  135. package/dist/messages-LvFKBBPa.mjs +48 -0
  136. package/dist/messages-NP1myMGI.mjs +48 -0
  137. package/dist/messages-Q4kc_ZtL.mjs +48 -0
  138. package/dist/messages-RvMHb2Ht.mjs +48 -0
  139. package/dist/messages-ftMcCEuO.mjs +48 -0
  140. package/dist/messages-o24dK6CU.mjs +48 -0
  141. package/dist/messages-pA5TvcAj.mjs +48 -0
  142. package/dist/messages-rRSHQDCX.mjs +48 -0
  143. package/dist/messages-srxrv8Yh.mjs +48 -0
  144. package/dist/messages-wdqp4610.mjs +48 -0
  145. package/dist/messages-zS1AXZ0y.mjs +48 -0
  146. package/dist/messages-zSzDzXej.mjs +48 -0
  147. package/dist/tools.mjs +3117 -0
  148. package/dist/vendor.LICENSE.txt +26 -225
  149. package/package.json +63 -24
  150. package/src/blok.ts +267 -0
  151. package/src/components/__module.ts +139 -0
  152. package/src/components/block/api.ts +155 -0
  153. package/src/components/block/index.ts +1428 -0
  154. package/src/components/block-tunes/block-tune-delete.ts +51 -0
  155. package/src/components/blocks.ts +352 -0
  156. package/src/components/constants/data-attributes.ts +344 -0
  157. package/src/components/constants.ts +76 -0
  158. package/src/components/core.ts +392 -0
  159. package/src/components/dom.ts +773 -0
  160. package/src/components/domIterator.ts +189 -0
  161. package/src/components/errors/critical.ts +5 -0
  162. package/src/components/events/BlockChanged.ts +16 -0
  163. package/src/components/events/BlockHovered.ts +21 -0
  164. package/src/components/events/BlockSettingsClosed.ts +12 -0
  165. package/src/components/events/BlockSettingsOpened.ts +12 -0
  166. package/src/components/events/BlokMobileLayoutToggled.ts +15 -0
  167. package/src/components/events/FakeCursorAboutToBeToggled.ts +17 -0
  168. package/src/components/events/FakeCursorHaveBeenSet.ts +17 -0
  169. package/src/components/events/HistoryStateChanged.ts +19 -0
  170. package/src/components/events/RedactorDomChanged.ts +14 -0
  171. package/src/components/events/index.ts +46 -0
  172. package/src/components/flipper.ts +497 -0
  173. package/src/components/i18n/i18next-loader.ts +84 -0
  174. package/src/components/i18n/lightweight-i18n.ts +86 -0
  175. package/src/components/i18n/locales/TRANSLATION_GUIDELINES.md +113 -0
  176. package/src/components/i18n/locales/am/messages.json +45 -0
  177. package/src/components/i18n/locales/ar/messages.json +45 -0
  178. package/src/components/i18n/locales/az/messages.json +45 -0
  179. package/src/components/i18n/locales/bg/messages.json +45 -0
  180. package/src/components/i18n/locales/bn/messages.json +45 -0
  181. package/src/components/i18n/locales/bs/messages.json +45 -0
  182. package/src/components/i18n/locales/cs/messages.json +45 -0
  183. package/src/components/i18n/locales/da/messages.json +45 -0
  184. package/src/components/i18n/locales/de/messages.json +45 -0
  185. package/src/components/i18n/locales/dv/messages.json +45 -0
  186. package/src/components/i18n/locales/el/messages.json +45 -0
  187. package/src/components/i18n/locales/en/messages.json +45 -0
  188. package/src/components/i18n/locales/es/messages.json +45 -0
  189. package/src/components/i18n/locales/et/messages.json +45 -0
  190. package/src/components/i18n/locales/fa/messages.json +45 -0
  191. package/src/components/i18n/locales/fi/messages.json +45 -0
  192. package/src/components/i18n/locales/fil/messages.json +45 -0
  193. package/src/components/i18n/locales/fr/messages.json +45 -0
  194. package/src/components/i18n/locales/gu/messages.json +45 -0
  195. package/src/components/i18n/locales/he/messages.json +45 -0
  196. package/src/components/i18n/locales/hi/messages.json +45 -0
  197. package/src/components/i18n/locales/hr/messages.json +45 -0
  198. package/src/components/i18n/locales/hu/messages.json +45 -0
  199. package/src/components/i18n/locales/hy/messages.json +45 -0
  200. package/src/components/i18n/locales/id/messages.json +45 -0
  201. package/src/components/i18n/locales/index.ts +231 -0
  202. package/src/components/i18n/locales/it/messages.json +45 -0
  203. package/src/components/i18n/locales/ja/messages.json +45 -0
  204. package/src/components/i18n/locales/ka/messages.json +45 -0
  205. package/src/components/i18n/locales/km/messages.json +45 -0
  206. package/src/components/i18n/locales/kn/messages.json +45 -0
  207. package/src/components/i18n/locales/ko/messages.json +45 -0
  208. package/src/components/i18n/locales/ku/messages.json +45 -0
  209. package/src/components/i18n/locales/lo/messages.json +45 -0
  210. package/src/components/i18n/locales/lt/messages.json +45 -0
  211. package/src/components/i18n/locales/lv/messages.json +45 -0
  212. package/src/components/i18n/locales/mk/messages.json +45 -0
  213. package/src/components/i18n/locales/ml/messages.json +45 -0
  214. package/src/components/i18n/locales/mn/messages.json +45 -0
  215. package/src/components/i18n/locales/mr/messages.json +45 -0
  216. package/src/components/i18n/locales/ms/messages.json +45 -0
  217. package/src/components/i18n/locales/my/messages.json +45 -0
  218. package/src/components/i18n/locales/ne/messages.json +45 -0
  219. package/src/components/i18n/locales/nl/messages.json +45 -0
  220. package/src/components/i18n/locales/no/messages.json +45 -0
  221. package/src/components/i18n/locales/pa/messages.json +45 -0
  222. package/src/components/i18n/locales/pl/messages.json +45 -0
  223. package/src/components/i18n/locales/ps/messages.json +45 -0
  224. package/src/components/i18n/locales/pt/messages.json +45 -0
  225. package/src/components/i18n/locales/ro/messages.json +45 -0
  226. package/src/components/i18n/locales/ru/messages.json +45 -0
  227. package/src/components/i18n/locales/sd/messages.json +45 -0
  228. package/src/components/i18n/locales/si/messages.json +45 -0
  229. package/src/components/i18n/locales/sk/messages.json +45 -0
  230. package/src/components/i18n/locales/sl/messages.json +45 -0
  231. package/src/components/i18n/locales/sq/messages.json +45 -0
  232. package/src/components/i18n/locales/sr/messages.json +45 -0
  233. package/src/components/i18n/locales/sv/messages.json +45 -0
  234. package/src/components/i18n/locales/sw/messages.json +45 -0
  235. package/src/components/i18n/locales/ta/messages.json +45 -0
  236. package/src/components/i18n/locales/te/messages.json +45 -0
  237. package/src/components/i18n/locales/th/messages.json +45 -0
  238. package/src/components/i18n/locales/tr/messages.json +45 -0
  239. package/src/components/i18n/locales/ug/messages.json +45 -0
  240. package/src/components/i18n/locales/uk/messages.json +45 -0
  241. package/src/components/i18n/locales/ur/messages.json +45 -0
  242. package/src/components/i18n/locales/vi/messages.json +45 -0
  243. package/src/components/i18n/locales/yi/messages.json +45 -0
  244. package/src/components/i18n/locales/zh/messages.json +45 -0
  245. package/src/components/icons/index.ts +242 -0
  246. package/src/components/inline-tools/inline-tool-bold.ts +2213 -0
  247. package/src/components/inline-tools/inline-tool-convert.ts +141 -0
  248. package/src/components/inline-tools/inline-tool-italic.ts +500 -0
  249. package/src/components/inline-tools/inline-tool-link.ts +539 -0
  250. package/src/components/modules/api/blocks.ts +377 -0
  251. package/src/components/modules/api/caret.ts +125 -0
  252. package/src/components/modules/api/events.ts +51 -0
  253. package/src/components/modules/api/history.ts +73 -0
  254. package/src/components/modules/api/i18n.ts +35 -0
  255. package/src/components/modules/api/index.ts +39 -0
  256. package/src/components/modules/api/inlineToolbar.ts +33 -0
  257. package/src/components/modules/api/listeners.ts +56 -0
  258. package/src/components/modules/api/notifier.ts +46 -0
  259. package/src/components/modules/api/readonly.ts +39 -0
  260. package/src/components/modules/api/sanitizer.ts +30 -0
  261. package/src/components/modules/api/saver.ts +52 -0
  262. package/src/components/modules/api/selection.ts +48 -0
  263. package/src/components/modules/api/styles.ts +72 -0
  264. package/src/components/modules/api/toolbar.ts +79 -0
  265. package/src/components/modules/api/tools.ts +16 -0
  266. package/src/components/modules/api/tooltip.ts +67 -0
  267. package/src/components/modules/api/ui.ts +36 -0
  268. package/src/components/modules/blockEvents.ts +1591 -0
  269. package/src/components/modules/blockManager.ts +1356 -0
  270. package/src/components/modules/blockSelection.ts +708 -0
  271. package/src/components/modules/caret.ts +853 -0
  272. package/src/components/modules/crossBlockSelection.ts +329 -0
  273. package/src/components/modules/dragManager.ts +1204 -0
  274. package/src/components/modules/history.ts +1098 -0
  275. package/src/components/modules/i18n.ts +332 -0
  276. package/src/components/modules/index.ts +139 -0
  277. package/src/components/modules/modificationsObserver.ts +147 -0
  278. package/src/components/modules/paste.ts +1092 -0
  279. package/src/components/modules/readonly.ts +136 -0
  280. package/src/components/modules/rectangleSelection.ts +711 -0
  281. package/src/components/modules/renderer.ts +155 -0
  282. package/src/components/modules/saver.ts +283 -0
  283. package/src/components/modules/toolbar/blockSettings.ts +781 -0
  284. package/src/components/modules/toolbar/index.ts +1315 -0
  285. package/src/components/modules/toolbar/inline.ts +956 -0
  286. package/src/components/modules/tools.ts +625 -0
  287. package/src/components/modules/ui.ts +1283 -0
  288. package/src/components/polyfills.ts +113 -0
  289. package/src/components/selection.ts +1179 -0
  290. package/src/components/tools/base.ts +301 -0
  291. package/src/components/tools/block.ts +339 -0
  292. package/src/components/tools/collection.ts +67 -0
  293. package/src/components/tools/factory.ts +138 -0
  294. package/src/components/tools/inline.ts +71 -0
  295. package/src/components/tools/tune.ts +33 -0
  296. package/src/components/ui/toolbox.ts +601 -0
  297. package/src/components/utils/announcer.ts +205 -0
  298. package/src/components/utils/api.ts +20 -0
  299. package/src/components/utils/bem.ts +26 -0
  300. package/src/components/utils/blocks.ts +284 -0
  301. package/src/components/utils/caret.ts +1067 -0
  302. package/src/components/utils/data-model-transform.ts +382 -0
  303. package/src/components/utils/events.ts +117 -0
  304. package/src/components/utils/keyboard.ts +60 -0
  305. package/src/components/utils/listeners.ts +296 -0
  306. package/src/components/utils/mutations.ts +39 -0
  307. package/src/components/utils/notifier/draw.ts +190 -0
  308. package/src/components/utils/notifier/index.ts +66 -0
  309. package/src/components/utils/notifier/types.ts +1 -0
  310. package/src/components/utils/notifier.ts +77 -0
  311. package/src/components/utils/placeholder.ts +140 -0
  312. package/src/components/utils/popover/components/hint/hint.const.ts +10 -0
  313. package/src/components/utils/popover/components/hint/hint.ts +46 -0
  314. package/src/components/utils/popover/components/hint/index.ts +6 -0
  315. package/src/components/utils/popover/components/popover-header/index.ts +2 -0
  316. package/src/components/utils/popover/components/popover-header/popover-header.const.ts +8 -0
  317. package/src/components/utils/popover/components/popover-header/popover-header.ts +80 -0
  318. package/src/components/utils/popover/components/popover-header/popover-header.types.ts +14 -0
  319. package/src/components/utils/popover/components/popover-item/index.ts +13 -0
  320. package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.const.ts +50 -0
  321. package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.ts +680 -0
  322. package/src/components/utils/popover/components/popover-item/popover-item-html/popover-item-html.const.ts +14 -0
  323. package/src/components/utils/popover/components/popover-item/popover-item-html/popover-item-html.ts +136 -0
  324. package/src/components/utils/popover/components/popover-item/popover-item-separator/popover-item-separator.const.ts +20 -0
  325. package/src/components/utils/popover/components/popover-item/popover-item-separator/popover-item-separator.ts +117 -0
  326. package/src/components/utils/popover/components/popover-item/popover-item.ts +186 -0
  327. package/src/components/utils/popover/components/search-input/index.ts +2 -0
  328. package/src/components/utils/popover/components/search-input/search-input.const.ts +8 -0
  329. package/src/components/utils/popover/components/search-input/search-input.ts +178 -0
  330. package/src/components/utils/popover/components/search-input/search-input.types.ts +59 -0
  331. package/src/components/utils/popover/index.ts +13 -0
  332. package/src/components/utils/popover/popover-abstract.ts +457 -0
  333. package/src/components/utils/popover/popover-desktop.ts +676 -0
  334. package/src/components/utils/popover/popover-inline.ts +338 -0
  335. package/src/components/utils/popover/popover-mobile.ts +201 -0
  336. package/src/components/utils/popover/popover.const.ts +81 -0
  337. package/src/components/utils/popover/utils/popover-states-history.ts +72 -0
  338. package/src/components/utils/promise-queue.ts +43 -0
  339. package/src/components/utils/sanitizer.ts +537 -0
  340. package/src/components/utils/scroll-locker.ts +87 -0
  341. package/src/components/utils/shortcut.ts +231 -0
  342. package/src/components/utils/shortcuts.ts +113 -0
  343. package/src/components/utils/tools.ts +110 -0
  344. package/src/components/utils/tooltip.ts +591 -0
  345. package/src/components/utils/tw.ts +241 -0
  346. package/src/components/utils.ts +1081 -0
  347. package/src/env.d.ts +13 -0
  348. package/src/full.ts +69 -0
  349. package/src/locales.ts +51 -0
  350. package/src/stories/Block.stories.ts +498 -0
  351. package/src/stories/EditorModes.stories.ts +505 -0
  352. package/src/stories/Header.stories.ts +137 -0
  353. package/src/stories/InlineToolbar.stories.ts +498 -0
  354. package/src/stories/List.stories.ts +259 -0
  355. package/src/stories/Notifier.stories.ts +340 -0
  356. package/src/stories/Paragraph.stories.ts +112 -0
  357. package/src/stories/Placeholder.stories.ts +319 -0
  358. package/src/stories/Popover.stories.ts +844 -0
  359. package/src/stories/Selection.stories.ts +250 -0
  360. package/src/stories/StubBlock.stories.ts +156 -0
  361. package/src/stories/Toolbar.stories.ts +223 -0
  362. package/src/stories/Toolbox.stories.ts +166 -0
  363. package/src/stories/Tooltip.stories.ts +198 -0
  364. package/src/stories/helpers.ts +463 -0
  365. package/src/styles/main.css +123 -0
  366. package/src/tools/header/index.ts +646 -0
  367. package/src/tools/index.ts +45 -0
  368. package/src/tools/list/index.ts +1819 -0
  369. package/src/tools/paragraph/index.ts +412 -0
  370. package/src/tools/stub/index.ts +107 -0
  371. package/src/types-internal/blok-modules.d.ts +87 -0
  372. package/src/types-internal/html-janitor.d.ts +28 -0
  373. package/src/types-internal/module-config.d.ts +11 -0
  374. package/src/variants/all-locales.ts +155 -0
  375. package/src/variants/blok-maximum.ts +20 -0
  376. package/src/variants/blok-minimum.ts +243 -0
  377. package/types/api/blocks.d.ts +9 -1
  378. package/types/api/history.d.ts +7 -0
  379. package/types/api/i18n.d.ts +22 -3
  380. package/types/api/selection.d.ts +6 -0
  381. package/types/api/styles.d.ts +23 -10
  382. package/types/configs/blok-config.d.ts +29 -0
  383. package/types/configs/i18n-config.d.ts +52 -2
  384. package/types/configs/i18n-dictionary.d.ts +16 -90
  385. package/types/data-attributes.d.ts +170 -0
  386. package/types/data-formats/output-data.d.ts +15 -0
  387. package/types/full.d.ts +80 -0
  388. package/types/index.d.ts +30 -13
  389. package/types/locales.d.ts +59 -0
  390. package/types/tools/adapters/inline-tool-adapter.d.ts +10 -0
  391. package/types/tools/block-tool.d.ts +9 -0
  392. package/types/tools/header.d.ts +18 -0
  393. package/types/tools/index.d.ts +1 -0
  394. package/types/tools/list.d.ts +91 -0
  395. package/types/tools/paragraph.d.ts +71 -0
  396. package/types/tools/tool-settings.d.ts +92 -6
  397. package/types/tools/tool.d.ts +6 -0
  398. package/types/tools-entry.d.ts +49 -0
  399. package/types/utils/popover/popover-item.d.ts +18 -5
  400. package/types/utils/popover/popover.d.ts +7 -0
  401. package/dist/blok-D_baBvTG.mjs +0 -25795
  402. package/dist/blok.umd.js +0 -181
@@ -0,0 +1,332 @@
1
+ import { Module } from '../__module';
2
+ import type { I18nDictionary } from '../../../types/configs';
3
+ import type { SupportedLocale } from '../../../types/configs/i18n-config';
4
+ import {
5
+ DEFAULT_LOCALE,
6
+ loadLocale,
7
+ getDirection,
8
+ ALL_LOCALE_CODES,
9
+ enMessages,
10
+ } from '../i18n/locales';
11
+ import { LightweightI18n } from '../i18n/lightweight-i18n';
12
+ import type { I18nextInitResult } from '../i18n/i18next-loader';
13
+
14
+ /**
15
+ * I18n module - handles translations and locale management.
16
+ *
17
+ * Uses a lightweight implementation for English (default) and dynamically
18
+ * loads i18next only when non-English locales are needed.
19
+ *
20
+ * This lazy-loading approach saves ~18 KB gzipped for English-only users.
21
+ *
22
+ * Instance-based module that provides:
23
+ * - Translation lookup with interpolation
24
+ * - Lazy locale loading
25
+ * - Browser locale detection
26
+ * - RTL support
27
+ * - Pluralization support (via i18next when loaded)
28
+ */
29
+ export class I18n extends Module {
30
+ /**
31
+ * Lightweight i18n for English (synchronous, no dependencies)
32
+ */
33
+ private lightweightI18n: LightweightI18n;
34
+
35
+ /**
36
+ * Full i18next instance (loaded dynamically for non-English locales)
37
+ */
38
+ private i18nextWrapper: I18nextInitResult | null = null;
39
+
40
+ /**
41
+ * Current locale code
42
+ */
43
+ private locale: SupportedLocale = DEFAULT_LOCALE;
44
+
45
+ /**
46
+ * Default locale to fall back to
47
+ */
48
+ private defaultLocale: SupportedLocale = DEFAULT_LOCALE;
49
+
50
+ /**
51
+ * Whether we're using the full i18next implementation
52
+ */
53
+ private usingI18next = false;
54
+
55
+ /**
56
+ * Constructor - creates lightweight i18n instance
57
+ */
58
+ constructor(...args: ConstructorParameters<typeof Module>) {
59
+ super(...args);
60
+ this.lightweightI18n = new LightweightI18n();
61
+ }
62
+
63
+ /**
64
+ * Translate a key with optional interpolation.
65
+ *
66
+ * @param key - Translation key (e.g., 'blockSettings.delete')
67
+ * @param vars - Optional variables to interpolate (e.g., { count: 5 })
68
+ * @returns Translated string, or the key if not found
69
+ *
70
+ * @example
71
+ * // Simple translation
72
+ * this.Blok.I18n.t('blockSettings.delete')
73
+ *
74
+ * @example
75
+ * // With interpolation
76
+ * this.Blok.I18n.t('a11y.blockMoved', { position: 3, total: 10 })
77
+ */
78
+ public t(key: string, vars?: Record<string, string | number>): string {
79
+ if (this.usingI18next && this.i18nextWrapper !== null) {
80
+ return this.i18nextWrapper.t(key, vars);
81
+ }
82
+
83
+ return this.lightweightI18n.t(key, vars);
84
+ }
85
+
86
+ /**
87
+ * Get the English translation for a key.
88
+ * Used for multilingual search - always searches against English terms.
89
+ *
90
+ * @param key - Translation key (e.g., 'toolNames.heading')
91
+ * @returns English translation string, or empty string if not found
92
+ */
93
+ public getEnglishTranslation(key: string): string {
94
+ return (enMessages as I18nDictionary)[key] ?? '';
95
+ }
96
+
97
+ /**
98
+ * Check if a translation exists for the given key
99
+ *
100
+ * @param key - Translation key to check
101
+ * @returns True if translation exists
102
+ */
103
+ public has(key: string): boolean {
104
+ if (this.usingI18next && this.i18nextWrapper !== null) {
105
+ return this.i18nextWrapper.has(key);
106
+ }
107
+
108
+ return this.lightweightI18n.has(key);
109
+ }
110
+
111
+ /**
112
+ * Set the active locale, loading it if necessary.
113
+ * All 68 supported locales are available for loading.
114
+ *
115
+ * @param locale - Locale code to set
116
+ * @returns Promise that resolves when locale is loaded and set
117
+ */
118
+ public async setLocale(locale: SupportedLocale): Promise<void> {
119
+ try {
120
+ // For English, use lightweight implementation
121
+ if (locale === 'en') {
122
+ this.locale = 'en';
123
+ this.usingI18next = false;
124
+
125
+ return;
126
+ }
127
+
128
+ // For non-English, load i18next dynamically
129
+ const localeConfig = await loadLocale(locale);
130
+
131
+ await this.ensureI18nextLoaded(locale, localeConfig);
132
+
133
+ if (this.i18nextWrapper === null) {
134
+ return;
135
+ }
136
+
137
+ // If locale was already loaded, just change language
138
+ const needsBundle = !this.i18nextWrapper.instance.hasResourceBundle(locale, 'translation');
139
+
140
+ if (needsBundle) {
141
+ this.i18nextWrapper.instance.addResourceBundle(locale, 'translation', localeConfig.dictionary);
142
+ }
143
+
144
+ await this.i18nextWrapper.changeLanguage(locale);
145
+
146
+ this.locale = locale;
147
+ this.usingI18next = true;
148
+ } catch (error) {
149
+ // Log warning but don't throw - graceful degradation to default locale
150
+ console.warn(`Failed to load locale "${locale}". Falling back to "${this.defaultLocale}".`, error);
151
+ this.locale = this.defaultLocale;
152
+
153
+ if (this.defaultLocale === 'en') {
154
+ this.usingI18next = false;
155
+ }
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Detect browser locale and set it.
161
+ *
162
+ * @returns The detected and set locale code
163
+ */
164
+ public async detectAndSetLocale(): Promise<SupportedLocale> {
165
+ const detected = this.detectBrowserLocale();
166
+
167
+ await this.setLocale(detected);
168
+
169
+ return this.locale;
170
+ }
171
+
172
+ /**
173
+ * Set a custom dictionary directly.
174
+ * Useful for custom translations or testing.
175
+ *
176
+ * @param dictionary - Custom translation dictionary
177
+ */
178
+ public setDictionary(dictionary: I18nDictionary): void {
179
+ if (this.usingI18next && this.i18nextWrapper !== null) {
180
+ this.i18nextWrapper.setDictionary(dictionary);
181
+ } else {
182
+ this.lightweightI18n.setDictionary(dictionary);
183
+ }
184
+ }
185
+
186
+ /**
187
+ * Get the current locale code
188
+ */
189
+ public getLocale(): SupportedLocale {
190
+ return this.locale;
191
+ }
192
+
193
+ /**
194
+ * Get the text direction for the current locale
195
+ */
196
+ public getDirection(): 'ltr' | 'rtl' {
197
+ return getDirection(this.locale);
198
+ }
199
+
200
+ /**
201
+ * Get the text direction for any locale code
202
+ *
203
+ * @param locale - Locale code to check
204
+ */
205
+ public getDirectionForLocale(locale: SupportedLocale): 'ltr' | 'rtl' {
206
+ return getDirection(locale);
207
+ }
208
+
209
+ /**
210
+ * Module preparation - called during editor initialization.
211
+ * Uses lightweight i18n for English, loads i18next only for other locales.
212
+ */
213
+ public async prepare(): Promise<void> {
214
+ const i18nConfig = this.config.i18n;
215
+
216
+ // Set default locale if configured
217
+ this.applyDefaultLocale(i18nConfig?.defaultLocale);
218
+
219
+ // Load base translations first
220
+ const requestedLocale = i18nConfig?.locale;
221
+
222
+ if (requestedLocale === undefined || requestedLocale === 'auto') {
223
+ await this.detectAndSetLocale();
224
+ } else {
225
+ await this.setLocale(requestedLocale);
226
+ }
227
+
228
+ // Merge custom messages on top of base translations (if provided)
229
+ if (i18nConfig?.messages !== undefined) {
230
+ this.setDictionary(i18nConfig.messages);
231
+ }
232
+
233
+ // Update config.i18n.direction so other modules can access it via isRtl getter
234
+ this.updateConfigDirection(i18nConfig?.direction ?? this.getDirection());
235
+ }
236
+
237
+ /**
238
+ * Dynamically load i18next when needed for non-English locales
239
+ */
240
+ private async ensureI18nextLoaded(
241
+ locale: SupportedLocale,
242
+ localeConfig: { dictionary: I18nDictionary }
243
+ ): Promise<void> {
244
+ if (this.i18nextWrapper !== null) {
245
+ return;
246
+ }
247
+
248
+ // Dynamic import of the i18next loader
249
+ const { loadI18next } = await import('../i18n/i18next-loader');
250
+
251
+ this.i18nextWrapper = await loadI18next(locale, localeConfig);
252
+ }
253
+
254
+ /**
255
+ * Update the config.i18n.direction value
256
+ */
257
+ private updateConfigDirection(direction: 'ltr' | 'rtl'): void {
258
+ if (this.config.i18n === undefined) {
259
+ this.config.i18n = {};
260
+ }
261
+ this.config.i18n.direction = direction;
262
+ }
263
+
264
+ /**
265
+ * Apply default locale from config if valid.
266
+ * The locale is type-checked at compile time via SupportedLocale type.
267
+ */
268
+ private applyDefaultLocale(defaultLocale: SupportedLocale | undefined): void {
269
+ if (defaultLocale === undefined) {
270
+ return;
271
+ }
272
+
273
+ this.defaultLocale = defaultLocale;
274
+ }
275
+
276
+ /**
277
+ * Check if a locale code is supported.
278
+ * All 68 locales in ALL_LOCALE_CODES are supported.
279
+ */
280
+ private isLocaleSupported(locale: string): locale is SupportedLocale {
281
+ return ALL_LOCALE_CODES.includes(locale as SupportedLocale);
282
+ }
283
+
284
+ /**
285
+ * Detect best matching locale from browser settings
286
+ */
287
+ private detectBrowserLocale(): SupportedLocale {
288
+ if (typeof navigator === 'undefined') {
289
+ return this.defaultLocale;
290
+ }
291
+
292
+ const browserLanguages = navigator.languages ?? [navigator.language];
293
+
294
+ for (const lang of browserLanguages) {
295
+ if (!lang) {
296
+ continue;
297
+ }
298
+
299
+ const matched = this.matchLanguageTag(lang);
300
+
301
+ if (matched !== null) {
302
+ return matched;
303
+ }
304
+ }
305
+
306
+ return this.defaultLocale;
307
+ }
308
+
309
+ /**
310
+ * Match a browser language tag to a supported locale.
311
+ * All 68 locales are supported.
312
+ *
313
+ * @param languageTag - BCP 47 language tag (e.g., 'en-US', 'ru')
314
+ */
315
+ private matchLanguageTag(languageTag: string): SupportedLocale | null {
316
+ const normalized = languageTag.toLowerCase();
317
+
318
+ // Try exact match (e.g., 'ru')
319
+ if (this.isLocaleSupported(normalized)) {
320
+ return normalized as SupportedLocale;
321
+ }
322
+
323
+ // Try base language (e.g., 'en-US' -> 'en')
324
+ const baseLang = normalized.split('-')[0];
325
+
326
+ if (baseLang !== undefined && this.isLocaleSupported(baseLang)) {
327
+ return baseLang as SupportedLocale;
328
+ }
329
+
330
+ return null;
331
+ }
332
+ }
@@ -0,0 +1,139 @@
1
+ /** ./api */
2
+ import { BlocksAPI } from './api/blocks';
3
+ import { CaretAPI } from './api/caret';
4
+ import { EventsAPI } from './api/events';
5
+ import { I18nAPI } from './api/i18n';
6
+ import { API } from './api/index';
7
+ import { InlineToolbarAPI } from './api/inlineToolbar';
8
+ import { ListenersAPI } from './api/listeners';
9
+ import { NotifierAPI } from './api/notifier';
10
+ import { ReadOnlyAPI } from './api/readonly';
11
+ import { SanitizerAPI } from './api/sanitizer';
12
+ import { SaverAPI } from './api/saver';
13
+ import { SelectionAPI } from './api/selection';
14
+ import { ToolsAPI } from './api/tools';
15
+ import { StylesAPI } from './api/styles';
16
+ import { ToolbarAPI } from './api/toolbar';
17
+ import { TooltipAPI } from './api/tooltip';
18
+ import { UiAPI } from './api/ui';
19
+ import { HistoryAPI } from './api/history';
20
+
21
+ /** ./toolbar */
22
+ import { BlockSettings } from './toolbar/blockSettings';
23
+ import { Toolbar } from './toolbar/index';
24
+ import { InlineToolbar } from './toolbar/inline';
25
+
26
+ /** . */
27
+ import { I18n } from './i18n';
28
+ import { BlockEvents } from './blockEvents';
29
+ import { BlockManager } from './blockManager';
30
+ import { BlockSelection } from './blockSelection';
31
+ import { Caret } from './caret';
32
+ import { CrossBlockSelection } from './crossBlockSelection';
33
+ import { DragManager } from './dragManager';
34
+ import { ModificationsObserver } from './modificationsObserver';
35
+ import { Paste } from './paste';
36
+ import { ReadOnly } from './readonly';
37
+ import { RectangleSelection } from './rectangleSelection';
38
+ import { Renderer } from './renderer';
39
+ import { Saver } from './saver';
40
+ import { Tools } from './tools';
41
+ import { UI } from './ui';
42
+ import { History } from './history';
43
+
44
+ /**
45
+ * Named exports for better tree-shaking.
46
+ * Consumers can import only the modules they need.
47
+ */
48
+ export {
49
+ // API Modules
50
+ BlocksAPI,
51
+ CaretAPI,
52
+ EventsAPI,
53
+ I18nAPI,
54
+ API,
55
+ InlineToolbarAPI,
56
+ ListenersAPI,
57
+ NotifierAPI,
58
+ ReadOnlyAPI,
59
+ SanitizerAPI,
60
+ SaverAPI,
61
+ SelectionAPI,
62
+ ToolsAPI,
63
+ StylesAPI,
64
+ ToolbarAPI,
65
+ TooltipAPI,
66
+ UiAPI,
67
+ HistoryAPI,
68
+
69
+ // Toolbar Modules
70
+ BlockSettings,
71
+ Toolbar,
72
+ InlineToolbar,
73
+
74
+ // Modules
75
+ I18n,
76
+ BlockEvents,
77
+ BlockManager,
78
+ BlockSelection,
79
+ Caret,
80
+ CrossBlockSelection,
81
+ DragManager,
82
+ ModificationsObserver,
83
+ Paste,
84
+ ReadOnly,
85
+ RectangleSelection,
86
+ Renderer,
87
+ Saver,
88
+ Tools,
89
+ UI,
90
+ History,
91
+ };
92
+
93
+ /**
94
+ * Default export for backwards compatibility and internal use.
95
+ */
96
+ export const Modules = {
97
+ // API Modules
98
+ BlocksAPI,
99
+ CaretAPI,
100
+ EventsAPI,
101
+ I18nAPI,
102
+ API,
103
+ InlineToolbarAPI,
104
+ ListenersAPI,
105
+ NotifierAPI,
106
+ ReadOnlyAPI,
107
+ SanitizerAPI,
108
+ SaverAPI,
109
+ SelectionAPI,
110
+ ToolsAPI,
111
+ StylesAPI,
112
+ ToolbarAPI,
113
+ TooltipAPI,
114
+ UiAPI,
115
+ HistoryAPI,
116
+
117
+ // Toolbar Modules
118
+ BlockSettings,
119
+ Toolbar,
120
+ InlineToolbar,
121
+
122
+ // Modules
123
+ I18n,
124
+ BlockEvents,
125
+ BlockManager,
126
+ BlockSelection,
127
+ Caret,
128
+ CrossBlockSelection,
129
+ DragManager,
130
+ ModificationsObserver,
131
+ Paste,
132
+ ReadOnly,
133
+ RectangleSelection,
134
+ Renderer,
135
+ Saver,
136
+ Tools,
137
+ UI,
138
+ History,
139
+ };
@@ -0,0 +1,147 @@
1
+ import type { BlockId } from '../../../types';
2
+ import type { BlockMutationEvent, BlockMutationType } from '../../../types/events/block';
3
+ import type { ModuleConfig } from '../../types-internal/module-config';
4
+ import { Module } from '../__module';
5
+ import { modificationsObserverBatchTimeout } from '../constants';
6
+ import { BlockChanged, FakeCursorAboutToBeToggled, FakeCursorHaveBeenSet, RedactorDomChanged } from '../events';
7
+ import { isFunction } from '../utils';
8
+
9
+ /**
10
+ * We use map of block mutations to filter only unique events
11
+ */
12
+ type UniqueBlockMutationKey = `block:${BlockId}:event:${BlockMutationType}`;
13
+
14
+ /**
15
+ * Single entry point for Block mutation events
16
+ */
17
+ export class ModificationsObserver extends Module {
18
+ /**
19
+ * Flag shows onChange event is disabled
20
+ */
21
+ private disabled = false;
22
+
23
+ /**
24
+ * Blocks wrapper mutation observer instance
25
+ */
26
+ private readonly mutationObserver: MutationObserver;
27
+
28
+ /**
29
+ * Timeout used to batched several events in a single onChange call
30
+ */
31
+ private batchingTimeout: null | ReturnType<typeof setTimeout> = null;
32
+
33
+ /**
34
+ * Array of onChange events used to batch them
35
+ *
36
+ * Map is used to filter duplicated events related to the same block
37
+ */
38
+ private batchingOnChangeQueue = new Map<UniqueBlockMutationKey, BlockMutationEvent>();
39
+
40
+ /**
41
+ * Fired onChange events will be batched by this time
42
+ */
43
+ private readonly batchTime = modificationsObserverBatchTimeout;
44
+
45
+ /**
46
+ * Prepare the module
47
+ * @param options - options used by the modification observer module
48
+ * @param options.config - Blok configuration object
49
+ * @param options.eventsDispatcher - common Blok event bus
50
+ */
51
+ constructor({ config, eventsDispatcher }: ModuleConfig) {
52
+ super({
53
+ config,
54
+ eventsDispatcher,
55
+ });
56
+
57
+ this.mutationObserver = new MutationObserver((mutations) => {
58
+ this.redactorChanged(mutations);
59
+ });
60
+
61
+ this.eventsDispatcher.on(BlockChanged, (payload) => {
62
+ this.particularBlockChanged(payload.event);
63
+ });
64
+
65
+ /**
66
+ * Mutex for fake cursor setting/removing operation
67
+ */
68
+ this.eventsDispatcher.on(FakeCursorAboutToBeToggled, () => {
69
+ this.disable();
70
+ });
71
+
72
+ this.eventsDispatcher.on(FakeCursorHaveBeenSet, () => {
73
+ this.enable();
74
+ });
75
+ }
76
+
77
+ /**
78
+ * Enables onChange event
79
+ */
80
+ public enable(): void {
81
+ this.mutationObserver.observe(
82
+ this.Blok.UI.nodes.redactor,
83
+ {
84
+ childList: true,
85
+ subtree: true,
86
+ characterData: true,
87
+ attributes: true,
88
+ }
89
+ );
90
+ this.disabled = false;
91
+ }
92
+
93
+ /**
94
+ * Disables onChange event
95
+ */
96
+ public disable(): void {
97
+ this.mutationObserver.disconnect();
98
+ this.disabled = true;
99
+ }
100
+
101
+ /**
102
+ * Call onChange event passed to Blok configuration
103
+ * @param event - some of our custom change events
104
+ */
105
+ private particularBlockChanged(event: BlockMutationEvent): void {
106
+ if (this.disabled || !isFunction(this.config.onChange)) {
107
+ return;
108
+ }
109
+
110
+ this.batchingOnChangeQueue.set(`block:${event.detail.target.id}:event:${event.type as BlockMutationType}`, event);
111
+
112
+ if (this.batchingTimeout) {
113
+ clearTimeout(this.batchingTimeout);
114
+ }
115
+
116
+ this.batchingTimeout = setTimeout(() => {
117
+ const queuedEvents = Array.from(this.batchingOnChangeQueue.values());
118
+
119
+ if (queuedEvents.length === 0) {
120
+ return;
121
+ }
122
+
123
+ /**
124
+ * If we have only 1 event in a queue, unwrap it
125
+ */
126
+ const eventsToEmit = queuedEvents.length === 1
127
+ ? queuedEvents[0]
128
+ : queuedEvents;
129
+
130
+ if (this.config.onChange) {
131
+ this.config.onChange(this.Blok.API.methods, eventsToEmit);
132
+ }
133
+
134
+ this.batchingOnChangeQueue.clear();
135
+ }, this.batchTime);
136
+ }
137
+
138
+ /**
139
+ * Fired on every blocks wrapper dom change
140
+ * @param mutations - mutations happened
141
+ */
142
+ private redactorChanged(mutations: MutationRecord[]): void {
143
+ this.eventsDispatcher.emit(RedactorDomChanged, {
144
+ mutations,
145
+ });
146
+ }
147
+ }