@jackuait/blok 0.4.1-beta.1 → 0.4.1-beta.12

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 (403) 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-BU6NwVkN.mjs +13239 -0
  7. package/dist/chunks/i18next-CugVlwWp.mjs +1292 -0
  8. package/dist/chunks/i18next-loader-D8GzSwio.mjs +43 -0
  9. package/dist/{index-CEXLTV6f.mjs → chunks/index-C5e_WLFg.mjs} +2 -2
  10. package/dist/chunks/inline-tool-convert-CLUxkCe_.mjs +1990 -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 +3126 -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 +142 -0
  248. package/src/components/inline-tools/inline-tool-italic.ts +500 -0
  249. package/src/components/inline-tools/inline-tool-link.ts +540 -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 +782 -0
  284. package/src/components/modules/toolbar/index.ts +1296 -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 +610 -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 +197 -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 +682 -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 +759 -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 +126 -0
  366. package/src/tools/header/index.ts +647 -0
  367. package/src/tools/index.ts +45 -0
  368. package/src/tools/list/index.ts +1826 -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/configs/sanitizer-config.d.ts +25 -1
  386. package/types/data-attributes.d.ts +170 -0
  387. package/types/data-formats/output-data.d.ts +15 -0
  388. package/types/full.d.ts +80 -0
  389. package/types/index.d.ts +30 -13
  390. package/types/locales.d.ts +59 -0
  391. package/types/tools/adapters/inline-tool-adapter.d.ts +10 -0
  392. package/types/tools/block-tool.d.ts +11 -2
  393. package/types/tools/header.d.ts +18 -0
  394. package/types/tools/index.d.ts +1 -0
  395. package/types/tools/list.d.ts +91 -0
  396. package/types/tools/paragraph.d.ts +71 -0
  397. package/types/tools/tool-settings.d.ts +99 -6
  398. package/types/tools/tool.d.ts +6 -0
  399. package/types/tools-entry.d.ts +49 -0
  400. package/types/utils/popover/popover-item.d.ts +24 -5
  401. package/types/utils/popover/popover.d.ts +13 -0
  402. package/dist/blok-C8XbyLHh.mjs +0 -25795
  403. package/dist/blok.umd.js +0 -181
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Item that could be searched
3
+ */
4
+ export interface SearchableItem {
5
+ /**
6
+ * Items title (displayed, possibly translated)
7
+ */
8
+ title?: string;
9
+
10
+ /**
11
+ * English title for fallback search (always matches English input)
12
+ */
13
+ englishTitle?: string;
14
+
15
+ /**
16
+ * Additional search terms/aliases (e.g., ['h1', 'title'])
17
+ */
18
+ searchTerms?: string[];
19
+ }
20
+
21
+ /**
22
+ * Checks if an item matches a search query.
23
+ * Matches against: displayed title, English title, and search term aliases.
24
+ * @param item - item to check
25
+ * @param query - search query (case-insensitive)
26
+ * @returns true if the item matches the query
27
+ */
28
+ export const matchesSearchQuery = (item: SearchableItem, query: string): boolean => {
29
+ const lowerQuery = query.toLowerCase();
30
+ const title = item.title?.toLowerCase() ?? '';
31
+ const englishTitle = item.englishTitle?.toLowerCase() ?? '';
32
+ const searchTerms = item.searchTerms ?? [];
33
+
34
+ return (
35
+ title.includes(lowerQuery) ||
36
+ englishTitle.includes(lowerQuery) ||
37
+ searchTerms.some(term => term.toLowerCase().includes(lowerQuery))
38
+ );
39
+ };
40
+
41
+ /**
42
+ * Event that can be triggered by the Search Input
43
+ */
44
+ export enum SearchInputEvent {
45
+ /**
46
+ * When search query is applied
47
+ */
48
+ Search = 'search'
49
+ }
50
+
51
+ /**
52
+ * Events fired by the Search Input
53
+ */
54
+ export interface SearchInputEventMap {
55
+ /**
56
+ * Fired when search query is applied
57
+ */
58
+ [SearchInputEvent.Search]: { query: string; items: SearchableItem[]};
59
+ }
@@ -0,0 +1,13 @@
1
+ import { PopoverDesktop } from './popover-desktop';
2
+ import { PopoverInline } from './popover-inline';
3
+ import { PopoverMobile } from './popover-mobile';
4
+
5
+ export type * from '@/types/utils/popover';
6
+ export { PopoverItemType } from '@/types/utils/popover/popover-item-type';
7
+
8
+ /**
9
+ * Union type for all popovers
10
+ */
11
+ export type Popover = PopoverDesktop | PopoverMobile | PopoverInline;
12
+
13
+ export { PopoverDesktop, PopoverMobile, PopoverInline };
@@ -0,0 +1,457 @@
1
+ import type { PopoverItem, PopoverItemRenderParamsMap } from './components/popover-item';
2
+ import { PopoverItemDefault, PopoverItemSeparator, PopoverItemType } from './components/popover-item';
3
+ import type { SearchInput } from './components/search-input';
4
+ import { EventsDispatcher } from '../events';
5
+ import { Listeners } from '../listeners';
6
+ import type { PopoverEventMap, PopoverMessages, PopoverParams, PopoverNodes } from '@/types/utils/popover/popover';
7
+ import { PopoverEvent } from '@/types/utils/popover/popover-event';
8
+ import type { PopoverItemParams } from './components/popover-item';
9
+ import { PopoverItemHtml } from './components/popover-item/popover-item-html/popover-item-html';
10
+ import { css } from './popover.const';
11
+ import { DATA_ATTR } from '../../constants/data-attributes';
12
+ import { twMerge } from '../tw';
13
+
14
+ /**
15
+ * Class responsible for rendering popover and handling its behaviour.
16
+ * Uses vanilla DOM manipulation for rendering.
17
+ */
18
+ export abstract class PopoverAbstract<Nodes extends PopoverNodes = PopoverNodes> extends EventsDispatcher<PopoverEventMap> {
19
+ /**
20
+ * List of popover items
21
+ */
22
+ protected items: Array<PopoverItem>;
23
+
24
+ /**
25
+ * Listeners util instance
26
+ */
27
+ protected listeners: Listeners = new Listeners();
28
+
29
+ /**
30
+ * Refs to created HTML elements.
31
+ */
32
+ protected nodes: Nodes;
33
+
34
+ /**
35
+ * List of default popover items that are searchable and may have confirmation state
36
+ */
37
+ protected get itemsDefault(): PopoverItemDefault[] {
38
+ return this.items.filter(item => item instanceof PopoverItemDefault) as PopoverItemDefault[];
39
+ }
40
+
41
+ /**
42
+ * Instance of the Search Input
43
+ */
44
+ protected search: SearchInput | undefined;
45
+
46
+ /**
47
+ * Messages that will be displayed in popover
48
+ */
49
+ protected messages: PopoverMessages = {
50
+ nothingFound: 'Nothing found',
51
+ search: 'Search',
52
+ };
53
+
54
+ /**
55
+ * Constructs the instance
56
+ * @param params - popover construction params
57
+ * @param itemsRenderParams - popover item render params.
58
+ * The parameters that are not set by user via popover api but rather depend on technical implementation
59
+ */
60
+ constructor(
61
+ protected readonly params: PopoverParams,
62
+ protected readonly itemsRenderParams: PopoverItemRenderParamsMap = {}
63
+ ) {
64
+ super();
65
+
66
+ this.items = this.buildItems(params.items);
67
+
68
+ if (params.messages) {
69
+ this.messages = {
70
+ ...this.messages,
71
+ ...params.messages,
72
+ };
73
+ }
74
+
75
+ // Initialize nodes object and create DOM elements
76
+ this.nodes = this.createPopoverDOM() as Nodes;
77
+
78
+ // Append item elements to the items container
79
+ this.appendItemElements();
80
+
81
+ // Set up click listener on the container
82
+ if (this.nodes.popoverContainer) {
83
+ this.listeners.on(this.nodes.popoverContainer, 'click', (event: Event) => this.handleClick(event));
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Returns HTML element corresponding to the popover
89
+ */
90
+ public getElement(): HTMLElement {
91
+ return this.nodes.popover as HTMLElement;
92
+ }
93
+
94
+ /**
95
+ * Returns DOM element that should be attached to the document.
96
+ */
97
+ public getMountElement(): HTMLElement {
98
+ return this.nodes.popover as HTMLElement;
99
+ }
100
+
101
+ /**
102
+ * Open popover
103
+ */
104
+ public show(): void {
105
+ const mountTarget = this.nodes.popover;
106
+
107
+ if (mountTarget !== null && !mountTarget.isConnected) {
108
+ document.body.appendChild(mountTarget);
109
+ }
110
+
111
+ // Update DOM state
112
+ this.nodes.popover.setAttribute(DATA_ATTR.popoverOpened, 'true');
113
+ this.nodes.popoverContainer.classList.add(...css.popoverContainerOpened.split(' '));
114
+
115
+ /**
116
+ * Refresh active states for all items.
117
+ * This ensures items with dynamic isActive() callbacks reflect the current state.
118
+ */
119
+ this.itemsDefault.forEach(item => this.refreshItemActiveState(item));
120
+
121
+ if (this.search !== undefined) {
122
+ this.search.focus();
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Closes popover
128
+ */
129
+ public hide(): void {
130
+ // Update DOM state
131
+ this.nodes.popover.removeAttribute(DATA_ATTR.popoverOpened);
132
+ this.nodes.popover.removeAttribute(DATA_ATTR.popoverOpenTop);
133
+ this.nodes.popover.removeAttribute(DATA_ATTR.popoverOpenLeft);
134
+ this.nodes.popoverContainer.classList.remove(...css.popoverContainerOpened.split(' '));
135
+
136
+ this.itemsDefault.forEach(item => item.reset());
137
+
138
+ if (this.search !== undefined) {
139
+ this.search.clear();
140
+ }
141
+
142
+ this.emit(PopoverEvent.Closed);
143
+ }
144
+
145
+ /**
146
+ * Clears memory
147
+ */
148
+ public destroy(): void {
149
+ this.items.forEach(item => item.destroy());
150
+ this.nodes.popover?.remove();
151
+ this.listeners.removeAll();
152
+ this.search?.destroy();
153
+ }
154
+
155
+ /**
156
+ * Filters popover items by query string.
157
+ * Base implementation is a no-op. Override in subclasses that support filtering.
158
+ * @param _query - search query text
159
+ */
160
+ public filterItems(_query: string): void {
161
+ // No-op in base class. PopoverDesktop overrides this.
162
+ }
163
+
164
+ /**
165
+ * Looks for the item by name and imitates click on it
166
+ * @param name - name of the item to activate
167
+ */
168
+ public activateItemByName(name: string): void {
169
+ const foundItem = this.items.find(item => item.name === name);
170
+
171
+ if (foundItem === undefined) {
172
+ return;
173
+ }
174
+
175
+ this.handleItemClick(foundItem);
176
+ }
177
+
178
+ /**
179
+ * Factory method for creating popover items
180
+ * @param items - list of items params
181
+ */
182
+ protected buildItems(items: PopoverItemParams[]): Array<PopoverItem> {
183
+ return items.map(item => {
184
+ switch (item.type) {
185
+ case PopoverItemType.Separator:
186
+ return new PopoverItemSeparator(this.itemsRenderParams[PopoverItemType.Separator]);
187
+ case PopoverItemType.Html:
188
+ return new PopoverItemHtml(item, this.itemsRenderParams[PopoverItemType.Html]);
189
+ default:
190
+ return new PopoverItemDefault(item, this.itemsRenderParams[PopoverItemType.Default]);
191
+ }
192
+ });
193
+ }
194
+
195
+ /**
196
+ * Retrieves popover item that is the target of the specified event
197
+ * @param event - event to retrieve popover item from
198
+ */
199
+ protected getTargetItem(event: Event): PopoverItemDefault | PopoverItemHtml | undefined {
200
+ return this.items
201
+ .filter(item => item instanceof PopoverItemDefault || item instanceof PopoverItemHtml)
202
+ .find(item => {
203
+ const itemEl = item.getElement();
204
+
205
+ if (itemEl === null) {
206
+ return false;
207
+ }
208
+
209
+ return event.composedPath().includes(itemEl);
210
+ }) as PopoverItemDefault | PopoverItemHtml | undefined;
211
+ }
212
+
213
+ /**
214
+ * Handles popover item click
215
+ * @param item - item to handle click of
216
+ */
217
+ protected handleItemClick(item: PopoverItem): void {
218
+ if (item instanceof PopoverItemDefault && item.isDisabled) {
219
+ return;
220
+ }
221
+
222
+ if (item.hasChildren) {
223
+ this.showNestedItems(item as PopoverItemDefault | PopoverItemHtml);
224
+ this.callHandleClickIfPresent(item);
225
+
226
+ return;
227
+ }
228
+
229
+ /** Cleanup other items state */
230
+ this.itemsDefault.filter(x => x !== item).forEach(x => x.reset());
231
+
232
+ this.callHandleClickIfPresent(item);
233
+
234
+ this.toggleItemActivenessIfNeeded(item);
235
+
236
+ /**
237
+ * Refresh item's active state based on isActive() callback.
238
+ * This is needed for inline tools that dynamically determine their active state.
239
+ */
240
+ this.refreshItemActiveState(item);
241
+
242
+ if (item.closeOnActivate === true) {
243
+ this.hide();
244
+
245
+ this.emit(PopoverEvent.ClosedOnActivate);
246
+ }
247
+ }
248
+
249
+ /**
250
+ * Handles clicks inside popover
251
+ * @param event - item to handle click of
252
+ */
253
+ private handleClick(event: Event): void {
254
+ const item = this.getTargetItem(event);
255
+
256
+ if (item === undefined) {
257
+ return;
258
+ }
259
+
260
+ this.handleItemClick(item);
261
+ }
262
+
263
+
264
+ /**
265
+ * - Toggles item active state, if clicked popover item has property 'toggle' set to true.
266
+ *
267
+ * - Performs radiobutton-like behavior if the item has property 'toggle' set to string key.
268
+ * (All the other items with the same key get inactive, and the item gets active)
269
+ * @param clickedItem - popover item that was clicked
270
+ */
271
+ private toggleItemActivenessIfNeeded(clickedItem: PopoverItem): void {
272
+ if (!(clickedItem instanceof PopoverItemDefault)) {
273
+ return;
274
+ }
275
+
276
+ if (clickedItem.toggle === true) {
277
+ clickedItem.toggleActive();
278
+ }
279
+
280
+ if (typeof clickedItem.toggle !== 'string') {
281
+ return;
282
+ }
283
+
284
+ const itemsInToggleGroup = this.itemsDefault.filter(item => item.toggle === clickedItem.toggle);
285
+
286
+ /** If there's only one item in toggle group, toggle it */
287
+ if (itemsInToggleGroup.length === 1) {
288
+ clickedItem.toggleActive();
289
+
290
+ return;
291
+ }
292
+
293
+ /** Set clicked item as active and the rest items with same toggle key value as inactive */
294
+ itemsInToggleGroup.forEach(item => {
295
+ item.toggleActive(item === clickedItem);
296
+ });
297
+ }
298
+
299
+ /**
300
+ * Refreshes the item's active state based on its isActive callback.
301
+ * This is useful for items that determine their active state dynamically (e.g., inline tools).
302
+ * @param item - popover item to refresh
303
+ */
304
+ private refreshItemActiveState(item: PopoverItem): void {
305
+ if (!(item instanceof PopoverItemDefault)) {
306
+ return;
307
+ }
308
+
309
+ /**
310
+ * Only refresh if the item doesn't use toggle (which is handled by toggleItemActivenessIfNeeded)
311
+ */
312
+ if (item.toggle !== undefined) {
313
+ return;
314
+ }
315
+
316
+ /**
317
+ * Update the visual state based on the isActive callback
318
+ */
319
+ item.toggleActive(item.isActive);
320
+ }
321
+
322
+ /**
323
+ * Executes handleClick if it is present on item.
324
+ * @param item - popover item whose handler should be executed
325
+ */
326
+ private callHandleClickIfPresent(item: PopoverItem): void {
327
+ if ('handleClick' in item && typeof item.handleClick === 'function') {
328
+ item.handleClick();
329
+ }
330
+ }
331
+
332
+ /**
333
+ * Handles displaying nested items for the item. Behaviour differs depending on platform.
334
+ * @param item – item to show nested popover for
335
+ */
336
+ protected abstract showNestedItems(item: PopoverItemDefault | PopoverItemHtml): void;
337
+
338
+ /**
339
+ * Toggles nothing found message visibility
340
+ * @param isDisplayed - true if the message should be displayed
341
+ */
342
+ protected toggleNothingFoundMessage(isDisplayed: boolean): void {
343
+ if (isDisplayed) {
344
+ this.nodes.nothingFoundMessage.classList.remove('hidden');
345
+ this.nodes.nothingFoundMessage.setAttribute(DATA_ATTR.nothingFoundDisplayed, 'true');
346
+ } else {
347
+ this.nodes.nothingFoundMessage.classList.add('hidden');
348
+ this.nodes.nothingFoundMessage.removeAttribute(DATA_ATTR.nothingFoundDisplayed);
349
+ }
350
+ }
351
+
352
+ /**
353
+ * Sets the open-top state for the popover
354
+ * @param openTop - true if popover should open above trigger
355
+ */
356
+ protected setOpenTop(openTop: boolean): void {
357
+ if (openTop) {
358
+ this.nodes.popover.setAttribute(DATA_ATTR.popoverOpenTop, 'true');
359
+ } else {
360
+ this.nodes.popover.removeAttribute(DATA_ATTR.popoverOpenTop);
361
+ }
362
+ }
363
+
364
+ /**
365
+ * Sets the open-left state for the popover
366
+ * @param openLeft - true if popover should open to the left
367
+ */
368
+ protected setOpenLeft(openLeft: boolean): void {
369
+ if (openLeft) {
370
+ this.nodes.popover.setAttribute(DATA_ATTR.popoverOpenLeft, 'true');
371
+ } else {
372
+ this.nodes.popover.removeAttribute(DATA_ATTR.popoverOpenLeft);
373
+ }
374
+ }
375
+
376
+ /**
377
+ * Checks if popover contains the node
378
+ * @param node - node to check
379
+ */
380
+ public hasNode(node: Node): boolean {
381
+ return this.nodes.popover.contains(node);
382
+ }
383
+
384
+ /**
385
+ * Creates the popover DOM structure
386
+ * @returns PopoverNodes object with all required elements
387
+ */
388
+ private createPopoverDOM(): PopoverNodes {
389
+ // Create root popover element
390
+ const popover = document.createElement('div');
391
+
392
+ if (this.params.class) {
393
+ popover.className = this.params.class;
394
+ }
395
+ popover.setAttribute(DATA_ATTR.popover, '');
396
+ if (this.params.class) {
397
+ popover.setAttribute('data-blok-popover-custom-class', this.params.class);
398
+ }
399
+ popover.setAttribute('data-blok-testid', 'popover');
400
+
401
+ // Set CSS variables
402
+ popover.style.setProperty('--width', this.params.width ?? '280px');
403
+ popover.style.setProperty('--item-padding', '3px');
404
+ popover.style.setProperty('--item-height', 'calc(1.25rem + 2 * var(--item-padding))');
405
+ popover.style.setProperty('--popover-top', 'calc(100% + 0.5rem)');
406
+ popover.style.setProperty('--popover-left', '0');
407
+ popover.style.setProperty('--nested-popover-overlap', '0.25rem');
408
+
409
+ // Create popover container
410
+ const popoverContainer = document.createElement('div');
411
+ popoverContainer.className = css.popoverContainer;
412
+ popoverContainer.setAttribute(DATA_ATTR.popoverContainer, '');
413
+ popoverContainer.setAttribute('data-blok-testid', 'popover-container');
414
+
415
+ // Create nothing found message
416
+ const nothingFoundMessage = document.createElement('div');
417
+ nothingFoundMessage.className = twMerge(
418
+ 'cursor-default text-sm leading-5 font-medium whitespace-nowrap overflow-hidden text-ellipsis text-gray-text p-[3px]',
419
+ 'hidden'
420
+ );
421
+ nothingFoundMessage.setAttribute('data-blok-testid', 'popover-nothing-found');
422
+ nothingFoundMessage.textContent = this.messages.nothingFound ?? 'Nothing found';
423
+
424
+ // Create items container
425
+ const items = document.createElement('div');
426
+ items.className = css.items;
427
+ items.setAttribute(DATA_ATTR.popoverItems, '');
428
+ items.setAttribute('data-blok-testid', 'popover-items');
429
+
430
+ // Assemble DOM structure
431
+ popoverContainer.appendChild(nothingFoundMessage);
432
+ popoverContainer.appendChild(items);
433
+ popover.appendChild(popoverContainer);
434
+
435
+ return {
436
+ popover,
437
+ popoverContainer,
438
+ nothingFoundMessage,
439
+ items,
440
+ };
441
+ }
442
+
443
+ /**
444
+ * Appends item elements to the items container
445
+ */
446
+ private appendItemElements(): void {
447
+ this.items.forEach(item => {
448
+ const itemEl = item.getMountElement?.() ?? item.getElement();
449
+
450
+ if (itemEl === null) {
451
+ return;
452
+ }
453
+
454
+ this.nodes.items?.appendChild(itemEl);
455
+ });
456
+ }
457
+ }