@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,338 @@
1
+ import { isMobileScreen, keyCodes } from '../../utils';
2
+ import type { PopoverItem } from './components/popover-item';
3
+ import { PopoverItemDefault, PopoverItemType } from './components/popover-item';
4
+ import { PopoverItemHtml } from './components/popover-item/popover-item-html/popover-item-html';
5
+ import { PopoverDesktop } from './popover-desktop';
6
+ import { css, cssInline, CSSVariables, getNestedLevelAttrValue } from './popover.const';
7
+ import { DATA_ATTR } from '../../constants/data-attributes';
8
+ import type { PopoverParams } from '@/types/utils/popover/popover';
9
+ import { PopoverEvent } from '@/types/utils/popover/popover-event';
10
+ import { twMerge } from '../tw';
11
+ import { Flipper } from '../../flipper';
12
+ import { css as popoverItemCls } from './components/popover-item';
13
+
14
+ /**
15
+ * Inline popover height CSS variables
16
+ */
17
+ const INLINE_HEIGHT = '38px';
18
+ const INLINE_HEIGHT_MOBILE = '46px';
19
+
20
+ /**
21
+ * Horizontal popover that is displayed inline with the content
22
+ * @internal
23
+ */
24
+ export class PopoverInline extends PopoverDesktop {
25
+ /**
26
+ * Returns true if a nested popover is currently open
27
+ */
28
+ public get hasNestedPopoverOpen(): boolean {
29
+ return this.nestedPopover !== null && this.nestedPopover !== undefined;
30
+ }
31
+
32
+ /**
33
+ * Closes the nested popover if one is open
34
+ */
35
+ public closeNestedPopover(): void {
36
+ this.destroyNestedPopoverIfExists();
37
+ }
38
+
39
+ /**
40
+ * Closes popover - override as arrow function to match parent
41
+ */
42
+ public override hide = (): void => {
43
+ // Call parent hide logic manually (can't use super for arrow functions)
44
+ this.setOpenTop(false);
45
+ this.setOpenLeft(false);
46
+
47
+ this.itemsDefault.forEach(item => item.reset());
48
+
49
+ if (this.search !== undefined) {
50
+ this.search.clear();
51
+ }
52
+
53
+ this.destroyNestedPopoverIfExists();
54
+ this.flipper?.deactivate();
55
+
56
+ // Reset to closed inline styles
57
+ this.nodes.popover.className = twMerge(cssInline.popover);
58
+ if (this.nodes.popoverContainer) {
59
+ this.nodes.popoverContainer.className = twMerge(
60
+ css.popoverContainer,
61
+ cssInline.popoverContainer
62
+ );
63
+ this.nodes.popoverContainer.style.height = '';
64
+ }
65
+
66
+ // Emit closed event (from abstract)
67
+ this.emit(PopoverEvent.Closed);
68
+ };
69
+
70
+ /**
71
+ * Constructs the instance
72
+ * @param params - instance parameters
73
+ */
74
+ constructor(params: PopoverParams) {
75
+ const isHintEnabled = !isMobileScreen();
76
+
77
+ /**
78
+ * Create a custom Flipper for inline toolbar that only responds to vertical navigation.
79
+ * Left/Right arrow keys should have no effect in the inline toolbar.
80
+ * Navigation is done via Up/Down arrows and Tab/Shift+Tab.
81
+ */
82
+ const inlineFlipper = new Flipper({
83
+ focusedItemClass: popoverItemCls.focused,
84
+ allowedKeys: [
85
+ keyCodes.TAB,
86
+ keyCodes.UP,
87
+ keyCodes.DOWN,
88
+ keyCodes.ENTER,
89
+ ],
90
+ });
91
+
92
+ super(
93
+ {
94
+ ...params,
95
+ flipper: inlineFlipper,
96
+ },
97
+ {
98
+ [PopoverItemType.Default]: {
99
+ /**
100
+ * We use button instead of div here to fix bug associated with focus loss (which leads to selection change) on click in safari
101
+ * @todo figure out better way to solve the issue
102
+ */
103
+ wrapperTag: 'button',
104
+ hint: {
105
+ position: 'top',
106
+ alignment: 'center',
107
+ enabled: isHintEnabled,
108
+ },
109
+ /**
110
+ * Inline tools display icons without titles, so no gap is needed
111
+ */
112
+ iconWithGap: false,
113
+ /**
114
+ * Mark items as inline for styling
115
+ */
116
+ isInline: true,
117
+ },
118
+ [PopoverItemType.Html]: {
119
+ hint: {
120
+ position: 'top',
121
+ alignment: 'center',
122
+ enabled: isHintEnabled,
123
+ },
124
+ isInline: true,
125
+ },
126
+ [PopoverItemType.Separator]: {
127
+ isInline: true,
128
+ },
129
+ }
130
+ );
131
+
132
+ // Apply inline popover root styles
133
+ this.nodes.popover.className = twMerge(cssInline.popover);
134
+
135
+ // Apply inline container styles
136
+ if (this.nodes.popoverContainer) {
137
+ this.nodes.popoverContainer.className = twMerge(
138
+ css.popoverContainer,
139
+ cssInline.popoverContainer
140
+ );
141
+ }
142
+
143
+ // Apply inline items container styles
144
+ if (this.nodes.items) {
145
+ this.nodes.items.className = twMerge(css.items, 'flex');
146
+ }
147
+
148
+ // Set inline height CSS variables
149
+ this.nodes.popover.style.setProperty('--height', INLINE_HEIGHT);
150
+ this.nodes.popover.style.setProperty('--height-mobile', INLINE_HEIGHT_MOBILE);
151
+
152
+ // Mark as inline popover for any remaining CSS (deprecated, but kept for backwards compatibility)
153
+ this.nodes.popover.setAttribute(DATA_ATTR.popoverInline, '');
154
+
155
+ this.flipper?.setHandleContentEditableTargets(true);
156
+
157
+ /**
158
+ * If active popover item has children, show them.
159
+ * This is needed to display link url text (which is displayed as a nested popover content)
160
+ * once you select <a> tag content in text
161
+ */
162
+ this.items
163
+ .forEach((item) => {
164
+ if (!(item instanceof PopoverItemDefault) && !(item instanceof PopoverItemHtml)) {
165
+ return;
166
+ }
167
+
168
+ if (item.hasChildren && item.isChildrenOpen) {
169
+ this.showNestedItems(item);
170
+ }
171
+ });
172
+
173
+ }
174
+
175
+ /**
176
+ * Returns visible element offset top
177
+ */
178
+ public get offsetLeft(): number {
179
+ if (this.nodes.popoverContainer === null) {
180
+ return 0;
181
+ }
182
+
183
+ return this.nodes.popoverContainer.offsetLeft;
184
+ }
185
+
186
+ /**
187
+ * Open popover
188
+ */
189
+ public override show(): void {
190
+ super.show();
191
+
192
+ // Apply inline opened styles to root
193
+ this.nodes.popover.className = twMerge(cssInline.popover, 'inline-block');
194
+
195
+ // Apply inline container opened styles (no animation for inline)
196
+ if (this.nodes.popoverContainer) {
197
+ this.nodes.popoverContainer.className = twMerge(
198
+ css.popoverContainer,
199
+ css.popoverContainerOpened,
200
+ cssInline.popoverContainer,
201
+ 'animate-none'
202
+ );
203
+
204
+ // Set height based on screen
205
+ const height = isMobileScreen() ? 'var(--height-mobile)' : 'var(--height)';
206
+ this.nodes.popoverContainer.style.height = height;
207
+ }
208
+
209
+ const containerRect = this.nestingLevel === 0
210
+ ? this.nodes.popoverContainer?.getBoundingClientRect()
211
+ : undefined;
212
+
213
+ if (containerRect !== undefined) {
214
+ const width = `${containerRect.width}px`;
215
+ const heightPx = `${containerRect.height}px`;
216
+
217
+ this.nodes.popover.style.setProperty(CSSVariables.InlinePopoverWidth, width);
218
+ this.nodes.popover.style.width = width;
219
+ this.nodes.popover.style.height = heightPx;
220
+ }
221
+
222
+ requestAnimationFrame(() => {
223
+ this.flipper?.deactivate();
224
+ this.flipper?.activate(this.flippableElements);
225
+ });
226
+ }
227
+
228
+ /**
229
+ * Disable hover event handling.
230
+ * Overrides parent's class behavior
231
+ */
232
+ protected override handleHover(): void {
233
+ return;
234
+ }
235
+
236
+ /**
237
+ * Sets CSS variable with position of item near which nested popover should be displayed.
238
+ * Is used to position nested popover right below clicked item
239
+ * @param nestedPopoverEl - nested popover element
240
+ * @param item – item near which nested popover should be displayed
241
+ */
242
+ protected override setTriggerItemPosition(
243
+ nestedPopoverEl: HTMLElement,
244
+ item: PopoverItemDefault
245
+ ): void {
246
+ const itemEl = item.getElement();
247
+ const itemOffsetLeft = itemEl ? itemEl.offsetLeft : 0;
248
+ const totalLeftOffset = this.offsetLeft + itemOffsetLeft;
249
+
250
+ nestedPopoverEl.style.setProperty(
251
+ CSSVariables.TriggerItemLeft,
252
+ totalLeftOffset + 'px'
253
+ );
254
+ }
255
+
256
+ /**
257
+ * Handles displaying nested items for the item.
258
+ * Overriding in order to add toggling behaviour
259
+ * @param item – item to toggle nested popover for
260
+ */
261
+ protected override showNestedItems(item: PopoverItemDefault | PopoverItemHtml): void {
262
+ if (this.nestedPopoverTriggerItem === item) {
263
+ this.destroyNestedPopoverIfExists();
264
+
265
+ this.nestedPopoverTriggerItem = null;
266
+
267
+ return;
268
+ }
269
+
270
+ super.showNestedItems(item);
271
+ }
272
+
273
+ /**
274
+ * Creates and displays nested popover for specified item.
275
+ * Is used only on desktop
276
+ * @param item - item to display nested popover by
277
+ */
278
+ protected showNestedPopoverForItem(item: PopoverItem): PopoverDesktop {
279
+ const nestedPopover = super.showNestedPopoverForItem(item);
280
+ const nestedPopoverEl = nestedPopover.getElement();
281
+
282
+ nestedPopover.flipper?.setHandleContentEditableTargets(true);
283
+
284
+ // Apply nested inline styles to the nested popover container
285
+ const nestedContainer = nestedPopoverEl.querySelector(`[${DATA_ATTR.popoverContainer}]`) as HTMLElement | null;
286
+ if (nestedContainer) {
287
+ nestedContainer.className = twMerge(
288
+ nestedContainer.className,
289
+ 'h-fit p-1.5 flex-col',
290
+ );
291
+ }
292
+
293
+ // Apply nested inline styles to the items container
294
+ const nestedItems = nestedPopoverEl.querySelector(`[${DATA_ATTR.popoverItems}]`) as HTMLElement | null;
295
+ if (nestedItems) {
296
+ nestedItems.className = twMerge(nestedItems.className, 'block w-full');
297
+ }
298
+
299
+ /**
300
+ * We need to add data attribute with nesting level, which will help position nested popover.
301
+ * Currently only 'level-1' is used
302
+ */
303
+ nestedPopoverEl.setAttribute(DATA_ATTR.nestedLevel, getNestedLevelAttrValue(nestedPopover.nestingLevel));
304
+
305
+ // Apply level-1 specific positioning styles
306
+ if (nestedPopover.nestingLevel === 1 && nestedContainer) {
307
+ nestedContainer.className = twMerge(nestedContainer.className, 'left-0');
308
+ // Set top position based on height
309
+ const topOffset = isMobileScreen() ? 'calc(var(--height-mobile) + 3px)' : 'calc(var(--height) + 3px)';
310
+ nestedContainer.style.top = topOffset;
311
+ }
312
+
313
+ return nestedPopover;
314
+ }
315
+
316
+ /**
317
+ * Overrides default item click handling.
318
+ * Helps to close nested popover once other item is clicked.
319
+ * @param item - clicked item
320
+ */
321
+ protected override handleItemClick(item: PopoverItem): void {
322
+ if (item !== this.nestedPopoverTriggerItem) {
323
+ /**
324
+ * In case tool had special handling for toggling button (like link tool which modifies selection)
325
+ * we need to call handleClick on nested popover trigger item
326
+ */
327
+ this.nestedPopoverTriggerItem?.handleClick();
328
+
329
+ /**
330
+ * Then close the nested popover
331
+ */
332
+ super.destroyNestedPopoverIfExists();
333
+ }
334
+
335
+ super.handleItemClick(item);
336
+ }
337
+
338
+ }
@@ -0,0 +1,201 @@
1
+ import { PopoverAbstract } from './popover-abstract';
2
+ import { ScrollLocker } from '../scroll-locker';
3
+ import { PopoverHeader } from './components/popover-header';
4
+ import { PopoverStatesHistory } from './utils/popover-states-history';
5
+ import type { PopoverMobileNodes, PopoverParams } from '@/types/utils/popover/popover';
6
+ import type { PopoverItemDefault, PopoverItemParams } from './components/popover-item';
7
+ import { PopoverItemType } from './components/popover-item';
8
+ import { css } from './popover.const';
9
+ import { DATA_ATTR } from '../../constants/data-attributes';
10
+ import { Dom } from '../../dom';
11
+ import { twMerge } from '../tw';
12
+
13
+
14
+ /**
15
+ * Mobile Popover.
16
+ * On mobile devices Popover behaves like a fixed panel at the bottom of screen. Nested item appears like "pages" with the "back" button
17
+ */
18
+ export class PopoverMobile extends PopoverAbstract<PopoverMobileNodes> {
19
+ /**
20
+ * ScrollLocker instance
21
+ */
22
+ private scrollLocker = new ScrollLocker();
23
+
24
+ /**
25
+ * Reference to popover header if exists
26
+ */
27
+ private header: PopoverHeader | undefined | null;
28
+
29
+ /**
30
+ * History of popover states for back navigation.
31
+ * Is used for mobile version of popover,
32
+ * where we can not display nested popover of the screen and
33
+ * have to render nested items in the same popover switching to new state
34
+ */
35
+ private history = new PopoverStatesHistory();
36
+
37
+ /**
38
+ * Flag that indicates if popover is hidden
39
+ */
40
+ private isHidden = true;
41
+
42
+ /**
43
+ * Construct the instance
44
+ * @param params - popover params
45
+ */
46
+ constructor(params: PopoverParams) {
47
+ super(params, {
48
+ [PopoverItemType.Default]: {
49
+ hint: {
50
+ enabled: false,
51
+ },
52
+ },
53
+ [PopoverItemType.Html]: {
54
+ hint: {
55
+ enabled: false,
56
+ },
57
+ },
58
+ });
59
+
60
+ this.nodes.overlay = Dom.make('div', [css.popoverOverlay], {
61
+ [DATA_ATTR.popoverOverlay]: '',
62
+ [DATA_ATTR.overlayHidden]: '',
63
+ 'data-blok-testid': 'popover-overlay',
64
+ });
65
+ this.nodes.popover.insertBefore(this.nodes.overlay, this.nodes.popover.firstChild);
66
+
67
+ this.listeners.on(this.nodes.overlay, 'click', () => {
68
+ this.hide();
69
+ });
70
+
71
+ /* Save state to history for proper navigation between nested and parent popovers */
72
+ this.history.push({ items: params.items });
73
+
74
+ // Set mobile offset CSS variable (moved from popover.css @screen mobile rule)
75
+ this.nodes.popoverContainer.style.setProperty('--offset', '5px');
76
+
77
+ // Apply mobile-specific classes to container
78
+ this.nodes.popoverContainer.className = twMerge(
79
+ css.popoverContainer,
80
+ css.popoverContainerMobile
81
+ );
82
+ }
83
+
84
+ /**
85
+ * Open popover
86
+ */
87
+ public show(): void {
88
+ this.nodes.overlay.removeAttribute(DATA_ATTR.overlayHidden);
89
+ this.nodes.overlay.className = twMerge(css.popoverOverlay, 'fixed inset-0 block visible z-[3] opacity-50 transition-opacity duration-[120ms] ease-in will-change-[opacity]');
90
+
91
+ super.show();
92
+
93
+ // Apply mobile opened state classes AFTER super.show() to override base class styles
94
+ // For mobile, we use max-h-none instead of max-h-[var(--max-height)] since mobile popovers
95
+ // should expand to fit their content
96
+ // Use z-[4] to ensure container is above the overlay (z-[3])
97
+ this.nodes.popoverContainer.className = twMerge(
98
+ css.popoverContainer,
99
+ css.popoverContainerMobile,
100
+ css.popoverContainerOpened,
101
+ 'max-h-none z-[4] animate-[panelShowingMobile_250ms_ease]'
102
+ );
103
+
104
+ this.scrollLocker.lock();
105
+
106
+ this.isHidden = false;
107
+ }
108
+
109
+ /**
110
+ * Closes popover
111
+ */
112
+ public hide(): void {
113
+ if (this.isHidden) {
114
+ return;
115
+ }
116
+
117
+ super.hide();
118
+ this.nodes.overlay.setAttribute(DATA_ATTR.overlayHidden, '');
119
+ this.nodes.overlay.className = css.popoverOverlay;
120
+
121
+ // Reset to mobile base closed state
122
+ this.nodes.popoverContainer.className = twMerge(
123
+ css.popoverContainer,
124
+ css.popoverContainerMobile
125
+ );
126
+
127
+ this.scrollLocker.unlock();
128
+
129
+ this.history.reset();
130
+
131
+ this.isHidden = true;
132
+ }
133
+
134
+ /**
135
+ * Clears memory
136
+ */
137
+ public destroy(): void {
138
+ super.destroy();
139
+
140
+ this.scrollLocker.unlock();
141
+ }
142
+
143
+ /**
144
+ * Handles displaying nested items for the item
145
+ * @param item – item to show nested popover for
146
+ */
147
+ protected override showNestedItems(item: PopoverItemDefault): void {
148
+ /** Show nested items */
149
+ this.updateItemsAndHeader(item.children, item.title);
150
+
151
+ this.history.push({
152
+ title: item.title,
153
+ items: item.children,
154
+ });
155
+ }
156
+
157
+ /**
158
+ * Removes rendered popover items and header and displays new ones
159
+ * @param items - new popover items
160
+ * @param title - new popover header text
161
+ */
162
+ private updateItemsAndHeader(items: PopoverItemParams[], title?: string ): void {
163
+ /** Re-render header */
164
+ if (this.header !== null && this.header !== undefined) {
165
+ this.header.destroy();
166
+ this.header = null;
167
+ }
168
+ const shouldRenderHeader = title !== undefined;
169
+
170
+ if (shouldRenderHeader) {
171
+ this.header = new PopoverHeader({
172
+ text: title,
173
+ onBackButtonClick: () => {
174
+ this.history.pop();
175
+
176
+ this.updateItemsAndHeader(this.history.currentItems, this.history.currentTitle);
177
+ },
178
+ });
179
+ }
180
+
181
+ const headerElement = this.header?.getElement() ?? null;
182
+
183
+ if (shouldRenderHeader && headerElement !== null) {
184
+ this.nodes.popoverContainer.insertBefore(headerElement, this.nodes.popoverContainer.firstChild);
185
+ }
186
+
187
+ /** Re-render items */
188
+ this.items.forEach(item => item.getMountElement?.()?.remove());
189
+
190
+ this.items = this.buildItems(items);
191
+
192
+ this.items.forEach(item => {
193
+ const itemEl = item.getMountElement?.() ?? item.getElement();
194
+
195
+ if (itemEl === null) {
196
+ return;
197
+ }
198
+ this.nodes.items?.appendChild(itemEl);
199
+ });
200
+ }
201
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Tailwind CSS class names for popover component
3
+ *
4
+ * Classes are applied directly in components using twMerge for conflict resolution.
5
+ */
6
+ export const css = {
7
+ // Popover container - base styles
8
+ popoverContainer: 'absolute flex flex-col overflow-hidden box-border opacity-0 pointer-events-none p-0 border-none z-[4] max-h-0 min-w-[var(--width)] w-[var(--width)] rounded-lg shadow-[0_3px_15px_-3px_theme(colors.popover-shadow)] left-[var(--popover-left)] top-[var(--popover-top)] bg-popover-bg',
9
+
10
+ // Popover container - mobile styles (applied conditionally)
11
+ // Reset left/top from base class since inset shorthand may not properly override them in twMerge
12
+ popoverContainerMobile: 'fixed max-w-none rounded-[10px] min-w-[calc(100%-var(--offset)*2)] left-auto top-auto inset-[auto_var(--offset)_calc(var(--offset)+env(safe-area-inset-bottom))_var(--offset)]',
13
+
14
+ // Popover container - opened state
15
+ popoverContainerOpened: 'opacity-100 pointer-events-auto p-1 max-h-[var(--max-height)] border border-popover-border animate-[panelShowing_100ms_ease]',
16
+
17
+ // Popover overlay
18
+ popoverOverlay: 'hidden bg-dark',
19
+
20
+ items: 'overflow-y-auto overscroll-contain',
21
+ };
22
+
23
+ /**
24
+ * Tailwind CSS class names for inline popover
25
+ * These classes override base popover styles when used in inline context
26
+ */
27
+ export const cssInline = {
28
+ // Popover root element for inline
29
+ popover: 'relative',
30
+
31
+ // Container for inline popover
32
+ popoverContainer: 'flex-row top-0 min-w-max w-max p-1 mobile:absolute',
33
+ };
34
+
35
+ /**
36
+ * Helper to get nested level attribute value
37
+ * @param level - nesting level
38
+ */
39
+ export const getNestedLevelAttrValue = (level: number): string => {
40
+ return `level-${level}`;
41
+ };
42
+
43
+ /**
44
+ * CSS variables names to be used in popover
45
+ */
46
+ export enum CSSVariables {
47
+ /**
48
+ * Stores nesting level of the popover
49
+ */
50
+ NestingLevel = '--nesting-level',
51
+
52
+ /**
53
+ * Stores actual popover height. Used for desktop popovers
54
+ */
55
+ PopoverHeight = '--popover-height',
56
+
57
+ /**
58
+ * Width of the inline popover
59
+ */
60
+ InlinePopoverWidth = '--inline-popover-width',
61
+
62
+ /**
63
+ * Top position of the popover container
64
+ */
65
+ PopoverTop = '--popover-top',
66
+
67
+ /**
68
+ * Left position of the popover container
69
+ */
70
+ PopoverLeft = '--popover-left',
71
+
72
+ /**
73
+ * Offset from left of the inline popover item click on which triggers the nested popover opening
74
+ */
75
+ TriggerItemLeft = '--trigger-item-left',
76
+
77
+ /**
78
+ * Offset from top of the desktop popover item click on which triggers the nested popover opening
79
+ */
80
+ TriggerItemTop = '--trigger-item-top',
81
+ }
@@ -0,0 +1,72 @@
1
+ import type { PopoverItemParams } from '@/types/utils/popover/popover-item';
2
+
3
+ /**
4
+ * Represents single states history item
5
+ */
6
+ interface PopoverStatesHistoryItem {
7
+ /**
8
+ * Popover title
9
+ */
10
+ title?: string;
11
+
12
+ /**
13
+ * Popover items
14
+ */
15
+ items: PopoverItemParams[]
16
+ }
17
+
18
+ /**
19
+ * Manages items history inside popover. Allows to navigate back in history
20
+ */
21
+ export class PopoverStatesHistory {
22
+ /**
23
+ * Previous items states
24
+ */
25
+ private history: PopoverStatesHistoryItem[] = [];
26
+
27
+ /**
28
+ * Push new popover state
29
+ * @param state - new state
30
+ */
31
+ public push(state: PopoverStatesHistoryItem): void {
32
+ this.history.push(state);
33
+ }
34
+
35
+ /**
36
+ * Pop last popover state
37
+ */
38
+ public pop(): PopoverStatesHistoryItem | undefined {
39
+ return this.history.pop();
40
+ }
41
+
42
+ /**
43
+ * Title retrieved from the current state
44
+ */
45
+ public get currentTitle(): string | undefined {
46
+ if (this.history.length === 0) {
47
+ return '';
48
+ }
49
+
50
+ return this.history[this.history.length - 1].title;
51
+ }
52
+
53
+ /**
54
+ * Items list retrieved from the current state
55
+ */
56
+ public get currentItems(): PopoverItemParams[] {
57
+ if (this.history.length === 0) {
58
+ return [];
59
+ }
60
+
61
+ return this.history[this.history.length - 1].items;
62
+ }
63
+
64
+ /**
65
+ * Returns history to initial popover state
66
+ */
67
+ public reset(): void {
68
+ while (this.history.length > 1) {
69
+ this.pop();
70
+ }
71
+ }
72
+ }