@feugene/granularity 0.9.3 → 0.10.0
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/chunks/{config-d386uO3O.js.map → config-58Mj2rGH.js.map} +1 -1
- package/dist/chunks/{config-D4s_QWVP.js.map → config-8f8624RN.js.map} +1 -1
- package/dist/chunks/{config-B_nSBc7W.js.map → config-A-iei0Ux.js.map} +1 -1
- package/dist/chunks/{config-CFf7xaG1.js → config-B0uUCaJW.js} +1 -1
- package/dist/chunks/{config-CFf7xaG1.js.map → config-B0uUCaJW.js.map} +1 -1
- package/dist/chunks/{config-Dcb7xK-C.js.map → config-B3dn-gdC.js.map} +1 -1
- package/dist/chunks/{config-D6Oe3blW2.js.map → config-BLa1TEGm2.js.map} +1 -1
- package/dist/chunks/{config-Dzd6BzIN2.js.map → config-BeBsN0c12.js.map} +1 -1
- package/dist/chunks/{config-BU0olrvr.js.map → config-Bh4NWWsQ.js.map} +1 -1
- package/dist/chunks/{config-BeQuykDk2.js.map → config-BuoIngj32.js.map} +1 -1
- package/dist/chunks/{config-BbKroFtR.js.map → config-C5-ujXCI.js.map} +1 -1
- package/dist/chunks/{config-BY81UKv0.js → config-C8MM2Dg0.js} +1 -1
- package/dist/chunks/{config-BY81UKv0.js.map → config-C8MM2Dg0.js.map} +1 -1
- package/dist/chunks/{config-DF_RlCIO.js.map → config-CPSdAjUi.js.map} +1 -1
- package/dist/chunks/{config-iuMz79Mg.js.map → config-CWTfyPNI.js.map} +1 -1
- package/dist/chunks/{config-Br_qI3Za.js → config-C_egzT_K.js} +2 -2
- package/dist/chunks/config-C_egzT_K.js.map +1 -0
- package/dist/chunks/{config-Ci9nXGUV.js.map → config-C_q_4FrU.js.map} +1 -1
- package/dist/chunks/{config-O1_FTqD3.js.map → config-CzgNEHKi.js.map} +1 -1
- package/dist/chunks/{config-Bcf-8XlK2.js.map → config-DDUPnue12.js.map} +1 -1
- package/dist/chunks/{config-DmjwIqx1.js.map → config-DDwBSoc_.js.map} +1 -1
- package/dist/chunks/{config-C5OwJM3-.js → config-DRpkoSvq.js} +1 -1
- package/dist/chunks/{config-C5OwJM3-.js.map → config-DRpkoSvq.js.map} +1 -1
- package/dist/chunks/{config-DaHI5bD_2.js.map → config-DZrlovR42.js.map} +1 -1
- package/dist/chunks/{config-72sW9Bag2.js.map → config-D_Pafsjq2.js.map} +1 -1
- package/dist/chunks/{config-B1kFmhpM.js.map → config-DhQc1TRY.js.map} +1 -1
- package/dist/chunks/{config-CetsgpaZ2.js.map → config-DkeLkzxj2.js.map} +1 -1
- package/dist/chunks/{config-BOdu-O_B.js.map → config-Dl5aZ5VR.js.map} +1 -1
- package/dist/chunks/{config-CvGdaXvH.js.map → config-Doa_gU40.js.map} +1 -1
- package/dist/chunks/{config-CdJpnjDj.js.map → config-DvDNney3.js.map} +1 -1
- package/dist/chunks/{config-CpMYmvVT.js.map → config-NkbzVFZo.js.map} +1 -1
- package/dist/chunks/{config-_3De4HFf.js.map → config-RjfJFv1Y.js.map} +1 -1
- package/dist/chunks/{config-DoBk_CzG.js.map → config-VJuoznpH.js.map} +1 -1
- package/dist/chunks/{config-BnWSHTEU.js.map → config-XspHtPsU.js.map} +1 -1
- package/dist/chunks/{config-B2YTEe_h.js.map → config-hSlCXHoG.js.map} +1 -1
- package/dist/chunks/{config-DSBlHQVa.js.map → config-lMDE_8A5.js.map} +1 -1
- package/dist/chunks/{config-Cp_XHsze.js.map → config-nrOj9p6I.js.map} +1 -1
- package/dist/chunks/{en-foQA8imU.js → en-B_fSdoTi.js} +9 -2
- package/dist/chunks/en-B_fSdoTi.js.map +1 -0
- package/dist/chunks/{es-Bx3Kuy6z.js → es-CISK11Nv.js} +3 -3
- package/dist/chunks/{es-Bx3Kuy6z.js.map → es-CISK11Nv.js.map} +1 -1
- package/dist/chunks/{es-DZFSojYL.js → es-DKP6fLir.js} +9 -2
- package/dist/chunks/es-DKP6fLir.js.map +1 -0
- package/dist/chunks/{grDropdownStyles-B41mVR1H.js → grDropdownStyles-Bqx9hOzU.js} +10 -7
- package/dist/chunks/grDropdownStyles-Bqx9hOzU.js.map +1 -0
- package/dist/chunks/{grModalStyles-DS1Vl6EW.js → grModalStyles-FgaKqx50.js} +1 -1
- package/dist/chunks/grModalStyles-FgaKqx50.js.map +1 -0
- package/dist/chunks/grSelectStyles-AjWWl007.js.map +1 -0
- package/dist/chunks/{grStyle-CUaTmpyW.js.map → grStyle-D-gPHdyW.js.map} +1 -1
- package/dist/chunks/{granularityI18n-LcJ88Vce.js → granularityI18n-D_7jowK2.js} +17 -2
- package/dist/chunks/granularityI18n-D_7jowK2.js.map +1 -0
- package/dist/chunks/{ru-LhkPpPIl.js → ru-S6VlnurJ.js} +9 -2
- package/dist/chunks/ru-S6VlnurJ.js.map +1 -0
- package/dist/chunks/{shared-BiqXd5MW.js → shared-DpjTvFno.js} +34 -34
- package/dist/chunks/{shared-BiqXd5MW.js.map → shared-DpjTvFno.js.map} +1 -1
- package/dist/chunks/useFloating-CLtbU7eD.js +1234 -0
- package/dist/chunks/useFloating-CLtbU7eD.js.map +1 -0
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-Br6WJkLE.js → GrConfirmDialog-Bi2KLumL.js} +2 -2
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-Br6WJkLE.js.map → GrConfirmDialog-Bi2KLumL.js.map} +1 -1
- package/dist/components/GrConfirmDialog/index.js +1 -1
- package/dist/components/GrDialog/chunks/{GrDialog-C7XLxp8e.js → GrDialog-CxK4Lj4F.js} +1 -1
- package/dist/components/GrDialog/chunks/{GrDialog-C7XLxp8e.js.map → GrDialog-CxK4Lj4F.js.map} +1 -1
- package/dist/components/GrDialog/index.js +1 -1
- package/dist/components/GrDropdown/chunks/{GrDropdown-DOvHKnih.js → GrDropdown-BGKeEfZ1.js} +13 -59
- package/dist/components/GrDropdown/chunks/GrDropdown-BGKeEfZ1.js.map +1 -0
- package/dist/components/GrDropdown/index.js +2 -2
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-CLPwbiyG.js → GrDropdownMenu-CJom_-c2.js} +1 -1
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-CLPwbiyG.js.map → GrDropdownMenu-CJom_-c2.js.map} +1 -1
- package/dist/components/GrDropdownMenu/index.js +2 -2
- package/dist/components/GrEmptyState/chunks/{GrEmptyState-Dj2V5GaX.js.map → GrEmptyState-yOuZW7-t.js.map} +1 -1
- package/dist/components/GrEmptyState/index.js +2 -2
- package/dist/components/GrFileUpload/chunks/{GrFileUpload-BEKNB1RM.js → GrFileUpload-CBKK3dgC.js} +1 -1
- package/dist/components/GrFileUpload/chunks/{GrFileUpload-BEKNB1RM.js.map → GrFileUpload-CBKK3dgC.js.map} +1 -1
- package/dist/components/GrFileUpload/index.js +2 -2
- package/dist/components/GrFormField/index.js +1 -1
- package/dist/components/GrFormFile/chunks/{GrFormFile-CIleXnfr.js.map → GrFormFile-CkR6cYqf.js.map} +1 -1
- package/dist/components/GrFormFile/index.js +2 -2
- package/dist/components/GrFormSection/chunks/{GrFormSection-DpGhY7MX.js.map → GrFormSection-dbyzqxYk.js.map} +1 -1
- package/dist/components/GrFormSection/index.js +2 -2
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-CsvXQHM9.js.map → GrImageViewer-BG40DsHa.js.map} +1 -1
- package/dist/components/GrImageViewer/index.js +2 -2
- package/dist/components/GrInput/index.js +1 -1
- package/dist/components/GrInputTag/chunks/{GrInputTag-Dcj3F6rQ.js → GrInputTag-g-KdUI_Z.js} +1 -1
- package/dist/components/GrInputTag/chunks/{GrInputTag-Dcj3F6rQ.js.map → GrInputTag-g-KdUI_Z.js.map} +1 -1
- package/dist/components/GrInputTag/index.js +2 -2
- package/dist/components/GrLink/chunks/{GrLink-BMwn2iJ9.js → GrLink-KSTmk9Yq.js} +1 -1
- package/dist/components/GrLink/chunks/{GrLink-BMwn2iJ9.js.map → GrLink-KSTmk9Yq.js.map} +1 -1
- package/dist/components/GrLink/index.js +2 -2
- package/dist/components/GrList/chunks/{GrList-D8nM1FuV.js.map → GrList-CUW2sRm_.js.map} +1 -1
- package/dist/components/GrList/index.js +2 -2
- package/dist/components/GrLoading/index.js +1 -1
- package/dist/components/GrModal/chunks/{GrModal-lh0lOmoi.js → GrModal-CSOL3fHQ.js} +1 -1
- package/dist/components/GrModal/chunks/{GrModal-lh0lOmoi.js.map → GrModal-CSOL3fHQ.js.map} +1 -1
- package/dist/components/GrModal/index.js +3 -3
- package/dist/components/GrNavbar/chunks/{GrNavbar-BH7XiF9q.js → GrNavbar-CHxwtFIR.js} +1 -1
- package/dist/components/GrNavbar/chunks/{GrNavbar-BH7XiF9q.js.map → GrNavbar-CHxwtFIR.js.map} +1 -1
- package/dist/components/GrNavbar/index.js +2 -2
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-YIWhV85S.js → GrNumberInput-ClPBwkxx.js} +1 -1
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-YIWhV85S.js.map → GrNumberInput-ClPBwkxx.js.map} +1 -1
- package/dist/components/GrNumberInput/index.js +2 -2
- package/dist/components/GrPagination/chunks/{GrPagination-cD6rFO9W.js → GrPagination-D2GS0ShQ.js} +4 -4
- package/dist/components/GrPagination/chunks/GrPagination-D2GS0ShQ.js.map +1 -0
- package/dist/components/GrPagination/index.js +2 -2
- package/dist/components/GrProgressBar/chunks/{GrProgressBar-C2HdYjp4.js → GrProgressBar-BBSFpVEq.js} +1 -1
- package/dist/components/GrProgressBar/chunks/{GrProgressBar-C2HdYjp4.js.map → GrProgressBar-BBSFpVEq.js.map} +1 -1
- package/dist/components/GrProgressBar/index.js +2 -2
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-BV4EW3XO.js → GrPromptDialog-D_TFqKsF.js} +2 -2
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-BV4EW3XO.js.map → GrPromptDialog-D_TFqKsF.js.map} +1 -1
- package/dist/components/GrPromptDialog/index.js +2 -2
- package/dist/components/GrRadio/chunks/{GrRadio-IFU9Hiu2.js → GrRadio-CSbTnrom.js} +1 -1
- package/dist/components/GrRadio/chunks/{GrRadio-IFU9Hiu2.js.map → GrRadio-CSbTnrom.js.map} +1 -1
- package/dist/components/GrRadio/index.js +2 -2
- package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-C8IcJuuF.js → GrRadioGroup-DsrnTygR.js} +1 -1
- package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-C8IcJuuF.js.map → GrRadioGroup-DsrnTygR.js.map} +1 -1
- package/dist/components/GrRadioGroup/index.js +2 -2
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-BMvXREcv.js → GrResponseErrorBanner-K1uZ1mYD.js} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-BMvXREcv.js.map → GrResponseErrorBanner-K1uZ1mYD.js.map} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-CzdTh4gd.js → GrResponseErrorBanner-bM8FC_Bw.js} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-CzdTh4gd.js.map → GrResponseErrorBanner-bM8FC_Bw.js.map} +1 -1
- package/dist/components/GrResponseErrorBanner/index.js +2 -2
- package/dist/components/GrSegmented/chunks/{GrSegmented-BRmwBsEG.js → GrSegmented-DpZGs4VX.js} +1 -1
- package/dist/components/GrSegmented/chunks/{GrSegmented-BRmwBsEG.js.map → GrSegmented-DpZGs4VX.js.map} +1 -1
- package/dist/components/GrSegmented/index.js +2 -2
- package/dist/components/GrSelect/chunks/{GrSelect-W9lbAjRZ.js → GrSelect-DSz7jvUb.js} +132 -106
- package/dist/components/GrSelect/chunks/GrSelect-DSz7jvUb.js.map +1 -0
- package/dist/components/GrSelect/index.js +2 -2
- package/dist/components/GrSidebar/chunks/{GrSidebar-BpBtAGBs.js.map → GrSidebar-BW8LRMZ-.js.map} +1 -1
- package/dist/components/GrSidebar/index.js +2 -2
- package/dist/components/GrSkeleton/chunks/{GrSkeleton-URyMkBqI.js.map → GrSkeleton-B05K0QKh.js.map} +1 -1
- package/dist/components/GrSkeleton/index.js +2 -2
- package/dist/components/GrSwitch/chunks/{GrSwitch-29h0QhMO.js → GrSwitch-CSRtcN5-.js} +1 -1
- package/dist/components/GrSwitch/chunks/{GrSwitch-29h0QhMO.js.map → GrSwitch-CSRtcN5-.js.map} +1 -1
- package/dist/components/GrSwitch/index.js +2 -2
- package/dist/components/GrTable/index.js +1 -1
- package/dist/components/GrTabs/chunks/{GrTabs-D3ntDdtg.js.map → GrTabs-BfeVNMFJ.js.map} +1 -1
- package/dist/components/GrTabs/index.js +2 -2
- package/dist/components/GrTextarea/chunks/{GrTextarea-Cv6r2GuC.js → GrTextarea-CBBzpF2S.js} +1 -1
- package/dist/components/GrTextarea/chunks/{GrTextarea-Cv6r2GuC.js.map → GrTextarea-CBBzpF2S.js.map} +1 -1
- package/dist/components/GrTextarea/index.js +2 -2
- package/dist/components/GrToaster/chunks/{GrToaster-DluJmR5D.js → GrToaster-C6_iHk2J.js} +4 -3
- package/dist/components/GrToaster/chunks/GrToaster-C6_iHk2J.js.map +1 -0
- package/dist/components/GrToaster/index.js +2 -2
- package/dist/components/GrTooltip/chunks/GrTooltip-BC-40SA5.js +109 -0
- package/dist/components/GrTooltip/chunks/GrTooltip-BC-40SA5.js.map +1 -0
- package/dist/components/GrTooltip/index.js +2 -2
- package/dist/components/GrTree/chunks/{GrTree-B2SMU5Py.js.map → GrTree-uZr5SyQI.js.map} +1 -1
- package/dist/components/GrTree/index.js +2 -2
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-C1abr5uH.js → GrTreeSelect-CytivcCa.js} +9 -37
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-CytivcCa.js.map +1 -0
- package/dist/components/GrTreeSelect/index.js +2 -2
- package/dist/granular-provider-node.js +2 -2
- package/dist/granular-provider.js +1 -1
- package/dist/i18n/all.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/index.js +67 -67
- package/dist/types/src/components/GrDropdown/grDropdownStyles.d.ts +3 -2
- package/dist/types/src/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +2 -2
- package/dist/types/src/components/GrDropdownMenu/GrDropdownMenuGroup.vue.d.ts +1 -1
- package/dist/types/src/components/GrDropdownMenu/GrDropdownMenuList.vue.d.ts +2 -2
- package/dist/types/src/components/GrFileUpload/GrFileUpload.vue.d.ts +1 -1
- package/dist/types/src/components/GrLink/GrLink.vue.d.ts +1 -1
- package/dist/types/src/components/GrModal/grModalStyles.d.ts +1 -1
- package/dist/types/src/components/GrSegmented/GrSegmented.vue.d.ts +1 -1
- package/dist/types/src/components/GrSelect/GrSelect.vue.d.ts +11 -10
- package/dist/types/src/components/GrSelect/grSelectStyles.d.ts +7 -0
- package/dist/types/src/components/GrSelect/index.d.ts +1 -1
- package/dist/types/src/composables/internal/useFloating.d.ts +53 -0
- package/dist/types/src/i18n/messages/en.d.ts +12 -0
- package/dist/types/src/i18n/messages/es.d.ts +12 -0
- package/dist/types/src/i18n/messages/ru.d.ts +12 -0
- package/package.json +9 -1
- package/dist/chunks/config-Br_qI3Za.js.map +0 -1
- package/dist/chunks/en-foQA8imU.js.map +0 -1
- package/dist/chunks/es-DZFSojYL.js.map +0 -1
- package/dist/chunks/grDropdownStyles-B41mVR1H.js.map +0 -1
- package/dist/chunks/grModalStyles-DS1Vl6EW.js.map +0 -1
- package/dist/chunks/grSelectStyles-pUt19VGy.js.map +0 -1
- package/dist/chunks/granularityI18n-LcJ88Vce.js.map +0 -1
- package/dist/chunks/ru-LhkPpPIl.js.map +0 -1
- package/dist/components/GrDropdown/chunks/GrDropdown-DOvHKnih.js.map +0 -1
- package/dist/components/GrPagination/chunks/GrPagination-cD6rFO9W.js.map +0 -1
- package/dist/components/GrSelect/chunks/GrSelect-W9lbAjRZ.js.map +0 -1
- package/dist/components/GrToaster/chunks/GrToaster-DluJmR5D.js.map +0 -1
- package/dist/components/GrTooltip/chunks/GrTooltip-B7I1AVIC.js +0 -55
- package/dist/components/GrTooltip/chunks/GrTooltip-B7I1AVIC.js.map +0 -1
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-C1abr5uH.js.map +0 -1
- /package/dist/chunks/{config-d386uO3O.js → config-58Mj2rGH.js} +0 -0
- /package/dist/chunks/{config-D4s_QWVP.js → config-8f8624RN.js} +0 -0
- /package/dist/chunks/{config-B_nSBc7W.js → config-A-iei0Ux.js} +0 -0
- /package/dist/chunks/{config-Dcb7xK-C.js → config-B3dn-gdC.js} +0 -0
- /package/dist/chunks/{config-D6Oe3blW2.js → config-BLa1TEGm2.js} +0 -0
- /package/dist/chunks/{config-Dzd6BzIN2.js → config-BeBsN0c12.js} +0 -0
- /package/dist/chunks/{config-BU0olrvr.js → config-Bh4NWWsQ.js} +0 -0
- /package/dist/chunks/{config-BeQuykDk2.js → config-BuoIngj32.js} +0 -0
- /package/dist/chunks/{config-BbKroFtR.js → config-C5-ujXCI.js} +0 -0
- /package/dist/chunks/{config-DF_RlCIO.js → config-CPSdAjUi.js} +0 -0
- /package/dist/chunks/{config-iuMz79Mg.js → config-CWTfyPNI.js} +0 -0
- /package/dist/chunks/{config-Ci9nXGUV.js → config-C_q_4FrU.js} +0 -0
- /package/dist/chunks/{config-O1_FTqD3.js → config-CzgNEHKi.js} +0 -0
- /package/dist/chunks/{config-Bcf-8XlK2.js → config-DDUPnue12.js} +0 -0
- /package/dist/chunks/{config-DmjwIqx1.js → config-DDwBSoc_.js} +0 -0
- /package/dist/chunks/{config-DaHI5bD_2.js → config-DZrlovR42.js} +0 -0
- /package/dist/chunks/{config-72sW9Bag2.js → config-D_Pafsjq2.js} +0 -0
- /package/dist/chunks/{config-B1kFmhpM.js → config-DhQc1TRY.js} +0 -0
- /package/dist/chunks/{config-CetsgpaZ2.js → config-DkeLkzxj2.js} +0 -0
- /package/dist/chunks/{config-BOdu-O_B.js → config-Dl5aZ5VR.js} +0 -0
- /package/dist/chunks/{config-CvGdaXvH.js → config-Doa_gU40.js} +0 -0
- /package/dist/chunks/{config-CdJpnjDj.js → config-DvDNney3.js} +0 -0
- /package/dist/chunks/{config-CpMYmvVT.js → config-NkbzVFZo.js} +0 -0
- /package/dist/chunks/{config-_3De4HFf.js → config-RjfJFv1Y.js} +0 -0
- /package/dist/chunks/{config-DoBk_CzG.js → config-VJuoznpH.js} +0 -0
- /package/dist/chunks/{config-BnWSHTEU.js → config-XspHtPsU.js} +0 -0
- /package/dist/chunks/{config-B2YTEe_h.js → config-hSlCXHoG.js} +0 -0
- /package/dist/chunks/{config-DSBlHQVa.js → config-lMDE_8A5.js} +0 -0
- /package/dist/chunks/{config-Cp_XHsze.js → config-nrOj9p6I.js} +0 -0
- /package/dist/chunks/{grSelectStyles-pUt19VGy.js → grSelectStyles-AjWWl007.js} +0 -0
- /package/dist/chunks/{grStyle-CUaTmpyW.js → grStyle-D-gPHdyW.js} +0 -0
- /package/dist/components/GrEmptyState/chunks/{GrEmptyState-Dj2V5GaX.js → GrEmptyState-yOuZW7-t.js} +0 -0
- /package/dist/components/GrFormFile/chunks/{GrFormFile-CIleXnfr.js → GrFormFile-CkR6cYqf.js} +0 -0
- /package/dist/components/GrFormSection/chunks/{GrFormSection-DpGhY7MX.js → GrFormSection-dbyzqxYk.js} +0 -0
- /package/dist/components/GrImageViewer/chunks/{GrImageViewer-CsvXQHM9.js → GrImageViewer-BG40DsHa.js} +0 -0
- /package/dist/components/GrList/chunks/{GrList-D8nM1FuV.js → GrList-CUW2sRm_.js} +0 -0
- /package/dist/components/GrSidebar/chunks/{GrSidebar-BpBtAGBs.js → GrSidebar-BW8LRMZ-.js} +0 -0
- /package/dist/components/GrSkeleton/chunks/{GrSkeleton-URyMkBqI.js → GrSkeleton-B05K0QKh.js} +0 -0
- /package/dist/components/GrTabs/chunks/{GrTabs-D3ntDdtg.js → GrTabs-BfeVNMFJ.js} +0 -0
- /package/dist/components/GrTree/chunks/{GrTree-B2SMU5Py.js → GrTree-uZr5SyQI.js} +0 -0
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { t as useGranularityTranslations } from "../../../chunks/granularityI18n-D_7jowK2.js";
|
|
1
2
|
import { t as GrInput_default } from "../../GrInput/chunks/GrInput-gwFQ1sk4.js";
|
|
2
3
|
import { vClickOutside } from "../../../directives/clickOutside.js";
|
|
3
|
-
import {
|
|
4
|
+
import { t as useFloating } from "../../../chunks/useFloating-CLtbU7eD.js";
|
|
5
|
+
import { a as grSelectPanelClasses, i as grSelectNativeClass, n as grSelectLinkNativeLabelClass, o as grSelectTriggerClass, r as grSelectLinkNativeOverlayClass, s as linkBaseClass, t as defaultBaseClass } from "../../../chunks/grSelectStyles-AjWWl007.js";
|
|
4
6
|
import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, onUnmounted, openBlock, ref, renderList, renderSlot, toDisplayString, unref, vShow, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
|
|
5
7
|
//#region src/components/GrSelect/GrSelect.vue?vue&type=script&setup=true&lang.ts
|
|
6
8
|
var _hoisted_1 = [
|
|
@@ -14,37 +16,39 @@ var _hoisted_2 = {
|
|
|
14
16
|
value: ""
|
|
15
17
|
};
|
|
16
18
|
var _hoisted_3 = ["value"];
|
|
17
|
-
var _hoisted_4 = ["
|
|
18
|
-
var _hoisted_5 =
|
|
19
|
+
var _hoisted_4 = ["label"];
|
|
20
|
+
var _hoisted_5 = ["value"];
|
|
21
|
+
var _hoisted_6 = ["value"];
|
|
22
|
+
var _hoisted_7 = {
|
|
19
23
|
key: 1,
|
|
20
24
|
"data-testid": "ds-select-chevron",
|
|
21
25
|
class: "absolute top-1/2 -translate-y-1/2 right-3 text-[var(--muted-fg)] pointer-events-none"
|
|
22
26
|
};
|
|
23
|
-
var
|
|
27
|
+
var _hoisted_8 = [
|
|
24
28
|
"disabled",
|
|
25
29
|
"aria-label",
|
|
26
30
|
"aria-expanded"
|
|
27
31
|
];
|
|
28
|
-
var
|
|
29
|
-
var
|
|
32
|
+
var _hoisted_9 = { class: "min-w-0 flex-1" };
|
|
33
|
+
var _hoisted_10 = {
|
|
30
34
|
key: 0,
|
|
31
35
|
class: "shrink-0 h-4 w-4",
|
|
32
36
|
"aria-hidden": "true"
|
|
33
37
|
};
|
|
34
|
-
var
|
|
38
|
+
var _hoisted_11 = {
|
|
35
39
|
key: 1,
|
|
36
40
|
"data-testid": "ds-select-chevron",
|
|
37
41
|
class: "shrink-0 text-[var(--muted-fg)] pointer-events-none"
|
|
38
42
|
};
|
|
39
|
-
var
|
|
40
|
-
var
|
|
43
|
+
var _hoisted_12 = ["disabled", "aria-label"];
|
|
44
|
+
var _hoisted_13 = {
|
|
41
45
|
key: 0,
|
|
42
46
|
class: "p-2 border-b border-[var(--brd)]"
|
|
43
47
|
};
|
|
44
|
-
var
|
|
45
|
-
var
|
|
46
|
-
var
|
|
47
|
-
var
|
|
48
|
+
var _hoisted_14 = ["aria-multiselectable"];
|
|
49
|
+
var _hoisted_15 = ["aria-selected", "onClick"];
|
|
50
|
+
var _hoisted_16 = { class: "flex items-center gap-2 min-w-0" };
|
|
51
|
+
var _hoisted_17 = { class: "truncate" };
|
|
48
52
|
//#endregion
|
|
49
53
|
//#region src/components/GrSelect/GrSelect.vue
|
|
50
54
|
var GrSelect_default = /* @__PURE__ */ defineComponent({
|
|
@@ -69,7 +73,7 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
|
|
|
69
73
|
type: Boolean,
|
|
70
74
|
default: false
|
|
71
75
|
},
|
|
72
|
-
customValuePlaceholder: { default:
|
|
76
|
+
customValuePlaceholder: { default: void 0 },
|
|
73
77
|
dropdownMaxHeight: { default: 280 },
|
|
74
78
|
closeOnSelect: {
|
|
75
79
|
type: Boolean,
|
|
@@ -79,17 +83,32 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
|
|
|
79
83
|
type: Boolean,
|
|
80
84
|
default: false
|
|
81
85
|
},
|
|
82
|
-
clearLabel: { default:
|
|
86
|
+
clearLabel: { default: void 0 },
|
|
83
87
|
variant: { default: "primary" },
|
|
84
88
|
underline: { default: "auto" }
|
|
85
89
|
},
|
|
86
90
|
emits: ["update:modelValue"],
|
|
87
91
|
setup(__props, { emit: __emit }) {
|
|
88
92
|
const props = __props;
|
|
93
|
+
const { t } = useGranularityTranslations();
|
|
94
|
+
const resolvedCustomValuePlaceholder = computed(() => {
|
|
95
|
+
return props.customValuePlaceholder ?? t("gr.select.customValuePlaceholder", "Add value…");
|
|
96
|
+
});
|
|
97
|
+
const resolvedClearLabel = computed(() => props.clearLabel ?? t("gr.common.clear", "Clear"));
|
|
89
98
|
const baseClassName = computed(() => props.view === "link" ? linkBaseClass : defaultBaseClass);
|
|
90
99
|
const rootClass = computed(() => props.view === "link" ? "relative inline-block align-baseline" : "relative w-full");
|
|
91
100
|
const emit = __emit;
|
|
92
101
|
const optionsResolved = computed(() => props.options ?? []);
|
|
102
|
+
function isOptionGroup(item) {
|
|
103
|
+
return Array.isArray(item.options);
|
|
104
|
+
}
|
|
105
|
+
/** Плоский список всех опций (группы «развёрнуты»). Используется для всех вычислений по значениям. */
|
|
106
|
+
const flatOptions = computed(() => {
|
|
107
|
+
const result = [];
|
|
108
|
+
for (const item of optionsResolved.value) if (isOptionGroup(item)) result.push(...item.options);
|
|
109
|
+
else result.push(item);
|
|
110
|
+
return result;
|
|
111
|
+
});
|
|
93
112
|
function modelToArray(value) {
|
|
94
113
|
if (Array.isArray(value)) return value;
|
|
95
114
|
if (!value) return [];
|
|
@@ -104,7 +123,7 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
|
|
|
104
123
|
});
|
|
105
124
|
const hasSelection = computed(() => selectedValues.value.length > 0);
|
|
106
125
|
const selectedOptions = computed(() => {
|
|
107
|
-
const byValue = new Map(
|
|
126
|
+
const byValue = new Map(flatOptions.value.map((o) => [o.value, o]));
|
|
108
127
|
return selectedValues.value.map((v) => byValue.get(v) ?? {
|
|
109
128
|
value: v,
|
|
110
129
|
label: v
|
|
@@ -112,14 +131,14 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
|
|
|
112
131
|
});
|
|
113
132
|
const hasModelInOptions = computed(() => {
|
|
114
133
|
if (props.multiple) return false;
|
|
115
|
-
return
|
|
134
|
+
return flatOptions.value.some((o) => o.value === modelSingle.value);
|
|
116
135
|
});
|
|
117
136
|
const displayLabel = computed(() => {
|
|
118
137
|
if (props.multiple) {
|
|
119
138
|
if (!selectedValues.value.length) return "";
|
|
120
|
-
return selectedValues.value.map((v) =>
|
|
139
|
+
return selectedValues.value.map((v) => flatOptions.value.find((o) => o.value === v)?.label ?? v).join(", ");
|
|
121
140
|
}
|
|
122
|
-
return
|
|
141
|
+
return flatOptions.value.find((o) => o.value === modelSingle.value)?.label ?? modelSingle.value;
|
|
123
142
|
});
|
|
124
143
|
const displayText = computed(() => {
|
|
125
144
|
if (hasSelection.value) return displayLabel.value;
|
|
@@ -139,44 +158,11 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
|
|
|
139
158
|
const panelEl = ref(null);
|
|
140
159
|
const customInputRef = ref(null);
|
|
141
160
|
const clickOutsideExclude = [() => panelEl.value];
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
zIndex: "2147483647"
|
|
161
|
+
const { floatingStyle, update: updateFloatingPosition } = useFloating(rootEl, panelEl, open, {
|
|
162
|
+
placement: "bottom-start",
|
|
163
|
+
matchWidth: () => props.view === "link" ? "min" : true,
|
|
164
|
+
zIndexVar: "--gr-z-dropdown"
|
|
147
165
|
});
|
|
148
|
-
function syncPanelPosition() {
|
|
149
|
-
if (typeof window === "undefined") return;
|
|
150
|
-
const root = rootEl.value;
|
|
151
|
-
if (!root) return;
|
|
152
|
-
const rect = root.getBoundingClientRect();
|
|
153
|
-
if (props.view === "link") {
|
|
154
|
-
panelStyle.value = {
|
|
155
|
-
left: `${rect.left}px`,
|
|
156
|
-
top: `${rect.bottom + 8}px`,
|
|
157
|
-
width: "max-content",
|
|
158
|
-
minWidth: `${rect.width}px`,
|
|
159
|
-
zIndex: "2147483647"
|
|
160
|
-
};
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
panelStyle.value = {
|
|
164
|
-
left: `${rect.left}px`,
|
|
165
|
-
top: `${rect.bottom + 8}px`,
|
|
166
|
-
width: `${rect.width}px`,
|
|
167
|
-
zIndex: "2147483647"
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
function bindPanelPositionListeners() {
|
|
171
|
-
if (typeof window === "undefined") return;
|
|
172
|
-
window.addEventListener("resize", syncPanelPosition);
|
|
173
|
-
window.addEventListener("scroll", syncPanelPosition, true);
|
|
174
|
-
}
|
|
175
|
-
function unbindPanelPositionListeners() {
|
|
176
|
-
if (typeof window === "undefined") return;
|
|
177
|
-
window.removeEventListener("resize", syncPanelPosition);
|
|
178
|
-
window.removeEventListener("scroll", syncPanelPosition, true);
|
|
179
|
-
}
|
|
180
166
|
function closeDropdown() {
|
|
181
167
|
open.value = false;
|
|
182
168
|
}
|
|
@@ -187,46 +173,74 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
|
|
|
187
173
|
function closeOnEscape(e) {
|
|
188
174
|
if (e.key === "Escape") closeDropdown();
|
|
189
175
|
}
|
|
176
|
+
watch(() => props.view, () => {
|
|
177
|
+
if (open.value) updateFloatingPosition();
|
|
178
|
+
});
|
|
190
179
|
watch(open, async (isOpen) => {
|
|
191
180
|
if (typeof document === "undefined") return;
|
|
192
181
|
document.removeEventListener("keydown", closeOnEscape);
|
|
193
|
-
unbindPanelPositionListeners();
|
|
194
182
|
if (isOpen) document.addEventListener("keydown", closeOnEscape);
|
|
195
183
|
if (!isOpen) {
|
|
196
184
|
customValue.value = "";
|
|
197
185
|
return;
|
|
198
186
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
187
|
+
if (props.allowCustomValue) {
|
|
188
|
+
await nextTick();
|
|
189
|
+
customInputRef.value?.focus();
|
|
190
|
+
}
|
|
203
191
|
}, { immediate: true });
|
|
204
192
|
onUnmounted(() => {
|
|
205
193
|
if (typeof document === "undefined") return;
|
|
206
194
|
document.removeEventListener("keydown", closeOnEscape);
|
|
207
|
-
unbindPanelPositionListeners();
|
|
208
195
|
});
|
|
209
196
|
const panelClasses = computed(() => {
|
|
210
197
|
return grSelectPanelClasses;
|
|
211
198
|
});
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
199
|
+
function matchesQuery(option, query) {
|
|
200
|
+
if (!query) return true;
|
|
201
|
+
return option.label.toLowerCase().includes(query) || option.value.toLowerCase().includes(query);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Элемент рендера панели: либо заголовок группы, либо опция.
|
|
205
|
+
* Группировка сохраняется, фильтрация по `customValue` скрывает пустые группы.
|
|
206
|
+
*/
|
|
207
|
+
const panelItems = computed(() => {
|
|
208
|
+
const q = props.allowCustomValue ? customValue.value.trim().toLowerCase() : "";
|
|
209
|
+
const items = [];
|
|
210
|
+
if (props.allowCustomValue && !props.multiple && modelSingle.value !== "" && !hasModelInOptions.value) {
|
|
211
|
+
const custom = {
|
|
220
212
|
value: modelSingle.value,
|
|
221
213
|
label: modelSingle.value
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
214
|
+
};
|
|
215
|
+
if (matchesQuery(custom, q)) items.push({
|
|
216
|
+
kind: "option",
|
|
217
|
+
option: custom,
|
|
218
|
+
key: `__custom__${custom.value}`
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
optionsResolved.value.forEach((item, index) => {
|
|
222
|
+
if (isOptionGroup(item)) {
|
|
223
|
+
const matched = item.options.filter((o) => matchesQuery(o, q));
|
|
224
|
+
if (!matched.length) return;
|
|
225
|
+
items.push({
|
|
226
|
+
kind: "group",
|
|
227
|
+
label: item.label,
|
|
228
|
+
key: `__group__${index}`
|
|
229
|
+
});
|
|
230
|
+
for (const option of matched) items.push({
|
|
231
|
+
kind: "option",
|
|
232
|
+
option,
|
|
233
|
+
key: option.value
|
|
234
|
+
});
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (matchesQuery(item, q)) items.push({
|
|
238
|
+
kind: "option",
|
|
239
|
+
option: item,
|
|
240
|
+
key: item.value
|
|
241
|
+
});
|
|
229
242
|
});
|
|
243
|
+
return items;
|
|
230
244
|
});
|
|
231
245
|
const canAddCustom = computed(() => {
|
|
232
246
|
if (!props.allowCustomValue) return false;
|
|
@@ -235,10 +249,10 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
|
|
|
235
249
|
if (!v) return false;
|
|
236
250
|
if (props.multiple) {
|
|
237
251
|
if (selectedValues.value.includes(v)) return false;
|
|
238
|
-
return !
|
|
252
|
+
return !flatOptions.value.some((o) => o.value === v);
|
|
239
253
|
}
|
|
240
254
|
if (v === modelSingle.value) return false;
|
|
241
|
-
return !
|
|
255
|
+
return !flatOptions.value.some((o) => o.value === v);
|
|
242
256
|
});
|
|
243
257
|
function emitValue(value) {
|
|
244
258
|
emit("update:modelValue", value);
|
|
@@ -275,7 +289,7 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
|
|
|
275
289
|
if (props.optionsView !== "native") return false;
|
|
276
290
|
if (props.multiple) return false;
|
|
277
291
|
if (!props.options) return true;
|
|
278
|
-
return !
|
|
292
|
+
return !flatOptions.value.some((o) => o.value === "");
|
|
279
293
|
});
|
|
280
294
|
const panelClearVisible = computed(() => {
|
|
281
295
|
if (!props.clearable) return false;
|
|
@@ -348,11 +362,19 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
|
|
|
348
362
|
}, [nativeClearOptionVisible.value ? (openBlock(), createElementBlock("option", _hoisted_2)) : createCommentVNode("", true), renderSlot(_ctx.$slots, "default", {}, () => [nativeCustomOptionVisible.value ? (openBlock(), createElementBlock("option", {
|
|
349
363
|
key: 0,
|
|
350
364
|
value: modelSingle.value
|
|
351
|
-
}, toDisplayString(modelSingle.value), 9, _hoisted_3)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(
|
|
352
|
-
return openBlock(), createElementBlock("
|
|
353
|
-
key:
|
|
354
|
-
|
|
355
|
-
},
|
|
365
|
+
}, toDisplayString(modelSingle.value), 9, _hoisted_3)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(optionsResolved.value, (item, index) => {
|
|
366
|
+
return openBlock(), createElementBlock(Fragment, { key: index }, [isOptionGroup(item) ? (openBlock(), createElementBlock("optgroup", {
|
|
367
|
+
key: 0,
|
|
368
|
+
label: item.label
|
|
369
|
+
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(item.options, (opt) => {
|
|
370
|
+
return openBlock(), createElementBlock("option", {
|
|
371
|
+
key: opt.value,
|
|
372
|
+
value: opt.value
|
|
373
|
+
}, toDisplayString(opt.label), 9, _hoisted_5);
|
|
374
|
+
}), 128))], 8, _hoisted_4)) : (openBlock(), createElementBlock("option", {
|
|
375
|
+
key: 1,
|
|
376
|
+
value: item.value
|
|
377
|
+
}, toDisplayString(item.label), 9, _hoisted_6))], 64);
|
|
356
378
|
}), 128))])], 42, _hoisted_1),
|
|
357
379
|
isLinkNative.value ? (openBlock(), createElementBlock("span", {
|
|
358
380
|
key: 0,
|
|
@@ -360,7 +382,7 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
|
|
|
360
382
|
"aria-hidden": "true",
|
|
361
383
|
class: normalizeClass(linkNativeLabelClassName.value)
|
|
362
384
|
}, toDisplayString(linkNativeDisplayText.value), 3)) : createCommentVNode("", true),
|
|
363
|
-
showNativeChevron.value ? (openBlock(), createElementBlock("span",
|
|
385
|
+
showNativeChevron.value ? (openBlock(), createElementBlock("span", _hoisted_7, [..._cache[1] || (_cache[1] = [createElementVNode("span", {
|
|
364
386
|
class: "i-lucide-chevron-down inline-block h-4 w-4",
|
|
365
387
|
"aria-hidden": "true"
|
|
366
388
|
}, null, -1)])])) : createCommentVNode("", true)
|
|
@@ -382,16 +404,16 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
|
|
|
382
404
|
"aria-expanded": open.value ? "true" : "false",
|
|
383
405
|
class: normalizeClass([baseClassName.value, triggerClassName.value]),
|
|
384
406
|
onClick: toggleDropdown
|
|
385
|
-
}, [createElementVNode("span",
|
|
407
|
+
}, [createElementVNode("span", _hoisted_9, [renderSlot(_ctx.$slots, "value", {
|
|
386
408
|
selectedOptions: selectedOptions.value,
|
|
387
409
|
selectedValues: selectedValues.value,
|
|
388
410
|
displayLabel: displayLabel.value,
|
|
389
411
|
placeholder: __props.placeholder,
|
|
390
412
|
hasSelection: hasSelection.value
|
|
391
|
-
}, () => [createElementVNode("span", { class: normalizeClass(["block truncate", !hasSelection.value ? "text-[var(--muted-fg)]" : ""]) }, toDisplayString(displayText.value), 3)])]), panelClearVisible.value ? (openBlock(), createElementBlock("span",
|
|
413
|
+
}, () => [createElementVNode("span", { class: normalizeClass(["block truncate", !hasSelection.value ? "text-[var(--muted-fg)]" : ""]) }, toDisplayString(displayText.value), 3)])]), panelClearVisible.value ? (openBlock(), createElementBlock("span", _hoisted_10)) : (openBlock(), createElementBlock("span", _hoisted_11, [..._cache[2] || (_cache[2] = [createElementVNode("span", {
|
|
392
414
|
class: "i-lucide-chevron-down inline-block h-4 w-4",
|
|
393
415
|
"aria-hidden": "true"
|
|
394
|
-
}, null, -1)])]))], 10,
|
|
416
|
+
}, null, -1)])]))], 10, _hoisted_8),
|
|
395
417
|
panelClearVisible.value ? (openBlock(), createElementBlock("button", {
|
|
396
418
|
key: 0,
|
|
397
419
|
"data-testid": "ds-select-clear",
|
|
@@ -399,12 +421,12 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
|
|
|
399
421
|
type: "button",
|
|
400
422
|
class: "absolute top-1/2 -translate-y-1/2 right-3 h-6 w-6 inline-flex items-center justify-center rounded-md text-[var(--muted-fg)] hover:text-[var(--fg)] hover:bg-[color-mix(in_srgb,var(--muted)_25%,transparent)] disabled:opacity-50",
|
|
401
423
|
disabled: __props.disabled,
|
|
402
|
-
"aria-label":
|
|
424
|
+
"aria-label": resolvedClearLabel.value,
|
|
403
425
|
onClick: withModifiers(clearSelection, ["stop"])
|
|
404
426
|
}, [..._cache[3] || (_cache[3] = [createElementVNode("span", {
|
|
405
427
|
class: "i-lucide-x inline-block h-4 w-4",
|
|
406
428
|
"aria-hidden": "true"
|
|
407
|
-
}, null, -1)])], 8,
|
|
429
|
+
}, null, -1)])], 8, _hoisted_12)) : createCommentVNode("", true),
|
|
408
430
|
(openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, {
|
|
409
431
|
"enter-active-class": "transition ease-out duration-150",
|
|
410
432
|
"enter-from-class": "transform opacity-0 scale-95",
|
|
@@ -418,16 +440,15 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
|
|
|
418
440
|
ref: panelEl,
|
|
419
441
|
"data-testid": "ds-select-panel",
|
|
420
442
|
"data-ds-select-panel": "",
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
}, [createElementVNode("div", { class: normalizeClass(panelClasses.value) }, [__props.allowCustomValue ? (openBlock(), createElementBlock("div", _hoisted_11, [createVNode(GrInput_default, {
|
|
443
|
+
style: normalizeStyle(unref(floatingStyle))
|
|
444
|
+
}, [createElementVNode("div", { class: normalizeClass(panelClasses.value) }, [__props.allowCustomValue ? (openBlock(), createElementBlock("div", _hoisted_13, [createVNode(GrInput_default, {
|
|
424
445
|
ref_key: "customInputRef",
|
|
425
446
|
ref: customInputRef,
|
|
426
447
|
modelValue: customValue.value,
|
|
427
448
|
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => customValue.value = $event),
|
|
428
449
|
"data-testid": "ds-select-custom-input",
|
|
429
450
|
type: "text",
|
|
430
|
-
placeholder:
|
|
451
|
+
placeholder: resolvedCustomValuePlaceholder.value,
|
|
431
452
|
size: "sm",
|
|
432
453
|
onKeydown: withKeys(withModifiers(addCustom, ["prevent"]), ["enter"])
|
|
433
454
|
}, null, 8, [
|
|
@@ -447,23 +468,28 @@ var GrSelect_default = /* @__PURE__ */ defineComponent({
|
|
|
447
468
|
type: "button",
|
|
448
469
|
class: normalizeClass(["rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--muted)_30%,transparent)]", [__props.view === "link" ? "block min-w-full w-max whitespace-nowrap" : "w-full"]]),
|
|
449
470
|
onClick: addCustom
|
|
450
|
-
}, " Add
|
|
451
|
-
return openBlock(), createElementBlock("
|
|
452
|
-
key:
|
|
471
|
+
}, toDisplayString(unref(t)("gr.select.addOption", "Add \"{value}\"", { value: customValue.value.trim() })), 3)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(panelItems.value, (item) => {
|
|
472
|
+
return openBlock(), createElementBlock(Fragment, { key: item.key }, [item.kind === "group" ? (openBlock(), createElementBlock("div", {
|
|
473
|
+
key: 0,
|
|
474
|
+
"data-ds-select-group-label": "",
|
|
475
|
+
role: "presentation",
|
|
476
|
+
class: normalizeClass(["px-3 pt-2 pb-1 text-[11px] font-semibold uppercase tracking-wide text-[var(--muted-fg)]", [__props.view === "link" ? "block min-w-full w-max whitespace-nowrap" : ""]])
|
|
477
|
+
}, toDisplayString(item.label), 3)) : (openBlock(), createElementBlock("button", {
|
|
478
|
+
key: 1,
|
|
453
479
|
"data-ds-select-option": "",
|
|
454
480
|
type: "button",
|
|
455
481
|
role: "option",
|
|
456
|
-
"aria-selected": isSelected(
|
|
482
|
+
"aria-selected": isSelected(item.option.value) ? "true" : "false",
|
|
457
483
|
class: normalizeClass(["rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--muted)_30%,transparent)]", [__props.view === "link" ? "block min-w-full w-max whitespace-nowrap" : "w-full"]]),
|
|
458
|
-
onClick: ($event) => toggleValue(
|
|
484
|
+
onClick: ($event) => toggleValue(item.option.value)
|
|
459
485
|
}, [renderSlot(_ctx.$slots, "option", {
|
|
460
|
-
option:
|
|
461
|
-
selected: isSelected(
|
|
462
|
-
}, () => [createElementVNode("span",
|
|
463
|
-
class: normalizeClass(["inline-block h-4 w-4 shrink-0", isSelected(
|
|
486
|
+
option: item.option,
|
|
487
|
+
selected: isSelected(item.option.value)
|
|
488
|
+
}, () => [createElementVNode("span", _hoisted_16, [createElementVNode("span", {
|
|
489
|
+
class: normalizeClass(["inline-block h-4 w-4 shrink-0", isSelected(item.option.value) ? "i-lucide-check text-[var(--primary)]" : ""]),
|
|
464
490
|
"aria-hidden": "true"
|
|
465
|
-
}, null, 2), createElementVNode("span",
|
|
466
|
-
}), 128))], 12,
|
|
491
|
+
}, null, 2), createElementVNode("span", _hoisted_17, toDisplayString(item.option.label), 1)])])], 10, _hoisted_15))], 64);
|
|
492
|
+
}), 128))], 12, _hoisted_14)], 2)], 4), [[vShow, open.value]])]),
|
|
467
493
|
_: 3
|
|
468
494
|
})]))
|
|
469
495
|
], 2)), [[unref(vClickOutside), {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrSelect-DSz7jvUb.js","names":[],"sources":["../../../../src/components/GrSelect/GrSelect.vue","../../../../src/components/GrSelect/GrSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onUnmounted, ref, watch } from 'vue'\n\nimport GrInput from '../GrInput/GrInput.vue'\nimport { vClickOutside } from '../../directives'\nimport { useFloating } from '../../composables/internal/useFloating'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n\nimport {\n defaultBaseClass,\n grSelectLinkNativeLabelClass,\n grSelectLinkNativeOverlayClass,\n grSelectNativeClass,\n grSelectPanelClasses,\n grSelectTriggerClass,\n linkBaseClass,\n type GrSelectModelValue,\n type GrSelectOption,\n type GrSelectOptionGroup,\n type GrSelectOptionOrGroup,\n type GrSelectOptionsView,\n type GrSelectSize,\n type GrSelectUnderline,\n type GrSelectVariant,\n type GrSelectView,\n} from './grSelectStyles'\n\nexport type {\n GrSelectModelValue,\n GrSelectOption,\n GrSelectOptionGroup,\n GrSelectOptionOrGroup,\n GrSelectOptionsView,\n GrSelectSize,\n GrSelectUnderline,\n GrSelectVariant,\n GrSelectView,\n} from './grSelectStyles'\n\n/**\n * Пропсы публичного DS-примитива «Select».\n */\nexport interface GrSelectProps {\n modelValue: GrSelectModelValue\n /** Список опций. Поддерживает плоский массив опций и группы опций (`{ label, options }`). */\n options?: GrSelectOptionOrGroup[]\n disabled?: boolean\n ariaLabel?: string\n view?: GrSelectView\n size?: GrSelectSize\n /** Placeholder (показывается, когда значение не выбрано). */\n placeholder?: string\n /** Multiple selection. */\n multiple?: boolean\n /** Как отображать список опций: нативный `<select>` или кастомная панель. */\n optionsView?: GrSelectOptionsView\n /** Разрешает ввод/выбор значения, которого нет в `options`. */\n allowCustomValue?: boolean\n /** Placeholder для инпута кастомного значения (только в `optionsView=\"panel\"`). i18n-friendly: если не задан — берётся из адаптера перевода (`gr.select.customValuePlaceholder`), иначе — встроенный fallback. */\n customValuePlaceholder?: string\n /** Максимальная высота панели (только в `optionsView=\"panel\"`). */\n dropdownMaxHeight?: number\n /** Закрывать панель после выбора (только в `optionsView=\"panel\"`). */\n closeOnSelect?: boolean\n /** Разрешает очистку выбранного значения. */\n clearable?: boolean\n /** i18n-label для кнопки очистки (`aria-label`). */\n clearLabel?: string\n /**\n * Цвет/вариант ссылки для `view=\"link\"` (аналогично `GrLink`).\n * В `view=\"default\"` не используется.\n */\n variant?: GrSelectVariant\n /**\n * Подчёркивание для `view=\"link\"` (аналогично `GrLink`).\n * В `view=\"default\"` не используется.\n */\n underline?: GrSelectUnderline\n}\n\nconst props = withDefaults(\n defineProps<GrSelectProps>(),\n {\n options: undefined,\n disabled: false,\n ariaLabel: undefined,\n view: 'default',\n size: 'md',\n\n placeholder: undefined,\n multiple: false,\n\n optionsView: 'native',\n allowCustomValue: false,\n customValuePlaceholder: undefined,\n dropdownMaxHeight: 280,\n closeOnSelect: true,\n clearable: false,\n clearLabel: undefined,\n variant: 'primary',\n underline: 'auto',\n },\n)\n\nconst { t } = useGranularityTranslations()\n\nconst resolvedCustomValuePlaceholder = computed(() => {\n return props.customValuePlaceholder ?? t('gr.select.customValuePlaceholder', 'Add value…')\n})\n\nconst resolvedClearLabel = computed(() => props.clearLabel ?? t('gr.common.clear', 'Clear'))\n\nconst baseClassName = computed(() => props.view === 'link' ? linkBaseClass : defaultBaseClass)\n\nconst rootClass = computed(() => props.view === 'link' ? 'relative inline-block align-baseline' : 'relative w-full')\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: GrSelectModelValue): void\n}>()\n\nconst optionsResolved = computed<GrSelectOptionOrGroup[]>(() => props.options ?? [])\n\nfunction isOptionGroup(item: GrSelectOptionOrGroup): item is GrSelectOptionGroup {\n return Array.isArray((item as GrSelectOptionGroup).options)\n}\n\n/** Плоский список всех опций (группы «развёрнуты»). Используется для всех вычислений по значениям. */\nconst flatOptions = computed<GrSelectOption[]>(() => {\n const result: GrSelectOption[] = []\n for (const item of optionsResolved.value) {\n if (isOptionGroup(item)) result.push(...item.options)\n else result.push(item)\n }\n return result\n})\n\nfunction modelToArray(value: GrSelectModelValue): string[] {\n if (Array.isArray(value)) return value\n if (!value) return []\n return [value]\n}\n\nconst modelSingle = computed(() => {\n return Array.isArray(props.modelValue) ? (props.modelValue[0] ?? '') : props.modelValue\n})\n\nconst modelMultiple = computed(() => modelToArray(props.modelValue))\n\nconst selectedValues = computed(() => {\n return props.multiple ? modelMultiple.value : (modelSingle.value ? [modelSingle.value] : [])\n})\n\nconst hasSelection = computed(() => selectedValues.value.length > 0)\n\nconst selectedOptions = computed<GrSelectOption[]>(() => {\n const byValue = new Map(flatOptions.value.map(o => [o.value, o]))\n return selectedValues.value.map((v) => byValue.get(v) ?? { value: v, label: v })\n})\n\nconst hasModelInOptions = computed(() => {\n if (props.multiple) return false\n return flatOptions.value.some((o) => o.value === modelSingle.value)\n})\n\nconst displayLabel = computed(() => {\n if (props.multiple) {\n if (!selectedValues.value.length) return ''\n return selectedValues.value\n .map((v) => flatOptions.value.find((o) => o.value === v)?.label ?? v)\n .join(', ')\n }\n\n return flatOptions.value.find((o) => o.value === modelSingle.value)?.label ?? modelSingle.value\n})\n\nconst displayText = computed(() => {\n if (hasSelection.value) return displayLabel.value\n return props.placeholder ?? ''\n})\n\nconst nativeCustomOptionVisible = computed(() => {\n if (!props.allowCustomValue) return false\n if (props.optionsView !== 'native') return false\n if (props.multiple) return false\n if (!props.options) return false\n if (modelSingle.value === '') return false\n return !hasModelInOptions.value\n})\n\nconst customValue = ref('')\nconst open = ref(false)\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst customInputRef = ref<InstanceType<typeof GrInput> | null>(null)\nconst clickOutsideExclude = [() => panelEl.value]\n\n// Для `view='link'` ширина триггера = ширине выбранной опции (`inline-block w-auto`),\n// поэтому панель растёт по контенту (`matchWidth: 'min'` → `width: max-content` +\n// `min-width` от триггера), а не сжимается до неё. Для `view='default'` панель точно\n// повторяет ширину триггера (`matchWidth: true`).\nconst { floatingStyle, update: updateFloatingPosition } = useFloating(rootEl, panelEl, open, {\n placement: 'bottom-start',\n matchWidth: () => (props.view === 'link' ? 'min' : true),\n zIndexVar: '--gr-z-dropdown',\n})\n\nfunction closeDropdown(): void {\n open.value = false\n}\n\nfunction toggleDropdown(): void {\n if (props.disabled) return\n open.value = !open.value\n}\n\nfunction closeOnEscape(e: KeyboardEvent): void {\n if (e.key === 'Escape') closeDropdown()\n}\n\n// `view` определяет режим `matchWidth` (см. выше) — пересчитываем позицию/ширину\n// панели, если он меняется, пока панель открыта.\nwatch(\n () => props.view,\n () => {\n if (open.value) updateFloatingPosition()\n },\n)\n\nwatch(\n open,\n async (isOpen) => {\n if (typeof document === 'undefined') return\n\n document.removeEventListener('keydown', closeOnEscape)\n\n if (isOpen) document.addEventListener('keydown', closeOnEscape)\n\n if (!isOpen) {\n customValue.value = ''\n return\n }\n\n if (props.allowCustomValue) {\n await nextTick()\n customInputRef.value?.focus()\n }\n },\n { immediate: true },\n)\n\nonUnmounted(() => {\n if (typeof document === 'undefined') return\n document.removeEventListener('keydown', closeOnEscape)\n})\n\nconst panelClasses = computed(() => {\n return grSelectPanelClasses\n})\n\nfunction matchesQuery(option: GrSelectOption, query: string): boolean {\n if (!query) return true\n return option.label.toLowerCase().includes(query) || option.value.toLowerCase().includes(query)\n}\n\n/**\n * Элемент рендера панели: либо заголовок группы, либо опция.\n * Группировка сохраняется, фильтрация по `customValue` скрывает пустые группы.\n */\ntype GrSelectPanelItem =\n | { kind: 'group', label: string, key: string }\n | { kind: 'option', option: GrSelectOption, key: string }\n\nconst panelItems = computed<GrSelectPanelItem[]>(() => {\n const q = props.allowCustomValue ? customValue.value.trim().toLowerCase() : ''\n const items: GrSelectPanelItem[] = []\n\n // Опция для кастомного значения, которого нет в options (single).\n if (props.allowCustomValue && !props.multiple && modelSingle.value !== '' && !hasModelInOptions.value) {\n const custom: GrSelectOption = { value: modelSingle.value, label: modelSingle.value }\n if (matchesQuery(custom, q)) {\n items.push({ kind: 'option', option: custom, key: `__custom__${custom.value}` })\n }\n }\n\n optionsResolved.value.forEach((item, index) => {\n if (isOptionGroup(item)) {\n const matched = item.options.filter((o) => matchesQuery(o, q))\n if (!matched.length) return\n items.push({ kind: 'group', label: item.label, key: `__group__${index}` })\n for (const option of matched) {\n items.push({ kind: 'option', option, key: option.value })\n }\n return\n }\n\n if (matchesQuery(item, q)) {\n items.push({ kind: 'option', option: item, key: item.value })\n }\n })\n\n return items\n})\n\nconst canAddCustom = computed(() => {\n if (!props.allowCustomValue) return false\n if (props.optionsView !== 'panel') return false\n const v = customValue.value.trim()\n if (!v) return false\n\n if (props.multiple) {\n if (selectedValues.value.includes(v)) return false\n return !flatOptions.value.some((o) => o.value === v)\n }\n\n if (v === modelSingle.value) return false\n return !flatOptions.value.some((o) => o.value === v)\n})\n\nfunction emitValue(value: GrSelectModelValue): void {\n emit('update:modelValue', value)\n}\n\nfunction isSelected(value: string): boolean {\n return selectedValues.value.includes(value)\n}\n\nfunction selectValue(value: string): void {\n emitValue(value)\n if (props.closeOnSelect) {\n closeDropdown()\n }\n}\n\nfunction toggleValue(value: string): void {\n if (!props.multiple) {\n selectValue(value)\n return\n }\n\n const next = selectedValues.value.slice()\n const idx = next.indexOf(value)\n if (idx >= 0) {\n next.splice(idx, 1)\n }\n else {\n next.push(value)\n }\n\n emitValue(next)\n if (props.closeOnSelect) {\n closeDropdown()\n }\n}\n\nfunction addCustom(): void {\n const v = customValue.value.trim()\n if (!v) return\n toggleValue(v)\n}\n\nconst showNativeChevron = computed(() => {\n return props.optionsView === 'native' && props.view !== 'link' && !props.multiple\n})\n\nconst nativeClearOptionVisible = computed(() => {\n if (!props.clearable) return false\n if (props.optionsView !== 'native') return false\n if (props.multiple) return false\n if (!props.options) return true\n return !flatOptions.value.some(o => o.value === '')\n})\n\nconst panelClearVisible = computed(() => {\n if (!props.clearable) return false\n if (props.optionsView !== 'panel') return false\n if (props.view === 'link') return false\n return hasSelection.value\n})\n\nconst nativeClassName = computed(() => {\n return grSelectNativeClass({\n view: props.view,\n size: props.size,\n disabled: props.disabled,\n variant: props.variant,\n underline: props.underline,\n showNativeChevron: showNativeChevron.value,\n })\n})\n\n/**\n * `view=\"link\"` в native-режиме: ширина обёртки должна определяться выбранной опцией,\n * а не самой длинной (как делает браузер по умолчанию). Поэтому рендерим прозрачный\n * `<select>`-overlay поверх видимого `<span>` с меткой — overlay принимает клики/клавиатуру,\n * span задаёт ширину компонента в закрытом состоянии.\n */\nconst isLinkNative = computed(() => props.view === 'link' && props.optionsView === 'native')\n\nconst linkNativeLabelClassName = computed(() => grSelectLinkNativeLabelClass({\n size: props.size,\n variant: props.variant,\n underline: props.underline,\n disabled: props.disabled,\n}))\n\nconst linkNativeDisplayText = computed(() => {\n return displayText.value || props.placeholder || '\\u00A0'\n})\n\nconst triggerClassName = computed(() => {\n return grSelectTriggerClass({\n view: props.view,\n optionsView: props.optionsView,\n size: props.size,\n disabled: props.disabled,\n variant: props.variant,\n underline: props.underline,\n })\n})\n\nfunction onChange(e: Event): void {\n const el = e.target as HTMLSelectElement\n\n if (props.multiple) {\n const values = Array.from(el.selectedOptions, o => o.value)\n emit('update:modelValue', values)\n return\n }\n\n emit('update:modelValue', el.value)\n}\n\nfunction clearSelection(): void {\n if (props.disabled) return\n emitValue(props.multiple ? [] : '')\n}\n</script>\n\n<template>\n <div\n v-if=\"optionsView === 'native'\"\n data-ds-select\n :class=\"rootClass\"\n >\n <select\n data-ds-select-native\n :value=\"multiple ? modelMultiple : modelSingle\"\n :multiple=\"multiple\"\n :disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n :class=\"isLinkNative ? grSelectLinkNativeOverlayClass : [baseClassName, nativeClassName]\"\n @change=\"onChange\"\n >\n <option v-if=\"nativeClearOptionVisible\" value=\"\" />\n\n <slot>\n <option v-if=\"nativeCustomOptionVisible\" :value=\"modelSingle\">\n {{ modelSingle }}\n </option>\n <template v-for=\"(item, index) in optionsResolved\" :key=\"index\">\n <optgroup v-if=\"isOptionGroup(item)\" :label=\"item.label\">\n <option v-for=\"opt in item.options\" :key=\"opt.value\" :value=\"opt.value\">\n {{ opt.label }}\n </option>\n </optgroup>\n <option v-else :value=\"item.value\">\n {{ item.label }}\n </option>\n </template>\n </slot>\n </select>\n\n <span\n v-if=\"isLinkNative\"\n data-ds-select-link-label\n aria-hidden=\"true\"\n :class=\"linkNativeLabelClassName\"\n >{{ linkNativeDisplayText }}</span>\n\n <span\n v-if=\"showNativeChevron\"\n data-testid=\"ds-select-chevron\"\n class=\"absolute top-1/2 -translate-y-1/2 right-3 text-[var(--muted-fg)] pointer-events-none\"\n >\n <span class=\"i-lucide-chevron-down inline-block h-4 w-4\" aria-hidden=\"true\" />\n </span>\n </div>\n\n <div\n v-else\n ref=\"rootEl\"\n v-click-outside=\"{ handler: closeDropdown, enabled: open, exclude: clickOutsideExclude }\"\n data-ds-select\n :class=\"rootClass\"\n >\n <button\n data-testid=\"ds-select-trigger\"\n data-ds-select-trigger\n type=\"button\"\n :disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n role=\"combobox\"\n aria-readonly=\"true\"\n :aria-expanded=\"open ? 'true' : 'false'\"\n :class=\"[baseClassName, triggerClassName]\"\n @click=\"toggleDropdown\"\n >\n <span class=\"min-w-0 flex-1\">\n <slot\n name=\"value\"\n :selected-options=\"selectedOptions\"\n :selected-values=\"selectedValues\"\n :display-label=\"displayLabel\"\n :placeholder=\"placeholder\"\n :has-selection=\"hasSelection\"\n >\n <span\n class=\"block truncate\"\n :class=\"!hasSelection ? 'text-[var(--muted-fg)]' : ''\"\n >\n {{ displayText }}\n </span>\n </slot>\n </span>\n\n <span\n v-if=\"panelClearVisible\"\n class=\"shrink-0 h-4 w-4\"\n aria-hidden=\"true\"\n />\n\n <span\n v-else\n data-testid=\"ds-select-chevron\"\n class=\"shrink-0 text-[var(--muted-fg)] pointer-events-none\"\n >\n <span class=\"i-lucide-chevron-down inline-block h-4 w-4\" aria-hidden=\"true\" />\n </span>\n </button>\n\n <button\n v-if=\"panelClearVisible\"\n data-testid=\"ds-select-clear\"\n data-ds-select-clear\n type=\"button\"\n class=\"absolute top-1/2 -translate-y-1/2 right-3 h-6 w-6 inline-flex items-center justify-center rounded-md text-[var(--muted-fg)] hover:text-[var(--fg)] hover:bg-[color-mix(in_srgb,var(--muted)_25%,transparent)] disabled:opacity-50\"\n :disabled=\"disabled\"\n :aria-label=\"resolvedClearLabel\"\n @click.stop=\"clearSelection\"\n >\n <span class=\"i-lucide-x inline-block h-4 w-4\" aria-hidden=\"true\" />\n </button>\n\n <teleport to=\"body\">\n <transition\n enter-active-class=\"transition ease-out duration-150\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-100\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-show=\"open\"\n ref=\"panelEl\"\n data-testid=\"ds-select-panel\"\n data-ds-select-panel\n :style=\"floatingStyle\"\n >\n <div :class=\"panelClasses\">\n <div v-if=\"allowCustomValue\" class=\"p-2 border-b border-[var(--brd)]\">\n <GrInput\n ref=\"customInputRef\"\n v-model=\"customValue\"\n data-testid=\"ds-select-custom-input\"\n type=\"text\"\n :placeholder=\"resolvedCustomValuePlaceholder\"\n size=\"sm\"\n @keydown.enter.prevent=\"addCustom\"\n />\n </div>\n\n <div\n data-ds-select-listbox\n class=\"p-1 overflow-auto\"\n :style=\"{ maxHeight: `${dropdownMaxHeight}px` }\"\n role=\"listbox\"\n :aria-multiselectable=\"multiple ? 'true' : undefined\"\n >\n <button\n v-if=\"canAddCustom\"\n data-testid=\"ds-select-add-option\"\n data-ds-select-add-option\n type=\"button\"\n class=\"rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--muted)_30%,transparent)]\" :class=\"[\n view === 'link' ? 'block min-w-full w-max whitespace-nowrap' : 'w-full',\n ]\"\n @click=\"addCustom\"\n >\n {{ t('gr.select.addOption', 'Add \"{value}\"', { value: customValue.trim() }) }}\n </button>\n\n <template v-for=\"item in panelItems\" :key=\"item.key\">\n <div\n v-if=\"item.kind === 'group'\"\n data-ds-select-group-label\n role=\"presentation\"\n class=\"px-3 pt-2 pb-1 text-[11px] font-semibold uppercase tracking-wide text-[var(--muted-fg)]\" :class=\"[\n view === 'link' ? 'block min-w-full w-max whitespace-nowrap' : '',\n ]\"\n >\n {{ item.label }}\n </div>\n\n <button\n v-else\n data-ds-select-option\n type=\"button\"\n role=\"option\"\n :aria-selected=\"isSelected(item.option.value) ? 'true' : 'false'\"\n class=\"rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--muted)_30%,transparent)]\" :class=\"[\n view === 'link' ? 'block min-w-full w-max whitespace-nowrap' : 'w-full',\n ]\"\n @click=\"toggleValue(item.option.value)\"\n >\n <slot name=\"option\" :option=\"item.option\" :selected=\"isSelected(item.option.value)\">\n <span class=\"flex items-center gap-2 min-w-0\">\n <span\n class=\"inline-block h-4 w-4 shrink-0\"\n :class=\"isSelected(item.option.value) ? 'i-lucide-check text-[var(--primary)]' : ''\"\n aria-hidden=\"true\"\n />\n <span class=\"truncate\">{{ item.option.label }}</span>\n </span>\n </slot>\n </button>\n </template>\n </div>\n </div>\n </div>\n </transition>\n </teleport>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onUnmounted, ref, watch } from 'vue'\n\nimport GrInput from '../GrInput/GrInput.vue'\nimport { vClickOutside } from '../../directives'\nimport { useFloating } from '../../composables/internal/useFloating'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n\nimport {\n defaultBaseClass,\n grSelectLinkNativeLabelClass,\n grSelectLinkNativeOverlayClass,\n grSelectNativeClass,\n grSelectPanelClasses,\n grSelectTriggerClass,\n linkBaseClass,\n type GrSelectModelValue,\n type GrSelectOption,\n type GrSelectOptionGroup,\n type GrSelectOptionOrGroup,\n type GrSelectOptionsView,\n type GrSelectSize,\n type GrSelectUnderline,\n type GrSelectVariant,\n type GrSelectView,\n} from './grSelectStyles'\n\nexport type {\n GrSelectModelValue,\n GrSelectOption,\n GrSelectOptionGroup,\n GrSelectOptionOrGroup,\n GrSelectOptionsView,\n GrSelectSize,\n GrSelectUnderline,\n GrSelectVariant,\n GrSelectView,\n} from './grSelectStyles'\n\n/**\n * Пропсы публичного DS-примитива «Select».\n */\nexport interface GrSelectProps {\n modelValue: GrSelectModelValue\n /** Список опций. Поддерживает плоский массив опций и группы опций (`{ label, options }`). */\n options?: GrSelectOptionOrGroup[]\n disabled?: boolean\n ariaLabel?: string\n view?: GrSelectView\n size?: GrSelectSize\n /** Placeholder (показывается, когда значение не выбрано). */\n placeholder?: string\n /** Multiple selection. */\n multiple?: boolean\n /** Как отображать список опций: нативный `<select>` или кастомная панель. */\n optionsView?: GrSelectOptionsView\n /** Разрешает ввод/выбор значения, которого нет в `options`. */\n allowCustomValue?: boolean\n /** Placeholder для инпута кастомного значения (только в `optionsView=\"panel\"`). i18n-friendly: если не задан — берётся из адаптера перевода (`gr.select.customValuePlaceholder`), иначе — встроенный fallback. */\n customValuePlaceholder?: string\n /** Максимальная высота панели (только в `optionsView=\"panel\"`). */\n dropdownMaxHeight?: number\n /** Закрывать панель после выбора (только в `optionsView=\"panel\"`). */\n closeOnSelect?: boolean\n /** Разрешает очистку выбранного значения. */\n clearable?: boolean\n /** i18n-label для кнопки очистки (`aria-label`). */\n clearLabel?: string\n /**\n * Цвет/вариант ссылки для `view=\"link\"` (аналогично `GrLink`).\n * В `view=\"default\"` не используется.\n */\n variant?: GrSelectVariant\n /**\n * Подчёркивание для `view=\"link\"` (аналогично `GrLink`).\n * В `view=\"default\"` не используется.\n */\n underline?: GrSelectUnderline\n}\n\nconst props = withDefaults(\n defineProps<GrSelectProps>(),\n {\n options: undefined,\n disabled: false,\n ariaLabel: undefined,\n view: 'default',\n size: 'md',\n\n placeholder: undefined,\n multiple: false,\n\n optionsView: 'native',\n allowCustomValue: false,\n customValuePlaceholder: undefined,\n dropdownMaxHeight: 280,\n closeOnSelect: true,\n clearable: false,\n clearLabel: undefined,\n variant: 'primary',\n underline: 'auto',\n },\n)\n\nconst { t } = useGranularityTranslations()\n\nconst resolvedCustomValuePlaceholder = computed(() => {\n return props.customValuePlaceholder ?? t('gr.select.customValuePlaceholder', 'Add value…')\n})\n\nconst resolvedClearLabel = computed(() => props.clearLabel ?? t('gr.common.clear', 'Clear'))\n\nconst baseClassName = computed(() => props.view === 'link' ? linkBaseClass : defaultBaseClass)\n\nconst rootClass = computed(() => props.view === 'link' ? 'relative inline-block align-baseline' : 'relative w-full')\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: GrSelectModelValue): void\n}>()\n\nconst optionsResolved = computed<GrSelectOptionOrGroup[]>(() => props.options ?? [])\n\nfunction isOptionGroup(item: GrSelectOptionOrGroup): item is GrSelectOptionGroup {\n return Array.isArray((item as GrSelectOptionGroup).options)\n}\n\n/** Плоский список всех опций (группы «развёрнуты»). Используется для всех вычислений по значениям. */\nconst flatOptions = computed<GrSelectOption[]>(() => {\n const result: GrSelectOption[] = []\n for (const item of optionsResolved.value) {\n if (isOptionGroup(item)) result.push(...item.options)\n else result.push(item)\n }\n return result\n})\n\nfunction modelToArray(value: GrSelectModelValue): string[] {\n if (Array.isArray(value)) return value\n if (!value) return []\n return [value]\n}\n\nconst modelSingle = computed(() => {\n return Array.isArray(props.modelValue) ? (props.modelValue[0] ?? '') : props.modelValue\n})\n\nconst modelMultiple = computed(() => modelToArray(props.modelValue))\n\nconst selectedValues = computed(() => {\n return props.multiple ? modelMultiple.value : (modelSingle.value ? [modelSingle.value] : [])\n})\n\nconst hasSelection = computed(() => selectedValues.value.length > 0)\n\nconst selectedOptions = computed<GrSelectOption[]>(() => {\n const byValue = new Map(flatOptions.value.map(o => [o.value, o]))\n return selectedValues.value.map((v) => byValue.get(v) ?? { value: v, label: v })\n})\n\nconst hasModelInOptions = computed(() => {\n if (props.multiple) return false\n return flatOptions.value.some((o) => o.value === modelSingle.value)\n})\n\nconst displayLabel = computed(() => {\n if (props.multiple) {\n if (!selectedValues.value.length) return ''\n return selectedValues.value\n .map((v) => flatOptions.value.find((o) => o.value === v)?.label ?? v)\n .join(', ')\n }\n\n return flatOptions.value.find((o) => o.value === modelSingle.value)?.label ?? modelSingle.value\n})\n\nconst displayText = computed(() => {\n if (hasSelection.value) return displayLabel.value\n return props.placeholder ?? ''\n})\n\nconst nativeCustomOptionVisible = computed(() => {\n if (!props.allowCustomValue) return false\n if (props.optionsView !== 'native') return false\n if (props.multiple) return false\n if (!props.options) return false\n if (modelSingle.value === '') return false\n return !hasModelInOptions.value\n})\n\nconst customValue = ref('')\nconst open = ref(false)\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst customInputRef = ref<InstanceType<typeof GrInput> | null>(null)\nconst clickOutsideExclude = [() => panelEl.value]\n\n// Для `view='link'` ширина триггера = ширине выбранной опции (`inline-block w-auto`),\n// поэтому панель растёт по контенту (`matchWidth: 'min'` → `width: max-content` +\n// `min-width` от триггера), а не сжимается до неё. Для `view='default'` панель точно\n// повторяет ширину триггера (`matchWidth: true`).\nconst { floatingStyle, update: updateFloatingPosition } = useFloating(rootEl, panelEl, open, {\n placement: 'bottom-start',\n matchWidth: () => (props.view === 'link' ? 'min' : true),\n zIndexVar: '--gr-z-dropdown',\n})\n\nfunction closeDropdown(): void {\n open.value = false\n}\n\nfunction toggleDropdown(): void {\n if (props.disabled) return\n open.value = !open.value\n}\n\nfunction closeOnEscape(e: KeyboardEvent): void {\n if (e.key === 'Escape') closeDropdown()\n}\n\n// `view` определяет режим `matchWidth` (см. выше) — пересчитываем позицию/ширину\n// панели, если он меняется, пока панель открыта.\nwatch(\n () => props.view,\n () => {\n if (open.value) updateFloatingPosition()\n },\n)\n\nwatch(\n open,\n async (isOpen) => {\n if (typeof document === 'undefined') return\n\n document.removeEventListener('keydown', closeOnEscape)\n\n if (isOpen) document.addEventListener('keydown', closeOnEscape)\n\n if (!isOpen) {\n customValue.value = ''\n return\n }\n\n if (props.allowCustomValue) {\n await nextTick()\n customInputRef.value?.focus()\n }\n },\n { immediate: true },\n)\n\nonUnmounted(() => {\n if (typeof document === 'undefined') return\n document.removeEventListener('keydown', closeOnEscape)\n})\n\nconst panelClasses = computed(() => {\n return grSelectPanelClasses\n})\n\nfunction matchesQuery(option: GrSelectOption, query: string): boolean {\n if (!query) return true\n return option.label.toLowerCase().includes(query) || option.value.toLowerCase().includes(query)\n}\n\n/**\n * Элемент рендера панели: либо заголовок группы, либо опция.\n * Группировка сохраняется, фильтрация по `customValue` скрывает пустые группы.\n */\ntype GrSelectPanelItem =\n | { kind: 'group', label: string, key: string }\n | { kind: 'option', option: GrSelectOption, key: string }\n\nconst panelItems = computed<GrSelectPanelItem[]>(() => {\n const q = props.allowCustomValue ? customValue.value.trim().toLowerCase() : ''\n const items: GrSelectPanelItem[] = []\n\n // Опция для кастомного значения, которого нет в options (single).\n if (props.allowCustomValue && !props.multiple && modelSingle.value !== '' && !hasModelInOptions.value) {\n const custom: GrSelectOption = { value: modelSingle.value, label: modelSingle.value }\n if (matchesQuery(custom, q)) {\n items.push({ kind: 'option', option: custom, key: `__custom__${custom.value}` })\n }\n }\n\n optionsResolved.value.forEach((item, index) => {\n if (isOptionGroup(item)) {\n const matched = item.options.filter((o) => matchesQuery(o, q))\n if (!matched.length) return\n items.push({ kind: 'group', label: item.label, key: `__group__${index}` })\n for (const option of matched) {\n items.push({ kind: 'option', option, key: option.value })\n }\n return\n }\n\n if (matchesQuery(item, q)) {\n items.push({ kind: 'option', option: item, key: item.value })\n }\n })\n\n return items\n})\n\nconst canAddCustom = computed(() => {\n if (!props.allowCustomValue) return false\n if (props.optionsView !== 'panel') return false\n const v = customValue.value.trim()\n if (!v) return false\n\n if (props.multiple) {\n if (selectedValues.value.includes(v)) return false\n return !flatOptions.value.some((o) => o.value === v)\n }\n\n if (v === modelSingle.value) return false\n return !flatOptions.value.some((o) => o.value === v)\n})\n\nfunction emitValue(value: GrSelectModelValue): void {\n emit('update:modelValue', value)\n}\n\nfunction isSelected(value: string): boolean {\n return selectedValues.value.includes(value)\n}\n\nfunction selectValue(value: string): void {\n emitValue(value)\n if (props.closeOnSelect) {\n closeDropdown()\n }\n}\n\nfunction toggleValue(value: string): void {\n if (!props.multiple) {\n selectValue(value)\n return\n }\n\n const next = selectedValues.value.slice()\n const idx = next.indexOf(value)\n if (idx >= 0) {\n next.splice(idx, 1)\n }\n else {\n next.push(value)\n }\n\n emitValue(next)\n if (props.closeOnSelect) {\n closeDropdown()\n }\n}\n\nfunction addCustom(): void {\n const v = customValue.value.trim()\n if (!v) return\n toggleValue(v)\n}\n\nconst showNativeChevron = computed(() => {\n return props.optionsView === 'native' && props.view !== 'link' && !props.multiple\n})\n\nconst nativeClearOptionVisible = computed(() => {\n if (!props.clearable) return false\n if (props.optionsView !== 'native') return false\n if (props.multiple) return false\n if (!props.options) return true\n return !flatOptions.value.some(o => o.value === '')\n})\n\nconst panelClearVisible = computed(() => {\n if (!props.clearable) return false\n if (props.optionsView !== 'panel') return false\n if (props.view === 'link') return false\n return hasSelection.value\n})\n\nconst nativeClassName = computed(() => {\n return grSelectNativeClass({\n view: props.view,\n size: props.size,\n disabled: props.disabled,\n variant: props.variant,\n underline: props.underline,\n showNativeChevron: showNativeChevron.value,\n })\n})\n\n/**\n * `view=\"link\"` в native-режиме: ширина обёртки должна определяться выбранной опцией,\n * а не самой длинной (как делает браузер по умолчанию). Поэтому рендерим прозрачный\n * `<select>`-overlay поверх видимого `<span>` с меткой — overlay принимает клики/клавиатуру,\n * span задаёт ширину компонента в закрытом состоянии.\n */\nconst isLinkNative = computed(() => props.view === 'link' && props.optionsView === 'native')\n\nconst linkNativeLabelClassName = computed(() => grSelectLinkNativeLabelClass({\n size: props.size,\n variant: props.variant,\n underline: props.underline,\n disabled: props.disabled,\n}))\n\nconst linkNativeDisplayText = computed(() => {\n return displayText.value || props.placeholder || '\\u00A0'\n})\n\nconst triggerClassName = computed(() => {\n return grSelectTriggerClass({\n view: props.view,\n optionsView: props.optionsView,\n size: props.size,\n disabled: props.disabled,\n variant: props.variant,\n underline: props.underline,\n })\n})\n\nfunction onChange(e: Event): void {\n const el = e.target as HTMLSelectElement\n\n if (props.multiple) {\n const values = Array.from(el.selectedOptions, o => o.value)\n emit('update:modelValue', values)\n return\n }\n\n emit('update:modelValue', el.value)\n}\n\nfunction clearSelection(): void {\n if (props.disabled) return\n emitValue(props.multiple ? [] : '')\n}\n</script>\n\n<template>\n <div\n v-if=\"optionsView === 'native'\"\n data-ds-select\n :class=\"rootClass\"\n >\n <select\n data-ds-select-native\n :value=\"multiple ? modelMultiple : modelSingle\"\n :multiple=\"multiple\"\n :disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n :class=\"isLinkNative ? grSelectLinkNativeOverlayClass : [baseClassName, nativeClassName]\"\n @change=\"onChange\"\n >\n <option v-if=\"nativeClearOptionVisible\" value=\"\" />\n\n <slot>\n <option v-if=\"nativeCustomOptionVisible\" :value=\"modelSingle\">\n {{ modelSingle }}\n </option>\n <template v-for=\"(item, index) in optionsResolved\" :key=\"index\">\n <optgroup v-if=\"isOptionGroup(item)\" :label=\"item.label\">\n <option v-for=\"opt in item.options\" :key=\"opt.value\" :value=\"opt.value\">\n {{ opt.label }}\n </option>\n </optgroup>\n <option v-else :value=\"item.value\">\n {{ item.label }}\n </option>\n </template>\n </slot>\n </select>\n\n <span\n v-if=\"isLinkNative\"\n data-ds-select-link-label\n aria-hidden=\"true\"\n :class=\"linkNativeLabelClassName\"\n >{{ linkNativeDisplayText }}</span>\n\n <span\n v-if=\"showNativeChevron\"\n data-testid=\"ds-select-chevron\"\n class=\"absolute top-1/2 -translate-y-1/2 right-3 text-[var(--muted-fg)] pointer-events-none\"\n >\n <span class=\"i-lucide-chevron-down inline-block h-4 w-4\" aria-hidden=\"true\" />\n </span>\n </div>\n\n <div\n v-else\n ref=\"rootEl\"\n v-click-outside=\"{ handler: closeDropdown, enabled: open, exclude: clickOutsideExclude }\"\n data-ds-select\n :class=\"rootClass\"\n >\n <button\n data-testid=\"ds-select-trigger\"\n data-ds-select-trigger\n type=\"button\"\n :disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n role=\"combobox\"\n aria-readonly=\"true\"\n :aria-expanded=\"open ? 'true' : 'false'\"\n :class=\"[baseClassName, triggerClassName]\"\n @click=\"toggleDropdown\"\n >\n <span class=\"min-w-0 flex-1\">\n <slot\n name=\"value\"\n :selected-options=\"selectedOptions\"\n :selected-values=\"selectedValues\"\n :display-label=\"displayLabel\"\n :placeholder=\"placeholder\"\n :has-selection=\"hasSelection\"\n >\n <span\n class=\"block truncate\"\n :class=\"!hasSelection ? 'text-[var(--muted-fg)]' : ''\"\n >\n {{ displayText }}\n </span>\n </slot>\n </span>\n\n <span\n v-if=\"panelClearVisible\"\n class=\"shrink-0 h-4 w-4\"\n aria-hidden=\"true\"\n />\n\n <span\n v-else\n data-testid=\"ds-select-chevron\"\n class=\"shrink-0 text-[var(--muted-fg)] pointer-events-none\"\n >\n <span class=\"i-lucide-chevron-down inline-block h-4 w-4\" aria-hidden=\"true\" />\n </span>\n </button>\n\n <button\n v-if=\"panelClearVisible\"\n data-testid=\"ds-select-clear\"\n data-ds-select-clear\n type=\"button\"\n class=\"absolute top-1/2 -translate-y-1/2 right-3 h-6 w-6 inline-flex items-center justify-center rounded-md text-[var(--muted-fg)] hover:text-[var(--fg)] hover:bg-[color-mix(in_srgb,var(--muted)_25%,transparent)] disabled:opacity-50\"\n :disabled=\"disabled\"\n :aria-label=\"resolvedClearLabel\"\n @click.stop=\"clearSelection\"\n >\n <span class=\"i-lucide-x inline-block h-4 w-4\" aria-hidden=\"true\" />\n </button>\n\n <teleport to=\"body\">\n <transition\n enter-active-class=\"transition ease-out duration-150\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-100\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-show=\"open\"\n ref=\"panelEl\"\n data-testid=\"ds-select-panel\"\n data-ds-select-panel\n :style=\"floatingStyle\"\n >\n <div :class=\"panelClasses\">\n <div v-if=\"allowCustomValue\" class=\"p-2 border-b border-[var(--brd)]\">\n <GrInput\n ref=\"customInputRef\"\n v-model=\"customValue\"\n data-testid=\"ds-select-custom-input\"\n type=\"text\"\n :placeholder=\"resolvedCustomValuePlaceholder\"\n size=\"sm\"\n @keydown.enter.prevent=\"addCustom\"\n />\n </div>\n\n <div\n data-ds-select-listbox\n class=\"p-1 overflow-auto\"\n :style=\"{ maxHeight: `${dropdownMaxHeight}px` }\"\n role=\"listbox\"\n :aria-multiselectable=\"multiple ? 'true' : undefined\"\n >\n <button\n v-if=\"canAddCustom\"\n data-testid=\"ds-select-add-option\"\n data-ds-select-add-option\n type=\"button\"\n class=\"rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--muted)_30%,transparent)]\" :class=\"[\n view === 'link' ? 'block min-w-full w-max whitespace-nowrap' : 'w-full',\n ]\"\n @click=\"addCustom\"\n >\n {{ t('gr.select.addOption', 'Add \"{value}\"', { value: customValue.trim() }) }}\n </button>\n\n <template v-for=\"item in panelItems\" :key=\"item.key\">\n <div\n v-if=\"item.kind === 'group'\"\n data-ds-select-group-label\n role=\"presentation\"\n class=\"px-3 pt-2 pb-1 text-[11px] font-semibold uppercase tracking-wide text-[var(--muted-fg)]\" :class=\"[\n view === 'link' ? 'block min-w-full w-max whitespace-nowrap' : '',\n ]\"\n >\n {{ item.label }}\n </div>\n\n <button\n v-else\n data-ds-select-option\n type=\"button\"\n role=\"option\"\n :aria-selected=\"isSelected(item.option.value) ? 'true' : 'false'\"\n class=\"rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--muted)_30%,transparent)]\" :class=\"[\n view === 'link' ? 'block min-w-full w-max whitespace-nowrap' : 'w-full',\n ]\"\n @click=\"toggleValue(item.option.value)\"\n >\n <slot name=\"option\" :option=\"item.option\" :selected=\"isSelected(item.option.value)\">\n <span class=\"flex items-center gap-2 min-w-0\">\n <span\n class=\"inline-block h-4 w-4 shrink-0\"\n :class=\"isSelected(item.option.value) ? 'i-lucide-check text-[var(--primary)]' : ''\"\n aria-hidden=\"true\"\n />\n <span class=\"truncate\">{{ item.option.label }}</span>\n </span>\n </slot>\n </button>\n </template>\n </div>\n </div>\n </div>\n </transition>\n </teleport>\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { t as GrSelect_default } from "./chunks/GrSelect-
|
|
2
|
-
import { n as grSelectSafelist, t as grSelectConfig } from "../../chunks/config-
|
|
1
|
+
import { t as GrSelect_default } from "./chunks/GrSelect-DSz7jvUb.js";
|
|
2
|
+
import { n as grSelectSafelist, t as grSelectConfig } from "../../chunks/config-C8MM2Dg0.js";
|
|
3
3
|
export { GrSelect_default as GrSelect, GrSelect_default as default, grSelectConfig, grSelectSafelist };
|
package/dist/components/GrSidebar/chunks/{GrSidebar-BpBtAGBs.js.map → GrSidebar-BW8LRMZ-.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrSidebar-
|
|
1
|
+
{"version":3,"file":"GrSidebar-BW8LRMZ-.js","names":["$slots"],"sources":["../../../../src/components/GrSidebar/GrSidebar.vue","../../../../src/components/GrSidebar/GrSidebar.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * GrSidebar — боковая панель приложения с заголовком и слотом контента.\n *\n * Слоты `#title` / `#subtitle` имеют приоритет над одноимёнными пропами\n * и позволяют передать произвольную разметку (иконки, бейджи, действия).\n */\nexport interface GrSidebarProps {\n title?: string\n subtitle?: string\n}\n\nwithDefaults(defineProps<GrSidebarProps>(), {\n title: undefined,\n subtitle: undefined,\n})\n</script>\n\n<template>\n <aside\n data-ds-sidebar\n class=\"border-r border-[var(--sidebar-brd)] bg-[var(--sidebar)] text-[var(--sidebar-fg)]\"\n >\n <div\n v-if=\"$slots.title || title || $slots.subtitle || subtitle\"\n data-ds-sidebar-header\n class=\"border-b border-[var(--sidebar-brd)] px-4 py-4\"\n >\n <div\n v-if=\"$slots.subtitle || subtitle\"\n data-ds-sidebar-subtitle\n class=\"text-[14px] text-[var(--muted-fg)]\"\n >\n <slot name=\"subtitle\">\n {{ subtitle }}\n </slot>\n </div>\n <div\n v-if=\"$slots.title || title\"\n data-ds-sidebar-title\n class=\"text-[18px] font-700\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </div>\n </div>\n <div class=\"p-3\">\n <slot />\n </div>\n </aside>\n</template>\n","<script setup lang=\"ts\">\n/**\n * GrSidebar — боковая панель приложения с заголовком и слотом контента.\n *\n * Слоты `#title` / `#subtitle` имеют приоритет над одноимёнными пропами\n * и позволяют передать произвольную разметку (иконки, бейджи, действия).\n */\nexport interface GrSidebarProps {\n title?: string\n subtitle?: string\n}\n\nwithDefaults(defineProps<GrSidebarProps>(), {\n title: undefined,\n subtitle: undefined,\n})\n</script>\n\n<template>\n <aside\n data-ds-sidebar\n class=\"border-r border-[var(--sidebar-brd)] bg-[var(--sidebar)] text-[var(--sidebar-fg)]\"\n >\n <div\n v-if=\"$slots.title || title || $slots.subtitle || subtitle\"\n data-ds-sidebar-header\n class=\"border-b border-[var(--sidebar-brd)] px-4 py-4\"\n >\n <div\n v-if=\"$slots.subtitle || subtitle\"\n data-ds-sidebar-subtitle\n class=\"text-[14px] text-[var(--muted-fg)]\"\n >\n <slot name=\"subtitle\">\n {{ subtitle }}\n </slot>\n </div>\n <div\n v-if=\"$slots.title || title\"\n data-ds-sidebar-title\n class=\"text-[18px] font-700\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </div>\n </div>\n <div class=\"p-3\">\n <slot />\n </div>\n </aside>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAmBE,mBA+BQ,SA/BR,YA+BQ,CA1BEA,KAAAA,OAAO,SAAS,QAAA,SAASA,KAAAA,OAAO,YAAY,QAAA,YAAA,WAAA,EADpD,mBAuBM,OAvBN,YAuBM,CAjBIA,KAAAA,OAAO,YAAY,QAAA,YAAA,WAAA,EAD3B,mBAQM,OARN,YAQM,CAHJ,WAEO,KAAA,QAAA,YAAA,EAAA,QAAA,CAAA,gBAAA,gBADF,QAAA,SAAQ,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,mBAAA,IAAA,KAAA,EAIPA,KAAAA,OAAO,SAAS,QAAA,SAAA,WAAA,EADxB,mBAQM,OARN,YAQM,CAHJ,WAEO,KAAA,QAAA,SAAA,EAAA,QAAA,CAAA,gBAAA,gBADF,QAAA,MAAK,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,mBAAA,IAAA,KAAA,CAAA,CAAA,IAAA,mBAAA,IAAA,KAAA,EAId,mBAEM,OAFN,YAEM,CADJ,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { t as GrSidebar_default } from "./chunks/GrSidebar-
|
|
2
|
-
import { t as grSidebarConfig } from "../../chunks/config-
|
|
1
|
+
import { t as GrSidebar_default } from "./chunks/GrSidebar-BW8LRMZ-.js";
|
|
2
|
+
import { t as grSidebarConfig } from "../../chunks/config-BuoIngj32.js";
|
|
3
3
|
export { GrSidebar_default as GrSidebar, GrSidebar_default as default, grSidebarConfig };
|
package/dist/components/GrSkeleton/chunks/{GrSkeleton-URyMkBqI.js.map → GrSkeleton-B05K0QKh.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrSkeleton-
|
|
1
|
+
{"version":3,"file":"GrSkeleton-B05K0QKh.js","names":[],"sources":["../../../../src/components/GrSkeleton/GrSkeleton.vue","../../../../src/components/GrSkeleton/GrSkeleton.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * GrSkeleton — заглушка-плейсхолдер для загружающегося контента.\n *\n * Помечен `aria-hidden=\"true\"`, чтобы скринридер не озвучивал «пустой» узел;\n * внешний контейнер обычно имеет `aria-busy=\"true\"` + `aria-live`.\n */\nexport interface GrSkeletonProps {\n height?: string\n width?: string\n rounded?: string\n}\n\nwithDefaults(defineProps<GrSkeletonProps>(), {\n height: '12px',\n width: '100%',\n rounded: '9999px',\n})\n</script>\n\n<template>\n <div\n data-ds-skeleton\n aria-hidden=\"true\"\n class=\"bg-[var(--muted)] border border-[var(--brd)]\"\n :style=\"{ height, width, borderRadius: rounded }\"\n />\n</template>\n\n<style>\n@keyframes ds-skeleton-pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n\n[data-ds-skeleton] {\n animation: ds-skeleton-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n [data-ds-skeleton] {\n animation: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * GrSkeleton — заглушка-плейсхолдер для загружающегося контента.\n *\n * Помечен `aria-hidden=\"true\"`, чтобы скринридер не озвучивал «пустой» узел;\n * внешний контейнер обычно имеет `aria-busy=\"true\"` + `aria-live`.\n */\nexport interface GrSkeletonProps {\n height?: string\n width?: string\n rounded?: string\n}\n\nwithDefaults(defineProps<GrSkeletonProps>(), {\n height: '12px',\n width: '100%',\n rounded: '9999px',\n})\n</script>\n\n<template>\n <div\n data-ds-skeleton\n aria-hidden=\"true\"\n class=\"bg-[var(--muted)] border border-[var(--brd)]\"\n :style=\"{ height, width, borderRadius: rounded }\"\n />\n</template>\n\n<style>\n@keyframes ds-skeleton-pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n\n[data-ds-skeleton] {\n animation: ds-skeleton-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n [data-ds-skeleton] {\n animation: none;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;uBAqBE,mBAKE,OAAA;IAJE,oBAAA;IACA,eAAY;IACZ,OAAM;IACL,OAAK,eAAA;KAAA,QAAI,QAAA;KAAM,OAAE,QAAA;KAAK,cAAgB,QAAA;KAAO,CAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { t as GrSkeleton_default } from "./chunks/GrSkeleton-
|
|
2
|
-
import { t as grSkeletonConfig } from "../../chunks/config-
|
|
1
|
+
import { t as GrSkeleton_default } from "./chunks/GrSkeleton-B05K0QKh.js";
|
|
2
|
+
import { t as grSkeletonConfig } from "../../chunks/config-DZrlovR42.js";
|
|
3
3
|
export { GrSkeleton_default as GrSkeleton, GrSkeleton_default as default, grSkeletonConfig };
|