@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.
- package/dist/blok.mjs +2 -2
- package/dist/chunks/am-CHDDMHkd.mjs +16490 -0
- package/dist/chunks/ar-DoqfNqut.mjs +19245 -0
- package/dist/chunks/az-C34P9iEa.mjs +14694 -0
- package/dist/chunks/bg-jroXLY8Y.mjs +15432 -0
- package/dist/chunks/{blok-GAbVCHTV.mjs → blok-0-8moMz9.mjs} +2090 -2052
- package/dist/chunks/bn-BRI-WqxY.mjs +16150 -0
- package/dist/chunks/bs-CCGUpNHu.mjs +12536 -0
- package/dist/chunks/{constants-CyDHDZyH.mjs → constants-PWnlOOrQ.mjs} +211 -172
- package/dist/chunks/cs-D5qZOGuc.mjs +22809 -0
- package/dist/chunks/da-DrJ7W37K.mjs +14573 -0
- package/dist/chunks/de-BW6-kp2c.mjs +16366 -0
- package/dist/chunks/el-C-Vc_Otu.mjs +16339 -0
- package/dist/chunks/es-B6fI5K9i.mjs +13597 -0
- package/dist/chunks/et-BhVlZ-Yz.mjs +14747 -0
- package/dist/chunks/fa-D55Ijdqa.mjs +16368 -0
- package/dist/chunks/fi-jNLjhKUQ.mjs +14408 -0
- package/dist/chunks/fil-DYd0T5aX.mjs +15915 -0
- package/dist/chunks/fr-yxy5xWw_.mjs +17010 -0
- package/dist/chunks/gu-CcY_LJe7.mjs +19021 -0
- package/dist/chunks/he-DL9s7wNw.mjs +15047 -0
- package/dist/chunks/hi-C8eGXgw5.mjs +15946 -0
- package/dist/chunks/hr-DLpybOhU.mjs +15099 -0
- package/dist/chunks/hu-BkT0gT00.mjs +16564 -0
- package/dist/chunks/hy-CVFDCp2S.mjs +12823 -0
- package/dist/chunks/{i18next-loader-p-7ioTwr.mjs → i18next-loader-BCAGutUy.mjs} +2 -2
- package/dist/chunks/id-0P4W9Az0.mjs +16690 -0
- package/dist/chunks/it-mLY6_uoW.mjs +19054 -0
- package/dist/chunks/ja-7RkeRNWG.mjs +15708 -0
- package/dist/chunks/ka-C7Lx-Qsh.mjs +13049 -0
- package/dist/chunks/km-Q8udaraH.mjs +12319 -0
- package/dist/chunks/kn-BiETM-iq.mjs +19123 -0
- package/dist/chunks/ko-tiB80pF1.mjs +17322 -0
- package/dist/chunks/ku-CY-OABkR.mjs +236 -0
- package/dist/chunks/{lightweight-i18n-BPeH69Dl.mjs → lightweight-i18n-CNUuUkuo.mjs} +31 -1
- package/dist/chunks/lo-CTBhEnyk.mjs +13576 -0
- package/dist/chunks/lt-BHKHEtqK.mjs +14587 -0
- package/dist/chunks/lv-DWxgtfUg.mjs +15042 -0
- package/dist/chunks/{messages-BHf_VcXb2.mjs → messages-2i0z2hFq2.mjs} +32 -2
- package/dist/{messages-8zo-T-Nx2.mjs → chunks/messages-4epWYTzK.mjs} +32 -2
- package/dist/chunks/{messages-DgZnRQRS.mjs → messages-B-x11A7Z.mjs} +32 -2
- package/dist/chunks/{messages-C03I_oR-2.mjs → messages-B1mCwtgm2.mjs} +32 -2
- package/dist/{messages-C5hD5pSd2.mjs → chunks/messages-B2Xnfn7m2.mjs} +32 -2
- package/dist/chunks/{messages-B-i-d1Bc.mjs → messages-B38lWmza.mjs} +32 -2
- package/dist/{messages-BRC9E_sp.mjs → chunks/messages-B3VMWaO8.mjs} +32 -2
- package/dist/{messages-BrcgNZOJ.mjs → chunks/messages-B6n2OYKJ.mjs} +32 -2
- package/dist/chunks/{messages-CIugNDDO2.mjs → messages-B847kJa02.mjs} +32 -2
- package/dist/chunks/{messages-CH_cexo62.mjs → messages-B8nL5cPA2.mjs} +32 -2
- package/dist/chunks/{messages-Bdk5tBNu.mjs → messages-BHMUmX3N.mjs} +32 -2
- package/dist/chunks/{messages-LL3Tflph.mjs → messages-BN78Am3l2.mjs} +32 -2
- package/dist/chunks/{messages-BIrkzbBP.mjs → messages-BRa1Itk_.mjs} +32 -2
- package/dist/chunks/{messages-BtS6JWMT.mjs → messages-BleThZm5.mjs} +32 -2
- package/dist/{messages-DHJ1fZLL.mjs → chunks/messages-Bo2PcQoc.mjs} +32 -2
- package/dist/{messages-D5rnT-BC.mjs → chunks/messages-Bqk7cuZY.mjs} +32 -2
- package/dist/chunks/{messages-Di7mfvB8.mjs → messages-BrsB1FRe.mjs} +32 -2
- package/dist/{messages-CsmTziC6.mjs → chunks/messages-ByeBRHpJ.mjs} +32 -2
- package/dist/{messages-C7Rz00Tp.mjs → chunks/messages-C35b_LVM.mjs} +32 -2
- package/dist/{messages-Co26RSCV2.mjs → chunks/messages-CAH4L_Mq2.mjs} +32 -2
- package/dist/chunks/{messages-BMzmli1K.mjs → messages-CBa6-NHn.mjs} +32 -2
- package/dist/chunks/{messages-wUoSWFsJ2.mjs → messages-CCywXuFz2.mjs} +32 -2
- package/dist/chunks/{messages-4OvVdaG52.mjs → messages-CDZrOiaR.mjs} +32 -2
- package/dist/{messages-C92tAUYT2.mjs → chunks/messages-CEVMB1TN2.mjs} +32 -2
- package/dist/{messages-CHeucLGl2.mjs → chunks/messages-CF7WlKOY.mjs} +32 -2
- package/dist/{messages-D_-rh8gl.mjs → chunks/messages-CLcwMAAe.mjs} +32 -2
- package/dist/chunks/{messages-Df69rfTF2.mjs → messages-CTGjizuJ2.mjs} +32 -2
- package/dist/chunks/{messages-Ehx9YYeb2.mjs → messages-CTI66ZU52.mjs} +32 -2
- package/dist/{messages-C9LsEUfG.mjs → chunks/messages-CTtFH-AE.mjs} +32 -2
- package/dist/{messages-BB8umWL1.mjs → chunks/messages-CbilQw5o2.mjs} +32 -2
- package/dist/chunks/{messages-BAgTIgPH.mjs → messages-CiSiPyKp.mjs} +32 -2
- package/dist/chunks/{messages-5thhSeME.mjs → messages-ClD_3Kmk.mjs} +32 -2
- package/dist/chunks/{messages--aM83pib2.mjs → messages-CqoOMgIb2.mjs} +32 -2
- package/dist/chunks/{messages-EDTq4Q52.mjs → messages-Cqxe2gIN.mjs} +32 -2
- package/dist/chunks/{messages-SsrFJhTN.mjs → messages-CxKX6wTt.mjs} +32 -2
- package/dist/chunks/{messages-DUp8NnKT.mjs → messages-CyrZJ9dG.mjs} +32 -2
- package/dist/{messages-EIeWKoc5.mjs → chunks/messages-D1eXOdyJ.mjs} +32 -2
- package/dist/chunks/{messages-ohtcmr1w.mjs → messages-D2QcrPYF.mjs} +32 -2
- package/dist/{messages-DV29fJMD2.mjs → chunks/messages-D6EtVUzk2.mjs} +32 -2
- package/dist/{messages-C4HpNHfK.mjs → chunks/messages-D7qp-JvC.mjs} +32 -2
- package/dist/chunks/{messages-Dr-Ig3sw.mjs → messages-DAhzpf-j.mjs} +32 -2
- package/dist/chunks/{messages-DKChC8Qu.mjs → messages-DEVxqfH0.mjs} +32 -2
- package/dist/{messages-CkIRmpfZ2.mjs → chunks/messages-DHJIlD2m.mjs} +32 -2
- package/dist/{messages-CmoTIebG2.mjs → chunks/messages-DJ_gZym52.mjs} +32 -2
- package/dist/{messages-Cu7Lr1wp.mjs → chunks/messages-DMENc4jZ.mjs} +32 -2
- package/dist/chunks/{messages-BAC7nLeM.mjs → messages-DVDFAJaw.mjs} +32 -2
- package/dist/chunks/{messages-Co4WFeQ8.mjs → messages-DYQ87v5m.mjs} +32 -2
- package/dist/chunks/{messages-BO_jtRbZ2.mjs → messages-Dc2wd0BC2.mjs} +32 -2
- package/dist/{messages-F7cRf-20.mjs → chunks/messages-DlSDBHih.mjs} +32 -2
- package/dist/chunks/{messages-Nz8C7Znm.mjs → messages-Dmxk7uOK.mjs} +32 -2
- package/dist/chunks/{messages-8pf7gRQm2.mjs → messages-Dqoj0eKD2.mjs} +32 -2
- package/dist/{messages-BD_U2EnE.mjs → chunks/messages-DvUNk-e7.mjs} +32 -2
- package/dist/{messages-CTFwu5-h2.mjs → chunks/messages-DvZa_OtS2.mjs} +32 -2
- package/dist/chunks/{messages-CSpfBhlK2.mjs → messages-Dxa27UhV2.mjs} +32 -2
- package/dist/chunks/{messages-D14soBOO.mjs → messages-JQR7Z2f0.mjs} +32 -2
- package/dist/{messages-bRqMCja-2.mjs → chunks/messages-K453lCht2.mjs} +32 -2
- package/dist/{messages-B9ythxux.mjs → chunks/messages-Kqu8QyYy2.mjs} +32 -2
- package/dist/{messages-CWzET_9H2.mjs → chunks/messages-LGqROvB5.mjs} +32 -2
- package/dist/{messages-JwMkLben.mjs → chunks/messages-LiQ7ni4i2.mjs} +32 -2
- package/dist/{messages-B21zLG6b.mjs → chunks/messages-PDaWSrFT.mjs} +32 -2
- package/dist/{messages-ouO9js8Z.mjs → chunks/messages-SOew8O6I.mjs} +32 -2
- package/dist/{messages-SepwOOcg.mjs → chunks/messages-cjqgX4JV2.mjs} +32 -2
- package/dist/chunks/{messages-BARPMN7R.mjs → messages-fdO2V2XC.mjs} +32 -2
- package/dist/chunks/{messages-DDpgr0B1.mjs → messages-lu4RI1A3.mjs} +32 -2
- package/dist/{messages-D_cAZ4Ic2.mjs → chunks/messages-qt_Tsj1u2.mjs} +32 -2
- package/dist/chunks/{messages-BDTgiBJY2.mjs → messages-uQOWdLDn2.mjs} +32 -2
- package/dist/chunks/{messages-FCmAVA792.mjs → messages-xG65ERBM2.mjs} +32 -2
- package/dist/chunks/mk-BjookGdx.mjs +16800 -0
- package/dist/chunks/ml-L-NnZcp9.mjs +13558 -0
- package/dist/chunks/mn-OMWi7Hl_.mjs +12107 -0
- package/dist/chunks/mr-B6JPzITo.mjs +17324 -0
- package/dist/chunks/ms-CG3S-sPB.mjs +14999 -0
- package/dist/chunks/my-BLAmGfhT.mjs +12534 -0
- package/dist/chunks/native-BPcABu9z.mjs +107 -0
- package/dist/chunks/ne-D1JHLfYw.mjs +13248 -0
- package/dist/chunks/nl-Ca7Q8FnY.mjs +16693 -0
- package/dist/chunks/no-Coxcohcz.mjs +14767 -0
- package/dist/chunks/pa-CCaXqpaI.mjs +17220 -0
- package/dist/chunks/pl-Cl_fAZ84.mjs +17221 -0
- package/dist/chunks/ps-WD5qGAWy.mjs +12185 -0
- package/dist/chunks/pt-C4zvLfvq.mjs +16334 -0
- package/dist/chunks/ro-DbefHcmM.mjs +18857 -0
- package/dist/chunks/ru-uU1J14jd.mjs +17485 -0
- package/dist/chunks/sd-DKu368Ip.mjs +10889 -0
- package/dist/chunks/si-BsJCiPkZ.mjs +12721 -0
- package/dist/chunks/sk-CD-a3SN6.mjs +19081 -0
- package/dist/chunks/sl-CXhrPJe_.mjs +15682 -0
- package/dist/chunks/sq-CTctCoFQ.mjs +15278 -0
- package/dist/chunks/sr-BZkhBwXj.mjs +14524 -0
- package/dist/chunks/sv-NmRZb_xi.mjs +12855 -0
- package/dist/chunks/sw-Be5ik3H6.mjs +14315 -0
- package/dist/chunks/ta-DsXh6neL.mjs +16836 -0
- package/dist/chunks/te-CwpCbM8M.mjs +18588 -0
- package/dist/chunks/th-CcZ15OLk.mjs +13894 -0
- package/dist/chunks/{tools-CW1RAIvp.mjs → tools-BBmJ8jqK.mjs} +1417 -761
- package/dist/chunks/tr-q3bTgvhW.mjs +16318 -0
- package/dist/chunks/ug-919EhLsL.mjs +9816 -0
- package/dist/chunks/uk-aNMEzd0Y.mjs +16725 -0
- package/dist/chunks/ur-BwQI77sh.mjs +18051 -0
- package/dist/chunks/vi-Dxq806-F.mjs +14006 -0
- package/dist/chunks/zh-BcHuy1Ti.mjs +16334 -0
- package/dist/full.mjs +10 -10
- package/dist/locales.mjs +98 -68
- package/dist/{messages-qV14y_oA2.mjs → messages--PYnorLu2.mjs} +32 -2
- package/dist/{messages-Cy3Ne_M9.mjs → messages-B2X5gO-s.mjs} +32 -2
- package/dist/{chunks/messages-D1SqLcxI2.mjs → messages-BD3lSUU_.mjs} +32 -2
- package/dist/{chunks/messages-CIZkNCpW.mjs → messages-BFbAM_pK2.mjs} +32 -2
- package/dist/{chunks/messages-CIBuZccC.mjs → messages-BMUQ7kA62.mjs} +32 -2
- package/dist/{messages-CrWsU4Xw2.mjs → messages-BR1Hlhdc2.mjs} +32 -2
- package/dist/{chunks/messages-D2uBlGXR2.mjs → messages-BRJBZB-H2.mjs} +32 -2
- package/dist/{chunks/messages-OIelQDL32.mjs → messages-BTFWPbHk2.mjs} +32 -2
- package/dist/{messages-EwoT2jof.mjs → messages-BXvE3YB4.mjs} +32 -2
- package/dist/{messages-CqNzlpWi.mjs → messages-BZg8xxIT.mjs} +32 -2
- package/dist/{messages-BAZK-8Zb.mjs → messages-B_idm-Pp.mjs} +32 -2
- package/dist/{messages-LyzjEEIj2.mjs → messages-BcrsCh5-2.mjs} +32 -2
- package/dist/{chunks/messages-DPoPrTiZ.mjs → messages-Bf0eqjDJ.mjs} +32 -2
- package/dist/{messages-CKmmJ9tW.mjs → messages-Bgu3IB_k.mjs} +32 -2
- package/dist/{chunks/messages-DeLzropc.mjs → messages-Bkv2sk7Y.mjs} +32 -2
- package/dist/{messages-rM6YFLZH.mjs → messages-Bn77ieXA.mjs} +32 -2
- package/dist/{messages-CTPFrtK92.mjs → messages-Buf_f_-32.mjs} +32 -2
- package/dist/{messages-ouRGTAKo2.mjs → messages-BvIBkUCG2.mjs} +32 -2
- package/dist/{chunks/messages-DVg69mRj.mjs → messages-Bw0kGTAV.mjs} +32 -2
- package/dist/{chunks/messages-CWp6-Y8f2.mjs → messages-C5MKR_WT2.mjs} +32 -2
- package/dist/{chunks/messages-N72K1hw3.mjs → messages-C6UkeZ0y.mjs} +32 -2
- package/dist/{messages-CzZAfGif.mjs → messages-C9AvcT0K.mjs} +32 -2
- package/dist/{chunks/messages-D0IKicWg.mjs → messages-CC596_yM.mjs} +32 -2
- package/dist/{messages-DiSeSE8p.mjs → messages-CGD9LR8l.mjs} +32 -2
- package/dist/{messages-Tx25QErT.mjs → messages-CH8tCpAX.mjs} +32 -2
- package/dist/{chunks/messages-DfsHFEWa.mjs → messages-CIGa1j8-2.mjs} +32 -2
- package/dist/{messages-TI0u6Ked.mjs → messages-CJ5pCncM.mjs} +32 -2
- package/dist/{chunks/messages-DEGzGmEQ2.mjs → messages-CJd52qP7.mjs} +32 -2
- package/dist/{messages-Bm8I_Li12.mjs → messages-CWIigMhw2.mjs} +32 -2
- package/dist/{messages-JZhs_0pf.mjs → messages-CY_Fj715.mjs} +32 -2
- package/dist/{messages-BSLYh59S.mjs → messages-C_YAmOyQ.mjs} +32 -2
- package/dist/{messages-CIxT1nSh.mjs → messages-CjCjr0wW.mjs} +32 -2
- package/dist/{messages-Dr9L1psl.mjs → messages-CqbeAhjH.mjs} +32 -2
- package/dist/{messages-BTR3QlIb2.mjs → messages-Cr2hTJyi2.mjs} +32 -2
- package/dist/{chunks/messages-BKjLgO5d.mjs → messages-Cuw_6akN.mjs} +32 -2
- package/dist/{messages-lEyiemqU2.mjs → messages-D0KBToO12.mjs} +32 -2
- package/dist/{messages-1_FCq0It.mjs → messages-D2Xo8E0P.mjs} +32 -2
- package/dist/{messages-Djhu5RJd.mjs → messages-D5Uk_qYf.mjs} +32 -2
- package/dist/{messages-CHWfj4ik.mjs → messages-D7dJJ7dx.mjs} +32 -2
- package/dist/{chunks/messages-DmrsEYQm2.mjs → messages-D8SS2hOs2.mjs} +32 -2
- package/dist/{chunks/messages-DQOk-dTH.mjs → messages-D9a5iSFC2.mjs} +32 -2
- package/dist/{messages-BSwhWcYw.mjs → messages-DAjtVSb6.mjs} +32 -2
- package/dist/{messages-BZXBdD_S2.mjs → messages-DBuHaabF2.mjs} +32 -2
- package/dist/{chunks/messages-CuRN1_ep2.mjs → messages-DCjAu6M72.mjs} +32 -2
- package/dist/{messages-CKX9iXIb2.mjs → messages-DFlT_TM02.mjs} +32 -2
- package/dist/{chunks/messages-DlM9TmqS2.mjs → messages-DPECmAwT.mjs} +32 -2
- package/dist/{chunks/messages-DhGHk-Ma2.mjs → messages-DR2Lgl002.mjs} +32 -2
- package/dist/{messages-DDiP6yex.mjs → messages-DUPXmcZh.mjs} +32 -2
- package/dist/{chunks/messages-CoRQE_Jc.mjs → messages-DVReQ5EC.mjs} +32 -2
- package/dist/{chunks/messages-BvlSf_pu.mjs → messages-DaZkRhoM.mjs} +32 -2
- package/dist/{chunks/messages-B9zocutJ.mjs → messages-Dc93MR86.mjs} +32 -2
- package/dist/{messages-Dc7ZzqYN.mjs → messages-Dd4OTpH3.mjs} +32 -2
- package/dist/{chunks/messages-BsYzg2le.mjs → messages-DffJ5W5G.mjs} +32 -2
- package/dist/{messages-D8iCBMg7.mjs → messages-DjWAR34D.mjs} +32 -2
- package/dist/{messages-BzZ8LahA2.mjs → messages-DkaJV53s2.mjs} +32 -2
- package/dist/{chunks/messages-stUQR58d.mjs → messages-Dl7LQ_fI.mjs} +32 -2
- package/dist/{chunks/messages-B_fFjpX12.mjs → messages-DlEdd01l2.mjs} +32 -2
- package/dist/{chunks/messages-5ohIWynJ.mjs → messages-ItP2i78l.mjs} +32 -2
- package/dist/{messages-DDJOu049.mjs → messages-Oqm_fCLp.mjs} +32 -2
- package/dist/{chunks/messages-DrXNb1gu.mjs → messages-UpoT1AS6.mjs} +32 -2
- package/dist/{chunks/messages-COkQfKa72.mjs → messages-Z8dpjy_K2.mjs} +32 -2
- package/dist/{messages-mVLfVtQX2.mjs → messages-ierNgYE02.mjs} +32 -2
- package/dist/{messages-DToWAonn2.mjs → messages-ikSI7M732.mjs} +32 -2
- package/dist/{chunks/messages-DKCoHa5D.mjs → messages-olK9oNtb.mjs} +32 -2
- package/dist/{messages-CsnglxbV2.mjs → messages-rgXeOQMh2.mjs} +32 -2
- package/dist/{chunks/messages-CDJLoStb.mjs → messages-syo0DKqf.mjs} +32 -2
- package/dist/{chunks/messages-BgaGPFuy2.mjs → messages-tFDVfvWL.mjs} +32 -2
- package/dist/react.mjs +2 -2
- package/dist/tools.mjs +3 -3
- package/dist/vendor.LICENSE.txt +34 -0
- package/package.json +3 -1
- package/src/components/i18n/locales/am/messages.json +32 -2
- package/src/components/i18n/locales/ar/messages.json +32 -2
- package/src/components/i18n/locales/az/messages.json +32 -2
- package/src/components/i18n/locales/bg/messages.json +32 -2
- package/src/components/i18n/locales/bn/messages.json +32 -2
- package/src/components/i18n/locales/bs/messages.json +32 -2
- package/src/components/i18n/locales/cs/messages.json +32 -2
- package/src/components/i18n/locales/da/messages.json +32 -2
- package/src/components/i18n/locales/de/messages.json +32 -2
- package/src/components/i18n/locales/dv/messages.json +32 -2
- package/src/components/i18n/locales/el/messages.json +32 -2
- package/src/components/i18n/locales/en/messages.json +31 -1
- package/src/components/i18n/locales/es/messages.json +32 -2
- package/src/components/i18n/locales/et/messages.json +32 -2
- package/src/components/i18n/locales/fa/messages.json +32 -2
- package/src/components/i18n/locales/fi/messages.json +32 -2
- package/src/components/i18n/locales/fil/messages.json +32 -2
- package/src/components/i18n/locales/fr/messages.json +32 -2
- package/src/components/i18n/locales/gu/messages.json +32 -2
- package/src/components/i18n/locales/he/messages.json +32 -2
- package/src/components/i18n/locales/hi/messages.json +32 -2
- package/src/components/i18n/locales/hr/messages.json +32 -2
- package/src/components/i18n/locales/hu/messages.json +32 -2
- package/src/components/i18n/locales/hy/messages.json +32 -2
- package/src/components/i18n/locales/id/messages.json +32 -2
- package/src/components/i18n/locales/it/messages.json +32 -2
- package/src/components/i18n/locales/ja/messages.json +32 -2
- package/src/components/i18n/locales/ka/messages.json +32 -2
- package/src/components/i18n/locales/km/messages.json +32 -2
- package/src/components/i18n/locales/kn/messages.json +32 -2
- package/src/components/i18n/locales/ko/messages.json +32 -2
- package/src/components/i18n/locales/ku/messages.json +32 -2
- package/src/components/i18n/locales/lo/messages.json +32 -2
- package/src/components/i18n/locales/lt/messages.json +32 -2
- package/src/components/i18n/locales/lv/messages.json +32 -2
- package/src/components/i18n/locales/mk/messages.json +32 -2
- package/src/components/i18n/locales/ml/messages.json +32 -2
- package/src/components/i18n/locales/mn/messages.json +32 -2
- package/src/components/i18n/locales/mr/messages.json +32 -2
- package/src/components/i18n/locales/ms/messages.json +32 -2
- package/src/components/i18n/locales/my/messages.json +32 -2
- package/src/components/i18n/locales/ne/messages.json +32 -2
- package/src/components/i18n/locales/nl/messages.json +32 -2
- package/src/components/i18n/locales/no/messages.json +32 -2
- package/src/components/i18n/locales/pa/messages.json +32 -2
- package/src/components/i18n/locales/pl/messages.json +32 -2
- package/src/components/i18n/locales/ps/messages.json +32 -2
- package/src/components/i18n/locales/pt/messages.json +32 -2
- package/src/components/i18n/locales/ro/messages.json +32 -2
- package/src/components/i18n/locales/ru/messages.json +32 -2
- package/src/components/i18n/locales/sd/messages.json +32 -2
- package/src/components/i18n/locales/si/messages.json +32 -2
- package/src/components/i18n/locales/sk/messages.json +32 -2
- package/src/components/i18n/locales/sl/messages.json +32 -2
- package/src/components/i18n/locales/sq/messages.json +32 -2
- package/src/components/i18n/locales/sr/messages.json +32 -2
- package/src/components/i18n/locales/sv/messages.json +32 -2
- package/src/components/i18n/locales/sw/messages.json +32 -2
- package/src/components/i18n/locales/ta/messages.json +32 -2
- package/src/components/i18n/locales/te/messages.json +32 -2
- package/src/components/i18n/locales/th/messages.json +32 -2
- package/src/components/i18n/locales/tr/messages.json +32 -2
- package/src/components/i18n/locales/ug/messages.json +32 -2
- package/src/components/i18n/locales/uk/messages.json +32 -2
- package/src/components/i18n/locales/ur/messages.json +32 -2
- package/src/components/i18n/locales/vi/messages.json +32 -2
- package/src/components/i18n/locales/yi/messages.json +32 -2
- package/src/components/i18n/locales/zh/messages.json +32 -2
- package/src/components/icons/index.ts +98 -0
- package/src/components/modules/api/i18n.ts +1 -0
- package/src/components/modules/blockEvents/composers/keyboardNavigation.ts +22 -5
- package/src/components/modules/blockManager/operations.ts +1 -0
- package/src/components/modules/toolbar/index.ts +102 -7
- package/src/components/modules/toolbar/plus-button.ts +17 -5
- package/src/components/modules/uiControllers/controllers/blockHover.ts +36 -9
- package/src/components/modules/uiControllers/handlers/touch.ts +20 -8
- package/src/components/tools/factory.ts +4 -0
- package/src/components/ui/toolbox.ts +38 -3
- package/src/components/utils/popover/popover-desktop.ts +48 -71
- package/src/components/utils/popover/popover-position.ts +105 -0
- package/src/stories/MarkerColors.stories.ts +8 -1
- package/src/styles/main.css +121 -17
- package/src/tools/callout/block-operations.ts +17 -0
- package/src/tools/callout/callout-keyboard.ts +45 -0
- package/src/tools/callout/constants.ts +30 -0
- package/src/tools/callout/dom-builder.ts +53 -0
- package/src/tools/callout/emoji-picker/emoji-data.ts +105 -0
- package/src/tools/callout/emoji-picker/emoji-locale.ts +165 -0
- package/src/tools/callout/emoji-picker/index.ts +762 -0
- package/src/tools/callout/emoji-picker/locales/am.json +1 -0
- package/src/tools/callout/emoji-picker/locales/ar.json +1 -0
- package/src/tools/callout/emoji-picker/locales/az.json +1 -0
- package/src/tools/callout/emoji-picker/locales/bg.json +1 -0
- package/src/tools/callout/emoji-picker/locales/bn.json +1 -0
- package/src/tools/callout/emoji-picker/locales/bs.json +1 -0
- package/src/tools/callout/emoji-picker/locales/cs.json +1 -0
- package/src/tools/callout/emoji-picker/locales/da.json +1 -0
- package/src/tools/callout/emoji-picker/locales/de.json +1 -0
- package/src/tools/callout/emoji-picker/locales/el.json +1 -0
- package/src/tools/callout/emoji-picker/locales/es.json +1 -0
- package/src/tools/callout/emoji-picker/locales/et.json +1 -0
- package/src/tools/callout/emoji-picker/locales/fa.json +1 -0
- package/src/tools/callout/emoji-picker/locales/fi.json +1 -0
- package/src/tools/callout/emoji-picker/locales/fil.json +1 -0
- package/src/tools/callout/emoji-picker/locales/fr.json +1 -0
- package/src/tools/callout/emoji-picker/locales/gu.json +1 -0
- package/src/tools/callout/emoji-picker/locales/he.json +1 -0
- package/src/tools/callout/emoji-picker/locales/hi.json +1 -0
- package/src/tools/callout/emoji-picker/locales/hr.json +1 -0
- package/src/tools/callout/emoji-picker/locales/hu.json +1 -0
- package/src/tools/callout/emoji-picker/locales/hy.json +1 -0
- package/src/tools/callout/emoji-picker/locales/id.json +1 -0
- package/src/tools/callout/emoji-picker/locales/it.json +1 -0
- package/src/tools/callout/emoji-picker/locales/ja.json +1 -0
- package/src/tools/callout/emoji-picker/locales/ka.json +1 -0
- package/src/tools/callout/emoji-picker/locales/km.json +1 -0
- package/src/tools/callout/emoji-picker/locales/kn.json +1 -0
- package/src/tools/callout/emoji-picker/locales/ko.json +1 -0
- package/src/tools/callout/emoji-picker/locales/ku.json +1 -0
- package/src/tools/callout/emoji-picker/locales/lo.json +1 -0
- package/src/tools/callout/emoji-picker/locales/lt.json +1 -0
- package/src/tools/callout/emoji-picker/locales/lv.json +1 -0
- package/src/tools/callout/emoji-picker/locales/mk.json +1 -0
- package/src/tools/callout/emoji-picker/locales/ml.json +1 -0
- package/src/tools/callout/emoji-picker/locales/mn.json +1 -0
- package/src/tools/callout/emoji-picker/locales/mr.json +1 -0
- package/src/tools/callout/emoji-picker/locales/ms.json +1 -0
- package/src/tools/callout/emoji-picker/locales/my.json +1 -0
- package/src/tools/callout/emoji-picker/locales/ne.json +1 -0
- package/src/tools/callout/emoji-picker/locales/nl.json +1 -0
- package/src/tools/callout/emoji-picker/locales/no.json +1 -0
- package/src/tools/callout/emoji-picker/locales/pa.json +1 -0
- package/src/tools/callout/emoji-picker/locales/pl.json +1 -0
- package/src/tools/callout/emoji-picker/locales/ps.json +1 -0
- package/src/tools/callout/emoji-picker/locales/pt.json +1 -0
- package/src/tools/callout/emoji-picker/locales/ro.json +1 -0
- package/src/tools/callout/emoji-picker/locales/ru.json +1 -0
- package/src/tools/callout/emoji-picker/locales/sd.json +1 -0
- package/src/tools/callout/emoji-picker/locales/si.json +1 -0
- package/src/tools/callout/emoji-picker/locales/sk.json +1 -0
- package/src/tools/callout/emoji-picker/locales/sl.json +1 -0
- package/src/tools/callout/emoji-picker/locales/sq.json +1 -0
- package/src/tools/callout/emoji-picker/locales/sr.json +1 -0
- package/src/tools/callout/emoji-picker/locales/sv.json +1 -0
- package/src/tools/callout/emoji-picker/locales/sw.json +1 -0
- package/src/tools/callout/emoji-picker/locales/ta.json +1 -0
- package/src/tools/callout/emoji-picker/locales/te.json +1 -0
- package/src/tools/callout/emoji-picker/locales/th.json +1 -0
- package/src/tools/callout/emoji-picker/locales/tr.json +1 -0
- package/src/tools/callout/emoji-picker/locales/ug.json +1 -0
- package/src/tools/callout/emoji-picker/locales/uk.json +1 -0
- package/src/tools/callout/emoji-picker/locales/ur.json +1 -0
- package/src/tools/callout/emoji-picker/locales/vi.json +1 -0
- package/src/tools/callout/emoji-picker/locales/zh.json +1 -0
- package/src/tools/callout/index.ts +338 -0
- package/src/tools/callout/types.ts +11 -0
- package/src/tools/header/header-toggle-keyboard.ts +3 -2
- package/src/tools/header/index.ts +1 -1
- package/src/tools/index.ts +2 -0
- package/src/tools/toggle/index.ts +1 -1
- package/src/tools/toggle/toggle-keyboard.ts +29 -1
- package/types/api/i18n.d.ts +7 -0
- package/types/tools-entry.d.ts +0 -4
- /package/dist/chunks/{i18next-DymC16cN.mjs → i18next-Ch0gVA3V.mjs} +0 -0
- /package/dist/chunks/{notifier-BqYxvxnV.mjs → notifier-Butv4Dvo.mjs} +0 -0
package/src/styles/main.css
CHANGED
|
@@ -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:
|
|
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:
|
|
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-
|
|
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
|
+
}
|