@jackuait/blok 0.4.1-beta.5 → 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-Cl_5rkKS.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 +59 -156
  149. package/package.json +48 -16
  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 +0 -5
  381. package/types/configs/blok-config.d.ts +21 -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 +0 -5
  399. package/dist/blok-DvN73wsH.mjs +0 -19922
  400. package/dist/blok.umd.js +0 -166
@@ -0,0 +1,448 @@
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
+ * Looks for the item by name and imitates click on it
157
+ * @param name - name of the item to activate
158
+ */
159
+ public activateItemByName(name: string): void {
160
+ const foundItem = this.items.find(item => item.name === name);
161
+
162
+ if (foundItem === undefined) {
163
+ return;
164
+ }
165
+
166
+ this.handleItemClick(foundItem);
167
+ }
168
+
169
+ /**
170
+ * Factory method for creating popover items
171
+ * @param items - list of items params
172
+ */
173
+ protected buildItems(items: PopoverItemParams[]): Array<PopoverItem> {
174
+ return items.map(item => {
175
+ switch (item.type) {
176
+ case PopoverItemType.Separator:
177
+ return new PopoverItemSeparator(this.itemsRenderParams[PopoverItemType.Separator]);
178
+ case PopoverItemType.Html:
179
+ return new PopoverItemHtml(item, this.itemsRenderParams[PopoverItemType.Html]);
180
+ default:
181
+ return new PopoverItemDefault(item, this.itemsRenderParams[PopoverItemType.Default]);
182
+ }
183
+ });
184
+ }
185
+
186
+ /**
187
+ * Retrieves popover item that is the target of the specified event
188
+ * @param event - event to retrieve popover item from
189
+ */
190
+ protected getTargetItem(event: Event): PopoverItemDefault | PopoverItemHtml | undefined {
191
+ return this.items
192
+ .filter(item => item instanceof PopoverItemDefault || item instanceof PopoverItemHtml)
193
+ .find(item => {
194
+ const itemEl = item.getElement();
195
+
196
+ if (itemEl === null) {
197
+ return false;
198
+ }
199
+
200
+ return event.composedPath().includes(itemEl);
201
+ }) as PopoverItemDefault | PopoverItemHtml | undefined;
202
+ }
203
+
204
+ /**
205
+ * Handles popover item click
206
+ * @param item - item to handle click of
207
+ */
208
+ protected handleItemClick(item: PopoverItem): void {
209
+ if (item instanceof PopoverItemDefault && item.isDisabled) {
210
+ return;
211
+ }
212
+
213
+ if (item.hasChildren) {
214
+ this.showNestedItems(item as PopoverItemDefault | PopoverItemHtml);
215
+ this.callHandleClickIfPresent(item);
216
+
217
+ return;
218
+ }
219
+
220
+ /** Cleanup other items state */
221
+ this.itemsDefault.filter(x => x !== item).forEach(x => x.reset());
222
+
223
+ this.callHandleClickIfPresent(item);
224
+
225
+ this.toggleItemActivenessIfNeeded(item);
226
+
227
+ /**
228
+ * Refresh item's active state based on isActive() callback.
229
+ * This is needed for inline tools that dynamically determine their active state.
230
+ */
231
+ this.refreshItemActiveState(item);
232
+
233
+ if (item.closeOnActivate === true) {
234
+ this.hide();
235
+
236
+ this.emit(PopoverEvent.ClosedOnActivate);
237
+ }
238
+ }
239
+
240
+ /**
241
+ * Handles clicks inside popover
242
+ * @param event - item to handle click of
243
+ */
244
+ private handleClick(event: Event): void {
245
+ const item = this.getTargetItem(event);
246
+
247
+ if (item === undefined) {
248
+ return;
249
+ }
250
+
251
+ this.handleItemClick(item);
252
+ }
253
+
254
+
255
+ /**
256
+ * - Toggles item active state, if clicked popover item has property 'toggle' set to true.
257
+ *
258
+ * - Performs radiobutton-like behavior if the item has property 'toggle' set to string key.
259
+ * (All the other items with the same key get inactive, and the item gets active)
260
+ * @param clickedItem - popover item that was clicked
261
+ */
262
+ private toggleItemActivenessIfNeeded(clickedItem: PopoverItem): void {
263
+ if (!(clickedItem instanceof PopoverItemDefault)) {
264
+ return;
265
+ }
266
+
267
+ if (clickedItem.toggle === true) {
268
+ clickedItem.toggleActive();
269
+ }
270
+
271
+ if (typeof clickedItem.toggle !== 'string') {
272
+ return;
273
+ }
274
+
275
+ const itemsInToggleGroup = this.itemsDefault.filter(item => item.toggle === clickedItem.toggle);
276
+
277
+ /** If there's only one item in toggle group, toggle it */
278
+ if (itemsInToggleGroup.length === 1) {
279
+ clickedItem.toggleActive();
280
+
281
+ return;
282
+ }
283
+
284
+ /** Set clicked item as active and the rest items with same toggle key value as inactive */
285
+ itemsInToggleGroup.forEach(item => {
286
+ item.toggleActive(item === clickedItem);
287
+ });
288
+ }
289
+
290
+ /**
291
+ * Refreshes the item's active state based on its isActive callback.
292
+ * This is useful for items that determine their active state dynamically (e.g., inline tools).
293
+ * @param item - popover item to refresh
294
+ */
295
+ private refreshItemActiveState(item: PopoverItem): void {
296
+ if (!(item instanceof PopoverItemDefault)) {
297
+ return;
298
+ }
299
+
300
+ /**
301
+ * Only refresh if the item doesn't use toggle (which is handled by toggleItemActivenessIfNeeded)
302
+ */
303
+ if (item.toggle !== undefined) {
304
+ return;
305
+ }
306
+
307
+ /**
308
+ * Update the visual state based on the isActive callback
309
+ */
310
+ item.toggleActive(item.isActive);
311
+ }
312
+
313
+ /**
314
+ * Executes handleClick if it is present on item.
315
+ * @param item - popover item whose handler should be executed
316
+ */
317
+ private callHandleClickIfPresent(item: PopoverItem): void {
318
+ if ('handleClick' in item && typeof item.handleClick === 'function') {
319
+ item.handleClick();
320
+ }
321
+ }
322
+
323
+ /**
324
+ * Handles displaying nested items for the item. Behaviour differs depending on platform.
325
+ * @param item – item to show nested popover for
326
+ */
327
+ protected abstract showNestedItems(item: PopoverItemDefault | PopoverItemHtml): void;
328
+
329
+ /**
330
+ * Toggles nothing found message visibility
331
+ * @param isDisplayed - true if the message should be displayed
332
+ */
333
+ protected toggleNothingFoundMessage(isDisplayed: boolean): void {
334
+ if (isDisplayed) {
335
+ this.nodes.nothingFoundMessage.classList.remove('hidden');
336
+ this.nodes.nothingFoundMessage.setAttribute(DATA_ATTR.nothingFoundDisplayed, 'true');
337
+ } else {
338
+ this.nodes.nothingFoundMessage.classList.add('hidden');
339
+ this.nodes.nothingFoundMessage.removeAttribute(DATA_ATTR.nothingFoundDisplayed);
340
+ }
341
+ }
342
+
343
+ /**
344
+ * Sets the open-top state for the popover
345
+ * @param openTop - true if popover should open above trigger
346
+ */
347
+ protected setOpenTop(openTop: boolean): void {
348
+ if (openTop) {
349
+ this.nodes.popover.setAttribute(DATA_ATTR.popoverOpenTop, 'true');
350
+ } else {
351
+ this.nodes.popover.removeAttribute(DATA_ATTR.popoverOpenTop);
352
+ }
353
+ }
354
+
355
+ /**
356
+ * Sets the open-left state for the popover
357
+ * @param openLeft - true if popover should open to the left
358
+ */
359
+ protected setOpenLeft(openLeft: boolean): void {
360
+ if (openLeft) {
361
+ this.nodes.popover.setAttribute(DATA_ATTR.popoverOpenLeft, 'true');
362
+ } else {
363
+ this.nodes.popover.removeAttribute(DATA_ATTR.popoverOpenLeft);
364
+ }
365
+ }
366
+
367
+ /**
368
+ * Checks if popover contains the node
369
+ * @param node - node to check
370
+ */
371
+ public hasNode(node: Node): boolean {
372
+ return this.nodes.popover.contains(node);
373
+ }
374
+
375
+ /**
376
+ * Creates the popover DOM structure
377
+ * @returns PopoverNodes object with all required elements
378
+ */
379
+ private createPopoverDOM(): PopoverNodes {
380
+ // Create root popover element
381
+ const popover = document.createElement('div');
382
+
383
+ if (this.params.class) {
384
+ popover.className = this.params.class;
385
+ }
386
+ popover.setAttribute(DATA_ATTR.popover, '');
387
+ if (this.params.class) {
388
+ popover.setAttribute('data-blok-popover-custom-class', this.params.class);
389
+ }
390
+ popover.setAttribute('data-blok-testid', 'popover');
391
+
392
+ // Set CSS variables
393
+ popover.style.setProperty('--width', '200px');
394
+ popover.style.setProperty('--item-padding', '3px');
395
+ popover.style.setProperty('--item-height', 'calc(1.25rem + 2 * var(--item-padding))');
396
+ popover.style.setProperty('--popover-top', 'calc(100% + 0.5rem)');
397
+ popover.style.setProperty('--popover-left', '0');
398
+ popover.style.setProperty('--nested-popover-overlap', '0.25rem');
399
+
400
+ // Create popover container
401
+ const popoverContainer = document.createElement('div');
402
+ popoverContainer.className = css.popoverContainer;
403
+ popoverContainer.setAttribute(DATA_ATTR.popoverContainer, '');
404
+ popoverContainer.setAttribute('data-blok-testid', 'popover-container');
405
+
406
+ // Create nothing found message
407
+ const nothingFoundMessage = document.createElement('div');
408
+ nothingFoundMessage.className = twMerge(
409
+ 'cursor-default text-sm leading-5 font-medium whitespace-nowrap overflow-hidden text-ellipsis text-gray-text p-[3px]',
410
+ 'hidden'
411
+ );
412
+ nothingFoundMessage.setAttribute('data-blok-testid', 'popover-nothing-found');
413
+ nothingFoundMessage.textContent = this.messages.nothingFound ?? 'Nothing found';
414
+
415
+ // Create items container
416
+ const items = document.createElement('div');
417
+ items.className = css.items;
418
+ items.setAttribute(DATA_ATTR.popoverItems, '');
419
+ items.setAttribute('data-blok-testid', 'popover-items');
420
+
421
+ // Assemble DOM structure
422
+ popoverContainer.appendChild(nothingFoundMessage);
423
+ popoverContainer.appendChild(items);
424
+ popover.appendChild(popoverContainer);
425
+
426
+ return {
427
+ popover,
428
+ popoverContainer,
429
+ nothingFoundMessage,
430
+ items,
431
+ };
432
+ }
433
+
434
+ /**
435
+ * Appends item elements to the items container
436
+ */
437
+ private appendItemElements(): void {
438
+ this.items.forEach(item => {
439
+ const itemEl = item.getMountElement?.() ?? item.getElement();
440
+
441
+ if (itemEl === null) {
442
+ return;
443
+ }
444
+
445
+ this.nodes.items?.appendChild(itemEl);
446
+ });
447
+ }
448
+ }