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

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 (402) 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-oNSQ3HA6.mjs +13217 -0
  7. package/dist/chunks/i18next-CugVlwWp.mjs +1292 -0
  8. package/dist/chunks/i18next-loader-BdNRw4n4.mjs +43 -0
  9. package/dist/{index-CEXLTV6f.mjs → chunks/index-DHgXmfki.mjs} +2 -2
  10. package/dist/chunks/inline-tool-convert-CRqgjRim.mjs +1989 -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 +3117 -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 +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 +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 +781 -0
  284. package/src/components/modules/toolbar/index.ts +1315 -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 +601 -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 +186 -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 +676 -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 +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 +646 -0
  367. package/src/tools/index.ts +45 -0
  368. package/src/tools/list/index.ts +1819 -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/data-attributes.d.ts +170 -0
  386. package/types/data-formats/output-data.d.ts +15 -0
  387. package/types/full.d.ts +80 -0
  388. package/types/index.d.ts +29 -13
  389. package/types/locales.d.ts +59 -0
  390. package/types/tools/adapters/inline-tool-adapter.d.ts +10 -0
  391. package/types/tools/block-tool.d.ts +9 -0
  392. package/types/tools/header.d.ts +18 -0
  393. package/types/tools/index.d.ts +1 -0
  394. package/types/tools/list.d.ts +91 -0
  395. package/types/tools/paragraph.d.ts +71 -0
  396. package/types/tools/tool-settings.d.ts +92 -6
  397. package/types/tools/tool.d.ts +6 -0
  398. package/types/tools-entry.d.ts +49 -0
  399. package/types/utils/popover/popover-item.d.ts +18 -5
  400. package/types/utils/popover/popover.d.ts +7 -0
  401. package/dist/blok-C8XbyLHh.mjs +0 -25795
  402. package/dist/blok.umd.js +0 -181
