@jackuait/blok 0.4.1-beta.4 → 0.4.1-beta.6

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 (400) hide show
  1. package/README.md +136 -17
  2. package/codemod/README.md +16 -0
  3. package/codemod/migrate-editorjs-to-blok.js +868 -92
  4. package/codemod/test.js +682 -77
  5. package/dist/blok.mjs +5 -2
  6. package/dist/chunks/blok-B5qs7C5l.mjs +12838 -0
  7. package/dist/chunks/i18next-CugVlwWp.mjs +1292 -0
  8. package/dist/chunks/i18next-loader-CTrK3HzG.mjs +43 -0
  9. package/dist/{index-XWGz4gev.mjs → chunks/index-DDpzQn-0.mjs} +2 -2
  10. package/dist/chunks/inline-tool-convert-RBcopmCh.mjs +1988 -0
  11. package/dist/chunks/messages-2434tVOK.mjs +47 -0
  12. package/dist/chunks/messages-3DcCwXMF.mjs +47 -0
  13. package/dist/chunks/messages-4kMwVAKY.mjs +47 -0
  14. package/dist/chunks/messages-57uL5htT.mjs +47 -0
  15. package/dist/chunks/messages-76-iJV9Q.mjs +47 -0
  16. package/dist/chunks/messages-8p86Eyf2.mjs +47 -0
  17. package/dist/chunks/messages-BBX0p0Pi.mjs +47 -0
  18. package/dist/chunks/messages-BCm2eudQ.mjs +47 -0
  19. package/dist/chunks/messages-BFiUomgG.mjs +47 -0
  20. package/dist/chunks/messages-BIPNHHAV.mjs +47 -0
  21. package/dist/chunks/messages-BUlwu9mo.mjs +47 -0
  22. package/dist/chunks/messages-BX-DPa-z.mjs +47 -0
  23. package/dist/chunks/messages-BextV3Qh.mjs +47 -0
  24. package/dist/chunks/messages-BiPSFlUG.mjs +47 -0
  25. package/dist/chunks/messages-BiXe9G-O.mjs +47 -0
  26. package/dist/chunks/messages-Bl5z_Igo.mjs +47 -0
  27. package/dist/chunks/messages-BnsE97ku.mjs +47 -0
  28. package/dist/chunks/messages-BoO8gsVD.mjs +47 -0
  29. package/dist/chunks/messages-BqWaOGMn.mjs +47 -0
  30. package/dist/chunks/messages-BqkL2_Ro.mjs +47 -0
  31. package/dist/chunks/messages-BvCkXKX-.mjs +47 -0
  32. package/dist/chunks/messages-C6tbPLoj.mjs +47 -0
  33. package/dist/chunks/messages-CA6T3-gQ.mjs +47 -0
  34. package/dist/chunks/messages-CFFPFdWP.mjs +47 -0
  35. package/dist/chunks/messages-CFrKE-TN.mjs +47 -0
  36. package/dist/chunks/messages-CHz8VlG-.mjs +47 -0
  37. package/dist/chunks/messages-CLixzySl.mjs +47 -0
  38. package/dist/chunks/messages-CV7OM_qk.mjs +47 -0
  39. package/dist/chunks/messages-CXHt3eCC.mjs +47 -0
  40. package/dist/chunks/messages-CbmsBrB0.mjs +47 -0
  41. package/dist/chunks/messages-Ceo1KtFx.mjs +47 -0
  42. package/dist/chunks/messages-Cm0LJLtB.mjs +47 -0
  43. package/dist/chunks/messages-CmymP_Ar.mjs +47 -0
  44. package/dist/chunks/messages-D0ohMB5H.mjs +47 -0
  45. package/dist/chunks/messages-D3GrDwXh.mjs +47 -0
  46. package/dist/chunks/messages-D3vTzIpL.mjs +47 -0
  47. package/dist/chunks/messages-D5WeksbV.mjs +47 -0
  48. package/dist/chunks/messages-DGaab4EP.mjs +47 -0
  49. package/dist/chunks/messages-DKha57ZU.mjs +47 -0
  50. package/dist/chunks/messages-DOaujgMW.mjs +47 -0
  51. package/dist/chunks/messages-DVbPLd_0.mjs +47 -0
  52. package/dist/chunks/messages-D_FCyfW6.mjs +47 -0
  53. package/dist/chunks/messages-Dd5iZN3c.mjs +47 -0
  54. package/dist/chunks/messages-DehM7135.mjs +47 -0
  55. package/dist/chunks/messages-Dg1OHftD.mjs +47 -0
  56. package/dist/chunks/messages-Di6Flq-b.mjs +47 -0
  57. package/dist/chunks/messages-Dqhhex6e.mjs +47 -0
  58. package/dist/chunks/messages-DueVe0F1.mjs +47 -0
  59. package/dist/chunks/messages-Dx3eFwI0.mjs +47 -0
  60. package/dist/chunks/messages-FOtiUoKl.mjs +47 -0
  61. package/dist/chunks/messages-FTOZNhRD.mjs +47 -0
  62. package/dist/chunks/messages-IQxGfQIV.mjs +47 -0
  63. package/dist/chunks/messages-JF2fzCkK.mjs +47 -0
  64. package/dist/chunks/messages-MOGl7I5v.mjs +47 -0
  65. package/dist/chunks/messages-QgYhPL-3.mjs +47 -0
  66. package/dist/chunks/messages-WYWIbQwo.mjs +47 -0
  67. package/dist/chunks/messages-a6A_LgDv.mjs +47 -0
  68. package/dist/chunks/messages-bSf31LJi.mjs +47 -0
  69. package/dist/chunks/messages-diGozhTn.mjs +47 -0
  70. package/dist/chunks/messages-er-kd-VO.mjs +47 -0
  71. package/dist/chunks/messages-ez3w5NBn.mjs +47 -0
  72. package/dist/chunks/messages-f3uXjegd.mjs +47 -0
  73. package/dist/chunks/messages-ohwI1UGv.mjs +47 -0
  74. package/dist/chunks/messages-p9BZJaFV.mjs +47 -0
  75. package/dist/chunks/messages-qIQ4L4rw.mjs +47 -0
  76. package/dist/chunks/messages-qWkXPggi.mjs +47 -0
  77. package/dist/chunks/messages-w5foGze_.mjs +47 -0
  78. package/dist/full.mjs +50 -0
  79. package/dist/locales.mjs +227 -0
  80. package/dist/messages-2434tVOK.mjs +47 -0
  81. package/dist/messages-3DcCwXMF.mjs +47 -0
  82. package/dist/messages-4kMwVAKY.mjs +47 -0
  83. package/dist/messages-57uL5htT.mjs +47 -0
  84. package/dist/messages-76-iJV9Q.mjs +47 -0
  85. package/dist/messages-8p86Eyf2.mjs +47 -0
  86. package/dist/messages-BBX0p0Pi.mjs +47 -0
  87. package/dist/messages-BCm2eudQ.mjs +47 -0
  88. package/dist/messages-BFiUomgG.mjs +47 -0
  89. package/dist/messages-BIPNHHAV.mjs +47 -0
  90. package/dist/messages-BUlwu9mo.mjs +47 -0
  91. package/dist/messages-BX-DPa-z.mjs +47 -0
  92. package/dist/messages-BextV3Qh.mjs +47 -0
  93. package/dist/messages-BiPSFlUG.mjs +47 -0
  94. package/dist/messages-BiXe9G-O.mjs +47 -0
  95. package/dist/messages-Bl5z_Igo.mjs +47 -0
  96. package/dist/messages-BnsE97ku.mjs +47 -0
  97. package/dist/messages-BoO8gsVD.mjs +47 -0
  98. package/dist/messages-BqWaOGMn.mjs +47 -0
  99. package/dist/messages-BqkL2_Ro.mjs +47 -0
  100. package/dist/messages-BvCkXKX-.mjs +47 -0
  101. package/dist/messages-C6tbPLoj.mjs +47 -0
  102. package/dist/messages-CA6T3-gQ.mjs +47 -0
  103. package/dist/messages-CFFPFdWP.mjs +47 -0
  104. package/dist/messages-CFrKE-TN.mjs +47 -0
  105. package/dist/messages-CHz8VlG-.mjs +47 -0
  106. package/dist/messages-CLixzySl.mjs +47 -0
  107. package/dist/messages-CV7OM_qk.mjs +47 -0
  108. package/dist/messages-CXHt3eCC.mjs +47 -0
  109. package/dist/messages-CbmsBrB0.mjs +47 -0
  110. package/dist/messages-Ceo1KtFx.mjs +47 -0
  111. package/dist/messages-Cm0LJLtB.mjs +47 -0
  112. package/dist/messages-CmymP_Ar.mjs +47 -0
  113. package/dist/messages-D0ohMB5H.mjs +47 -0
  114. package/dist/messages-D3GrDwXh.mjs +47 -0
  115. package/dist/messages-D3vTzIpL.mjs +47 -0
  116. package/dist/messages-D5WeksbV.mjs +47 -0
  117. package/dist/messages-DGaab4EP.mjs +47 -0
  118. package/dist/messages-DKha57ZU.mjs +47 -0
  119. package/dist/messages-DOaujgMW.mjs +47 -0
  120. package/dist/messages-DVbPLd_0.mjs +47 -0
  121. package/dist/messages-D_FCyfW6.mjs +47 -0
  122. package/dist/messages-Dd5iZN3c.mjs +47 -0
  123. package/dist/messages-DehM7135.mjs +47 -0
  124. package/dist/messages-Dg1OHftD.mjs +47 -0
  125. package/dist/messages-Di6Flq-b.mjs +47 -0
  126. package/dist/messages-Dqhhex6e.mjs +47 -0
  127. package/dist/messages-DueVe0F1.mjs +47 -0
  128. package/dist/messages-Dx3eFwI0.mjs +47 -0
  129. package/dist/messages-FOtiUoKl.mjs +47 -0
  130. package/dist/messages-FTOZNhRD.mjs +47 -0
  131. package/dist/messages-IQxGfQIV.mjs +47 -0
  132. package/dist/messages-JF2fzCkK.mjs +47 -0
  133. package/dist/messages-MOGl7I5v.mjs +47 -0
  134. package/dist/messages-QgYhPL-3.mjs +47 -0
  135. package/dist/messages-WYWIbQwo.mjs +47 -0
  136. package/dist/messages-a6A_LgDv.mjs +47 -0
  137. package/dist/messages-bSf31LJi.mjs +47 -0
  138. package/dist/messages-diGozhTn.mjs +47 -0
  139. package/dist/messages-er-kd-VO.mjs +47 -0
  140. package/dist/messages-ez3w5NBn.mjs +47 -0
  141. package/dist/messages-f3uXjegd.mjs +47 -0
  142. package/dist/messages-ohwI1UGv.mjs +47 -0
  143. package/dist/messages-p9BZJaFV.mjs +47 -0
  144. package/dist/messages-qIQ4L4rw.mjs +47 -0
  145. package/dist/messages-qWkXPggi.mjs +47 -0
  146. package/dist/messages-w5foGze_.mjs +47 -0
  147. package/dist/tools.mjs +3073 -0
  148. package/dist/vendor.LICENSE.txt +26 -225
  149. package/package.json +49 -23
  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 +1427 -0
  154. package/src/components/block-tunes/block-tune-delete.ts +51 -0
  155. package/src/components/blocks.ts +338 -0
  156. package/src/components/constants/data-attributes.ts +342 -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 +481 -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 +44 -0
  177. package/src/components/i18n/locales/ar/messages.json +44 -0
  178. package/src/components/i18n/locales/az/messages.json +44 -0
  179. package/src/components/i18n/locales/bg/messages.json +44 -0
  180. package/src/components/i18n/locales/bn/messages.json +44 -0
  181. package/src/components/i18n/locales/bs/messages.json +44 -0
  182. package/src/components/i18n/locales/cs/messages.json +44 -0
  183. package/src/components/i18n/locales/da/messages.json +44 -0
  184. package/src/components/i18n/locales/de/messages.json +44 -0
  185. package/src/components/i18n/locales/dv/messages.json +44 -0
  186. package/src/components/i18n/locales/el/messages.json +44 -0
  187. package/src/components/i18n/locales/en/messages.json +44 -0
  188. package/src/components/i18n/locales/es/messages.json +44 -0
  189. package/src/components/i18n/locales/et/messages.json +44 -0
  190. package/src/components/i18n/locales/fa/messages.json +44 -0
  191. package/src/components/i18n/locales/fi/messages.json +44 -0
  192. package/src/components/i18n/locales/fil/messages.json +44 -0
  193. package/src/components/i18n/locales/fr/messages.json +44 -0
  194. package/src/components/i18n/locales/gu/messages.json +44 -0
  195. package/src/components/i18n/locales/he/messages.json +44 -0
  196. package/src/components/i18n/locales/hi/messages.json +44 -0
  197. package/src/components/i18n/locales/hr/messages.json +44 -0
  198. package/src/components/i18n/locales/hu/messages.json +44 -0
  199. package/src/components/i18n/locales/hy/messages.json +44 -0
  200. package/src/components/i18n/locales/id/messages.json +44 -0
  201. package/src/components/i18n/locales/index.ts +225 -0
  202. package/src/components/i18n/locales/it/messages.json +44 -0
  203. package/src/components/i18n/locales/ja/messages.json +44 -0
  204. package/src/components/i18n/locales/ka/messages.json +44 -0
  205. package/src/components/i18n/locales/km/messages.json +44 -0
  206. package/src/components/i18n/locales/kn/messages.json +44 -0
  207. package/src/components/i18n/locales/ko/messages.json +44 -0
  208. package/src/components/i18n/locales/ku/messages.json +44 -0
  209. package/src/components/i18n/locales/lo/messages.json +44 -0
  210. package/src/components/i18n/locales/lt/messages.json +44 -0
  211. package/src/components/i18n/locales/lv/messages.json +44 -0
  212. package/src/components/i18n/locales/mk/messages.json +44 -0
  213. package/src/components/i18n/locales/ml/messages.json +44 -0
  214. package/src/components/i18n/locales/mn/messages.json +44 -0
  215. package/src/components/i18n/locales/mr/messages.json +44 -0
  216. package/src/components/i18n/locales/ms/messages.json +44 -0
  217. package/src/components/i18n/locales/my/messages.json +44 -0
  218. package/src/components/i18n/locales/ne/messages.json +44 -0
  219. package/src/components/i18n/locales/nl/messages.json +44 -0
  220. package/src/components/i18n/locales/no/messages.json +44 -0
  221. package/src/components/i18n/locales/pa/messages.json +44 -0
  222. package/src/components/i18n/locales/pl/messages.json +44 -0
  223. package/src/components/i18n/locales/ps/messages.json +44 -0
  224. package/src/components/i18n/locales/pt/messages.json +44 -0
  225. package/src/components/i18n/locales/ro/messages.json +44 -0
  226. package/src/components/i18n/locales/ru/messages.json +44 -0
  227. package/src/components/i18n/locales/sd/messages.json +44 -0
  228. package/src/components/i18n/locales/si/messages.json +44 -0
  229. package/src/components/i18n/locales/sk/messages.json +44 -0
  230. package/src/components/i18n/locales/sl/messages.json +44 -0
  231. package/src/components/i18n/locales/sq/messages.json +44 -0
  232. package/src/components/i18n/locales/sr/messages.json +44 -0
  233. package/src/components/i18n/locales/sv/messages.json +44 -0
  234. package/src/components/i18n/locales/sw/messages.json +44 -0
  235. package/src/components/i18n/locales/ta/messages.json +44 -0
  236. package/src/components/i18n/locales/te/messages.json +44 -0
  237. package/src/components/i18n/locales/th/messages.json +44 -0
  238. package/src/components/i18n/locales/tr/messages.json +44 -0
  239. package/src/components/i18n/locales/ug/messages.json +44 -0
  240. package/src/components/i18n/locales/uk/messages.json +44 -0
  241. package/src/components/i18n/locales/ur/messages.json +44 -0
  242. package/src/components/i18n/locales/vi/messages.json +44 -0
  243. package/src/components/i18n/locales/yi/messages.json +44 -0
  244. package/src/components/i18n/locales/zh/messages.json +44 -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 +363 -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 +33 -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 +1375 -0
  269. package/src/components/modules/blockManager.ts +1348 -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 +1141 -0
  274. package/src/components/modules/history.ts +1098 -0
  275. package/src/components/modules/i18n.ts +325 -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 +668 -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 +776 -0
  284. package/src/components/modules/toolbar/index.ts +1311 -0
  285. package/src/components/modules/toolbar/inline.ts +956 -0
  286. package/src/components/modules/tools.ts +589 -0
  287. package/src/components/modules/ui.ts +1179 -0
  288. package/src/components/polyfills.ts +113 -0
  289. package/src/components/selection.ts +1189 -0
  290. package/src/components/tools/base.ts +274 -0
  291. package/src/components/tools/block.ts +291 -0
  292. package/src/components/tools/collection.ts +67 -0
  293. package/src/components/tools/factory.ts +85 -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 +497 -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 +666 -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 +187 -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 +181 -0
  330. package/src/components/utils/popover/components/search-input/search-input.types.ts +30 -0
  331. package/src/components/utils/popover/index.ts +13 -0
  332. package/src/components/utils/popover/popover-abstract.ts +448 -0
  333. package/src/components/utils/popover/popover-desktop.ts +643 -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 +105 -0
  344. package/src/components/utils/tooltip.ts +642 -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 +570 -0
  367. package/src/tools/index.ts +38 -0
  368. package/src/tools/list/index.ts +1803 -0
  369. package/src/tools/paragraph/index.ts +411 -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 +1 -1
  378. package/types/api/i18n.d.ts +5 -3
  379. package/types/api/selection.d.ts +6 -0
  380. package/types/api/styles.d.ts +23 -10
  381. package/types/configs/blok-config.d.ts +29 -0
  382. package/types/configs/i18n-config.d.ts +52 -2
  383. package/types/configs/i18n-dictionary.d.ts +16 -90
  384. package/types/data-attributes.d.ts +169 -0
  385. package/types/data-formats/output-data.d.ts +15 -0
  386. package/types/full.d.ts +80 -0
  387. package/types/index.d.ts +9 -12
  388. package/types/locales.d.ts +59 -0
  389. package/types/tools/adapters/inline-tool-adapter.d.ts +10 -0
  390. package/types/tools/block-tool.d.ts +9 -0
  391. package/types/tools/header.d.ts +18 -0
  392. package/types/tools/index.d.ts +1 -0
  393. package/types/tools/list.d.ts +91 -0
  394. package/types/tools/paragraph.d.ts +71 -0
  395. package/types/tools/tool-settings.d.ts +16 -2
  396. package/types/tools/tool.d.ts +6 -0
  397. package/types/tools-entry.d.ts +49 -0
  398. package/types/utils/popover/popover-item.d.ts +6 -5
  399. package/dist/blok-B870U2fw.mjs +0 -25803
  400. package/dist/blok.umd.js +0 -181
