@feugene/granularity 0.12.0 → 0.13.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/GrBadge.css +1 -1
- package/dist/GrFormFile.css +1 -1
- package/dist/GrToaster.css +1 -1
- package/dist/GrTree.css +1 -1
- package/dist/chunks/{config-ClhKPJvg.js → config-23WtUiAL.js} +1 -1
- package/dist/chunks/config-23WtUiAL.js.map +1 -0
- package/dist/chunks/config-8Pcutu1j.js.map +1 -0
- package/dist/chunks/{config-1uSYl98Y2.js → config-B0i5r8kH.js} +1 -1
- package/dist/chunks/config-B0i5r8kH.js.map +1 -0
- package/dist/chunks/{config-BOlr7qw7.js → config-B5Rknzkd.js} +33 -39
- package/dist/chunks/config-B5Rknzkd.js.map +1 -0
- package/dist/chunks/config-B7W9VlZ7.js +5 -0
- package/dist/chunks/config-B7W9VlZ7.js.map +1 -0
- package/dist/chunks/config-BDSHekVC.js +84 -0
- package/dist/chunks/config-BDSHekVC.js.map +1 -0
- package/dist/chunks/config-BLHqZhy-.js.map +1 -0
- package/dist/chunks/{config-eYLZYOUS2.js → config-BMKNHFMD2.js} +15 -15
- package/dist/chunks/config-BMKNHFMD2.js.map +1 -0
- package/dist/chunks/config-BUHuGBik2.js.map +1 -0
- package/dist/chunks/config-BX1JTrkV.js.map +1 -0
- package/dist/chunks/config-BXtAmU3s.js.map +1 -0
- package/dist/chunks/config-BZFUM3Ky.js +75 -0
- package/dist/chunks/config-BZFUM3Ky.js.map +1 -0
- package/dist/chunks/{config-DUcu1D682.js → config-BmNT0Fmx.js} +2 -2
- package/dist/chunks/config-BmNT0Fmx.js.map +1 -0
- package/dist/chunks/{config-C49QUoJL.js → config-BvVq2gbd.js} +1 -1
- package/dist/chunks/{config-C49QUoJL.js.map → config-BvVq2gbd.js.map} +1 -1
- package/dist/chunks/{config-CrG1XiE72.js → config-C4hJxXDa.js} +5 -5
- package/dist/chunks/config-C4hJxXDa.js.map +1 -0
- package/dist/chunks/config-CB4RVt9M.js +66 -0
- package/dist/chunks/config-CB4RVt9M.js.map +1 -0
- package/dist/chunks/config-CGHLoBlH2.js.map +1 -0
- package/dist/chunks/config-COE_vZ-l.js +52 -0
- package/dist/chunks/config-COE_vZ-l.js.map +1 -0
- package/dist/chunks/{config-CziwTDDL.js → config-CPdmr7tC.js} +1 -1
- package/dist/chunks/{config-CziwTDDL.js.map → config-CPdmr7tC.js.map} +1 -1
- package/dist/chunks/{config-BIRO0vDJ.js → config-DPDFYzIa.js} +2 -2
- package/dist/chunks/config-DPDFYzIa.js.map +1 -0
- package/dist/chunks/{config-DnvPqu4g2.js → config-DRKXJ9PW2.js} +1 -1
- package/dist/chunks/{config-DnvPqu4g2.js.map → config-DRKXJ9PW2.js.map} +1 -1
- package/dist/chunks/config-DToHb81g.js +45 -0
- package/dist/chunks/config-DToHb81g.js.map +1 -0
- package/dist/chunks/{config-jBp9wVv-.js → config-D_myOZbA.js} +1 -1
- package/dist/chunks/{config-jBp9wVv-.js.map → config-D_myOZbA.js.map} +1 -1
- package/dist/chunks/{config-D_R56_gT.js → config-Dg_6FTvJ.js} +1 -1
- package/dist/chunks/config-Dg_6FTvJ.js.map +1 -0
- package/dist/chunks/config-Dqy0rPPO2.js.map +1 -0
- package/dist/chunks/config-Droqn55j.js +8 -0
- package/dist/chunks/config-Droqn55j.js.map +1 -0
- package/dist/chunks/config-JpHA4Xx0.js.map +1 -0
- package/dist/chunks/{config-C4snOIXg.js → config-KXuionN3.js} +1 -1
- package/dist/chunks/{config-C4snOIXg.js.map → config-KXuionN3.js.map} +1 -1
- package/dist/chunks/{config-DezDih8_.js → config-LqDC_rvp.js} +2 -2
- package/dist/chunks/config-LqDC_rvp.js.map +1 -0
- package/dist/chunks/config-QaIc_gRa2.js.map +1 -0
- package/dist/chunks/config-U4m9PSql2.js.map +1 -0
- package/dist/chunks/{config-B7IIWGt_2.js → config-XmTv4pnI.js} +2 -2
- package/dist/chunks/config-XmTv4pnI.js.map +1 -0
- package/dist/chunks/config-eXB87DOi.js.map +1 -0
- package/dist/chunks/{config-C7NpDrfO.js → config-gZWR75Bh2.js} +1 -1
- package/dist/chunks/config-gZWR75Bh2.js.map +1 -0
- package/dist/chunks/config-ipvU0lzP.js.map +1 -0
- package/dist/chunks/config-xR4XVmcy2.js.map +1 -0
- package/dist/chunks/context-Bfrgsluh.js +9 -0
- package/dist/chunks/context-Bfrgsluh.js.map +1 -0
- package/dist/chunks/context-DfWYCBB-.js +129 -0
- package/dist/chunks/context-DfWYCBB-.js.map +1 -0
- package/dist/chunks/{en-CfkDa4GX.js → en-Cr6EkG8c.js} +46 -4
- package/dist/chunks/en-Cr6EkG8c.js.map +1 -0
- package/dist/chunks/{es-CgaLnFYx.js → es-DuYb1Qju.js} +3 -3
- package/dist/chunks/{es-CgaLnFYx.js.map → es-DuYb1Qju.js.map} +1 -1
- package/dist/chunks/{es-FkgECuCm.js → es-i08e9Sdo.js} +46 -4
- package/dist/chunks/es-i08e9Sdo.js.map +1 -0
- package/dist/chunks/{grBadgeStyles-DrycBuKT.js → grBadgeStyles-D3dFjr_N.js} +12 -12
- package/dist/chunks/grBadgeStyles-D3dFjr_N.js.map +1 -0
- package/dist/chunks/{grButtonStyles-C7Yga_Q1.js → grButtonStyles-DRBgDmOp.js} +28 -28
- package/dist/chunks/grButtonStyles-DRBgDmOp.js.map +1 -0
- package/dist/chunks/{grDropdownStyles-B_-DKytw.js → grDropdownStyles-HBPkghVr.js} +2 -2
- package/dist/chunks/{grDropdownStyles-B_-DKytw.js.map → grDropdownStyles-HBPkghVr.js.map} +1 -1
- package/dist/chunks/{grModalStyles-DWd3i05Q.js → grModalStyles-D8-shx9A.js} +1 -1
- package/dist/chunks/grModalStyles-D8-shx9A.js.map +1 -0
- package/dist/chunks/{grSelectStyles-CLK5hRd3.js → grSelectStyles-CwMUQrBZ.js} +12 -12
- package/dist/chunks/grSelectStyles-CwMUQrBZ.js.map +1 -0
- package/dist/chunks/{grStyle-Blc9otAx.js → grStyle-CdvxTXPH.js} +2 -2
- package/dist/chunks/grStyle-CdvxTXPH.js.map +1 -0
- package/dist/chunks/{granularityI18n-DoV7Ca2m.js → granularityI18n-SH0I--GW.js} +1 -1
- package/dist/chunks/{granularityI18n-DoV7Ca2m.js.map → granularityI18n-SH0I--GW.js.map} +1 -1
- package/dist/chunks/{ru-Bl8CxpEa.js → ru-B5XOOYZt.js} +46 -4
- package/dist/chunks/ru-B5XOOYZt.js.map +1 -0
- package/dist/chunks/{safelist-Do2RtzLB.js → safelist-BvO8HPnE.js} +1 -1
- package/dist/chunks/{safelist-Do2RtzLB.js.map → safelist-BvO8HPnE.js.map} +1 -1
- package/dist/chunks/shared-D-v9lit0.js +188 -0
- package/dist/chunks/shared-D-v9lit0.js.map +1 -0
- package/dist/components/GrAlert/chunks/GrAlert-B9gmpoPC.js +251 -0
- package/dist/components/GrAlert/chunks/GrAlert-B9gmpoPC.js.map +1 -0
- package/dist/components/GrAlert/index.js +2 -2
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-BVLoQ5tZ.js +499 -0
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-BVLoQ5tZ.js.map +1 -0
- package/dist/components/GrAutocomplete/index.js +3 -0
- package/dist/components/GrAvatar/chunks/{GrAvatar-96CpTCq5.js → GrAvatar-CTOUVBF7.js} +1 -1
- package/dist/components/GrAvatar/chunks/GrAvatar-CTOUVBF7.js.map +1 -0
- package/dist/components/GrAvatar/index.js +1 -1
- package/dist/components/GrBadge/chunks/{GrBadge-B77XlaqE.js → GrBadge-D1jefy4S.js} +12 -8
- package/dist/components/GrBadge/chunks/GrBadge-D1jefy4S.js.map +1 -0
- package/dist/components/GrBadge/index.js +2 -2
- package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-CcktMOdg.js → GrBadgeWrap-DWDxHdiQ.js} +1 -1
- package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-DWDxHdiQ.js.map +1 -0
- package/dist/components/GrBadgeWrap/index.js +1 -1
- package/dist/components/GrBottomNav/chunks/{GrBottomNav-usuMgG8_.js → GrBottomNav-vSE4LXmk.js} +2 -2
- package/dist/components/GrBottomNav/chunks/GrBottomNav-vSE4LXmk.js.map +1 -0
- package/dist/components/GrBottomNav/index.js +1 -1
- package/dist/components/GrButton/chunks/{GrButton-BlffdeJr.js → GrButton-DCi4CUpo.js} +18 -14
- package/dist/components/GrButton/chunks/GrButton-DCi4CUpo.js.map +1 -0
- package/dist/components/GrButton/index.js +4 -4
- package/dist/components/GrCard/chunks/{GrCard-DUNMkuHW.js → GrCard-CxCjyHMb.js} +1 -1
- package/dist/components/GrCard/chunks/GrCard-CxCjyHMb.js.map +1 -0
- package/dist/components/GrCard/index.js +1 -1
- package/dist/components/GrCheckbox/chunks/{GrCheckbox-DJhzZZdO.js → GrCheckbox-BbIDRXtl.js} +5 -5
- package/dist/components/GrCheckbox/chunks/GrCheckbox-BbIDRXtl.js.map +1 -0
- package/dist/components/GrCheckbox/index.js +1 -1
- package/dist/components/GrCollapse/chunks/{GrCollapse-CPPLh_xU.js → GrCollapse-DApXztn8.js} +6 -6
- package/dist/components/GrCollapse/chunks/GrCollapse-DApXztn8.js.map +1 -0
- package/dist/components/GrCollapse/index.js +2 -2
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-6OyvNbek.js +410 -0
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-6OyvNbek.js.map +1 -0
- package/dist/components/GrCommandPalette/index.js +3 -0
- package/dist/components/GrConfigProvider/chunks/GrConfigProvider-BtyeBGm8.js +57 -0
- package/dist/components/GrConfigProvider/chunks/GrConfigProvider-BtyeBGm8.js.map +1 -0
- package/dist/components/GrConfigProvider/index.js +4 -0
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-D8CkOtqv.js → GrConfirmDialog-e4120mWw.js} +5 -5
- package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-e4120mWw.js.map +1 -0
- package/dist/components/GrConfirmDialog/index.js +2 -2
- package/dist/components/GrDataTable/chunks/{GrDataTable-Ds5OeGat.js → GrDataTable-C1CzxV0p.js} +127 -25
- package/dist/components/GrDataTable/chunks/GrDataTable-C1CzxV0p.js.map +1 -0
- package/dist/components/GrDataTable/index.js +2 -2
- package/dist/components/GrDialog/chunks/{GrDialog-Ctucxju9.js → GrDialog-BPMvDHOz.js} +5 -5
- package/dist/components/GrDialog/chunks/GrDialog-BPMvDHOz.js.map +1 -0
- package/dist/components/GrDialog/index.js +1 -1
- package/dist/components/GrDialogService/chunks/{GrDialogService-CU1Fbonc.js → GrDialogService-CYXCTGm3.js} +36 -11
- package/dist/components/GrDialogService/chunks/GrDialogService-CYXCTGm3.js.map +1 -0
- package/dist/components/GrDialogService/index.js +2 -2
- package/dist/components/GrDivider/chunks/{GrDivider-5bcE-BB4.js → GrDivider-BdENZ1w0.js} +5 -5
- package/dist/components/GrDivider/chunks/GrDivider-BdENZ1w0.js.map +1 -0
- package/dist/components/GrDivider/index.js +1 -1
- package/dist/components/GrDrawer/chunks/{GrDrawer-SLGKCY2A.js → GrDrawer-KevdZ5BB.js} +5 -5
- package/dist/components/GrDrawer/chunks/GrDrawer-KevdZ5BB.js.map +1 -0
- package/dist/components/GrDrawer/index.js +2 -2
- package/dist/components/GrDropdown/chunks/{GrDropdown-BnDMYP8v.js → GrDropdown-BKoy8hm-.js} +1 -1
- package/dist/components/GrDropdown/chunks/{GrDropdown-BnDMYP8v.js.map → GrDropdown-BKoy8hm-.js.map} +1 -1
- package/dist/components/GrDropdown/index.js +2 -2
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu--g9Vofcq.js → GrDropdownMenu-zCatXzmt.js} +11 -11
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-zCatXzmt.js.map +1 -0
- package/dist/components/GrDropdownMenu/index.js +1 -1
- package/dist/components/GrEmptyState/chunks/{GrEmptyState-CA3BiTV7.js → GrEmptyState-CNb0BzjG.js} +3 -3
- package/dist/components/GrEmptyState/chunks/GrEmptyState-CNb0BzjG.js.map +1 -0
- package/dist/components/GrEmptyState/index.js +1 -1
- package/dist/components/GrFileUpload/chunks/{GrFileUpload-DvWPpiJS.js → GrFileUpload-CnLgUGDF.js} +12 -12
- package/dist/components/GrFileUpload/chunks/GrFileUpload-CnLgUGDF.js.map +1 -0
- package/dist/components/GrFileUpload/index.js +1 -1
- package/dist/components/GrForm/chunks/GrForm-CdaFjcyl.js +234 -0
- package/dist/components/GrForm/chunks/GrForm-CdaFjcyl.js.map +1 -0
- package/dist/components/GrForm/index.js +4 -0
- package/dist/components/GrFormField/chunks/{GrFormField-DnfMHx_U.js → GrFormField-CXCDBd99.js} +41 -14
- package/dist/components/GrFormField/chunks/GrFormField-CXCDBd99.js.map +1 -0
- package/dist/components/GrFormField/index.js +1 -1
- package/dist/components/GrFormFile/chunks/{GrFormFile-CXcqqdvV.js → GrFormFile-CqacSbUl.js} +9 -9
- package/dist/components/GrFormFile/chunks/GrFormFile-CqacSbUl.js.map +1 -0
- package/dist/components/GrFormFile/index.js +1 -1
- package/dist/components/GrFormSection/chunks/{GrFormSection-Ce21jcgo.js → GrFormSection-C3w9DQJf.js} +1 -1
- package/dist/components/GrFormSection/chunks/GrFormSection-C3w9DQJf.js.map +1 -0
- package/dist/components/GrFormSection/index.js +1 -1
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-Dla9IBkd.js → GrImageViewer-DDLJkvIU.js} +1 -1
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-Dla9IBkd.js.map → GrImageViewer-DDLJkvIU.js.map} +1 -1
- package/dist/components/GrImageViewer/index.js +1 -1
- package/dist/components/GrInput/chunks/{GrInput-B8dd3JaA.js → GrInput-C1VBL0dg.js} +18 -15
- package/dist/components/GrInput/chunks/GrInput-C1VBL0dg.js.map +1 -0
- package/dist/components/GrInput/index.js +2 -2
- package/dist/components/GrInputTag/chunks/{GrInputTag-zMgFqp2g.js → GrInputTag-BMk9jm42.js} +6 -6
- package/dist/components/GrInputTag/chunks/GrInputTag-BMk9jm42.js.map +1 -0
- package/dist/components/GrInputTag/index.js +2 -2
- package/dist/components/GrKbd/chunks/{GrKbd-BEoYxWhE.js → GrKbd-DTspwtoN.js} +1 -1
- package/dist/components/GrKbd/chunks/GrKbd-DTspwtoN.js.map +1 -0
- package/dist/components/GrKbd/index.js +1 -1
- package/dist/components/GrLink/chunks/{GrLink-CYUe-Q8k.js → GrLink-BP0YrnL9.js} +1 -1
- package/dist/components/GrLink/chunks/{GrLink-CYUe-Q8k.js.map → GrLink-BP0YrnL9.js.map} +1 -1
- package/dist/components/GrLink/index.js +2 -2
- package/dist/components/GrList/chunks/{GrList-Dx772Ns4.js → GrList-5RA-tZzE.js} +3 -3
- package/dist/components/GrList/chunks/GrList-5RA-tZzE.js.map +1 -0
- package/dist/components/GrList/index.js +1 -1
- package/dist/components/GrLoading/chunks/{GrLoading--X_7rdbb.js → GrLoading-fRDtVfi7.js} +3 -3
- package/dist/components/GrLoading/chunks/GrLoading-fRDtVfi7.js.map +1 -0
- package/dist/components/GrLoading/index.js +2 -2
- package/dist/components/GrModal/chunks/{GrModal-C0GZrHN3.js → GrModal-BTu1-5eY.js} +1 -1
- package/dist/components/GrModal/chunks/{GrModal-C0GZrHN3.js.map → GrModal-BTu1-5eY.js.map} +1 -1
- package/dist/components/GrModal/index.js +3 -3
- package/dist/components/GrNavbar/chunks/{GrNavbar-DW3MiIIf.js → GrNavbar-keKT_mIM.js} +3 -3
- package/dist/components/GrNavbar/chunks/GrNavbar-keKT_mIM.js.map +1 -0
- package/dist/components/GrNavbar/index.js +1 -1
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-DxCEvL7V.js → GrNumberInput-l9ZOHG9D.js} +19 -17
- package/dist/components/GrNumberInput/chunks/GrNumberInput-l9ZOHG9D.js.map +1 -0
- package/dist/components/GrNumberInput/index.js +2 -2
- package/dist/components/GrPagination/chunks/{GrPagination-mlyfLjQY.js → GrPagination-C5Y69CuK.js} +59 -16
- package/dist/components/GrPagination/chunks/GrPagination-C5Y69CuK.js.map +1 -0
- package/dist/components/GrPagination/index.js +2 -2
- package/dist/components/GrProgressBar/chunks/{GrProgressBar-CC3z-Zqp.js → GrProgressBar-Dqg4Fj9S.js} +2 -2
- package/dist/components/GrProgressBar/chunks/GrProgressBar-Dqg4Fj9S.js.map +1 -0
- package/dist/components/GrProgressBar/index.js +2 -2
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-C-_BMNuY.js → GrPromptDialog-DNUjRVB9.js} +7 -7
- package/dist/components/GrPromptDialog/chunks/GrPromptDialog-DNUjRVB9.js.map +1 -0
- package/dist/components/GrPromptDialog/index.js +2 -2
- package/dist/components/GrRadio/chunks/{GrRadio-Dr-pvs_9.js → GrRadio-DlhxPGqf.js} +5 -7
- package/dist/components/GrRadio/chunks/GrRadio-DlhxPGqf.js.map +1 -0
- package/dist/components/GrRadio/index.js +2 -2
- package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-nOdvfV_g.js → GrRadioGroup-BXt9iw4q.js} +7 -5
- package/dist/components/GrRadioGroup/chunks/GrRadioGroup-BXt9iw4q.js.map +1 -0
- package/dist/components/GrRadioGroup/index.js +2 -2
- package/dist/components/GrRating/chunks/GrRating-Co-3Rk4h.js +241 -0
- package/dist/components/GrRating/chunks/GrRating-Co-3Rk4h.js.map +1 -0
- package/dist/components/GrRating/index.js +3 -0
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-BWJNe2gr.js → GrResponseErrorBanner-2CvM7Z08.js} +2 -2
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-BWJNe2gr.js.map → GrResponseErrorBanner-2CvM7Z08.js.map} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-Cdu9ekK9.js → GrResponseErrorBanner-C8NGx8pE.js} +3 -3
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-Cdu9ekK9.js.map → GrResponseErrorBanner-C8NGx8pE.js.map} +1 -1
- package/dist/components/GrResponseErrorBanner/index.js +2 -2
- package/dist/components/GrSegmented/chunks/{GrSegmented-C1y0UXpQ.js → GrSegmented-CTd3n4PA.js} +14 -11
- package/dist/components/GrSegmented/chunks/GrSegmented-CTd3n4PA.js.map +1 -0
- package/dist/components/GrSegmented/index.js +2 -2
- package/dist/components/GrSelect/chunks/{GrSelect-BVCmitqa.js → GrSelect-Dn3FgJ3Z.js} +161 -75
- package/dist/components/GrSelect/chunks/GrSelect-Dn3FgJ3Z.js.map +1 -0
- package/dist/components/GrSelect/index.js +2 -2
- package/dist/components/GrSidebar/chunks/{GrSidebar-DkWozzwA.js → GrSidebar-cvnzBfj3.js} +7 -7
- package/dist/components/GrSidebar/chunks/GrSidebar-cvnzBfj3.js.map +1 -0
- package/dist/components/GrSidebar/index.js +2 -2
- package/dist/components/GrSkeleton/chunks/{GrSkeleton-DsN-_CDZ.js → GrSkeleton-BucA5F4J.js} +1 -1
- package/dist/components/GrSkeleton/chunks/GrSkeleton-BucA5F4J.js.map +1 -0
- package/dist/components/GrSkeleton/index.js +2 -2
- package/dist/components/GrSlider/chunks/GrSlider-CzzJ3bD-.js +286 -0
- package/dist/components/GrSlider/chunks/GrSlider-CzzJ3bD-.js.map +1 -0
- package/dist/components/GrSlider/index.js +3 -0
- package/dist/components/GrStatistic/chunks/GrStatistic-gHiAwrX5.js +128 -0
- package/dist/components/GrStatistic/chunks/GrStatistic-gHiAwrX5.js.map +1 -0
- package/dist/components/GrStatistic/index.js +3 -0
- package/dist/components/GrSwitch/chunks/{GrSwitch-DAioyccZ.js → GrSwitch-CJdRvS0s.js} +16 -7
- package/dist/components/GrSwitch/chunks/GrSwitch-CJdRvS0s.js.map +1 -0
- package/dist/components/GrSwitch/index.js +2 -2
- package/dist/components/GrTabPanels/chunks/{GrTabPanels-DbKybwe-.js → GrTabPanels-DeEMgb_y.js} +1 -1
- package/dist/components/GrTabPanels/chunks/{GrTabPanels-DbKybwe-.js.map → GrTabPanels-DeEMgb_y.js.map} +1 -1
- package/dist/components/GrTabPanels/index.js +2 -2
- package/dist/components/GrTable/chunks/{GrTable-Db3hRnKA.js → GrTable-sNvsA8wa.js} +24 -11
- package/dist/components/GrTable/chunks/GrTable-sNvsA8wa.js.map +1 -0
- package/dist/components/GrTable/index.js +2 -2
- package/dist/components/GrTabs/chunks/{GrTabs-DsLwWoRz.js → GrTabs-BqTak0SR.js} +3 -3
- package/dist/components/GrTabs/chunks/GrTabs-BqTak0SR.js.map +1 -0
- package/dist/components/GrTabs/index.js +2 -2
- package/dist/components/GrTextarea/chunks/{GrTextarea-CKukGlNl.js → GrTextarea-DIYBAPpP.js} +2 -2
- package/dist/components/GrTextarea/chunks/GrTextarea-DIYBAPpP.js.map +1 -0
- package/dist/components/GrTextarea/index.js +2 -2
- package/dist/components/GrToaster/chunks/{GrToaster-L2cu6cSR.js → GrToaster-BVHjIHcM.js} +51 -10
- package/dist/components/GrToaster/chunks/GrToaster-BVHjIHcM.js.map +1 -0
- package/dist/components/GrToaster/index.js +1 -1
- package/dist/components/GrTooltip/chunks/{GrTooltip-BeyZ8ssR.js → GrTooltip-BMKH2lIx.js} +3 -3
- package/dist/components/GrTooltip/chunks/GrTooltip-BMKH2lIx.js.map +1 -0
- package/dist/components/GrTooltip/index.js +1 -1
- package/dist/components/GrTree/chunks/{GrTree-B2_yW6g1.js → GrTree-_12ChXRQ.js} +3 -3
- package/dist/components/GrTree/chunks/GrTree-_12ChXRQ.js.map +1 -0
- package/dist/components/GrTree/index.js +1 -1
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-0aM62xyu.js → GrTreeSelect-CdaLG7Xq.js} +10 -10
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-CdaLG7Xq.js.map +1 -0
- package/dist/components/GrTreeSelect/index.js +2 -2
- package/dist/composables/useToast.js +3 -1
- package/dist/composables/useToast.js.map +1 -1
- package/dist/directives/loading.js +1 -1
- package/dist/granular-provider-node.js +6 -6
- package/dist/granular-provider-node.js.map +1 -1
- 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 +111 -93
- package/dist/index.js.map +1 -1
- package/dist/styles/base.css +2 -2
- package/dist/styles/index.css +6 -3
- package/dist/styles/preflight.css +3 -3
- package/dist/styles/themes/dark.css +52 -40
- package/dist/styles/themes/light.css +70 -45
- package/dist/styles/tokens.css +20 -20
- package/dist/types/src/components/GrAlert/GrAlert.vue.d.ts +26 -14
- package/dist/types/src/components/GrAlert/defaults.d.ts +17 -0
- package/dist/types/src/components/GrAlert/grAlertStyles.d.ts +55 -0
- package/dist/types/src/components/GrAlert/index.d.ts +4 -1
- package/dist/types/src/components/GrAutocomplete/GrAutocomplete.vue.d.ts +153 -0
- package/dist/types/src/components/GrAutocomplete/config.d.ts +1 -0
- package/dist/types/src/components/GrAutocomplete/defaults.d.ts +15 -0
- package/dist/types/src/components/GrAutocomplete/grAutocompleteStyles.d.ts +27 -0
- package/dist/types/src/components/GrAutocomplete/index.d.ts +6 -0
- package/dist/types/src/components/GrAutocomplete/safelist.d.ts +1 -0
- package/dist/types/src/components/GrAvatar/GrAvatar.vue.d.ts +1 -1
- package/dist/types/src/components/GrBadge/GrBadge.vue.d.ts +7 -7
- package/dist/types/src/components/GrBadge/defaults.d.ts +15 -0
- package/dist/types/src/components/GrBadge/index.d.ts +1 -0
- package/dist/types/src/components/GrBadgeWrap/GrBadgeWrap.vue.d.ts +1 -1
- package/dist/types/src/components/GrButton/GrButton.vue.d.ts +12 -12
- package/dist/types/src/components/GrButton/defaults.d.ts +25 -0
- package/dist/types/src/components/GrButton/grButtonStyles.d.ts +2 -2
- package/dist/types/src/components/GrButton/index.d.ts +1 -0
- package/dist/types/src/components/GrCheckbox/GrCheckbox.vue.d.ts +4 -4
- package/dist/types/src/components/GrCollapse/GrCollapse.vue.d.ts +2 -2
- package/dist/types/src/components/GrCollapse/GrCollapseItem.vue.d.ts +1 -1
- package/dist/types/src/components/GrCommandPalette/GrCommandPalette.vue.d.ts +128 -0
- package/dist/types/src/components/GrCommandPalette/config.d.ts +1 -0
- package/dist/types/src/components/GrCommandPalette/filtering.d.ts +35 -0
- package/dist/types/src/components/GrCommandPalette/grCommandPaletteStyles.d.ts +20 -0
- package/dist/types/src/components/GrCommandPalette/hotkey.d.ts +23 -0
- package/dist/types/src/components/GrCommandPalette/index.d.ts +6 -0
- package/dist/types/src/components/GrCommandPalette/safelist.d.ts +1 -0
- package/dist/types/src/components/GrConfigProvider/GrConfigProvider.vue.d.ts +59 -0
- package/dist/types/src/components/GrConfigProvider/config.d.ts +1 -0
- package/dist/types/src/components/GrConfigProvider/context.d.ts +131 -0
- package/dist/types/src/components/GrConfigProvider/index.d.ts +5 -0
- package/dist/types/src/components/GrConfirmDialog/GrConfirmDialog.vue.d.ts +2 -2
- package/dist/types/src/components/GrDataTable/GrDataTable.vue.d.ts +20 -0
- package/dist/types/src/components/GrDialog/GrDialog.vue.d.ts +1 -1
- package/dist/types/src/components/GrDialogService/store.d.ts +18 -0
- package/dist/types/src/components/GrDrawer/GrDrawer.vue.d.ts +1 -1
- package/dist/types/src/components/GrDropdown/GrDropdown.vue.d.ts +1 -1
- package/dist/types/src/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +1 -1
- package/dist/types/src/components/GrDropdownMenu/GrDropdownMenuItem.vue.d.ts +1 -1
- package/dist/types/src/components/GrFileUpload/GrFileUpload.vue.d.ts +3 -3
- package/dist/types/src/components/GrForm/GrForm.vue.d.ts +93 -0
- package/dist/types/src/components/GrForm/config.d.ts +1 -0
- package/dist/types/src/components/GrForm/context.d.ts +27 -0
- package/dist/types/src/components/GrForm/index.d.ts +6 -0
- package/dist/types/src/components/GrForm/validation.d.ts +52 -0
- package/dist/types/src/components/GrFormField/GrFormField.vue.d.ts +11 -1
- package/dist/types/src/components/GrFormFile/GrFormFile.vue.d.ts +4 -4
- package/dist/types/src/components/GrImageViewer/GrImageViewer.vue.d.ts +3 -3
- package/dist/types/src/components/GrInput/GrInput.vue.d.ts +12 -12
- package/dist/types/src/components/GrInput/defaults.d.ts +18 -0
- package/dist/types/src/components/GrInput/grInputStyles.d.ts +1 -1
- package/dist/types/src/components/GrInput/index.d.ts +1 -0
- package/dist/types/src/components/GrInputTag/GrInputTag.vue.d.ts +3 -3
- package/dist/types/src/components/GrLink/GrLink.vue.d.ts +3 -3
- package/dist/types/src/components/GrLink/grLinkStyles.d.ts +3 -3
- package/dist/types/src/components/GrModal/grModalStyles.d.ts +1 -1
- package/dist/types/src/components/GrNumberInput/GrNumberInput.vue.d.ts +10 -10
- package/dist/types/src/components/GrNumberInput/defaults.d.ts +14 -0
- package/dist/types/src/components/GrNumberInput/index.d.ts +1 -0
- package/dist/types/src/components/GrPagination/GrPagination.vue.d.ts +18 -0
- package/dist/types/src/components/GrPromptDialog/GrPromptDialog.vue.d.ts +4 -4
- package/dist/types/src/components/GrRadio/GrRadio.vue.d.ts +5 -5
- package/dist/types/src/components/GrRadio/defaults.d.ts +14 -0
- package/dist/types/src/components/GrRadio/grRadioStyles.d.ts +3 -3
- package/dist/types/src/components/GrRadio/index.d.ts +1 -0
- package/dist/types/src/components/GrRadioGroup/GrRadioGroup.vue.d.ts +4 -4
- package/dist/types/src/components/GrRadioGroup/defaults.d.ts +14 -0
- package/dist/types/src/components/GrRadioGroup/index.d.ts +1 -0
- package/dist/types/src/components/GrRating/GrRating.vue.d.ts +124 -0
- package/dist/types/src/components/GrRating/config.d.ts +1 -0
- package/dist/types/src/components/GrRating/defaults.d.ts +14 -0
- package/dist/types/src/components/GrRating/grRatingStyles.d.ts +21 -0
- package/dist/types/src/components/GrRating/index.d.ts +6 -0
- package/dist/types/src/components/GrRating/safelist.d.ts +1 -0
- package/dist/types/src/components/GrResponseErrorBanner/GrUploadErrorBanner.vue.d.ts +1 -1
- package/dist/types/src/components/GrSegmented/GrSegmented.vue.d.ts +7 -7
- package/dist/types/src/components/GrSegmented/defaults.d.ts +15 -0
- package/dist/types/src/components/GrSegmented/grSegmentedStyles.d.ts +1 -1
- package/dist/types/src/components/GrSegmented/index.d.ts +1 -0
- package/dist/types/src/components/GrSelect/GrSelect.vue.d.ts +57 -17
- package/dist/types/src/components/GrSelect/defaults.d.ts +17 -0
- package/dist/types/src/components/GrSelect/grSelectStyles.d.ts +3 -3
- package/dist/types/src/components/GrSelect/index.d.ts +1 -0
- package/dist/types/src/components/GrSidebar/GrSidebarItem.vue.d.ts +2 -2
- package/dist/types/src/components/GrSkeleton/GrSkeleton.vue.d.ts +1 -1
- package/dist/types/src/components/GrSlider/GrSlider.vue.d.ts +88 -0
- package/dist/types/src/components/GrSlider/config.d.ts +1 -0
- package/dist/types/src/components/GrSlider/defaults.d.ts +14 -0
- package/dist/types/src/components/GrSlider/grSliderStyles.d.ts +36 -0
- package/dist/types/src/components/GrSlider/index.d.ts +6 -0
- package/dist/types/src/components/GrSlider/safelist.d.ts +1 -0
- package/dist/types/src/components/GrStatistic/GrStatistic.vue.d.ts +116 -0
- package/dist/types/src/components/GrStatistic/config.d.ts +1 -0
- package/dist/types/src/components/GrStatistic/formatStatisticValue.d.ts +16 -0
- package/dist/types/src/components/GrStatistic/grStatisticStyles.d.ts +24 -0
- package/dist/types/src/components/GrStatistic/index.d.ts +6 -0
- package/dist/types/src/components/GrStatistic/safelist.d.ts +1 -0
- package/dist/types/src/components/GrSwitch/GrSwitch.vue.d.ts +4 -4
- package/dist/types/src/components/GrSwitch/defaults.d.ts +14 -0
- package/dist/types/src/components/GrSwitch/grSwitchStyles.d.ts +2 -2
- package/dist/types/src/components/GrSwitch/index.d.ts +1 -0
- package/dist/types/src/components/GrTable/GrTable.vue.d.ts +16 -0
- package/dist/types/src/components/GrTextarea/GrTextarea.vue.d.ts +5 -5
- package/dist/types/src/components/GrToaster/GrToaster.vue.d.ts +19 -2
- package/dist/types/src/components/GrToaster/index.d.ts +1 -1
- package/dist/types/src/components/GrTooltip/GrTooltip.vue.d.ts +1 -1
- package/dist/types/src/components/GrTreeSelect/GrTreeSelect.vue.d.ts +1 -1
- package/dist/types/src/components/GrTreeSelect/grTreeSelectStyles.d.ts +1 -1
- package/dist/types/src/composables/useToast.d.ts +24 -0
- package/dist/types/src/granular-provider/shared.d.ts +7 -0
- package/dist/types/src/i18n/messages/en.d.ts +74 -0
- package/dist/types/src/i18n/messages/es.d.ts +74 -0
- package/dist/types/src/i18n/messages/ru.d.ts +74 -0
- package/dist/types/src/index.d.ts +7 -0
- package/dist/web-types.json +1308 -271
- package/package.json +29 -1
- package/dist/chunks/config-1uSYl98Y2.js.map +0 -1
- package/dist/chunks/config-8Pcutu1j2.js.map +0 -1
- package/dist/chunks/config-B7IIWGt_2.js.map +0 -1
- package/dist/chunks/config-BIRO0vDJ.js.map +0 -1
- package/dist/chunks/config-BLHqZhy-2.js.map +0 -1
- package/dist/chunks/config-BOlr7qw7.js.map +0 -1
- package/dist/chunks/config-BUHuGBik.js.map +0 -1
- package/dist/chunks/config-BX1JTrkV2.js.map +0 -1
- package/dist/chunks/config-BXtAmU3s2.js.map +0 -1
- package/dist/chunks/config-C7NpDrfO.js.map +0 -1
- package/dist/chunks/config-CGHLoBlH.js.map +0 -1
- package/dist/chunks/config-ClhKPJvg.js.map +0 -1
- package/dist/chunks/config-Cpi9Mh2J.js.map +0 -1
- package/dist/chunks/config-CrG1XiE72.js.map +0 -1
- package/dist/chunks/config-DUcu1D682.js.map +0 -1
- package/dist/chunks/config-D_R56_gT.js.map +0 -1
- package/dist/chunks/config-DezDih8_.js.map +0 -1
- package/dist/chunks/config-JpHA4Xx02.js.map +0 -1
- package/dist/chunks/config-QaIc_gRa.js.map +0 -1
- package/dist/chunks/config-U4m9PSql.js.map +0 -1
- package/dist/chunks/config-eXB87DOi2.js.map +0 -1
- package/dist/chunks/config-eYLZYOUS2.js.map +0 -1
- package/dist/chunks/config-ipvU0lzP2.js.map +0 -1
- package/dist/chunks/config-xR4XVmcy.js.map +0 -1
- package/dist/chunks/en-CfkDa4GX.js.map +0 -1
- package/dist/chunks/es-FkgECuCm.js.map +0 -1
- package/dist/chunks/grBadgeStyles-DrycBuKT.js.map +0 -1
- package/dist/chunks/grButtonStyles-C7Yga_Q1.js.map +0 -1
- package/dist/chunks/grModalStyles-DWd3i05Q.js.map +0 -1
- package/dist/chunks/grSelectStyles-CLK5hRd3.js.map +0 -1
- package/dist/chunks/grStyle-Blc9otAx.js.map +0 -1
- package/dist/chunks/ru-Bl8CxpEa.js.map +0 -1
- package/dist/chunks/shared-B6Ay2081.js +0 -174
- package/dist/chunks/shared-B6Ay2081.js.map +0 -1
- package/dist/components/GrAlert/chunks/GrAlert-DPJSU_fG.js +0 -163
- package/dist/components/GrAlert/chunks/GrAlert-DPJSU_fG.js.map +0 -1
- package/dist/components/GrAvatar/chunks/GrAvatar-96CpTCq5.js.map +0 -1
- package/dist/components/GrBadge/chunks/GrBadge-B77XlaqE.js.map +0 -1
- package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-CcktMOdg.js.map +0 -1
- package/dist/components/GrBottomNav/chunks/GrBottomNav-usuMgG8_.js.map +0 -1
- package/dist/components/GrButton/chunks/GrButton-BlffdeJr.js.map +0 -1
- package/dist/components/GrCard/chunks/GrCard-DUNMkuHW.js.map +0 -1
- package/dist/components/GrCheckbox/chunks/GrCheckbox-DJhzZZdO.js.map +0 -1
- package/dist/components/GrCollapse/chunks/GrCollapse-CPPLh_xU.js.map +0 -1
- package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-D8CkOtqv.js.map +0 -1
- package/dist/components/GrDataTable/chunks/GrDataTable-Ds5OeGat.js.map +0 -1
- package/dist/components/GrDialog/chunks/GrDialog-Ctucxju9.js.map +0 -1
- package/dist/components/GrDialogService/chunks/GrDialogService-CU1Fbonc.js.map +0 -1
- package/dist/components/GrDivider/chunks/GrDivider-5bcE-BB4.js.map +0 -1
- package/dist/components/GrDrawer/chunks/GrDrawer-SLGKCY2A.js.map +0 -1
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu--g9Vofcq.js.map +0 -1
- package/dist/components/GrEmptyState/chunks/GrEmptyState-CA3BiTV7.js.map +0 -1
- package/dist/components/GrFileUpload/chunks/GrFileUpload-DvWPpiJS.js.map +0 -1
- package/dist/components/GrFormField/chunks/GrFormField-DnfMHx_U.js.map +0 -1
- package/dist/components/GrFormFile/chunks/GrFormFile-CXcqqdvV.js.map +0 -1
- package/dist/components/GrFormSection/chunks/GrFormSection-Ce21jcgo.js.map +0 -1
- package/dist/components/GrInput/chunks/GrInput-B8dd3JaA.js.map +0 -1
- package/dist/components/GrInputTag/chunks/GrInputTag-zMgFqp2g.js.map +0 -1
- package/dist/components/GrKbd/chunks/GrKbd-BEoYxWhE.js.map +0 -1
- package/dist/components/GrList/chunks/GrList-Dx772Ns4.js.map +0 -1
- package/dist/components/GrLoading/chunks/GrLoading--X_7rdbb.js.map +0 -1
- package/dist/components/GrNavbar/chunks/GrNavbar-DW3MiIIf.js.map +0 -1
- package/dist/components/GrNumberInput/chunks/GrNumberInput-DxCEvL7V.js.map +0 -1
- package/dist/components/GrPagination/chunks/GrPagination-mlyfLjQY.js.map +0 -1
- package/dist/components/GrProgressBar/chunks/GrProgressBar-CC3z-Zqp.js.map +0 -1
- package/dist/components/GrPromptDialog/chunks/GrPromptDialog-C-_BMNuY.js.map +0 -1
- package/dist/components/GrRadio/chunks/GrRadio-Dr-pvs_9.js.map +0 -1
- package/dist/components/GrRadioGroup/chunks/GrRadioGroup-nOdvfV_g.js.map +0 -1
- package/dist/components/GrSegmented/chunks/GrSegmented-C1y0UXpQ.js.map +0 -1
- package/dist/components/GrSelect/chunks/GrSelect-BVCmitqa.js.map +0 -1
- package/dist/components/GrSidebar/chunks/GrSidebar-DkWozzwA.js.map +0 -1
- package/dist/components/GrSkeleton/chunks/GrSkeleton-DsN-_CDZ.js.map +0 -1
- package/dist/components/GrSwitch/chunks/GrSwitch-DAioyccZ.js.map +0 -1
- package/dist/components/GrTable/chunks/GrTable-Db3hRnKA.js.map +0 -1
- package/dist/components/GrTabs/chunks/GrTabs-DsLwWoRz.js.map +0 -1
- package/dist/components/GrTextarea/chunks/GrTextarea-CKukGlNl.js.map +0 -1
- package/dist/components/GrToaster/chunks/GrToaster-L2cu6cSR.js.map +0 -1
- package/dist/components/GrTooltip/chunks/GrTooltip-BeyZ8ssR.js.map +0 -1
- package/dist/components/GrTree/chunks/GrTree-B2_yW6g1.js.map +0 -1
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-0aM62xyu.js.map +0 -1
- package/dist/chunks/{config-8Pcutu1j2.js → config-8Pcutu1j.js} +0 -0
- package/dist/chunks/{config-BLHqZhy-2.js → config-BLHqZhy-.js} +0 -0
- package/dist/chunks/{config-BUHuGBik.js → config-BUHuGBik2.js} +0 -0
- package/dist/chunks/{config-BX1JTrkV2.js → config-BX1JTrkV.js} +0 -0
- package/dist/chunks/{config-BXtAmU3s2.js → config-BXtAmU3s.js} +0 -0
- package/dist/chunks/{config-CGHLoBlH.js → config-CGHLoBlH2.js} +0 -0
- package/dist/chunks/{config-Cpi9Mh2J.js → config-Dqy0rPPO2.js} +1 -1
- /package/dist/chunks/{config-JpHA4Xx02.js → config-JpHA4Xx0.js} +0 -0
- /package/dist/chunks/{config-QaIc_gRa.js → config-QaIc_gRa2.js} +0 -0
- /package/dist/chunks/{config-U4m9PSql.js → config-U4m9PSql2.js} +0 -0
- /package/dist/chunks/{config-eXB87DOi2.js → config-eXB87DOi.js} +0 -0
- /package/dist/chunks/{config-ipvU0lzP2.js → config-ipvU0lzP.js} +0 -0
- /package/dist/chunks/{config-xR4XVmcy.js → config-xR4XVmcy2.js} +0 -0
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
import { a as useGrComponentProp, o as useGrComponentSize } from "../../../chunks/context-DfWYCBB-.js";
|
|
2
|
+
import { n as useGranularityTranslations } from "../../../chunks/granularityI18n-SH0I--GW.js";
|
|
3
|
+
import { vClickOutside } from "../../../directives/clickOutside.js";
|
|
4
|
+
import { t as useFloating } from "../../../chunks/useFloating-DtM6TyE4.js";
|
|
5
|
+
import { t as useEscapeToClose } from "../../../chunks/useEscapeToClose-C2t_S1gh.js";
|
|
6
|
+
import { n as useGrFormFieldContext } from "../../../chunks/context-DdNIxa1w.js";
|
|
7
|
+
import { a as autocompleteShellClass, i as autocompletePanelClasses, r as autocompleteChipClass } from "../../../chunks/config-DToHb81g.js";
|
|
8
|
+
import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, openBlock, ref, renderList, renderSlot, toDisplayString, unref, useId, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
|
|
9
|
+
//#region src/components/GrAutocomplete/GrAutocomplete.vue?vue&type=script&setup=true&lang.ts
|
|
10
|
+
var _hoisted_1 = { class: "truncate" };
|
|
11
|
+
var _hoisted_2 = ["aria-label", "onClick"];
|
|
12
|
+
var _hoisted_3 = [
|
|
13
|
+
"id",
|
|
14
|
+
"value",
|
|
15
|
+
"disabled",
|
|
16
|
+
"placeholder",
|
|
17
|
+
"aria-label",
|
|
18
|
+
"aria-invalid",
|
|
19
|
+
"aria-describedby",
|
|
20
|
+
"aria-required",
|
|
21
|
+
"aria-autocomplete",
|
|
22
|
+
"aria-controls",
|
|
23
|
+
"aria-activedescendant",
|
|
24
|
+
"aria-expanded"
|
|
25
|
+
];
|
|
26
|
+
var _hoisted_4 = {
|
|
27
|
+
key: 1,
|
|
28
|
+
"data-gr-autocomplete-spinner": "",
|
|
29
|
+
class: "shrink-0 flex items-center text-[var(--gr-muted-fg)]"
|
|
30
|
+
};
|
|
31
|
+
var _hoisted_5 = ["aria-label"];
|
|
32
|
+
var _hoisted_6 = {
|
|
33
|
+
key: 3,
|
|
34
|
+
"data-testid": "gr-autocomplete-chevron",
|
|
35
|
+
class: "shrink-0 flex items-center text-[var(--gr-muted-fg)] pointer-events-none"
|
|
36
|
+
};
|
|
37
|
+
var _hoisted_7 = ["id", "aria-multiselectable"];
|
|
38
|
+
var _hoisted_8 = [
|
|
39
|
+
"id",
|
|
40
|
+
"disabled",
|
|
41
|
+
"aria-selected",
|
|
42
|
+
"aria-disabled",
|
|
43
|
+
"onClick",
|
|
44
|
+
"onMousemove"
|
|
45
|
+
];
|
|
46
|
+
var _hoisted_9 = { class: "flex items-center gap-2 min-w-0" };
|
|
47
|
+
var _hoisted_10 = { class: "truncate" };
|
|
48
|
+
var _hoisted_11 = {
|
|
49
|
+
key: 1,
|
|
50
|
+
"data-gr-autocomplete-loading": "",
|
|
51
|
+
class: "flex items-center gap-2 px-3 py-2 text-[13px] text-[var(--gr-muted-fg)]"
|
|
52
|
+
};
|
|
53
|
+
var _hoisted_12 = {
|
|
54
|
+
key: 2,
|
|
55
|
+
"data-gr-autocomplete-hint": "",
|
|
56
|
+
class: "px-3 py-2 text-[13px] text-[var(--gr-muted-fg)]"
|
|
57
|
+
};
|
|
58
|
+
var _hoisted_13 = {
|
|
59
|
+
key: 3,
|
|
60
|
+
"data-gr-autocomplete-empty": "",
|
|
61
|
+
class: "px-3 py-2 text-[13px] text-[var(--gr-muted-fg)]"
|
|
62
|
+
};
|
|
63
|
+
//#endregion
|
|
64
|
+
//#region src/components/GrAutocomplete/GrAutocomplete.vue
|
|
65
|
+
var GrAutocomplete_default = /* @__PURE__ */ defineComponent({
|
|
66
|
+
__name: "GrAutocomplete",
|
|
67
|
+
props: {
|
|
68
|
+
modelValue: {},
|
|
69
|
+
options: { default: void 0 },
|
|
70
|
+
multiple: {
|
|
71
|
+
type: Boolean,
|
|
72
|
+
default: false
|
|
73
|
+
},
|
|
74
|
+
disabled: {
|
|
75
|
+
type: Boolean,
|
|
76
|
+
default: false
|
|
77
|
+
},
|
|
78
|
+
size: { default: void 0 },
|
|
79
|
+
placeholder: { default: void 0 },
|
|
80
|
+
ariaLabel: { default: void 0 },
|
|
81
|
+
clearable: {
|
|
82
|
+
type: Boolean,
|
|
83
|
+
default: void 0
|
|
84
|
+
},
|
|
85
|
+
loading: {
|
|
86
|
+
type: Boolean,
|
|
87
|
+
default: false
|
|
88
|
+
},
|
|
89
|
+
filterable: {
|
|
90
|
+
type: Boolean,
|
|
91
|
+
default: true
|
|
92
|
+
},
|
|
93
|
+
filter: {
|
|
94
|
+
type: Function,
|
|
95
|
+
default: void 0
|
|
96
|
+
},
|
|
97
|
+
minQueryLength: { default: 0 },
|
|
98
|
+
debounce: { default: 250 },
|
|
99
|
+
allowCustomValue: {
|
|
100
|
+
type: Boolean,
|
|
101
|
+
default: false
|
|
102
|
+
},
|
|
103
|
+
closeOnSelect: {
|
|
104
|
+
type: Boolean,
|
|
105
|
+
default: true
|
|
106
|
+
},
|
|
107
|
+
dropdownMaxHeight: { default: 280 },
|
|
108
|
+
loadingText: { default: void 0 },
|
|
109
|
+
noResultsText: { default: void 0 },
|
|
110
|
+
clearLabel: { default: void 0 }
|
|
111
|
+
},
|
|
112
|
+
emits: ["update:modelValue", "search"],
|
|
113
|
+
setup(__props, { emit: __emit }) {
|
|
114
|
+
const props = __props;
|
|
115
|
+
const resolvedSize = useGrComponentSize(() => props.size, { component: "GrAutocomplete" });
|
|
116
|
+
const resolvedClearable = useGrComponentProp("GrAutocomplete", "clearable", () => props.clearable, false);
|
|
117
|
+
const emit = __emit;
|
|
118
|
+
const { t } = useGranularityTranslations();
|
|
119
|
+
const resolvedLoadingText = computed(() => props.loadingText ?? t("gr.autocomplete.loading", "Loading…"));
|
|
120
|
+
const resolvedNoResultsText = computed(() => props.noResultsText ?? t("gr.autocomplete.noResults", "No results"));
|
|
121
|
+
const resolvedClearLabel = computed(() => props.clearLabel ?? t("gr.common.clear", "Clear"));
|
|
122
|
+
const resolvedTypeMoreText = computed(() => t("gr.autocomplete.typeMore", "Type at least {n} characters", { n: props.minQueryLength }));
|
|
123
|
+
const field = useGrFormFieldContext();
|
|
124
|
+
const resolvedId = computed(() => field?.id.value);
|
|
125
|
+
const isInvalid = computed(() => Boolean(field?.invalid.value));
|
|
126
|
+
const describedBy = computed(() => field?.describedById.value);
|
|
127
|
+
const isRequired = computed(() => Boolean(field?.required.value));
|
|
128
|
+
const optionsResolved = computed(() => props.options ?? []);
|
|
129
|
+
function toArray(value) {
|
|
130
|
+
if (Array.isArray(value)) return value;
|
|
131
|
+
if (!value) return [];
|
|
132
|
+
return [value];
|
|
133
|
+
}
|
|
134
|
+
const modelSingle = computed(() => Array.isArray(props.modelValue) ? props.modelValue[0] ?? "" : props.modelValue);
|
|
135
|
+
const selectedValues = computed(() => props.multiple ? toArray(props.modelValue) : modelSingle.value ? [modelSingle.value] : []);
|
|
136
|
+
const hasSelection = computed(() => selectedValues.value.length > 0);
|
|
137
|
+
function labelFor(value) {
|
|
138
|
+
return optionsResolved.value.find((o) => o.value === value)?.label ?? value;
|
|
139
|
+
}
|
|
140
|
+
/** Опции выбранных значений (для chips в multiple). Неизвестные значения показываем как есть. */
|
|
141
|
+
const selectedOptions = computed(() => selectedValues.value.map((v) => optionsResolved.value.find((o) => o.value === v) ?? {
|
|
142
|
+
value: v,
|
|
143
|
+
label: v
|
|
144
|
+
}));
|
|
145
|
+
const singleSelectedLabel = computed(() => props.multiple || !modelSingle.value ? "" : labelFor(modelSingle.value));
|
|
146
|
+
const query = ref("");
|
|
147
|
+
const dirty = ref(false);
|
|
148
|
+
const open = ref(false);
|
|
149
|
+
const activeIndex = ref(-1);
|
|
150
|
+
const rootEl = ref(null);
|
|
151
|
+
const panelEl = ref(null);
|
|
152
|
+
const inputEl = ref(null);
|
|
153
|
+
const clickOutsideExclude = [() => panelEl.value];
|
|
154
|
+
const { floatingStyle } = useFloating(rootEl, panelEl, open, {
|
|
155
|
+
placement: "bottom-start",
|
|
156
|
+
matchWidth: true,
|
|
157
|
+
zIndexVar: "--gr-z-dropdown"
|
|
158
|
+
});
|
|
159
|
+
useEscapeToClose(open, closeDropdown);
|
|
160
|
+
const searchQuery = computed(() => {
|
|
161
|
+
if (!props.filterable) return "";
|
|
162
|
+
if (!props.multiple && !dirty.value) return "";
|
|
163
|
+
return query.value.trim();
|
|
164
|
+
});
|
|
165
|
+
function defaultFilter(option, q) {
|
|
166
|
+
const needle = q.toLowerCase();
|
|
167
|
+
return option.label.toLowerCase().includes(needle) || option.value.toLowerCase().includes(needle);
|
|
168
|
+
}
|
|
169
|
+
const filteredOptions = computed(() => {
|
|
170
|
+
const q = searchQuery.value;
|
|
171
|
+
if (!q) return optionsResolved.value;
|
|
172
|
+
const matcher = props.filter ?? defaultFilter;
|
|
173
|
+
return optionsResolved.value.filter((o) => matcher(o, q));
|
|
174
|
+
});
|
|
175
|
+
const navigableValues = computed(() => filteredOptions.value.filter((o) => !o.disabled).map((o) => o.value));
|
|
176
|
+
const canAddCustom = computed(() => {
|
|
177
|
+
if (!props.allowCustomValue) return false;
|
|
178
|
+
const v = query.value.trim();
|
|
179
|
+
if (!v) return false;
|
|
180
|
+
if (props.multiple && selectedValues.value.includes(v)) return false;
|
|
181
|
+
if (!props.multiple && v === modelSingle.value) return false;
|
|
182
|
+
return !optionsResolved.value.some((o) => o.value === v || o.label === v);
|
|
183
|
+
});
|
|
184
|
+
const belowMinQuery = computed(() => props.minQueryLength > 0 && query.value.trim().length < props.minQueryLength);
|
|
185
|
+
const showLoading = computed(() => props.loading);
|
|
186
|
+
const showEmpty = computed(() => !props.loading && filteredOptions.value.length === 0 && !canAddCustom.value);
|
|
187
|
+
const listboxId = useId();
|
|
188
|
+
function optionDomId(value) {
|
|
189
|
+
return `${listboxId}-opt-${value}`;
|
|
190
|
+
}
|
|
191
|
+
const activeValue = computed(() => activeIndex.value >= 0 ? navigableValues.value[activeIndex.value] : void 0);
|
|
192
|
+
const activeDescendantId = computed(() => open.value && activeValue.value !== void 0 ? optionDomId(activeValue.value) : void 0);
|
|
193
|
+
function isSelected(value) {
|
|
194
|
+
return selectedValues.value.includes(value);
|
|
195
|
+
}
|
|
196
|
+
function clampActive(index) {
|
|
197
|
+
const len = navigableValues.value.length;
|
|
198
|
+
if (len === 0) return -1;
|
|
199
|
+
return (index % len + len) % len;
|
|
200
|
+
}
|
|
201
|
+
async function scrollActiveIntoView() {
|
|
202
|
+
await nextTick();
|
|
203
|
+
const value = activeValue.value;
|
|
204
|
+
if (value === void 0) return;
|
|
205
|
+
document.getElementById(optionDomId(value))?.scrollIntoView?.({ block: "nearest" });
|
|
206
|
+
}
|
|
207
|
+
function setActive(index) {
|
|
208
|
+
activeIndex.value = clampActive(index);
|
|
209
|
+
scrollActiveIntoView();
|
|
210
|
+
}
|
|
211
|
+
function initActiveIndex() {
|
|
212
|
+
const selectedIdx = navigableValues.value.findIndex((v) => isSelected(v));
|
|
213
|
+
activeIndex.value = selectedIdx >= 0 ? selectedIdx : navigableValues.value.length ? 0 : -1;
|
|
214
|
+
}
|
|
215
|
+
watch(navigableValues, () => {
|
|
216
|
+
if (!open.value) return;
|
|
217
|
+
if (activeIndex.value >= navigableValues.value.length) activeIndex.value = navigableValues.value.length - 1;
|
|
218
|
+
if (activeIndex.value < 0 && navigableValues.value.length) activeIndex.value = 0;
|
|
219
|
+
});
|
|
220
|
+
function openDropdown() {
|
|
221
|
+
if (props.disabled || open.value) return;
|
|
222
|
+
open.value = true;
|
|
223
|
+
}
|
|
224
|
+
function closeDropdown() {
|
|
225
|
+
open.value = false;
|
|
226
|
+
}
|
|
227
|
+
function focusInput() {
|
|
228
|
+
inputEl.value?.focus();
|
|
229
|
+
}
|
|
230
|
+
let searchTimer = null;
|
|
231
|
+
function scheduleSearch(value) {
|
|
232
|
+
if (searchTimer) clearTimeout(searchTimer);
|
|
233
|
+
searchTimer = setTimeout(() => {
|
|
234
|
+
if (props.minQueryLength > 0 && value.trim().length < props.minQueryLength) return;
|
|
235
|
+
emit("search", value.trim());
|
|
236
|
+
}, props.debounce);
|
|
237
|
+
}
|
|
238
|
+
onBeforeUnmount(() => {
|
|
239
|
+
if (searchTimer) clearTimeout(searchTimer);
|
|
240
|
+
});
|
|
241
|
+
function onInput(event) {
|
|
242
|
+
const value = event.target.value;
|
|
243
|
+
query.value = value;
|
|
244
|
+
dirty.value = true;
|
|
245
|
+
openDropdown();
|
|
246
|
+
scheduleSearch(value);
|
|
247
|
+
}
|
|
248
|
+
function onFocus() {
|
|
249
|
+
if (props.disabled) return;
|
|
250
|
+
openDropdown();
|
|
251
|
+
}
|
|
252
|
+
function setQuery(value) {
|
|
253
|
+
query.value = value;
|
|
254
|
+
dirty.value = false;
|
|
255
|
+
}
|
|
256
|
+
function selectSingle(value, label) {
|
|
257
|
+
emit("update:modelValue", value);
|
|
258
|
+
setQuery(label);
|
|
259
|
+
closeDropdown();
|
|
260
|
+
}
|
|
261
|
+
function toggleMultiple(value) {
|
|
262
|
+
const next = selectedValues.value.slice();
|
|
263
|
+
const idx = next.indexOf(value);
|
|
264
|
+
if (idx >= 0) next.splice(idx, 1);
|
|
265
|
+
else next.push(value);
|
|
266
|
+
emit("update:modelValue", next);
|
|
267
|
+
setQuery("");
|
|
268
|
+
if (props.closeOnSelect) closeDropdown();
|
|
269
|
+
else nextTick(focusInput);
|
|
270
|
+
}
|
|
271
|
+
function chooseOption(option) {
|
|
272
|
+
if (option.disabled) return;
|
|
273
|
+
if (props.multiple) toggleMultiple(option.value);
|
|
274
|
+
else selectSingle(option.value, option.label);
|
|
275
|
+
}
|
|
276
|
+
function commitCustom() {
|
|
277
|
+
const v = query.value.trim();
|
|
278
|
+
if (!v) return;
|
|
279
|
+
if (props.multiple) toggleMultiple(v);
|
|
280
|
+
else selectSingle(v, v);
|
|
281
|
+
}
|
|
282
|
+
function removeValue(value) {
|
|
283
|
+
const next = selectedValues.value.filter((v) => v !== value);
|
|
284
|
+
emit("update:modelValue", next);
|
|
285
|
+
nextTick(focusInput);
|
|
286
|
+
}
|
|
287
|
+
function clearSelection() {
|
|
288
|
+
if (props.disabled) return;
|
|
289
|
+
emit("update:modelValue", props.multiple ? [] : "");
|
|
290
|
+
setQuery("");
|
|
291
|
+
nextTick(focusInput);
|
|
292
|
+
}
|
|
293
|
+
const showClear = computed(() => resolvedClearable.value && !props.disabled && (hasSelection.value || query.value.length > 0));
|
|
294
|
+
function onKeydown(event) {
|
|
295
|
+
if (props.disabled) return;
|
|
296
|
+
if (!open.value && ["ArrowDown", "ArrowUp"].includes(event.key)) {
|
|
297
|
+
event.preventDefault();
|
|
298
|
+
openDropdown();
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
switch (event.key) {
|
|
302
|
+
case "ArrowDown":
|
|
303
|
+
event.preventDefault();
|
|
304
|
+
setActive(activeIndex.value + 1);
|
|
305
|
+
break;
|
|
306
|
+
case "ArrowUp":
|
|
307
|
+
event.preventDefault();
|
|
308
|
+
setActive(activeIndex.value - 1);
|
|
309
|
+
break;
|
|
310
|
+
case "Home":
|
|
311
|
+
if (!open.value) break;
|
|
312
|
+
event.preventDefault();
|
|
313
|
+
setActive(0);
|
|
314
|
+
break;
|
|
315
|
+
case "End":
|
|
316
|
+
if (!open.value) break;
|
|
317
|
+
event.preventDefault();
|
|
318
|
+
setActive(navigableValues.value.length - 1);
|
|
319
|
+
break;
|
|
320
|
+
case "Enter":
|
|
321
|
+
if (!open.value) break;
|
|
322
|
+
event.preventDefault();
|
|
323
|
+
if (activeValue.value !== void 0) {
|
|
324
|
+
const opt = filteredOptions.value.find((o) => o.value === activeValue.value);
|
|
325
|
+
if (opt) chooseOption(opt);
|
|
326
|
+
} else if (canAddCustom.value) commitCustom();
|
|
327
|
+
break;
|
|
328
|
+
case "Backspace":
|
|
329
|
+
if (props.multiple && query.value === "" && selectedValues.value.length) {
|
|
330
|
+
event.preventDefault();
|
|
331
|
+
removeValue(selectedValues.value[selectedValues.value.length - 1]);
|
|
332
|
+
}
|
|
333
|
+
break;
|
|
334
|
+
case "Tab":
|
|
335
|
+
closeDropdown();
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
watch([singleSelectedLabel, () => props.multiple], ([label, multiple]) => {
|
|
340
|
+
if (multiple) return;
|
|
341
|
+
if (open.value || dirty.value) return;
|
|
342
|
+
setQuery(label);
|
|
343
|
+
}, { immediate: true });
|
|
344
|
+
watch(open, (isOpen) => {
|
|
345
|
+
if (isOpen) {
|
|
346
|
+
initActiveIndex();
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
activeIndex.value = -1;
|
|
350
|
+
if (props.multiple) setQuery("");
|
|
351
|
+
else setQuery(singleSelectedLabel.value);
|
|
352
|
+
});
|
|
353
|
+
const ariaAutocomplete = computed(() => props.allowCustomValue ? "both" : "list");
|
|
354
|
+
return (_ctx, _cache) => {
|
|
355
|
+
return withDirectives((openBlock(), createElementBlock("div", {
|
|
356
|
+
ref_key: "rootEl",
|
|
357
|
+
ref: rootEl,
|
|
358
|
+
"data-gr-autocomplete": "",
|
|
359
|
+
class: "relative w-full"
|
|
360
|
+
}, [createElementVNode("div", {
|
|
361
|
+
"data-gr-autocomplete-shell": "",
|
|
362
|
+
class: normalizeClass(unref(autocompleteShellClass)({
|
|
363
|
+
size: unref(resolvedSize),
|
|
364
|
+
disabled: __props.disabled,
|
|
365
|
+
invalid: isInvalid.value
|
|
366
|
+
})),
|
|
367
|
+
onMousedown: withModifiers(focusInput, ["self", "prevent"])
|
|
368
|
+
}, [
|
|
369
|
+
__props.multiple ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(selectedOptions.value, (option) => {
|
|
370
|
+
return openBlock(), createElementBlock("span", {
|
|
371
|
+
key: option.value,
|
|
372
|
+
"data-gr-autocomplete-chip": "",
|
|
373
|
+
class: normalizeClass(unref(autocompleteChipClass))
|
|
374
|
+
}, [createElementVNode("span", _hoisted_1, toDisplayString(option.label), 1), !__props.disabled ? (openBlock(), createElementBlock("button", {
|
|
375
|
+
key: 0,
|
|
376
|
+
type: "button",
|
|
377
|
+
"data-gr-autocomplete-chip-remove": "",
|
|
378
|
+
class: "inline-flex h-3.5 w-3.5 shrink-0 items-center justify-center rounded-full text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)]",
|
|
379
|
+
"aria-label": unref(t)("gr.inputTag.removeTag", "Remove tag"),
|
|
380
|
+
tabindex: "-1",
|
|
381
|
+
onClick: ($event) => removeValue(option.value)
|
|
382
|
+
}, [..._cache[0] || (_cache[0] = [createElementVNode("span", {
|
|
383
|
+
class: "i-lucide-x block h-3 w-3",
|
|
384
|
+
"aria-hidden": "true"
|
|
385
|
+
}, null, -1)])], 8, _hoisted_2)) : createCommentVNode("", true)], 2);
|
|
386
|
+
}), 128)) : createCommentVNode("", true),
|
|
387
|
+
createElementVNode("input", {
|
|
388
|
+
id: resolvedId.value,
|
|
389
|
+
ref_key: "inputEl",
|
|
390
|
+
ref: inputEl,
|
|
391
|
+
"data-gr-autocomplete-input": "",
|
|
392
|
+
"data-testid": "gr-autocomplete-input",
|
|
393
|
+
type: "text",
|
|
394
|
+
autocomplete: "off",
|
|
395
|
+
spellcheck: "false",
|
|
396
|
+
role: "combobox",
|
|
397
|
+
value: query.value,
|
|
398
|
+
disabled: __props.disabled,
|
|
399
|
+
placeholder: hasSelection.value && __props.multiple ? void 0 : __props.placeholder,
|
|
400
|
+
"aria-label": __props.ariaLabel,
|
|
401
|
+
"aria-invalid": isInvalid.value ? "true" : void 0,
|
|
402
|
+
"aria-describedby": describedBy.value,
|
|
403
|
+
"aria-required": isRequired.value ? "true" : void 0,
|
|
404
|
+
"aria-haspopup": "listbox",
|
|
405
|
+
"aria-autocomplete": ariaAutocomplete.value,
|
|
406
|
+
"aria-controls": open.value ? unref(listboxId) : void 0,
|
|
407
|
+
"aria-activedescendant": activeDescendantId.value,
|
|
408
|
+
"aria-expanded": open.value ? "true" : "false",
|
|
409
|
+
class: "min-w-0 flex-1 bg-transparent text-inherit placeholder:text-[var(--gr-muted-fg)] focus:outline-none disabled:cursor-not-allowed",
|
|
410
|
+
onInput,
|
|
411
|
+
onFocus,
|
|
412
|
+
onKeydown
|
|
413
|
+
}, null, 40, _hoisted_3),
|
|
414
|
+
__props.loading ? (openBlock(), createElementBlock("span", _hoisted_4, [..._cache[1] || (_cache[1] = [createElementVNode("span", {
|
|
415
|
+
class: "i-lucide-loader-2 block h-4 w-4 animate-spin",
|
|
416
|
+
"aria-hidden": "true"
|
|
417
|
+
}, null, -1)])])) : showClear.value ? (openBlock(), createElementBlock("button", {
|
|
418
|
+
key: 2,
|
|
419
|
+
type: "button",
|
|
420
|
+
"data-testid": "gr-autocomplete-clear",
|
|
421
|
+
"data-gr-autocomplete-clear": "",
|
|
422
|
+
class: "shrink-0 inline-flex h-5 w-5 items-center justify-center rounded-md text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)]",
|
|
423
|
+
"aria-label": resolvedClearLabel.value,
|
|
424
|
+
tabindex: "-1",
|
|
425
|
+
onClick: clearSelection
|
|
426
|
+
}, [..._cache[2] || (_cache[2] = [createElementVNode("span", {
|
|
427
|
+
class: "i-lucide-x block h-4 w-4",
|
|
428
|
+
"aria-hidden": "true"
|
|
429
|
+
}, null, -1)])], 8, _hoisted_5)) : (openBlock(), createElementBlock("span", _hoisted_6, [..._cache[3] || (_cache[3] = [createElementVNode("span", {
|
|
430
|
+
class: "i-lucide-chevron-down block h-4 w-4",
|
|
431
|
+
"aria-hidden": "true"
|
|
432
|
+
}, null, -1)])]))
|
|
433
|
+
], 34), (openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, {
|
|
434
|
+
"enter-active-class": "transition ease-out duration-150",
|
|
435
|
+
"enter-from-class": "transform opacity-0 scale-95",
|
|
436
|
+
"enter-to-class": "transform opacity-100 scale-100",
|
|
437
|
+
"leave-active-class": "transition ease-in duration-100",
|
|
438
|
+
"leave-from-class": "transform opacity-100 scale-100",
|
|
439
|
+
"leave-to-class": "transform opacity-0 scale-95"
|
|
440
|
+
}, {
|
|
441
|
+
default: withCtx(() => [withDirectives(createElementVNode("div", {
|
|
442
|
+
ref_key: "panelEl",
|
|
443
|
+
ref: panelEl,
|
|
444
|
+
"data-testid": "gr-autocomplete-panel",
|
|
445
|
+
"data-gr-autocomplete-panel": "",
|
|
446
|
+
style: normalizeStyle(unref(floatingStyle))
|
|
447
|
+
}, [createElementVNode("div", { class: normalizeClass(unref(autocompletePanelClasses)) }, [createElementVNode("div", {
|
|
448
|
+
id: unref(listboxId),
|
|
449
|
+
"data-gr-autocomplete-listbox": "",
|
|
450
|
+
class: "p-1 overflow-auto",
|
|
451
|
+
style: normalizeStyle({ maxHeight: `${__props.dropdownMaxHeight}px` }),
|
|
452
|
+
role: "listbox",
|
|
453
|
+
"aria-multiselectable": __props.multiple ? "true" : void 0
|
|
454
|
+
}, [
|
|
455
|
+
canAddCustom.value ? (openBlock(), createElementBlock("button", {
|
|
456
|
+
key: 0,
|
|
457
|
+
type: "button",
|
|
458
|
+
"data-testid": "gr-autocomplete-add-option",
|
|
459
|
+
"data-gr-autocomplete-add-option": "",
|
|
460
|
+
class: "w-full rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--gr-muted)_30%,transparent)]",
|
|
461
|
+
onClick: commitCustom
|
|
462
|
+
}, toDisplayString(unref(t)("gr.autocomplete.addOption", "Add \"{value}\"", { value: query.value.trim() })), 1)) : createCommentVNode("", true),
|
|
463
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(filteredOptions.value, (option) => {
|
|
464
|
+
return openBlock(), createElementBlock("button", {
|
|
465
|
+
id: optionDomId(option.value),
|
|
466
|
+
key: option.value,
|
|
467
|
+
"data-gr-autocomplete-option": "",
|
|
468
|
+
type: "button",
|
|
469
|
+
role: "option",
|
|
470
|
+
disabled: option.disabled,
|
|
471
|
+
"aria-selected": isSelected(option.value) ? "true" : "false",
|
|
472
|
+
"aria-disabled": option.disabled ? "true" : void 0,
|
|
473
|
+
class: normalizeClass(["w-full rounded-[10px] px-3 py-2 text-left text-[13px]", [option.disabled ? "cursor-not-allowed opacity-50" : "hover:bg-[color-mix(in_srgb,var(--gr-muted)_30%,transparent)]", activeValue.value === option.value && !option.disabled ? "bg-[color-mix(in_srgb,var(--gr-muted)_30%,transparent)]" : ""]]),
|
|
474
|
+
onClick: ($event) => chooseOption(option),
|
|
475
|
+
onMousemove: ($event) => activeIndex.value = navigableValues.value.indexOf(option.value)
|
|
476
|
+
}, [renderSlot(_ctx.$slots, "option", {
|
|
477
|
+
option,
|
|
478
|
+
selected: isSelected(option.value)
|
|
479
|
+
}, () => [createElementVNode("span", _hoisted_9, [createElementVNode("span", {
|
|
480
|
+
class: normalizeClass(["inline-block h-4 w-4 shrink-0", isSelected(option.value) ? "i-lucide-check text-[var(--gr-primary)]" : ""]),
|
|
481
|
+
"aria-hidden": "true"
|
|
482
|
+
}, null, 2), createElementVNode("span", _hoisted_10, toDisplayString(option.label), 1)])])], 42, _hoisted_8);
|
|
483
|
+
}), 128)),
|
|
484
|
+
showLoading.value ? (openBlock(), createElementBlock("div", _hoisted_11, [renderSlot(_ctx.$slots, "loading", {}, () => [_cache[4] || (_cache[4] = createElementVNode("span", {
|
|
485
|
+
class: "i-lucide-loader-2 block h-4 w-4 animate-spin",
|
|
486
|
+
"aria-hidden": "true"
|
|
487
|
+
}, null, -1)), createElementVNode("span", null, toDisplayString(resolvedLoadingText.value), 1)])])) : showEmpty.value && belowMinQuery.value ? (openBlock(), createElementBlock("div", _hoisted_12, toDisplayString(resolvedTypeMoreText.value), 1)) : showEmpty.value ? (openBlock(), createElementBlock("div", _hoisted_13, [renderSlot(_ctx.$slots, "empty", {}, () => [createTextVNode(toDisplayString(resolvedNoResultsText.value), 1)])])) : createCommentVNode("", true)
|
|
488
|
+
], 12, _hoisted_7)], 2)], 4), [[vShow, open.value]])]),
|
|
489
|
+
_: 3
|
|
490
|
+
})]))])), [[unref(vClickOutside), {
|
|
491
|
+
handler: closeDropdown,
|
|
492
|
+
enabled: open.value,
|
|
493
|
+
exclude: clickOutsideExclude
|
|
494
|
+
}]]);
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
});
|
|
498
|
+
//#endregion
|
|
499
|
+
export { GrAutocomplete_default as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrAutocomplete-BVLoQ5tZ.js","names":[],"sources":["../../../../src/components/GrAutocomplete/GrAutocomplete.vue","../../../../src/components/GrAutocomplete/GrAutocomplete.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, useId, watch } from 'vue'\n\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\n\nimport { vClickOutside } from '../../directives'\nimport { useFloating } from '../../composables/internal/useFloating'\nimport { useEscapeToClose } from '../../composables/internal/useEscapeToClose'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { useGrFormFieldContext } from '../GrFormField/context'\n\nimport {\n autocompleteChipClass,\n autocompletePanelClasses,\n autocompleteShellClass,\n type GrAutocompleteModelValue,\n type GrAutocompleteOption,\n type GrAutocompleteSize,\n} from './grAutocompleteStyles'\n\nexport type {\n GrAutocompleteModelValue,\n GrAutocompleteOption,\n GrAutocompleteSize,\n} from './grAutocompleteStyles'\n\n/**\n * Публичный GR-примитив «Autocomplete / Combobox» (WAI-ARIA editable combobox).\n *\n * В отличие от `GrSelect` (select-only combobox с кнопкой-триггером), здесь\n * combobox-ом является сам текстовый `<input>`: набранный текст — это поисковый\n * запрос, а выбор опции заполняет поле. Поддерживает локальную фильтрацию,\n * удалённую (async) загрузку через событие `search` + внешний проп `loading`,\n * произвольные значения (`allowCustomValue`) и multiple с удаляемыми chips.\n */\nexport interface GrAutocompleteProps {\n /** Выбранное значение (single — строка, multiple — массив строк). */\n modelValue: GrAutocompleteModelValue\n /**\n * Доступные опции. Для локального режима — полный список (фильтруется на клиенте).\n * Для remote-режима (`filterable=false`) — список, который родитель обновляет\n * в ответ на событие `search`.\n */\n options?: GrAutocompleteOption[]\n multiple?: boolean\n disabled?: boolean\n size?: GrAutocompleteSize\n placeholder?: string\n ariaLabel?: string\n /** Кнопка очистки выбранного значения/запроса. */\n clearable?: boolean\n /** Внешне управляемое состояние загрузки (для async-сценариев). */\n loading?: boolean\n /**\n * Локальная фильтрация опций по введённому запросу. Отключите (`false`) для\n * чисто удалённого поиска — тогда `options` показываются как есть, а фильтрацию\n * выполняет сервер по событию `search`.\n */\n filterable?: boolean\n /** Кастомный матчер локальной фильтрации. По умолчанию — подстрока в `label`/`value`. */\n filter?: (option: GrAutocompleteOption, query: string) => boolean\n /** Минимальная длина запроса до эмита `search` (для дебаунса remote-загрузки). */\n minQueryLength?: number\n /** Задержка дебаунса события `search`, мс. */\n debounce?: number\n /** Разрешить ввод/коммит значения, которого нет в `options`. */\n allowCustomValue?: boolean\n /** Закрывать панель после выбора (single всегда закрывает). */\n closeOnSelect?: boolean\n /** Максимальная высота панели, px. */\n dropdownMaxHeight?: number\n /** i18n-тексты состояний панели / aria. */\n loadingText?: string\n noResultsText?: string\n clearLabel?: string\n}\n\nconst props = withDefaults(\n defineProps<GrAutocompleteProps>(),\n {\n options: undefined,\n multiple: false,\n disabled: false,\n size: undefined,\n placeholder: undefined,\n ariaLabel: undefined,\n clearable: undefined,\n loading: false,\n filterable: true,\n filter: undefined,\n minQueryLength: 0,\n debounce: 250,\n allowCustomValue: false,\n closeOnSelect: true,\n dropdownMaxHeight: 280,\n loadingText: undefined,\n noResultsText: undefined,\n clearLabel: undefined,\n },\n)\n\n// Эффективный размер: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrAutocomplete' })\nconst resolvedClearable = useGrComponentProp('GrAutocomplete', 'clearable', () => props.clearable, false)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: GrAutocompleteModelValue): void\n /** Дебаунснутый поисковый запрос — точка входа для удалённой загрузки опций. */\n (e: 'search', query: string): void\n}>()\n\nconst { t } = useGranularityTranslations()\n\nconst resolvedLoadingText = computed(() => props.loadingText ?? t('gr.autocomplete.loading', 'Loading…'))\nconst resolvedNoResultsText = computed(() => props.noResultsText ?? t('gr.autocomplete.noResults', 'No results'))\nconst resolvedClearLabel = computed(() => props.clearLabel ?? t('gr.common.clear', 'Clear'))\nconst resolvedTypeMoreText = computed(() =>\n t('gr.autocomplete.typeMore', 'Type at least {n} characters', { n: props.minQueryLength }),\n)\n\n// Fallback из контекста `GrFormField` (id/aria-describedby/invalid/required).\nconst field = useGrFormFieldContext()\nconst resolvedId = computed(() => field?.id.value)\nconst isInvalid = computed(() => Boolean(field?.invalid.value))\nconst describedBy = computed(() => field?.describedById.value)\nconst isRequired = computed(() => Boolean(field?.required.value))\n\nconst optionsResolved = computed<GrAutocompleteOption[]>(() => props.options ?? [])\n\nfunction toArray(value: GrAutocompleteModelValue): string[] {\n if (Array.isArray(value)) return value\n if (!value) return []\n return [value]\n}\n\nconst modelSingle = computed(() => (Array.isArray(props.modelValue) ? (props.modelValue[0] ?? '') : props.modelValue))\nconst selectedValues = computed(() => (props.multiple ? toArray(props.modelValue) : (modelSingle.value ? [modelSingle.value] : [])))\nconst hasSelection = computed(() => selectedValues.value.length > 0)\n\nfunction labelFor(value: string): string {\n return optionsResolved.value.find(o => o.value === value)?.label ?? value\n}\n\n/** Опции выбранных значений (для chips в multiple). Неизвестные значения показываем как есть. */\nconst selectedOptions = computed<GrAutocompleteOption[]>(() =>\n selectedValues.value.map(v => optionsResolved.value.find(o => o.value === v) ?? { value: v, label: v }),\n)\n\nconst singleSelectedLabel = computed(() => (props.multiple || !modelSingle.value ? '' : labelFor(modelSingle.value)))\n\n// ————— Состояние.\nconst query = ref('')\n// `dirty` — пользователь начал вводить запрос. Нужно, чтобы в single-режиме при\n// открытии заполненного поля показать весь список (а не отфильтровать по метке\n// уже выбранной опции). Сбрасывается при программной установке `query`.\nconst dirty = ref(false)\nconst open = ref(false)\nconst activeIndex = ref(-1)\n\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst inputEl = ref<HTMLInputElement | null>(null)\nconst clickOutsideExclude = [() => panelEl.value]\n\nconst { floatingStyle } = useFloating(rootEl, panelEl, open, {\n placement: 'bottom-start',\n matchWidth: true,\n zIndexVar: '--gr-z-dropdown',\n})\n\nuseEscapeToClose(open, closeDropdown)\n\n// ————— Фильтрация.\nconst searchQuery = computed(() => {\n if (!props.filterable) return ''\n // single: пока пользователь не начал вводить — показываем весь список.\n if (!props.multiple && !dirty.value) return ''\n return query.value.trim()\n})\n\nfunction defaultFilter(option: GrAutocompleteOption, q: string): boolean {\n const needle = q.toLowerCase()\n return option.label.toLowerCase().includes(needle) || option.value.toLowerCase().includes(needle)\n}\n\nconst filteredOptions = computed<GrAutocompleteOption[]>(() => {\n const q = searchQuery.value\n if (!q) return optionsResolved.value\n const matcher = props.filter ?? defaultFilter\n return optionsResolved.value.filter(o => matcher(o, q))\n})\n\nconst navigableValues = computed<string[]>(() =>\n filteredOptions.value.filter(o => !o.disabled).map(o => o.value),\n)\n\nconst canAddCustom = computed(() => {\n if (!props.allowCustomValue) return false\n const v = query.value.trim()\n if (!v) return false\n if (props.multiple && selectedValues.value.includes(v)) return false\n if (!props.multiple && v === modelSingle.value) return false\n // Не предлагаем «Add», если такое значение/метка уже есть среди опций.\n return !optionsResolved.value.some(o => o.value === v || o.label === v)\n})\n\nconst belowMinQuery = computed(() => props.minQueryLength > 0 && query.value.trim().length < props.minQueryLength)\n\nconst showLoading = computed(() => props.loading)\nconst showEmpty = computed(() =>\n !props.loading && filteredOptions.value.length === 0 && !canAddCustom.value,\n)\n\n// ————— Панель: id/aria-activedescendant.\nconst listboxId = useId()\n\nfunction optionDomId(value: string): string {\n return `${listboxId}-opt-${value}`\n}\n\nconst activeValue = computed(() => (activeIndex.value >= 0 ? navigableValues.value[activeIndex.value] : undefined))\nconst activeDescendantId = computed(() =>\n open.value && activeValue.value !== undefined ? optionDomId(activeValue.value) : undefined,\n)\n\nfunction isSelected(value: string): boolean {\n return selectedValues.value.includes(value)\n}\n\nfunction clampActive(index: number): number {\n const len = navigableValues.value.length\n if (len === 0) return -1\n return ((index % len) + len) % len\n}\n\nasync function scrollActiveIntoView(): Promise<void> {\n await nextTick()\n const value = activeValue.value\n if (value === undefined) return\n document.getElementById(optionDomId(value))?.scrollIntoView?.({ block: 'nearest' })\n}\n\nfunction setActive(index: number): void {\n activeIndex.value = clampActive(index)\n void scrollActiveIntoView()\n}\n\nfunction initActiveIndex(): void {\n const selectedIdx = navigableValues.value.findIndex(v => isSelected(v))\n activeIndex.value = selectedIdx >= 0 ? selectedIdx : (navigableValues.value.length ? 0 : -1)\n}\n\n// Пересчёт активной опции при изменении списка (фильтрация/remote-загрузка).\nwatch(navigableValues, () => {\n if (!open.value) return\n if (activeIndex.value >= navigableValues.value.length) activeIndex.value = navigableValues.value.length - 1\n if (activeIndex.value < 0 && navigableValues.value.length) activeIndex.value = 0\n})\n\n// ————— Открытие/закрытие.\nfunction openDropdown(): void {\n if (props.disabled || open.value) return\n open.value = true\n}\n\nfunction closeDropdown(): void {\n open.value = false\n}\n\nfunction focusInput(): void {\n inputEl.value?.focus()\n}\n\n// ————— Дебаунснутый эмит `search` для remote-загрузки.\nlet searchTimer: ReturnType<typeof setTimeout> | null = null\nfunction scheduleSearch(value: string): void {\n if (searchTimer) clearTimeout(searchTimer)\n searchTimer = setTimeout(() => {\n if (props.minQueryLength > 0 && value.trim().length < props.minQueryLength) return\n emit('search', value.trim())\n }, props.debounce)\n}\n\nonBeforeUnmount(() => {\n if (searchTimer) clearTimeout(searchTimer)\n})\n\n// ————— Ввод.\nfunction onInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value\n query.value = value\n dirty.value = true\n openDropdown()\n scheduleSearch(value)\n}\n\nfunction onFocus(): void {\n if (props.disabled) return\n openDropdown()\n}\n\nfunction setQuery(value: string): void {\n query.value = value\n dirty.value = false\n}\n\n// ————— Выбор значений.\nfunction selectSingle(value: string, label: string): void {\n emit('update:modelValue', value)\n setQuery(label)\n closeDropdown()\n}\n\nfunction toggleMultiple(value: string): void {\n const next = selectedValues.value.slice()\n const idx = next.indexOf(value)\n if (idx >= 0) next.splice(idx, 1)\n else next.push(value)\n emit('update:modelValue', next)\n setQuery('')\n if (props.closeOnSelect) closeDropdown()\n else void nextTick(focusInput)\n}\n\nfunction chooseOption(option: GrAutocompleteOption): void {\n if (option.disabled) return\n if (props.multiple) toggleMultiple(option.value)\n else selectSingle(option.value, option.label)\n}\n\nfunction commitCustom(): void {\n const v = query.value.trim()\n if (!v) return\n if (props.multiple) toggleMultiple(v)\n else selectSingle(v, v)\n}\n\nfunction removeValue(value: string): void {\n const next = selectedValues.value.filter(v => v !== value)\n emit('update:modelValue', next)\n void nextTick(focusInput)\n}\n\nfunction clearSelection(): void {\n if (props.disabled) return\n emit('update:modelValue', props.multiple ? [] : '')\n setQuery('')\n void nextTick(focusInput)\n}\n\nconst showClear = computed(() =>\n resolvedClearable.value && !props.disabled && (hasSelection.value || query.value.length > 0),\n)\n\n// ————— Клавиатура.\nfunction onKeydown(event: KeyboardEvent): void {\n if (props.disabled) return\n\n if (!open.value && ['ArrowDown', 'ArrowUp'].includes(event.key)) {\n event.preventDefault()\n openDropdown()\n return\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setActive(activeIndex.value + 1)\n break\n case 'ArrowUp':\n event.preventDefault()\n setActive(activeIndex.value - 1)\n break\n case 'Home':\n if (!open.value) break\n event.preventDefault()\n setActive(0)\n break\n case 'End':\n if (!open.value) break\n event.preventDefault()\n setActive(navigableValues.value.length - 1)\n break\n case 'Enter':\n if (!open.value) break\n event.preventDefault()\n if (activeValue.value !== undefined) {\n const opt = filteredOptions.value.find(o => o.value === activeValue.value)\n if (opt) chooseOption(opt)\n }\n else if (canAddCustom.value) {\n commitCustom()\n }\n break\n case 'Backspace':\n // multiple: пустой запрос + Backspace удаляет последний chip.\n if (props.multiple && query.value === '' && selectedValues.value.length) {\n event.preventDefault()\n removeValue(selectedValues.value[selectedValues.value.length - 1])\n }\n break\n case 'Tab':\n closeDropdown()\n break\n }\n}\n\n// ————— Синхронизация query с выбранным значением (single).\nwatch(\n [singleSelectedLabel, () => props.multiple],\n ([label, multiple]) => {\n if (multiple) return\n // Не перетираем то, что пользователь сейчас набирает.\n if (open.value || dirty.value) return\n setQuery(label)\n },\n { immediate: true },\n)\n\nwatch(open, (isOpen) => {\n if (isOpen) {\n initActiveIndex()\n return\n }\n // Закрытие: сбрасываем активную опцию и «черновик».\n activeIndex.value = -1\n if (props.multiple) {\n setQuery('')\n }\n else {\n // single: возвращаем метку выбранной опции (revert ввода без выбора).\n setQuery(singleSelectedLabel.value)\n }\n})\n\nconst ariaAutocomplete = computed(() => (props.allowCustomValue ? 'both' : 'list'))\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n v-click-outside=\"{ handler: closeDropdown, enabled: open, exclude: clickOutsideExclude }\"\n data-gr-autocomplete\n class=\"relative w-full\"\n >\n <div\n data-gr-autocomplete-shell\n :class=\"autocompleteShellClass({ size: resolvedSize, disabled, invalid: isInvalid })\"\n @mousedown.self.prevent=\"focusInput\"\n >\n <!-- Chips выбранных значений (multiple). -->\n <template v-if=\"multiple\">\n <span\n v-for=\"option in selectedOptions\"\n :key=\"option.value\"\n data-gr-autocomplete-chip\n :class=\"autocompleteChipClass\"\n >\n <span class=\"truncate\">{{ option.label }}</span>\n <button\n v-if=\"!disabled\"\n type=\"button\"\n data-gr-autocomplete-chip-remove\n class=\"inline-flex h-3.5 w-3.5 shrink-0 items-center justify-center rounded-full text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)]\"\n :aria-label=\"t('gr.inputTag.removeTag', 'Remove tag')\"\n tabindex=\"-1\"\n @click=\"removeValue(option.value)\"\n >\n <span class=\"i-lucide-x block h-3 w-3\" aria-hidden=\"true\" />\n </button>\n </span>\n </template>\n\n <input\n :id=\"resolvedId\"\n ref=\"inputEl\"\n data-gr-autocomplete-input\n data-testid=\"gr-autocomplete-input\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n role=\"combobox\"\n :value=\"query\"\n :disabled=\"disabled\"\n :placeholder=\"hasSelection && multiple ? undefined : placeholder\"\n :aria-label=\"ariaLabel\"\n :aria-invalid=\"isInvalid ? 'true' : undefined\"\n :aria-describedby=\"describedBy\"\n :aria-required=\"isRequired ? 'true' : undefined\"\n aria-haspopup=\"listbox\"\n :aria-autocomplete=\"ariaAutocomplete\"\n :aria-controls=\"open ? listboxId : undefined\"\n :aria-activedescendant=\"activeDescendantId\"\n :aria-expanded=\"open ? 'true' : 'false'\"\n class=\"min-w-0 flex-1 bg-transparent text-inherit placeholder:text-[var(--gr-muted-fg)] focus:outline-none disabled:cursor-not-allowed\"\n @input=\"onInput\"\n @focus=\"onFocus\"\n @keydown=\"onKeydown\"\n >\n\n <!-- Trailing: спиннер / очистка / шеврон. -->\n <span\n v-if=\"loading\"\n data-gr-autocomplete-spinner\n class=\"shrink-0 flex items-center text-[var(--gr-muted-fg)]\"\n >\n <span class=\"i-lucide-loader-2 block h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n </span>\n\n <button\n v-else-if=\"showClear\"\n type=\"button\"\n data-testid=\"gr-autocomplete-clear\"\n data-gr-autocomplete-clear\n class=\"shrink-0 inline-flex h-5 w-5 items-center justify-center rounded-md text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)]\"\n :aria-label=\"resolvedClearLabel\"\n tabindex=\"-1\"\n @click=\"clearSelection\"\n >\n <span class=\"i-lucide-x block h-4 w-4\" aria-hidden=\"true\" />\n </button>\n\n <span\n v-else\n data-testid=\"gr-autocomplete-chevron\"\n class=\"shrink-0 flex items-center text-[var(--gr-muted-fg)] pointer-events-none\"\n >\n <span class=\"i-lucide-chevron-down block h-4 w-4\" aria-hidden=\"true\" />\n </span>\n </div>\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=\"gr-autocomplete-panel\"\n data-gr-autocomplete-panel\n :style=\"floatingStyle\"\n >\n <div :class=\"autocompletePanelClasses\">\n <div\n :id=\"listboxId\"\n data-gr-autocomplete-listbox\n class=\"p-1 overflow-auto\"\n :style=\"{ maxHeight: `${dropdownMaxHeight}px` }\"\n role=\"listbox\"\n :aria-multiselectable=\"multiple ? 'true' : undefined\"\n >\n <!-- «Add custom» опция. -->\n <button\n v-if=\"canAddCustom\"\n type=\"button\"\n data-testid=\"gr-autocomplete-add-option\"\n data-gr-autocomplete-add-option\n class=\"w-full rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--gr-muted)_30%,transparent)]\"\n @click=\"commitCustom\"\n >\n {{ t('gr.autocomplete.addOption', 'Add \"{value}\"', { value: query.trim() }) }}\n </button>\n\n <button\n v-for=\"option in filteredOptions\"\n :id=\"optionDomId(option.value)\"\n :key=\"option.value\"\n data-gr-autocomplete-option\n type=\"button\"\n role=\"option\"\n :disabled=\"option.disabled\"\n :aria-selected=\"isSelected(option.value) ? 'true' : 'false'\"\n :aria-disabled=\"option.disabled ? 'true' : undefined\"\n class=\"w-full rounded-[10px] px-3 py-2 text-left text-[13px]\" :class=\"[\n option.disabled ? 'cursor-not-allowed opacity-50' : 'hover:bg-[color-mix(in_srgb,var(--gr-muted)_30%,transparent)]',\n activeValue === option.value && !option.disabled ? 'bg-[color-mix(in_srgb,var(--gr-muted)_30%,transparent)]' : '',\n ]\"\n @click=\"chooseOption(option)\"\n @mousemove=\"activeIndex = navigableValues.indexOf(option.value)\"\n >\n <slot name=\"option\" :option=\"option\" :selected=\"isSelected(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(option.value) ? 'i-lucide-check text-[var(--gr-primary)]' : ''\"\n aria-hidden=\"true\"\n />\n <span class=\"truncate\">{{ option.label }}</span>\n </span>\n </slot>\n </button>\n\n <!-- Состояния: загрузка / подсказка minQueryLength / пусто. -->\n <div\n v-if=\"showLoading\"\n data-gr-autocomplete-loading\n class=\"flex items-center gap-2 px-3 py-2 text-[13px] text-[var(--gr-muted-fg)]\"\n >\n <slot name=\"loading\">\n <span class=\"i-lucide-loader-2 block h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n <span>{{ resolvedLoadingText }}</span>\n </slot>\n </div>\n\n <div\n v-else-if=\"showEmpty && belowMinQuery\"\n data-gr-autocomplete-hint\n class=\"px-3 py-2 text-[13px] text-[var(--gr-muted-fg)]\"\n >\n {{ resolvedTypeMoreText }}\n </div>\n\n <div\n v-else-if=\"showEmpty\"\n data-gr-autocomplete-empty\n class=\"px-3 py-2 text-[13px] text-[var(--gr-muted-fg)]\"\n >\n <slot name=\"empty\">\n {{ resolvedNoResultsText }}\n </slot>\n </div>\n </div>\n </div>\n </div>\n </transition>\n </teleport>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, useId, watch } from 'vue'\n\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\n\nimport { vClickOutside } from '../../directives'\nimport { useFloating } from '../../composables/internal/useFloating'\nimport { useEscapeToClose } from '../../composables/internal/useEscapeToClose'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { useGrFormFieldContext } from '../GrFormField/context'\n\nimport {\n autocompleteChipClass,\n autocompletePanelClasses,\n autocompleteShellClass,\n type GrAutocompleteModelValue,\n type GrAutocompleteOption,\n type GrAutocompleteSize,\n} from './grAutocompleteStyles'\n\nexport type {\n GrAutocompleteModelValue,\n GrAutocompleteOption,\n GrAutocompleteSize,\n} from './grAutocompleteStyles'\n\n/**\n * Публичный GR-примитив «Autocomplete / Combobox» (WAI-ARIA editable combobox).\n *\n * В отличие от `GrSelect` (select-only combobox с кнопкой-триггером), здесь\n * combobox-ом является сам текстовый `<input>`: набранный текст — это поисковый\n * запрос, а выбор опции заполняет поле. Поддерживает локальную фильтрацию,\n * удалённую (async) загрузку через событие `search` + внешний проп `loading`,\n * произвольные значения (`allowCustomValue`) и multiple с удаляемыми chips.\n */\nexport interface GrAutocompleteProps {\n /** Выбранное значение (single — строка, multiple — массив строк). */\n modelValue: GrAutocompleteModelValue\n /**\n * Доступные опции. Для локального режима — полный список (фильтруется на клиенте).\n * Для remote-режима (`filterable=false`) — список, который родитель обновляет\n * в ответ на событие `search`.\n */\n options?: GrAutocompleteOption[]\n multiple?: boolean\n disabled?: boolean\n size?: GrAutocompleteSize\n placeholder?: string\n ariaLabel?: string\n /** Кнопка очистки выбранного значения/запроса. */\n clearable?: boolean\n /** Внешне управляемое состояние загрузки (для async-сценариев). */\n loading?: boolean\n /**\n * Локальная фильтрация опций по введённому запросу. Отключите (`false`) для\n * чисто удалённого поиска — тогда `options` показываются как есть, а фильтрацию\n * выполняет сервер по событию `search`.\n */\n filterable?: boolean\n /** Кастомный матчер локальной фильтрации. По умолчанию — подстрока в `label`/`value`. */\n filter?: (option: GrAutocompleteOption, query: string) => boolean\n /** Минимальная длина запроса до эмита `search` (для дебаунса remote-загрузки). */\n minQueryLength?: number\n /** Задержка дебаунса события `search`, мс. */\n debounce?: number\n /** Разрешить ввод/коммит значения, которого нет в `options`. */\n allowCustomValue?: boolean\n /** Закрывать панель после выбора (single всегда закрывает). */\n closeOnSelect?: boolean\n /** Максимальная высота панели, px. */\n dropdownMaxHeight?: number\n /** i18n-тексты состояний панели / aria. */\n loadingText?: string\n noResultsText?: string\n clearLabel?: string\n}\n\nconst props = withDefaults(\n defineProps<GrAutocompleteProps>(),\n {\n options: undefined,\n multiple: false,\n disabled: false,\n size: undefined,\n placeholder: undefined,\n ariaLabel: undefined,\n clearable: undefined,\n loading: false,\n filterable: true,\n filter: undefined,\n minQueryLength: 0,\n debounce: 250,\n allowCustomValue: false,\n closeOnSelect: true,\n dropdownMaxHeight: 280,\n loadingText: undefined,\n noResultsText: undefined,\n clearLabel: undefined,\n },\n)\n\n// Эффективный размер: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrAutocomplete' })\nconst resolvedClearable = useGrComponentProp('GrAutocomplete', 'clearable', () => props.clearable, false)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: GrAutocompleteModelValue): void\n /** Дебаунснутый поисковый запрос — точка входа для удалённой загрузки опций. */\n (e: 'search', query: string): void\n}>()\n\nconst { t } = useGranularityTranslations()\n\nconst resolvedLoadingText = computed(() => props.loadingText ?? t('gr.autocomplete.loading', 'Loading…'))\nconst resolvedNoResultsText = computed(() => props.noResultsText ?? t('gr.autocomplete.noResults', 'No results'))\nconst resolvedClearLabel = computed(() => props.clearLabel ?? t('gr.common.clear', 'Clear'))\nconst resolvedTypeMoreText = computed(() =>\n t('gr.autocomplete.typeMore', 'Type at least {n} characters', { n: props.minQueryLength }),\n)\n\n// Fallback из контекста `GrFormField` (id/aria-describedby/invalid/required).\nconst field = useGrFormFieldContext()\nconst resolvedId = computed(() => field?.id.value)\nconst isInvalid = computed(() => Boolean(field?.invalid.value))\nconst describedBy = computed(() => field?.describedById.value)\nconst isRequired = computed(() => Boolean(field?.required.value))\n\nconst optionsResolved = computed<GrAutocompleteOption[]>(() => props.options ?? [])\n\nfunction toArray(value: GrAutocompleteModelValue): string[] {\n if (Array.isArray(value)) return value\n if (!value) return []\n return [value]\n}\n\nconst modelSingle = computed(() => (Array.isArray(props.modelValue) ? (props.modelValue[0] ?? '') : props.modelValue))\nconst selectedValues = computed(() => (props.multiple ? toArray(props.modelValue) : (modelSingle.value ? [modelSingle.value] : [])))\nconst hasSelection = computed(() => selectedValues.value.length > 0)\n\nfunction labelFor(value: string): string {\n return optionsResolved.value.find(o => o.value === value)?.label ?? value\n}\n\n/** Опции выбранных значений (для chips в multiple). Неизвестные значения показываем как есть. */\nconst selectedOptions = computed<GrAutocompleteOption[]>(() =>\n selectedValues.value.map(v => optionsResolved.value.find(o => o.value === v) ?? { value: v, label: v }),\n)\n\nconst singleSelectedLabel = computed(() => (props.multiple || !modelSingle.value ? '' : labelFor(modelSingle.value)))\n\n// ————— Состояние.\nconst query = ref('')\n// `dirty` — пользователь начал вводить запрос. Нужно, чтобы в single-режиме при\n// открытии заполненного поля показать весь список (а не отфильтровать по метке\n// уже выбранной опции). Сбрасывается при программной установке `query`.\nconst dirty = ref(false)\nconst open = ref(false)\nconst activeIndex = ref(-1)\n\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst inputEl = ref<HTMLInputElement | null>(null)\nconst clickOutsideExclude = [() => panelEl.value]\n\nconst { floatingStyle } = useFloating(rootEl, panelEl, open, {\n placement: 'bottom-start',\n matchWidth: true,\n zIndexVar: '--gr-z-dropdown',\n})\n\nuseEscapeToClose(open, closeDropdown)\n\n// ————— Фильтрация.\nconst searchQuery = computed(() => {\n if (!props.filterable) return ''\n // single: пока пользователь не начал вводить — показываем весь список.\n if (!props.multiple && !dirty.value) return ''\n return query.value.trim()\n})\n\nfunction defaultFilter(option: GrAutocompleteOption, q: string): boolean {\n const needle = q.toLowerCase()\n return option.label.toLowerCase().includes(needle) || option.value.toLowerCase().includes(needle)\n}\n\nconst filteredOptions = computed<GrAutocompleteOption[]>(() => {\n const q = searchQuery.value\n if (!q) return optionsResolved.value\n const matcher = props.filter ?? defaultFilter\n return optionsResolved.value.filter(o => matcher(o, q))\n})\n\nconst navigableValues = computed<string[]>(() =>\n filteredOptions.value.filter(o => !o.disabled).map(o => o.value),\n)\n\nconst canAddCustom = computed(() => {\n if (!props.allowCustomValue) return false\n const v = query.value.trim()\n if (!v) return false\n if (props.multiple && selectedValues.value.includes(v)) return false\n if (!props.multiple && v === modelSingle.value) return false\n // Не предлагаем «Add», если такое значение/метка уже есть среди опций.\n return !optionsResolved.value.some(o => o.value === v || o.label === v)\n})\n\nconst belowMinQuery = computed(() => props.minQueryLength > 0 && query.value.trim().length < props.minQueryLength)\n\nconst showLoading = computed(() => props.loading)\nconst showEmpty = computed(() =>\n !props.loading && filteredOptions.value.length === 0 && !canAddCustom.value,\n)\n\n// ————— Панель: id/aria-activedescendant.\nconst listboxId = useId()\n\nfunction optionDomId(value: string): string {\n return `${listboxId}-opt-${value}`\n}\n\nconst activeValue = computed(() => (activeIndex.value >= 0 ? navigableValues.value[activeIndex.value] : undefined))\nconst activeDescendantId = computed(() =>\n open.value && activeValue.value !== undefined ? optionDomId(activeValue.value) : undefined,\n)\n\nfunction isSelected(value: string): boolean {\n return selectedValues.value.includes(value)\n}\n\nfunction clampActive(index: number): number {\n const len = navigableValues.value.length\n if (len === 0) return -1\n return ((index % len) + len) % len\n}\n\nasync function scrollActiveIntoView(): Promise<void> {\n await nextTick()\n const value = activeValue.value\n if (value === undefined) return\n document.getElementById(optionDomId(value))?.scrollIntoView?.({ block: 'nearest' })\n}\n\nfunction setActive(index: number): void {\n activeIndex.value = clampActive(index)\n void scrollActiveIntoView()\n}\n\nfunction initActiveIndex(): void {\n const selectedIdx = navigableValues.value.findIndex(v => isSelected(v))\n activeIndex.value = selectedIdx >= 0 ? selectedIdx : (navigableValues.value.length ? 0 : -1)\n}\n\n// Пересчёт активной опции при изменении списка (фильтрация/remote-загрузка).\nwatch(navigableValues, () => {\n if (!open.value) return\n if (activeIndex.value >= navigableValues.value.length) activeIndex.value = navigableValues.value.length - 1\n if (activeIndex.value < 0 && navigableValues.value.length) activeIndex.value = 0\n})\n\n// ————— Открытие/закрытие.\nfunction openDropdown(): void {\n if (props.disabled || open.value) return\n open.value = true\n}\n\nfunction closeDropdown(): void {\n open.value = false\n}\n\nfunction focusInput(): void {\n inputEl.value?.focus()\n}\n\n// ————— Дебаунснутый эмит `search` для remote-загрузки.\nlet searchTimer: ReturnType<typeof setTimeout> | null = null\nfunction scheduleSearch(value: string): void {\n if (searchTimer) clearTimeout(searchTimer)\n searchTimer = setTimeout(() => {\n if (props.minQueryLength > 0 && value.trim().length < props.minQueryLength) return\n emit('search', value.trim())\n }, props.debounce)\n}\n\nonBeforeUnmount(() => {\n if (searchTimer) clearTimeout(searchTimer)\n})\n\n// ————— Ввод.\nfunction onInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value\n query.value = value\n dirty.value = true\n openDropdown()\n scheduleSearch(value)\n}\n\nfunction onFocus(): void {\n if (props.disabled) return\n openDropdown()\n}\n\nfunction setQuery(value: string): void {\n query.value = value\n dirty.value = false\n}\n\n// ————— Выбор значений.\nfunction selectSingle(value: string, label: string): void {\n emit('update:modelValue', value)\n setQuery(label)\n closeDropdown()\n}\n\nfunction toggleMultiple(value: string): void {\n const next = selectedValues.value.slice()\n const idx = next.indexOf(value)\n if (idx >= 0) next.splice(idx, 1)\n else next.push(value)\n emit('update:modelValue', next)\n setQuery('')\n if (props.closeOnSelect) closeDropdown()\n else void nextTick(focusInput)\n}\n\nfunction chooseOption(option: GrAutocompleteOption): void {\n if (option.disabled) return\n if (props.multiple) toggleMultiple(option.value)\n else selectSingle(option.value, option.label)\n}\n\nfunction commitCustom(): void {\n const v = query.value.trim()\n if (!v) return\n if (props.multiple) toggleMultiple(v)\n else selectSingle(v, v)\n}\n\nfunction removeValue(value: string): void {\n const next = selectedValues.value.filter(v => v !== value)\n emit('update:modelValue', next)\n void nextTick(focusInput)\n}\n\nfunction clearSelection(): void {\n if (props.disabled) return\n emit('update:modelValue', props.multiple ? [] : '')\n setQuery('')\n void nextTick(focusInput)\n}\n\nconst showClear = computed(() =>\n resolvedClearable.value && !props.disabled && (hasSelection.value || query.value.length > 0),\n)\n\n// ————— Клавиатура.\nfunction onKeydown(event: KeyboardEvent): void {\n if (props.disabled) return\n\n if (!open.value && ['ArrowDown', 'ArrowUp'].includes(event.key)) {\n event.preventDefault()\n openDropdown()\n return\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setActive(activeIndex.value + 1)\n break\n case 'ArrowUp':\n event.preventDefault()\n setActive(activeIndex.value - 1)\n break\n case 'Home':\n if (!open.value) break\n event.preventDefault()\n setActive(0)\n break\n case 'End':\n if (!open.value) break\n event.preventDefault()\n setActive(navigableValues.value.length - 1)\n break\n case 'Enter':\n if (!open.value) break\n event.preventDefault()\n if (activeValue.value !== undefined) {\n const opt = filteredOptions.value.find(o => o.value === activeValue.value)\n if (opt) chooseOption(opt)\n }\n else if (canAddCustom.value) {\n commitCustom()\n }\n break\n case 'Backspace':\n // multiple: пустой запрос + Backspace удаляет последний chip.\n if (props.multiple && query.value === '' && selectedValues.value.length) {\n event.preventDefault()\n removeValue(selectedValues.value[selectedValues.value.length - 1])\n }\n break\n case 'Tab':\n closeDropdown()\n break\n }\n}\n\n// ————— Синхронизация query с выбранным значением (single).\nwatch(\n [singleSelectedLabel, () => props.multiple],\n ([label, multiple]) => {\n if (multiple) return\n // Не перетираем то, что пользователь сейчас набирает.\n if (open.value || dirty.value) return\n setQuery(label)\n },\n { immediate: true },\n)\n\nwatch(open, (isOpen) => {\n if (isOpen) {\n initActiveIndex()\n return\n }\n // Закрытие: сбрасываем активную опцию и «черновик».\n activeIndex.value = -1\n if (props.multiple) {\n setQuery('')\n }\n else {\n // single: возвращаем метку выбранной опции (revert ввода без выбора).\n setQuery(singleSelectedLabel.value)\n }\n})\n\nconst ariaAutocomplete = computed(() => (props.allowCustomValue ? 'both' : 'list'))\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n v-click-outside=\"{ handler: closeDropdown, enabled: open, exclude: clickOutsideExclude }\"\n data-gr-autocomplete\n class=\"relative w-full\"\n >\n <div\n data-gr-autocomplete-shell\n :class=\"autocompleteShellClass({ size: resolvedSize, disabled, invalid: isInvalid })\"\n @mousedown.self.prevent=\"focusInput\"\n >\n <!-- Chips выбранных значений (multiple). -->\n <template v-if=\"multiple\">\n <span\n v-for=\"option in selectedOptions\"\n :key=\"option.value\"\n data-gr-autocomplete-chip\n :class=\"autocompleteChipClass\"\n >\n <span class=\"truncate\">{{ option.label }}</span>\n <button\n v-if=\"!disabled\"\n type=\"button\"\n data-gr-autocomplete-chip-remove\n class=\"inline-flex h-3.5 w-3.5 shrink-0 items-center justify-center rounded-full text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)]\"\n :aria-label=\"t('gr.inputTag.removeTag', 'Remove tag')\"\n tabindex=\"-1\"\n @click=\"removeValue(option.value)\"\n >\n <span class=\"i-lucide-x block h-3 w-3\" aria-hidden=\"true\" />\n </button>\n </span>\n </template>\n\n <input\n :id=\"resolvedId\"\n ref=\"inputEl\"\n data-gr-autocomplete-input\n data-testid=\"gr-autocomplete-input\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n role=\"combobox\"\n :value=\"query\"\n :disabled=\"disabled\"\n :placeholder=\"hasSelection && multiple ? undefined : placeholder\"\n :aria-label=\"ariaLabel\"\n :aria-invalid=\"isInvalid ? 'true' : undefined\"\n :aria-describedby=\"describedBy\"\n :aria-required=\"isRequired ? 'true' : undefined\"\n aria-haspopup=\"listbox\"\n :aria-autocomplete=\"ariaAutocomplete\"\n :aria-controls=\"open ? listboxId : undefined\"\n :aria-activedescendant=\"activeDescendantId\"\n :aria-expanded=\"open ? 'true' : 'false'\"\n class=\"min-w-0 flex-1 bg-transparent text-inherit placeholder:text-[var(--gr-muted-fg)] focus:outline-none disabled:cursor-not-allowed\"\n @input=\"onInput\"\n @focus=\"onFocus\"\n @keydown=\"onKeydown\"\n >\n\n <!-- Trailing: спиннер / очистка / шеврон. -->\n <span\n v-if=\"loading\"\n data-gr-autocomplete-spinner\n class=\"shrink-0 flex items-center text-[var(--gr-muted-fg)]\"\n >\n <span class=\"i-lucide-loader-2 block h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n </span>\n\n <button\n v-else-if=\"showClear\"\n type=\"button\"\n data-testid=\"gr-autocomplete-clear\"\n data-gr-autocomplete-clear\n class=\"shrink-0 inline-flex h-5 w-5 items-center justify-center rounded-md text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)]\"\n :aria-label=\"resolvedClearLabel\"\n tabindex=\"-1\"\n @click=\"clearSelection\"\n >\n <span class=\"i-lucide-x block h-4 w-4\" aria-hidden=\"true\" />\n </button>\n\n <span\n v-else\n data-testid=\"gr-autocomplete-chevron\"\n class=\"shrink-0 flex items-center text-[var(--gr-muted-fg)] pointer-events-none\"\n >\n <span class=\"i-lucide-chevron-down block h-4 w-4\" aria-hidden=\"true\" />\n </span>\n </div>\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=\"gr-autocomplete-panel\"\n data-gr-autocomplete-panel\n :style=\"floatingStyle\"\n >\n <div :class=\"autocompletePanelClasses\">\n <div\n :id=\"listboxId\"\n data-gr-autocomplete-listbox\n class=\"p-1 overflow-auto\"\n :style=\"{ maxHeight: `${dropdownMaxHeight}px` }\"\n role=\"listbox\"\n :aria-multiselectable=\"multiple ? 'true' : undefined\"\n >\n <!-- «Add custom» опция. -->\n <button\n v-if=\"canAddCustom\"\n type=\"button\"\n data-testid=\"gr-autocomplete-add-option\"\n data-gr-autocomplete-add-option\n class=\"w-full rounded-[10px] px-3 py-2 text-left text-[13px] hover:bg-[color-mix(in_srgb,var(--gr-muted)_30%,transparent)]\"\n @click=\"commitCustom\"\n >\n {{ t('gr.autocomplete.addOption', 'Add \"{value}\"', { value: query.trim() }) }}\n </button>\n\n <button\n v-for=\"option in filteredOptions\"\n :id=\"optionDomId(option.value)\"\n :key=\"option.value\"\n data-gr-autocomplete-option\n type=\"button\"\n role=\"option\"\n :disabled=\"option.disabled\"\n :aria-selected=\"isSelected(option.value) ? 'true' : 'false'\"\n :aria-disabled=\"option.disabled ? 'true' : undefined\"\n class=\"w-full rounded-[10px] px-3 py-2 text-left text-[13px]\" :class=\"[\n option.disabled ? 'cursor-not-allowed opacity-50' : 'hover:bg-[color-mix(in_srgb,var(--gr-muted)_30%,transparent)]',\n activeValue === option.value && !option.disabled ? 'bg-[color-mix(in_srgb,var(--gr-muted)_30%,transparent)]' : '',\n ]\"\n @click=\"chooseOption(option)\"\n @mousemove=\"activeIndex = navigableValues.indexOf(option.value)\"\n >\n <slot name=\"option\" :option=\"option\" :selected=\"isSelected(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(option.value) ? 'i-lucide-check text-[var(--gr-primary)]' : ''\"\n aria-hidden=\"true\"\n />\n <span class=\"truncate\">{{ option.label }}</span>\n </span>\n </slot>\n </button>\n\n <!-- Состояния: загрузка / подсказка minQueryLength / пусто. -->\n <div\n v-if=\"showLoading\"\n data-gr-autocomplete-loading\n class=\"flex items-center gap-2 px-3 py-2 text-[13px] text-[var(--gr-muted-fg)]\"\n >\n <slot name=\"loading\">\n <span class=\"i-lucide-loader-2 block h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n <span>{{ resolvedLoadingText }}</span>\n </slot>\n </div>\n\n <div\n v-else-if=\"showEmpty && belowMinQuery\"\n data-gr-autocomplete-hint\n class=\"px-3 py-2 text-[13px] text-[var(--gr-muted-fg)]\"\n >\n {{ resolvedTypeMoreText }}\n </div>\n\n <div\n v-else-if=\"showEmpty\"\n data-gr-autocomplete-empty\n class=\"px-3 py-2 text-[13px] text-[var(--gr-muted-fg)]\"\n >\n <slot name=\"empty\">\n {{ resolvedNoResultsText }}\n </slot>\n </div>\n </div>\n </div>\n </div>\n </transition>\n </teleport>\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { n as grAutocompleteSafelist, t as grAutocompleteConfig } from "../../chunks/config-DToHb81g.js";
|
|
2
|
+
import { t as GrAutocomplete_default } from "./chunks/GrAutocomplete-BVLoQ5tZ.js";
|
|
3
|
+
export { GrAutocomplete_default as GrAutocomplete, GrAutocomplete_default as default, grAutocompleteConfig, grAutocompleteSafelist };
|
|
@@ -27,7 +27,7 @@ var GrAvatar_default = /* @__PURE__ */ defineComponent({
|
|
|
27
27
|
return (_ctx, _cache) => {
|
|
28
28
|
return openBlock(), createElementBlock("span", {
|
|
29
29
|
style: normalizeStyle(style.value),
|
|
30
|
-
class: normalizeClass(["inline-flex items-center justify-center overflow-hidden border border-[var(--brd)] bg-[var(--muted)] text-[var(--muted-fg)] font-700", className.value])
|
|
30
|
+
class: normalizeClass(["inline-flex items-center justify-center overflow-hidden border border-[var(--gr-brd)] bg-[var(--gr-muted)] text-[var(--gr-muted-fg)] font-700", className.value])
|
|
31
31
|
}, [props.src ? (openBlock(), createElementBlock("img", {
|
|
32
32
|
key: 0,
|
|
33
33
|
src: props.src,
|