@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,498 @@
1
+ import type { Meta, StoryObj } from '@storybook/html-vite';
2
+ import { userEvent, waitFor, expect } from 'storybook/test';
3
+ import type { OutputData } from '@/types';
4
+ import { createEditorContainer, simulateClick, waitForToolbar, selectTextInBlock, waitForPointerEvents } from './helpers';
5
+ import type { EditorFactoryOptions } from './helpers';
6
+ import { Header } from '../tools/header';
7
+
8
+ interface InlineToolbarArgs extends EditorFactoryOptions {
9
+ minHeight: number;
10
+ data: OutputData | undefined;
11
+ }
12
+
13
+ // Constants
14
+ const BLOCK_TESTID = '[data-blok-testid="block-wrapper"]';
15
+ const INLINE_TOOLBAR_TESTID = '[data-blok-testid="inline-toolbar"]';
16
+ const INLINE_TOOL_INPUT_TESTID = '[data-blok-testid="inline-tool-input"]';
17
+ const CONTENTEDITABLE_SELECTOR = '[contenteditable="true"]';
18
+ const LINK_TOOL_SELECTOR = '[data-blok-item-name="link"]';
19
+ const CONVERT_TO_SELECTOR = '[data-blok-item-name="convert-to"]';
20
+ const POPOVER_OPENED_SELECTOR = '[data-blok-popover-opened="true"]';
21
+ const NESTED_POPOVER_SELECTOR = '[data-blok-nested="true"]';
22
+
23
+ const TIMEOUT_INIT = { timeout: 5000 };
24
+ const TIMEOUT_ACTION = { timeout: 5000 };
25
+
26
+ const sampleData: OutputData = {
27
+ time: Date.now(),
28
+ version: '1.0.0',
29
+ blocks: [
30
+ {
31
+ id: 'inline-block-1',
32
+ type: 'paragraph',
33
+ data: { text: 'Select this text to see the inline toolbar appear with formatting options.' },
34
+ },
35
+ {
36
+ id: 'inline-block-2',
37
+ type: 'paragraph',
38
+ data: { text: 'This paragraph has <strong>bold text</strong> and <em>italic text</em> already applied.' },
39
+ },
40
+ {
41
+ id: 'inline-block-3',
42
+ type: 'paragraph',
43
+ data: { text: 'This paragraph contains a <a href="https://example.com">link to example</a> website.' },
44
+ },
45
+ ],
46
+ };
47
+
48
+ const createEditor = (args: InlineToolbarArgs): HTMLElement => createEditorContainer(args);
49
+
50
+ /**
51
+ * Helper to select text within an element
52
+ */
53
+ const selectText = (element: Element, start: number, end: number): void => {
54
+ const range = document.createRange();
55
+ const textNode = element.firstChild;
56
+
57
+ if (textNode && textNode.nodeType === Node.TEXT_NODE) {
58
+ range.setStart(textNode, start);
59
+ range.setEnd(textNode, end);
60
+
61
+ const selection = window.getSelection();
62
+
63
+ selection?.removeAllRanges();
64
+ selection?.addRange(range);
65
+ }
66
+ };
67
+
68
+ const meta: Meta<InlineToolbarArgs> = {
69
+ title: 'Components/Inline Toolbar',
70
+ tags: ['autodocs'],
71
+ args: {
72
+ minHeight: 300,
73
+ data: sampleData,
74
+ tools: {
75
+ header: Header,
76
+ },
77
+ },
78
+ render: createEditor,
79
+ };
80
+
81
+ export default meta;
82
+
83
+
84
+ type Story = StoryObj<InlineToolbarArgs>;
85
+
86
+ /**
87
+ * Default state: Inline toolbar is hidden until text is selected.
88
+ */
89
+ export const Default: Story = {
90
+ args: {
91
+ data: sampleData,
92
+ },
93
+ };
94
+
95
+ /**
96
+ * Inline toolbar visible after selecting text.
97
+ */
98
+ export const WithTextSelection: Story = {
99
+ args: {
100
+ data: sampleData,
101
+ },
102
+ play: async ({ canvasElement, step }) => {
103
+ await step('Wait for editor to initialize', async () => {
104
+ await waitFor(
105
+ () => {
106
+ const block = canvasElement.querySelector(BLOCK_TESTID);
107
+
108
+ expect(block).toBeInTheDocument();
109
+ },
110
+ TIMEOUT_INIT
111
+ );
112
+ });
113
+
114
+ await step('Select text to show inline toolbar', async () => {
115
+ const block = canvasElement.querySelector(BLOCK_TESTID);
116
+ const contentEditable = block?.querySelector(CONTENTEDITABLE_SELECTOR);
117
+
118
+ if (contentEditable) {
119
+ simulateClick(contentEditable);
120
+ selectText(contentEditable, 0, 11);
121
+ document.dispatchEvent(new Event('selectionchange'));
122
+ }
123
+
124
+ await waitFor(
125
+ () => {
126
+ const inlineToolbar = document.querySelector(INLINE_TOOLBAR_TESTID);
127
+
128
+ expect(inlineToolbar).toBeInTheDocument();
129
+ },
130
+ TIMEOUT_ACTION
131
+ );
132
+ });
133
+ },
134
+ };
135
+
136
+ /**
137
+ * Bold tool active state when selected text is bold.
138
+ */
139
+ export const BoldActive: Story = {
140
+ args: {
141
+ data: sampleData,
142
+ },
143
+ play: async ({ canvasElement, step }) => {
144
+ await step('Wait for editor to initialize', async () => {
145
+ await waitFor(
146
+ () => {
147
+ const blocks = canvasElement.querySelectorAll(BLOCK_TESTID);
148
+
149
+ expect(blocks.length).toBeGreaterThan(1);
150
+ },
151
+ TIMEOUT_INIT
152
+ );
153
+ });
154
+
155
+ await step('Select bold text to show active state', async () => {
156
+ const blocks = canvasElement.querySelectorAll(BLOCK_TESTID);
157
+ const secondBlock = blocks[1];
158
+
159
+ // Use 'strong' selector - browsers normalize <b> to <strong>
160
+ if (secondBlock) {
161
+ selectTextInBlock(secondBlock, 'strong');
162
+ }
163
+
164
+ await waitFor(
165
+ () => {
166
+ const inlineToolbar = document.querySelector(INLINE_TOOLBAR_TESTID);
167
+
168
+ expect(inlineToolbar).toBeInTheDocument();
169
+
170
+ // Verify bold tool shows active state
171
+ const boldTool = document.querySelector('[data-blok-item-name="bold"]');
172
+
173
+ expect(boldTool).toHaveAttribute('data-blok-popover-item-active', 'true');
174
+ },
175
+ TIMEOUT_ACTION
176
+ );
177
+ });
178
+ },
179
+ };
180
+
181
+ /**
182
+ * Italic tool active state when selected text is italic.
183
+ */
184
+ export const ItalicActive: Story = {
185
+ args: {
186
+ data: sampleData,
187
+ },
188
+ play: async ({ canvasElement, step }) => {
189
+ await step('Wait for editor to initialize', async () => {
190
+ await waitFor(
191
+ () => {
192
+ const blocks = canvasElement.querySelectorAll(BLOCK_TESTID);
193
+
194
+ expect(blocks.length).toBeGreaterThan(1);
195
+ },
196
+ TIMEOUT_INIT
197
+ );
198
+ });
199
+
200
+ await step('Select italic text to show active state', async () => {
201
+ const blocks = canvasElement.querySelectorAll(BLOCK_TESTID);
202
+ const secondBlock = blocks[1];
203
+
204
+ // Use 'em' selector - browsers normalize <i> to <em>
205
+ if (secondBlock) {
206
+ selectTextInBlock(secondBlock, 'em');
207
+ }
208
+
209
+ await waitFor(
210
+ () => {
211
+ const inlineToolbar = document.querySelector(INLINE_TOOLBAR_TESTID);
212
+
213
+ expect(inlineToolbar).toBeInTheDocument();
214
+
215
+ // Verify italic tool shows active state
216
+ const italicTool = document.querySelector('[data-blok-item-name="italic"]');
217
+
218
+ expect(italicTool).toHaveAttribute('data-blok-popover-item-active', 'true');
219
+ },
220
+ TIMEOUT_ACTION
221
+ );
222
+ });
223
+ },
224
+ };
225
+
226
+ /**
227
+ * Link tool active state when cursor is in a link.
228
+ */
229
+ export const LinkActive: Story = {
230
+ args: {
231
+ data: sampleData,
232
+ },
233
+ play: async ({ canvasElement, step }) => {
234
+ await step('Wait for editor to initialize', async () => {
235
+ await waitFor(
236
+ () => {
237
+ const blocks = canvasElement.querySelectorAll(BLOCK_TESTID);
238
+
239
+ expect(blocks.length).toBeGreaterThan(2);
240
+ },
241
+ TIMEOUT_INIT
242
+ );
243
+ });
244
+
245
+ await step('Select link text to show active/unlink state', async () => {
246
+ const blocks = canvasElement.querySelectorAll(BLOCK_TESTID);
247
+ const thirdBlock = blocks[2];
248
+
249
+ if (thirdBlock) {
250
+ selectTextInBlock(thirdBlock, 'a');
251
+ }
252
+
253
+ await waitFor(
254
+ () => {
255
+ const inlineToolbar = document.querySelector(INLINE_TOOLBAR_TESTID);
256
+
257
+ expect(inlineToolbar).toBeInTheDocument();
258
+
259
+ // Verify link tool shows active state
260
+ const linkTool = document.querySelector(LINK_TOOL_SELECTOR);
261
+
262
+ expect(linkTool).toHaveAttribute('data-blok-popover-item-active', 'true');
263
+ },
264
+ TIMEOUT_ACTION
265
+ );
266
+ });
267
+ },
268
+ };
269
+
270
+ /**
271
+ * Link input field shown when clicking the link tool.
272
+ */
273
+ export const LinkInputShown: Story = {
274
+ args: {
275
+ data: sampleData,
276
+ },
277
+ play: async ({ canvasElement, step }) => {
278
+ await step('Wait for editor and toolbar to initialize', async () => {
279
+ await waitFor(
280
+ () => {
281
+ const block = canvasElement.querySelector(BLOCK_TESTID);
282
+
283
+ expect(block).toBeInTheDocument();
284
+ },
285
+ TIMEOUT_INIT
286
+ );
287
+ // Wait for toolbar to be created (happens in requestIdleCallback)
288
+ await waitForToolbar(canvasElement);
289
+ });
290
+
291
+ await step('Select text to show inline toolbar', async () => {
292
+ const block = canvasElement.querySelector(BLOCK_TESTID);
293
+ const contentEditable = block?.querySelector(CONTENTEDITABLE_SELECTOR);
294
+
295
+ if (contentEditable) {
296
+ // Focus the element first
297
+ simulateClick(contentEditable);
298
+
299
+ // Create a proper selection using the same pattern as other working tests
300
+ const range = document.createRange();
301
+ const textNode = contentEditable.firstChild;
302
+
303
+ if (textNode && textNode.nodeType === Node.TEXT_NODE) {
304
+ // Select "Select this" (11 characters)
305
+ range.setStart(textNode, 0);
306
+ range.setEnd(textNode, 11);
307
+ } else {
308
+ // Fallback: select all content
309
+ range.selectNodeContents(contentEditable);
310
+ }
311
+
312
+ const selection = window.getSelection();
313
+
314
+ selection?.removeAllRanges();
315
+ selection?.addRange(range);
316
+
317
+ // Focus the element to ensure selection is active
318
+ (contentEditable as HTMLElement).focus();
319
+
320
+ // Dispatch selectionchange event
321
+ document.dispatchEvent(new Event('selectionchange'));
322
+ }
323
+
324
+ // Wait for the debounced selection handler (180ms) plus popover creation
325
+ await new Promise((resolve) => setTimeout(resolve, 300));
326
+
327
+ await waitFor(
328
+ () => {
329
+ const inlineToolbar = document.querySelector(INLINE_TOOLBAR_TESTID);
330
+
331
+ expect(inlineToolbar).toBeInTheDocument();
332
+
333
+ // Also verify the popover is populated
334
+ const popoverContainer = inlineToolbar?.querySelector('[data-blok-testid="popover-container"]');
335
+
336
+ expect(popoverContainer).toBeInTheDocument();
337
+ },
338
+ TIMEOUT_ACTION
339
+ );
340
+ });
341
+
342
+ await step('Click link tool to show input', async () => {
343
+ // The link tool should now be available
344
+ const linkTool = document.querySelector(LINK_TOOL_SELECTOR);
345
+
346
+ expect(linkTool).toBeInTheDocument();
347
+
348
+ if (linkTool) {
349
+ // Click the link tool
350
+ (linkTool as HTMLElement).click();
351
+ }
352
+
353
+ // Wait for nested popover to appear
354
+ await waitFor(
355
+ () => {
356
+ // The input is inside a nested popover
357
+ const linkInput = document.querySelector(INLINE_TOOL_INPUT_TESTID);
358
+
359
+ expect(linkInput).toBeInTheDocument();
360
+ },
361
+ TIMEOUT_ACTION
362
+ );
363
+ });
364
+ },
365
+ };
366
+
367
+ /**
368
+ * Convert-to dropdown opened in inline toolbar.
369
+ */
370
+ export const ConvertToDropdownOpen: Story = {
371
+ args: {
372
+ data: sampleData,
373
+ },
374
+ play: async ({ canvasElement, step }) => {
375
+ await step('Wait for editor to initialize', async () => {
376
+ await waitFor(
377
+ () => {
378
+ const block = canvasElement.querySelector(BLOCK_TESTID);
379
+
380
+ expect(block).toBeInTheDocument();
381
+ },
382
+ TIMEOUT_INIT
383
+ );
384
+ });
385
+
386
+ await step('Select text to show inline toolbar', async () => {
387
+ const block = canvasElement.querySelector(BLOCK_TESTID);
388
+ const contentEditable = block?.querySelector(CONTENTEDITABLE_SELECTOR);
389
+
390
+ if (contentEditable) {
391
+ simulateClick(contentEditable);
392
+ selectText(contentEditable, 0, 11);
393
+ document.dispatchEvent(new Event('selectionchange'));
394
+ }
395
+
396
+ await waitFor(
397
+ () => {
398
+ const inlineToolbar = document.querySelector(INLINE_TOOLBAR_TESTID);
399
+
400
+ expect(inlineToolbar).toBeInTheDocument();
401
+ },
402
+ TIMEOUT_ACTION
403
+ );
404
+ });
405
+
406
+ await step('Click convert-to button to open nested popover', async () => {
407
+ // Wait for the convert-to button to appear (it's rendered async after inline toolbar opens)
408
+ await waitFor(
409
+ () => {
410
+ const convertToButton = document.querySelector(CONVERT_TO_SELECTOR);
411
+
412
+ expect(convertToButton).toBeInTheDocument();
413
+ },
414
+ TIMEOUT_ACTION
415
+ );
416
+
417
+ const convertToButton = document.querySelector(CONVERT_TO_SELECTOR);
418
+
419
+ if (convertToButton) {
420
+ // Use simulateClick helper which dispatches mousedown, mouseup, and click events
421
+ // This is needed for proper popover event handling
422
+ simulateClick(convertToButton);
423
+ }
424
+
425
+ // Wait a bit for the popover animation
426
+ await new Promise((resolve) => setTimeout(resolve, 100));
427
+
428
+ await waitFor(
429
+ () => {
430
+ // The nested popover should be opened
431
+ const nestedPopover = document.querySelector(NESTED_POPOVER_SELECTOR + POPOVER_OPENED_SELECTOR);
432
+
433
+ expect(nestedPopover).toBeInTheDocument();
434
+ },
435
+ TIMEOUT_ACTION
436
+ );
437
+ });
438
+ },
439
+ };
440
+
441
+ /**
442
+ * Inline toolbar tool hover state.
443
+ * Note: Adds --force-hover class to bypass @media (hover: hover) in headless browsers.
444
+ */
445
+ export const ToolHoverState: Story = {
446
+ args: {
447
+ data: sampleData,
448
+ },
449
+ play: async ({ canvasElement, step }) => {
450
+ await step('Wait for editor to initialize', async () => {
451
+ await waitFor(
452
+ () => {
453
+ const block = canvasElement.querySelector(BLOCK_TESTID);
454
+
455
+ expect(block).toBeInTheDocument();
456
+ },
457
+ TIMEOUT_INIT
458
+ );
459
+ });
460
+
461
+ await step('Select text to show inline toolbar', async () => {
462
+ const block = canvasElement.querySelector(BLOCK_TESTID);
463
+ const contentEditable = block?.querySelector(CONTENTEDITABLE_SELECTOR);
464
+
465
+ if (contentEditable) {
466
+ simulateClick(contentEditable);
467
+ selectText(contentEditable, 0, 11);
468
+ document.dispatchEvent(new Event('selectionchange'));
469
+ }
470
+
471
+ await waitFor(
472
+ () => {
473
+ const inlineToolbar = document.querySelector(INLINE_TOOLBAR_TESTID);
474
+
475
+ expect(inlineToolbar).toBeInTheDocument();
476
+ },
477
+ TIMEOUT_ACTION
478
+ );
479
+ });
480
+
481
+ await step('Hover over bold tool', async () => {
482
+ // Wait for popover to open AND for pointer-events to be enabled
483
+ await waitForPointerEvents(`${INLINE_TOOLBAR_TESTID} [data-blok-testid="popover-container"]`);
484
+
485
+ // Small delay for CSS animation to complete
486
+ await new Promise((resolve) => setTimeout(resolve, 150));
487
+
488
+ // Find the bold tool specifically by its data attribute
489
+ const boldTool = document.querySelector('[data-blok-item-name="bold"]');
490
+
491
+ if (boldTool) {
492
+ // Add force-hover state to show hover styles in headless browsers
493
+ boldTool.setAttribute('data-blok-force-hover', 'true');
494
+ await userEvent.hover(boldTool);
495
+ }
496
+ });
497
+ },
498
+ };