@@ -0,0 +1,570 @@
1
+ /**
2
+ * Header Tool for the Blok Editor
3
+ * Provides Headings Blocks (H1-H6)
4
+ *
5
+ * Based on @editorjs/header by CodeX
6
+ * @license MIT
7
+ */
8
+ import { IconH1, IconH2, IconH3, IconH4, IconH5, IconH6, IconHeading } from '../../components/icons';
9
+ import { twMerge } from '../../components/utils/tw';
10
+ import { DATA_ATTR } from '../../components/constants';
11
+ import { PLACEHOLDER_CLASSES, setupPlaceholder } from '../../components/utils/placeholder';
12
+ import type {
13
+ API,
14
+ BlockTool,
15
+ BlockToolConstructorOptions,
16
+ BlockToolData,
17
+ PasteEvent,
18
+ ToolboxConfig,
19
+ ConversionConfig,
20
+ SanitizerConfig,
21
+ PasteConfig,
22
+ } from '../../../types';
23
+ import type { MenuConfig } from '../../../types/tools/menu-config';
24
+
25
+ /**
26
+ * Tool's input and output data format
27
+ */
28
+ export interface HeaderData extends BlockToolData {
29
+ /** Header's content */
30
+ text: string;
31
+ /** Header's level from 1 to 6 */
32
+ level: number;
33
+ }
34
+
35
+ /**
36
+ * Level-specific overrides for customization
37
+ */
38
+ export interface HeaderLevelConfig {
39
+ /** Custom HTML tag to use (e.g., 'div', 'p', 'span') */
40
+ tag?: string;
41
+ /** Custom display name for this level */
42
+ name?: string;
43
+ /** Custom font size (e.g., '3em', '24px') */
44
+ size?: string;
45
+ /** Custom margin top (e.g., '20px', '1rem') */
46
+ marginTop?: string;
47
+ /** Custom margin bottom (e.g., '10px', '0.5rem') */
48
+ marginBottom?: string;
49
+ }
50
+
51
+ /**
52
+ * Tool's config from Editor
53
+ */
54
+ export interface HeaderConfig {
55
+ /** Block's placeholder */
56
+ placeholder?: string;
57
+ /** Heading levels */
58
+ levels?: number[];
59
+ /** Default level */
60
+ defaultLevel?: number;
61
+ /** Level-specific overrides keyed by level number (1-6) */
62
+ levelOverrides?: Record<number, HeaderLevelConfig>;
63
+ }
64
+
65
+ /**
66
+ * Heading level information
67
+ */
68
+ interface Level {
69
+ /** Level number */
70
+ number: number;
71
+ /** HTML tag corresponding with level number */
72
+ tag: string;
73
+ /** Translation key for this level (e.g., 'tools.header.heading1') */
74
+ nameKey: string;
75
+ /** Display name for this level (user override or fallback) */
76
+ name: string;
77
+ /** Icon */
78
+ icon: string;
79
+ /** Tailwind classes for styling */
80
+ styles: string;
81
+ /** Inline styles for custom overrides */
82
+ inlineStyles: Partial<CSSStyleDeclaration>;
83
+ }
84
+
85
+ /**
86
+ * Header block for the Blok Editor.
87
+ *
88
+ * @author CodeX (team@ifmo.su)
89
+ * @copyright CodeX 2018
90
+ * @license MIT
91
+ * @version 2.0.0
92
+ */
93
+ export class Header implements BlockTool {
94
+ /**
95
+ * Editor API
96
+ */
97
+ private api: API;
98
+
99
+ /**
100
+ * Read-only mode flag
101
+ */
102
+ private readOnly: boolean;
103
+
104
+ /**
105
+ * Tool's settings passed from Editor
106
+ */
107
+ private _settings: HeaderConfig;
108
+
109
+ /**
110
+ * Block's data
111
+ */
112
+ private _data: HeaderData;
113
+
114
+ /**
115
+ * Main Block wrapper
116
+ */
117
+ private _element: HTMLHeadingElement;
118
+
119
+ /**
120
+ * Render plugin's main Element and fill it with saved data
121
+ *
122
+ * @param options - constructor options
123
+ * @param options.data - previously saved data
124
+ * @param options.config - user config for Tool
125
+ * @param options.api - Editor API
126
+ * @param options.readOnly - read only mode flag
127
+ */
128
+ constructor({ data, config, api, readOnly }: BlockToolConstructorOptions<HeaderData, HeaderConfig>) {
129
+ this.api = api;
130
+ this.readOnly = readOnly;
131
+
132
+ this._settings = config || {};
133
+ this._data = this.normalizeData(data);
134
+ this._element = this.getTag();
135
+ }
136
+
137
+ /**
138
+ * Base styles for all header levels
139
+ */
140
+ private static readonly BASE_STYLES = 'py-[3px] px-[2px] m-0 !leading-[1.3] outline-none [&_p]:!p-0 [&_p]:!m-0 [&_div]:!p-0 [&_div]:!m-0';
141
+
142
+ /**
143
+ * Styles
144
+ * @deprecated Use data-blok-tool attribute instead (DATA_ATTR.tool)
145
+ */
146
+ private get _CSS(): { block: string; wrapper: string } {
147
+ return {
148
+ block: this.api.styles.block,
149
+ wrapper: '',
150
+ };
151
+ }
152
+
153
+ /**
154
+ * Check if data is valid HeaderData
155
+ *
156
+ * @param data - data to check
157
+ * @returns true if data is HeaderData
158
+ */
159
+ private isHeaderData(data: unknown): data is HeaderData {
160
+ return typeof data === 'object' && data !== null && 'text' in data;
161
+ }
162
+
163
+ /**
164
+ * Normalize input data
165
+ *
166
+ * @param data - saved data to process
167
+ * @returns normalized HeaderData
168
+ */
169
+ private normalizeData(data: HeaderData | Record<string, never>): HeaderData {
170
+ if (!this.isHeaderData(data)) {
171
+ return { text: '', level: this.defaultLevel.number };
172
+ }
173
+
174
+ const parsedLevel = parseInt(String(data.level));
175
+ const isValidLevel = data.level !== undefined && !isNaN(parsedLevel);
176
+
177
+ return {
178
+ text: data.text || '',
179
+ level: isValidLevel ? parsedLevel : this.defaultLevel.number,
180
+ };
181
+ }
182
+
183
+ /**
184
+ * Return Tool's view
185
+ *
186
+ * @returns HTMLHeadingElement
187
+ */
188
+ public render(): HTMLHeadingElement {
189
+ return this._element;
190
+ }
191
+
192
+ /**
193
+ * Returns header block tunes config
194
+ *
195
+ * @returns MenuConfig array
196
+ */
197
+ public renderSettings(): MenuConfig {
198
+ return this.levels.map(level => {
199
+ const translated = this.api.i18n.t(level.nameKey);
200
+ const title = translated !== level.nameKey ? translated : level.name;
201
+
202
+ return {
203
+ icon: level.icon,
204
+ title,
205
+ onActivate: (): void => this.setLevel(level.number),
206
+ closeOnActivate: true,
207
+ isActive: this.currentLevel.number === level.number,
208
+ dataset: {
209
+ 'blok-header-level': String(level.number),
210
+ },
211
+ };
212
+ });
213
+ }
214
+
215
+ /**
216
+ * Callback for Block's settings buttons
217
+ *
218
+ * @param level - level to set
219
+ */
220
+ private setLevel(level: number): void {
221
+ this.data = {
222
+ level: level,
223
+ text: this.data.text,
224
+ };
225
+ }
226
+
227
+ /**
228
+ * Method that specified how to merge two Text blocks.
229
+ * Called by Editor by backspace at the beginning of the Block
230
+ *
231
+ * @param data - saved data to merge with current block
232
+ */
233
+ public merge(data: HeaderData): void {
234
+ this._element.insertAdjacentHTML('beforeend', data.text);
235
+ }
236
+
237
+ /**
238
+ * Validate Text block data:
239
+ * - check for emptiness
240
+ *
241
+ * @param blockData - data received after saving
242
+ * @returns false if saved data is not correct, otherwise true
243
+ */
244
+ public validate(blockData: HeaderData): boolean {
245
+ return blockData.text.trim() !== '';
246
+ }
247
+
248
+ /**
249
+ * Extract Tool's data from the view
250
+ *
251
+ * @param toolsContent - Text tools rendered view
252
+ * @returns saved data
253
+ */
254
+ public save(toolsContent: HTMLHeadingElement): HeaderData {
255
+ return {
256
+ text: toolsContent.innerHTML,
257
+ level: this.currentLevel.number,
258
+ };
259
+ }
260
+
261
+ /**
262
+ * Allow Header to be converted to/from other blocks
263
+ */
264
+ public static get conversionConfig(): ConversionConfig {
265
+ return {
266
+ export: 'text', // use 'text' property for other blocks
267
+ import: 'text', // fill 'text' property from other block's export string
268
+ };
269
+ }
270
+
271
+ /**
272
+ * Sanitizer Rules
273
+ */
274
+ public static get sanitize(): SanitizerConfig {
275
+ return {
276
+ level: false,
277
+ text: {},
278
+ };
279
+ }
280
+
281
+ /**
282
+ * Returns true to notify core that read-only is supported
283
+ *
284
+ * @returns true
285
+ */
286
+ public static get isReadOnlySupported(): boolean {
287
+ return true;
288
+ }
289
+
290
+ /**
291
+ * Get current Tool's data
292
+ *
293
+ * @returns Current data
294
+ */
295
+ public get data(): HeaderData {
296
+ this._data.text = this._element.innerHTML;
297
+ this._data.level = this.currentLevel.number;
298
+
299
+ return this._data;
300
+ }
301
+
302
+ /**
303
+ * Store data in plugin:
304
+ * - at the this._data property
305
+ * - at the HTML
306
+ *
307
+ * @param data - data to set
308
+ */
309
+ public set data(data: HeaderData) {
310
+ this._data = this.normalizeData(data);
311
+
312
+ /**
313
+ * If level is set and block in DOM
314
+ * then replace it to a new block
315
+ */
316
+ if (data.level !== undefined && this._element.parentNode) {
317
+ /**
318
+ * Create a new tag
319
+ */
320
+ const newHeader = this.getTag();
321
+
322
+ /**
323
+ * Save Block's content
324
+ */
325
+ newHeader.innerHTML = this._element.innerHTML;
326
+
327
+ /**
328
+ * Replace blocks
329
+ */
330
+ this._element.parentNode.replaceChild(newHeader, this._element);
331
+
332
+ /**
333
+ * Save new block to private variable
334
+ */
335
+ this._element = newHeader;
336
+ }
337
+
338
+ /**
339
+ * If data.text was passed then update block's content
340
+ */
341
+ if (data.text !== undefined) {
342
+ this._element.innerHTML = this._data.text || '';
343
+ }
344
+ }
345
+
346
+ /**
347
+ * Get tag for target level
348
+ * By default returns second-leveled header
349
+ *
350
+ * @returns HTMLHeadingElement
351
+ */
352
+ private getTag(): HTMLHeadingElement {
353
+ /**
354
+ * Create element for current Block's level
355
+ */
356
+ const tag = document.createElement(this.currentLevel.tag) as HTMLHeadingElement;
357
+
358
+ /**
359
+ * Add text to block
360
+ */
361
+ tag.innerHTML = this._data.text || '';
362
+
363
+ /**
364
+ * Add styles class using twMerge to combine base and level-specific styles
365
+ */
366
+ tag.className = twMerge(Header.BASE_STYLES, this.currentLevel.styles, PLACEHOLDER_CLASSES);
367
+
368
+ /**
369
+ * Apply inline styles for custom overrides (dynamic values from config)
370
+ */
371
+ const { inlineStyles } = this.currentLevel;
372
+
373
+ if (inlineStyles) {
374
+ Object.assign(tag.style, inlineStyles);
375
+ }
376
+
377
+ /**
378
+ * Set data attribute for tool identification
379
+ */
380
+ tag.setAttribute(DATA_ATTR.tool, 'header');
381
+
382
+ /**
383
+ * Make tag editable
384
+ */
385
+ tag.contentEditable = this.readOnly ? 'false' : 'true';
386
+
387
+ /**
388
+ * Add Placeholder with caret positioning support
389
+ */
390
+ if (!this.readOnly) {
391
+ setupPlaceholder(tag, this.api.i18n.t(this._settings.placeholder || ''));
392
+ } else {
393
+ tag.setAttribute('data-placeholder', this.api.i18n.t(this._settings.placeholder || ''));
394
+ }
395
+
396
+ return tag;
397
+ }
398
+
399
+ /**
400
+ * Get current level
401
+ *
402
+ * @returns Level object
403
+ */
404
+ private get currentLevel(): Level {
405
+ const level = this.levels.find(levelItem => levelItem.number === this._data.level);
406
+
407
+ return level ?? this.defaultLevel;
408
+ }
409
+
410
+ /**
411
+ * Return default level
412
+ *
413
+ * @returns Level object
414
+ */
415
+ private get defaultLevel(): Level {
416
+ /**
417
+ * User can specify own default level value
418
+ */
419
+ if (!this._settings.defaultLevel) {
420
+ /**
421
+ * With no additional options, there will be H2 by default
422
+ */
423
+ return this.levels[1];
424
+ }
425
+
426
+ const userSpecified = this.levels.find(levelItem => {
427
+ return levelItem.number === this._settings.defaultLevel;
428
+ });
429
+
430
+ if (userSpecified) {
431
+ return userSpecified;
432
+ }
433
+
434
+ console.warn('(ง\'̀-\'́)ง Heading Tool: the default level specified was not found in available levels');
435
+
436
+ return this.levels[1];
437
+ }
438
+
439
+ /**
440
+ * Default level configurations using Tailwind CSS classes
441
+ */
442
+ private static readonly DEFAULT_LEVELS: Array<{
443
+ number: number;
444
+ tag: string;
445
+ nameKey: string;
446
+ name: string;
447
+ icon: string;
448
+ styles: string;
449
+ }> = [
450
+ { number: 1, tag: 'H1', nameKey: 'tools.header.heading1', name: 'Heading 1', icon: IconH1, styles: 'text-4xl font-bold mt-8 mb-1' },
451
+ { number: 2, tag: 'H2', nameKey: 'tools.header.heading2', name: 'Heading 2', icon: IconH2, styles: 'text-3xl font-semibold mt-6 mb-px' },
452
+ { number: 3, tag: 'H3', nameKey: 'tools.header.heading3', name: 'Heading 3', icon: IconH3, styles: 'text-2xl font-semibold mt-4 mb-px' },
453
+ { number: 4, tag: 'H4', nameKey: 'tools.header.heading4', name: 'Heading 4', icon: IconH4, styles: 'text-xl font-semibold mt-3 mb-px' },
454
+ { number: 5, tag: 'H5', nameKey: 'tools.header.heading5', name: 'Heading 5', icon: IconH5, styles: 'text-base font-semibold mt-3 mb-px' },
455
+ { number: 6, tag: 'H6', nameKey: 'tools.header.heading6', name: 'Heading 6', icon: IconH6, styles: 'text-sm font-semibold mt-3 mb-px' },
456
+ ];
457
+
458
+ /**
459
+ * Available header levels
460
+ *
461
+ * @returns Level array
462
+ */
463
+ private get levels(): Level[] {
464
+ const overrides = this._settings.levelOverrides || {};
465
+
466
+ const availableLevels: Level[] = Header.DEFAULT_LEVELS.map(defaultLevel => {
467
+ const override = overrides[defaultLevel.number] || {};
468
+
469
+ // Build inline styles for custom overrides (dynamic values don't work with Tailwind)
470
+ const inlineStyles: Partial<CSSStyleDeclaration> = {};
471
+
472
+ if (override.size) {
473
+ inlineStyles.fontSize = override.size;
474
+ }
475
+ if (override.marginTop) {
476
+ inlineStyles.marginTop = override.marginTop;
477
+ }
478
+ if (override.marginBottom) {
479
+ inlineStyles.marginBottom = override.marginBottom;
480
+ }
481
+
482
+ return {
483
+ number: defaultLevel.number,
484
+ tag: override.tag?.toUpperCase() || defaultLevel.tag,
485
+ nameKey: defaultLevel.nameKey,
486
+ name: override.name || defaultLevel.name,
487
+ icon: defaultLevel.icon,
488
+ styles: defaultLevel.styles,
489
+ inlineStyles,
490
+ };
491
+ });
492
+
493
+ return this._settings.levels
494
+ ? availableLevels.filter(l => this._settings.levels!.includes(l.number))
495
+ : availableLevels;
496
+ }
497
+
498
+ /**
499
+ * Handle H1-H6 tags on paste to substitute it with header Tool
500
+ *
501
+ * @param event - event with pasted content
502
+ */
503
+ public onPaste(event: PasteEvent): void {
504
+ const detail = event.detail;
505
+
506
+ if (!('data' in detail)) {
507
+ return;
508
+ }
509
+
510
+ const content = detail.data as HTMLElement;
511
+
512
+ /**
513
+ * Map tag names to level numbers
514
+ */
515
+ const tagToLevel: Record<string, number> = {
516
+ H1: 1,
517
+ H2: 2,
518
+ H3: 3,
519
+ H4: 4,
520
+ H5: 5,
521
+ H6: 6,
522
+ };
523
+
524
+ /**
525
+ * Define default level value
526
+ */
527
+ const parsedLevel = tagToLevel[content.tagName] ?? this.defaultLevel.number;
528
+
529
+ /**
530
+ * If levels are restricted, find the nearest allowed level
531
+ */
532
+ const level = this._settings.levels
533
+ ? this._settings.levels.reduce((prevLevel, currLevel) => {
534
+ return Math.abs(currLevel - parsedLevel) < Math.abs(prevLevel - parsedLevel) ? currLevel : prevLevel;
535
+ })
536
+ : parsedLevel;
537
+
538
+ this.data = {
539
+ level,
540
+ text: content.innerHTML,
541
+ };
542
+ }
543
+
544
+ /**
545
+ * Used by Editor paste handling API.
546
+ * Provides configuration to handle H1-H6 tags.
547
+ *
548
+ * @returns PasteConfig
549
+ */
550
+ public static get pasteConfig(): PasteConfig {
551
+ return {
552
+ tags: ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'],
553
+ };
554
+ }
555
+
556
+ /**
557
+ * Get Tool toolbox settings
558
+ * icon - Tool icon's SVG
559
+ * title - title to show in toolbox
560
+ *
561
+ * @returns ToolboxConfig
562
+ */
563
+ public static get toolbox(): ToolboxConfig {
564
+ return {
565
+ icon: IconHeading,
566
+ title: 'Heading',
567
+ titleKey: 'heading',
568
+ };
569
+ }
570
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @module Tools
3
+ * Re-exports all built-in tools for easy importing.
4
+ *
5
+ * @example
6
+ * // Import specific tools
7
+ * import { Paragraph, Header, List, Bold, Italic, Link } from '@jackuait/blok/tools';
8
+ *
9
+ * // Use in Blok configuration
10
+ * new Blok({
11
+ * tools: { paragraph: Paragraph, header: Header, list: List },
12
+ * inlineTools: { bold: Bold, italic: Italic, link: Link }
13
+ * });
14
+ */
15
+
16
+ // Block tools
17
+ export { Paragraph } from './paragraph';
18
+ export { Header } from './header';
19
+ export { ListItem as List } from './list';
20
+
21
+ // Inline tools
22
+ export { BoldInlineTool as Bold } from '../components/inline-tools/inline-tool-bold';
23
+ export { ItalicInlineTool as Italic } from '../components/inline-tools/inline-tool-italic';
24
+ export { LinkInlineTool as Link } from '../components/inline-tools/inline-tool-link';
25
+ export { ConvertInlineTool as Convert } from '../components/inline-tools/inline-tool-convert';
26
+
27
+ // Default tools configuration for convenience
28
+ export const defaultBlockTools = {
29
+ paragraph: { inlineToolbar: true, config: { preserveBlank: true } },
30
+ header: { inlineToolbar: true },
31
+ list: { inlineToolbar: true },
32
+ } as const;
33
+
34
+ export const defaultInlineTools = {
35
+ bold: {},
36
+ italic: {},
37
+ link: {},
38
+ } as const;