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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/README.md +136 -17
  2. package/codemod/README.md +16 -0
  3. package/codemod/migrate-editorjs-to-blok.js +868 -92
  4. package/codemod/test.js +682 -77
  5. package/dist/blok.mjs +5 -2
  6. package/dist/chunks/blok-B5qs7C5l.mjs +12838 -0
  7. package/dist/chunks/i18next-CugVlwWp.mjs +1292 -0
  8. package/dist/chunks/i18next-loader-CTrK3HzG.mjs +43 -0
  9. package/dist/{index-XWGz4gev.mjs → chunks/index-DDpzQn-0.mjs} +2 -2
  10. package/dist/chunks/inline-tool-convert-RBcopmCh.mjs +1988 -0
  11. package/dist/chunks/messages-2434tVOK.mjs +47 -0
  12. package/dist/chunks/messages-3DcCwXMF.mjs +47 -0
  13. package/dist/chunks/messages-4kMwVAKY.mjs +47 -0
  14. package/dist/chunks/messages-57uL5htT.mjs +47 -0
  15. package/dist/chunks/messages-76-iJV9Q.mjs +47 -0
  16. package/dist/chunks/messages-8p86Eyf2.mjs +47 -0
  17. package/dist/chunks/messages-BBX0p0Pi.mjs +47 -0
  18. package/dist/chunks/messages-BCm2eudQ.mjs +47 -0
  19. package/dist/chunks/messages-BFiUomgG.mjs +47 -0
  20. package/dist/chunks/messages-BIPNHHAV.mjs +47 -0
  21. package/dist/chunks/messages-BUlwu9mo.mjs +47 -0
  22. package/dist/chunks/messages-BX-DPa-z.mjs +47 -0
  23. package/dist/chunks/messages-BextV3Qh.mjs +47 -0
  24. package/dist/chunks/messages-BiPSFlUG.mjs +47 -0
  25. package/dist/chunks/messages-BiXe9G-O.mjs +47 -0
  26. package/dist/chunks/messages-Bl5z_Igo.mjs +47 -0
  27. package/dist/chunks/messages-BnsE97ku.mjs +47 -0
  28. package/dist/chunks/messages-BoO8gsVD.mjs +47 -0
  29. package/dist/chunks/messages-BqWaOGMn.mjs +47 -0
  30. package/dist/chunks/messages-BqkL2_Ro.mjs +47 -0
  31. package/dist/chunks/messages-BvCkXKX-.mjs +47 -0
  32. package/dist/chunks/messages-C6tbPLoj.mjs +47 -0
  33. package/dist/chunks/messages-CA6T3-gQ.mjs +47 -0
  34. package/dist/chunks/messages-CFFPFdWP.mjs +47 -0
  35. package/dist/chunks/messages-CFrKE-TN.mjs +47 -0
  36. package/dist/chunks/messages-CHz8VlG-.mjs +47 -0
  37. package/dist/chunks/messages-CLixzySl.mjs +47 -0
  38. package/dist/chunks/messages-CV7OM_qk.mjs +47 -0
  39. package/dist/chunks/messages-CXHt3eCC.mjs +47 -0
  40. package/dist/chunks/messages-CbmsBrB0.mjs +47 -0
  41. package/dist/chunks/messages-Ceo1KtFx.mjs +47 -0
  42. package/dist/chunks/messages-Cm0LJLtB.mjs +47 -0
  43. package/dist/chunks/messages-CmymP_Ar.mjs +47 -0
  44. package/dist/chunks/messages-D0ohMB5H.mjs +47 -0
  45. package/dist/chunks/messages-D3GrDwXh.mjs +47 -0
  46. package/dist/chunks/messages-D3vTzIpL.mjs +47 -0
  47. package/dist/chunks/messages-D5WeksbV.mjs +47 -0
  48. package/dist/chunks/messages-DGaab4EP.mjs +47 -0
  49. package/dist/chunks/messages-DKha57ZU.mjs +47 -0
  50. package/dist/chunks/messages-DOaujgMW.mjs +47 -0
  51. package/dist/chunks/messages-DVbPLd_0.mjs +47 -0
  52. package/dist/chunks/messages-D_FCyfW6.mjs +47 -0
  53. package/dist/chunks/messages-Dd5iZN3c.mjs +47 -0
  54. package/dist/chunks/messages-DehM7135.mjs +47 -0
  55. package/dist/chunks/messages-Dg1OHftD.mjs +47 -0
  56. package/dist/chunks/messages-Di6Flq-b.mjs +47 -0
  57. package/dist/chunks/messages-Dqhhex6e.mjs +47 -0
  58. package/dist/chunks/messages-DueVe0F1.mjs +47 -0
  59. package/dist/chunks/messages-Dx3eFwI0.mjs +47 -0
  60. package/dist/chunks/messages-FOtiUoKl.mjs +47 -0
  61. package/dist/chunks/messages-FTOZNhRD.mjs +47 -0
  62. package/dist/chunks/messages-IQxGfQIV.mjs +47 -0
  63. package/dist/chunks/messages-JF2fzCkK.mjs +47 -0
  64. package/dist/chunks/messages-MOGl7I5v.mjs +47 -0
  65. package/dist/chunks/messages-QgYhPL-3.mjs +47 -0
  66. package/dist/chunks/messages-WYWIbQwo.mjs +47 -0
  67. package/dist/chunks/messages-a6A_LgDv.mjs +47 -0
  68. package/dist/chunks/messages-bSf31LJi.mjs +47 -0
  69. package/dist/chunks/messages-diGozhTn.mjs +47 -0
  70. package/dist/chunks/messages-er-kd-VO.mjs +47 -0
  71. package/dist/chunks/messages-ez3w5NBn.mjs +47 -0
  72. package/dist/chunks/messages-f3uXjegd.mjs +47 -0
  73. package/dist/chunks/messages-ohwI1UGv.mjs +47 -0
  74. package/dist/chunks/messages-p9BZJaFV.mjs +47 -0
  75. package/dist/chunks/messages-qIQ4L4rw.mjs +47 -0
  76. package/dist/chunks/messages-qWkXPggi.mjs +47 -0
  77. package/dist/chunks/messages-w5foGze_.mjs +47 -0
  78. package/dist/full.mjs +50 -0
  79. package/dist/locales.mjs +227 -0
  80. package/dist/messages-2434tVOK.mjs +47 -0
  81. package/dist/messages-3DcCwXMF.mjs +47 -0
  82. package/dist/messages-4kMwVAKY.mjs +47 -0
  83. package/dist/messages-57uL5htT.mjs +47 -0
  84. package/dist/messages-76-iJV9Q.mjs +47 -0
  85. package/dist/messages-8p86Eyf2.mjs +47 -0
  86. package/dist/messages-BBX0p0Pi.mjs +47 -0
  87. package/dist/messages-BCm2eudQ.mjs +47 -0
  88. package/dist/messages-BFiUomgG.mjs +47 -0
  89. package/dist/messages-BIPNHHAV.mjs +47 -0
  90. package/dist/messages-BUlwu9mo.mjs +47 -0
  91. package/dist/messages-BX-DPa-z.mjs +47 -0
  92. package/dist/messages-BextV3Qh.mjs +47 -0
  93. package/dist/messages-BiPSFlUG.mjs +47 -0
  94. package/dist/messages-BiXe9G-O.mjs +47 -0
  95. package/dist/messages-Bl5z_Igo.mjs +47 -0
  96. package/dist/messages-BnsE97ku.mjs +47 -0
  97. package/dist/messages-BoO8gsVD.mjs +47 -0
  98. package/dist/messages-BqWaOGMn.mjs +47 -0
  99. package/dist/messages-BqkL2_Ro.mjs +47 -0
  100. package/dist/messages-BvCkXKX-.mjs +47 -0
  101. package/dist/messages-C6tbPLoj.mjs +47 -0
  102. package/dist/messages-CA6T3-gQ.mjs +47 -0
  103. package/dist/messages-CFFPFdWP.mjs +47 -0
  104. package/dist/messages-CFrKE-TN.mjs +47 -0
  105. package/dist/messages-CHz8VlG-.mjs +47 -0
  106. package/dist/messages-CLixzySl.mjs +47 -0
  107. package/dist/messages-CV7OM_qk.mjs +47 -0
  108. package/dist/messages-CXHt3eCC.mjs +47 -0
  109. package/dist/messages-CbmsBrB0.mjs +47 -0
  110. package/dist/messages-Ceo1KtFx.mjs +47 -0
  111. package/dist/messages-Cm0LJLtB.mjs +47 -0
  112. package/dist/messages-CmymP_Ar.mjs +47 -0
  113. package/dist/messages-D0ohMB5H.mjs +47 -0
  114. package/dist/messages-D3GrDwXh.mjs +47 -0
  115. package/dist/messages-D3vTzIpL.mjs +47 -0
  116. package/dist/messages-D5WeksbV.mjs +47 -0
  117. package/dist/messages-DGaab4EP.mjs +47 -0
  118. package/dist/messages-DKha57ZU.mjs +47 -0
  119. package/dist/messages-DOaujgMW.mjs +47 -0
  120. package/dist/messages-DVbPLd_0.mjs +47 -0
  121. package/dist/messages-D_FCyfW6.mjs +47 -0
  122. package/dist/messages-Dd5iZN3c.mjs +47 -0
  123. package/dist/messages-DehM7135.mjs +47 -0
  124. package/dist/messages-Dg1OHftD.mjs +47 -0
  125. package/dist/messages-Di6Flq-b.mjs +47 -0
  126. package/dist/messages-Dqhhex6e.mjs +47 -0
  127. package/dist/messages-DueVe0F1.mjs +47 -0
  128. package/dist/messages-Dx3eFwI0.mjs +47 -0
  129. package/dist/messages-FOtiUoKl.mjs +47 -0
  130. package/dist/messages-FTOZNhRD.mjs +47 -0
  131. package/dist/messages-IQxGfQIV.mjs +47 -0
  132. package/dist/messages-JF2fzCkK.mjs +47 -0
  133. package/dist/messages-MOGl7I5v.mjs +47 -0
  134. package/dist/messages-QgYhPL-3.mjs +47 -0
  135. package/dist/messages-WYWIbQwo.mjs +47 -0
  136. package/dist/messages-a6A_LgDv.mjs +47 -0
  137. package/dist/messages-bSf31LJi.mjs +47 -0
  138. package/dist/messages-diGozhTn.mjs +47 -0
  139. package/dist/messages-er-kd-VO.mjs +47 -0
  140. package/dist/messages-ez3w5NBn.mjs +47 -0
  141. package/dist/messages-f3uXjegd.mjs +47 -0
  142. package/dist/messages-ohwI1UGv.mjs +47 -0
  143. package/dist/messages-p9BZJaFV.mjs +47 -0
  144. package/dist/messages-qIQ4L4rw.mjs +47 -0
  145. package/dist/messages-qWkXPggi.mjs +47 -0
  146. package/dist/messages-w5foGze_.mjs +47 -0
  147. package/dist/tools.mjs +3073 -0
  148. package/dist/vendor.LICENSE.txt +26 -225
  149. package/package.json +49 -23
  150. package/src/blok.ts +267 -0
  151. package/src/components/__module.ts +139 -0
  152. package/src/components/block/api.ts +155 -0
  153. package/src/components/block/index.ts +1427 -0
  154. package/src/components/block-tunes/block-tune-delete.ts +51 -0
  155. package/src/components/blocks.ts +338 -0
  156. package/src/components/constants/data-attributes.ts +342 -0
  157. package/src/components/constants.ts +76 -0
  158. package/src/components/core.ts +392 -0
  159. package/src/components/dom.ts +773 -0
  160. package/src/components/domIterator.ts +189 -0
  161. package/src/components/errors/critical.ts +5 -0
  162. package/src/components/events/BlockChanged.ts +16 -0
  163. package/src/components/events/BlockHovered.ts +21 -0
  164. package/src/components/events/BlockSettingsClosed.ts +12 -0
  165. package/src/components/events/BlockSettingsOpened.ts +12 -0
  166. package/src/components/events/BlokMobileLayoutToggled.ts +15 -0
  167. package/src/components/events/FakeCursorAboutToBeToggled.ts +17 -0
  168. package/src/components/events/FakeCursorHaveBeenSet.ts +17 -0
  169. package/src/components/events/HistoryStateChanged.ts +19 -0
  170. package/src/components/events/RedactorDomChanged.ts +14 -0
  171. package/src/components/events/index.ts +46 -0
  172. package/src/components/flipper.ts +481 -0
  173. package/src/components/i18n/i18next-loader.ts +84 -0
  174. package/src/components/i18n/lightweight-i18n.ts +86 -0
  175. package/src/components/i18n/locales/TRANSLATION_GUIDELINES.md +113 -0
  176. package/src/components/i18n/locales/am/messages.json +44 -0
  177. package/src/components/i18n/locales/ar/messages.json +44 -0
  178. package/src/components/i18n/locales/az/messages.json +44 -0
  179. package/src/components/i18n/locales/bg/messages.json +44 -0
  180. package/src/components/i18n/locales/bn/messages.json +44 -0
  181. package/src/components/i18n/locales/bs/messages.json +44 -0
  182. package/src/components/i18n/locales/cs/messages.json +44 -0
  183. package/src/components/i18n/locales/da/messages.json +44 -0
  184. package/src/components/i18n/locales/de/messages.json +44 -0
  185. package/src/components/i18n/locales/dv/messages.json +44 -0
  186. package/src/components/i18n/locales/el/messages.json +44 -0
  187. package/src/components/i18n/locales/en/messages.json +44 -0
  188. package/src/components/i18n/locales/es/messages.json +44 -0
  189. package/src/components/i18n/locales/et/messages.json +44 -0
  190. package/src/components/i18n/locales/fa/messages.json +44 -0
  191. package/src/components/i18n/locales/fi/messages.json +44 -0
  192. package/src/components/i18n/locales/fil/messages.json +44 -0
  193. package/src/components/i18n/locales/fr/messages.json +44 -0
  194. package/src/components/i18n/locales/gu/messages.json +44 -0
  195. package/src/components/i18n/locales/he/messages.json +44 -0
  196. package/src/components/i18n/locales/hi/messages.json +44 -0
  197. package/src/components/i18n/locales/hr/messages.json +44 -0
  198. package/src/components/i18n/locales/hu/messages.json +44 -0
  199. package/src/components/i18n/locales/hy/messages.json +44 -0
  200. package/src/components/i18n/locales/id/messages.json +44 -0
  201. package/src/components/i18n/locales/index.ts +225 -0
  202. package/src/components/i18n/locales/it/messages.json +44 -0
  203. package/src/components/i18n/locales/ja/messages.json +44 -0
  204. package/src/components/i18n/locales/ka/messages.json +44 -0
  205. package/src/components/i18n/locales/km/messages.json +44 -0
  206. package/src/components/i18n/locales/kn/messages.json +44 -0
  207. package/src/components/i18n/locales/ko/messages.json +44 -0
  208. package/src/components/i18n/locales/ku/messages.json +44 -0
  209. package/src/components/i18n/locales/lo/messages.json +44 -0
  210. package/src/components/i18n/locales/lt/messages.json +44 -0
  211. package/src/components/i18n/locales/lv/messages.json +44 -0
  212. package/src/components/i18n/locales/mk/messages.json +44 -0
  213. package/src/components/i18n/locales/ml/messages.json +44 -0
  214. package/src/components/i18n/locales/mn/messages.json +44 -0
  215. package/src/components/i18n/locales/mr/messages.json +44 -0
  216. package/src/components/i18n/locales/ms/messages.json +44 -0
  217. package/src/components/i18n/locales/my/messages.json +44 -0
  218. package/src/components/i18n/locales/ne/messages.json +44 -0
  219. package/src/components/i18n/locales/nl/messages.json +44 -0
  220. package/src/components/i18n/locales/no/messages.json +44 -0
  221. package/src/components/i18n/locales/pa/messages.json +44 -0
  222. package/src/components/i18n/locales/pl/messages.json +44 -0
  223. package/src/components/i18n/locales/ps/messages.json +44 -0
  224. package/src/components/i18n/locales/pt/messages.json +44 -0
  225. package/src/components/i18n/locales/ro/messages.json +44 -0
  226. package/src/components/i18n/locales/ru/messages.json +44 -0
  227. package/src/components/i18n/locales/sd/messages.json +44 -0
  228. package/src/components/i18n/locales/si/messages.json +44 -0
  229. package/src/components/i18n/locales/sk/messages.json +44 -0
  230. package/src/components/i18n/locales/sl/messages.json +44 -0
  231. package/src/components/i18n/locales/sq/messages.json +44 -0
  232. package/src/components/i18n/locales/sr/messages.json +44 -0
  233. package/src/components/i18n/locales/sv/messages.json +44 -0
  234. package/src/components/i18n/locales/sw/messages.json +44 -0
  235. package/src/components/i18n/locales/ta/messages.json +44 -0
  236. package/src/components/i18n/locales/te/messages.json +44 -0
  237. package/src/components/i18n/locales/th/messages.json +44 -0
  238. package/src/components/i18n/locales/tr/messages.json +44 -0
  239. package/src/components/i18n/locales/ug/messages.json +44 -0
  240. package/src/components/i18n/locales/uk/messages.json +44 -0
  241. package/src/components/i18n/locales/ur/messages.json +44 -0
  242. package/src/components/i18n/locales/vi/messages.json +44 -0
  243. package/src/components/i18n/locales/yi/messages.json +44 -0
  244. package/src/components/i18n/locales/zh/messages.json +44 -0
  245. package/src/components/icons/index.ts +242 -0
  246. package/src/components/inline-tools/inline-tool-bold.ts +2213 -0
  247. package/src/components/inline-tools/inline-tool-convert.ts +141 -0
  248. package/src/components/inline-tools/inline-tool-italic.ts +500 -0
  249. package/src/components/inline-tools/inline-tool-link.ts +539 -0
  250. package/src/components/modules/api/blocks.ts +363 -0
  251. package/src/components/modules/api/caret.ts +125 -0
  252. package/src/components/modules/api/events.ts +51 -0
  253. package/src/components/modules/api/history.ts +73 -0
  254. package/src/components/modules/api/i18n.ts +33 -0
  255. package/src/components/modules/api/index.ts +39 -0
  256. package/src/components/modules/api/inlineToolbar.ts +33 -0
  257. package/src/components/modules/api/listeners.ts +56 -0
  258. package/src/components/modules/api/notifier.ts +46 -0
  259. package/src/components/modules/api/readonly.ts +39 -0
  260. package/src/components/modules/api/sanitizer.ts +30 -0
  261. package/src/components/modules/api/saver.ts +52 -0
  262. package/src/components/modules/api/selection.ts +48 -0
  263. package/src/components/modules/api/styles.ts +72 -0
  264. package/src/components/modules/api/toolbar.ts +79 -0
  265. package/src/components/modules/api/tools.ts +16 -0
  266. package/src/components/modules/api/tooltip.ts +67 -0
  267. package/src/components/modules/api/ui.ts +36 -0
  268. package/src/components/modules/blockEvents.ts +1375 -0
  269. package/src/components/modules/blockManager.ts +1348 -0
  270. package/src/components/modules/blockSelection.ts +708 -0
  271. package/src/components/modules/caret.ts +853 -0
  272. package/src/components/modules/crossBlockSelection.ts +329 -0
  273. package/src/components/modules/dragManager.ts +1141 -0
  274. package/src/components/modules/history.ts +1098 -0
  275. package/src/components/modules/i18n.ts +325 -0
  276. package/src/components/modules/index.ts +139 -0
  277. package/src/components/modules/modificationsObserver.ts +147 -0
  278. package/src/components/modules/paste.ts +1092 -0
  279. package/src/components/modules/readonly.ts +136 -0
  280. package/src/components/modules/rectangleSelection.ts +668 -0
  281. package/src/components/modules/renderer.ts +155 -0
  282. package/src/components/modules/saver.ts +283 -0
  283. package/src/components/modules/toolbar/blockSettings.ts +776 -0
  284. package/src/components/modules/toolbar/index.ts +1311 -0
  285. package/src/components/modules/toolbar/inline.ts +956 -0
  286. package/src/components/modules/tools.ts +589 -0
  287. package/src/components/modules/ui.ts +1179 -0
  288. package/src/components/polyfills.ts +113 -0
  289. package/src/components/selection.ts +1189 -0
  290. package/src/components/tools/base.ts +274 -0
  291. package/src/components/tools/block.ts +291 -0
  292. package/src/components/tools/collection.ts +67 -0
  293. package/src/components/tools/factory.ts +85 -0
  294. package/src/components/tools/inline.ts +71 -0
  295. package/src/components/tools/tune.ts +33 -0
  296. package/src/components/ui/toolbox.ts +497 -0
  297. package/src/components/utils/announcer.ts +205 -0
  298. package/src/components/utils/api.ts +20 -0
  299. package/src/components/utils/bem.ts +26 -0
  300. package/src/components/utils/blocks.ts +284 -0
  301. package/src/components/utils/caret.ts +1067 -0
  302. package/src/components/utils/data-model-transform.ts +382 -0
  303. package/src/components/utils/events.ts +117 -0
  304. package/src/components/utils/keyboard.ts +60 -0
  305. package/src/components/utils/listeners.ts +296 -0
  306. package/src/components/utils/mutations.ts +39 -0
  307. package/src/components/utils/notifier/draw.ts +190 -0
  308. package/src/components/utils/notifier/index.ts +66 -0
  309. package/src/components/utils/notifier/types.ts +1 -0
  310. package/src/components/utils/notifier.ts +77 -0
  311. package/src/components/utils/placeholder.ts +140 -0
  312. package/src/components/utils/popover/components/hint/hint.const.ts +10 -0
  313. package/src/components/utils/popover/components/hint/hint.ts +46 -0
  314. package/src/components/utils/popover/components/hint/index.ts +6 -0
  315. package/src/components/utils/popover/components/popover-header/index.ts +2 -0
  316. package/src/components/utils/popover/components/popover-header/popover-header.const.ts +8 -0
  317. package/src/components/utils/popover/components/popover-header/popover-header.ts +80 -0
  318. package/src/components/utils/popover/components/popover-header/popover-header.types.ts +14 -0
  319. package/src/components/utils/popover/components/popover-item/index.ts +13 -0
  320. package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.const.ts +50 -0
  321. package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.ts +666 -0
  322. package/src/components/utils/popover/components/popover-item/popover-item-html/popover-item-html.const.ts +14 -0
  323. package/src/components/utils/popover/components/popover-item/popover-item-html/popover-item-html.ts +136 -0
  324. package/src/components/utils/popover/components/popover-item/popover-item-separator/popover-item-separator.const.ts +20 -0
  325. package/src/components/utils/popover/components/popover-item/popover-item-separator/popover-item-separator.ts +117 -0
  326. package/src/components/utils/popover/components/popover-item/popover-item.ts +187 -0
  327. package/src/components/utils/popover/components/search-input/index.ts +2 -0
  328. package/src/components/utils/popover/components/search-input/search-input.const.ts +8 -0
  329. package/src/components/utils/popover/components/search-input/search-input.ts +181 -0
  330. package/src/components/utils/popover/components/search-input/search-input.types.ts +30 -0
  331. package/src/components/utils/popover/index.ts +13 -0
  332. package/src/components/utils/popover/popover-abstract.ts +448 -0
  333. package/src/components/utils/popover/popover-desktop.ts +643 -0
  334. package/src/components/utils/popover/popover-inline.ts +338 -0
  335. package/src/components/utils/popover/popover-mobile.ts +201 -0
  336. package/src/components/utils/popover/popover.const.ts +81 -0
  337. package/src/components/utils/popover/utils/popover-states-history.ts +72 -0
  338. package/src/components/utils/promise-queue.ts +43 -0
  339. package/src/components/utils/sanitizer.ts +537 -0
  340. package/src/components/utils/scroll-locker.ts +87 -0
  341. package/src/components/utils/shortcut.ts +231 -0
  342. package/src/components/utils/shortcuts.ts +113 -0
  343. package/src/components/utils/tools.ts +105 -0
  344. package/src/components/utils/tooltip.ts +642 -0
  345. package/src/components/utils/tw.ts +241 -0
  346. package/src/components/utils.ts +1081 -0
  347. package/src/env.d.ts +13 -0
  348. package/src/full.ts +69 -0
  349. package/src/locales.ts +51 -0
  350. package/src/stories/Block.stories.ts +498 -0
  351. package/src/stories/EditorModes.stories.ts +505 -0
  352. package/src/stories/Header.stories.ts +137 -0
  353. package/src/stories/InlineToolbar.stories.ts +498 -0
  354. package/src/stories/List.stories.ts +259 -0
  355. package/src/stories/Notifier.stories.ts +340 -0
  356. package/src/stories/Paragraph.stories.ts +112 -0
  357. package/src/stories/Placeholder.stories.ts +319 -0
  358. package/src/stories/Popover.stories.ts +844 -0
  359. package/src/stories/Selection.stories.ts +250 -0
  360. package/src/stories/StubBlock.stories.ts +156 -0
  361. package/src/stories/Toolbar.stories.ts +223 -0
  362. package/src/stories/Toolbox.stories.ts +166 -0
  363. package/src/stories/Tooltip.stories.ts +198 -0
  364. package/src/stories/helpers.ts +463 -0
  365. package/src/styles/main.css +123 -0
  366. package/src/tools/header/index.ts +570 -0
  367. package/src/tools/index.ts +38 -0
  368. package/src/tools/list/index.ts +1803 -0
  369. package/src/tools/paragraph/index.ts +411 -0
  370. package/src/tools/stub/index.ts +107 -0
  371. package/src/types-internal/blok-modules.d.ts +87 -0
  372. package/src/types-internal/html-janitor.d.ts +28 -0
  373. package/src/types-internal/module-config.d.ts +11 -0
  374. package/src/variants/all-locales.ts +155 -0
  375. package/src/variants/blok-maximum.ts +20 -0
  376. package/src/variants/blok-minimum.ts +243 -0
  377. package/types/api/blocks.d.ts +1 -1
  378. package/types/api/i18n.d.ts +5 -3
  379. package/types/api/selection.d.ts +6 -0
  380. package/types/api/styles.d.ts +23 -10
  381. package/types/configs/blok-config.d.ts +29 -0
  382. package/types/configs/i18n-config.d.ts +52 -2
  383. package/types/configs/i18n-dictionary.d.ts +16 -90
  384. package/types/data-attributes.d.ts +169 -0
  385. package/types/data-formats/output-data.d.ts +15 -0
  386. package/types/full.d.ts +80 -0
  387. package/types/index.d.ts +9 -12
  388. package/types/locales.d.ts +59 -0
  389. package/types/tools/adapters/inline-tool-adapter.d.ts +10 -0
  390. package/types/tools/block-tool.d.ts +9 -0
  391. package/types/tools/header.d.ts +18 -0
  392. package/types/tools/index.d.ts +1 -0
  393. package/types/tools/list.d.ts +91 -0
  394. package/types/tools/paragraph.d.ts +71 -0
  395. package/types/tools/tool-settings.d.ts +16 -2
  396. package/types/tools/tool.d.ts +6 -0
  397. package/types/tools-entry.d.ts +49 -0
  398. package/types/utils/popover/popover-item.d.ts +6 -5
  399. package/dist/blok-B870U2fw.mjs +0 -25803
  400. package/dist/blok.umd.js +0 -181
