@jackuait/blok 0.8.2 → 0.8.3-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 (377) hide show
  1. package/dist/blok.mjs +2 -2
  2. package/dist/chunks/am-CHDDMHkd.mjs +16490 -0
  3. package/dist/chunks/ar-DoqfNqut.mjs +19245 -0
  4. package/dist/chunks/az-C34P9iEa.mjs +14694 -0
  5. package/dist/chunks/bg-jroXLY8Y.mjs +15432 -0
  6. package/dist/chunks/{blok-GAbVCHTV.mjs → blok-0-8moMz9.mjs} +2090 -2052
  7. package/dist/chunks/bn-BRI-WqxY.mjs +16150 -0
  8. package/dist/chunks/bs-CCGUpNHu.mjs +12536 -0
  9. package/dist/chunks/{constants-CyDHDZyH.mjs → constants-PWnlOOrQ.mjs} +211 -172
  10. package/dist/chunks/cs-D5qZOGuc.mjs +22809 -0
  11. package/dist/chunks/da-DrJ7W37K.mjs +14573 -0
  12. package/dist/chunks/de-BW6-kp2c.mjs +16366 -0
  13. package/dist/chunks/el-C-Vc_Otu.mjs +16339 -0
  14. package/dist/chunks/es-B6fI5K9i.mjs +13597 -0
  15. package/dist/chunks/et-BhVlZ-Yz.mjs +14747 -0
  16. package/dist/chunks/fa-D55Ijdqa.mjs +16368 -0
  17. package/dist/chunks/fi-jNLjhKUQ.mjs +14408 -0
  18. package/dist/chunks/fil-DYd0T5aX.mjs +15915 -0
  19. package/dist/chunks/fr-yxy5xWw_.mjs +17010 -0
  20. package/dist/chunks/gu-CcY_LJe7.mjs +19021 -0
  21. package/dist/chunks/he-DL9s7wNw.mjs +15047 -0
  22. package/dist/chunks/hi-C8eGXgw5.mjs +15946 -0
  23. package/dist/chunks/hr-DLpybOhU.mjs +15099 -0
  24. package/dist/chunks/hu-BkT0gT00.mjs +16564 -0
  25. package/dist/chunks/hy-CVFDCp2S.mjs +12823 -0
  26. package/dist/chunks/{i18next-loader-p-7ioTwr.mjs → i18next-loader-BCAGutUy.mjs} +2 -2
  27. package/dist/chunks/id-0P4W9Az0.mjs +16690 -0
  28. package/dist/chunks/it-mLY6_uoW.mjs +19054 -0
  29. package/dist/chunks/ja-7RkeRNWG.mjs +15708 -0
  30. package/dist/chunks/ka-C7Lx-Qsh.mjs +13049 -0
  31. package/dist/chunks/km-Q8udaraH.mjs +12319 -0
  32. package/dist/chunks/kn-BiETM-iq.mjs +19123 -0
  33. package/dist/chunks/ko-tiB80pF1.mjs +17322 -0
  34. package/dist/chunks/ku-CY-OABkR.mjs +236 -0
  35. package/dist/chunks/{lightweight-i18n-BPeH69Dl.mjs → lightweight-i18n-CNUuUkuo.mjs} +31 -1
  36. package/dist/chunks/lo-CTBhEnyk.mjs +13576 -0
  37. package/dist/chunks/lt-BHKHEtqK.mjs +14587 -0
  38. package/dist/chunks/lv-DWxgtfUg.mjs +15042 -0
  39. package/dist/chunks/{messages-BHf_VcXb2.mjs → messages-2i0z2hFq2.mjs} +32 -2
  40. package/dist/{messages-8zo-T-Nx2.mjs → chunks/messages-4epWYTzK.mjs} +32 -2
  41. package/dist/chunks/{messages-DgZnRQRS.mjs → messages-B-x11A7Z.mjs} +32 -2
  42. package/dist/chunks/{messages-C03I_oR-2.mjs → messages-B1mCwtgm2.mjs} +32 -2
  43. package/dist/{messages-C5hD5pSd2.mjs → chunks/messages-B2Xnfn7m2.mjs} +32 -2
  44. package/dist/chunks/{messages-B-i-d1Bc.mjs → messages-B38lWmza.mjs} +32 -2
  45. package/dist/{messages-BRC9E_sp.mjs → chunks/messages-B3VMWaO8.mjs} +32 -2
  46. package/dist/{messages-BrcgNZOJ.mjs → chunks/messages-B6n2OYKJ.mjs} +32 -2
  47. package/dist/chunks/{messages-CIugNDDO2.mjs → messages-B847kJa02.mjs} +32 -2
  48. package/dist/chunks/{messages-CH_cexo62.mjs → messages-B8nL5cPA2.mjs} +32 -2
  49. package/dist/chunks/{messages-Bdk5tBNu.mjs → messages-BHMUmX3N.mjs} +32 -2
  50. package/dist/chunks/{messages-LL3Tflph.mjs → messages-BN78Am3l2.mjs} +32 -2
  51. package/dist/chunks/{messages-BIrkzbBP.mjs → messages-BRa1Itk_.mjs} +32 -2
  52. package/dist/chunks/{messages-BtS6JWMT.mjs → messages-BleThZm5.mjs} +32 -2
  53. package/dist/{messages-DHJ1fZLL.mjs → chunks/messages-Bo2PcQoc.mjs} +32 -2
  54. package/dist/{messages-D5rnT-BC.mjs → chunks/messages-Bqk7cuZY.mjs} +32 -2
  55. package/dist/chunks/{messages-Di7mfvB8.mjs → messages-BrsB1FRe.mjs} +32 -2
  56. package/dist/{messages-CsmTziC6.mjs → chunks/messages-ByeBRHpJ.mjs} +32 -2
  57. package/dist/{messages-C7Rz00Tp.mjs → chunks/messages-C35b_LVM.mjs} +32 -2
  58. package/dist/{messages-Co26RSCV2.mjs → chunks/messages-CAH4L_Mq2.mjs} +32 -2
  59. package/dist/chunks/{messages-BMzmli1K.mjs → messages-CBa6-NHn.mjs} +32 -2
  60. package/dist/chunks/{messages-wUoSWFsJ2.mjs → messages-CCywXuFz2.mjs} +32 -2
  61. package/dist/chunks/{messages-4OvVdaG52.mjs → messages-CDZrOiaR.mjs} +32 -2
  62. package/dist/{messages-C92tAUYT2.mjs → chunks/messages-CEVMB1TN2.mjs} +32 -2
  63. package/dist/{messages-CHeucLGl2.mjs → chunks/messages-CF7WlKOY.mjs} +32 -2
  64. package/dist/{messages-D_-rh8gl.mjs → chunks/messages-CLcwMAAe.mjs} +32 -2
  65. package/dist/chunks/{messages-Df69rfTF2.mjs → messages-CTGjizuJ2.mjs} +32 -2
  66. package/dist/chunks/{messages-Ehx9YYeb2.mjs → messages-CTI66ZU52.mjs} +32 -2
  67. package/dist/{messages-C9LsEUfG.mjs → chunks/messages-CTtFH-AE.mjs} +32 -2
  68. package/dist/{messages-BB8umWL1.mjs → chunks/messages-CbilQw5o2.mjs} +32 -2
  69. package/dist/chunks/{messages-BAgTIgPH.mjs → messages-CiSiPyKp.mjs} +32 -2
  70. package/dist/chunks/{messages-5thhSeME.mjs → messages-ClD_3Kmk.mjs} +32 -2
  71. package/dist/chunks/{messages--aM83pib2.mjs → messages-CqoOMgIb2.mjs} +32 -2
  72. package/dist/chunks/{messages-EDTq4Q52.mjs → messages-Cqxe2gIN.mjs} +32 -2
  73. package/dist/chunks/{messages-SsrFJhTN.mjs → messages-CxKX6wTt.mjs} +32 -2
  74. package/dist/chunks/{messages-DUp8NnKT.mjs → messages-CyrZJ9dG.mjs} +32 -2
  75. package/dist/{messages-EIeWKoc5.mjs → chunks/messages-D1eXOdyJ.mjs} +32 -2
  76. package/dist/chunks/{messages-ohtcmr1w.mjs → messages-D2QcrPYF.mjs} +32 -2
  77. package/dist/{messages-DV29fJMD2.mjs → chunks/messages-D6EtVUzk2.mjs} +32 -2
  78. package/dist/{messages-C4HpNHfK.mjs → chunks/messages-D7qp-JvC.mjs} +32 -2
  79. package/dist/chunks/{messages-Dr-Ig3sw.mjs → messages-DAhzpf-j.mjs} +32 -2
  80. package/dist/chunks/{messages-DKChC8Qu.mjs → messages-DEVxqfH0.mjs} +32 -2
  81. package/dist/{messages-CkIRmpfZ2.mjs → chunks/messages-DHJIlD2m.mjs} +32 -2
  82. package/dist/{messages-CmoTIebG2.mjs → chunks/messages-DJ_gZym52.mjs} +32 -2
  83. package/dist/{messages-Cu7Lr1wp.mjs → chunks/messages-DMENc4jZ.mjs} +32 -2
  84. package/dist/chunks/{messages-BAC7nLeM.mjs → messages-DVDFAJaw.mjs} +32 -2
  85. package/dist/chunks/{messages-Co4WFeQ8.mjs → messages-DYQ87v5m.mjs} +32 -2
  86. package/dist/chunks/{messages-BO_jtRbZ2.mjs → messages-Dc2wd0BC2.mjs} +32 -2
  87. package/dist/{messages-F7cRf-20.mjs → chunks/messages-DlSDBHih.mjs} +32 -2
  88. package/dist/chunks/{messages-Nz8C7Znm.mjs → messages-Dmxk7uOK.mjs} +32 -2
  89. package/dist/chunks/{messages-8pf7gRQm2.mjs → messages-Dqoj0eKD2.mjs} +32 -2
  90. package/dist/{messages-BD_U2EnE.mjs → chunks/messages-DvUNk-e7.mjs} +32 -2
  91. package/dist/{messages-CTFwu5-h2.mjs → chunks/messages-DvZa_OtS2.mjs} +32 -2
  92. package/dist/chunks/{messages-CSpfBhlK2.mjs → messages-Dxa27UhV2.mjs} +32 -2
  93. package/dist/chunks/{messages-D14soBOO.mjs → messages-JQR7Z2f0.mjs} +32 -2
  94. package/dist/{messages-bRqMCja-2.mjs → chunks/messages-K453lCht2.mjs} +32 -2
  95. package/dist/{messages-B9ythxux.mjs → chunks/messages-Kqu8QyYy2.mjs} +32 -2
  96. package/dist/{messages-CWzET_9H2.mjs → chunks/messages-LGqROvB5.mjs} +32 -2
  97. package/dist/{messages-JwMkLben.mjs → chunks/messages-LiQ7ni4i2.mjs} +32 -2
  98. package/dist/{messages-B21zLG6b.mjs → chunks/messages-PDaWSrFT.mjs} +32 -2
  99. package/dist/{messages-ouO9js8Z.mjs → chunks/messages-SOew8O6I.mjs} +32 -2
  100. package/dist/{messages-SepwOOcg.mjs → chunks/messages-cjqgX4JV2.mjs} +32 -2
  101. package/dist/chunks/{messages-BARPMN7R.mjs → messages-fdO2V2XC.mjs} +32 -2
  102. package/dist/chunks/{messages-DDpgr0B1.mjs → messages-lu4RI1A3.mjs} +32 -2
  103. package/dist/{messages-D_cAZ4Ic2.mjs → chunks/messages-qt_Tsj1u2.mjs} +32 -2
  104. package/dist/chunks/{messages-BDTgiBJY2.mjs → messages-uQOWdLDn2.mjs} +32 -2
  105. package/dist/chunks/{messages-FCmAVA792.mjs → messages-xG65ERBM2.mjs} +32 -2
  106. package/dist/chunks/mk-BjookGdx.mjs +16800 -0
  107. package/dist/chunks/ml-L-NnZcp9.mjs +13558 -0
  108. package/dist/chunks/mn-OMWi7Hl_.mjs +12107 -0
  109. package/dist/chunks/mr-B6JPzITo.mjs +17324 -0
  110. package/dist/chunks/ms-CG3S-sPB.mjs +14999 -0
  111. package/dist/chunks/my-BLAmGfhT.mjs +12534 -0
  112. package/dist/chunks/native-BPcABu9z.mjs +107 -0
  113. package/dist/chunks/ne-D1JHLfYw.mjs +13248 -0
  114. package/dist/chunks/nl-Ca7Q8FnY.mjs +16693 -0
  115. package/dist/chunks/no-Coxcohcz.mjs +14767 -0
  116. package/dist/chunks/pa-CCaXqpaI.mjs +17220 -0
  117. package/dist/chunks/pl-Cl_fAZ84.mjs +17221 -0
  118. package/dist/chunks/ps-WD5qGAWy.mjs +12185 -0
  119. package/dist/chunks/pt-C4zvLfvq.mjs +16334 -0
  120. package/dist/chunks/ro-DbefHcmM.mjs +18857 -0
  121. package/dist/chunks/ru-uU1J14jd.mjs +17485 -0
  122. package/dist/chunks/sd-DKu368Ip.mjs +10889 -0
  123. package/dist/chunks/si-BsJCiPkZ.mjs +12721 -0
  124. package/dist/chunks/sk-CD-a3SN6.mjs +19081 -0
  125. package/dist/chunks/sl-CXhrPJe_.mjs +15682 -0
  126. package/dist/chunks/sq-CTctCoFQ.mjs +15278 -0
  127. package/dist/chunks/sr-BZkhBwXj.mjs +14524 -0
  128. package/dist/chunks/sv-NmRZb_xi.mjs +12855 -0
  129. package/dist/chunks/sw-Be5ik3H6.mjs +14315 -0
  130. package/dist/chunks/ta-DsXh6neL.mjs +16836 -0
  131. package/dist/chunks/te-CwpCbM8M.mjs +18588 -0
  132. package/dist/chunks/th-CcZ15OLk.mjs +13894 -0
  133. package/dist/chunks/{tools-CW1RAIvp.mjs → tools-BBmJ8jqK.mjs} +1417 -761
  134. package/dist/chunks/tr-q3bTgvhW.mjs +16318 -0
  135. package/dist/chunks/ug-919EhLsL.mjs +9816 -0
  136. package/dist/chunks/uk-aNMEzd0Y.mjs +16725 -0
  137. package/dist/chunks/ur-BwQI77sh.mjs +18051 -0
  138. package/dist/chunks/vi-Dxq806-F.mjs +14006 -0
  139. package/dist/chunks/zh-BcHuy1Ti.mjs +16334 -0
  140. package/dist/full.mjs +10 -10
  141. package/dist/locales.mjs +98 -68
  142. package/dist/{messages-qV14y_oA2.mjs → messages--PYnorLu2.mjs} +32 -2
  143. package/dist/{messages-Cy3Ne_M9.mjs → messages-B2X5gO-s.mjs} +32 -2
  144. package/dist/{chunks/messages-D1SqLcxI2.mjs → messages-BD3lSUU_.mjs} +32 -2
  145. package/dist/{chunks/messages-CIZkNCpW.mjs → messages-BFbAM_pK2.mjs} +32 -2
  146. package/dist/{chunks/messages-CIBuZccC.mjs → messages-BMUQ7kA62.mjs} +32 -2
  147. package/dist/{messages-CrWsU4Xw2.mjs → messages-BR1Hlhdc2.mjs} +32 -2
  148. package/dist/{chunks/messages-D2uBlGXR2.mjs → messages-BRJBZB-H2.mjs} +32 -2
  149. package/dist/{chunks/messages-OIelQDL32.mjs → messages-BTFWPbHk2.mjs} +32 -2
  150. package/dist/{messages-EwoT2jof.mjs → messages-BXvE3YB4.mjs} +32 -2
  151. package/dist/{messages-CqNzlpWi.mjs → messages-BZg8xxIT.mjs} +32 -2
  152. package/dist/{messages-BAZK-8Zb.mjs → messages-B_idm-Pp.mjs} +32 -2
  153. package/dist/{messages-LyzjEEIj2.mjs → messages-BcrsCh5-2.mjs} +32 -2
  154. package/dist/{chunks/messages-DPoPrTiZ.mjs → messages-Bf0eqjDJ.mjs} +32 -2
  155. package/dist/{messages-CKmmJ9tW.mjs → messages-Bgu3IB_k.mjs} +32 -2
  156. package/dist/{chunks/messages-DeLzropc.mjs → messages-Bkv2sk7Y.mjs} +32 -2
  157. package/dist/{messages-rM6YFLZH.mjs → messages-Bn77ieXA.mjs} +32 -2
  158. package/dist/{messages-CTPFrtK92.mjs → messages-Buf_f_-32.mjs} +32 -2
  159. package/dist/{messages-ouRGTAKo2.mjs → messages-BvIBkUCG2.mjs} +32 -2
  160. package/dist/{chunks/messages-DVg69mRj.mjs → messages-Bw0kGTAV.mjs} +32 -2
  161. package/dist/{chunks/messages-CWp6-Y8f2.mjs → messages-C5MKR_WT2.mjs} +32 -2
  162. package/dist/{chunks/messages-N72K1hw3.mjs → messages-C6UkeZ0y.mjs} +32 -2
  163. package/dist/{messages-CzZAfGif.mjs → messages-C9AvcT0K.mjs} +32 -2
  164. package/dist/{chunks/messages-D0IKicWg.mjs → messages-CC596_yM.mjs} +32 -2
  165. package/dist/{messages-DiSeSE8p.mjs → messages-CGD9LR8l.mjs} +32 -2
  166. package/dist/{messages-Tx25QErT.mjs → messages-CH8tCpAX.mjs} +32 -2
  167. package/dist/{chunks/messages-DfsHFEWa.mjs → messages-CIGa1j8-2.mjs} +32 -2
  168. package/dist/{messages-TI0u6Ked.mjs → messages-CJ5pCncM.mjs} +32 -2
  169. package/dist/{chunks/messages-DEGzGmEQ2.mjs → messages-CJd52qP7.mjs} +32 -2
  170. package/dist/{messages-Bm8I_Li12.mjs → messages-CWIigMhw2.mjs} +32 -2
  171. package/dist/{messages-JZhs_0pf.mjs → messages-CY_Fj715.mjs} +32 -2
  172. package/dist/{messages-BSLYh59S.mjs → messages-C_YAmOyQ.mjs} +32 -2
  173. package/dist/{messages-CIxT1nSh.mjs → messages-CjCjr0wW.mjs} +32 -2
  174. package/dist/{messages-Dr9L1psl.mjs → messages-CqbeAhjH.mjs} +32 -2
  175. package/dist/{messages-BTR3QlIb2.mjs → messages-Cr2hTJyi2.mjs} +32 -2
  176. package/dist/{chunks/messages-BKjLgO5d.mjs → messages-Cuw_6akN.mjs} +32 -2
  177. package/dist/{messages-lEyiemqU2.mjs → messages-D0KBToO12.mjs} +32 -2
  178. package/dist/{messages-1_FCq0It.mjs → messages-D2Xo8E0P.mjs} +32 -2
  179. package/dist/{messages-Djhu5RJd.mjs → messages-D5Uk_qYf.mjs} +32 -2
  180. package/dist/{messages-CHWfj4ik.mjs → messages-D7dJJ7dx.mjs} +32 -2
  181. package/dist/{chunks/messages-DmrsEYQm2.mjs → messages-D8SS2hOs2.mjs} +32 -2
  182. package/dist/{chunks/messages-DQOk-dTH.mjs → messages-D9a5iSFC2.mjs} +32 -2
  183. package/dist/{messages-BSwhWcYw.mjs → messages-DAjtVSb6.mjs} +32 -2
  184. package/dist/{messages-BZXBdD_S2.mjs → messages-DBuHaabF2.mjs} +32 -2
  185. package/dist/{chunks/messages-CuRN1_ep2.mjs → messages-DCjAu6M72.mjs} +32 -2
  186. package/dist/{messages-CKX9iXIb2.mjs → messages-DFlT_TM02.mjs} +32 -2
  187. package/dist/{chunks/messages-DlM9TmqS2.mjs → messages-DPECmAwT.mjs} +32 -2
  188. package/dist/{chunks/messages-DhGHk-Ma2.mjs → messages-DR2Lgl002.mjs} +32 -2
  189. package/dist/{messages-DDiP6yex.mjs → messages-DUPXmcZh.mjs} +32 -2
  190. package/dist/{chunks/messages-CoRQE_Jc.mjs → messages-DVReQ5EC.mjs} +32 -2
  191. package/dist/{chunks/messages-BvlSf_pu.mjs → messages-DaZkRhoM.mjs} +32 -2
  192. package/dist/{chunks/messages-B9zocutJ.mjs → messages-Dc93MR86.mjs} +32 -2
  193. package/dist/{messages-Dc7ZzqYN.mjs → messages-Dd4OTpH3.mjs} +32 -2
  194. package/dist/{chunks/messages-BsYzg2le.mjs → messages-DffJ5W5G.mjs} +32 -2
  195. package/dist/{messages-D8iCBMg7.mjs → messages-DjWAR34D.mjs} +32 -2
  196. package/dist/{messages-BzZ8LahA2.mjs → messages-DkaJV53s2.mjs} +32 -2
  197. package/dist/{chunks/messages-stUQR58d.mjs → messages-Dl7LQ_fI.mjs} +32 -2
  198. package/dist/{chunks/messages-B_fFjpX12.mjs → messages-DlEdd01l2.mjs} +32 -2
  199. package/dist/{chunks/messages-5ohIWynJ.mjs → messages-ItP2i78l.mjs} +32 -2
  200. package/dist/{messages-DDJOu049.mjs → messages-Oqm_fCLp.mjs} +32 -2
  201. package/dist/{chunks/messages-DrXNb1gu.mjs → messages-UpoT1AS6.mjs} +32 -2
  202. package/dist/{chunks/messages-COkQfKa72.mjs → messages-Z8dpjy_K2.mjs} +32 -2
  203. package/dist/{messages-mVLfVtQX2.mjs → messages-ierNgYE02.mjs} +32 -2
  204. package/dist/{messages-DToWAonn2.mjs → messages-ikSI7M732.mjs} +32 -2
  205. package/dist/{chunks/messages-DKCoHa5D.mjs → messages-olK9oNtb.mjs} +32 -2
  206. package/dist/{messages-CsnglxbV2.mjs → messages-rgXeOQMh2.mjs} +32 -2
  207. package/dist/{chunks/messages-CDJLoStb.mjs → messages-syo0DKqf.mjs} +32 -2
  208. package/dist/{chunks/messages-BgaGPFuy2.mjs → messages-tFDVfvWL.mjs} +32 -2
  209. package/dist/react.mjs +2 -2
  210. package/dist/tools.mjs +3 -3
  211. package/dist/vendor.LICENSE.txt +34 -0
  212. package/package.json +3 -1
  213. package/src/components/i18n/locales/am/messages.json +32 -2
  214. package/src/components/i18n/locales/ar/messages.json +32 -2
  215. package/src/components/i18n/locales/az/messages.json +32 -2
  216. package/src/components/i18n/locales/bg/messages.json +32 -2
  217. package/src/components/i18n/locales/bn/messages.json +32 -2
  218. package/src/components/i18n/locales/bs/messages.json +32 -2
  219. package/src/components/i18n/locales/cs/messages.json +32 -2
  220. package/src/components/i18n/locales/da/messages.json +32 -2
  221. package/src/components/i18n/locales/de/messages.json +32 -2
  222. package/src/components/i18n/locales/dv/messages.json +32 -2
  223. package/src/components/i18n/locales/el/messages.json +32 -2
  224. package/src/components/i18n/locales/en/messages.json +31 -1
  225. package/src/components/i18n/locales/es/messages.json +32 -2
  226. package/src/components/i18n/locales/et/messages.json +32 -2
  227. package/src/components/i18n/locales/fa/messages.json +32 -2
  228. package/src/components/i18n/locales/fi/messages.json +32 -2
  229. package/src/components/i18n/locales/fil/messages.json +32 -2
  230. package/src/components/i18n/locales/fr/messages.json +32 -2
  231. package/src/components/i18n/locales/gu/messages.json +32 -2
  232. package/src/components/i18n/locales/he/messages.json +32 -2
  233. package/src/components/i18n/locales/hi/messages.json +32 -2
  234. package/src/components/i18n/locales/hr/messages.json +32 -2
  235. package/src/components/i18n/locales/hu/messages.json +32 -2
  236. package/src/components/i18n/locales/hy/messages.json +32 -2
  237. package/src/components/i18n/locales/id/messages.json +32 -2
  238. package/src/components/i18n/locales/it/messages.json +32 -2
  239. package/src/components/i18n/locales/ja/messages.json +32 -2
  240. package/src/components/i18n/locales/ka/messages.json +32 -2
  241. package/src/components/i18n/locales/km/messages.json +32 -2
  242. package/src/components/i18n/locales/kn/messages.json +32 -2
  243. package/src/components/i18n/locales/ko/messages.json +32 -2
  244. package/src/components/i18n/locales/ku/messages.json +32 -2
  245. package/src/components/i18n/locales/lo/messages.json +32 -2
  246. package/src/components/i18n/locales/lt/messages.json +32 -2
  247. package/src/components/i18n/locales/lv/messages.json +32 -2
  248. package/src/components/i18n/locales/mk/messages.json +32 -2
  249. package/src/components/i18n/locales/ml/messages.json +32 -2
  250. package/src/components/i18n/locales/mn/messages.json +32 -2
  251. package/src/components/i18n/locales/mr/messages.json +32 -2
  252. package/src/components/i18n/locales/ms/messages.json +32 -2
  253. package/src/components/i18n/locales/my/messages.json +32 -2
  254. package/src/components/i18n/locales/ne/messages.json +32 -2
  255. package/src/components/i18n/locales/nl/messages.json +32 -2
  256. package/src/components/i18n/locales/no/messages.json +32 -2
  257. package/src/components/i18n/locales/pa/messages.json +32 -2
  258. package/src/components/i18n/locales/pl/messages.json +32 -2
  259. package/src/components/i18n/locales/ps/messages.json +32 -2
  260. package/src/components/i18n/locales/pt/messages.json +32 -2
  261. package/src/components/i18n/locales/ro/messages.json +32 -2
  262. package/src/components/i18n/locales/ru/messages.json +32 -2
  263. package/src/components/i18n/locales/sd/messages.json +32 -2
  264. package/src/components/i18n/locales/si/messages.json +32 -2
  265. package/src/components/i18n/locales/sk/messages.json +32 -2
  266. package/src/components/i18n/locales/sl/messages.json +32 -2
  267. package/src/components/i18n/locales/sq/messages.json +32 -2
  268. package/src/components/i18n/locales/sr/messages.json +32 -2
  269. package/src/components/i18n/locales/sv/messages.json +32 -2
  270. package/src/components/i18n/locales/sw/messages.json +32 -2
  271. package/src/components/i18n/locales/ta/messages.json +32 -2
  272. package/src/components/i18n/locales/te/messages.json +32 -2
  273. package/src/components/i18n/locales/th/messages.json +32 -2
  274. package/src/components/i18n/locales/tr/messages.json +32 -2
  275. package/src/components/i18n/locales/ug/messages.json +32 -2
  276. package/src/components/i18n/locales/uk/messages.json +32 -2
  277. package/src/components/i18n/locales/ur/messages.json +32 -2
  278. package/src/components/i18n/locales/vi/messages.json +32 -2
  279. package/src/components/i18n/locales/yi/messages.json +32 -2
  280. package/src/components/i18n/locales/zh/messages.json +32 -2
  281. package/src/components/icons/index.ts +98 -0
  282. package/src/components/modules/api/i18n.ts +1 -0
  283. package/src/components/modules/blockEvents/composers/keyboardNavigation.ts +22 -5
  284. package/src/components/modules/blockManager/operations.ts +1 -0
  285. package/src/components/modules/toolbar/index.ts +102 -7
  286. package/src/components/modules/toolbar/plus-button.ts +17 -5
  287. package/src/components/modules/uiControllers/controllers/blockHover.ts +36 -9
  288. package/src/components/modules/uiControllers/handlers/touch.ts +20 -8
  289. package/src/components/tools/factory.ts +4 -0
  290. package/src/components/ui/toolbox.ts +38 -3
  291. package/src/components/utils/popover/popover-desktop.ts +48 -71
  292. package/src/components/utils/popover/popover-position.ts +105 -0
  293. package/src/stories/MarkerColors.stories.ts +8 -1
  294. package/src/styles/main.css +121 -17
  295. package/src/tools/callout/block-operations.ts +17 -0
  296. package/src/tools/callout/callout-keyboard.ts +45 -0
  297. package/src/tools/callout/constants.ts +30 -0
  298. package/src/tools/callout/dom-builder.ts +53 -0
  299. package/src/tools/callout/emoji-picker/emoji-data.ts +105 -0
  300. package/src/tools/callout/emoji-picker/emoji-locale.ts +165 -0
  301. package/src/tools/callout/emoji-picker/index.ts +762 -0
  302. package/src/tools/callout/emoji-picker/locales/am.json +1 -0
  303. package/src/tools/callout/emoji-picker/locales/ar.json +1 -0
  304. package/src/tools/callout/emoji-picker/locales/az.json +1 -0
  305. package/src/tools/callout/emoji-picker/locales/bg.json +1 -0
  306. package/src/tools/callout/emoji-picker/locales/bn.json +1 -0
  307. package/src/tools/callout/emoji-picker/locales/bs.json +1 -0
  308. package/src/tools/callout/emoji-picker/locales/cs.json +1 -0
  309. package/src/tools/callout/emoji-picker/locales/da.json +1 -0
  310. package/src/tools/callout/emoji-picker/locales/de.json +1 -0
  311. package/src/tools/callout/emoji-picker/locales/el.json +1 -0
  312. package/src/tools/callout/emoji-picker/locales/es.json +1 -0
  313. package/src/tools/callout/emoji-picker/locales/et.json +1 -0
  314. package/src/tools/callout/emoji-picker/locales/fa.json +1 -0
  315. package/src/tools/callout/emoji-picker/locales/fi.json +1 -0
  316. package/src/tools/callout/emoji-picker/locales/fil.json +1 -0
  317. package/src/tools/callout/emoji-picker/locales/fr.json +1 -0
  318. package/src/tools/callout/emoji-picker/locales/gu.json +1 -0
  319. package/src/tools/callout/emoji-picker/locales/he.json +1 -0
  320. package/src/tools/callout/emoji-picker/locales/hi.json +1 -0
  321. package/src/tools/callout/emoji-picker/locales/hr.json +1 -0
  322. package/src/tools/callout/emoji-picker/locales/hu.json +1 -0
  323. package/src/tools/callout/emoji-picker/locales/hy.json +1 -0
  324. package/src/tools/callout/emoji-picker/locales/id.json +1 -0
  325. package/src/tools/callout/emoji-picker/locales/it.json +1 -0
  326. package/src/tools/callout/emoji-picker/locales/ja.json +1 -0
  327. package/src/tools/callout/emoji-picker/locales/ka.json +1 -0
  328. package/src/tools/callout/emoji-picker/locales/km.json +1 -0
  329. package/src/tools/callout/emoji-picker/locales/kn.json +1 -0
  330. package/src/tools/callout/emoji-picker/locales/ko.json +1 -0
  331. package/src/tools/callout/emoji-picker/locales/ku.json +1 -0
  332. package/src/tools/callout/emoji-picker/locales/lo.json +1 -0
  333. package/src/tools/callout/emoji-picker/locales/lt.json +1 -0
  334. package/src/tools/callout/emoji-picker/locales/lv.json +1 -0
  335. package/src/tools/callout/emoji-picker/locales/mk.json +1 -0
  336. package/src/tools/callout/emoji-picker/locales/ml.json +1 -0
  337. package/src/tools/callout/emoji-picker/locales/mn.json +1 -0
  338. package/src/tools/callout/emoji-picker/locales/mr.json +1 -0
  339. package/src/tools/callout/emoji-picker/locales/ms.json +1 -0
  340. package/src/tools/callout/emoji-picker/locales/my.json +1 -0
  341. package/src/tools/callout/emoji-picker/locales/ne.json +1 -0
  342. package/src/tools/callout/emoji-picker/locales/nl.json +1 -0
  343. package/src/tools/callout/emoji-picker/locales/no.json +1 -0
  344. package/src/tools/callout/emoji-picker/locales/pa.json +1 -0
  345. package/src/tools/callout/emoji-picker/locales/pl.json +1 -0
  346. package/src/tools/callout/emoji-picker/locales/ps.json +1 -0
  347. package/src/tools/callout/emoji-picker/locales/pt.json +1 -0
  348. package/src/tools/callout/emoji-picker/locales/ro.json +1 -0
  349. package/src/tools/callout/emoji-picker/locales/ru.json +1 -0
  350. package/src/tools/callout/emoji-picker/locales/sd.json +1 -0
  351. package/src/tools/callout/emoji-picker/locales/si.json +1 -0
  352. package/src/tools/callout/emoji-picker/locales/sk.json +1 -0
  353. package/src/tools/callout/emoji-picker/locales/sl.json +1 -0
  354. package/src/tools/callout/emoji-picker/locales/sq.json +1 -0
  355. package/src/tools/callout/emoji-picker/locales/sr.json +1 -0
  356. package/src/tools/callout/emoji-picker/locales/sv.json +1 -0
  357. package/src/tools/callout/emoji-picker/locales/sw.json +1 -0
  358. package/src/tools/callout/emoji-picker/locales/ta.json +1 -0
  359. package/src/tools/callout/emoji-picker/locales/te.json +1 -0
  360. package/src/tools/callout/emoji-picker/locales/th.json +1 -0
  361. package/src/tools/callout/emoji-picker/locales/tr.json +1 -0
  362. package/src/tools/callout/emoji-picker/locales/ug.json +1 -0
  363. package/src/tools/callout/emoji-picker/locales/uk.json +1 -0
  364. package/src/tools/callout/emoji-picker/locales/ur.json +1 -0
  365. package/src/tools/callout/emoji-picker/locales/vi.json +1 -0
  366. package/src/tools/callout/emoji-picker/locales/zh.json +1 -0
  367. package/src/tools/callout/index.ts +338 -0
  368. package/src/tools/callout/types.ts +11 -0
  369. package/src/tools/header/header-toggle-keyboard.ts +3 -2
  370. package/src/tools/header/index.ts +1 -1
  371. package/src/tools/index.ts +2 -0
  372. package/src/tools/toggle/index.ts +1 -1
  373. package/src/tools/toggle/toggle-keyboard.ts +29 -1
  374. package/types/api/i18n.d.ts +7 -0
  375. package/types/tools-entry.d.ts +0 -4
  376. /package/dist/chunks/{i18next-DymC16cN.mjs → i18next-Ch0gVA3V.mjs} +0 -0
  377. /package/dist/chunks/{notifier-BqYxvxnV.mjs → notifier-Butv4Dvo.mjs} +0 -0
