@feugene/granularity 0.11.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-1uSYl98Y.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-BWiPnygb.js +5 -0
- package/dist/chunks/config-BWiPnygb.js.map +1 -0
- package/dist/chunks/config-BX1JTrkV.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-DUcu1D68.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-CrG1XiE7.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-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-BIRO0vDJ2.js → config-DPDFYzIa.js} +2 -2
- package/dist/chunks/config-DPDFYzIa.js.map +1 -0
- package/dist/chunks/{config-DnvPqu4g.js → config-DRKXJ9PW2.js} +1 -1
- package/dist/chunks/config-DRKXJ9PW2.js.map +1 -0
- 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-Dlm49Jp5.js +5 -0
- package/dist/chunks/config-Dlm49Jp5.js.map +1 -0
- package/dist/chunks/config-DpqOnJiz.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-C4snOIXg.js → config-KXuionN3.js} +1 -1
- package/dist/chunks/{config-C4snOIXg.js.map → config-KXuionN3.js.map} +1 -1
- package/dist/chunks/config-LGrZIdaZ.js.map +1 -0
- 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 +9 -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-DdNIxa1w.js +9 -0
- package/dist/chunks/context-DdNIxa1w.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-BdtiS2d3.js → en-Cr6EkG8c.js} +52 -4
- package/dist/chunks/en-Cr6EkG8c.js.map +1 -0
- package/dist/chunks/{es-DBhctWg-.js → es-DuYb1Qju.js} +3 -3
- package/dist/chunks/{es-DBhctWg-.js.map → es-DuYb1Qju.js.map} +1 -1
- package/dist/chunks/{es-BGRMZbe9.js → es-i08e9Sdo.js} +52 -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/grModalEscStack-BXk-9mv7.js +43 -0
- package/dist/chunks/grModalEscStack-BXk-9mv7.js.map +1 -0
- 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-BFCnOiML.js → ru-B5XOOYZt.js} +52 -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/chunks/{transition-TLFw4KBn.js → useScrollLock-K7kaP2Ud.js} +52 -1
- package/dist/chunks/useScrollLock-K7kaP2Ud.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-BWYKCsHd.js → GrConfirmDialog-e4120mWw.js} +5 -5
- package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-e4120mWw.js.map +1 -0
- package/dist/components/GrConfirmDialog/index.js +1 -1
- package/dist/components/GrDataTable/chunks/GrDataTable-C1CzxV0p.js +307 -0
- 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-5DAS-1Lb.js → GrDialog-BPMvDHOz.js} +6 -6
- 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-DY_fmaMu.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-BdENZ1w0.js +54 -0
- package/dist/components/GrDivider/chunks/GrDivider-BdENZ1w0.js.map +1 -0
- package/dist/components/GrDivider/index.js +3 -0
- package/dist/components/GrDrawer/chunks/{GrDrawer-D1kzsjXN.js → GrDrawer-KevdZ5BB.js} +41 -17
- 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-BXb5Cxxf.js → GrDropdown-BKoy8hm-.js} +91 -5
- package/dist/components/GrDropdown/chunks/GrDropdown-BKoy8hm-.js.map +1 -0
- package/dist/components/GrDropdown/index.js +2 -2
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-DFEJLPcV.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-CXCDBd99.js +100 -0
- package/dist/components/GrFormField/chunks/GrFormField-CXCDBd99.js.map +1 -0
- package/dist/components/GrFormField/index.js +3 -2
- 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-OCUIrNh2.js → GrImageViewer-DDLJkvIU.js} +312 -223
- package/dist/components/GrImageViewer/chunks/GrImageViewer-DDLJkvIU.js.map +1 -0
- package/dist/components/GrImageViewer/index.js +1 -1
- package/dist/components/GrInput/chunks/GrInput-C1VBL0dg.js +337 -0
- 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-DTspwtoN.js +22 -0
- package/dist/components/GrKbd/chunks/GrKbd-DTspwtoN.js.map +1 -0
- package/dist/components/GrKbd/index.js +3 -0
- 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-BkjW9jZS.js → GrModal-BTu1-5eY.js} +4 -57
- package/dist/components/GrModal/chunks/GrModal-BTu1-5eY.js.map +1 -0
- 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-CldPIWQx.js → GrNumberInput-l9ZOHG9D.js} +112 -28
- 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-Bu9wv6it.js → GrPagination-C5Y69CuK.js} +59 -16
- package/dist/components/GrPagination/chunks/GrPagination-C5Y69CuK.js.map +1 -0
- package/dist/components/GrPagination/index.js +1 -1
- 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-TmWXbpEP.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-CPTixXaY.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-vKZCbkCp.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-RShK21lK.js → GrSelect-Dn3FgJ3Z.js} +293 -87
- 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 +1 -1
- 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-DeEMgb_y.js +68 -0
- package/dist/components/GrTabPanels/chunks/GrTabPanels-DeEMgb_y.js.map +1 -0
- package/dist/components/GrTabPanels/index.js +3 -0
- 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-Z-FDJUr_.js → GrTabs-BqTak0SR.js} +9 -4
- 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-D56YxhKq.js → GrTextarea-DIYBAPpP.js} +16 -6
- 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-eI8YvnIo.js → GrToaster-BVHjIHcM.js} +52 -11
- package/dist/components/GrToaster/chunks/GrToaster-BVHjIHcM.js.map +1 -0
- package/dist/components/GrToaster/index.js +2 -2
- 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-D3ODe2dB.js → GrTree-_12ChXRQ.js} +108 -9
- package/dist/components/GrTree/chunks/GrTree-_12ChXRQ.js.map +1 -0
- package/dist/components/GrTree/index.js +2 -2
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-B2xBKs5Q.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 +112 -87
- package/dist/index.js.map +1 -1
- package/dist/styles/base.css +30 -8
- package/dist/styles/index.css +6 -3
- package/dist/styles/preflight.css +8 -4
- 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 +48 -4
- 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/GrDivider/GrDivider.vue.d.ts +58 -0
- package/dist/types/src/components/GrDivider/config.d.ts +1 -0
- package/dist/types/src/components/GrDivider/index.d.ts +4 -0
- package/dist/types/src/components/GrDrawer/GrDrawer.vue.d.ts +5 -5
- package/dist/types/src/components/GrDropdown/GrDropdown.vue.d.ts +8 -1
- package/dist/types/src/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +7 -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 +25 -2
- package/dist/types/src/components/GrFormField/context.d.ts +20 -0
- package/dist/types/src/components/GrFormField/index.d.ts +1 -0
- package/dist/types/src/components/GrFormFile/GrFormFile.vue.d.ts +4 -4
- package/dist/types/src/components/GrImageViewer/GrImageViewer.vue.d.ts +7 -3
- package/dist/types/src/components/GrImageViewer/composables/useViewerKeyboard.d.ts +20 -0
- package/dist/types/src/components/GrImageViewer/composables/useWheelGesture.d.ts +16 -0
- package/dist/types/src/components/GrImageViewer/composables/useZoomPan.d.ts +50 -0
- package/dist/types/src/components/GrInput/GrInput.vue.d.ts +49 -10
- 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/GrKbd/GrKbd.vue.d.ts +46 -0
- package/dist/types/src/components/GrKbd/config.d.ts +1 -0
- package/dist/types/src/components/GrKbd/index.d.ts +4 -0
- 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 +25 -9
- 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/GrTabPanels/GrTabPanel.vue.d.ts +46 -0
- package/dist/types/src/components/GrTabPanels/GrTabPanels.vue.d.ts +51 -0
- package/dist/types/src/components/GrTabPanels/config.d.ts +5 -0
- package/dist/types/src/components/GrTabPanels/context.d.ts +9 -0
- package/dist/types/src/components/GrTabPanels/index.d.ts +6 -0
- package/dist/types/src/components/GrTable/GrTable.vue.d.ts +16 -0
- package/dist/types/src/components/GrTabs/GrTabs.vue.d.ts +6 -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/GrTree/grTreeInteractionContext.d.ts +2 -0
- 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/internal/useScrollLock.d.ts +24 -0
- package/dist/types/src/composables/useToast.d.ts +24 -0
- package/dist/types/src/granular-provider/shared.d.ts +10 -0
- package/dist/types/src/i18n/messages/en.d.ts +84 -0
- package/dist/types/src/i18n/messages/es.d.ts +84 -0
- package/dist/types/src/i18n/messages/ru.d.ts +84 -0
- package/dist/types/src/index.d.ts +10 -0
- package/dist/web-types.json +1642 -356
- package/package.json +41 -1
- package/dist/chunks/config-1uSYl98Y.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-BIRO0vDJ2.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-C7NpDrfO.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-CrG1XiE7.js.map +0 -1
- package/dist/chunks/config-DUcu1D68.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-DnvPqu4g.js.map +0 -1
- package/dist/chunks/config-DpqOnJiz2.js.map +0 -1
- package/dist/chunks/config-LGrZIdaZ2.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-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-BdtiS2d3.js.map +0 -1
- package/dist/chunks/es-BGRMZbe9.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-BFCnOiML.js.map +0 -1
- package/dist/chunks/shared-ChvcQgDl.js +0 -168
- package/dist/chunks/shared-ChvcQgDl.js.map +0 -1
- package/dist/chunks/transition-TLFw4KBn.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-BWYKCsHd.js.map +0 -1
- package/dist/components/GrDataTable/chunks/GrDataTable-ptbARmJ3.js +0 -179
- package/dist/components/GrDataTable/chunks/GrDataTable-ptbARmJ3.js.map +0 -1
- package/dist/components/GrDialog/chunks/GrDialog-5DAS-1Lb.js.map +0 -1
- package/dist/components/GrDialogService/chunks/GrDialogService-DY_fmaMu.js.map +0 -1
- package/dist/components/GrDrawer/chunks/GrDrawer-D1kzsjXN.js.map +0 -1
- package/dist/components/GrDropdown/chunks/GrDropdown-BXb5Cxxf.js.map +0 -1
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-DFEJLPcV.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-BujNQrw8.js +0 -35
- package/dist/components/GrFormField/chunks/GrFormField-BujNQrw8.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/GrImageViewer/chunks/GrImageViewer-OCUIrNh2.js.map +0 -1
- package/dist/components/GrInput/chunks/GrInput-C8pOJgCi.js +0 -188
- package/dist/components/GrInput/chunks/GrInput-C8pOJgCi.js.map +0 -1
- package/dist/components/GrInputTag/chunks/GrInputTag-zMgFqp2g.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/GrModal/chunks/GrModal-BkjW9jZS.js.map +0 -1
- package/dist/components/GrNavbar/chunks/GrNavbar-DW3MiIIf.js.map +0 -1
- package/dist/components/GrNumberInput/chunks/GrNumberInput-CldPIWQx.js.map +0 -1
- package/dist/components/GrPagination/chunks/GrPagination-Bu9wv6it.js.map +0 -1
- package/dist/components/GrProgressBar/chunks/GrProgressBar-CC3z-Zqp.js.map +0 -1
- package/dist/components/GrPromptDialog/chunks/GrPromptDialog-TmWXbpEP.js.map +0 -1
- package/dist/components/GrRadio/chunks/GrRadio-CPTixXaY.js.map +0 -1
- package/dist/components/GrRadioGroup/chunks/GrRadioGroup-vKZCbkCp.js.map +0 -1
- package/dist/components/GrSegmented/chunks/GrSegmented-C1y0UXpQ.js.map +0 -1
- package/dist/components/GrSelect/chunks/GrSelect-RShK21lK.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-Z-FDJUr_.js.map +0 -1
- package/dist/components/GrTextarea/chunks/GrTextarea-D56YxhKq.js.map +0 -1
- package/dist/components/GrToaster/chunks/GrToaster-eI8YvnIo.js.map +0 -1
- package/dist/components/GrTooltip/chunks/GrTooltip-BeyZ8ssR.js.map +0 -1
- package/dist/components/GrTree/chunks/GrTree-D3ODe2dB.js.map +0 -1
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-B2xBKs5Q.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-DpqOnJiz2.js → config-DpqOnJiz.js} +0 -0
- package/dist/chunks/{config-Cpi9Mh2J.js → config-Dqy0rPPO2.js} +1 -1
- /package/dist/chunks/{config-LGrZIdaZ2.js → config-LGrZIdaZ.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-ipvU0lzP2.js → config-ipvU0lzP.js} +0 -0
- /package/dist/chunks/{config-xR4XVmcy.js → config-xR4XVmcy2.js} +0 -0
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6EA,MAAM,QAAQ;EAyBd,MAAM,eAAe,yBAAyB,MAAM,MAAM,EAAE,WAAW,iBAAiB,CAAC;EACzF,MAAM,oBAAoB,mBAAmB,kBAAkB,mBAAmB,MAAM,WAAW,KAAK;EAExG,MAAM,OAAO;EAMb,MAAM,EAAE,MAAM,2BAA2B;EAEzC,MAAM,sBAAsB,eAAe,MAAM,eAAe,EAAE,2BAA2B,UAAU,CAAC;EACxG,MAAM,wBAAwB,eAAe,MAAM,iBAAiB,EAAE,6BAA6B,YAAY,CAAC;EAChH,MAAM,qBAAqB,eAAe,MAAM,cAAc,EAAE,mBAAmB,OAAO,CAAC;EAC3F,MAAM,uBAAuB,eAC3B,EAAE,4BAA4B,gCAAgC,EAAE,GAAG,MAAM,eAAe,CAAC,CAC3F;EAGA,MAAM,QAAQ,sBAAsB;EACpC,MAAM,aAAa,eAAe,OAAO,GAAG,KAAK;EACjD,MAAM,YAAY,eAAe,QAAQ,OAAO,QAAQ,KAAK,CAAC;EAC9D,MAAM,cAAc,eAAe,OAAO,cAAc,KAAK;EAC7D,MAAM,aAAa,eAAe,QAAQ,OAAO,SAAS,KAAK,CAAC;EAEhE,MAAM,kBAAkB,eAAuC,MAAM,WAAW,CAAC,CAAC;EAElF,SAAS,QAAQ,OAA2C;GAC1D,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO;GACjC,IAAI,CAAC,OAAO,OAAO,CAAC;GACpB,OAAO,CAAC,KAAK;EACf;EAEA,MAAM,cAAc,eAAgB,MAAM,QAAQ,MAAM,UAAU,IAAK,MAAM,WAAW,MAAM,KAAM,MAAM,UAAW;EACrH,MAAM,iBAAiB,eAAgB,MAAM,WAAW,QAAQ,MAAM,UAAU,IAAK,YAAY,QAAQ,CAAC,YAAY,KAAK,IAAI,CAAC,CAAG;EACnI,MAAM,eAAe,eAAe,eAAe,MAAM,SAAS,CAAC;EAEnE,SAAS,SAAS,OAAuB;GACvC,OAAO,gBAAgB,MAAM,MAAK,MAAK,EAAE,UAAU,KAAK,CAAC,EAAE,SAAS;EACtE;;EAGA,MAAM,kBAAkB,eACtB,eAAe,MAAM,KAAI,MAAK,gBAAgB,MAAM,MAAK,MAAK,EAAE,UAAU,CAAC,KAAK;GAAE,OAAO;GAAG,OAAO;EAAE,CAAC,CACxG;EAEA,MAAM,sBAAsB,eAAgB,MAAM,YAAY,CAAC,YAAY,QAAQ,KAAK,SAAS,YAAY,KAAK,CAAE;EAGpH,MAAM,QAAQ,IAAI,EAAE;EAIpB,MAAM,QAAQ,IAAI,KAAK;EACvB,MAAM,OAAO,IAAI,KAAK;EACtB,MAAM,cAAc,IAAI,EAAE;EAE1B,MAAM,SAAS,IAAwB,IAAI;EAC3C,MAAM,UAAU,IAAwB,IAAI;EAC5C,MAAM,UAAU,IAA6B,IAAI;EACjD,MAAM,sBAAsB,OAAO,QAAQ,KAAK;EAEhD,MAAM,EAAE,kBAAkB,YAAY,QAAQ,SAAS,MAAM;GAC3D,WAAW;GACX,YAAY;GACZ,WAAW;EACb,CAAC;EAED,iBAAiB,MAAM,aAAa;EAGpC,MAAM,cAAc,eAAe;GACjC,IAAI,CAAC,MAAM,YAAY,OAAO;GAE9B,IAAI,CAAC,MAAM,YAAY,CAAC,MAAM,OAAO,OAAO;GAC5C,OAAO,MAAM,MAAM,KAAK;EAC1B,CAAC;EAED,SAAS,cAAc,QAA8B,GAAoB;GACvE,MAAM,SAAS,EAAE,YAAY;GAC7B,OAAO,OAAO,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,KAAK,OAAO,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM;EAClG;EAEA,MAAM,kBAAkB,eAAuC;GAC7D,MAAM,IAAI,YAAY;GACtB,IAAI,CAAC,GAAG,OAAO,gBAAgB;GAC/B,MAAM,UAAU,MAAM,UAAU;GAChC,OAAO,gBAAgB,MAAM,QAAO,MAAK,QAAQ,GAAG,CAAC,CAAC;EACxD,CAAC;EAED,MAAM,kBAAkB,eACtB,gBAAgB,MAAM,QAAO,MAAK,CAAC,EAAE,QAAQ,CAAC,CAAC,KAAI,MAAK,EAAE,KAAK,CACjE;EAEA,MAAM,eAAe,eAAe;GAClC,IAAI,CAAC,MAAM,kBAAkB,OAAO;GACpC,MAAM,IAAI,MAAM,MAAM,KAAK;GAC3B,IAAI,CAAC,GAAG,OAAO;GACf,IAAI,MAAM,YAAY,eAAe,MAAM,SAAS,CAAC,GAAG,OAAO;GAC/D,IAAI,CAAC,MAAM,YAAY,MAAM,YAAY,OAAO,OAAO;GAEvD,OAAO,CAAC,gBAAgB,MAAM,MAAK,MAAK,EAAE,UAAU,KAAK,EAAE,UAAU,CAAC;EACxE,CAAC;EAED,MAAM,gBAAgB,eAAe,MAAM,iBAAiB,KAAK,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,MAAM,cAAc;EAEjH,MAAM,cAAc,eAAe,MAAM,OAAO;EAChD,MAAM,YAAY,eAChB,CAAC,MAAM,WAAW,gBAAgB,MAAM,WAAW,KAAK,CAAC,aAAa,KACxE;EAGA,MAAM,YAAY,MAAM;EAExB,SAAS,YAAY,OAAuB;GAC1C,OAAO,GAAG,UAAU,OAAO;EAC7B;EAEA,MAAM,cAAc,eAAgB,YAAY,SAAS,IAAI,gBAAgB,MAAM,YAAY,SAAS,KAAA,CAAU;EAClH,MAAM,qBAAqB,eACzB,KAAK,SAAS,YAAY,UAAU,KAAA,IAAY,YAAY,YAAY,KAAK,IAAI,KAAA,CACnF;EAEA,SAAS,WAAW,OAAwB;GAC1C,OAAO,eAAe,MAAM,SAAS,KAAK;EAC5C;EAEA,SAAS,YAAY,OAAuB;GAC1C,MAAM,MAAM,gBAAgB,MAAM;GAClC,IAAI,QAAQ,GAAG,OAAO;GACtB,QAAS,QAAQ,MAAO,OAAO;EACjC;EAEA,eAAe,uBAAsC;GACnD,MAAM,SAAS;GACf,MAAM,QAAQ,YAAY;GAC1B,IAAI,UAAU,KAAA,GAAW;GACzB,SAAS,eAAe,YAAY,KAAK,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,UAAU,CAAC;EACpF;EAEA,SAAS,UAAU,OAAqB;GACtC,YAAY,QAAQ,YAAY,KAAK;GACrC,qBAA0B;EAC5B;EAEA,SAAS,kBAAwB;GAC/B,MAAM,cAAc,gBAAgB,MAAM,WAAU,MAAK,WAAW,CAAC,CAAC;GACtE,YAAY,QAAQ,eAAe,IAAI,cAAe,gBAAgB,MAAM,SAAS,IAAI;EAC3F;EAGA,MAAM,uBAAuB;GAC3B,IAAI,CAAC,KAAK,OAAO;GACjB,IAAI,YAAY,SAAS,gBAAgB,MAAM,QAAQ,YAAY,QAAQ,gBAAgB,MAAM,SAAS;GAC1G,IAAI,YAAY,QAAQ,KAAK,gBAAgB,MAAM,QAAQ,YAAY,QAAQ;EACjF,CAAC;EAGD,SAAS,eAAqB;GAC5B,IAAI,MAAM,YAAY,KAAK,OAAO;GAClC,KAAK,QAAQ;EACf;EAEA,SAAS,gBAAsB;GAC7B,KAAK,QAAQ;EACf;EAEA,SAAS,aAAmB;GAC1B,QAAQ,OAAO,MAAM;EACvB;EAGA,IAAI,cAAoD;EACxD,SAAS,eAAe,OAAqB;GAC3C,IAAI,aAAa,aAAa,WAAW;GACzC,cAAc,iBAAiB;IAC7B,IAAI,MAAM,iBAAiB,KAAK,MAAM,KAAK,CAAC,CAAC,SAAS,MAAM,gBAAgB;IAC5E,KAAK,UAAU,MAAM,KAAK,CAAC;GAC7B,GAAG,MAAM,QAAQ;EACnB;EAEA,sBAAsB;GACpB,IAAI,aAAa,aAAa,WAAW;EAC3C,CAAC;EAGD,SAAS,QAAQ,OAAoB;GACnC,MAAM,QAAS,MAAM,OAA4B;GACjD,MAAM,QAAQ;GACd,MAAM,QAAQ;GACd,aAAa;GACb,eAAe,KAAK;EACtB;EAEA,SAAS,UAAgB;GACvB,IAAI,MAAM,UAAU;GACpB,aAAa;EACf;EAEA,SAAS,SAAS,OAAqB;GACrC,MAAM,QAAQ;GACd,MAAM,QAAQ;EAChB;EAGA,SAAS,aAAa,OAAe,OAAqB;GACxD,KAAK,qBAAqB,KAAK;GAC/B,SAAS,KAAK;GACd,cAAc;EAChB;EAEA,SAAS,eAAe,OAAqB;GAC3C,MAAM,OAAO,eAAe,MAAM,MAAM;GACxC,MAAM,MAAM,KAAK,QAAQ,KAAK;GAC9B,IAAI,OAAO,GAAG,KAAK,OAAO,KAAK,CAAC;QAC3B,KAAK,KAAK,KAAK;GACpB,KAAK,qBAAqB,IAAI;GAC9B,SAAS,EAAE;GACX,IAAI,MAAM,eAAe,cAAc;QAClC,SAAc,UAAU;EAC/B;EAEA,SAAS,aAAa,QAAoC;GACxD,IAAI,OAAO,UAAU;GACrB,IAAI,MAAM,UAAU,eAAe,OAAO,KAAK;QAC1C,aAAa,OAAO,OAAO,OAAO,KAAK;EAC9C;EAEA,SAAS,eAAqB;GAC5B,MAAM,IAAI,MAAM,MAAM,KAAK;GAC3B,IAAI,CAAC,GAAG;GACR,IAAI,MAAM,UAAU,eAAe,CAAC;QAC/B,aAAa,GAAG,CAAC;EACxB;EAEA,SAAS,YAAY,OAAqB;GACxC,MAAM,OAAO,eAAe,MAAM,QAAO,MAAK,MAAM,KAAK;GACzD,KAAK,qBAAqB,IAAI;GAC9B,SAAc,UAAU;EAC1B;EAEA,SAAS,iBAAuB;GAC9B,IAAI,MAAM,UAAU;GACpB,KAAK,qBAAqB,MAAM,WAAW,CAAC,IAAI,EAAE;GAClD,SAAS,EAAE;GACX,SAAc,UAAU;EAC1B;EAEA,MAAM,YAAY,eAChB,kBAAkB,SAAS,CAAC,MAAM,aAAa,aAAa,SAAS,MAAM,MAAM,SAAS,EAC5F;EAGA,SAAS,UAAU,OAA4B;GAC7C,IAAI,MAAM,UAAU;GAEpB,IAAI,CAAC,KAAK,SAAS,CAAC,aAAa,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG;IAC/D,MAAM,eAAe;IACrB,aAAa;IACb;GACF;GAEA,QAAQ,MAAM,KAAd;IACE,KAAK;KACH,MAAM,eAAe;KACrB,UAAU,YAAY,QAAQ,CAAC;KAC/B;IACF,KAAK;KACH,MAAM,eAAe;KACrB,UAAU,YAAY,QAAQ,CAAC;KAC/B;IACF,KAAK;KACH,IAAI,CAAC,KAAK,OAAO;KACjB,MAAM,eAAe;KACrB,UAAU,CAAC;KACX;IACF,KAAK;KACH,IAAI,CAAC,KAAK,OAAO;KACjB,MAAM,eAAe;KACrB,UAAU,gBAAgB,MAAM,SAAS,CAAC;KAC1C;IACF,KAAK;KACH,IAAI,CAAC,KAAK,OAAO;KACjB,MAAM,eAAe;KACrB,IAAI,YAAY,UAAU,KAAA,GAAW;MACnC,MAAM,MAAM,gBAAgB,MAAM,MAAK,MAAK,EAAE,UAAU,YAAY,KAAK;MACzE,IAAI,KAAK,aAAa,GAAG;KAC3B,OACK,IAAI,aAAa,OACpB,aAAa;KAEf;IACF,KAAK;KAEH,IAAI,MAAM,YAAY,MAAM,UAAU,MAAM,eAAe,MAAM,QAAQ;MACvE,MAAM,eAAe;MACrB,YAAY,eAAe,MAAM,eAAe,MAAM,SAAS,EAAE;KACnE;KACA;IACF,KAAK;KACH,cAAc;KACd;GACJ;EACF;EAGA,MACE,CAAC,2BAA2B,MAAM,QAAQ,IACzC,CAAC,OAAO,cAAc;GACrB,IAAI,UAAU;GAEd,IAAI,KAAK,SAAS,MAAM,OAAO;GAC/B,SAAS,KAAK;EAChB,GACA,EAAE,WAAW,KAAK,CACpB;EAEA,MAAM,OAAO,WAAW;GACtB,IAAI,QAAQ;IACV,gBAAgB;IAChB;GACF;GAEA,YAAY,QAAQ;GACpB,IAAI,MAAM,UACR,SAAS,EAAE;QAIX,SAAS,oBAAoB,KAAK;EAEtC,CAAC;EAED,MAAM,mBAAmB,eAAgB,MAAM,mBAAmB,SAAS,MAAO;;uCAIhF,mBAgMM,OAAA;aA/LA;IAAJ,KAAI;IAEJ,wBAAA;IACA,OAAM;OAEN,mBAoFM,OAAA;IAnFJ,8BAAA;IACC,OAAK,eAAE,MAAA,sBAAA,CAAsB,CAAA;KAAA,MAAS,MAAA,YAAA;KAAY,UAAE,QAAA;KAAQ,SAAW,UAAA;IAAS,CAAA,CAAA;IAChF,aAAS,cAAe,YAAU,CAAA,QAAA,SAAA,CAAA;;IAGnB,QAAA,YAAA,UAAA,IAAA,GACd,mBAkBO,UAAA,EAAA,KAAA,EAAA,GAAA,WAjBY,gBAAA,QAAV,WAAM;yBADf,mBAkBO,QAAA;MAhBJ,KAAK,OAAO;MACb,6BAAA;MACC,OAAK,eAAE,MAAA,qBAAA,CAAqB;SAE7B,mBAAgD,QAAhD,YAAgD,gBAAtB,OAAO,KAAK,GAAA,CAAA,GAAA,CAE7B,QAAA,YAAA,UAAA,GADT,mBAUS,UAAA;;MARP,MAAK;MACL,oCAAA;MACA,OAAM;MACL,cAAY,MAAA,CAAA,CAAC,CAAA,yBAAA,YAAA;MACd,UAAS;MACR,UAAK,WAAE,YAAY,OAAO,KAAK;uCAEhC,mBAA4D,QAAA;MAAtD,OAAM;MAA2B,eAAY;;;IAKzD,mBAyBC,SAAA;KAxBE,IAAI,WAAA;cACD;KAAJ,KAAI;KACJ,8BAAA;KACA,eAAY;KACZ,MAAK;KACL,cAAa;KACb,YAAW;KACX,MAAK;KACJ,OAAO,MAAA;KACP,UAAU,QAAA;KACV,aAAa,aAAA,SAAgB,QAAA,WAAW,KAAA,IAAY,QAAA;KACpD,cAAY,QAAA;KACZ,gBAAc,UAAA,QAAS,SAAY,KAAA;KACnC,oBAAkB,YAAA;KAClB,iBAAe,WAAA,QAAU,SAAY,KAAA;KACtC,iBAAc;KACb,qBAAmB,iBAAA;KACnB,iBAAe,KAAA,QAAO,MAAA,SAAA,IAAY,KAAA;KAClC,yBAAuB,mBAAA;KACvB,iBAAe,KAAA,QAAI,SAAA;KACpB,OAAM;KACE;KACA;KACE;;IAKJ,QAAA,WAAA,UAAA,GADR,mBAMO,QANP,YAMO,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CADL,mBAAgF,QAAA;KAA1E,OAAM;KAA+C,eAAY;wBAI5D,UAAA,SAAA,UAAA,GADb,mBAWS,UAAA;;KATP,MAAK;KACL,eAAY;KACZ,8BAAA;KACA,OAAM;KACL,cAAY,mBAAA;KACb,UAAS;KACR,SAAO;sCAER,mBAA4D,QAAA;KAAtD,OAAM;KAA2B,eAAY;qDAGrD,mBAMO,QANP,YAMO,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CADL,mBAAuE,QAAA;KAAjE,OAAM;KAAsC,eAAY;;yBAIlE,YAmGW,UAAA,EAnGD,IAAG,OAAM,GAAA,CACjB,YAiGa,YAAA;IAhGX,sBAAmB;IACnB,oBAAiB;IACjB,kBAAe;IACf,sBAAmB;IACnB,oBAAiB;IACjB,kBAAe;;2BA0FT,CAAA,eAxFN,mBAwFM,OAAA;cAtFA;KAAJ,KAAI;KACJ,eAAY;KACZ,8BAAA;KACC,OAAK,eAAE,MAAA,aAAA,CAAa;QAErB,mBAgFM,OAAA,EAhFA,OAAK,eAAE,MAAA,wBAAA,CAAwB,EAAA,GAAA,CACnC,mBA8EM,OAAA;KA7EH,IAAI,MAAA,SAAA;KACL,gCAAA;KACA,OAAM;KACL,OAAK,eAAA,EAAA,WAAA,GAAkB,QAAA,kBAAiB,IAAA,CAAA;KACzC,MAAK;KACJ,wBAAsB,QAAA,WAAQ,SAAY,KAAA;;KAInC,aAAA,SAAA,UAAA,GADR,mBASS,UAAA;;MAPP,MAAK;MACL,eAAY;MACZ,mCAAA;MACA,OAAM;MACL,SAAO;wBAEL,MAAA,CAAA,CAAC,CAAA,6BAAA,mBAAA,EAAA,OAAwD,MAAA,MAAM,KAAI,EAAA,CAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;uBAGxE,mBA2BS,UAAA,MAAA,WA1BU,gBAAA,QAAV,WAAM;0BADf,mBA2BS,UAAA;OAzBN,IAAI,YAAY,OAAO,KAAK;OAC5B,KAAK,OAAO;OACb,+BAAA;OACA,MAAK;OACL,MAAK;OACJ,UAAU,OAAO;OACjB,iBAAe,WAAW,OAAO,KAAK,IAAA,SAAA;OACtC,iBAAe,OAAO,WAAQ,SAAY,KAAA;OAC3C,OAAK,eAAA,CAAC,yDAAuD,CAA6B,OAAO,WAAQ,kCAAA,iEAAwH,YAAA,UAAgB,OAAO,SAAK,CAAK,OAAO,WAAQ,4DAAA,EAAA,CAAA,CAAA;OAIhR,UAAK,WAAE,aAAa,MAAM;OAC1B,cAAS,WAAE,YAAA,QAAc,gBAAA,MAAgB,QAAQ,OAAO,KAAK;UAE9D,WASO,KAAA,QAAA,UAAA;OATsB;OAAS,UAAU,WAAW,OAAO,KAAK;eAShE,CARL,mBAOO,QAPP,YAOO,CANL,mBAIE,QAAA;OAHA,OAAK,eAAA,CAAC,iCACE,WAAW,OAAO,KAAK,IAAA,4CAAA,EAAA,CAAA;OAC/B,eAAY;mBAEd,mBAAgD,QAAhD,aAAgD,gBAAtB,OAAO,KAAK,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,IAAA,UAAA;;KAOpC,YAAA,SAAA,UAAA,GADR,mBASM,OATN,aASM,CAJJ,WAGO,KAAA,QAAA,WAAA,CAAA,SAAA,CAAA,OAAA,OAAA,OAAA,KAFL,mBAAgF,QAAA;MAA1E,OAAM;MAA+C,eAAY;oBACvE,mBAAsC,QAAA,MAAA,gBAA7B,oBAAA,KAAmB,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAKnB,UAAA,SAAa,cAAA,SAAA,UAAA,GAD1B,mBAMM,OANN,aAMM,gBADD,qBAAA,KAAoB,GAAA,CAAA,KAIZ,UAAA,SAAA,UAAA,GADb,mBAQM,OARN,aAQM,CAHJ,WAEO,KAAA,QAAA,SAAA,CAAA,SAAA,CAAA,gBAAA,gBADF,sBAAA,KAAqB,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;2CAlFxB,KAAA,KAAI,CAAA,CAAA,CAAA,CAAA;;;aApGU;IAAa,SAAW,KAAA;IAAI,SAAW;GAAmB,CAAA,CAAA,CAAA"}
|
|
@@ -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,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrAvatar-CTOUVBF7.js","names":[],"sources":["../../../../src/components/GrAvatar/GrAvatar.vue","../../../../src/components/GrAvatar/GrAvatar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport { grAvatarClass } from './grAvatarStyles'\nimport type { GrAvatarShape } from './grAvatarStyles'\n\nconst props = withDefaults(defineProps<{\n size?: number\n src?: string\n alt?: string\n shape?: GrAvatarShape\n}>(), {\n size: 40,\n src: undefined,\n alt: '',\n shape: 'circle',\n})\n\nconst style = computed(() => {\n const px = `${props.size}px`\n\n return {\n width: px,\n height: px,\n }\n})\n\nconst className = computed(() => {\n return grAvatarClass(props.shape)\n})\n</script>\n\n<template>\n <span :style=\"style\" class=\"inline-flex items-center justify-center overflow-hidden border border-[var(--gr-brd)] bg-[var(--gr-muted)] text-[var(--gr-muted-fg)] font-700\" :class=\"className\">\n <img v-if=\"props.src\" :src=\"props.src\" :alt=\"props.alt\" class=\"h-full w-full object-cover\">\n <slot v-else />\n </span>\n</template>","<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport { grAvatarClass } from './grAvatarStyles'\nimport type { GrAvatarShape } from './grAvatarStyles'\n\nconst props = withDefaults(defineProps<{\n size?: number\n src?: string\n alt?: string\n shape?: GrAvatarShape\n}>(), {\n size: 40,\n src: undefined,\n alt: '',\n shape: 'circle',\n})\n\nconst style = computed(() => {\n const px = `${props.size}px`\n\n return {\n width: px,\n height: px,\n }\n})\n\nconst className = computed(() => {\n return grAvatarClass(props.shape)\n})\n</script>\n\n<template>\n <span :style=\"style\" class=\"inline-flex items-center justify-center overflow-hidden border border-[var(--gr-brd)] bg-[var(--gr-muted)] text-[var(--gr-muted-fg)] font-700\" :class=\"className\">\n <img v-if=\"props.src\" :src=\"props.src\" :alt=\"props.alt\" class=\"h-full w-full object-cover\">\n <slot v-else />\n </span>\n</template>"],"mappings":";;;;;;;;;;;;;;;EAMA,MAAM,QAAQ;EAYd,MAAM,QAAQ,eAAe;GAC3B,MAAM,KAAK,GAAG,MAAM,KAAK;GAEzB,OAAO;IACL,OAAO;IACP,QAAQ;GACV;EACF,CAAC;EAED,MAAM,YAAY,eAAe;GAC/B,OAAO,cAAc,MAAM,KAAK;EAClC,CAAC;;uBAIC,mBAGO,QAAA;IAHA,OAAK,eAAE,MAAA,KAAK;IAAE,OAAK,eAAA,CAAC,iJAAwJ,UAAA,KAAS,CAAA;OAC/K,MAAM,OAAA,UAAA,GAAjB,mBAA2F,OAAA;;IAApE,KAAK,MAAM;IAAM,KAAK,MAAM;IAAK,OAAM;8BAC9D,WAAe,KAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { n as grAvatarSafelist, t as grAvatarConfig } from "../../chunks/config-QYGvEBu5.js";
|
|
2
|
-
import { t as GrAvatar_default } from "./chunks/GrAvatar-
|
|
2
|
+
import { t as GrAvatar_default } from "./chunks/GrAvatar-CTOUVBF7.js";
|
|
3
3
|
export { GrAvatar_default as GrAvatar, GrAvatar_default as default, grAvatarConfig, grAvatarSafelist };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as useGrComponentProp } from "../../../chunks/context-DfWYCBB-.js";
|
|
2
|
+
import { n as grBadgeClass } from "../../../chunks/grBadgeStyles-D3dFjr_N.js";
|
|
2
3
|
import { t as _plugin_vue_export_helper_default } from "../../../chunks/_plugin-vue_export-helper-BOaGB7Aw.js";
|
|
3
4
|
import { computed, createElementBlock, createElementVNode, defineComponent, normalizeClass, openBlock, renderSlot } from "vue";
|
|
4
5
|
import '../../../GrBadge.css';//#region src/components/GrBadge/GrBadge.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -9,28 +10,31 @@ var _hoisted_2 = { class: "gr-badge__text" };
|
|
|
9
10
|
var GrBadge_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
|
|
10
11
|
__name: "GrBadge",
|
|
11
12
|
props: {
|
|
12
|
-
tone: { default:
|
|
13
|
+
tone: { default: void 0 },
|
|
13
14
|
dark: {
|
|
14
15
|
type: Boolean,
|
|
15
16
|
default: false
|
|
16
17
|
},
|
|
17
|
-
size: { default:
|
|
18
|
-
radius: { default:
|
|
18
|
+
size: { default: void 0 },
|
|
19
|
+
radius: { default: void 0 }
|
|
19
20
|
},
|
|
20
21
|
setup(__props) {
|
|
21
22
|
const props = __props;
|
|
23
|
+
const resolvedTone = useGrComponentProp("GrBadge", "tone", () => props.tone, "neutral");
|
|
24
|
+
const resolvedSize = useGrComponentProp("GrBadge", "size", () => props.size, "sm");
|
|
25
|
+
const resolvedRadius = useGrComponentProp("GrBadge", "radius", () => props.radius, "round");
|
|
22
26
|
const className = computed(() => {
|
|
23
27
|
return grBadgeClass({
|
|
24
|
-
tone:
|
|
28
|
+
tone: resolvedTone.value,
|
|
25
29
|
dark: props.dark,
|
|
26
|
-
size:
|
|
27
|
-
radius:
|
|
30
|
+
size: resolvedSize.value,
|
|
31
|
+
radius: resolvedRadius.value
|
|
28
32
|
});
|
|
29
33
|
});
|
|
30
34
|
return (_ctx, _cache) => {
|
|
31
35
|
return openBlock(), createElementBlock("span", { class: normalizeClass(["gr-badge inline-block border whitespace-nowrap leading-none", className.value]) }, [createElementVNode("span", _hoisted_1, [createElementVNode("span", _hoisted_2, [renderSlot(_ctx.$slots, "default", {}, void 0, true)])])], 2);
|
|
32
36
|
};
|
|
33
37
|
}
|
|
34
|
-
}), [["__scopeId", "data-v-
|
|
38
|
+
}), [["__scopeId", "data-v-39b6bab2"]]);
|
|
35
39
|
//#endregion
|
|
36
40
|
export { GrBadge_default as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrBadge-D1jefy4S.js","names":[],"sources":["../../../../src/components/GrBadge/GrBadge.vue","../../../../src/components/GrBadge/GrBadge.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport { useGrComponentProp } from '../GrConfigProvider/context'\n\nexport type { GrBadgeRadius, GrBadgeSize, GrBadgeTone } from './grBadgeStyles'\n\nimport {\n grBadgeClass,\n type GrBadgeRadius,\n type GrBadgeSize,\n type GrBadgeTone,\n} from './grBadgeStyles'\n\nconst props = withDefaults(\n defineProps<{\n tone?: GrBadgeTone\n dark?: boolean\n size?: GrBadgeSize\n radius?: GrBadgeRadius\n }>(),\n {\n // `tone`/`size`/`radius` настраиваются через `GrConfigProvider`, поэтому\n // их дефолты живут в резолверах ниже, а не в `withDefaults`.\n tone: undefined,\n dark: false,\n size: undefined,\n radius: undefined,\n },\n)\n\n// Эффективные значения: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedTone = useGrComponentProp('GrBadge', 'tone', () => props.tone, 'neutral')\nconst resolvedSize = useGrComponentProp('GrBadge', 'size', () => props.size, 'sm')\nconst resolvedRadius = useGrComponentProp('GrBadge', 'radius', () => props.radius, 'round')\n\nconst className = computed(() => {\n return grBadgeClass({\n tone: resolvedTone.value,\n dark: props.dark,\n size: resolvedSize.value,\n radius: resolvedRadius.value,\n })\n})\n</script>\n\n<template>\n <span\n class=\"gr-badge inline-block border whitespace-nowrap leading-none\"\n :class=\"className\"\n >\n <span class=\"gr-badge__label\">\n <span class=\"gr-badge__text\">\n <slot />\n </span>\n </span>\n </span>\n</template>\n\n<style scoped>\n/*\n * Оптически центрируем текст по вертикали независимо от регистра,\n * не уменьшая высоту самого бейджа.\n *\n * Раньше `text-box-trim` висел прямо на тексте и обрезал line-box до\n * cap-height: текст центрировался корректно, но высота контента\n * падала до cap-height, из-за чего бейдж становился ниже.\n *\n * Теперь высоту держит обёртка `.gr-badge__label` (`min-height: 1lh` —\n * исходная высота line-box при `leading-none`), а сам текст\n * (`.gr-badge__text`) обрезается до cap-height/базовой линии и\n * центрируется внутри этой высоты через flex. В итоге высота бейджа\n * не меняется, а строчный/заглавный текст выглядит по центру.\n */\n.gr-badge__label {\n display: flex;\n align-items: center;\n min-height: 1lh;\n}\n\n.gr-badge__text {\n display: block;\n text-box-trim: trim-both;\n text-box-edge: cap alphabetic;\n /* Шорткат для браузеров с поддержкой нового синтаксиса. */\n text-box: trim-both cap alphabetic;\n}\n</style>","<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport { useGrComponentProp } from '../GrConfigProvider/context'\n\nexport type { GrBadgeRadius, GrBadgeSize, GrBadgeTone } from './grBadgeStyles'\n\nimport {\n grBadgeClass,\n type GrBadgeRadius,\n type GrBadgeSize,\n type GrBadgeTone,\n} from './grBadgeStyles'\n\nconst props = withDefaults(\n defineProps<{\n tone?: GrBadgeTone\n dark?: boolean\n size?: GrBadgeSize\n radius?: GrBadgeRadius\n }>(),\n {\n // `tone`/`size`/`radius` настраиваются через `GrConfigProvider`, поэтому\n // их дефолты живут в резолверах ниже, а не в `withDefaults`.\n tone: undefined,\n dark: false,\n size: undefined,\n radius: undefined,\n },\n)\n\n// Эффективные значения: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedTone = useGrComponentProp('GrBadge', 'tone', () => props.tone, 'neutral')\nconst resolvedSize = useGrComponentProp('GrBadge', 'size', () => props.size, 'sm')\nconst resolvedRadius = useGrComponentProp('GrBadge', 'radius', () => props.radius, 'round')\n\nconst className = computed(() => {\n return grBadgeClass({\n tone: resolvedTone.value,\n dark: props.dark,\n size: resolvedSize.value,\n radius: resolvedRadius.value,\n })\n})\n</script>\n\n<template>\n <span\n class=\"gr-badge inline-block border whitespace-nowrap leading-none\"\n :class=\"className\"\n >\n <span class=\"gr-badge__label\">\n <span class=\"gr-badge__text\">\n <slot />\n </span>\n </span>\n </span>\n</template>\n\n<style scoped>\n/*\n * Оптически центрируем текст по вертикали независимо от регистра,\n * не уменьшая высоту самого бейджа.\n *\n * Раньше `text-box-trim` висел прямо на тексте и обрезал line-box до\n * cap-height: текст центрировался корректно, но высота контента\n * падала до cap-height, из-за чего бейдж становился ниже.\n *\n * Теперь высоту держит обёртка `.gr-badge__label` (`min-height: 1lh` —\n * исходная высота line-box при `leading-none`), а сам текст\n * (`.gr-badge__text`) обрезается до cap-height/базовой линии и\n * центрируется внутри этой высоты через flex. В итоге высота бейджа\n * не меняется, а строчный/заглавный текст выглядит по центру.\n */\n.gr-badge__label {\n display: flex;\n align-items: center;\n min-height: 1lh;\n}\n\n.gr-badge__text {\n display: block;\n text-box-trim: trim-both;\n text-box-edge: cap alphabetic;\n /* Шорткат для браузеров с поддержкой нового синтаксиса. */\n text-box: trim-both cap alphabetic;\n}\n</style>"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAcA,MAAM,QAAQ;EAkBd,MAAM,eAAe,mBAAmB,WAAW,cAAc,MAAM,MAAM,SAAS;EACtF,MAAM,eAAe,mBAAmB,WAAW,cAAc,MAAM,MAAM,IAAI;EACjF,MAAM,iBAAiB,mBAAmB,WAAW,gBAAgB,MAAM,QAAQ,OAAO;EAE1F,MAAM,YAAY,eAAe;GAC/B,OAAO,aAAa;IAClB,MAAM,aAAa;IACnB,MAAM,MAAM;IACZ,MAAM,aAAa;IACnB,QAAQ,eAAe;GACzB,CAAC;EACH,CAAC;;uBAIC,mBASO,QAAA,EARH,OAAK,eAAA,CAAC,+DACE,UAAA,KAAS,CAAA,EAAA,GAAA,CAEnB,mBAIO,QAJP,YAIO,CAHL,mBAEO,QAFP,YAEO,CADL,WAAQ,KAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { t as GrBadge_default } from "./chunks/GrBadge-
|
|
2
|
-
import { n as grBadgeSafelist, t as grBadgeConfig } from "../../chunks/config-
|
|
1
|
+
import { t as GrBadge_default } from "./chunks/GrBadge-D1jefy4S.js";
|
|
2
|
+
import { n as grBadgeSafelist, t as grBadgeConfig } from "../../chunks/config-D_myOZbA.js";
|
|
3
3
|
export { GrBadge_default as GrBadge, GrBadge_default as default, grBadgeConfig, grBadgeSafelist };
|
package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-CcktMOdg.js → GrBadgeWrap-DWDxHdiQ.js}
RENAMED
|
@@ -8,7 +8,7 @@ var _hoisted_2 = {
|
|
|
8
8
|
};
|
|
9
9
|
var _hoisted_3 = {
|
|
10
10
|
key: 1,
|
|
11
|
-
class: "absolute -top-2 -right-2 min-w-5 h-5 px-1 rounded-full bg-[var(--gr-danger)] text-[var(--destructive-fg)] text-[11px] font-700 inline-flex items-center justify-center",
|
|
11
|
+
class: "absolute -top-2 -right-2 min-w-5 h-5 px-1 rounded-full bg-[var(--gr-danger)] text-[var(--gr-destructive-fg)] text-[11px] font-700 inline-flex items-center justify-center",
|
|
12
12
|
"aria-hidden": "true"
|
|
13
13
|
};
|
|
14
14
|
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrBadgeWrap-DWDxHdiQ.js","names":[],"sources":["../../../../src/components/GrBadgeWrap/GrBadgeWrap.vue","../../../../src/components/GrBadgeWrap/GrBadgeWrap.vue"],"sourcesContent":["<script setup lang=\"ts\">\nconst props = withDefaults(defineProps<{\n value?: string | number\n dot?: boolean\n}>(), {\n value: undefined,\n dot: false,\n})\n</script>\n\n<template>\n <span class=\"relative inline-flex\">\n <slot />\n\n <span\n v-if=\"props.dot\"\n class=\"absolute -top-1 -right-1 h-2 w-2 rounded-full bg-[var(--gr-danger)]\"\n aria-hidden=\"true\"\n />\n\n <span\n v-else-if=\"props.value !== undefined\"\n class=\"absolute -top-2 -right-2 min-w-5 h-5 px-1 rounded-full bg-[var(--gr-danger)] text-[var(--gr-destructive-fg)] text-[11px] font-700 inline-flex items-center justify-center\"\n aria-hidden=\"true\"\n >\n {{ props.value }}\n </span>\n </span>\n</template>","<script setup lang=\"ts\">\nconst props = withDefaults(defineProps<{\n value?: string | number\n dot?: boolean\n}>(), {\n value: undefined,\n dot: false,\n})\n</script>\n\n<template>\n <span class=\"relative inline-flex\">\n <slot />\n\n <span\n v-if=\"props.dot\"\n class=\"absolute -top-1 -right-1 h-2 w-2 rounded-full bg-[var(--gr-danger)]\"\n aria-hidden=\"true\"\n />\n\n <span\n v-else-if=\"props.value !== undefined\"\n class=\"absolute -top-2 -right-2 min-w-5 h-5 px-1 rounded-full bg-[var(--gr-danger)] text-[var(--gr-destructive-fg)] text-[11px] font-700 inline-flex items-center justify-center\"\n aria-hidden=\"true\"\n >\n {{ props.value }}\n </span>\n </span>\n</template>"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EACA,MAAM,QAAQ;;uBAUZ,mBAgBO,QAhBP,YAgBO,CAfL,WAAQ,KAAA,QAAA,SAAA,GAGA,MAAM,OAAA,UAAA,GADd,mBAIE,QAJF,UAIE,KAGW,MAAM,UAAU,KAAA,KAAA,UAAA,GAD7B,mBAMO,QANP,YAMO,gBADF,MAAM,KAAK,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,CAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { t as GrBadgeWrap_default } from "./chunks/GrBadgeWrap-
|
|
1
|
+
import { t as GrBadgeWrap_default } from "./chunks/GrBadgeWrap-DWDxHdiQ.js";
|
|
2
2
|
import { t as grBadgeWrapConfig } from "../../chunks/config-Dxuwwepq.js";
|
|
3
3
|
export { GrBadgeWrap_default as GrBadgeWrap, GrBadgeWrap_default as default, grBadgeWrapConfig };
|
package/dist/components/GrBottomNav/chunks/{GrBottomNav-usuMgG8_.js → GrBottomNav-vSE4LXmk.js}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Fragment, createElementBlock, createElementVNode, defineComponent, normalizeClass, openBlock, renderList, toDisplayString } from "vue";
|
|
2
2
|
//#region src/components/GrBottomNav/GrBottomNav.vue?vue&type=script&setup=true&lang.ts
|
|
3
|
-
var _hoisted_1 = { class: "fixed bottom-0 left-0 right-0 border-t border-[var(--brd)] bg-[var(--bg)] px-2 pb-[env(safe-area-inset-bottom)] sm:hidden" };
|
|
3
|
+
var _hoisted_1 = { class: "fixed bottom-0 left-0 right-0 border-t border-[var(--gr-brd)] bg-[var(--gr-bg)] px-2 pb-[env(safe-area-inset-bottom)] sm:hidden" };
|
|
4
4
|
var _hoisted_2 = { class: "h-14 flex items-center justify-around" };
|
|
5
5
|
var _hoisted_3 = ["onClick"];
|
|
6
6
|
//#endregion
|
|
@@ -20,7 +20,7 @@ var GrBottomNav_default = /* @__PURE__ */ defineComponent({
|
|
|
20
20
|
return openBlock(), createElementBlock("button", {
|
|
21
21
|
key: it.value,
|
|
22
22
|
type: "button",
|
|
23
|
-
class: normalizeClass(["min-w-[44px] min-h-[44px] px-3 rounded-md text-sm font-600 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)]", it.value === props.modelValue ? "text-[var(--primary)]" : "text-[var(--muted-fg)] hover:text-[var(--fg)]"]),
|
|
23
|
+
class: normalizeClass(["min-w-[44px] min-h-[44px] px-3 rounded-md text-sm font-600 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]", it.value === props.modelValue ? "text-[var(--gr-primary)]" : "text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)]"]),
|
|
24
24
|
onClick: ($event) => emit("update:modelValue", it.value)
|
|
25
25
|
}, toDisplayString(it.label), 11, _hoisted_3);
|
|
26
26
|
}), 128))])]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrBottomNav-vSE4LXmk.js","names":[],"sources":["../../../../src/components/GrBottomNav/GrBottomNav.vue","../../../../src/components/GrBottomNav/GrBottomNav.vue"],"sourcesContent":["<script setup lang=\"ts\">\nexport type GrBottomNavItem = {\n label: string\n value: string\n}\n\nconst props = defineProps<{\n modelValue: string\n items: GrBottomNavItem[]\n}>()\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string): void\n}>()\n</script>\n\n<template>\n <nav class=\"fixed bottom-0 left-0 right-0 border-t border-[var(--gr-brd)] bg-[var(--gr-bg)] px-2 pb-[env(safe-area-inset-bottom)] sm:hidden\">\n <div class=\"h-14 flex items-center justify-around\">\n <button\n v-for=\"it in props.items\"\n :key=\"it.value\"\n type=\"button\"\n class=\"min-w-[44px] min-h-[44px] px-3 rounded-md text-sm font-600 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n :class=\"it.value === props.modelValue ? 'text-[var(--gr-primary)]' : 'text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)]'\"\n @click=\"emit('update:modelValue', it.value)\"\n >\n {{ it.label }}\n </button>\n </div>\n </nav>\n</template>","<script setup lang=\"ts\">\nexport type GrBottomNavItem = {\n label: string\n value: string\n}\n\nconst props = defineProps<{\n modelValue: string\n items: GrBottomNavItem[]\n}>()\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string): void\n}>()\n</script>\n\n<template>\n <nav class=\"fixed bottom-0 left-0 right-0 border-t border-[var(--gr-brd)] bg-[var(--gr-bg)] px-2 pb-[env(safe-area-inset-bottom)] sm:hidden\">\n <div class=\"h-14 flex items-center justify-around\">\n <button\n v-for=\"it in props.items\"\n :key=\"it.value\"\n type=\"button\"\n class=\"min-w-[44px] min-h-[44px] px-3 rounded-md text-sm font-600 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n :class=\"it.value === props.modelValue ? 'text-[var(--gr-primary)]' : 'text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)]'\"\n @click=\"emit('update:modelValue', it.value)\"\n >\n {{ it.label }}\n </button>\n </div>\n </nav>\n</template>"],"mappings":";;;;;;;;;;;;;;;EAMA,MAAM,QAAQ;EAKd,MAAM,OAAO;;uBAMX,mBAaM,OAbN,YAaM,CAZJ,mBAWM,OAXN,YAWM,EAAA,UAAA,IAAA,GAVJ,mBASS,UAAA,MAAA,WARM,MAAM,QAAZ,OAAE;wBADX,mBASS,UAAA;KAPN,KAAK,GAAG;KACT,MAAK;KACL,OAAK,eAAA,CAAC,4JACE,GAAG,UAAU,MAAM,aAAU,6BAAA,qDAAA,CAAA;KACpC,UAAK,WAAE,KAAI,qBAAsB,GAAG,KAAK;uBAEvC,GAAG,KAAK,GAAA,IAAA,UAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { t as GrBottomNav_default } from "./chunks/GrBottomNav-
|
|
1
|
+
import { t as GrBottomNav_default } from "./chunks/GrBottomNav-vSE4LXmk.js";
|
|
2
2
|
import { t as grBottomNavConfig } from "../../chunks/config-C9AcVDkv.js";
|
|
3
3
|
export { GrBottomNav_default as GrBottomNav, GrBottomNav_default as default, grBottomNavConfig };
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
+
import { a as useGrComponentProp, o as useGrComponentSize } from "../../../chunks/context-DfWYCBB-.js";
|
|
1
2
|
import { t as loader_circle_default } from "../../../chunks/loader-circle-CfVLz7lb.js";
|
|
2
|
-
import { n as grButtonBaseClass, r as grButtonClass } from "../../../chunks/grButtonStyles-
|
|
3
|
+
import { n as grButtonBaseClass, r as grButtonClass } from "../../../chunks/grButtonStyles-DRBgDmOp.js";
|
|
3
4
|
import { computed, createBlock, createCommentVNode, defineComponent, markRaw, normalizeClass, normalizeStyle, openBlock, renderSlot, resolveDynamicComponent, unref, withCtx } from "vue";
|
|
4
5
|
//#endregion
|
|
5
6
|
//#region src/components/GrButton/GrButton.vue
|
|
6
7
|
var GrButton_default = /* @__PURE__ */ defineComponent({
|
|
7
8
|
__name: "GrButton",
|
|
8
9
|
props: {
|
|
9
|
-
variant: { default:
|
|
10
|
-
tone: { default:
|
|
11
|
-
size: { default:
|
|
10
|
+
variant: { default: void 0 },
|
|
11
|
+
tone: { default: void 0 },
|
|
12
|
+
size: { default: void 0 },
|
|
12
13
|
loading: {
|
|
13
14
|
type: Boolean,
|
|
14
15
|
default: false
|
|
@@ -19,7 +20,7 @@ var GrButton_default = /* @__PURE__ */ defineComponent({
|
|
|
19
20
|
},
|
|
20
21
|
square: {
|
|
21
22
|
type: Boolean,
|
|
22
|
-
default:
|
|
23
|
+
default: void 0
|
|
23
24
|
},
|
|
24
25
|
type: { default: "button" },
|
|
25
26
|
ariaLabel: { default: void 0 },
|
|
@@ -34,7 +35,10 @@ var GrButton_default = /* @__PURE__ */ defineComponent({
|
|
|
34
35
|
},
|
|
35
36
|
setup(__props) {
|
|
36
37
|
const props = __props;
|
|
37
|
-
const
|
|
38
|
+
const resolvedSize = useGrComponentSize(() => props.size, { component: "GrButton" });
|
|
39
|
+
const resolvedVariant = useGrComponentProp("GrButton", "variant", () => props.variant, "primary");
|
|
40
|
+
const resolvedTone = useGrComponentProp("GrButton", "tone", () => props.tone, "primary");
|
|
41
|
+
const isSquare = useGrComponentProp("GrButton", "square", () => props.square, false);
|
|
38
42
|
const isLink = computed(() => Boolean(props.as || props.href));
|
|
39
43
|
const renderAs = computed(() => {
|
|
40
44
|
if (props.as) return typeof props.as === "string" ? props.as : markRaw(props.as);
|
|
@@ -54,9 +58,9 @@ var GrButton_default = /* @__PURE__ */ defineComponent({
|
|
|
54
58
|
const squareStyle = computed(() => {
|
|
55
59
|
if (!isSquare.value) return void 0;
|
|
56
60
|
const v = `${(() => {
|
|
57
|
-
if (
|
|
58
|
-
if (
|
|
59
|
-
if (
|
|
61
|
+
if (resolvedSize.value === "xs") return 28;
|
|
62
|
+
if (resolvedSize.value === "sm") return 32;
|
|
63
|
+
if (resolvedSize.value === "lg") return 44;
|
|
60
64
|
return 40;
|
|
61
65
|
})()}px`;
|
|
62
66
|
return {
|
|
@@ -68,17 +72,17 @@ var GrButton_default = /* @__PURE__ */ defineComponent({
|
|
|
68
72
|
});
|
|
69
73
|
const className = computed(() => {
|
|
70
74
|
return grButtonClass({
|
|
71
|
-
variant:
|
|
72
|
-
tone:
|
|
73
|
-
size:
|
|
75
|
+
variant: resolvedVariant.value,
|
|
76
|
+
tone: resolvedTone.value,
|
|
77
|
+
size: resolvedSize.value,
|
|
74
78
|
square: isSquare.value
|
|
75
79
|
});
|
|
76
80
|
});
|
|
77
81
|
return (_ctx, _cache) => {
|
|
78
82
|
return openBlock(), createBlock(resolveDynamicComponent(renderAs.value), {
|
|
79
83
|
"data-gr-button": "",
|
|
80
|
-
"data-gr-variant":
|
|
81
|
-
"data-gr-tone":
|
|
84
|
+
"data-gr-variant": unref(resolvedVariant),
|
|
85
|
+
"data-gr-tone": unref(resolvedTone),
|
|
82
86
|
type: renderAs.value === "button" ? props.type : void 0,
|
|
83
87
|
disabled: nativeDisabled.value,
|
|
84
88
|
href: isLink.value && !props.disabled ? props.href : void 0,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrButton-DCi4CUpo.js","names":[],"sources":["../../../../src/components/GrButton/GrButton.vue","../../../../src/components/GrButton/GrButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, markRaw, type Component } from 'vue'\n\nimport IconLoader from '~icons/lucide/loader-circle'\n\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\n\nexport type { GrButtonSize, GrButtonTone, GrButtonVariant } from './grButtonStyles'\n\nimport {\n grButtonBaseClass,\n grButtonClass,\n type GrButtonSize,\n type GrButtonTone,\n type GrButtonVariant,\n} from './grButtonStyles'\n\nconst props = withDefaults(\n defineProps<{\n variant?: GrButtonVariant\n tone?: GrButtonTone\n size?: GrButtonSize\n loading?: boolean\n disabled?: boolean\n square?: boolean\n type?: 'button' | 'submit' | 'reset'\n ariaLabel?: string\n /** Полиморфизм: кастомный корневой тег/компонент (например, RouterLink). */\n as?: string | Component\n /** Рендерит кнопку как `<a href>` (если не задан `as`). */\n href?: string\n target?: string\n rel?: string\n external?: boolean\n }>(),\n {\n // `variant`/`tone`/`size`/`square` настраиваются через `GrConfigProvider`,\n // поэтому их дефолты живут в резолверах ниже, а не здесь: Vue подставил бы\n // дефолт до того, как компонент успеет заглянуть в конфиг.\n variant: undefined,\n tone: undefined,\n size: undefined,\n loading: false,\n disabled: false,\n square: undefined,\n type: 'button',\n ariaLabel: undefined,\n as: undefined,\n href: undefined,\n target: undefined,\n rel: undefined,\n external: false,\n },\n)\n\n// Эффективные значения: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrButton' })\nconst resolvedVariant = useGrComponentProp('GrButton', 'variant', () => props.variant, 'primary')\nconst resolvedTone = useGrComponentProp('GrButton', 'tone', () => props.tone, 'primary')\nconst isSquare = useGrComponentProp('GrButton', 'square', () => props.square, false)\n\n// Полиморфный корень: `as` → `<a href>` → `<button>`.\nconst isLink = computed(() => Boolean(props.as || props.href))\nconst renderAs = computed<string | Component>(() => {\n if (props.as) return typeof props.as === 'string' ? props.as : markRaw(props.as)\n return props.href ? 'a' : 'button'\n})\n\n// Неинтерактивно при явном `disabled` ИЛИ во время `loading`.\nconst blocked = computed(() => props.disabled || props.loading)\n\n// Ключевое: `loading` НЕ ставит нативный `disabled` (элемент бы выпал из фокуса и\n// скринридер потерял бы контекст) — вместо этого `aria-disabled` + перехват клика.\n// Нативный `disabled` (только у `<button>`) оставляем лишь для явного `disabled`.\nconst nativeDisabled = computed(() => (renderAs.value === 'button' && props.disabled) ? true : undefined)\nconst ariaDisabled = computed(() => (props.loading || (isLink.value && props.disabled)) ? 'true' : undefined)\n\nconst resolvedTarget = computed(() => props.target ?? (props.external ? '_blank' : undefined))\nconst resolvedRel = computed(() => props.rel ?? (resolvedTarget.value === '_blank' ? 'noopener noreferrer' : undefined))\n\nfunction onClickCapture(e: MouseEvent): void {\n // Блокируем и дефолт (submit/навигация), и внешние обработчики (в т.ч. по Enter/Space),\n // сохраняя фокус на элементе.\n if (blocked.value) {\n e.preventDefault()\n e.stopImmediatePropagation()\n }\n}\n\nconst squareStyle = computed(() => {\n if (!isSquare.value) return undefined\n\n const px = (() => {\n if (resolvedSize.value === 'xs') return 28\n if (resolvedSize.value === 'sm') return 32\n if (resolvedSize.value === 'lg') return 44\n return 40\n })()\n\n const v = `${px}px`\n return {\n width: v,\n minWidth: v,\n height: v,\n padding: '0px',\n } as const\n})\n\nconst className = computed(() => {\n return grButtonClass({\n variant: resolvedVariant.value,\n tone: resolvedTone.value,\n size: resolvedSize.value,\n square: isSquare.value,\n })\n})\n</script>\n\n<template>\n <component\n :is=\"renderAs\"\n data-gr-button\n :data-gr-variant=\"resolvedVariant\"\n :data-gr-tone=\"resolvedTone\"\n :type=\"renderAs === 'button' ? props.type : undefined\"\n :disabled=\"nativeDisabled\"\n :href=\"isLink && !props.disabled ? props.href : undefined\"\n :target=\"isLink && !props.disabled ? resolvedTarget : undefined\"\n :rel=\"isLink && !props.disabled ? resolvedRel : undefined\"\n :aria-busy=\"props.loading ? 'true' : undefined\"\n :aria-disabled=\"ariaDisabled\"\n :aria-label=\"props.ariaLabel\"\n :tabindex=\"isLink && props.disabled ? -1 : undefined\"\n :class=\"[grButtonBaseClass, className, blocked ? 'cursor-not-allowed' : '']\"\n :style=\"squareStyle\"\n @click.capture=\"onClickCapture\"\n >\n <IconLoader v-if=\"props.loading\" class=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, markRaw, type Component } from 'vue'\n\nimport IconLoader from '~icons/lucide/loader-circle'\n\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\n\nexport type { GrButtonSize, GrButtonTone, GrButtonVariant } from './grButtonStyles'\n\nimport {\n grButtonBaseClass,\n grButtonClass,\n type GrButtonSize,\n type GrButtonTone,\n type GrButtonVariant,\n} from './grButtonStyles'\n\nconst props = withDefaults(\n defineProps<{\n variant?: GrButtonVariant\n tone?: GrButtonTone\n size?: GrButtonSize\n loading?: boolean\n disabled?: boolean\n square?: boolean\n type?: 'button' | 'submit' | 'reset'\n ariaLabel?: string\n /** Полиморфизм: кастомный корневой тег/компонент (например, RouterLink). */\n as?: string | Component\n /** Рендерит кнопку как `<a href>` (если не задан `as`). */\n href?: string\n target?: string\n rel?: string\n external?: boolean\n }>(),\n {\n // `variant`/`tone`/`size`/`square` настраиваются через `GrConfigProvider`,\n // поэтому их дефолты живут в резолверах ниже, а не здесь: Vue подставил бы\n // дефолт до того, как компонент успеет заглянуть в конфиг.\n variant: undefined,\n tone: undefined,\n size: undefined,\n loading: false,\n disabled: false,\n square: undefined,\n type: 'button',\n ariaLabel: undefined,\n as: undefined,\n href: undefined,\n target: undefined,\n rel: undefined,\n external: false,\n },\n)\n\n// Эффективные значения: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrButton' })\nconst resolvedVariant = useGrComponentProp('GrButton', 'variant', () => props.variant, 'primary')\nconst resolvedTone = useGrComponentProp('GrButton', 'tone', () => props.tone, 'primary')\nconst isSquare = useGrComponentProp('GrButton', 'square', () => props.square, false)\n\n// Полиморфный корень: `as` → `<a href>` → `<button>`.\nconst isLink = computed(() => Boolean(props.as || props.href))\nconst renderAs = computed<string | Component>(() => {\n if (props.as) return typeof props.as === 'string' ? props.as : markRaw(props.as)\n return props.href ? 'a' : 'button'\n})\n\n// Неинтерактивно при явном `disabled` ИЛИ во время `loading`.\nconst blocked = computed(() => props.disabled || props.loading)\n\n// Ключевое: `loading` НЕ ставит нативный `disabled` (элемент бы выпал из фокуса и\n// скринридер потерял бы контекст) — вместо этого `aria-disabled` + перехват клика.\n// Нативный `disabled` (только у `<button>`) оставляем лишь для явного `disabled`.\nconst nativeDisabled = computed(() => (renderAs.value === 'button' && props.disabled) ? true : undefined)\nconst ariaDisabled = computed(() => (props.loading || (isLink.value && props.disabled)) ? 'true' : undefined)\n\nconst resolvedTarget = computed(() => props.target ?? (props.external ? '_blank' : undefined))\nconst resolvedRel = computed(() => props.rel ?? (resolvedTarget.value === '_blank' ? 'noopener noreferrer' : undefined))\n\nfunction onClickCapture(e: MouseEvent): void {\n // Блокируем и дефолт (submit/навигация), и внешние обработчики (в т.ч. по Enter/Space),\n // сохраняя фокус на элементе.\n if (blocked.value) {\n e.preventDefault()\n e.stopImmediatePropagation()\n }\n}\n\nconst squareStyle = computed(() => {\n if (!isSquare.value) return undefined\n\n const px = (() => {\n if (resolvedSize.value === 'xs') return 28\n if (resolvedSize.value === 'sm') return 32\n if (resolvedSize.value === 'lg') return 44\n return 40\n })()\n\n const v = `${px}px`\n return {\n width: v,\n minWidth: v,\n height: v,\n padding: '0px',\n } as const\n})\n\nconst className = computed(() => {\n return grButtonClass({\n variant: resolvedVariant.value,\n tone: resolvedTone.value,\n size: resolvedSize.value,\n square: isSquare.value,\n })\n})\n</script>\n\n<template>\n <component\n :is=\"renderAs\"\n data-gr-button\n :data-gr-variant=\"resolvedVariant\"\n :data-gr-tone=\"resolvedTone\"\n :type=\"renderAs === 'button' ? props.type : undefined\"\n :disabled=\"nativeDisabled\"\n :href=\"isLink && !props.disabled ? props.href : undefined\"\n :target=\"isLink && !props.disabled ? resolvedTarget : undefined\"\n :rel=\"isLink && !props.disabled ? resolvedRel : undefined\"\n :aria-busy=\"props.loading ? 'true' : undefined\"\n :aria-disabled=\"ariaDisabled\"\n :aria-label=\"props.ariaLabel\"\n :tabindex=\"isLink && props.disabled ? -1 : undefined\"\n :class=\"[grButtonBaseClass, className, blocked ? 'cursor-not-allowed' : '']\"\n :style=\"squareStyle\"\n @click.capture=\"onClickCapture\"\n >\n <IconLoader v-if=\"props.loading\" class=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n <slot />\n </component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBA,MAAM,QAAQ;EAuCd,MAAM,eAAe,yBAAyB,MAAM,MAAM,EAAE,WAAW,WAAW,CAAC;EACnF,MAAM,kBAAkB,mBAAmB,YAAY,iBAAiB,MAAM,SAAS,SAAS;EAChG,MAAM,eAAe,mBAAmB,YAAY,cAAc,MAAM,MAAM,SAAS;EACvF,MAAM,WAAW,mBAAmB,YAAY,gBAAgB,MAAM,QAAQ,KAAK;EAGnF,MAAM,SAAS,eAAe,QAAQ,MAAM,MAAM,MAAM,IAAI,CAAC;EAC7D,MAAM,WAAW,eAAmC;GAClD,IAAI,MAAM,IAAI,OAAO,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK,QAAQ,MAAM,EAAE;GAC/E,OAAO,MAAM,OAAO,MAAM;EAC5B,CAAC;EAGD,MAAM,UAAU,eAAe,MAAM,YAAY,MAAM,OAAO;EAK9D,MAAM,iBAAiB,eAAgB,SAAS,UAAU,YAAY,MAAM,WAAY,OAAO,KAAA,CAAS;EACxG,MAAM,eAAe,eAAgB,MAAM,WAAY,OAAO,SAAS,MAAM,WAAa,SAAS,KAAA,CAAS;EAE5G,MAAM,iBAAiB,eAAe,MAAM,WAAW,MAAM,WAAW,WAAW,KAAA,EAAU;EAC7F,MAAM,cAAc,eAAe,MAAM,QAAQ,eAAe,UAAU,WAAW,wBAAwB,KAAA,EAAU;EAEvH,SAAS,eAAe,GAAqB;GAG3C,IAAI,QAAQ,OAAO;IACjB,EAAE,eAAe;IACjB,EAAE,yBAAyB;GAC7B;EACF;EAEA,MAAM,cAAc,eAAe;GACjC,IAAI,CAAC,SAAS,OAAO,OAAO,KAAA;GAS5B,MAAM,IAAI,UAPQ;IAChB,IAAI,aAAa,UAAU,MAAM,OAAO;IACxC,IAAI,aAAa,UAAU,MAAM,OAAO;IACxC,IAAI,aAAa,UAAU,MAAM,OAAO;IACxC,OAAO;GACT,EAAA,CAEa,EAAG;GAChB,OAAO;IACL,OAAO;IACP,UAAU;IACV,QAAQ;IACR,SAAS;GACX;EACF,CAAC;EAED,MAAM,YAAY,eAAe;GAC/B,OAAO,cAAc;IACnB,SAAS,gBAAgB;IACzB,MAAM,aAAa;IACnB,MAAM,aAAa;IACnB,QAAQ,SAAS;GACnB,CAAC;EACH,CAAC;;uBAIC,YAoBY,wBAnBL,SAAA,KAAQ,GAAA;IACb,kBAAA;IACC,mBAAiB,MAAA,eAAA;IACjB,gBAAc,MAAA,YAAA;IACd,MAAM,SAAA,UAAQ,WAAgB,MAAM,OAAO,KAAA;IAC3C,UAAU,eAAA;IACV,MAAM,OAAA,SAAM,CAAK,MAAM,WAAW,MAAM,OAAO,KAAA;IAC/C,QAAQ,OAAA,SAAM,CAAK,MAAM,WAAW,eAAA,QAAiB,KAAA;IACrD,KAAK,OAAA,SAAM,CAAK,MAAM,WAAW,YAAA,QAAc,KAAA;IAC/C,aAAW,MAAM,UAAO,SAAY,KAAA;IACpC,iBAAe,aAAA;IACf,cAAY,MAAM;IAClB,UAAU,OAAA,SAAU,MAAM,WAAQ,KAAQ,KAAA;IAC1C,OAAK,eAAA;KAAG,MAAA,iBAAA;KAAmB,UAAA;KAAW,QAAA,QAAO,uBAAA;IAAA,CAAA;IAC7C,OAAK,eAAE,YAAA,KAAW;IACH;;2BAEmE,CAAjE,MAAM,WAAA,UAAA,GAAxB,YAAmF,MAAA,qBAAA,GAAA;;KAAlD,OAAM;KAAuB,eAAY;wCAC1E,WAAQ,KAAA,QAAA,SAAA,CAAA,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { r as grButtonClass } from "../../chunks/grButtonStyles-
|
|
2
|
-
import { t as GrButton_default } from "./chunks/GrButton-
|
|
3
|
-
import { n as grButtonSafelist, t as grButtonClassTokens } from "../../chunks/safelist-
|
|
4
|
-
import { t as grButtonConfig } from "../../chunks/config-
|
|
1
|
+
import { r as grButtonClass } from "../../chunks/grButtonStyles-DRBgDmOp.js";
|
|
2
|
+
import { t as GrButton_default } from "./chunks/GrButton-DCi4CUpo.js";
|
|
3
|
+
import { n as grButtonSafelist, t as grButtonClassTokens } from "../../chunks/safelist-BvO8HPnE.js";
|
|
4
|
+
import { t as grButtonConfig } from "../../chunks/config-KXuionN3.js";
|
|
5
5
|
export { GrButton_default as GrButton, GrButton_default as default, grButtonClass, grButtonClassTokens, grButtonConfig, grButtonSafelist };
|
|
@@ -2,7 +2,7 @@ import { t as _plugin_vue_export_helper_default } from "../../../chunks/_plugin-
|
|
|
2
2
|
import { createElementBlock, openBlock, renderSlot } from "vue";
|
|
3
3
|
//#region src/components/GrCard/GrCard.vue
|
|
4
4
|
var _sfc_main = {};
|
|
5
|
-
var _hoisted_1 = { class: "rounded-[var(--gr-radius-lg)] border border-[var(--brd)] bg-[var(--card)] text-[var(--card-fg)] shadow-sm" };
|
|
5
|
+
var _hoisted_1 = { class: "rounded-[var(--gr-radius-lg)] border border-[var(--gr-brd)] bg-[var(--gr-card)] text-[var(--gr-card-fg)] shadow-sm" };
|
|
6
6
|
function _sfc_render(_ctx, _cache) {
|
|
7
7
|
return openBlock(), createElementBlock("div", _hoisted_1, [renderSlot(_ctx.$slots, "default")]);
|
|
8
8
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrCard-CxCjyHMb.js","names":[],"sources":["../../../../src/components/GrCard/GrCard.vue"],"sourcesContent":["<template>\n <div\n class=\"rounded-[var(--gr-radius-lg)] border border-[var(--gr-brd)] bg-[var(--gr-card)] text-[var(--gr-card-fg)] shadow-sm\"\n>\n <slot />\n </div>\n</template>"],"mappings":";;;;mBAEM,OAAM,qHAAoH;;qBAD9H,mBAIM,OAJN,YAIM,CADJ,WAAQ,KAAA,QAAA,SAAA,CAAA,CAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { t as GrCard_default } from "./chunks/GrCard-
|
|
1
|
+
import { t as GrCard_default } from "./chunks/GrCard-CxCjyHMb.js";
|
|
2
2
|
import { t as grCardConfig } from "../../chunks/config-CThzliFi.js";
|
|
3
3
|
export { GrCard_default as GrCard, GrCard_default as default, grCardConfig };
|
|
@@ -57,7 +57,7 @@ var _hoisted_2 = [
|
|
|
57
57
|
"required",
|
|
58
58
|
"form"
|
|
59
59
|
];
|
|
60
|
-
var _hoisted_3 = { class: "text-sm text-[var(--muted-fg)]" };
|
|
60
|
+
var _hoisted_3 = { class: "text-sm text-[var(--gr-muted-fg)]" };
|
|
61
61
|
//#endregion
|
|
62
62
|
//#region src/components/GrCheckbox/GrCheckbox.vue
|
|
63
63
|
var GrCheckbox_default = /* @__PURE__ */ defineComponent({
|
|
@@ -138,7 +138,7 @@ var GrCheckbox_default = /* @__PURE__ */ defineComponent({
|
|
|
138
138
|
return (_ctx, _cache) => {
|
|
139
139
|
return openBlock(), createElementBlock("div", {
|
|
140
140
|
"data-gr-checkbox": "",
|
|
141
|
-
class: normalizeClass(["inline-flex items-center gap-2 select-none focus-visible:outline-none focus-visible:rounded-[8px] focus-visible:shadow-[0_0_0_2px_var(--ring),0_0_0_4px_var(--bg)]", __props.disabled ? "cursor-not-allowed opacity-70" : "cursor-pointer"]),
|
|
141
|
+
class: normalizeClass(["inline-flex items-center gap-2 select-none focus-visible:outline-none focus-visible:rounded-[8px] focus-visible:shadow-[0_0_0_2px_var(--gr-ring),0_0_0_4px_var(--gr-bg)]", __props.disabled ? "cursor-not-allowed opacity-70" : "cursor-pointer"]),
|
|
142
142
|
role: "checkbox",
|
|
143
143
|
"aria-checked": __props.indeterminate ? "mixed" : __props.modelValue ? "true" : "false",
|
|
144
144
|
"aria-disabled": __props.disabled ? "true" : void 0,
|
|
@@ -165,13 +165,13 @@ var GrCheckbox_default = /* @__PURE__ */ defineComponent({
|
|
|
165
165
|
createElementVNode("span", {
|
|
166
166
|
"data-gr-checkbox-indicator": "",
|
|
167
167
|
"aria-hidden": "true",
|
|
168
|
-
class: normalizeClass(["h-4 w-4 rounded border flex items-center justify-center transition-colors duration-150", __props.modelValue || __props.indeterminate ? "border-[var(--primary)] bg-[var(--primary)]" : "border-[var(--brd)] bg-[var(--bg)]"])
|
|
168
|
+
class: normalizeClass(["h-4 w-4 rounded border flex items-center justify-center transition-colors duration-150", __props.modelValue || __props.indeterminate ? "border-[var(--gr-primary)] bg-[var(--gr-primary)]" : "border-[var(--gr-brd)] bg-[var(--gr-bg)]"])
|
|
169
169
|
}, [__props.indeterminate ? (openBlock(), createBlock(unref(minus_default), {
|
|
170
170
|
key: 0,
|
|
171
|
-
class: "gr-checkbox-icon h-3.5 w-3.5 text-[var(--primary-fg)]"
|
|
171
|
+
class: "gr-checkbox-icon h-3.5 w-3.5 text-[var(--gr-primary-fg)]"
|
|
172
172
|
})) : (openBlock(), createBlock(unref(check_default), {
|
|
173
173
|
key: 1,
|
|
174
|
-
class: normalizeClass(["gr-checkbox-icon h-3.5 w-3.5 transition-transform transition-opacity duration-150", __props.modelValue ? "opacity-100 scale-100 text-[var(--primary-fg)]" : "opacity-0 scale-75 text-transparent"])
|
|
174
|
+
class: normalizeClass(["gr-checkbox-icon h-3.5 w-3.5 transition-transform transition-opacity duration-150", __props.modelValue ? "opacity-100 scale-100 text-[var(--gr-primary-fg)]" : "opacity-0 scale-75 text-transparent"])
|
|
175
175
|
}, null, 8, ["class"]))], 2),
|
|
176
176
|
createElementVNode("span", _hoisted_3, [renderSlot(_ctx.$slots, "default")])
|
|
177
177
|
], 42, _hoisted_1);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrCheckbox-BbIDRXtl.js","names":[],"sources":["../../../../src/components/GrCheckbox/GrCheckbox.vue","../../../../src/components/GrCheckbox/GrCheckbox.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * GrCheckbox — GR-примитив чекбокса с нативным скрытым `<input type=\"checkbox\">`\n * для интеграции с HTML-формами (`FormData`, `required`, `form`).\n *\n * Источник истины — нативный input: клик по нему (в т.ч. по внешнему\n * `<label for=\"...\">`) слушается через `@change` и эмитит модель. Клик по видимой\n * части компонента переключает через корневой обработчик.\n *\n * Клавиатура: `Space` переключает значение (Enter — намеренно нет, это нестандартно\n * для чекбоксов). Фокус — на корневом элементе.\n * A11y: `role=\"checkbox\"` + `aria-checked` (`true`/`false`/`mixed`) + `aria-disabled`.\n */\nimport { onMounted, ref, watch } from 'vue'\nimport IconCheck from '~icons/lucide/check'\nimport IconMinus from '~icons/lucide/minus'\n\nexport interface GrCheckboxProps {\n modelValue?: boolean\n disabled?: boolean\n name?: string\n value?: string\n required?: boolean\n form?: string\n /** Пробрасывается на скрытый нативный `<input>`, чтобы работал `<label for=\"...\">`. */\n id?: string\n /** Промежуточное («смешанное») состояние: `aria-checked=\"mixed\"`, индикатор — тире. */\n indeterminate?: boolean\n}\n\nconst hiddenInputStyle = {\n position: 'absolute',\n opacity: '0',\n width: '0',\n height: '0',\n pointerEvents: 'none',\n} as const\n\nconst props = withDefaults(defineProps<GrCheckboxProps>(), {\n modelValue: false,\n disabled: false,\n name: undefined,\n value: 'on',\n required: false,\n form: undefined,\n id: undefined,\n indeterminate: false,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: boolean): void\n}>()\n\n// Держим `.checked` на нативном input синхронно с пропом — `:checked`-биндинг\n// на скрытом элементе иногда отстаёт при программных обновлениях.\nconst nativeInput = ref<HTMLInputElement | null>(null)\nwatch(\n () => props.modelValue,\n (value) => {\n if (nativeInput.value && nativeInput.value.checked !== value)\n nativeInput.value.checked = value\n },\n)\n\n// `indeterminate` можно выставить только через JS-свойство (не атрибут).\nfunction syncIndeterminate(): void {\n if (nativeInput.value)\n nativeInput.value.indeterminate = props.indeterminate\n}\nwatch(() => props.indeterminate, syncIndeterminate)\nonMounted(syncIndeterminate)\n\nfunction setChecked(next: boolean): void {\n if (props.disabled)\n return\n emit('update:modelValue', next)\n}\n\nfunction toggle(): void {\n // Из промежуточного состояния переключаемся во «включено» (стандартное поведение).\n setChecked(props.indeterminate ? true : !props.modelValue)\n}\n\n// Клик по нативному input (в т.ч. по внешнему `<label for=\"...\">`) уже переключил его\n// `.checked` — берём значение как источник истины и эмитим модель.\nfunction onNativeChange(e: Event): void {\n setChecked((e.target as HTMLInputElement).checked)\n}\n\nfunction isInteractiveTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el)\n return false\n return !!el.closest('a,button,input,select,textarea,label,[role=\"button\"],[role=\"link\"]')\n}\n\nfunction onClick(e: MouseEvent): void {\n if (isInteractiveTarget(e.target))\n return\n toggle()\n}\n</script>\n<template>\n <div\n data-gr-checkbox\n class=\"inline-flex items-center gap-2 select-none focus-visible:outline-none focus-visible:rounded-[8px] focus-visible:shadow-[0_0_0_2px_var(--gr-ring),0_0_0_4px_var(--gr-bg)]\"\n role=\"checkbox\"\n :aria-checked=\"indeterminate ? 'mixed' : (modelValue ? 'true' : 'false')\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n :tabindex=\"disabled ? -1 : 0\"\n :class=\"disabled ? 'cursor-not-allowed opacity-70' : 'cursor-pointer'\"\n @click=\"onClick\"\n @keydown.space.prevent=\"toggle\"\n >\n <input\n :id=\"id\"\n ref=\"nativeInput\"\n type=\"checkbox\"\n :checked=\"modelValue\"\n :disabled=\"disabled\"\n :name=\"name\"\n :value=\"value\"\n :required=\"required\"\n :form=\"form\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :style=\"hiddenInputStyle\"\n @change=\"onNativeChange\"\n >\n <span\n data-gr-checkbox-indicator\n aria-hidden=\"true\"\n class=\"h-4 w-4 rounded border flex items-center justify-center transition-colors duration-150\"\n :class=\"(modelValue || indeterminate)\n ? 'border-[var(--gr-primary)] bg-[var(--gr-primary)]'\n : 'border-[var(--gr-brd)] bg-[var(--gr-bg)]'\"\n >\n <IconMinus\n v-if=\"indeterminate\"\n class=\"gr-checkbox-icon h-3.5 w-3.5 text-[var(--gr-primary-fg)]\"\n />\n <IconCheck\n v-else\n class=\"gr-checkbox-icon h-3.5 w-3.5 transition-transform transition-opacity duration-150\"\n :class=\"modelValue\n ? 'opacity-100 scale-100 text-[var(--gr-primary-fg)]'\n : 'opacity-0 scale-75 text-transparent'\"\n />\n </span>\n <span class=\"text-sm text-[var(--gr-muted-fg)]\">\n <slot />\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * GrCheckbox — GR-примитив чекбокса с нативным скрытым `<input type=\"checkbox\">`\n * для интеграции с HTML-формами (`FormData`, `required`, `form`).\n *\n * Источник истины — нативный input: клик по нему (в т.ч. по внешнему\n * `<label for=\"...\">`) слушается через `@change` и эмитит модель. Клик по видимой\n * части компонента переключает через корневой обработчик.\n *\n * Клавиатура: `Space` переключает значение (Enter — намеренно нет, это нестандартно\n * для чекбоксов). Фокус — на корневом элементе.\n * A11y: `role=\"checkbox\"` + `aria-checked` (`true`/`false`/`mixed`) + `aria-disabled`.\n */\nimport { onMounted, ref, watch } from 'vue'\nimport IconCheck from '~icons/lucide/check'\nimport IconMinus from '~icons/lucide/minus'\n\nexport interface GrCheckboxProps {\n modelValue?: boolean\n disabled?: boolean\n name?: string\n value?: string\n required?: boolean\n form?: string\n /** Пробрасывается на скрытый нативный `<input>`, чтобы работал `<label for=\"...\">`. */\n id?: string\n /** Промежуточное («смешанное») состояние: `aria-checked=\"mixed\"`, индикатор — тире. */\n indeterminate?: boolean\n}\n\nconst hiddenInputStyle = {\n position: 'absolute',\n opacity: '0',\n width: '0',\n height: '0',\n pointerEvents: 'none',\n} as const\n\nconst props = withDefaults(defineProps<GrCheckboxProps>(), {\n modelValue: false,\n disabled: false,\n name: undefined,\n value: 'on',\n required: false,\n form: undefined,\n id: undefined,\n indeterminate: false,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: boolean): void\n}>()\n\n// Держим `.checked` на нативном input синхронно с пропом — `:checked`-биндинг\n// на скрытом элементе иногда отстаёт при программных обновлениях.\nconst nativeInput = ref<HTMLInputElement | null>(null)\nwatch(\n () => props.modelValue,\n (value) => {\n if (nativeInput.value && nativeInput.value.checked !== value)\n nativeInput.value.checked = value\n },\n)\n\n// `indeterminate` можно выставить только через JS-свойство (не атрибут).\nfunction syncIndeterminate(): void {\n if (nativeInput.value)\n nativeInput.value.indeterminate = props.indeterminate\n}\nwatch(() => props.indeterminate, syncIndeterminate)\nonMounted(syncIndeterminate)\n\nfunction setChecked(next: boolean): void {\n if (props.disabled)\n return\n emit('update:modelValue', next)\n}\n\nfunction toggle(): void {\n // Из промежуточного состояния переключаемся во «включено» (стандартное поведение).\n setChecked(props.indeterminate ? true : !props.modelValue)\n}\n\n// Клик по нативному input (в т.ч. по внешнему `<label for=\"...\">`) уже переключил его\n// `.checked` — берём значение как источник истины и эмитим модель.\nfunction onNativeChange(e: Event): void {\n setChecked((e.target as HTMLInputElement).checked)\n}\n\nfunction isInteractiveTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el)\n return false\n return !!el.closest('a,button,input,select,textarea,label,[role=\"button\"],[role=\"link\"]')\n}\n\nfunction onClick(e: MouseEvent): void {\n if (isInteractiveTarget(e.target))\n return\n toggle()\n}\n</script>\n<template>\n <div\n data-gr-checkbox\n class=\"inline-flex items-center gap-2 select-none focus-visible:outline-none focus-visible:rounded-[8px] focus-visible:shadow-[0_0_0_2px_var(--gr-ring),0_0_0_4px_var(--gr-bg)]\"\n role=\"checkbox\"\n :aria-checked=\"indeterminate ? 'mixed' : (modelValue ? 'true' : 'false')\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n :tabindex=\"disabled ? -1 : 0\"\n :class=\"disabled ? 'cursor-not-allowed opacity-70' : 'cursor-pointer'\"\n @click=\"onClick\"\n @keydown.space.prevent=\"toggle\"\n >\n <input\n :id=\"id\"\n ref=\"nativeInput\"\n type=\"checkbox\"\n :checked=\"modelValue\"\n :disabled=\"disabled\"\n :name=\"name\"\n :value=\"value\"\n :required=\"required\"\n :form=\"form\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :style=\"hiddenInputStyle\"\n @change=\"onNativeChange\"\n >\n <span\n data-gr-checkbox-indicator\n aria-hidden=\"true\"\n class=\"h-4 w-4 rounded border flex items-center justify-center transition-colors duration-150\"\n :class=\"(modelValue || indeterminate)\n ? 'border-[var(--gr-primary)] bg-[var(--gr-primary)]'\n : 'border-[var(--gr-brd)] bg-[var(--gr-bg)]'\"\n >\n <IconMinus\n v-if=\"indeterminate\"\n class=\"gr-checkbox-icon h-3.5 w-3.5 text-[var(--gr-primary-fg)]\"\n />\n <IconCheck\n v-else\n class=\"gr-checkbox-icon h-3.5 w-3.5 transition-transform transition-opacity duration-150\"\n :class=\"modelValue\n ? 'opacity-100 scale-100 text-[var(--gr-primary-fg)]'\n : 'opacity-0 scale-75 text-transparent'\"\n />\n </span>\n <span class=\"text-sm text-[var(--gr-muted-fg)]\">\n <slot />\n </span>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BA,MAAM,mBAAmB;GACvB,UAAU;GACV,SAAS;GACT,OAAO;GACP,QAAQ;GACR,eAAe;EACjB;EAEA,MAAM,QAAQ;EAWd,MAAM,OAAO;EAMb,MAAM,cAAc,IAA6B,IAAI;EACrD,YACQ,MAAM,aACX,UAAU;GACT,IAAI,YAAY,SAAS,YAAY,MAAM,YAAY,OACrD,YAAY,MAAM,UAAU;EAChC,CACF;EAGA,SAAS,oBAA0B;GACjC,IAAI,YAAY,OACd,YAAY,MAAM,gBAAgB,MAAM;EAC5C;EACA,YAAY,MAAM,eAAe,iBAAiB;EAClD,UAAU,iBAAiB;EAE3B,SAAS,WAAW,MAAqB;GACvC,IAAI,MAAM,UACR;GACF,KAAK,qBAAqB,IAAI;EAChC;EAEA,SAAS,SAAe;GAEtB,WAAW,MAAM,gBAAgB,OAAO,CAAC,MAAM,UAAU;EAC3D;EAIA,SAAS,eAAe,GAAgB;GACtC,WAAY,EAAE,OAA4B,OAAO;EACnD;EAEA,SAAS,oBAAoB,QAAqC;GAChE,MAAM,KAAK;GACX,IAAI,CAAC,IACH,OAAO;GACT,OAAO,CAAC,CAAC,GAAG,QAAQ,wEAAoE;EAC1F;EAEA,SAAS,QAAQ,GAAqB;GACpC,IAAI,oBAAoB,EAAE,MAAM,GAC9B;GACF,OAAO;EACT;;uBAGE,mBAiDM,OAAA;IAhDJ,oBAAA;IACA,OAAK,eAAA,CAAC,4KAKE,QAAA,WAAQ,kCAAA,gBAAA,CAAA;IAJhB,MAAK;IACJ,gBAAc,QAAA,gBAAa,UAAc,QAAA,aAAU,SAAA;IACnD,iBAAe,QAAA,WAAQ,SAAY,KAAA;IACnC,UAAU,QAAA,WAAQ,KAAA;IAEX;IACP,WAAO,SAAA,cAAgB,QAAM,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;;IAE9B,mBAcC,SAAA;KAbE,IAAI,QAAA;cACD;KAAJ,KAAI;KACJ,MAAK;KACJ,SAAS,QAAA;KACT,UAAU,QAAA;KACV,MAAM,QAAA;KACN,OAAO,QAAA;KACP,UAAU,QAAA;KACV,MAAM,QAAA;KACP,UAAS;KACT,eAAY;KACX,OAAO;KACP,UAAQ;;IAEX,mBAmBO,QAAA;KAlBL,8BAAA;KACA,eAAY;KACZ,OAAK,eAAA,CAAC,0FACG,QAAA,cAAc,QAAA,gBAAA,sDAAA,0CAAA,CAAA;QAKf,QAAA,iBAAA,UAAA,GADR,YAGE,MAAA,aAAA,GAAA;;KADA,OAAM;wBAER,YAME,MAAA,aAAA,GAAA;;KAJA,OAAK,eAAA,CAAC,qFACE,QAAA,aAAA,sDAAA,qCAAA,CAAA;;IAKZ,mBAEO,QAFP,YAEO,CADL,WAAQ,KAAA,QAAA,SAAA,CAAA,CAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { t as GrCheckbox_default } from "./chunks/GrCheckbox-
|
|
1
|
+
import { t as GrCheckbox_default } from "./chunks/GrCheckbox-BbIDRXtl.js";
|
|
2
2
|
import { t as grCheckboxConfig } from "../../chunks/config-DICOd-2X.js";
|
|
3
3
|
export { GrCheckbox_default as GrCheckbox, GrCheckbox_default as default, grCheckboxConfig };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as GrCard_default } from "../../GrCard/chunks/GrCard-
|
|
1
|
+
import { t as GrCard_default } from "../../GrCard/chunks/GrCard-CxCjyHMb.js";
|
|
2
2
|
import { t as GrIcon_default } from "../../GrIcon/chunks/GrIcon-D9AWQLk2.js";
|
|
3
3
|
import { computed, createBlock, createElementBlock, createElementVNode, createVNode, defineComponent, getCurrentInstance, inject, markRaw, normalizeClass, openBlock, provide, ref, renderSlot, toDisplayString, unref, withCtx } from "vue";
|
|
4
4
|
//#region src/components/GrCollapse/grCollapseContext.ts
|
|
@@ -57,7 +57,7 @@ var GrCollapse_default = /* @__PURE__ */ defineComponent({
|
|
|
57
57
|
});
|
|
58
58
|
return (_ctx, _cache) => {
|
|
59
59
|
return openBlock(), createBlock(unref(GrCard_default), { "data-gr-collapse": "" }, {
|
|
60
|
-
default: withCtx(() => [createElementVNode("div", { class: normalizeClass(__props.divided ? "divide-y divide-[var(--brd)]" : "") }, [renderSlot(_ctx.$slots, "default")], 2)]),
|
|
60
|
+
default: withCtx(() => [createElementVNode("div", { class: normalizeClass(__props.divided ? "divide-y divide-[var(--gr-brd)]" : "") }, [renderSlot(_ctx.$slots, "default")], 2)]),
|
|
61
61
|
_: 3
|
|
62
62
|
});
|
|
63
63
|
};
|
|
@@ -88,14 +88,14 @@ var chevron_down_default = markRaw({
|
|
|
88
88
|
//#region src/components/GrCollapse/GrCollapseItem.vue?vue&type=script&setup=true&lang.ts
|
|
89
89
|
var _hoisted_1 = {
|
|
90
90
|
"data-gr-collapse-item": "",
|
|
91
|
-
class: "text-[var(--fg)]"
|
|
91
|
+
class: "text-[var(--gr-fg)]"
|
|
92
92
|
};
|
|
93
93
|
var _hoisted_2 = { class: "m-0" };
|
|
94
94
|
var _hoisted_3 = ["aria-expanded", "disabled"];
|
|
95
95
|
var _hoisted_4 = { class: "min-w-0" };
|
|
96
96
|
var _hoisted_5 = { class: "text-sm font-600" };
|
|
97
97
|
var _hoisted_6 = { class: "overflow-hidden" };
|
|
98
|
-
var _hoisted_7 = { class: "px-4 pb-4 text-sm text-[var(--muted-fg)]" };
|
|
98
|
+
var _hoisted_7 = { class: "px-4 pb-4 text-sm text-[var(--gr-muted-fg)]" };
|
|
99
99
|
//#endregion
|
|
100
100
|
//#region src/components/GrCollapse/GrCollapseItem.vue
|
|
101
101
|
var GrCollapseItem_default = /* @__PURE__ */ defineComponent({
|
|
@@ -181,14 +181,14 @@ var GrCollapseItem_default = /* @__PURE__ */ defineComponent({
|
|
|
181
181
|
"aria-expanded": expanded.value ? "true" : "false",
|
|
182
182
|
"aria-controls": panelId,
|
|
183
183
|
disabled: resolvedDisabled.value,
|
|
184
|
-
class: normalizeClass(["w-full px-4 py-3 flex items-center justify-between gap-4 text-left transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] disabled:opacity-50 disabled:cursor-not-allowed", resolvedDisabled.value ? "" : "hover:bg-[var(--muted)]"]),
|
|
184
|
+
class: normalizeClass(["w-full px-4 py-3 flex items-center justify-between gap-4 text-left transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] disabled:opacity-50 disabled:cursor-not-allowed", resolvedDisabled.value ? "" : "hover:bg-[var(--gr-muted)]"]),
|
|
185
185
|
onClick: onToggle,
|
|
186
186
|
onKeydown
|
|
187
187
|
}, [createElementVNode("span", _hoisted_4, [renderSlot(_ctx.$slots, "title", {}, () => [createElementVNode("span", _hoisted_5, toDisplayString(__props.title), 1)])]), createVNode(unref(GrIcon_default), {
|
|
188
188
|
size: "sm",
|
|
189
189
|
"aria-hidden": "true",
|
|
190
190
|
"data-gr-collapse-chevron": "",
|
|
191
|
-
class: normalizeClass(["shrink-0 transition-transform duration-150 text-[var(--muted-fg)]", expanded.value ? "rotate-180" : ""])
|
|
191
|
+
class: normalizeClass(["shrink-0 transition-transform duration-150 text-[var(--gr-muted-fg)]", expanded.value ? "rotate-180" : ""])
|
|
192
192
|
}, {
|
|
193
193
|
default: withCtx(() => [createVNode(unref(chevron_down_default))]),
|
|
194
194
|
_: 1
|