@@ -0,0 +1,505 @@
1
+ /**
2
+ * EditorModes.stories.ts - Stories for different editor operational modes.
3
+ *
4
+ * This file is the canonical location for:
5
+ * - ReadOnlyMode: Editor in read-only state
6
+ * - EmptyEditor: Editor with no initial content
7
+ * - ToolboxOpenedMode: Editor with toolbox popover open
8
+ * - NarrowMode: Editor in constrained width container
9
+ *
10
+ * Do not duplicate these stories in other files.
11
+ */
12
+ import type { Meta, StoryObj } from '@storybook/html-vite';
13
+ import { waitFor, expect } from 'storybook/test';
14
+ import type { OutputData, API } from '@/types';
15
+ import { createEditorContainer, simulateClick, waitForToolbar, TOOLBAR_TESTID } from './helpers';
16
+ import type { EditorFactoryOptions, EditorContainer } from './helpers';
17
+
18
+ interface EditorModesArgs extends EditorFactoryOptions {
19
+ minHeight: number;
20
+ width: number;
21
+ data: OutputData | undefined;
22
+ readOnly: boolean;
23
+ }
24
+
25
+ // Constants
26
+ const BLOCK_TESTID = '[data-blok-testid="block-wrapper"]';
27
+ const ACTIONS_TESTID = '[data-blok-testid="toolbar-actions"]';
28
+ const PLUS_BUTTON_TESTID = '[data-blok-testid="plus-button"]';
29
+ const TOOLBOX_OPENED_SELECTOR = '[data-blok-toolbox-opened="true"]';
30
+
31
+ const TIMEOUT_INIT = { timeout: 5000 };
32
+ const TIMEOUT_ACTION = { timeout: 5000 };
33
+
34
+ const sampleData: OutputData = {
35
+ time: Date.now(),
36
+ version: '1.0.0',
37
+ blocks: [
38
+ {
39
+ id: 'mode-block-1',
40
+ type: 'paragraph',
41
+ data: { text: 'First paragraph for testing editor modes.' },
42
+ },
43
+ {
44
+ id: 'mode-block-2',
45
+ type: 'paragraph',
46
+ data: { text: 'Second paragraph with more content.' },
47
+ },
48
+ {
49
+ id: 'mode-block-3',
50
+ type: 'paragraph',
51
+ data: { text: 'Third paragraph block.' },
52
+ },
53
+ ],
54
+ };
55
+
56
+ const createEditor = (args: EditorModesArgs): HTMLElement => createEditorContainer(args);
57
+
58
+ const meta: Meta<EditorModesArgs> = {
59
+ title: 'Editor/Modes',
60
+ tags: ['autodocs'],
61
+ args: {
62
+ minHeight: 300,
63
+ width: 0,
64
+ data: sampleData,
65
+ readOnly: false,
66
+ },
67
+ render: createEditor,
68
+ };
69
+
70
+ export default meta;
71
+
72
+
73
+ type Story = StoryObj<EditorModesArgs>;
74
+
75
+ /**
76
+ * Read-only mode - content cannot be edited.
77
+ */
78
+ export const ReadOnlyMode: Story = {
79
+ args: {
80
+ data: sampleData,
81
+ readOnly: true,
82
+ },
83
+ };
84
+
85
+ /**
86
+ * Narrow mode - editor in a constrained width container.
87
+ * Toolbar actions move inside the content area.
88
+ */
89
+ export const NarrowMode: Story = {
90
+ args: {
91
+ data: sampleData,
92
+ readOnly: false,
93
+ width: 400,
94
+ },
95
+ play: async ({ canvasElement, step }) => {
96
+ await step('Wait for editor and toolbar to initialize', async () => {
97
+ await waitFor(
98
+ () => {
99
+ const block = canvasElement.querySelector(BLOCK_TESTID);
100
+
101
+ expect(block).toBeInTheDocument();
102
+ },
103
+ TIMEOUT_INIT
104
+ );
105
+ // Wait for toolbar to be created (happens in requestIdleCallback)
106
+ await waitForToolbar(canvasElement);
107
+ });
108
+
109
+ await step('Click block to show toolbar in narrow mode', async () => {
110
+ const block = canvasElement.querySelector(BLOCK_TESTID);
111
+
112
+ if (block) {
113
+ simulateClick(block);
114
+ }
115
+
116
+ await waitFor(
117
+ () => {
118
+ const toolbar = canvasElement.querySelector(TOOLBAR_TESTID);
119
+
120
+ expect(toolbar).toHaveAttribute('data-blok-opened', 'true');
121
+ },
122
+ TIMEOUT_ACTION
123
+ );
124
+ });
125
+ },
126
+ };
127
+
128
+ /**
129
+ * Empty editor state - no blocks.
130
+ */
131
+ export const EmptyEditor: Story = {
132
+ args: {
133
+ data: undefined,
134
+ readOnly: false,
135
+ },
136
+ };
137
+
138
+ /**
139
+ * Editor with many blocks (scrolling behavior).
140
+ */
141
+ export const ManyBlocks: Story = {
142
+ args: {
143
+ data: {
144
+ time: Date.now(),
145
+ version: '1.0.0',
146
+ blocks: Array.from({ length: 15 }, (_, i) => ({
147
+ id: `many-block-${i + 1}`,
148
+ type: 'paragraph',
149
+ data: { text: `Paragraph block number ${i + 1}. Lorem ipsum dolor sit amet, consectetur adipiscing elit.` },
150
+ })),
151
+ },
152
+ readOnly: false,
153
+ minHeight: 400,
154
+ },
155
+ };
156
+
157
+ /**
158
+ * Editor focused state with toolbar visible.
159
+ */
160
+ export const FocusedWithToolbar: Story = {
161
+ args: {
162
+ data: sampleData,
163
+ readOnly: false,
164
+ },
165
+ play: async ({ canvasElement, step }) => {
166
+ await step('Wait for editor and toolbar to initialize', async () => {
167
+ await waitFor(
168
+ () => {
169
+ const block = canvasElement.querySelector(BLOCK_TESTID);
170
+
171
+ expect(block).toBeInTheDocument();
172
+ },
173
+ TIMEOUT_INIT
174
+ );
175
+ // Wait for toolbar to be created (happens in requestIdleCallback)
176
+ await waitForToolbar(canvasElement);
177
+ });
178
+
179
+ await step('Focus block to show toolbar', async () => {
180
+ const block = canvasElement.querySelector(BLOCK_TESTID);
181
+
182
+ if (block) {
183
+ simulateClick(block);
184
+ }
185
+
186
+ await waitFor(
187
+ () => {
188
+ const toolbar = canvasElement.querySelector(TOOLBAR_TESTID);
189
+
190
+ expect(toolbar).toHaveAttribute('data-blok-opened', 'true');
191
+
192
+ const actionsZone = canvasElement.querySelector(ACTIONS_TESTID);
193
+
194
+ expect(actionsZone).toBeInTheDocument();
195
+ },
196
+ TIMEOUT_ACTION
197
+ );
198
+ });
199
+ },
200
+ };
201
+
202
+ /**
203
+ * Toolbox opened state (special editor class).
204
+ */
205
+ export const ToolboxOpenedMode: Story = {
206
+ args: {
207
+ data: sampleData,
208
+ readOnly: false,
209
+ },
210
+ play: async ({ canvasElement, step }) => {
211
+ await step('Wait for editor and toolbar to initialize', async () => {
212
+ await waitFor(
213
+ () => {
214
+ const block = canvasElement.querySelector(BLOCK_TESTID);
215
+
216
+ expect(block).toBeInTheDocument();
217
+ },
218
+ TIMEOUT_INIT
219
+ );
220
+ // Wait for toolbar to be created (happens in requestIdleCallback)
221
+ await waitForToolbar(canvasElement);
222
+ });
223
+
224
+ await step('Focus block', async () => {
225
+ const block = canvasElement.querySelector(BLOCK_TESTID);
226
+
227
+ if (block) {
228
+ simulateClick(block);
229
+ }
230
+
231
+ await waitFor(
232
+ () => {
233
+ const toolbar = canvasElement.querySelector(TOOLBAR_TESTID);
234
+
235
+ expect(toolbar).toHaveAttribute('data-blok-opened', 'true');
236
+ },
237
+ TIMEOUT_ACTION
238
+ );
239
+ });
240
+
241
+ await step('Open toolbox', async () => {
242
+ const plusButton = canvasElement.querySelector(PLUS_BUTTON_TESTID);
243
+
244
+ if (plusButton) {
245
+ simulateClick(plusButton);
246
+ }
247
+
248
+ await waitFor(
249
+ () => {
250
+ const editor = canvasElement.querySelector(TOOLBOX_OPENED_SELECTOR);
251
+
252
+ expect(editor).toBeInTheDocument();
253
+ },
254
+ TIMEOUT_ACTION
255
+ );
256
+ });
257
+ },
258
+ };
259
+
260
+ /**
261
+ * Compact narrow editor (mobile-like).
262
+ */
263
+ export const CompactNarrow: Story = {
264
+ args: {
265
+ data: sampleData,
266
+ readOnly: false,
267
+ width: 320,
268
+ minHeight: 200,
269
+ },
270
+ };
271
+
272
+ /**
273
+ * RTL (Right-to-Left) mode for languages like Arabic and Hebrew.
274
+ * Text direction and toolbar positioning are mirrored.
275
+ */
276
+ export const RTLMode: Story = {
277
+ args: {
278
+ data: {
279
+ time: Date.now(),
280
+ version: '1.0.0',
281
+ blocks: [
282
+ {
283
+ id: 'rtl-block-1',
284
+ type: 'paragraph',
285
+ data: { text: 'هذا نص باللغة العربية لاختبار وضع RTL.' },
286
+ },
287
+ {
288
+ id: 'rtl-block-2',
289
+ type: 'paragraph',
290
+ data: { text: 'النص يتدفق من اليمين إلى اليسار.' },
291
+ },
292
+ {
293
+ id: 'rtl-block-3',
294
+ type: 'paragraph',
295
+ data: { text: 'شريط الأدوات والعناصر التحكم معكوسة.' },
296
+ },
297
+ ],
298
+ },
299
+ readOnly: false,
300
+ i18n: {
301
+ direction: 'rtl',
302
+ },
303
+ },
304
+ play: async ({ canvasElement, step }) => {
305
+ await step('Verify RTL direction is applied', async () => {
306
+ await waitFor(
307
+ () => {
308
+ const rtlEditor = canvasElement.querySelector('[data-blok-testid="blok-editor"][data-blok-rtl="true"]');
309
+
310
+ expect(rtlEditor).toBeTruthy();
311
+ },
312
+ TIMEOUT_INIT
313
+ );
314
+ });
315
+
316
+ await step('Show toolbar in RTL mode', async () => {
317
+ await waitForToolbar(canvasElement);
318
+
319
+ const block = canvasElement.querySelector(BLOCK_TESTID);
320
+
321
+ if (block) {
322
+ simulateClick(block);
323
+ }
324
+
325
+ await waitFor(
326
+ () => {
327
+ const toolbar = canvasElement.querySelector(TOOLBAR_TESTID);
328
+
329
+ expect(toolbar).toHaveAttribute('data-blok-opened', 'true');
330
+ },
331
+ TIMEOUT_ACTION
332
+ );
333
+ });
334
+ },
335
+ };
336
+
337
+ /**
338
+ * Dragging state - visual feedback when a block is being dragged.
339
+ * Shows grabbing cursor across the editor and demonstrates block reordering.
340
+ */
341
+ export const DraggingState: Story = {
342
+ args: {
343
+ data: sampleData,
344
+ readOnly: false,
345
+ },
346
+ play: async ({ canvasElement, step }) => {
347
+ const container = canvasElement.querySelector('[data-story-container]') as EditorContainer | null;
348
+
349
+ await step('Wait for editor and toolbar to initialize', async () => {
350
+ await waitFor(
351
+ () => {
352
+ const blocks = canvasElement.querySelectorAll(BLOCK_TESTID);
353
+
354
+ expect(blocks.length).toBeGreaterThanOrEqual(3);
355
+ // Also wait for editor instance to be available
356
+ expect(container?.__blokEditor).toBeTruthy();
357
+ },
358
+ TIMEOUT_INIT
359
+ );
360
+ await waitForToolbar(canvasElement);
361
+ });
362
+
363
+ await step('Focus block to show toolbar with drag handle', async () => {
364
+ const blocks = canvasElement.querySelectorAll(BLOCK_TESTID);
365
+ const firstBlock = blocks[0];
366
+
367
+ if (firstBlock) {
368
+ simulateClick(firstBlock);
369
+ }
370
+
371
+ await waitFor(
372
+ () => {
373
+ const toolbar = canvasElement.querySelector(TOOLBAR_TESTID);
374
+
375
+ expect(toolbar).toHaveAttribute('data-blok-opened', 'true');
376
+ },
377
+ TIMEOUT_ACTION
378
+ );
379
+ });
380
+
381
+ await step('Add dragging state to show visual dragging state', async () => {
382
+ const editorWrapper = canvasElement.querySelector('[data-blok-testid="blok-editor"]');
383
+
384
+ if (editorWrapper) {
385
+ editorWrapper.setAttribute('data-blok-dragging', 'true');
386
+ }
387
+
388
+ await waitFor(
389
+ () => {
390
+ const draggingEditor = canvasElement.querySelector('[data-blok-testid="blok-editor"][data-blok-dragging="true"]');
391
+
392
+ expect(draggingEditor).toBeTruthy();
393
+ },
394
+ TIMEOUT_ACTION
395
+ );
396
+ });
397
+
398
+ await step('Move first block to third position using editor API', async () => {
399
+ const editor = container?.__blokEditor;
400
+
401
+ if (editor) {
402
+ // Move block from index 0 to index 2 (after the current third block)
403
+ // Cast to access the dynamically added blocks API
404
+ (editor as unknown as { blocks: API['blocks'] }).blocks.move(2, 0);
405
+ }
406
+
407
+ // Wait a moment for the DOM to update
408
+ await new Promise(resolve => setTimeout(resolve, 300));
409
+
410
+ // Verify the blocks have been reordered
411
+ await waitFor(
412
+ () => {
413
+ const blocks = canvasElement.querySelectorAll(BLOCK_TESTID);
414
+ // First block should now contain "Second paragraph" text
415
+ const firstBlockText = blocks[0]?.textContent ?? '';
416
+
417
+ expect(firstBlockText).toContain('Second');
418
+ },
419
+ TIMEOUT_ACTION
420
+ );
421
+ });
422
+
423
+ await step('Remove dragging state after move completes', async () => {
424
+ // Keep dragging state visible for a moment to show the state
425
+ await new Promise(resolve => setTimeout(resolve, 500));
426
+
427
+ const editorWrapper = canvasElement.querySelector('[data-blok-testid="blok-editor"]');
428
+
429
+ if (editorWrapper) {
430
+ editorWrapper.removeAttribute('data-blok-dragging');
431
+ }
432
+ });
433
+ },
434
+ };
435
+
436
+ /**
437
+ * Rectangle selection overlay - visual feedback when selecting multiple blocks with mouse drag.
438
+ */
439
+ export const RectangleSelection: Story = {
440
+ args: {
441
+ data: sampleData,
442
+ readOnly: false,
443
+ },
444
+ play: async ({ canvasElement, step }) => {
445
+ await step('Wait for editor to initialize', async () => {
446
+ await waitFor(
447
+ () => {
448
+ const blocks = canvasElement.querySelectorAll(BLOCK_TESTID);
449
+
450
+ expect(blocks.length).toBeGreaterThan(0);
451
+ },
452
+ TIMEOUT_INIT
453
+ );
454
+ });
455
+
456
+ await step('Create and show rectangle selection overlay', async () => {
457
+ // Create the overlay structure manually for visual demonstration
458
+ const editorWrapper = canvasElement.querySelector('[data-blok-testid="blok-editor"]');
459
+
460
+ if (editorWrapper) {
461
+ const overlay = document.createElement('div');
462
+
463
+ overlay.setAttribute('data-blok-overlay', '');
464
+ overlay.style.position = 'absolute';
465
+ overlay.style.inset = '0';
466
+ overlay.style.pointerEvents = 'none';
467
+ overlay.style.overflow = 'hidden';
468
+ overlay.setAttribute('data-blok-testid', 'selection-overlay');
469
+
470
+ const overlayContainer = document.createElement('div');
471
+
472
+ overlayContainer.setAttribute('data-blok-overlay-container', '');
473
+ overlayContainer.style.position = 'relative';
474
+ overlayContainer.style.width = '100%';
475
+ overlayContainer.style.height = '100%';
476
+
477
+ const rectangle = document.createElement('div');
478
+
479
+ rectangle.setAttribute('data-blok-overlay-rectangle', '');
480
+ rectangle.setAttribute('data-blok-testid', 'selection-rectangle');
481
+ rectangle.style.position = 'absolute';
482
+ rectangle.style.top = '50px';
483
+ rectangle.style.left = '20px';
484
+ rectangle.style.width = '200px';
485
+ rectangle.style.height = '100px';
486
+ rectangle.style.backgroundColor = 'rgba(46, 170, 220, 0.2)';
487
+ rectangle.style.border = '1px solid rgba(46, 170, 220, 0.5)';
488
+ rectangle.style.pointerEvents = 'none';
489
+
490
+ overlayContainer.appendChild(rectangle);
491
+ overlay.appendChild(overlayContainer);
492
+ editorWrapper.appendChild(overlay);
493
+ }
494
+
495
+ await waitFor(
496
+ () => {
497
+ const rectangleOverlay = canvasElement.querySelector('[data-blok-testid="selection-rectangle"]');
498
+
499
+ expect(rectangleOverlay).toBeInTheDocument();
500
+ },
501
+ TIMEOUT_ACTION
502
+ );
503
+ });
504
+ },
505
+ };
@@ -0,0 +1,137 @@
1
+ import type { Meta, StoryObj } from '@storybook/html-vite';
2
+ import type { OutputData } from '@/types';
3
+ import { createEditorContainer } from './helpers';
4
+ import type { EditorFactoryOptions } from './helpers';
5
+ import { Header, type HeaderConfig } from '../tools/header';
6
+
7
+ interface HeaderArgs extends EditorFactoryOptions {
8
+ minHeight: number;
9
+ data: OutputData | undefined;
10
+ }
11
+
12
+ /**
13
+ * Creates sample data with a header block at level 2 (default)
14
+ */
15
+ const createHeaderData = (id: string): OutputData => ({
16
+ time: Date.now(),
17
+ version: '1.0.0',
18
+ blocks: [
19
+ {
20
+ id,
21
+ type: 'header',
22
+ data: { text: 'Sample Header Text', level: 2 },
23
+ },
24
+ ],
25
+ });
26
+
27
+ const createEditor = (args: HeaderArgs): HTMLElement => createEditorContainer({
28
+ ...args,
29
+ tools: {
30
+ header: Header,
31
+ },
32
+ });
33
+
34
+ const meta: Meta<HeaderArgs> = {
35
+ title: 'Components/Header',
36
+ tags: ['autodocs'],
37
+ args: {
38
+ minHeight: 300,
39
+ data: createHeaderData('header-default'),
40
+ },
41
+ render: createEditor,
42
+ };
43
+
44
+ export default meta;
45
+
46
+
47
+ type Story = StoryObj<HeaderArgs>;
48
+
49
+
50
+
51
+
52
+ /**
53
+ * Creates sample data with all header levels (H1-H6)
54
+ */
55
+ const createAllHeaderLevelsData = (): OutputData => ({
56
+ time: Date.now(),
57
+ version: '1.0.0',
58
+ blocks: [
59
+ { id: 'header-h1', type: 'header', data: { text: 'Heading 1', level: 1 } },
60
+ { id: 'header-h2', type: 'header', data: { text: 'Heading 2', level: 2 } },
61
+ { id: 'header-h3', type: 'header', data: { text: 'Heading 3', level: 3 } },
62
+ { id: 'header-h4', type: 'header', data: { text: 'Heading 4', level: 4 } },
63
+ { id: 'header-h5', type: 'header', data: { text: 'Heading 5', level: 5 } },
64
+ { id: 'header-h6', type: 'header', data: { text: 'Heading 6', level: 6 } },
65
+ ],
66
+ });
67
+
68
+ /**
69
+ * Default header state (H2).
70
+ */
71
+ export const Default: Story = {
72
+ args: {
73
+ data: createHeaderData('header-default'),
74
+ },
75
+ };
76
+
77
+ /**
78
+ * All header levels (H1-H6) displayed together.
79
+ * Shows all 6 heading levels at their default styles.
80
+ */
81
+ export const AllLevels: Story = {
82
+ args: {
83
+ minHeight: 500,
84
+ data: createAllHeaderLevelsData(),
85
+ },
86
+ };
87
+
88
+ /**
89
+ time: Date.now(),
90
+ version: '1.0.0',
91
+ blocks: [
92
+ { id: 'header-h1', type: 'header', data: { text: 'Heading 1', level: 1 } },
93
+ { id: 'header-h2', type: 'header', data: { text: 'Heading 2', level: 2 } },
94
+ { id: 'header-h3', type: 'header', data: { text: 'Heading 3', level: 3 } },
95
+ { id: 'header-h4', type: 'header', data: { text: 'Heading 4', level: 4 } },
96
+ { id: 'header-h5', type: 'header', data: { text: 'Heading 5', level: 5 } },
97
+ { id: 'header-h6', type: 'header', data: { text: 'Heading 6', level: 6 } },
98
+ ],
99
+ });
100
+
101
+ /**
102
+ * Custom header level overrides configuration with different font-sizes and margins.
103
+ */
104
+ const customHeaderConfig: HeaderConfig = {
105
+ levelOverrides: {
106
+ 1: { size: '100px', marginTop: '32px', marginBottom: '12px' },
107
+ 2: { size: '90px', marginTop: '35px', marginBottom: '20px' },
108
+ 3: { size: '80px', marginTop: '40px', marginBottom: '12px' },
109
+ 4: { size: '70px', marginTop: '30px', marginBottom: '10px' },
110
+ 5: { size: '60px', marginTop: '20px', marginBottom: '8px' },
111
+ 6: { size: '50px', marginTop: '10px', marginBottom: '6px' },
112
+ },
113
+ };
114
+
115
+ /**
116
+ * Creates an editor with custom header configuration.
117
+ */
118
+ const createCustomHeaderEditor = (args: HeaderArgs): HTMLElement => createEditorContainer({
119
+ ...args,
120
+ tools: {
121
+ header: {
122
+ class: Header,
123
+ config: customHeaderConfig,
124
+ },
125
+ },
126
+ });
127
+
128
+ /**
129
+ * All header levels with custom font-sizes and margins configured via levelOverrides.
130
+ */
131
+ export const AllLevelsCustomStyles: Story = {
132
+ args: {
133
+ minHeight: 600,
134
+ data: createAllHeaderLevelsData(),
135
+ },
136
+ render: createCustomHeaderEditor,
137
+ };