@@ -476,6 +476,15 @@
476
476
  @custom-variant not-mobile (@media (min-width: 651px));
477
477
  @custom-variant can-hover (@media (hover: hover));
478
478
 
479
+ /*
480
+ Theme-aware dark variant for components outside the scoped preflight
481
+ (e.g. emoji picker, which is appended to document.body).
482
+ The component sets data-theme="dark"|"light" on its root element after
483
+ resolving the Blok theme; this variant replaces Tailwind's built-in dark:
484
+ which incorrectly keys off prefers-color-scheme alone.
485
+ */
486
+ @custom-variant theme-dark (&:where([data-theme="dark"], [data-theme="dark"] *));
487
+
479
488
  /* Non-overridable tokens — compiled statically */
480
489
  @theme {
481
490
  /* Z-index */
@@ -515,8 +524,6 @@
515
524
  --animate-bounce-in: bounceIn 0.75s cubic-bezier(0.215, 0.61, 0.355, 1) forwards;
516
525
  --animate-selection-bounce: selectionBounce 0.75s cubic-bezier(0.215, 0.61, 0.355, 1) forwards;
517
526
  --animate-button-clicked: buttonClicked 0.75s cubic-bezier(0.215, 0.61, 0.355, 1) forwards;
518
- --animate-panel-showing: panelShowing 150ms cubic-bezier(0.16, 1, 0.3, 1);
519
- --animate-panel-showing-mobile: panelShowingMobile 250ms ease;
520
527
  --animate-wobble: wobble 400ms;
521
528
  --animate-rotation: rotation 1.2s infinite linear;
522
529
  --animate-notify-bounce-in: notifyBounceIn 600ms 1;
@@ -548,18 +555,6 @@
548
555
  80%, 100% { transform: scale3d(1, 1, 1); }
549
556
  }
