@jackuait/blok 0.6.0 → 0.7.0-beta.2

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 (257) hide show
  1. package/README.md +20 -4
  2. package/dist/blok.mjs +2 -2
  3. package/dist/chunks/{blok-BAh1rvUC.mjs → blok-D9Rs29Wo.mjs} +1928 -1793
  4. package/dist/chunks/{inline-tool-convert-DduRc0fF.mjs → constants-DmNIR3I8.mjs} +596 -475
  5. package/dist/chunks/{i18next-loader-CHtGO6IK.mjs → i18next-loader-C2-jYpLi.mjs} +1 -1
  6. package/dist/chunks/index-D7V1g7Oq.mjs +130 -0
  7. package/dist/chunks/{messages-D2NOpHn9.mjs → messages-0Pxnqd4N.mjs} +7 -0
  8. package/dist/chunks/{messages-GSByFygY.mjs → messages-0ZXYUq7S.mjs} +7 -0
  9. package/dist/{messages-BUl_Rcnj.mjs → chunks/messages-2OD2uUDS.mjs} +9 -2
  10. package/dist/{messages-CgTq3QhU.mjs → chunks/messages-7cEMfYzh.mjs} +7 -0
  11. package/dist/{messages-DlJbPF2T.mjs → chunks/messages-8mwfda1Q.mjs} +7 -0
  12. package/dist/{messages-D9ndgBnU.mjs → chunks/messages-B-FqWsBM.mjs} +7 -0
  13. package/dist/{messages-B217znr-.mjs → chunks/messages-B1jzqWiQ.mjs} +7 -0
  14. package/dist/{messages-BcpCubnC.mjs → chunks/messages-B5wk4Ezz.mjs} +7 -0
  15. package/dist/chunks/{messages-DRXWF0PV.mjs → messages-BAZ5Ld8x.mjs} +7 -0
  16. package/dist/{messages-CRJ_mchV.mjs → chunks/messages-BBhGp198.mjs} +7 -0
  17. package/dist/chunks/{messages-yHcs38yI.mjs → messages-BC9IjIb7.mjs} +7 -0
  18. package/dist/chunks/{messages-Cr94GzbX.mjs → messages-BFEmpeV-.mjs} +7 -0
  19. package/dist/chunks/{messages-ucTVgS5G.mjs → messages-BGqzTZy0.mjs} +7 -0
  20. package/dist/{messages-begYOTgC.mjs → chunks/messages-BICs1abK.mjs} +7 -0
  21. package/dist/chunks/{messages-DVQvl8Qj.mjs → messages-BJX6rOnd.mjs} +7 -0
  22. package/dist/chunks/{messages-Chb7k3Rg.mjs → messages-BL2bXRhN.mjs} +7 -0
  23. package/dist/{messages-Phkd7XmE.mjs → chunks/messages-BMs5qdlH.mjs} +7 -0
  24. package/dist/chunks/{messages-Cjjo7yHR.mjs → messages-BRsjUNwB.mjs} +7 -0
  25. package/dist/chunks/{messages-D4qqwVgQ.mjs → messages-BSqV8OUR.mjs} +7 -0
  26. package/dist/chunks/{messages-DviiFSv2.mjs → messages-BTqu3DfG.mjs} +7 -0
  27. package/dist/chunks/{messages-0AbcLMLm.mjs → messages-BXnDEsur.mjs} +7 -0
  28. package/dist/{messages-CmR9ftc_.mjs → chunks/messages-BYcre4-6.mjs} +7 -0
  29. package/dist/{messages-wmi-iFkH.mjs → chunks/messages-BZ9LRJf-.mjs} +7 -0
  30. package/dist/chunks/{messages-D00x4S8o.mjs → messages-BgypBy7y.mjs} +7 -0
  31. package/dist/{messages-96kNZDll.mjs → chunks/messages-BsuGf70G.mjs} +7 -0
  32. package/dist/chunks/{messages-v3GipbFl.mjs → messages-BwaoF4lQ.mjs} +7 -0
  33. package/dist/{messages-DDTQgImT.mjs → chunks/messages-C1l8_7-y.mjs} +7 -0
  34. package/dist/{messages-B1FZ8lxU.mjs → chunks/messages-C5NA_r9v.mjs} +7 -0
  35. package/dist/{messages-Cs8zmZ3L.mjs → chunks/messages-C6zgZ5pA.mjs} +7 -0
  36. package/dist/chunks/{messages-ZjUAIWb1.mjs → messages-CAo5ghFI.mjs} +7 -0
  37. package/dist/{messages-D5S1Dnpm.mjs → chunks/messages-CH9qlJ9I.mjs} +7 -0
  38. package/dist/{messages-D7u2bmP2.mjs → chunks/messages-CI0HqAeS.mjs} +7 -0
  39. package/dist/{messages-DH_jBeED.mjs → chunks/messages-CJJtms9k.mjs} +7 -0
  40. package/dist/{messages-CDBLbUOQ.mjs → chunks/messages-CM2hJqk6.mjs} +7 -0
  41. package/dist/chunks/{messages-8IPXkrDl.mjs → messages-CRMiDPIQ.mjs} +7 -0
  42. package/dist/chunks/{messages-Dzzn6XoD.mjs → messages-CWsZuBj1.mjs} +7 -0
  43. package/dist/chunks/{messages-CW4c4cRk.mjs → messages-C_gLHo6A.mjs} +7 -0
  44. package/dist/{messages-CH4hrauY.mjs → chunks/messages-Cbu-NUDn.mjs} +7 -0
  45. package/dist/{messages-RonBBCnh.mjs → chunks/messages-Cjb_MCeh.mjs} +7 -0
  46. package/dist/chunks/{messages-BJ6zrz2j.mjs → messages-ClXYO9Wn.mjs} +7 -0
  47. package/dist/chunks/{messages-CrCYPCk3.mjs → messages-CsH20vhP.mjs} +7 -0
  48. package/dist/{messages-CzK0LEhb.mjs → chunks/messages-CsjAGhzA.mjs} +7 -0
  49. package/dist/chunks/{messages-BZlmVRwn.mjs → messages-Cx7VKFOE.mjs} +7 -0
  50. package/dist/chunks/{messages-0E0AkrNu.mjs → messages-D3JeBwxo.mjs} +7 -0
  51. package/dist/chunks/{messages-D85FqxgY.mjs → messages-D541fieJ.mjs} +7 -0
  52. package/dist/{messages-4v4MuVEc.mjs → chunks/messages-D7XPdglc.mjs} +7 -0
  53. package/dist/{messages-BC8IN4Bf.mjs → chunks/messages-DBhylfvt.mjs} +7 -0
  54. package/dist/chunks/{messages-B8WNljW3.mjs → messages-DCA120lW.mjs} +7 -0
  55. package/dist/chunks/{messages-Cr49Nt3U.mjs → messages-DCf_xZMN.mjs} +7 -0
  56. package/dist/chunks/{messages-VDriF5Qy.mjs → messages-DDwXKCpe.mjs} +7 -0
  57. package/dist/{messages-b1EdvUm0.mjs → chunks/messages-DNKDlxcy.mjs} +7 -0
  58. package/dist/{messages-L_kl2Qvh.mjs → chunks/messages-DPvEjrGK.mjs} +7 -0
  59. package/dist/chunks/{messages-62v-CLC-.mjs → messages-DQ-AkNxA.mjs} +7 -0
  60. package/dist/chunks/{messages-DdK-nFGm.mjs → messages-DVuvkNap.mjs} +7 -0
  61. package/dist/{messages-DnVlmiNT.mjs → chunks/messages-DaglyqUT.mjs} +7 -0
  62. package/dist/{messages-Bm-E4iRC.mjs → chunks/messages-Di0bAfwA.mjs} +7 -0
  63. package/dist/{messages-D1mn7Zd5.mjs → chunks/messages-DuLct0Yr.mjs} +7 -0
  64. package/dist/{messages-8DeO60Oo.mjs → chunks/messages-DzEYYhZh.mjs} +7 -0
  65. package/dist/chunks/{messages-CfiyT2Wi.mjs → messages-DznNGAB2.mjs} +7 -0
  66. package/dist/chunks/{messages-DXktiao_.mjs → messages-DzoIzyu8.mjs} +7 -0
  67. package/dist/{messages-C_4otP7U.mjs → chunks/messages-QYOGmket.mjs} +7 -0
  68. package/dist/chunks/{messages-nefz1S71.mjs → messages-cEjGDAgI.mjs} +7 -0
  69. package/dist/chunks/{messages-jrncnb-H.mjs → messages-ddhvrdpE.mjs} +7 -0
  70. package/dist/chunks/{messages-DzqM3Fel.mjs → messages-mwfNK5nZ.mjs} +7 -0
  71. package/dist/chunks/{messages-Cl6ayUaq.mjs → messages-nG_vNDte.mjs} +7 -0
  72. package/dist/{messages-C4jL-90N.mjs → chunks/messages-tDq3Owh7.mjs} +7 -0
  73. package/dist/{messages-BI43k_BD.mjs → chunks/messages-x6VJVZKx.mjs} +7 -0
  74. package/dist/full.mjs +30 -27
  75. package/dist/locales.mjs +87 -80
  76. package/dist/{messages-D2NOpHn9.mjs → messages-0Pxnqd4N.mjs} +7 -0
  77. package/dist/{messages-GSByFygY.mjs → messages-0ZXYUq7S.mjs} +7 -0
  78. package/dist/{chunks/messages-BUl_Rcnj.mjs → messages-2OD2uUDS.mjs} +9 -2
  79. package/dist/{chunks/messages-CgTq3QhU.mjs → messages-7cEMfYzh.mjs} +7 -0
  80. package/dist/{chunks/messages-DlJbPF2T.mjs → messages-8mwfda1Q.mjs} +7 -0
  81. package/dist/{chunks/messages-D9ndgBnU.mjs → messages-B-FqWsBM.mjs} +7 -0
  82. package/dist/{chunks/messages-B217znr-.mjs → messages-B1jzqWiQ.mjs} +7 -0
  83. package/dist/{chunks/messages-BcpCubnC.mjs → messages-B5wk4Ezz.mjs} +7 -0
  84. package/dist/{messages-DRXWF0PV.mjs → messages-BAZ5Ld8x.mjs} +7 -0
  85. package/dist/{chunks/messages-CRJ_mchV.mjs → messages-BBhGp198.mjs} +7 -0
  86. package/dist/{messages-yHcs38yI.mjs → messages-BC9IjIb7.mjs} +7 -0
  87. package/dist/{messages-Cr94GzbX.mjs → messages-BFEmpeV-.mjs} +7 -0
  88. package/dist/{messages-ucTVgS5G.mjs → messages-BGqzTZy0.mjs} +7 -0
  89. package/dist/{chunks/messages-begYOTgC.mjs → messages-BICs1abK.mjs} +7 -0
  90. package/dist/{messages-DVQvl8Qj.mjs → messages-BJX6rOnd.mjs} +7 -0
  91. package/dist/{messages-Chb7k3Rg.mjs → messages-BL2bXRhN.mjs} +7 -0
  92. package/dist/{chunks/messages-Phkd7XmE.mjs → messages-BMs5qdlH.mjs} +7 -0
  93. package/dist/{messages-Cjjo7yHR.mjs → messages-BRsjUNwB.mjs} +7 -0
  94. package/dist/{messages-D4qqwVgQ.mjs → messages-BSqV8OUR.mjs} +7 -0
  95. package/dist/{messages-DviiFSv2.mjs → messages-BTqu3DfG.mjs} +7 -0
  96. package/dist/{messages-0AbcLMLm.mjs → messages-BXnDEsur.mjs} +7 -0
  97. package/dist/{chunks/messages-CmR9ftc_.mjs → messages-BYcre4-6.mjs} +7 -0
  98. package/dist/{chunks/messages-wmi-iFkH.mjs → messages-BZ9LRJf-.mjs} +7 -0
  99. package/dist/{messages-D00x4S8o.mjs → messages-BgypBy7y.mjs} +7 -0
  100. package/dist/{chunks/messages-96kNZDll.mjs → messages-BsuGf70G.mjs} +7 -0
  101. package/dist/{messages-v3GipbFl.mjs → messages-BwaoF4lQ.mjs} +7 -0
  102. package/dist/{chunks/messages-DDTQgImT.mjs → messages-C1l8_7-y.mjs} +7 -0
  103. package/dist/{chunks/messages-B1FZ8lxU.mjs → messages-C5NA_r9v.mjs} +7 -0
  104. package/dist/{chunks/messages-Cs8zmZ3L.mjs → messages-C6zgZ5pA.mjs} +7 -0
  105. package/dist/{messages-ZjUAIWb1.mjs → messages-CAo5ghFI.mjs} +7 -0
  106. package/dist/{chunks/messages-D5S1Dnpm.mjs → messages-CH9qlJ9I.mjs} +7 -0
  107. package/dist/{chunks/messages-D7u2bmP2.mjs → messages-CI0HqAeS.mjs} +7 -0
  108. package/dist/{chunks/messages-DH_jBeED.mjs → messages-CJJtms9k.mjs} +7 -0
  109. package/dist/{chunks/messages-CDBLbUOQ.mjs → messages-CM2hJqk6.mjs} +7 -0
  110. package/dist/{messages-8IPXkrDl.mjs → messages-CRMiDPIQ.mjs} +7 -0
  111. package/dist/{messages-Dzzn6XoD.mjs → messages-CWsZuBj1.mjs} +7 -0
  112. package/dist/{messages-CW4c4cRk.mjs → messages-C_gLHo6A.mjs} +7 -0
  113. package/dist/{chunks/messages-CH4hrauY.mjs → messages-Cbu-NUDn.mjs} +7 -0
  114. package/dist/{chunks/messages-RonBBCnh.mjs → messages-Cjb_MCeh.mjs} +7 -0
  115. package/dist/{messages-BJ6zrz2j.mjs → messages-ClXYO9Wn.mjs} +7 -0
  116. package/dist/{messages-CrCYPCk3.mjs → messages-CsH20vhP.mjs} +7 -0
  117. package/dist/{chunks/messages-CzK0LEhb.mjs → messages-CsjAGhzA.mjs} +7 -0
  118. package/dist/{messages-BZlmVRwn.mjs → messages-Cx7VKFOE.mjs} +7 -0
  119. package/dist/{messages-0E0AkrNu.mjs → messages-D3JeBwxo.mjs} +7 -0
  120. package/dist/{messages-D85FqxgY.mjs → messages-D541fieJ.mjs} +7 -0
  121. package/dist/{chunks/messages-4v4MuVEc.mjs → messages-D7XPdglc.mjs} +7 -0
  122. package/dist/{chunks/messages-BC8IN4Bf.mjs → messages-DBhylfvt.mjs} +7 -0
  123. package/dist/{messages-B8WNljW3.mjs → messages-DCA120lW.mjs} +7 -0
  124. package/dist/{messages-Cr49Nt3U.mjs → messages-DCf_xZMN.mjs} +7 -0
  125. package/dist/{messages-VDriF5Qy.mjs → messages-DDwXKCpe.mjs} +7 -0
  126. package/dist/{chunks/messages-b1EdvUm0.mjs → messages-DNKDlxcy.mjs} +7 -0
  127. package/dist/{chunks/messages-L_kl2Qvh.mjs → messages-DPvEjrGK.mjs} +7 -0
  128. package/dist/{messages-62v-CLC-.mjs → messages-DQ-AkNxA.mjs} +7 -0
  129. package/dist/{messages-DdK-nFGm.mjs → messages-DVuvkNap.mjs} +7 -0
  130. package/dist/{chunks/messages-DnVlmiNT.mjs → messages-DaglyqUT.mjs} +7 -0
  131. package/dist/{chunks/messages-Bm-E4iRC.mjs → messages-Di0bAfwA.mjs} +7 -0
  132. package/dist/{chunks/messages-D1mn7Zd5.mjs → messages-DuLct0Yr.mjs} +7 -0
  133. package/dist/{chunks/messages-8DeO60Oo.mjs → messages-DzEYYhZh.mjs} +7 -0
  134. package/dist/{messages-CfiyT2Wi.mjs → messages-DznNGAB2.mjs} +7 -0
  135. package/dist/{messages-DXktiao_.mjs → messages-DzoIzyu8.mjs} +7 -0
  136. package/dist/{chunks/messages-C_4otP7U.mjs → messages-QYOGmket.mjs} +7 -0
  137. package/dist/{messages-nefz1S71.mjs → messages-cEjGDAgI.mjs} +7 -0
  138. package/dist/{messages-jrncnb-H.mjs → messages-ddhvrdpE.mjs} +7 -0
  139. package/dist/{messages-DzqM3Fel.mjs → messages-mwfNK5nZ.mjs} +7 -0
  140. package/dist/{messages-Cl6ayUaq.mjs → messages-nG_vNDte.mjs} +7 -0
  141. package/dist/{chunks/messages-C4jL-90N.mjs → messages-tDq3Owh7.mjs} +7 -0
  142. package/dist/{chunks/messages-BI43k_BD.mjs → messages-x6VJVZKx.mjs} +7 -0
  143. package/dist/tools.mjs +1233 -801
  144. package/package.json +1 -1
  145. package/src/components/constants/data-attributes.ts +7 -0
  146. package/src/components/i18n/locales/am/messages.json +7 -0
  147. package/src/components/i18n/locales/ar/messages.json +7 -0
  148. package/src/components/i18n/locales/az/messages.json +7 -0
  149. package/src/components/i18n/locales/bg/messages.json +7 -0
  150. package/src/components/i18n/locales/bn/messages.json +7 -0
  151. package/src/components/i18n/locales/bs/messages.json +7 -0
  152. package/src/components/i18n/locales/cs/messages.json +7 -0
  153. package/src/components/i18n/locales/da/messages.json +7 -0
  154. package/src/components/i18n/locales/de/messages.json +7 -0
  155. package/src/components/i18n/locales/dv/messages.json +7 -0
  156. package/src/components/i18n/locales/el/messages.json +7 -0
  157. package/src/components/i18n/locales/en/messages.json +7 -0
  158. package/src/components/i18n/locales/es/messages.json +7 -0
  159. package/src/components/i18n/locales/et/messages.json +7 -0
  160. package/src/components/i18n/locales/fa/messages.json +7 -0
  161. package/src/components/i18n/locales/fi/messages.json +7 -0
  162. package/src/components/i18n/locales/fil/messages.json +7 -0
  163. package/src/components/i18n/locales/fr/messages.json +7 -0
  164. package/src/components/i18n/locales/gu/messages.json +7 -0
  165. package/src/components/i18n/locales/he/messages.json +7 -0
  166. package/src/components/i18n/locales/hi/messages.json +7 -0
  167. package/src/components/i18n/locales/hr/messages.json +7 -0
  168. package/src/components/i18n/locales/hu/messages.json +7 -0
  169. package/src/components/i18n/locales/hy/messages.json +7 -0
  170. package/src/components/i18n/locales/id/messages.json +7 -0
  171. package/src/components/i18n/locales/it/messages.json +7 -0
  172. package/src/components/i18n/locales/ja/messages.json +7 -0
  173. package/src/components/i18n/locales/ka/messages.json +7 -0
  174. package/src/components/i18n/locales/km/messages.json +7 -0
  175. package/src/components/i18n/locales/kn/messages.json +7 -0
  176. package/src/components/i18n/locales/ko/messages.json +7 -0
  177. package/src/components/i18n/locales/ku/messages.json +7 -0
  178. package/src/components/i18n/locales/lo/messages.json +7 -0
  179. package/src/components/i18n/locales/lt/messages.json +7 -0
  180. package/src/components/i18n/locales/lv/messages.json +7 -0
  181. package/src/components/i18n/locales/mk/messages.json +7 -0
  182. package/src/components/i18n/locales/ml/messages.json +7 -0
  183. package/src/components/i18n/locales/mn/messages.json +7 -0
  184. package/src/components/i18n/locales/mr/messages.json +7 -0
  185. package/src/components/i18n/locales/ms/messages.json +7 -0
  186. package/src/components/i18n/locales/my/messages.json +7 -0
  187. package/src/components/i18n/locales/ne/messages.json +7 -0
  188. package/src/components/i18n/locales/nl/messages.json +7 -0
  189. package/src/components/i18n/locales/no/messages.json +7 -0
  190. package/src/components/i18n/locales/pa/messages.json +7 -0
  191. package/src/components/i18n/locales/pl/messages.json +7 -0
  192. package/src/components/i18n/locales/ps/messages.json +7 -0
  193. package/src/components/i18n/locales/pt/messages.json +7 -0
  194. package/src/components/i18n/locales/ro/messages.json +7 -0
  195. package/src/components/i18n/locales/ru/messages.json +7 -0
  196. package/src/components/i18n/locales/sd/messages.json +7 -0
  197. package/src/components/i18n/locales/si/messages.json +7 -0
  198. package/src/components/i18n/locales/sk/messages.json +7 -0
  199. package/src/components/i18n/locales/sl/messages.json +7 -0
  200. package/src/components/i18n/locales/sq/messages.json +7 -0
  201. package/src/components/i18n/locales/sr/messages.json +7 -0
  202. package/src/components/i18n/locales/sv/messages.json +7 -0
  203. package/src/components/i18n/locales/sw/messages.json +7 -0
  204. package/src/components/i18n/locales/ta/messages.json +7 -0
  205. package/src/components/i18n/locales/te/messages.json +7 -0
  206. package/src/components/i18n/locales/th/messages.json +7 -0
  207. package/src/components/i18n/locales/tr/messages.json +7 -0
  208. package/src/components/i18n/locales/ug/messages.json +7 -0
  209. package/src/components/i18n/locales/uk/messages.json +7 -0
  210. package/src/components/i18n/locales/ur/messages.json +7 -0
  211. package/src/components/i18n/locales/vi/messages.json +7 -0
  212. package/src/components/i18n/locales/yi/messages.json +7 -0
  213. package/src/components/i18n/locales/zh/messages.json +7 -0
  214. package/src/components/icons/index.ts +44 -7
  215. package/src/components/modules/blockEvents/composers/keyboardNavigation.ts +44 -2
  216. package/src/components/modules/blockEvents/composers/markdownShortcuts.ts +54 -2
  217. package/src/components/modules/blockEvents/constants.ts +12 -0
  218. package/src/components/modules/blockEvents/index.ts +1 -3
  219. package/src/components/modules/blockManager/blockManager.ts +16 -0
  220. package/src/components/modules/blockManager/operations.ts +106 -9
  221. package/src/components/modules/blockSelection.ts +2 -0
  222. package/src/components/modules/caret.ts +49 -4
  223. package/src/components/modules/drag/DragController.ts +34 -2
  224. package/src/components/modules/paste/handlers/blok-data-handler.ts +50 -3
  225. package/src/components/modules/toolbar/index.ts +11 -16
  226. package/src/components/modules/ui.ts +12 -0
  227. package/src/components/ui/toolbox.ts +26 -2
  228. package/src/components/utils/notifier/draw.ts +116 -14
  229. package/src/components/utils/notifier/index.ts +31 -4
  230. package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.const.ts +2 -2
  231. package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.ts +7 -7
  232. package/src/components/utils/popover/components/popover-item/popover-item-separator/popover-item-separator.const.ts +2 -2
  233. package/src/components/utils/popover/components/search-input/search-input.const.ts +1 -1
  234. package/src/components/utils/popover/popover-abstract.ts +5 -2
  235. package/src/components/utils/popover/popover-desktop.ts +39 -2
  236. package/src/components/utils/popover/popover.const.ts +3 -3
  237. package/src/full.ts +4 -0
  238. package/src/stories/Placeholder.stories.ts +7 -2
  239. package/src/stories/helpers.ts +2 -0
  240. package/src/styles/main.css +64 -10
  241. package/src/tools/header/index.ts +307 -26
  242. package/src/tools/index.ts +3 -1
  243. package/src/tools/table/index.ts +2 -3
  244. package/src/tools/table/table-add-controls.ts +29 -1
  245. package/src/tools/table/table-cell-blocks.ts +93 -0
  246. package/src/tools/toggle/block-operations.ts +110 -0
  247. package/src/tools/toggle/constants.ts +49 -0
  248. package/src/tools/toggle/dom-builder.ts +152 -0
  249. package/src/tools/toggle/index.ts +302 -0
  250. package/src/tools/toggle/toggle-keyboard.ts +156 -0
  251. package/src/tools/toggle/toggle-lifecycle.ts +81 -0
  252. package/src/tools/toggle/toggle-shortcuts.ts +113 -0
  253. package/src/tools/toggle/types.ts +21 -0
  254. package/types/full.d.ts +2 -0
  255. package/types/tools-entry.d.ts +2 -1
  256. package/types/utils/popover/popover.d.ts +8 -0
  257. package/dist/chunks/index-DBWWKrDe.mjs +0 -78
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Toggle Tool for the Blok Editor
3
+ * Provides collapsible toggle blocks with an arrow indicator.
4
+ *
5
+ * @license MIT
6
+ */
7
+
8
+ import type {
9
+ API,
10
+ BlockTool,
11
+ BlockToolConstructorOptions,
12
+ ToolboxConfig,
13
+ ConversionConfig,
14
+ ToolSanitizerConfig,
15
+ PasteConfig,
16
+ PasteEvent,
17
+ } from '../../../types';
18
+ import type { MenuConfig } from '../../../types/tools/menu-config';
19
+
20
+ import {
21
+ saveToggleItem,
22
+ mergeToggleItemData,
23
+ setToggleItemData,
24
+ parseHTML,
25
+ } from './block-operations';
26
+ import { PLACEHOLDER_KEY, TOOL_NAME } from './constants';
27
+ import { IconToggleList } from '../../components/icons';
28
+ import { renderToggleItem, updateArrowState, updateChildrenVisibility } from './toggle-lifecycle';
29
+ import { handleToggleEnter, handleToggleBackspace } from './toggle-keyboard';
30
+ import type { ToggleItemData, ToggleItemConfig } from './types';
31
+
32
+ export class ToggleItem implements BlockTool {
33
+ private api: API;
34
+ private readOnly: boolean;
35
+ private _settings: ToggleItemConfig;
36
+ private _data: ToggleItemData;
37
+ private _element: HTMLElement | null = null;
38
+ private _contentElement: HTMLElement | null = null;
39
+ private _arrowElement: HTMLElement | null = null;
40
+ private _isOpen: boolean = false;
41
+
42
+ private blockId?: string;
43
+
44
+ constructor({ data, config, api, readOnly, block }: BlockToolConstructorOptions<ToggleItemData, ToggleItemConfig>) {
45
+ this.api = api;
46
+ this.readOnly = readOnly;
47
+ this._settings = config || {};
48
+ this._data = this.normalizeData(data);
49
+
50
+ if (block) {
51
+ this.blockId = block.id;
52
+ }
53
+ }
54
+
55
+ private normalizeData(data: ToggleItemData | Record<string, never>): ToggleItemData {
56
+ if (typeof data === 'object' && data !== null && 'text' in data) {
57
+ return {
58
+ text: typeof data.text === 'string' ? data.text : '',
59
+ };
60
+ }
61
+
62
+ return { text: '' };
63
+ }
64
+
65
+ private get placeholder(): string {
66
+ if (this._settings.placeholder) {
67
+ return this._settings.placeholder;
68
+ }
69
+
70
+ const translated = this.api.i18n.t(PLACEHOLDER_KEY);
71
+
72
+ if (translated !== PLACEHOLDER_KEY) {
73
+ return translated;
74
+ }
75
+
76
+ return 'Toggle';
77
+ }
78
+
79
+ public render(): HTMLElement {
80
+ const result = renderToggleItem({
81
+ data: this._data,
82
+ readOnly: this.readOnly,
83
+ isOpen: this._isOpen,
84
+ placeholder: this.placeholder,
85
+ keydownHandler: this.readOnly ? null : this.handleKeyDown.bind(this),
86
+ onArrowClick: () => this.toggleOpen(),
87
+ });
88
+
89
+ this._element = result.wrapper;
90
+ this._contentElement = result.contentElement;
91
+ this._arrowElement = result.arrowElement;
92
+
93
+ return this._element;
94
+ }
95
+
96
+ public rendered(): void {
97
+ this.updateChildrenVisibility();
98
+ }
99
+
100
+ public save(): ToggleItemData {
101
+ return saveToggleItem(this._data, this._element, this.getContentElement.bind(this));
102
+ }
103
+
104
+ public validate(_blockData: ToggleItemData): boolean {
105
+ return true;
106
+ }
107
+
108
+ public merge(data: ToggleItemData): void {
109
+ mergeToggleItemData(
110
+ {
111
+ data: this._data,
112
+ getContentElement: this.getContentElement.bind(this),
113
+ parseHTML,
114
+ },
115
+ data
116
+ );
117
+ }
118
+
119
+ public onPaste(event: PasteEvent): void {
120
+ const detail = event.detail;
121
+
122
+ if (!('data' in detail)) {
123
+ return;
124
+ }
125
+
126
+ const content = detail.data as HTMLElement;
127
+ const summary = content.querySelector('summary');
128
+ const text = summary !== null ? summary.innerHTML : content.innerHTML;
129
+
130
+ this._data = { text };
131
+
132
+ const contentEl = this.getContentElement();
133
+
134
+ if (contentEl !== null) {
135
+ contentEl.innerHTML = text;
136
+ }
137
+ }
138
+
139
+ public setData(newData: ToggleItemData): boolean {
140
+ const result = setToggleItemData(
141
+ this._data,
142
+ newData,
143
+ this.getContentElement.bind(this)
144
+ );
145
+
146
+ this._data = result.newData;
147
+
148
+ this.updateChildrenVisibility();
149
+
150
+ return result.inPlace;
151
+ }
152
+
153
+ public renderSettings(): MenuConfig {
154
+ return [];
155
+ }
156
+
157
+ /**
158
+ * Expand the toggle (no-op if already expanded).
159
+ * Can be called externally via block.call('expand').
160
+ */
161
+ public expand(): void {
162
+ if (this._isOpen) {
163
+ return;
164
+ }
165
+
166
+ this.setOpenState(true);
167
+ }
168
+
169
+ /**
170
+ * Collapse the toggle (no-op if already collapsed).
171
+ * Can be called externally via block.call('collapse').
172
+ */
173
+ public collapse(): void {
174
+ if (!this._isOpen) {
175
+ return;
176
+ }
177
+
178
+ this.setOpenState(false);
179
+ }
180
+
181
+ private getContentElement(): HTMLElement | null {
182
+ return this._contentElement;
183
+ }
184
+
185
+ private setOpenState(open: boolean): void {
186
+ this._isOpen = open;
187
+
188
+ if (this._arrowElement && this._element) {
189
+ updateArrowState(this._arrowElement, this._element, this._isOpen);
190
+ }
191
+
192
+ this.updateChildrenVisibility();
193
+ }
194
+
195
+ private toggleOpen(): void {
196
+ this.setOpenState(!this._isOpen);
197
+ }
198
+
199
+ private updateChildrenVisibility(): void {
200
+ if (this.blockId === undefined) {
201
+ return;
202
+ }
203
+
204
+ updateChildrenVisibility(this.api, this.blockId, this._isOpen);
205
+ }
206
+
207
+ private handleKeyDown(event: KeyboardEvent): void {
208
+ if (event.key === 'Enter' && !event.shiftKey) {
209
+ event.preventDefault();
210
+ void this.handleEnter();
211
+
212
+ return;
213
+ }
214
+
215
+ if (event.key === 'Backspace') {
216
+ void this.handleBackspace(event);
217
+
218
+ return;
219
+ }
220
+ }
221
+
222
+ private createKeyboardContext(): Parameters<typeof handleToggleEnter>[0] {
223
+ return {
224
+ api: this.api,
225
+ blockId: this.blockId,
226
+ data: this._data,
227
+ element: this._element,
228
+ getContentElement: this.getContentElement.bind(this),
229
+ syncContentFromDOM: this.syncContentFromDOM.bind(this),
230
+ isOpen: this._isOpen,
231
+ setOpen: (open: boolean) => {
232
+ this._isOpen = open;
233
+ },
234
+ };
235
+ }
236
+
237
+ private async handleEnter(): Promise<void> {
238
+ await handleToggleEnter(this.createKeyboardContext());
239
+ }
240
+
241
+ private async handleBackspace(event: KeyboardEvent): Promise<void> {
242
+ await handleToggleBackspace(this.createKeyboardContext(), event);
243
+ }
244
+
245
+ private syncContentFromDOM(): void {
246
+ const contentEl = this.getContentElement();
247
+
248
+ if (contentEl) {
249
+ this._data.text = contentEl.innerHTML;
250
+ }
251
+ }
252
+
253
+ public static get toolbox(): ToolboxConfig {
254
+ return {
255
+ icon: IconToggleList,
256
+ title: 'Toggle list',
257
+ titleKey: 'toggleList',
258
+ name: TOOL_NAME,
259
+ searchTerms: ['toggle', 'collapse', 'expand', 'accordion'],
260
+ shortcut: '>',
261
+ };
262
+ }
263
+
264
+ public static get conversionConfig(): ConversionConfig {
265
+ return {
266
+ export: 'text',
267
+ import: 'text',
268
+ };
269
+ }
270
+
271
+ public static get sanitize(): ToolSanitizerConfig {
272
+ return {
273
+ text: {
274
+ br: true,
275
+ a: {
276
+ href: true,
277
+ target: '_blank',
278
+ rel: 'nofollow',
279
+ },
280
+ b: true,
281
+ i: true,
282
+ mark: {
283
+ class: true,
284
+ style: true,
285
+ },
286
+ code: true,
287
+ },
288
+ };
289
+ }
290
+
291
+ public static get pasteConfig(): PasteConfig {
292
+ return {
293
+ tags: ['DETAILS'],
294
+ };
295
+ }
296
+
297
+ public static get isReadOnlySupported(): boolean {
298
+ return true;
299
+ }
300
+ }
301
+
302
+ export type { ToggleItemConfig, ToggleItemData };
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Toggle Keyboard - Handles keyboard interactions for toggle items.
3
+ *
4
+ * Extracted from ToggleItem to reduce file size.
5
+ */
6
+
7
+ import type { API } from '../../../types';
8
+
9
+ import { isCaretAtStartOfInput } from '../../components/utils/caret';
10
+
11
+ import { TOOL_NAME } from './constants';
12
+ import type { ToggleItemData } from './types';
13
+
14
+ /**
15
+ * Context for toggle keyboard operations
16
+ */
17
+ export interface ToggleKeyboardContext {
18
+ api: API;
19
+ blockId: string | undefined;
20
+ data: ToggleItemData;
21
+ element: HTMLElement | null;
22
+ getContentElement: () => HTMLElement | null;
23
+ syncContentFromDOM: () => void;
24
+ isOpen: boolean;
25
+ setOpen: (open: boolean) => void;
26
+ }
27
+
28
+ /**
29
+ * Handle Enter key - sync content from DOM and split the block at the caret position.
30
+ *
31
+ * When the toggle is open and the caret is at the end of the content,
32
+ * creates a child paragraph inside the toggle instead of splitting.
33
+ *
34
+ * @param context - The toggle keyboard context
35
+ */
36
+ export const handleToggleEnter = async (context: ToggleKeyboardContext): Promise<void> => {
37
+ const { api, blockId, data, getContentElement, syncContentFromDOM, isOpen } = context;
38
+
39
+ syncContentFromDOM();
40
+
41
+ if (blockId === undefined) {
42
+ return;
43
+ }
44
+
45
+ const contentEl = getContentElement();
46
+ const selection = window.getSelection();
47
+
48
+ if (!contentEl || !selection || selection.rangeCount === 0) {
49
+ return;
50
+ }
51
+
52
+ const range = selection.getRangeAt(0);
53
+ const { beforeContent, afterContent } = splitContentAtRange(contentEl, range);
54
+
55
+ const currentBlockIndex = api.blocks.getBlockIndex(blockId) ?? api.blocks.getCurrentBlockIndex();
56
+
57
+ /**
58
+ * When toggle is open and caret is at the end (no content after caret),
59
+ * create a child paragraph inside the toggle rather than a sibling toggle.
60
+ */
61
+ if (isOpen && afterContent === '') {
62
+ const newBlock = api.blocks.insert('paragraph', { text: '' }, {}, currentBlockIndex + 1, true);
63
+
64
+ api.blocks.setBlockParent(newBlock.id, blockId);
65
+
66
+ return;
67
+ }
68
+
69
+ api.blocks.splitBlock(
70
+ blockId,
71
+ { text: beforeContent },
72
+ TOOL_NAME,
73
+ { text: afterContent },
74
+ currentBlockIndex + 1
75
+ );
76
+
77
+ data.text = beforeContent;
78
+ };
79
+
80
+ /**
81
+ * Handle Backspace key - convert to paragraph when content is empty and caret is at start.
82
+ *
83
+ * When the caret is at the very start of the content element AND the content is empty,
84
+ * converts the toggle to a paragraph block. If the caret is NOT at start, lets the
85
+ * browser handle it (does nothing).
86
+ *
87
+ * @param context - The toggle keyboard context
88
+ * @param event - The keyboard event
89
+ */
90
+ export const handleToggleBackspace = async (
91
+ context: ToggleKeyboardContext,
92
+ event: KeyboardEvent
93
+ ): Promise<void> => {
94
+ const { api, blockId, data, getContentElement, syncContentFromDOM } = context;
95
+
96
+ syncContentFromDOM();
97
+
98
+ if (blockId === undefined) {
99
+ return;
100
+ }
101
+
102
+ const contentEl = getContentElement();
103
+
104
+ if (!contentEl) {
105
+ return;
106
+ }
107
+
108
+ if (!isCaretAtStartOfInput(contentEl)) {
109
+ return;
110
+ }
111
+
112
+ const text = data.text;
113
+
114
+ if (text !== '') {
115
+ return;
116
+ }
117
+
118
+ event.preventDefault();
119
+
120
+ await api.blocks.convert(blockId, 'paragraph', { text });
121
+ };
122
+
123
+ /**
124
+ * Split content element's HTML at the given range position.
125
+ *
126
+ * @param contentEl - The contenteditable element containing text
127
+ * @param range - The current selection range
128
+ * @returns Object with before/after HTML content
129
+ */
130
+ const splitContentAtRange = (
131
+ contentEl: HTMLElement,
132
+ range: Range
133
+ ): { beforeContent: string; afterContent: string } => {
134
+ if (!contentEl.lastChild) {
135
+ return { beforeContent: '', afterContent: '' };
136
+ }
137
+
138
+ const beforeRange = document.createRange();
139
+ beforeRange.setStart(contentEl, 0);
140
+ beforeRange.setEnd(range.startContainer, range.startOffset);
141
+
142
+ const afterRange = document.createRange();
143
+ afterRange.setStart(range.endContainer, range.endOffset);
144
+ afterRange.setEndAfter(contentEl.lastChild);
145
+
146
+ const beforeDiv = document.createElement('div');
147
+ beforeDiv.appendChild(beforeRange.cloneContents());
148
+
149
+ const afterDiv = document.createElement('div');
150
+ afterDiv.appendChild(afterRange.cloneContents());
151
+
152
+ return {
153
+ beforeContent: beforeDiv.innerHTML,
154
+ afterContent: afterDiv.innerHTML,
155
+ };
156
+ };
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Toggle Lifecycle - Lifecycle methods for ToggleItem (render, state updates).
3
+ *
4
+ * Extracted from ToggleItem to reduce file size.
5
+ */
6
+
7
+ import type { API } from '../../../types';
8
+
9
+ import { setupPlaceholder } from '../../components/utils/placeholder';
10
+
11
+ import { TOGGLE_ATTR } from './constants';
12
+ import { buildToggleItem } from './dom-builder';
13
+ import type { ToggleDOMBuilderContext } from './dom-builder';
14
+
15
+ /**
16
+ * Context for rendering a toggle item
17
+ */
18
+ export interface ToggleRenderContext extends ToggleDOMBuilderContext {
19
+ placeholder: string;
20
+ }
21
+
22
+ /**
23
+ * Result of rendering a toggle item
24
+ */
25
+ export interface ToggleRenderResult {
26
+ wrapper: HTMLElement;
27
+ contentElement: HTMLElement;
28
+ arrowElement: HTMLElement;
29
+ }
30
+
31
+ /**
32
+ * Render a toggle item with placeholder support.
33
+ *
34
+ * @param context - The render context
35
+ * @returns Object containing the wrapper, content, and arrow elements
36
+ */
37
+ export const renderToggleItem = (context: ToggleRenderContext): ToggleRenderResult => {
38
+ const result = buildToggleItem(context);
39
+
40
+ if (result.contentElement) {
41
+ setupPlaceholder(result.contentElement, context.placeholder);
42
+ }
43
+
44
+ return result;
45
+ };
46
+
47
+ /**
48
+ * Update the arrow rotation and wrapper's open state attribute.
49
+ *
50
+ * @param arrowEl - The arrow element to rotate
51
+ * @param wrapper - The wrapper element to update the open attribute on
52
+ * @param isOpen - Whether the toggle is open
53
+ */
54
+ export const updateArrowState = (arrowEl: HTMLElement, wrapper: HTMLElement, isOpen: boolean): void => {
55
+ const { style } = arrowEl;
56
+
57
+ style.transform = isOpen ? 'rotate(90deg)' : '';
58
+ arrowEl.setAttribute('aria-label', isOpen ? 'Collapse' : 'Expand');
59
+ arrowEl.setAttribute('aria-expanded', String(isOpen));
60
+ wrapper.setAttribute(TOGGLE_ATTR.toggleOpen, String(isOpen));
61
+ };
62
+
63
+ /**
64
+ * Show or hide child block holders based on the toggle's open state.
65
+ * Children are hidden via the 'hidden' CSS class (display: none), not removed from the DOM.
66
+ *
67
+ * @param api - Blok API instance
68
+ * @param blockId - The toggle block's id
69
+ * @param isOpen - Whether the toggle is currently open (expanded)
70
+ */
71
+ export const updateChildrenVisibility = (api: API, blockId: string, isOpen: boolean): void => {
72
+ const children = api.blocks.getChildren(blockId);
73
+
74
+ for (const child of children) {
75
+ if (isOpen) {
76
+ child.holder.classList.remove('hidden');
77
+ } else {
78
+ child.holder.classList.add('hidden');
79
+ }
80
+ }
81
+ };
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Toggle Shortcuts - Manages the collapse/expand-all keyboard shortcut (CMD+ALT+T).
3
+ *
4
+ * Iterates all blocks in the editor and toggles all collapsible blocks
5
+ * (toggle blocks and toggle headings):
6
+ * - If any collapsible block is collapsed, expands all
7
+ * - If all collapsible blocks are expanded, collapses all
8
+ */
9
+
10
+ import type { API } from '../../../types';
11
+
12
+ import { Shortcuts } from '../../components/utils/shortcuts';
13
+
14
+ import { TOGGLE_ATTR } from './constants';
15
+
16
+ const COLLAPSE_EXPAND_ALL_SHORTCUT = 'CMD+ALT+T';
17
+
18
+ /**
19
+ * Manages the collapse/expand-all shortcut for toggle blocks.
20
+ */
21
+ export class ToggleShortcuts {
22
+ private readonly api: API;
23
+ private readonly wrapper: HTMLElement;
24
+ private registered = false;
25
+
26
+ constructor(api: API, wrapper: HTMLElement) {
27
+ this.api = api;
28
+ this.wrapper = wrapper;
29
+ }
30
+
31
+ /**
32
+ * Register the CMD+ALT+T shortcut on the document.
33
+ */
34
+ public register(): void {
35
+ if (this.registered) {
36
+ return;
37
+ }
38
+
39
+ Shortcuts.add({
40
+ name: COLLAPSE_EXPAND_ALL_SHORTCUT,
41
+ on: document,
42
+ handler: (event: KeyboardEvent) => {
43
+ if (!this.shouldHandle(event)) {
44
+ return;
45
+ }
46
+
47
+ event.preventDefault();
48
+ this.toggleAll();
49
+ },
50
+ });
51
+
52
+ this.registered = true;
53
+ }
54
+
55
+ /**
56
+ * Unregister the shortcut.
57
+ */
58
+ public unregister(): void {
59
+ if (!this.registered) {
60
+ return;
61
+ }
62
+
63
+ Shortcuts.remove(document, COLLAPSE_EXPAND_ALL_SHORTCUT);
64
+ this.registered = false;
65
+ }
66
+
67
+ /**
68
+ * Only handle the shortcut if the event target is within the editor wrapper.
69
+ */
70
+ private shouldHandle(event: KeyboardEvent): boolean {
71
+ const target = event.target;
72
+
73
+ return target instanceof HTMLElement && this.wrapper.contains(target);
74
+ }
75
+
76
+ /**
77
+ * Toggle all collapsible blocks (toggle blocks and toggle headings).
78
+ * If any is collapsed, expand all. If all are expanded, collapse all.
79
+ */
80
+ private toggleAll(): void {
81
+ const blockCount = this.api.blocks.getBlocksCount();
82
+ const toggleBlocks: { call: (method: string) => void; isOpen: boolean }[] = [];
83
+
84
+ for (const i of Array.from({ length: blockCount }, (_, idx) => idx)) {
85
+ const block = this.api.blocks.getBlockByIndex(i);
86
+
87
+ if (block === undefined) {
88
+ continue;
89
+ }
90
+
91
+ const toggleWrapper = block.holder.querySelector(`[${TOGGLE_ATTR.toggleOpen}]`);
92
+
93
+ if (toggleWrapper === null) {
94
+ continue;
95
+ }
96
+
97
+ const isOpen = toggleWrapper.getAttribute(TOGGLE_ATTR.toggleOpen) === 'true';
98
+
99
+ toggleBlocks.push({ call: (method: string) => block.call(method), isOpen });
100
+ }
101
+
102
+ if (toggleBlocks.length === 0) {
103
+ return;
104
+ }
105
+
106
+ const anyCollapsed = toggleBlocks.some((b) => !b.isOpen);
107
+ const method = anyCollapsed ? 'expand' : 'collapse';
108
+
109
+ for (const block of toggleBlocks) {
110
+ block.call(method);
111
+ }
112
+ }
113
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Type definitions for the Toggle tool
3
+ */
4
+
5
+ import type { BlockToolData } from '../../../types';
6
+
7
+ /**
8
+ * Tool's input and output data format
9
+ */
10
+ export interface ToggleItemData extends BlockToolData {
11
+ /** Toggle item text content (can include HTML) */
12
+ text: string;
13
+ }
14
+
15
+ /**
16
+ * Tool's config from Editor
17
+ */
18
+ export interface ToggleItemConfig {
19
+ /** Custom placeholder text for empty toggle items */
20
+ placeholder?: string;
21
+ }
package/types/full.d.ts CHANGED
@@ -17,6 +17,7 @@ export {
17
17
  Bold,
18
18
  Italic,
19
19
  Link,
20
+ Marker,
20
21
  Convert,
21
22
  Delete,
22
23
  defaultBlockTools,
@@ -76,5 +77,6 @@ export const allTools: {
76
77
  readonly bold: { readonly class: InlineToolConstructable };
77
78
  readonly italic: { readonly class: InlineToolConstructable };
78
79
  readonly link: { readonly class: InlineToolConstructable };
80
+ readonly marker: { readonly class: InlineToolConstructable };
79
81
  readonly convertTo: { readonly class: InlineToolConstructable };
80
82
  };
@@ -28,6 +28,7 @@ export const Bold: InlineToolConstructable;
28
28
  export const Italic: InlineToolConstructable;
29
29
  export const Link: InlineToolConstructable;
30
30
  export const Convert: InlineToolConstructable;
31
+ export const Marker: InlineToolConstructable;
31
32
 
32
33
  // Block tunes
33
34
  export const Delete: BlockTuneConstructable;
@@ -49,5 +50,5 @@ export const defaultInlineTools: {
49
50
  readonly bold: {};
50
51
  readonly italic: {};
51
52
  readonly link: {};
52
- readonly convertTo: {};
53
+ readonly marker: {};
53
54
  };