@@ -0,0 +1,646 @@
1
+ /**
2
+ * Header Tool for the Blok Editor
3
+ * Provides Headings Blocks (H1-H6)
4
+ *
5
+ * Based on @editorjs/header by CodeX
6
+ * @license MIT
7
+ */
8
+ import { IconH1, IconH2, IconH3, IconH4, IconH5, IconH6, IconHeading } from '../../components/icons';
9
+ import { twMerge } from '../../components/utils/tw';
10
+ import { DATA_ATTR } from '../../components/constants';
11
+ import { PLACEHOLDER_CLASSES, setupPlaceholder } from '../../components/utils/placeholder';
12
+ import { translateToolTitle } from '../../components/utils/tools';
13
+ import type {
14
+ API,
15
+ BlockTool,
16
+ BlockToolConstructorOptions,
17
+ BlockToolData,
18
+ PasteEvent,
19
+ ToolboxConfig,
20
+ ToolboxConfigEntry,
21
+ ConversionConfig,
22
+ SanitizerConfig,
23
+ PasteConfig,
24
+ } from '../../../types';
25
+ import type { MenuConfig } from '../../../types/tools/menu-config';
26
+
27
+ /**
28
+ * Tool's input and output data format
29
+ */
30
+ export interface HeaderData extends BlockToolData {
31
+ /** Header's content */
32
+ text: string;
33
+ /** Header's level from 1 to 6 */
34
+ level: number;
35
+ }
36
+
37
+ /**
38
+ * Level-specific overrides for customization
39
+ */
40
+ export interface HeaderLevelConfig {
41
+ /** Custom HTML tag to use (e.g., 'div', 'p', 'span') */
42
+ tag?: string;
43
+ /** Custom display name for this level */
44
+ name?: string;
45
+ /** Custom font size (e.g., '3em', '24px') */
46
+ size?: string;
47
+ /** Custom margin top (e.g., '20px', '1rem') */
48
+ marginTop?: string;
49
+ /** Custom margin bottom (e.g., '10px', '0.5rem') */
50
+ marginBottom?: string;
51
+ }
52
+
53
+ /**
54
+ * Tool's config from Editor
55
+ */
56
+ export interface HeaderConfig {
57
+ /** Block's placeholder */
58
+ placeholder?: string;
59
+ /** Heading levels */
60
+ levels?: number[];
61
+ /** Default level */
62
+ defaultLevel?: number;
63
+ /** Level-specific overrides keyed by level number (1-6) */
64
+ levelOverrides?: Record<number, HeaderLevelConfig>;
65
+ /** Custom shortcuts per level. If undefined, uses default markdown (#, ##, etc). If empty {}, disables all shortcuts. */
66
+ shortcuts?: Record<number, string>;
67
+ /**
68
+ * @internal Injected by BlockToolAdapter - merged toolbox entries.
69
+ * When present, renderSettings() will use these entries instead of the default levels.
70
+ */
71
+ _toolboxEntries?: ToolboxConfigEntry[];
72
+ }
73
+
74
+ /**
75
+ * Heading level information
76
+ */
77
+ interface Level {
78
+ /** Level number */
79
+ number: number;
80
+ /** HTML tag corresponding with level number */
81
+ tag: string;
82
+ /** Translation key for this level (e.g., 'tools.header.heading1') */
83
+ nameKey: string;
84
+ /** Display name for this level (user override or fallback) */
85
+ name: string;
86
+ /** Icon */
87
+ icon: string;
88
+ /** Tailwind classes for styling */
89
+ styles: string;
90
+ /** Inline styles for custom overrides */
91
+ inlineStyles: Partial<CSSStyleDeclaration>;
92
+ }
93
+
94
+ /**
95
+ * Header block for the Blok Editor.
96
+ *
97
+ * @author CodeX (team@ifmo.su)
98
+ * @copyright CodeX 2018
99
+ * @license MIT
100
+ * @version 2.0.0
101
+ */
102
+ export class Header implements BlockTool {
103
+ /**
104
+ * Editor API
105
+ */
106
+ private api: API;
107
+
108
+ /**
109
+ * Read-only mode flag
110
+ */
111
+ private readOnly: boolean;
112
+
113
+ /**
114
+ * Tool's settings passed from Editor
115
+ */
116
+ private _settings: HeaderConfig;
117
+
118
+ /**
119
+ * Block's data
120
+ */
121
+ private _data: HeaderData;
122
+
123
+ /**
124
+ * Main Block wrapper
125
+ */
126
+ private _element: HTMLHeadingElement;
127
+
128
+ /**
129
+ * Render plugin's main Element and fill it with saved data
130
+ *
131
+ * @param options - constructor options
132
+ * @param options.data - previously saved data
133
+ * @param options.config - user config for Tool
134
+ * @param options.api - Editor API
135
+ * @param options.readOnly - read only mode flag
136
+ */
137
+ constructor({ data, config, api, readOnly }: BlockToolConstructorOptions<HeaderData, HeaderConfig>) {
138
+ this.api = api;
139
+ this.readOnly = readOnly;
140
+
141
+ this._settings = config || {};
142
+ this._data = this.normalizeData(data);
143
+ this._element = this.getTag();
144
+ }
145
+
146
+ /**
147
+ * Base styles for all header levels
148
+ */
149
+ private static readonly BASE_STYLES = 'py-[3px] px-[2px] m-0 !leading-[1.3] outline-none [&_p]:!p-0 [&_p]:!m-0 [&_div]:!p-0 [&_div]:!m-0';
150
+
151
+ /**
152
+ * Styles
153
+ * @deprecated Use data-blok-tool attribute instead (DATA_ATTR.tool)
154
+ */
155
+ private get _CSS(): { block: string; wrapper: string } {
156
+ return {
157
+ block: this.api.styles.block,
158
+ wrapper: '',
159
+ };
160
+ }
161
+
162
+ /**
163
+ * Check if data is valid HeaderData
164
+ *
165
+ * @param data - data to check
166
+ * @returns true if data is HeaderData
167
+ */
168
+ private isHeaderData(data: unknown): data is HeaderData {
169
+ return typeof data === 'object' && data !== null && 'text' in data;
170
+ }
171
+
172
+ /**
173
+ * Normalize input data
174
+ *
175
+ * @param data - saved data to process
176
+ * @returns normalized HeaderData
177
+ */
178
+ private normalizeData(data: HeaderData | Record<string, never>): HeaderData {
179
+ if (!this.isHeaderData(data)) {
180
+ return { text: '', level: this.defaultLevel.number };
181
+ }
182
+
183
+ const parsedLevel = parseInt(String(data.level));
184
+ const isValidLevel = data.level !== undefined && !isNaN(parsedLevel);
185
+
186
+ return {
187
+ text: data.text || '',
188
+ level: isValidLevel ? parsedLevel : this.defaultLevel.number,
189
+ };
190
+ }
191
+
192
+ /**
193
+ * Return Tool's view
194
+ *
195
+ * @returns HTMLHeadingElement
196
+ */
197
+ public render(): HTMLHeadingElement {
198
+ return this._element;
199
+ }
200
+
201
+ /**
202
+ * Returns header block tunes config
203
+ *
204
+ * @returns MenuConfig array
205
+ */
206
+ public renderSettings(): MenuConfig {
207
+ const toolboxEntries = this._settings._toolboxEntries;
208
+
209
+ /**
210
+ * If user provided custom toolbox entries, use them to build settings menu.
211
+ * This ensures block settings match the toolbox configuration.
212
+ * Entries without explicit level data will default to the configured defaultLevel.
213
+ *
214
+ * Only fall back to levels config when _toolboxEntries is not provided or empty,
215
+ * or when using the default single "Heading" toolbox entry (detected by having
216
+ * exactly one entry with no level data and no custom title or the default "Heading" title).
217
+ */
218
+ const isDefaultToolboxEntry = toolboxEntries?.length === 1 &&
219
+ toolboxEntries[0].data === undefined &&
220
+ (toolboxEntries[0].title === undefined || toolboxEntries[0].title === 'Heading');
221
+
222
+ if (toolboxEntries !== undefined && toolboxEntries.length > 0 && !isDefaultToolboxEntry) {
223
+ return this.buildSettingsFromToolboxEntries(toolboxEntries);
224
+ }
225
+
226
+ /**
227
+ * Fall back to existing behavior using levels config
228
+ */
229
+ return this.levels.map(level => {
230
+ const translated = this.api.i18n.t(level.nameKey);
231
+ const title = translated !== level.nameKey ? translated : level.name;
232
+
233
+ return {
234
+ icon: level.icon,
235
+ title,
236
+ onActivate: (): void => this.setLevel(level.number),
237
+ closeOnActivate: true,
238
+ isActive: this.currentLevel.number === level.number,
239
+ dataset: {
240
+ 'blok-header-level': String(level.number),
241
+ },
242
+ };
243
+ });
244
+ }
245
+
246
+ /**
247
+ * Build settings menu items from toolbox entries.
248
+ * This allows users to customize which levels appear in block settings
249
+ * by configuring the toolbox.
250
+ *
251
+ * @param entries - Merged toolbox entries from user config
252
+ * @returns MenuConfig array
253
+ */
254
+ private buildSettingsFromToolboxEntries(entries: ToolboxConfigEntry[]): MenuConfig {
255
+ return entries.map(entry => {
256
+ const entryData = entry.data as { level?: number } | undefined;
257
+ const level = entryData?.level ?? this.defaultLevel.number;
258
+ const defaultLevel = Header.DEFAULT_LEVELS.find(l => l.number === level);
259
+ const fallbackTitle = defaultLevel?.name ?? `Heading ${level}`;
260
+
261
+ const title = this.resolveToolboxEntryTitle(entry, fallbackTitle);
262
+ const icon = entry.icon ?? defaultLevel?.icon ?? IconHeading;
263
+
264
+ return {
265
+ icon,
266
+ title,
267
+ onActivate: (): void => this.setLevel(level),
268
+ closeOnActivate: true,
269
+ isActive: this.currentLevel.number === level,
270
+ dataset: {
271
+ 'blok-header-level': String(level),
272
+ },
273
+ };
274
+ });
275
+ }
276
+
277
+ /**
278
+ * Resolves the title for a toolbox entry using the shared translation utility.
279
+ *
280
+ * @param entry - Toolbox entry
281
+ * @param fallback - Fallback title if no custom title or translation found
282
+ * @returns Resolved title string
283
+ */
284
+ private resolveToolboxEntryTitle(entry: ToolboxConfigEntry, fallback: string): string {
285
+ return translateToolTitle(this.api.i18n, entry, fallback);
286
+ }
287
+
288
+ /**
289
+ * Callback for Block's settings buttons
290
+ *
291
+ * @param level - level to set
292
+ */
293
+ private setLevel(level: number): void {
294
+ this.data = {
295
+ level: level,
296
+ text: this.data.text,
297
+ };
298
+ }
299
+
300
+ /**
301
+ * Method that specified how to merge two Text blocks.
302
+ * Called by Editor by backspace at the beginning of the Block
303
+ *
304
+ * @param data - saved data to merge with current block
305
+ */
306
+ public merge(data: HeaderData): void {
307
+ this._element.insertAdjacentHTML('beforeend', data.text);
308
+ }
309
+
310
+ /**
311
+ * Validate Text block data:
312
+ * - check for emptiness
313
+ *
314
+ * @param blockData - data received after saving
315
+ * @returns false if saved data is not correct, otherwise true
316
+ */
317
+ public validate(blockData: HeaderData): boolean {
318
+ return blockData.text.trim() !== '';
319
+ }
320
+
321
+ /**
322
+ * Extract Tool's data from the view
323
+ *
324
+ * @param toolsContent - Text tools rendered view
325
+ * @returns saved data
326
+ */
327
+ public save(toolsContent: HTMLHeadingElement): HeaderData {
328
+ return {
329
+ text: toolsContent.innerHTML,
330
+ level: this.currentLevel.number,
331
+ };
332
+ }
333
+
334
+ /**
335
+ * Allow Header to be converted to/from other blocks
336
+ */
337
+ public static get conversionConfig(): ConversionConfig {
338
+ return {
339
+ export: 'text', // use 'text' property for other blocks
340
+ import: 'text', // fill 'text' property from other block's export string
341
+ };
342
+ }
343
+
344
+ /**
345
+ * Sanitizer Rules
346
+ */
347
+ public static get sanitize(): SanitizerConfig {
348
+ return {
349
+ level: false,
350
+ text: {},
351
+ };
352
+ }
353
+
354
+ /**
355
+ * Returns true to notify core that read-only is supported
356
+ *
357
+ * @returns true
358
+ */
359
+ public static get isReadOnlySupported(): boolean {
360
+ return true;
361
+ }
362
+
363
+ /**
364
+ * Get current Tool's data
365
+ *
366
+ * @returns Current data
367
+ */
368
+ public get data(): HeaderData {
369
+ this._data.text = this._element.innerHTML;
370
+ this._data.level = this.currentLevel.number;
371
+
372
+ return this._data;
373
+ }
374
+
375
+ /**
376
+ * Store data in plugin:
377
+ * - at the this._data property
378
+ * - at the HTML
379
+ *
380
+ * @param data - data to set
381
+ */
382
+ public set data(data: HeaderData) {
383
+ this._data = this.normalizeData(data);
384
+
385
+ /**
386
+ * If level is set and block in DOM
387
+ * then replace it to a new block
388
+ */
389
+ if (data.level !== undefined && this._element.parentNode) {
390
+ /**
391
+ * Create a new tag
392
+ */
393
+ const newHeader = this.getTag();
394
+
395
+ /**
396
+ * Save Block's content
397
+ */
398
+ newHeader.innerHTML = this._element.innerHTML;
399
+
400
+ /**
401
+ * Replace blocks
402
+ */
403
+ this._element.parentNode.replaceChild(newHeader, this._element);
404
+
405
+ /**
406
+ * Save new block to private variable
407
+ */
408
+ this._element = newHeader;
409
+ }
410
+
411
+ /**
412
+ * If data.text was passed then update block's content
413
+ */
414
+ if (data.text !== undefined) {
415
+ this._element.innerHTML = this._data.text || '';
416
+ }
417
+ }
418
+
419
+ /**
420
+ * Get tag for target level
421
+ * By default returns second-leveled header
422
+ *
423
+ * @returns HTMLHeadingElement
424
+ */
425
+ private getTag(): HTMLHeadingElement {
426
+ /**
427
+ * Create element for current Block's level
428
+ */
429
+ const tag = document.createElement(this.currentLevel.tag) as HTMLHeadingElement;
430
+
431
+ /**
432
+ * Add text to block
433
+ */
434
+ tag.innerHTML = this._data.text || '';
435
+
436
+ /**
437
+ * Add styles class using twMerge to combine base and level-specific styles
438
+ */
439
+ tag.className = twMerge(Header.BASE_STYLES, this.currentLevel.styles, PLACEHOLDER_CLASSES);
440
+
441
+ /**
442
+ * Apply inline styles for custom overrides (dynamic values from config)
443
+ */
444
+ const { inlineStyles } = this.currentLevel;
445
+
446
+ if (inlineStyles) {
447
+ Object.assign(tag.style, inlineStyles);
448
+ }
449
+
450
+ /**
451
+ * Set data attribute for tool identification
452
+ */
453
+ tag.setAttribute(DATA_ATTR.tool, 'header');
454
+
455
+ /**
456
+ * Make tag editable
457
+ */
458
+ tag.contentEditable = this.readOnly ? 'false' : 'true';
459
+
460
+ /**
461
+ * Add Placeholder with caret positioning support
462
+ */
463
+ if (!this.readOnly) {
464
+ setupPlaceholder(tag, this.api.i18n.t(this._settings.placeholder || ''));
465
+ } else {
466
+ tag.setAttribute('data-placeholder', this.api.i18n.t(this._settings.placeholder || ''));
467
+ }
468
+
469
+ return tag;
470
+ }
471
+
472
+ /**
473
+ * Get current level
474
+ *
475
+ * @returns Level object
476
+ */
477
+ private get currentLevel(): Level {
478
+ const level = this.levels.find(levelItem => levelItem.number === this._data.level);
479
+
480
+ return level ?? this.defaultLevel;
481
+ }
482
+
483
+ /**
484
+ * Return default level
485
+ *
486
+ * @returns Level object
487
+ */
488
+ private get defaultLevel(): Level {
489
+ /**
490
+ * User can specify own default level value
491
+ */
492
+ if (!this._settings.defaultLevel) {
493
+ /**
494
+ * With no additional options, there will be H2 by default
495
+ */
496
+ return this.levels[1];
497
+ }
498
+
499
+ const userSpecified = this.levels.find(levelItem => {
500
+ return levelItem.number === this._settings.defaultLevel;
501
+ });
502
+
503
+ if (userSpecified) {
504
+ return userSpecified;
505
+ }
506
+
507
+ console.warn('(ง\'̀-\'́)ง Heading Tool: the default level specified was not found in available levels');
508
+
509
+ return this.levels[1];
510
+ }
511
+
512
+ /**
513
+ * Default level configurations using Tailwind CSS classes
514
+ */
515
+ private static readonly DEFAULT_LEVELS: Array<{
516
+ number: number;
517
+ tag: string;
518
+ nameKey: string;
519
+ name: string;
520
+ icon: string;
521
+ styles: string;
522
+ }> = [
523
+ { number: 1, tag: 'H1', nameKey: 'tools.header.heading1', name: 'Heading 1', icon: IconH1, styles: 'text-4xl font-bold mt-8 mb-1' },
524
+ { number: 2, tag: 'H2', nameKey: 'tools.header.heading2', name: 'Heading 2', icon: IconH2, styles: 'text-3xl font-semibold mt-6 mb-px' },
525
+ { number: 3, tag: 'H3', nameKey: 'tools.header.heading3', name: 'Heading 3', icon: IconH3, styles: 'text-2xl font-semibold mt-4 mb-px' },
526
+ { number: 4, tag: 'H4', nameKey: 'tools.header.heading4', name: 'Heading 4', icon: IconH4, styles: 'text-xl font-semibold mt-3 mb-px' },
527
+ { number: 5, tag: 'H5', nameKey: 'tools.header.heading5', name: 'Heading 5', icon: IconH5, styles: 'text-base font-semibold mt-3 mb-px' },
528
+ { number: 6, tag: 'H6', nameKey: 'tools.header.heading6', name: 'Heading 6', icon: IconH6, styles: 'text-sm font-semibold mt-3 mb-px' },
529
+ ];
530
+
531
+ /**
532
+ * Available header levels
533
+ *
534
+ * @returns Level array
535
+ */
536
+ private get levels(): Level[] {
537
+ const overrides = this._settings.levelOverrides || {};
538
+
539
+ const availableLevels: Level[] = Header.DEFAULT_LEVELS.map(defaultLevel => {
540
+ const override = overrides[defaultLevel.number] || {};
541
+
542
+ // Build inline styles for custom overrides (dynamic values don't work with Tailwind)
543
+ const inlineStyles: Partial<CSSStyleDeclaration> = {};
544
+
545
+ if (override.size) {
546
+ inlineStyles.fontSize = override.size;
547
+ }
548
+ if (override.marginTop) {
549
+ inlineStyles.marginTop = override.marginTop;
550
+ }
551
+ if (override.marginBottom) {
552
+ inlineStyles.marginBottom = override.marginBottom;
553
+ }
554
+
555
+ return {
556
+ number: defaultLevel.number,
557
+ tag: override.tag?.toUpperCase() || defaultLevel.tag,
558
+ nameKey: defaultLevel.nameKey,
559
+ name: override.name || defaultLevel.name,
560
+ icon: defaultLevel.icon,
561
+ styles: defaultLevel.styles,
562
+ inlineStyles,
563
+ };
564
+ });
565
+
566
+ return this._settings.levels
567
+ ? availableLevels.filter(l => this._settings.levels!.includes(l.number))
568
+ : availableLevels;
569
+ }
570
+
571
+ /**
572
+ * Handle H1-H6 tags on paste to substitute it with header Tool
573
+ *
574
+ * @param event - event with pasted content
575
+ */
576
+ public onPaste(event: PasteEvent): void {
577
+ const detail = event.detail;
578
+
579
+ if (!('data' in detail)) {
580
+ return;
581
+ }
582
+
583
+ const content = detail.data as HTMLElement;
584
+
585
+ /**
586
+ * Map tag names to level numbers
587
+ */
588
+ const tagToLevel: Record<string, number> = {
589
+ H1: 1,
590
+ H2: 2,
591
+ H3: 3,
592
+ H4: 4,
593
+ H5: 5,
594
+ H6: 6,
595
+ };
596
+
597
+ /**
598
+ * Define default level value
599
+ */
600
+ const parsedLevel = tagToLevel[content.tagName] ?? this.defaultLevel.number;
601
+
602
+ /**
603
+ * If levels are restricted, find the nearest allowed level
604
+ */
605
+ const level = this._settings.levels
606
+ ? this._settings.levels.reduce((prevLevel, currLevel) => {
607
+ return Math.abs(currLevel - parsedLevel) < Math.abs(prevLevel - parsedLevel) ? currLevel : prevLevel;
608
+ })
609
+ : parsedLevel;
610
+
611
+ this.data = {
612
+ level,
613
+ text: content.innerHTML,
614
+ };
615
+ }
616
+
617
+ /**
618
+ * Used by Editor paste handling API.
619
+ * Provides configuration to handle H1-H6 tags.
620
+ *
621
+ * @returns PasteConfig
622
+ */
623
+ public static get pasteConfig(): PasteConfig {
624
+ return {
625
+ tags: ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'],
626
+ };
627
+ }
628
+
629
+ /**
630
+ * Get Tool toolbox settings
631
+ * Returns an array of all 6 heading levels, each with its own icon and title.
632
+ * The BlockToolAdapter will filter these based on the `levels` config if specified.
633
+ *
634
+ * @returns ToolboxConfig array with entries for H1-H6
635
+ */
636
+ public static get toolbox(): ToolboxConfig {
637
+ return Header.DEFAULT_LEVELS.map(level => ({
638
+ icon: level.icon,
639
+ title: level.name,
640
+ titleKey: level.nameKey,
641
+ name: `header-${level.number}`,
642
+ data: { level: level.number },
643
+ searchTerms: [`h${level.number}`, 'title', 'header', 'heading'],
644
+ }));
645
+ }
646
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @module Tools
3
+ * Re-exports all built-in tools for easy importing.
4
+ *
5
+ * @example
6
+ * // Import specific tools
7
+ * import { Paragraph, Header, List, Bold, Italic, Link } from '@jackuait/blok/tools';
8
+ *
9
+ * // Use in Blok configuration (flat config style)
10
+ * new Blok({
11
+ * tools: {
12
+ * paragraph: Paragraph,
13
+ * header: { class: Header, levels: [1, 2, 3] },
14
+ * list: List,
15
+ * bold: Bold,
16
+ * italic: Italic,
17
+ * link: Link,
18
+ * }
19
+ * });
20
+ */
21
+
22
+ // Block tools
23
+ export { Paragraph } from './paragraph';
24
+ export { Header } from './header';
25
+ export { ListItem as List } from './list';
26
+
27
+ // Inline tools
28
+ export { BoldInlineTool as Bold } from '../components/inline-tools/inline-tool-bold';
29
+ export { ItalicInlineTool as Italic } from '../components/inline-tools/inline-tool-italic';
30
+ export { LinkInlineTool as Link } from '../components/inline-tools/inline-tool-link';
31
+ export { ConvertInlineTool as Convert } from '../components/inline-tools/inline-tool-convert';
32
+
33
+ // Default tools configuration for convenience
34
+ // Note: inlineToolbar defaults to true, so it doesn't need to be specified
35
+ export const defaultBlockTools = {
36
+ paragraph: { preserveBlank: true },
37
+ header: {},
38
+ list: {},
39
+ } as const;
40
+
41
+ export const defaultInlineTools = {
42
+ bold: {},
43
+ italic: {},
44
+ link: {},
45
+ } as const;