550
557
 
551
- @keyframes panelShowing {
552
- from { opacity: 0; transform: translateY(-6px) scale(0.96); }
553
- 60% { opacity: 1; transform: translateY(1px) scale(1.005); }
554
- to { opacity: 1; transform: translateY(0) scale(1); }
555
- }
556
-
557
- @keyframes panelShowingMobile {
558
- from { opacity: 0; transform: translateY(14px) scale(0.98); }
559
- 70% { opacity: 1; transform: translateY(-4px); }
560
- to { transform: translateY(0); }
561
- }
562
-
563
558
  @keyframes wobble {
564
559
  from { transform: translate3d(0, 0, 0); }
565
560
  15% { transform: translate3d(-9%, 0, 0); }
@@ -761,7 +756,7 @@
761
756
  --blok-selection: rgba(35, 131, 226, 0.2);
762
757
  --blok-selection-inline: rgba(35, 131, 226, 0.3);
763
758
  --blok-selection-highlight: rgba(35, 131, 226, 0.25);
764
- --blok-bg-light: #191918;
759
+ --blok-bg-light: rgba(255, 255, 255, 0.08);
765
760
  --blok-gray-text: #a39e98;
766
761
  --blok-dark: #191918;
767
762
  --blok-active-icon: #529cca;
@@ -854,7 +849,7 @@
854
849
  --blok-selection: rgba(35, 131, 226, 0.2);
855
850
  --blok-selection-inline: rgba(35, 131, 226, 0.3);
856
851
  --blok-selection-highlight: rgba(35, 131, 226, 0.25);
857
- --blok-bg-light: #191918;
852
+ --blok-bg-light: rgba(255, 255, 255, 0.08);
858
853
  --blok-gray-text: #a39e98;
859
854
  --blok-dark: #191918;
860
855
  --blok-active-icon: #529cca;
@@ -1156,6 +1151,31 @@
1156
1151
  @apply select-none;
1157
1152
  }
