@jackuait/blok 0.4.1 → 0.4.3-beta.1

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 (397) hide show
  1. package/README.md +136 -17
  2. package/codemod/README.md +45 -7
  3. package/codemod/migrate-editorjs-to-blok.js +951 -92
  4. package/codemod/test.js +780 -77
  5. package/dist/blok.mjs +5 -2
  6. package/dist/chunks/blok-8ptWuVZC.mjs +12838 -0
  7. package/dist/chunks/i18next-CugVlwWp.mjs +1292 -0
  8. package/dist/chunks/i18next-loader-bLawSYRV.mjs +43 -0
  9. package/dist/{index-CBkApZKo.mjs → chunks/index-5nYtWZD2.mjs} +2 -2
  10. package/dist/chunks/inline-tool-convert-CvMDAIzb.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 +60 -15
  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 -24
  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/list.d.ts +25 -18
  392. package/types/tools/tool-settings.d.ts +8 -1
  393. package/types/tools/tool.d.ts +6 -0
  394. package/types/tools-entry.d.ts +49 -0
  395. package/types/utils/popover/popover-item.d.ts +0 -5
  396. package/dist/blok-BwPfU8ro.mjs +0 -21510
  397. package/dist/blok.umd.js +0 -198
@@ -0,0 +1,274 @@
1
+ import type { Tool, ToolConstructable, ToolSettings } from '@/types/tools';
2
+ import type { SanitizerConfig, API as ApiMethods, ToolConfig } from '@/types';
3
+ import { isFunction } from '../utils';
4
+ import { ToolType } from '@/types/tools/adapters/tool-type';
5
+ import type { BaseToolAdapter as BaseToolAdapterInterface } from '@/types/tools/adapters/base-tool-adapter';
6
+ import type { InlineToolAdapter as InlineToolAdapterInterface } from '@/types/tools/adapters/inline-tool-adapter';
7
+ import type { BlockToolAdapter as BlockToolAdapterInterface } from '@/types/tools/adapters/block-tool-adapter';
8
+ import type { BlockTuneAdapter as BlockTuneAdapterInterface } from '@/types/tools/adapters/block-tune-adapter';
9
+
10
+ /**
11
+ * Enum of Tool options provided by user
12
+ */
13
+ export enum UserSettings {
14
+ /**
15
+ * Shortcut for Tool
16
+ */
17
+ Shortcut = 'shortcut',
18
+ /**
19
+ * Toolbox config for Tool
20
+ */
21
+ Toolbox = 'toolbox',
22
+ /**
23
+ * Enabled Inline Tools for Block Tool
24
+ */
25
+ EnabledInlineTools = 'inlineToolbar',
26
+ /**
27
+ * Enabled Block Tunes for Block Tool
28
+ */
29
+ EnabledBlockTunes = 'tunes',
30
+ /**
31
+ * Tool configuration
32
+ */
33
+ Config = 'config',
34
+ }
35
+
36
+ /**
37
+ * Enum of Tool options provided by Tool
38
+ */
39
+ export enum CommonInternalSettings {
40
+ /**
41
+ * Shortcut for Tool
42
+ */
43
+ Shortcut = 'shortcut',
44
+ /**
45
+ * Sanitize configuration for Tool
46
+ */
47
+ SanitizeConfig = 'sanitize',
48
+
49
+ }
50
+
51
+ /**
52
+ * Enum of Tool options provided by Block Tool
53
+ */
54
+ export enum InternalBlockToolSettings {
55
+ /**
56
+ * Is line breaks enabled for Tool
57
+ */
58
+ IsEnabledLineBreaks = 'enableLineBreaks',
59
+ /**
60
+ * Tool Toolbox config
61
+ */
62
+ Toolbox = 'toolbox',
63
+ /**
64
+ * Tool conversion config
65
+ */
66
+ ConversionConfig = 'conversionConfig',
67
+ /**
68
+ * Is readonly mode supported for Tool
69
+ */
70
+ IsReadOnlySupported = 'isReadOnlySupported',
71
+ /**
72
+ * Tool paste config
73
+ */
74
+ PasteConfig = 'pasteConfig'
75
+ }
76
+
77
+ /**
78
+ * Enum of Tool options provided by Inline Tool
79
+ */
80
+ export enum InternalInlineToolSettings {
81
+ /**
82
+ * Flag specifies Tool is inline
83
+ */
84
+ IsInline = 'isInline',
85
+ /**
86
+ * Inline Tool title for toolbar
87
+ */
88
+ Title = 'title', // for Inline Tools. Block Tools can pass title along with icon through the 'toolbox' static prop.
89
+
90
+ /**
91
+ * Allows inline tool to be available in read-only mode
92
+ * Can be used, for example, by comments tool
93
+ */
94
+ IsReadOnlySupported = 'isReadOnlySupported',
95
+ }
96
+
97
+ /**
98
+ * Enum of Tool options provided by Block Tune
99
+ */
100
+ export enum InternalTuneSettings {
101
+ /**
102
+ * Flag specifies Tool is Block Tune
103
+ */
104
+ IsTune = 'isTune',
105
+ }
106
+
107
+ export type ToolOptions = Omit<ToolSettings, 'class'>;
108
+
109
+ type ToolPreparePayload = {
110
+ toolName: string;
111
+ config: ToolConfig;
112
+ };
113
+
114
+ interface ConstructorOptions {
115
+ name: string;
116
+ constructable: ToolConstructable;
117
+ config: ToolOptions;
118
+ api: ApiMethods;
119
+ isDefault: boolean;
120
+ isInternal: boolean;
121
+ defaultPlaceholder?: string | false;
122
+ }
123
+
124
+ /**
125
+ * Base abstract class for Tools
126
+ */
127
+ export abstract class BaseToolAdapter<Type extends ToolType = ToolType, ToolClass extends Tool = Tool> implements BaseToolAdapterInterface<ToolType, Tool> {
128
+ /**
129
+ * Tool type: Block, Inline or Tune
130
+ */
131
+ public abstract type: Type;
132
+
133
+ /**
134
+ * Tool name specified in Blok config
135
+ */
136
+ public name: string;
137
+
138
+ /**
139
+ * Flag show is current Tool internal (bundled with Blok core) or not
140
+ */
141
+ public readonly isInternal: boolean;
142
+
143
+ /**
144
+ * Flag show is current Tool default or not
145
+ */
146
+ public readonly isDefault: boolean;
147
+
148
+ /**
149
+ * Blok API for current Tool
150
+ */
151
+ protected api: ApiMethods;
152
+
153
+ /**
154
+ * Current tool user configuration
155
+ */
156
+ protected config: ToolOptions;
157
+
158
+ /**
159
+ * Tool's constructable blueprint
160
+ */
161
+ protected constructable: ToolConstructable;
162
+
163
+ /**
164
+ * Default placeholder specified in Blok user configuration
165
+ */
166
+ protected defaultPlaceholder?: string | false;
167
+
168
+ /**
169
+ * @class
170
+ * @param {ConstructorOptions} options - Constructor options
171
+ */
172
+ constructor({
173
+ name,
174
+ constructable,
175
+ config,
176
+ api,
177
+ isDefault,
178
+ isInternal = false,
179
+ defaultPlaceholder,
180
+ }: ConstructorOptions) {
181
+ this.api = api;
182
+ this.name = name;
183
+ this.constructable = constructable;
184
+ this.config = config;
185
+ this.isDefault = isDefault;
186
+ this.isInternal = isInternal;
187
+ this.defaultPlaceholder = defaultPlaceholder;
188
+ }
189
+
190
+ /**
191
+ * Returns Tool user configuration
192
+ */
193
+ public get settings(): ToolConfig {
194
+ const config = (this.config[UserSettings.Config] ?? {}) as ToolConfig;
195
+
196
+ if (this.isDefault && !('placeholder' in config) && this.defaultPlaceholder) {
197
+ config.placeholder = this.defaultPlaceholder;
198
+ }
199
+
200
+ return config;
201
+ }
202
+
203
+ /**
204
+ * Calls Tool's reset method
205
+ */
206
+ public reset(): void | Promise<void> {
207
+ if (isFunction(this.constructable.reset)) {
208
+ return this.constructable.reset();
209
+ }
210
+ }
211
+
212
+ /**
213
+ * Calls Tool's prepare method
214
+ */
215
+ public prepare(): void | Promise<void> {
216
+ const prepare = this.constructable.prepare;
217
+
218
+ if (!isFunction(prepare)) {
219
+ return;
220
+ }
221
+
222
+ const payload: ToolPreparePayload = {
223
+ toolName: this.name,
224
+ config: this.settings,
225
+ };
226
+
227
+ return (prepare as (data: ToolPreparePayload) => void | Promise<void>).call(this.constructable, payload);
228
+ }
229
+
230
+ /**
231
+ * Returns shortcut for Tool (internal or specified by user)
232
+ */
233
+ public get shortcut(): string | undefined {
234
+ const toolShortcut = this.constructable[CommonInternalSettings.Shortcut];
235
+ const userShortcut = this.config[UserSettings.Shortcut];
236
+
237
+ return userShortcut || toolShortcut;
238
+ }
239
+
240
+ /**
241
+ * Returns Tool's sanitizer configuration
242
+ */
243
+ public get sanitizeConfig(): SanitizerConfig {
244
+ return this.constructable[CommonInternalSettings.SanitizeConfig] || {};
245
+ }
246
+
247
+ /**
248
+ * Returns true if Tools is inline
249
+ */
250
+ public isInline(): this is InlineToolAdapterInterface {
251
+ return this.type === ToolType.Inline;
252
+ }
253
+
254
+ /**
255
+ * Returns true if Tools is block
256
+ */
257
+ public isBlock(): this is BlockToolAdapterInterface {
258
+ return this.type === ToolType.Block;
259
+ }
260
+
261
+ /**
262
+ * Returns true if Tools is tune
263
+ */
264
+ public isTune(): this is BlockTuneAdapterInterface {
265
+ return this.type === ToolType.Tune;
266
+ }
267
+
268
+ /**
269
+ * Constructs new Tool instance from constructable blueprint
270
+ * @param args
271
+ */
272
+
273
+ public abstract create(...args: any[]): ToolClass;
274
+ }
@@ -0,0 +1,291 @@
1
+ import { BaseToolAdapter, InternalBlockToolSettings, UserSettings } from './base';
2
+ import type {
3
+ BlockAPI,
4
+ BlockTool as IBlockTool,
5
+ BlockToolData,
6
+ BlockToolConstructable,
7
+ ConversionConfig,
8
+ PasteConfig, SanitizerConfig, ToolboxConfig,
9
+ ToolboxConfigEntry
10
+ } from '@/types';
11
+ import { isEmpty, isObject } from '../utils';
12
+ import type { InlineToolAdapter } from './inline';
13
+ import type { BlockTuneAdapter } from './tune';
14
+ import { ToolsCollection } from './collection';
15
+ import type { BlockToolAdapter as BlockToolAdapterInterface } from '@/types/tools/adapters/block-tool-adapter';
16
+ import { ToolType } from '@/types/tools/adapters/tool-type';
17
+
18
+ /**
19
+ * Class to work with Block tools constructables
20
+ */
21
+ export class BlockToolAdapter extends BaseToolAdapter<ToolType.Block, IBlockTool> implements BlockToolAdapterInterface {
22
+ /**
23
+ * Tool type — Block
24
+ */
25
+ public type: ToolType.Block = ToolType.Block;
26
+
27
+ /**
28
+ * InlineTool collection for current Block Tool
29
+ */
30
+ public inlineTools: ToolsCollection<InlineToolAdapter> = new ToolsCollection<InlineToolAdapter>();
31
+
32
+ /**
33
+ * BlockTune collection for current Block Tool
34
+ */
35
+ public tunes: ToolsCollection<BlockTuneAdapter> = new ToolsCollection<BlockTuneAdapter>();
36
+
37
+ /**
38
+ * Cache for sanitize configuration
39
+ */
40
+ private _sanitizeConfig: SanitizerConfig | undefined;
41
+
42
+ /**
43
+ * Cache for base sanitize configuration
44
+ */
45
+ private _baseSanitizeConfig: SanitizerConfig | undefined;
46
+
47
+ /**
48
+ * Creates new Tool instance
49
+ * @param data - Tool data
50
+ * @param block - BlockAPI for current Block
51
+ * @param readOnly - True if Blok is in read-only mode
52
+ */
53
+ public create(data: BlockToolData, block: BlockAPI, readOnly: boolean): IBlockTool {
54
+
55
+ return new this.constructable({
56
+ data,
57
+ block,
58
+ readOnly,
59
+ api: this.api,
60
+ config: this.settings,
61
+ }) as IBlockTool;
62
+ }
63
+
64
+ /**
65
+ * Returns true if read-only mode is supported by Tool
66
+ */
67
+ public get isReadOnlySupported(): boolean {
68
+ return (this.constructable as BlockToolConstructable)[InternalBlockToolSettings.IsReadOnlySupported] === true;
69
+ }
70
+
71
+ /**
72
+ * Returns true if Tool supports linebreaks
73
+ */
74
+ public get isLineBreaksEnabled(): boolean {
75
+ return (this.constructable as unknown as Record<string, boolean | undefined>)[InternalBlockToolSettings.IsEnabledLineBreaks] ?? false;
76
+ }
77
+
78
+ /**
79
+ * Returns Tool toolbox configuration (internal or user-specified).
80
+ *
81
+ * Merges internal and user-defined toolbox configs based on the following rules:
82
+ *
83
+ * - If both internal and user-defined toolbox configs are arrays their items are merged.
84
+ * Length of the second one is kept.
85
+ *
86
+ * - If both are objects their properties are merged.
87
+ *
88
+ * - If one is an object and another is an array than internal config is replaced with user-defined
89
+ * config. This is made to allow user to override default tool's toolbox representation (single/multiple entries)
90
+ *
91
+ * Additionally, if the tool's config contains a `toolboxStyles` array, only toolbox entries
92
+ * whose `data.style` matches one of the specified styles will be included.
93
+ */
94
+ public get toolbox(): ToolboxConfigEntry[] | undefined {
95
+ const toolToolboxSettings = (this.constructable as BlockToolConstructable)[InternalBlockToolSettings.Toolbox] as ToolboxConfig | undefined;
96
+ const userToolboxSettings = this.config[UserSettings.Toolbox];
97
+
98
+ if (!toolToolboxSettings || isEmpty(toolToolboxSettings)) {
99
+ return;
100
+ }
101
+ if (userToolboxSettings === false) {
102
+ return;
103
+ }
104
+
105
+ const mergedEntries = this.mergeToolboxSettings(toolToolboxSettings, userToolboxSettings);
106
+
107
+ return this.filterToolboxEntriesByStyles(mergedEntries);
108
+ }
109
+
110
+ /**
111
+ * Merges tool's internal toolbox settings with user-defined settings
112
+ */
113
+ private mergeToolboxSettings(
114
+ toolSettings: ToolboxConfig,
115
+ userSettings: ToolboxConfig | undefined | null
116
+ ): ToolboxConfigEntry[] {
117
+ /**
118
+ * Return tool's toolbox settings if user settings are not defined
119
+ */
120
+ if (userSettings === undefined || userSettings === null) {
121
+ return Array.isArray(toolSettings) ? toolSettings : [ toolSettings ];
122
+ }
123
+
124
+ /**
125
+ * User provided single entry to override array of tool entries
126
+ */
127
+ if (!Array.isArray(userSettings) && Array.isArray(toolSettings)) {
128
+ return [ userSettings ];
129
+ }
130
+
131
+ /**
132
+ * Both are single entries - merge them
133
+ */
134
+ if (!Array.isArray(userSettings)) {
135
+ return [
136
+ {
137
+ ...toolSettings,
138
+ ...userSettings,
139
+ },
140
+ ];
141
+ }
142
+
143
+ /**
144
+ * User provided array but tool has single entry
145
+ */
146
+ if (!Array.isArray(toolSettings)) {
147
+ return userSettings;
148
+ }
149
+
150
+ /**
151
+ * Both are arrays - merge item by item
152
+ */
153
+ return userSettings.map((item, i) => {
154
+ const toolToolboxEntry = toolSettings[i];
155
+
156
+ if (toolToolboxEntry) {
157
+ return {
158
+ ...toolToolboxEntry,
159
+ ...item,
160
+ };
161
+ }
162
+
163
+ return item;
164
+ });
165
+ }
166
+
167
+ /**
168
+ * Filters toolbox entries based on toolboxStyles config if specified.
169
+ * This allows tools like List to show only specific variants in the toolbox.
170
+ */
171
+ private filterToolboxEntriesByStyles(entries: ToolboxConfigEntry[]): ToolboxConfigEntry[] {
172
+ const toolboxStyles = this.settings.toolboxStyles as string[] | undefined;
173
+
174
+ if (!toolboxStyles || !Array.isArray(toolboxStyles) || toolboxStyles.length === 0) {
175
+ return entries;
176
+ }
177
+
178
+ return entries.filter(entry => {
179
+ const entryData = entry.data as { style?: string } | undefined;
180
+
181
+ if (!entryData || !entryData.style) {
182
+ return true; // Keep entries without style data
183
+ }
184
+
185
+ return toolboxStyles.includes(entryData.style);
186
+ });
187
+ }
188
+
189
+ /**
190
+ * Returns Tool conversion configuration
191
+ */
192
+ public get conversionConfig(): ConversionConfig | undefined {
193
+ return (this.constructable as BlockToolConstructable)[InternalBlockToolSettings.ConversionConfig];
194
+ }
195
+
196
+ /**
197
+ * Returns enabled inline tools for Tool
198
+ */
199
+ public get enabledInlineTools(): boolean | string[] {
200
+ return this.config[UserSettings.EnabledInlineTools] || false;
201
+ }
202
+
203
+ /**
204
+ * Returns enabled tunes for Tool
205
+ */
206
+ public get enabledBlockTunes(): boolean | string[] | undefined {
207
+ return this.config[UserSettings.EnabledBlockTunes];
208
+ }
209
+
210
+ /**
211
+ * Returns Tool paste configuration
212
+ */
213
+ public get pasteConfig(): PasteConfig {
214
+ return (this.constructable as BlockToolConstructable)[InternalBlockToolSettings.PasteConfig] ?? {};
215
+ }
216
+
217
+ /**
218
+ * Returns true if Tool has onPaste handler
219
+ */
220
+ public get hasOnPasteHandler(): boolean {
221
+ const prototype = (this.constructable as unknown as { prototype?: { onPaste?: unknown } })?.prototype;
222
+
223
+ return typeof prototype?.onPaste === 'function';
224
+ }
225
+
226
+ /**
227
+ * Returns sanitize configuration for Block Tool including configs from related Inline Tools and Block Tunes
228
+ */
229
+ public get sanitizeConfig(): SanitizerConfig {
230
+ if (this._sanitizeConfig) {
231
+ return this._sanitizeConfig;
232
+ }
233
+
234
+ const toolRules = super.sanitizeConfig;
235
+ const baseConfig = this.baseSanitizeConfig;
236
+
237
+ if (isEmpty(toolRules)) {
238
+ this._sanitizeConfig = baseConfig;
239
+
240
+ return baseConfig;
241
+ }
242
+
243
+ const toolConfig = {} as SanitizerConfig;
244
+
245
+ for (const fieldName in toolRules) {
246
+ if (!Object.prototype.hasOwnProperty.call(toolRules, fieldName)) {
247
+ continue;
248
+ }
249
+
250
+ const rule = toolRules[fieldName];
251
+
252
+ /**
253
+ * If rule is object, merge it with Inline Tools configuration
254
+ *
255
+ * Otherwise pass as it is
256
+ */
257
+ if (isObject(rule)) {
258
+ toolConfig[fieldName] = Object.assign({}, baseConfig, rule);
259
+ } else {
260
+ toolConfig[fieldName] = rule;
261
+ }
262
+ }
263
+
264
+ this._sanitizeConfig = toolConfig;
265
+
266
+ return toolConfig;
267
+ }
268
+
269
+ /**
270
+ * Returns sanitizer configuration composed from sanitize config of Inline Tools enabled for Tool
271
+ */
272
+ public get baseSanitizeConfig(): SanitizerConfig {
273
+ if (this._baseSanitizeConfig) {
274
+ return this._baseSanitizeConfig;
275
+ }
276
+
277
+ const baseConfig = {};
278
+
279
+ Array
280
+ .from(this.inlineTools.values())
281
+ .forEach(tool => Object.assign(baseConfig, tool.sanitizeConfig));
282
+
283
+ Array
284
+ .from(this.tunes.values())
285
+ .forEach(tune => Object.assign(baseConfig, tune.sanitizeConfig));
286
+
287
+ this._baseSanitizeConfig = baseConfig;
288
+
289
+ return baseConfig;
290
+ }
291
+ }
@@ -0,0 +1,67 @@
1
+ import type { BlockToolAdapter } from './block';
2
+ import type { InlineToolAdapter } from './inline';
3
+ import type { BlockTuneAdapter } from './tune';
4
+ import type { ToolsCollection as ToolsCollectionInterface } from '@/types/tools/adapters/tools-collection';
5
+
6
+
7
+ export type ToolClass = BlockToolAdapter | InlineToolAdapter | BlockTuneAdapter;
8
+
9
+ /**
10
+ * Class to store Blok Tools
11
+ */
12
+ export class ToolsCollection<V extends ToolClass = ToolClass> extends Map<string, V> implements ToolsCollectionInterface<V> {
13
+ /**
14
+ * Returns Block Tools collection
15
+ */
16
+ public get blockTools(): ToolsCollection<BlockToolAdapter> {
17
+ const tools = Array
18
+ .from(this.entries())
19
+ .filter(([, tool]) => tool.isBlock()) as [string, BlockToolAdapter][];
20
+
21
+ return new ToolsCollection<BlockToolAdapter>(tools);
22
+ }
23
+
24
+ /**
25
+ * Returns Inline Tools collection
26
+ */
27
+ public get inlineTools(): ToolsCollection<InlineToolAdapter> {
28
+ const tools = Array
29
+ .from(this.entries())
30
+ .filter(([, tool]) => tool.isInline()) as [string, InlineToolAdapter][];
31
+
32
+ return new ToolsCollection<InlineToolAdapter>(tools);
33
+ }
34
+
35
+ /**
36
+ * Returns Block Tunes collection
37
+ */
38
+ public get blockTunes(): ToolsCollection<BlockTuneAdapter> {
39
+ const tools = Array
40
+ .from(this.entries())
41
+ .filter(([, tool]) => tool.isTune()) as [string, BlockTuneAdapter][];
42
+
43
+ return new ToolsCollection<BlockTuneAdapter>(tools);
44
+ }
45
+
46
+ /**
47
+ * Returns internal Tools collection
48
+ */
49
+ public get internalTools(): ToolsCollection<V> {
50
+ const tools = Array
51
+ .from(this.entries())
52
+ .filter(([, tool]) => tool.isInternal);
53
+
54
+ return new ToolsCollection<V>(tools);
55
+ }
56
+
57
+ /**
58
+ * Returns Tools collection provided by user
59
+ */
60
+ public get externalTools(): ToolsCollection<V> {
61
+ const tools = Array
62
+ .from(this.entries())
63
+ .filter(([, tool]) => !tool.isInternal);
64
+
65
+ return new ToolsCollection<V>(tools);
66
+ }
67
+ }
@@ -0,0 +1,85 @@
1
+ import type { ToolConstructable, ToolSettings } from '../../../types/tools';
2
+ import { InternalInlineToolSettings, InternalTuneSettings } from './base';
3
+ import { InlineToolAdapter } from './inline';
4
+ import { BlockTuneAdapter } from './tune';
5
+ import { BlockToolAdapter } from './block';
6
+ import type { API as ApiModule } from '../modules/api';
7
+ import type { BlokConfig } from '../../../types/configs';
8
+
9
+ type ToolConstructor = typeof InlineToolAdapter | typeof BlockToolAdapter | typeof BlockTuneAdapter;
10
+
11
+ /**
12
+ * Factory to construct classes to work with tools
13
+ */
14
+ export class ToolsFactory {
15
+ /**
16
+ * Tools configuration specified by user
17
+ */
18
+ private config: {[name: string]: ToolSettings & { isInternal?: boolean }};
19
+
20
+ /**
21
+ * Blok API Module
22
+ */
23
+ private api: ApiModule;
24
+
25
+ /**
26
+ * Blok configuration
27
+ */
28
+ private blokConfig: BlokConfig;
29
+
30
+ /**
31
+ * @class
32
+ * @param config - tools config
33
+ * @param blokConfig - Blok config
34
+ * @param api - Blok API module
35
+ */
36
+ constructor(
37
+ config: {[name: string]: ToolSettings & { isInternal?: boolean }},
38
+ blokConfig: BlokConfig,
39
+ api: ApiModule
40
+ ) {
41
+ this.api = api;
42
+ this.config = config;
43
+ this.blokConfig = blokConfig;
44
+ }
45
+
46
+ /**
47
+ * Returns Tool object based on it's type
48
+ * @param name - tool name
49
+ */
50
+ public get(name: string): InlineToolAdapter | BlockToolAdapter | BlockTuneAdapter {
51
+ const { class: constructableCandidate, isInternal = false, ...config } = this.config[name];
52
+ const constructable = constructableCandidate as ToolConstructable | undefined;
53
+
54
+ if (constructable === undefined) {
55
+ throw new Error(`Tool "${name}" does not provide a class.`);
56
+ }
57
+
58
+ const Constructor = this.getConstructor(constructable);
59
+
60
+ return new Constructor({
61
+ name,
62
+ constructable,
63
+ config,
64
+ api: this.api.methods,
65
+ isDefault: name === this.blokConfig.defaultBlock,
66
+ defaultPlaceholder: this.blokConfig.placeholder,
67
+ isInternal,
68
+ });
69
+ }
70
+
71
+ /**
72
+ * Find appropriate Tool object constructor for Tool constructable
73
+ * @param constructable - Tools constructable
74
+ */
75
+ private getConstructor(constructable: ToolConstructable): ToolConstructor {
76
+ switch (true) {
77
+ case Boolean(Reflect.get(constructable, InternalInlineToolSettings.IsInline)):
78
+ return InlineToolAdapter;
79
+ case Boolean(Reflect.get(constructable, InternalTuneSettings.IsTune)):
80
+ return BlockTuneAdapter;
81
+ default:
82
+ return BlockToolAdapter;
83
+ }
84
+ }
85
+ }