1158
1153
 
1154
+ /**
1155
+ * Child-container heading overrides (callout, toggle heading)
1156
+ * Inside [data-blok-toggle-children], headings should match paragraph spacing
1157
+ * rather than using their large root-level top margins (mt-8, mt-[26px], etc.).
1158
+ */
1159
+ [data-blok-toggle-children] :is(h1, h2, h3, h4, h5, h6) {
1160
+ @apply mt-px;
1161
+ }
1162
+
1163
+ /**
1164
+ * Callout emoji vertical centering for heading first children.
1165
+ * Headings have taller line boxes than the emoji button, so the emoji
1166
+ * needs a top margin to shift its center down to match the heading's
1167
+ * first line center. Values: (heading-line-height − emoji-content) / 2 + 1px mt-px.
1168
+ */
1169
+ [data-blok-component="callout"] button:has(+ [data-blok-toggle-children] > :first-child h1) {
1170
+ margin-top: 7.5px;
1171
+ }
1172
+ [data-blok-component="callout"] button:has(+ [data-blok-toggle-children] > :first-child h2) {
1173
+ margin-top: 3.6px;
1174
+ }
1175
+ [data-blok-component="callout"] button:has(+ [data-blok-toggle-children] > :first-child h3) {
1176
+ margin-top: 1px;
1177
+ }
1178
+
1159
1179
  /**
1160
1180
  * Table cell block wrapper overrides
1161
1181
  * Strip all nested spacing so only the cell's own padding (py-1 px-2) provides spacing.
@@ -1275,7 +1295,7 @@
1275
1295
  */
1276
1296
  [data-blok-slash-search],
1277
1297
  [data-blok-slash-search]:focus-visible {
1278
- @apply bg-search-input-bg rounded-md transition-colors duration-150 w-fit max-w-[240px] px-2 py-1;
1298
+ @apply bg-search-input-bg rounded-[10px] transition-colors duration-150 w-fit max-w-[240px] px-2;
1279
1299
  }
1280
1300
 
1281
1301
  [data-blok-slash-search]::after {
@@ -1307,3 +1327,87 @@
1307
1327
  [data-blok-popover-items]::-webkit-scrollbar-thumb:hover {
1308
1328
  background: var(--blok-gray-text);
1309
1329
  }
1330
+
1331
+ /**
1332
+ * Emoji picker — element resets.
1333
+ * The picker lives outside [data-blok-popover] scope so it does not
1334
+ * inherit the scoped preflight. :where() keeps specificity at zero
1335
+ * so Tailwind utility classes override freely.
1336
+ */
1337
+ :where([data-blok-emoji-picker]) :where(button, input) {
1338
+ appearance: none;
1339
+ background: transparent;
1340
+ border: none;
1341
+ color: inherit;
1342
+ font: inherit;
1343
+ padding: 0;
1344
+ margin: 0;
1345
+ }
1346
+
1347
+ /* The picker sits outside [data-blok-popover] so the scoped preflight's
1348
+ [hidden] { display: none !important } rule does not apply. Without this,
1349
+ Tailwind's `flex` class overrides the UA `display: none` for [hidden]. */
1350
+ :where([data-blok-emoji-picker][hidden]),
1351
+ :where([data-blok-emoji-picker]) :where([hidden]) {
1352
+ display: none !important;
1353
+ }
1354
+
1355
+ /**
1356
+ * Emoji picker — opening animation
1357
+ */
1358
+ [data-blok-emoji-picker] {
1359
+ animation: blok-emoji-picker-in 180ms cubic-bezier(0.16, 1, 0.3, 1);
1360
+ transform-origin: top left;
1361
+ }
1362
+
1363
+ @keyframes blok-emoji-picker-in {
1364
+ from {
1365
+ opacity: 0;
1366
+ transform: translateY(4px) scale(0.96);
1367
+ }
1368
+ to {
1369
+ opacity: 1;
1370
+ transform: translateY(0) scale(1);
1371
+ }
1372
+ }
1373
+
1374
+ /**
1375
+ * Emoji picker — empty-state fade
1376
+ */
1377
+ @keyframes blok-emoji-empty-in {
1378
+ from {
1379
+ opacity: 0;
1380
+ transform: translateY(6px);
1381
+ }
1382
+ to {
1383
+ opacity: 1;
1384
+ transform: translateY(0);
1385
+ }
1386
+ }
1387
+
1388
+ /**
1389
+ * Emoji picker — thin scrollbar (only visible on hover)
1390
+ */
1391
+ [data-emoji-picker-body] {
1392
+ scrollbar-width: thin;
1393
+ scrollbar-color: transparent transparent;
1394
+ }
1395
+ [data-emoji-picker-body]:hover {
1396
+ scrollbar-color: color-mix(in srgb, currentColor 12%, transparent) transparent;
1397
+ }
1398
+ [data-emoji-picker-body]::-webkit-scrollbar {
1399
+ width: 6px;
1400
+ }
1401
+ [data-emoji-picker-body]::-webkit-scrollbar-track {
1402
+ background: transparent;
1403
+ }
1404
+ [data-emoji-picker-body]::-webkit-scrollbar-thumb {
1405
+ background: transparent;
1406
+ border-radius: 3px;
1407
+ }
1408
+ [data-emoji-picker-body]:hover::-webkit-scrollbar-thumb {
1409
+ background: color-mix(in srgb, currentColor 12%, transparent);
1410
+ }
1411
+ [data-emoji-picker-body]::-webkit-scrollbar-thumb:hover {
1412
+ background: color-mix(in srgb, currentColor 22%, transparent);
1413
+ }
@@ -0,0 +1,17 @@
1
+ // src/tools/callout/block-operations.ts
2
+
3
+ import type { CalloutData } from './types';
4
+
5
+ interface SaveCalloutOptions {
6
+ emoji: string;
7
+ textColor: string | null;
8
+ backgroundColor: string | null;
9
+ }
10
+
11
+ export function saveCallout(options: SaveCalloutOptions): CalloutData {
12
+ return {
13
+ emoji: options.emoji,
14
+ textColor: options.textColor,
15
+ backgroundColor: options.backgroundColor,
16
+ };
17
+ }
@@ -0,0 +1,45 @@
1
+ // src/tools/callout/callout-keyboard.ts
2
+
3
+ import type { API } from '../../../types';
4
+
5
+ interface FirstChildBackspaceContext {
6
+ api: API;
7
+ calloutBlockId: string | undefined;
8
+ firstChildBlockId: string;
9
+ event: KeyboardEvent;
10
+ }
11
+
12
+ /**
13
+ * Handle Backspace on an empty first child block inside a callout.
14
+ *
15
+ * - If the callout has only this one child: convert the callout to a paragraph (removes callout).
16
+ * - If the callout has other children: delete the empty first child and move caret before the callout.
17
+ */
18
+ export async function handleCalloutFirstChildBackspace(ctx: FirstChildBackspaceContext): Promise<void> {
19
+ if (ctx.calloutBlockId === undefined) {
20
+ return;
21
+ }
22
+
23
+ const children = ctx.api.blocks.getChildren(ctx.calloutBlockId);
24
+
25
+ ctx.event.preventDefault();
26
+
27
+ if (children.length <= 1) {
28
+ // Only child — remove the entire callout by converting to paragraph
29
+ await ctx.api.blocks.convert(ctx.calloutBlockId, 'paragraph');
30
+ return;
31
+ }
32
+
33
+ // Multiple children — delete the empty first child and move caret before callout
34
+ const firstChildIndex = ctx.api.blocks.getBlockIndex(ctx.firstChildBlockId);
35
+
36
+ if (firstChildIndex !== undefined) {
37
+ await ctx.api.blocks.delete(firstChildIndex);
38
+ }
39
+
40
+ const calloutIndex = ctx.api.blocks.getBlockIndex(ctx.calloutBlockId);
41
+
42
+ if (calloutIndex !== undefined && calloutIndex > 0) {
43
+ ctx.api.caret.setToBlock(calloutIndex - 1, 'end');
44
+ }
45
+ }
@@ -0,0 +1,30 @@
1
+ // src/tools/callout/constants.ts
2
+
3
+ export const TOOL_NAME = 'callout';
4
+
5
+ // i18n keys
6
+ export const COLOR_KEY = 'tools.callout.color';
7
+ export const EDIT_ICON_KEY = 'tools.callout.editIcon';
8
+ export const ADD_EMOJI_KEY = 'tools.callout.addEmoji';
9
+ export const REMOVE_EMOJI_KEY = 'tools.callout.removeEmoji';
10
+ export const FILTER_EMOJIS_KEY = 'tools.callout.filterEmojis';
11
+ export const CALLOUT_EMOJI_CATEGORY_KEY = 'tools.callout.calloutEmojiCategory';
12
+ export const NO_EMOJIS_FOUND_KEY = 'tools.callout.noEmojisFound';
13
+ export const PICK_RANDOM_KEY = 'tools.callout.pickRandom';
14
+ export const SKIN_TONE_KEY = 'tools.callout.skinTone';
15
+ export const EMOJI_CATEGORY_PEOPLE_KEY = 'tools.callout.emojiCategoryPeople';
16
+ export const EMOJI_CATEGORY_NATURE_KEY = 'tools.callout.emojiCategoryNature';
17
+ export const EMOJI_CATEGORY_FOOD_KEY = 'tools.callout.emojiCategoryFood';
18
+ export const EMOJI_CATEGORY_ACTIVITY_KEY = 'tools.callout.emojiCategoryActivity';
19
+ export const EMOJI_CATEGORY_TRAVEL_KEY = 'tools.callout.emojiCategoryTravel';
20
+ export const EMOJI_CATEGORY_OBJECTS_KEY = 'tools.callout.emojiCategoryObjects';
21
+ export const EMOJI_CATEGORY_SYMBOLS_KEY = 'tools.callout.emojiCategorySymbols';
22
+ export const EMOJI_CATEGORY_FLAGS_KEY = 'tools.callout.emojiCategoryFlags';
23
+
24
+ // Defaults
25
+ export const DEFAULT_EMOJI = '💡';
26
+
27
+ // CSS — Tailwind classes
28
+ export const WRAPPER_STYLES = 'rounded-xl px-4 py-[5px] my-1 flex items-start gap-2';
29
+ export const EMOJI_BUTTON_STYLES = 'text-[1.25rem] cursor-pointer bg-transparent border-0 px-0 py-[7px] flex-shrink-0 select-none';
30
+ export const CHILDREN_STYLES = 'flex-1 min-w-0';
@@ -0,0 +1,53 @@
1
+ // src/tools/callout/dom-builder.ts
2
+
3
+ import { TOGGLE_ATTR } from '../toggle/constants';
4
+ import {
5
+ WRAPPER_STYLES,
6
+ EMOJI_BUTTON_STYLES,
7
+ CHILDREN_STYLES,
8
+ } from './constants';
9
+
10
+ export interface CalloutDOMRefs {
11
+ wrapper: HTMLElement;
12
+ emojiButton: HTMLButtonElement;
13
+ childContainer: HTMLElement;
14
+ }
15
+
16
+ export interface BuildCalloutDOMOptions {
17
+ emoji: string;
18
+ readOnly: boolean;
19
+ addEmojiLabel: string;
20
+ }
21
+
22
+ export function buildCalloutDOM(options: BuildCalloutDOMOptions): CalloutDOMRefs {
23
+ const { emoji, readOnly, addEmojiLabel } = options;
24
+
25
+ // Wrapper — flex row: emoji | children
26
+ const wrapper = document.createElement('div');
27
+ wrapper.className = WRAPPER_STYLES;
28
+
29
+ // Emoji button
30
+ const emojiButton = document.createElement('button');
31
+ emojiButton.type = 'button';
32
+ emojiButton.className = EMOJI_BUTTON_STYLES;
33
+ emojiButton.textContent = emoji || '';
34
+ emojiButton.setAttribute('aria-label', emoji !== '' ? emoji : addEmojiLabel);
35
+ emojiButton.setAttribute('tabindex', '0');
36
+ emojiButton.setAttribute('data-blok-testid', 'callout-emoji-btn');
37
+
38
+ if (readOnly) {
39
+ emojiButton.disabled = true;
40
+ }
41
+
42
+ // Children container — holds all block children
43
+ const childContainer = document.createElement('div');
44
+ childContainer.className = CHILDREN_STYLES;
45
+ childContainer.setAttribute(TOGGLE_ATTR.toggleChildren, '');
46
+ childContainer.setAttribute('data-blok-child-toolbar', '');
47
+ childContainer.setAttribute('data-blok-mutation-free', 'true');
48
+
49
+ wrapper.appendChild(emojiButton);
50
+ wrapper.appendChild(childContainer);
51
+
52
+ return { wrapper, emojiButton, childContainer };
53
+ }
@@ -0,0 +1,105 @@
1
+ // src/tools/callout/emoji-picker/emoji-data.ts
2
+
3
+ import type { EmojiLocaleData } from './emoji-locale';
4
+
5
+ interface EmojiMartData {
6
+ categories: Array<{ id: string; emojis: string[] }>;
7
+ emojis: Record<string, {
8
+ id: string;
9
+ name: string;
10
+ keywords: string[];
11
+ skins: Array<{ native: string; unified: string }>;
12
+ version: number;
13
+ }>;
14
+ }
15
+
16
+ export interface ProcessedEmoji {
17
+ native: string;
18
+ skins: string[];
19
+ id: string;
20
+ name: string;
21
+ keywords: string[];
22
+ category: string;
23
+ }
24
+
25
+ export const CURATED_CALLOUT_EMOJIS: string[] = [
26
+ '💡', '👉', '☝️', '✅', '⚠️', '🔑', '🔥', '📌', '✂️', '❓',
27
+ '🚫', '⏰', '♻️', '🔒', '📖', '👣', '➡️', '📢', '🛠️', '⚙️',
28
+ ];
29
+
30
+ const cache: { data: ProcessedEmoji[] | null } = { data: null };
31
+
32
+ function processCategory(category: { id: string; emojis: string[] }, emojis: EmojiMartData['emojis']): ProcessedEmoji[] {
33
+ const result: ProcessedEmoji[] = [];
34
+
35
+ for (const emojiId of category.emojis) {
36
+ const emoji = emojis[emojiId];
37
+
38
+ if (emoji === undefined) {
39
+ continue;
40
+ }
41
+
42
+ const firstSkin = emoji.skins[0];
43
+
44
+ if (firstSkin === undefined) {
45
+ continue;
46
+ }
47
+
48
+ result.push({
49
+ native: firstSkin.native,
50
+ skins: emoji.skins.map(s => s.native),
51
+ id: emoji.id,
52
+ name: emoji.name,
53
+ keywords: emoji.keywords,
54
+ category: category.id,
55
+ });
56
+ }
57
+
58
+ return result;
59
+ }
60
+
61
+ export async function loadEmojiData(): Promise<ProcessedEmoji[]> {
62
+ if (cache.data !== null) {
63
+ return cache.data;
64
+ }
65
+
66
+ const raw = await import('@emoji-mart/data') as unknown as { default: EmojiMartData } | EmojiMartData;
67
+ const data: EmojiMartData = 'default' in raw && raw.default !== undefined
68
+ ? raw.default
69
+ : (raw as unknown as EmojiMartData);
70
+
71
+ const processed = data.categories.flatMap(category => processCategory(category, data.emojis));
72
+
73
+ cache.data = processed;
74
+ return processed;
75
+ }
76
+
77
+ export function searchEmojis(emojis: ProcessedEmoji[], query: string, localeData?: EmojiLocaleData | null): ProcessedEmoji[] {
78
+ const lower = query.toLowerCase();
79
+ return emojis.filter(emoji => {
80
+ // English match (always available from emoji-mart)
81
+ if (emoji.name.toLowerCase().includes(lower) || emoji.keywords.some(k => k.includes(lower))) {
82
+ return true;
83
+ }
84
+
85
+ // Translated match (when locale data is loaded)
86
+ const entry = localeData?.[emoji.native];
87
+
88
+ if (entry !== undefined) {
89
+ return entry.n.toLowerCase().includes(lower) ||
90
+ (entry.k !== undefined && entry.k.some(k => k.toLowerCase().includes(lower)));
91
+ }
92
+
93
+ return false;
94
+ });
95
+ }
96
+
97
+ export function groupEmojisByCategory(emojis: ProcessedEmoji[]): Map<string, ProcessedEmoji[]> {
98
+ const groups = new Map<string, ProcessedEmoji[]>();
99
+ for (const emoji of emojis) {
100
+ const group = groups.get(emoji.category) ?? [];
101
+ group.push(emoji);
102
+ groups.set(emoji.category, group);
103
+ }
104
+ return groups;
105
+ }
@@ -0,0 +1,165 @@
1
+ // src/tools/callout/emoji-picker/emoji-locale.ts
2
+
3
+ /**
4
+ * Entry shape for a single emoji in a locale file.
5
+ * `n` = translated name, `k` = translated keywords (optional).
6
+ */
7
+ export interface EmojiLocaleEntry {
8
+ n: string;
9
+ k?: string[];
10
+ }
11
+
12
+ /**
13
+ * Map from native emoji character to its locale entry.
14
+ */
15
+ export type EmojiLocaleData = Record<string, EmojiLocaleEntry>;
16
+
17
+ /**
18
+ * Module-level cache: locale code -> loaded data.
19
+ */
20
+ const cache = new Map<string, EmojiLocaleData>();
21
+
22
+ /**
23
+ * Dynamic importers for each locale JSON file.
24
+ * Only includes locales that have generated files (65 locales — all Blok locales except dv and yi).
25
+ */
26
+ const importers: Record<string, () => Promise<{ default: EmojiLocaleData }>> = {
27
+ am: () => import('./locales/am.json'),
28
+ ar: () => import('./locales/ar.json'),
29
+ az: () => import('./locales/az.json'),
30
+ bg: () => import('./locales/bg.json'),
31
+ bn: () => import('./locales/bn.json'),
32
+ bs: () => import('./locales/bs.json'),
33
+ cs: () => import('./locales/cs.json'),
34
+ da: () => import('./locales/da.json'),
35
+ de: () => import('./locales/de.json'),
36
+ el: () => import('./locales/el.json'),
37
+ es: () => import('./locales/es.json'),
38
+ et: () => import('./locales/et.json'),
39
+ fa: () => import('./locales/fa.json'),
40
+ fi: () => import('./locales/fi.json'),
41
+ fil: () => import('./locales/fil.json'),
42
+ fr: () => import('./locales/fr.json'),
43
+ gu: () => import('./locales/gu.json'),
44
+ he: () => import('./locales/he.json'),
45
+ hi: () => import('./locales/hi.json'),
46
+ hr: () => import('./locales/hr.json'),
47
+ hu: () => import('./locales/hu.json'),
48
+ hy: () => import('./locales/hy.json'),
49
+ id: () => import('./locales/id.json'),
50
+ it: () => import('./locales/it.json'),
51
+ ja: () => import('./locales/ja.json'),
52
+ ka: () => import('./locales/ka.json'),
53
+ km: () => import('./locales/km.json'),
54
+ kn: () => import('./locales/kn.json'),
55
+ ko: () => import('./locales/ko.json'),
56
+ ku: () => import('./locales/ku.json'),
57
+ lo: () => import('./locales/lo.json'),
58
+ lt: () => import('./locales/lt.json'),
59
+ lv: () => import('./locales/lv.json'),
60
+ mk: () => import('./locales/mk.json'),
61
+ ml: () => import('./locales/ml.json'),
62
+ mn: () => import('./locales/mn.json'),
63
+ mr: () => import('./locales/mr.json'),
64
+ ms: () => import('./locales/ms.json'),
65
+ my: () => import('./locales/my.json'),
66
+ ne: () => import('./locales/ne.json'),
67
+ nl: () => import('./locales/nl.json'),
68
+ no: () => import('./locales/no.json'),
69
+ pa: () => import('./locales/pa.json'),
70
+ pl: () => import('./locales/pl.json'),
71
+ ps: () => import('./locales/ps.json'),
72
+ pt: () => import('./locales/pt.json'),
73
+ ro: () => import('./locales/ro.json'),
74
+ ru: () => import('./locales/ru.json'),
75
+ sd: () => import('./locales/sd.json'),
76
+ si: () => import('./locales/si.json'),
77
+ sk: () => import('./locales/sk.json'),
78
+ sl: () => import('./locales/sl.json'),
79
+ sq: () => import('./locales/sq.json'),
80
+ sr: () => import('./locales/sr.json'),
81
+ sv: () => import('./locales/sv.json'),
82
+ sw: () => import('./locales/sw.json'),
83
+ ta: () => import('./locales/ta.json'),
84
+ te: () => import('./locales/te.json'),
85
+ th: () => import('./locales/th.json'),
86
+ tr: () => import('./locales/tr.json'),
87
+ ug: () => import('./locales/ug.json'),
88
+ uk: () => import('./locales/uk.json'),
89
+ ur: () => import('./locales/ur.json'),
90
+ vi: () => import('./locales/vi.json'),
91
+ zh: () => import('./locales/zh.json'),
92
+ };
93
+
94
+ /**
95
+ * Lazy-load and cache locale data.
96
+ * Returns null for 'en' (no translation needed) or unsupported locales.
97
+ */
98
+ export async function loadEmojiLocale(locale: string): Promise<EmojiLocaleData | null> {
99
+ if (locale === 'en') {
100
+ return null;
101
+ }
102
+
103
+ const cached = cache.get(locale);
104
+
105
+ if (cached !== undefined) {
106
+ return cached;
107
+ }
108
+
109
+ const importer = importers[locale];
110
+
111
+ if (importer === undefined) {
112
+ return null;
113
+ }
114
+
115
+ try {
116
+ const module = await importer();
117
+ const data = module.default;
118
+
119
+ cache.set(locale, data);
120
+
121
+ return data;
122
+ } catch {
123
+ return null;
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Look up a translated name from the cache.
129
+ * Returns null if the locale isn't loaded or the emoji isn't in the data.
130
+ */
131
+ export function getTranslatedName(native: string, locale: string): string | null {
132
+ const data = cache.get(locale);
133
+
134
+ if (data === undefined) {
135
+ return null;
136
+ }
137
+
138
+ const entry = data[native];
139
+
140
+ if (entry === undefined) {
141
+ return null;
142
+ }
143
+
144
+ return entry.n;
145
+ }
146
+
147
+ /**
148
+ * Look up translated keywords from the cache.
149
+ * Returns null if the locale isn't loaded, the emoji isn't in the data, or no keywords exist.
150
+ */
151
+ export function getTranslatedKeywords(native: string, locale: string): string[] | null {
152
+ const data = cache.get(locale);
153
+
154
+ if (data === undefined) {
155
+ return null;
156
+ }
157
+
158
+ const entry = data[native];
159
+
160
+ if (entry === undefined) {
161
+ return null;
162
+ }
163
+
164
+ return entry.k ?? null;
165
+ }