@feugene/granularity 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/GrBadge.css +1 -1
- package/dist/GrFormFile.css +1 -1
- package/dist/GrToaster.css +1 -1
- package/dist/GrTree.css +1 -1
- package/dist/chunks/{config-ClhKPJvg.js → config-23WtUiAL.js} +1 -1
- package/dist/chunks/config-23WtUiAL.js.map +1 -0
- package/dist/chunks/config-8Pcutu1j.js.map +1 -0
- package/dist/chunks/{config-1uSYl98Y2.js → config-B0i5r8kH.js} +1 -1
- package/dist/chunks/config-B0i5r8kH.js.map +1 -0
- package/dist/chunks/{config-BOlr7qw7.js → config-B5Rknzkd.js} +33 -39
- package/dist/chunks/config-B5Rknzkd.js.map +1 -0
- package/dist/chunks/config-B7W9VlZ7.js +5 -0
- package/dist/chunks/config-B7W9VlZ7.js.map +1 -0
- package/dist/chunks/config-BDSHekVC.js +84 -0
- package/dist/chunks/config-BDSHekVC.js.map +1 -0
- package/dist/chunks/config-BLHqZhy-.js.map +1 -0
- package/dist/chunks/{config-eYLZYOUS2.js → config-BMKNHFMD2.js} +15 -15
- package/dist/chunks/config-BMKNHFMD2.js.map +1 -0
- package/dist/chunks/config-BUHuGBik2.js.map +1 -0
- package/dist/chunks/config-BX1JTrkV.js.map +1 -0
- package/dist/chunks/config-BXtAmU3s.js.map +1 -0
- package/dist/chunks/config-BZFUM3Ky.js +75 -0
- package/dist/chunks/config-BZFUM3Ky.js.map +1 -0
- package/dist/chunks/{config-DUcu1D682.js → config-BmNT0Fmx.js} +2 -2
- package/dist/chunks/config-BmNT0Fmx.js.map +1 -0
- package/dist/chunks/{config-C49QUoJL.js → config-BvVq2gbd.js} +1 -1
- package/dist/chunks/{config-C49QUoJL.js.map → config-BvVq2gbd.js.map} +1 -1
- package/dist/chunks/{config-CrG1XiE72.js → config-C4hJxXDa.js} +5 -5
- package/dist/chunks/config-C4hJxXDa.js.map +1 -0
- package/dist/chunks/config-CB4RVt9M.js +66 -0
- package/dist/chunks/config-CB4RVt9M.js.map +1 -0
- package/dist/chunks/config-CGHLoBlH2.js.map +1 -0
- package/dist/chunks/config-COE_vZ-l.js +52 -0
- package/dist/chunks/config-COE_vZ-l.js.map +1 -0
- package/dist/chunks/{config-CziwTDDL.js → config-CPdmr7tC.js} +1 -1
- package/dist/chunks/{config-CziwTDDL.js.map → config-CPdmr7tC.js.map} +1 -1
- package/dist/chunks/{config-BIRO0vDJ.js → config-DPDFYzIa.js} +2 -2
- package/dist/chunks/config-DPDFYzIa.js.map +1 -0
- package/dist/chunks/{config-DnvPqu4g2.js → config-DRKXJ9PW2.js} +1 -1
- package/dist/chunks/{config-DnvPqu4g2.js.map → config-DRKXJ9PW2.js.map} +1 -1
- package/dist/chunks/config-DToHb81g.js +45 -0
- package/dist/chunks/config-DToHb81g.js.map +1 -0
- package/dist/chunks/{config-jBp9wVv-.js → config-D_myOZbA.js} +1 -1
- package/dist/chunks/{config-jBp9wVv-.js.map → config-D_myOZbA.js.map} +1 -1
- package/dist/chunks/{config-D_R56_gT.js → config-Dg_6FTvJ.js} +1 -1
- package/dist/chunks/config-Dg_6FTvJ.js.map +1 -0
- package/dist/chunks/config-Dqy0rPPO2.js.map +1 -0
- package/dist/chunks/config-Droqn55j.js +8 -0
- package/dist/chunks/config-Droqn55j.js.map +1 -0
- package/dist/chunks/config-JpHA4Xx0.js.map +1 -0
- package/dist/chunks/{config-C4snOIXg.js → config-KXuionN3.js} +1 -1
- package/dist/chunks/{config-C4snOIXg.js.map → config-KXuionN3.js.map} +1 -1
- package/dist/chunks/{config-DezDih8_.js → config-LqDC_rvp.js} +2 -2
- package/dist/chunks/config-LqDC_rvp.js.map +1 -0
- package/dist/chunks/config-QaIc_gRa2.js.map +1 -0
- package/dist/chunks/config-U4m9PSql2.js.map +1 -0
- package/dist/chunks/{config-B7IIWGt_2.js → config-XmTv4pnI.js} +2 -2
- package/dist/chunks/config-XmTv4pnI.js.map +1 -0
- package/dist/chunks/config-eXB87DOi.js.map +1 -0
- package/dist/chunks/{config-C7NpDrfO.js → config-gZWR75Bh2.js} +1 -1
- package/dist/chunks/config-gZWR75Bh2.js.map +1 -0
- package/dist/chunks/config-ipvU0lzP.js.map +1 -0
- package/dist/chunks/config-xR4XVmcy2.js.map +1 -0
- package/dist/chunks/context-Bfrgsluh.js +9 -0
- package/dist/chunks/context-Bfrgsluh.js.map +1 -0
- package/dist/chunks/context-DfWYCBB-.js +129 -0
- package/dist/chunks/context-DfWYCBB-.js.map +1 -0
- package/dist/chunks/{en-CfkDa4GX.js → en-Cr6EkG8c.js} +46 -4
- package/dist/chunks/en-Cr6EkG8c.js.map +1 -0
- package/dist/chunks/{es-CgaLnFYx.js → es-DuYb1Qju.js} +3 -3
- package/dist/chunks/{es-CgaLnFYx.js.map → es-DuYb1Qju.js.map} +1 -1
- package/dist/chunks/{es-FkgECuCm.js → es-i08e9Sdo.js} +46 -4
- package/dist/chunks/es-i08e9Sdo.js.map +1 -0
- package/dist/chunks/{grBadgeStyles-DrycBuKT.js → grBadgeStyles-D3dFjr_N.js} +12 -12
- package/dist/chunks/grBadgeStyles-D3dFjr_N.js.map +1 -0
- package/dist/chunks/{grButtonStyles-C7Yga_Q1.js → grButtonStyles-DRBgDmOp.js} +28 -28
- package/dist/chunks/grButtonStyles-DRBgDmOp.js.map +1 -0
- package/dist/chunks/{grDropdownStyles-B_-DKytw.js → grDropdownStyles-HBPkghVr.js} +2 -2
- package/dist/chunks/{grDropdownStyles-B_-DKytw.js.map → grDropdownStyles-HBPkghVr.js.map} +1 -1
- package/dist/chunks/{grModalStyles-DWd3i05Q.js → grModalStyles-D8-shx9A.js} +1 -1
- package/dist/chunks/grModalStyles-D8-shx9A.js.map +1 -0
- package/dist/chunks/{grSelectStyles-CLK5hRd3.js → grSelectStyles-CwMUQrBZ.js} +12 -12
- package/dist/chunks/grSelectStyles-CwMUQrBZ.js.map +1 -0
- package/dist/chunks/{grStyle-Blc9otAx.js → grStyle-CdvxTXPH.js} +2 -2
- package/dist/chunks/grStyle-CdvxTXPH.js.map +1 -0
- package/dist/chunks/{granularityI18n-DoV7Ca2m.js → granularityI18n-SH0I--GW.js} +1 -1
- package/dist/chunks/{granularityI18n-DoV7Ca2m.js.map → granularityI18n-SH0I--GW.js.map} +1 -1
- package/dist/chunks/{ru-Bl8CxpEa.js → ru-B5XOOYZt.js} +46 -4
- package/dist/chunks/ru-B5XOOYZt.js.map +1 -0
- package/dist/chunks/{safelist-Do2RtzLB.js → safelist-BvO8HPnE.js} +1 -1
- package/dist/chunks/{safelist-Do2RtzLB.js.map → safelist-BvO8HPnE.js.map} +1 -1
- package/dist/chunks/shared-D-v9lit0.js +188 -0
- package/dist/chunks/shared-D-v9lit0.js.map +1 -0
- package/dist/components/GrAlert/chunks/GrAlert-B9gmpoPC.js +251 -0
- package/dist/components/GrAlert/chunks/GrAlert-B9gmpoPC.js.map +1 -0
- package/dist/components/GrAlert/index.js +2 -2
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-BVLoQ5tZ.js +499 -0
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-BVLoQ5tZ.js.map +1 -0
- package/dist/components/GrAutocomplete/index.js +3 -0
- package/dist/components/GrAvatar/chunks/{GrAvatar-96CpTCq5.js → GrAvatar-CTOUVBF7.js} +1 -1
- package/dist/components/GrAvatar/chunks/GrAvatar-CTOUVBF7.js.map +1 -0
- package/dist/components/GrAvatar/index.js +1 -1
- package/dist/components/GrBadge/chunks/{GrBadge-B77XlaqE.js → GrBadge-D1jefy4S.js} +12 -8
- package/dist/components/GrBadge/chunks/GrBadge-D1jefy4S.js.map +1 -0
- package/dist/components/GrBadge/index.js +2 -2
- package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-CcktMOdg.js → GrBadgeWrap-DWDxHdiQ.js} +1 -1
- package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-DWDxHdiQ.js.map +1 -0
- package/dist/components/GrBadgeWrap/index.js +1 -1
- package/dist/components/GrBottomNav/chunks/{GrBottomNav-usuMgG8_.js → GrBottomNav-vSE4LXmk.js} +2 -2
- package/dist/components/GrBottomNav/chunks/GrBottomNav-vSE4LXmk.js.map +1 -0
- package/dist/components/GrBottomNav/index.js +1 -1
- package/dist/components/GrButton/chunks/{GrButton-BlffdeJr.js → GrButton-DCi4CUpo.js} +18 -14
- package/dist/components/GrButton/chunks/GrButton-DCi4CUpo.js.map +1 -0
- package/dist/components/GrButton/index.js +4 -4
- package/dist/components/GrCard/chunks/{GrCard-DUNMkuHW.js → GrCard-CxCjyHMb.js} +1 -1
- package/dist/components/GrCard/chunks/GrCard-CxCjyHMb.js.map +1 -0
- package/dist/components/GrCard/index.js +1 -1
- package/dist/components/GrCheckbox/chunks/{GrCheckbox-DJhzZZdO.js → GrCheckbox-BbIDRXtl.js} +5 -5
- package/dist/components/GrCheckbox/chunks/GrCheckbox-BbIDRXtl.js.map +1 -0
- package/dist/components/GrCheckbox/index.js +1 -1
- package/dist/components/GrCollapse/chunks/{GrCollapse-CPPLh_xU.js → GrCollapse-DApXztn8.js} +6 -6
- package/dist/components/GrCollapse/chunks/GrCollapse-DApXztn8.js.map +1 -0
- package/dist/components/GrCollapse/index.js +2 -2
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-6OyvNbek.js +410 -0
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-6OyvNbek.js.map +1 -0
- package/dist/components/GrCommandPalette/index.js +3 -0
- package/dist/components/GrConfigProvider/chunks/GrConfigProvider-BtyeBGm8.js +57 -0
- package/dist/components/GrConfigProvider/chunks/GrConfigProvider-BtyeBGm8.js.map +1 -0
- package/dist/components/GrConfigProvider/index.js +4 -0
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-D8CkOtqv.js → GrConfirmDialog-e4120mWw.js} +5 -5
- package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-e4120mWw.js.map +1 -0
- package/dist/components/GrConfirmDialog/index.js +2 -2
- package/dist/components/GrDataTable/chunks/{GrDataTable-Ds5OeGat.js → GrDataTable-C1CzxV0p.js} +127 -25
- package/dist/components/GrDataTable/chunks/GrDataTable-C1CzxV0p.js.map +1 -0
- package/dist/components/GrDataTable/index.js +2 -2
- package/dist/components/GrDialog/chunks/{GrDialog-Ctucxju9.js → GrDialog-BPMvDHOz.js} +5 -5
- package/dist/components/GrDialog/chunks/GrDialog-BPMvDHOz.js.map +1 -0
- package/dist/components/GrDialog/index.js +1 -1
- package/dist/components/GrDialogService/chunks/{GrDialogService-CU1Fbonc.js → GrDialogService-CYXCTGm3.js} +36 -11
- package/dist/components/GrDialogService/chunks/GrDialogService-CYXCTGm3.js.map +1 -0
- package/dist/components/GrDialogService/index.js +2 -2
- package/dist/components/GrDivider/chunks/{GrDivider-5bcE-BB4.js → GrDivider-BdENZ1w0.js} +5 -5
- package/dist/components/GrDivider/chunks/GrDivider-BdENZ1w0.js.map +1 -0
- package/dist/components/GrDivider/index.js +1 -1
- package/dist/components/GrDrawer/chunks/{GrDrawer-SLGKCY2A.js → GrDrawer-KevdZ5BB.js} +5 -5
- package/dist/components/GrDrawer/chunks/GrDrawer-KevdZ5BB.js.map +1 -0
- package/dist/components/GrDrawer/index.js +2 -2
- package/dist/components/GrDropdown/chunks/{GrDropdown-BnDMYP8v.js → GrDropdown-BKoy8hm-.js} +1 -1
- package/dist/components/GrDropdown/chunks/{GrDropdown-BnDMYP8v.js.map → GrDropdown-BKoy8hm-.js.map} +1 -1
- package/dist/components/GrDropdown/index.js +2 -2
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu--g9Vofcq.js → GrDropdownMenu-zCatXzmt.js} +11 -11
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-zCatXzmt.js.map +1 -0
- package/dist/components/GrDropdownMenu/index.js +1 -1
- package/dist/components/GrEmptyState/chunks/{GrEmptyState-CA3BiTV7.js → GrEmptyState-CNb0BzjG.js} +3 -3
- package/dist/components/GrEmptyState/chunks/GrEmptyState-CNb0BzjG.js.map +1 -0
- package/dist/components/GrEmptyState/index.js +1 -1
- package/dist/components/GrFileUpload/chunks/{GrFileUpload-DvWPpiJS.js → GrFileUpload-CnLgUGDF.js} +12 -12
- package/dist/components/GrFileUpload/chunks/GrFileUpload-CnLgUGDF.js.map +1 -0
- package/dist/components/GrFileUpload/index.js +1 -1
- package/dist/components/GrForm/chunks/GrForm-CdaFjcyl.js +234 -0
- package/dist/components/GrForm/chunks/GrForm-CdaFjcyl.js.map +1 -0
- package/dist/components/GrForm/index.js +4 -0
- package/dist/components/GrFormField/chunks/{GrFormField-DnfMHx_U.js → GrFormField-CXCDBd99.js} +41 -14
- package/dist/components/GrFormField/chunks/GrFormField-CXCDBd99.js.map +1 -0
- package/dist/components/GrFormField/index.js +1 -1
- package/dist/components/GrFormFile/chunks/{GrFormFile-CXcqqdvV.js → GrFormFile-CqacSbUl.js} +9 -9
- package/dist/components/GrFormFile/chunks/GrFormFile-CqacSbUl.js.map +1 -0
- package/dist/components/GrFormFile/index.js +1 -1
- package/dist/components/GrFormSection/chunks/{GrFormSection-Ce21jcgo.js → GrFormSection-C3w9DQJf.js} +1 -1
- package/dist/components/GrFormSection/chunks/GrFormSection-C3w9DQJf.js.map +1 -0
- package/dist/components/GrFormSection/index.js +1 -1
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-Dla9IBkd.js → GrImageViewer-DDLJkvIU.js} +1 -1
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-Dla9IBkd.js.map → GrImageViewer-DDLJkvIU.js.map} +1 -1
- package/dist/components/GrImageViewer/index.js +1 -1
- package/dist/components/GrInput/chunks/{GrInput-B8dd3JaA.js → GrInput-C1VBL0dg.js} +18 -15
- package/dist/components/GrInput/chunks/GrInput-C1VBL0dg.js.map +1 -0
- package/dist/components/GrInput/index.js +2 -2
- package/dist/components/GrInputTag/chunks/{GrInputTag-zMgFqp2g.js → GrInputTag-BMk9jm42.js} +6 -6
- package/dist/components/GrInputTag/chunks/GrInputTag-BMk9jm42.js.map +1 -0
- package/dist/components/GrInputTag/index.js +2 -2
- package/dist/components/GrKbd/chunks/{GrKbd-BEoYxWhE.js → GrKbd-DTspwtoN.js} +1 -1
- package/dist/components/GrKbd/chunks/GrKbd-DTspwtoN.js.map +1 -0
- package/dist/components/GrKbd/index.js +1 -1
- package/dist/components/GrLink/chunks/{GrLink-CYUe-Q8k.js → GrLink-BP0YrnL9.js} +1 -1
- package/dist/components/GrLink/chunks/{GrLink-CYUe-Q8k.js.map → GrLink-BP0YrnL9.js.map} +1 -1
- package/dist/components/GrLink/index.js +2 -2
- package/dist/components/GrList/chunks/{GrList-Dx772Ns4.js → GrList-5RA-tZzE.js} +3 -3
- package/dist/components/GrList/chunks/GrList-5RA-tZzE.js.map +1 -0
- package/dist/components/GrList/index.js +1 -1
- package/dist/components/GrLoading/chunks/{GrLoading--X_7rdbb.js → GrLoading-fRDtVfi7.js} +3 -3
- package/dist/components/GrLoading/chunks/GrLoading-fRDtVfi7.js.map +1 -0
- package/dist/components/GrLoading/index.js +2 -2
- package/dist/components/GrModal/chunks/{GrModal-C0GZrHN3.js → GrModal-BTu1-5eY.js} +1 -1
- package/dist/components/GrModal/chunks/{GrModal-C0GZrHN3.js.map → GrModal-BTu1-5eY.js.map} +1 -1
- package/dist/components/GrModal/index.js +3 -3
- package/dist/components/GrNavbar/chunks/{GrNavbar-DW3MiIIf.js → GrNavbar-keKT_mIM.js} +3 -3
- package/dist/components/GrNavbar/chunks/GrNavbar-keKT_mIM.js.map +1 -0
- package/dist/components/GrNavbar/index.js +1 -1
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-DxCEvL7V.js → GrNumberInput-l9ZOHG9D.js} +19 -17
- package/dist/components/GrNumberInput/chunks/GrNumberInput-l9ZOHG9D.js.map +1 -0
- package/dist/components/GrNumberInput/index.js +2 -2
- package/dist/components/GrPagination/chunks/{GrPagination-mlyfLjQY.js → GrPagination-C5Y69CuK.js} +59 -16
- package/dist/components/GrPagination/chunks/GrPagination-C5Y69CuK.js.map +1 -0
- package/dist/components/GrPagination/index.js +2 -2
- package/dist/components/GrProgressBar/chunks/{GrProgressBar-CC3z-Zqp.js → GrProgressBar-Dqg4Fj9S.js} +2 -2
- package/dist/components/GrProgressBar/chunks/GrProgressBar-Dqg4Fj9S.js.map +1 -0
- package/dist/components/GrProgressBar/index.js +2 -2
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-C-_BMNuY.js → GrPromptDialog-DNUjRVB9.js} +7 -7
- package/dist/components/GrPromptDialog/chunks/GrPromptDialog-DNUjRVB9.js.map +1 -0
- package/dist/components/GrPromptDialog/index.js +2 -2
- package/dist/components/GrRadio/chunks/{GrRadio-Dr-pvs_9.js → GrRadio-DlhxPGqf.js} +5 -7
- package/dist/components/GrRadio/chunks/GrRadio-DlhxPGqf.js.map +1 -0
- package/dist/components/GrRadio/index.js +2 -2
- package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-nOdvfV_g.js → GrRadioGroup-BXt9iw4q.js} +7 -5
- package/dist/components/GrRadioGroup/chunks/GrRadioGroup-BXt9iw4q.js.map +1 -0
- package/dist/components/GrRadioGroup/index.js +2 -2
- package/dist/components/GrRating/chunks/GrRating-Co-3Rk4h.js +241 -0
- package/dist/components/GrRating/chunks/GrRating-Co-3Rk4h.js.map +1 -0
- package/dist/components/GrRating/index.js +3 -0
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-BWJNe2gr.js → GrResponseErrorBanner-2CvM7Z08.js} +2 -2
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-BWJNe2gr.js.map → GrResponseErrorBanner-2CvM7Z08.js.map} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-Cdu9ekK9.js → GrResponseErrorBanner-C8NGx8pE.js} +3 -3
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-Cdu9ekK9.js.map → GrResponseErrorBanner-C8NGx8pE.js.map} +1 -1
- package/dist/components/GrResponseErrorBanner/index.js +2 -2
- package/dist/components/GrSegmented/chunks/{GrSegmented-C1y0UXpQ.js → GrSegmented-CTd3n4PA.js} +14 -11
- package/dist/components/GrSegmented/chunks/GrSegmented-CTd3n4PA.js.map +1 -0
- package/dist/components/GrSegmented/index.js +2 -2
- package/dist/components/GrSelect/chunks/{GrSelect-BVCmitqa.js → GrSelect-Dn3FgJ3Z.js} +161 -75
- package/dist/components/GrSelect/chunks/GrSelect-Dn3FgJ3Z.js.map +1 -0
- package/dist/components/GrSelect/index.js +2 -2
- package/dist/components/GrSidebar/chunks/{GrSidebar-DkWozzwA.js → GrSidebar-cvnzBfj3.js} +7 -7
- package/dist/components/GrSidebar/chunks/GrSidebar-cvnzBfj3.js.map +1 -0
- package/dist/components/GrSidebar/index.js +2 -2
- package/dist/components/GrSkeleton/chunks/{GrSkeleton-DsN-_CDZ.js → GrSkeleton-BucA5F4J.js} +1 -1
- package/dist/components/GrSkeleton/chunks/GrSkeleton-BucA5F4J.js.map +1 -0
- package/dist/components/GrSkeleton/index.js +2 -2
- package/dist/components/GrSlider/chunks/GrSlider-CzzJ3bD-.js +286 -0
- package/dist/components/GrSlider/chunks/GrSlider-CzzJ3bD-.js.map +1 -0
- package/dist/components/GrSlider/index.js +3 -0
- package/dist/components/GrStatistic/chunks/GrStatistic-gHiAwrX5.js +128 -0
- package/dist/components/GrStatistic/chunks/GrStatistic-gHiAwrX5.js.map +1 -0
- package/dist/components/GrStatistic/index.js +3 -0
- package/dist/components/GrSwitch/chunks/{GrSwitch-DAioyccZ.js → GrSwitch-CJdRvS0s.js} +16 -7
- package/dist/components/GrSwitch/chunks/GrSwitch-CJdRvS0s.js.map +1 -0
- package/dist/components/GrSwitch/index.js +2 -2
- package/dist/components/GrTabPanels/chunks/{GrTabPanels-DbKybwe-.js → GrTabPanels-DeEMgb_y.js} +1 -1
- package/dist/components/GrTabPanels/chunks/{GrTabPanels-DbKybwe-.js.map → GrTabPanels-DeEMgb_y.js.map} +1 -1
- package/dist/components/GrTabPanels/index.js +2 -2
- package/dist/components/GrTable/chunks/{GrTable-Db3hRnKA.js → GrTable-sNvsA8wa.js} +24 -11
- package/dist/components/GrTable/chunks/GrTable-sNvsA8wa.js.map +1 -0
- package/dist/components/GrTable/index.js +2 -2
- package/dist/components/GrTabs/chunks/{GrTabs-DsLwWoRz.js → GrTabs-BqTak0SR.js} +3 -3
- package/dist/components/GrTabs/chunks/GrTabs-BqTak0SR.js.map +1 -0
- package/dist/components/GrTabs/index.js +2 -2
- package/dist/components/GrTextarea/chunks/{GrTextarea-CKukGlNl.js → GrTextarea-DIYBAPpP.js} +2 -2
- package/dist/components/GrTextarea/chunks/GrTextarea-DIYBAPpP.js.map +1 -0
- package/dist/components/GrTextarea/index.js +2 -2
- package/dist/components/GrToaster/chunks/{GrToaster-L2cu6cSR.js → GrToaster-BVHjIHcM.js} +51 -10
- package/dist/components/GrToaster/chunks/GrToaster-BVHjIHcM.js.map +1 -0
- package/dist/components/GrToaster/index.js +1 -1
- package/dist/components/GrTooltip/chunks/{GrTooltip-BeyZ8ssR.js → GrTooltip-BMKH2lIx.js} +3 -3
- package/dist/components/GrTooltip/chunks/GrTooltip-BMKH2lIx.js.map +1 -0
- package/dist/components/GrTooltip/index.js +1 -1
- package/dist/components/GrTree/chunks/{GrTree-B2_yW6g1.js → GrTree-_12ChXRQ.js} +3 -3
- package/dist/components/GrTree/chunks/GrTree-_12ChXRQ.js.map +1 -0
- package/dist/components/GrTree/index.js +1 -1
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-0aM62xyu.js → GrTreeSelect-CdaLG7Xq.js} +10 -10
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-CdaLG7Xq.js.map +1 -0
- package/dist/components/GrTreeSelect/index.js +2 -2
- package/dist/composables/useToast.js +3 -1
- package/dist/composables/useToast.js.map +1 -1
- package/dist/directives/loading.js +1 -1
- package/dist/granular-provider-node.js +6 -6
- package/dist/granular-provider-node.js.map +1 -1
- package/dist/granular-provider.js +1 -1
- package/dist/i18n/all.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/index.js +111 -93
- package/dist/index.js.map +1 -1
- package/dist/styles/base.css +2 -2
- package/dist/styles/index.css +6 -3
- package/dist/styles/preflight.css +3 -3
- package/dist/styles/themes/dark.css +52 -40
- package/dist/styles/themes/light.css +70 -45
- package/dist/styles/tokens.css +20 -20
- package/dist/types/src/components/GrAlert/GrAlert.vue.d.ts +26 -14
- package/dist/types/src/components/GrAlert/defaults.d.ts +17 -0
- package/dist/types/src/components/GrAlert/grAlertStyles.d.ts +55 -0
- package/dist/types/src/components/GrAlert/index.d.ts +4 -1
- package/dist/types/src/components/GrAutocomplete/GrAutocomplete.vue.d.ts +153 -0
- package/dist/types/src/components/GrAutocomplete/config.d.ts +1 -0
- package/dist/types/src/components/GrAutocomplete/defaults.d.ts +15 -0
- package/dist/types/src/components/GrAutocomplete/grAutocompleteStyles.d.ts +27 -0
- package/dist/types/src/components/GrAutocomplete/index.d.ts +6 -0
- package/dist/types/src/components/GrAutocomplete/safelist.d.ts +1 -0
- package/dist/types/src/components/GrAvatar/GrAvatar.vue.d.ts +1 -1
- package/dist/types/src/components/GrBadge/GrBadge.vue.d.ts +7 -7
- package/dist/types/src/components/GrBadge/defaults.d.ts +15 -0
- package/dist/types/src/components/GrBadge/index.d.ts +1 -0
- package/dist/types/src/components/GrBadgeWrap/GrBadgeWrap.vue.d.ts +1 -1
- package/dist/types/src/components/GrButton/GrButton.vue.d.ts +12 -12
- package/dist/types/src/components/GrButton/defaults.d.ts +25 -0
- package/dist/types/src/components/GrButton/grButtonStyles.d.ts +2 -2
- package/dist/types/src/components/GrButton/index.d.ts +1 -0
- package/dist/types/src/components/GrCheckbox/GrCheckbox.vue.d.ts +4 -4
- package/dist/types/src/components/GrCollapse/GrCollapse.vue.d.ts +2 -2
- package/dist/types/src/components/GrCollapse/GrCollapseItem.vue.d.ts +1 -1
- package/dist/types/src/components/GrCommandPalette/GrCommandPalette.vue.d.ts +128 -0
- package/dist/types/src/components/GrCommandPalette/config.d.ts +1 -0
- package/dist/types/src/components/GrCommandPalette/filtering.d.ts +35 -0
- package/dist/types/src/components/GrCommandPalette/grCommandPaletteStyles.d.ts +20 -0
- package/dist/types/src/components/GrCommandPalette/hotkey.d.ts +23 -0
- package/dist/types/src/components/GrCommandPalette/index.d.ts +6 -0
- package/dist/types/src/components/GrCommandPalette/safelist.d.ts +1 -0
- package/dist/types/src/components/GrConfigProvider/GrConfigProvider.vue.d.ts +59 -0
- package/dist/types/src/components/GrConfigProvider/config.d.ts +1 -0
- package/dist/types/src/components/GrConfigProvider/context.d.ts +131 -0
- package/dist/types/src/components/GrConfigProvider/index.d.ts +5 -0
- package/dist/types/src/components/GrConfirmDialog/GrConfirmDialog.vue.d.ts +2 -2
- package/dist/types/src/components/GrDataTable/GrDataTable.vue.d.ts +20 -0
- package/dist/types/src/components/GrDialog/GrDialog.vue.d.ts +1 -1
- package/dist/types/src/components/GrDialogService/store.d.ts +18 -0
- package/dist/types/src/components/GrDrawer/GrDrawer.vue.d.ts +1 -1
- package/dist/types/src/components/GrDropdown/GrDropdown.vue.d.ts +1 -1
- package/dist/types/src/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +1 -1
- package/dist/types/src/components/GrDropdownMenu/GrDropdownMenuItem.vue.d.ts +1 -1
- package/dist/types/src/components/GrFileUpload/GrFileUpload.vue.d.ts +3 -3
- package/dist/types/src/components/GrForm/GrForm.vue.d.ts +93 -0
- package/dist/types/src/components/GrForm/config.d.ts +1 -0
- package/dist/types/src/components/GrForm/context.d.ts +27 -0
- package/dist/types/src/components/GrForm/index.d.ts +6 -0
- package/dist/types/src/components/GrForm/validation.d.ts +52 -0
- package/dist/types/src/components/GrFormField/GrFormField.vue.d.ts +11 -1
- package/dist/types/src/components/GrFormFile/GrFormFile.vue.d.ts +4 -4
- package/dist/types/src/components/GrImageViewer/GrImageViewer.vue.d.ts +3 -3
- package/dist/types/src/components/GrInput/GrInput.vue.d.ts +12 -12
- package/dist/types/src/components/GrInput/defaults.d.ts +18 -0
- package/dist/types/src/components/GrInput/grInputStyles.d.ts +1 -1
- package/dist/types/src/components/GrInput/index.d.ts +1 -0
- package/dist/types/src/components/GrInputTag/GrInputTag.vue.d.ts +3 -3
- package/dist/types/src/components/GrLink/GrLink.vue.d.ts +3 -3
- package/dist/types/src/components/GrLink/grLinkStyles.d.ts +3 -3
- package/dist/types/src/components/GrModal/grModalStyles.d.ts +1 -1
- package/dist/types/src/components/GrNumberInput/GrNumberInput.vue.d.ts +10 -10
- package/dist/types/src/components/GrNumberInput/defaults.d.ts +14 -0
- package/dist/types/src/components/GrNumberInput/index.d.ts +1 -0
- package/dist/types/src/components/GrPagination/GrPagination.vue.d.ts +18 -0
- package/dist/types/src/components/GrPromptDialog/GrPromptDialog.vue.d.ts +4 -4
- package/dist/types/src/components/GrRadio/GrRadio.vue.d.ts +5 -5
- package/dist/types/src/components/GrRadio/defaults.d.ts +14 -0
- package/dist/types/src/components/GrRadio/grRadioStyles.d.ts +3 -3
- package/dist/types/src/components/GrRadio/index.d.ts +1 -0
- package/dist/types/src/components/GrRadioGroup/GrRadioGroup.vue.d.ts +4 -4
- package/dist/types/src/components/GrRadioGroup/defaults.d.ts +14 -0
- package/dist/types/src/components/GrRadioGroup/index.d.ts +1 -0
- package/dist/types/src/components/GrRating/GrRating.vue.d.ts +124 -0
- package/dist/types/src/components/GrRating/config.d.ts +1 -0
- package/dist/types/src/components/GrRating/defaults.d.ts +14 -0
- package/dist/types/src/components/GrRating/grRatingStyles.d.ts +21 -0
- package/dist/types/src/components/GrRating/index.d.ts +6 -0
- package/dist/types/src/components/GrRating/safelist.d.ts +1 -0
- package/dist/types/src/components/GrResponseErrorBanner/GrUploadErrorBanner.vue.d.ts +1 -1
- package/dist/types/src/components/GrSegmented/GrSegmented.vue.d.ts +7 -7
- package/dist/types/src/components/GrSegmented/defaults.d.ts +15 -0
- package/dist/types/src/components/GrSegmented/grSegmentedStyles.d.ts +1 -1
- package/dist/types/src/components/GrSegmented/index.d.ts +1 -0
- package/dist/types/src/components/GrSelect/GrSelect.vue.d.ts +57 -17
- package/dist/types/src/components/GrSelect/defaults.d.ts +17 -0
- package/dist/types/src/components/GrSelect/grSelectStyles.d.ts +3 -3
- package/dist/types/src/components/GrSelect/index.d.ts +1 -0
- package/dist/types/src/components/GrSidebar/GrSidebarItem.vue.d.ts +2 -2
- package/dist/types/src/components/GrSkeleton/GrSkeleton.vue.d.ts +1 -1
- package/dist/types/src/components/GrSlider/GrSlider.vue.d.ts +88 -0
- package/dist/types/src/components/GrSlider/config.d.ts +1 -0
- package/dist/types/src/components/GrSlider/defaults.d.ts +14 -0
- package/dist/types/src/components/GrSlider/grSliderStyles.d.ts +36 -0
- package/dist/types/src/components/GrSlider/index.d.ts +6 -0
- package/dist/types/src/components/GrSlider/safelist.d.ts +1 -0
- package/dist/types/src/components/GrStatistic/GrStatistic.vue.d.ts +116 -0
- package/dist/types/src/components/GrStatistic/config.d.ts +1 -0
- package/dist/types/src/components/GrStatistic/formatStatisticValue.d.ts +16 -0
- package/dist/types/src/components/GrStatistic/grStatisticStyles.d.ts +24 -0
- package/dist/types/src/components/GrStatistic/index.d.ts +6 -0
- package/dist/types/src/components/GrStatistic/safelist.d.ts +1 -0
- package/dist/types/src/components/GrSwitch/GrSwitch.vue.d.ts +4 -4
- package/dist/types/src/components/GrSwitch/defaults.d.ts +14 -0
- package/dist/types/src/components/GrSwitch/grSwitchStyles.d.ts +2 -2
- package/dist/types/src/components/GrSwitch/index.d.ts +1 -0
- package/dist/types/src/components/GrTable/GrTable.vue.d.ts +16 -0
- package/dist/types/src/components/GrTextarea/GrTextarea.vue.d.ts +5 -5
- package/dist/types/src/components/GrToaster/GrToaster.vue.d.ts +19 -2
- package/dist/types/src/components/GrToaster/index.d.ts +1 -1
- package/dist/types/src/components/GrTooltip/GrTooltip.vue.d.ts +1 -1
- package/dist/types/src/components/GrTreeSelect/GrTreeSelect.vue.d.ts +1 -1
- package/dist/types/src/components/GrTreeSelect/grTreeSelectStyles.d.ts +1 -1
- package/dist/types/src/composables/useToast.d.ts +24 -0
- package/dist/types/src/granular-provider/shared.d.ts +7 -0
- package/dist/types/src/i18n/messages/en.d.ts +74 -0
- package/dist/types/src/i18n/messages/es.d.ts +74 -0
- package/dist/types/src/i18n/messages/ru.d.ts +74 -0
- package/dist/types/src/index.d.ts +7 -0
- package/dist/web-types.json +1308 -271
- package/package.json +29 -1
- package/dist/chunks/config-1uSYl98Y2.js.map +0 -1
- package/dist/chunks/config-8Pcutu1j2.js.map +0 -1
- package/dist/chunks/config-B7IIWGt_2.js.map +0 -1
- package/dist/chunks/config-BIRO0vDJ.js.map +0 -1
- package/dist/chunks/config-BLHqZhy-2.js.map +0 -1
- package/dist/chunks/config-BOlr7qw7.js.map +0 -1
- package/dist/chunks/config-BUHuGBik.js.map +0 -1
- package/dist/chunks/config-BX1JTrkV2.js.map +0 -1
- package/dist/chunks/config-BXtAmU3s2.js.map +0 -1
- package/dist/chunks/config-C7NpDrfO.js.map +0 -1
- package/dist/chunks/config-CGHLoBlH.js.map +0 -1
- package/dist/chunks/config-ClhKPJvg.js.map +0 -1
- package/dist/chunks/config-Cpi9Mh2J.js.map +0 -1
- package/dist/chunks/config-CrG1XiE72.js.map +0 -1
- package/dist/chunks/config-DUcu1D682.js.map +0 -1
- package/dist/chunks/config-D_R56_gT.js.map +0 -1
- package/dist/chunks/config-DezDih8_.js.map +0 -1
- package/dist/chunks/config-JpHA4Xx02.js.map +0 -1
- package/dist/chunks/config-QaIc_gRa.js.map +0 -1
- package/dist/chunks/config-U4m9PSql.js.map +0 -1
- package/dist/chunks/config-eXB87DOi2.js.map +0 -1
- package/dist/chunks/config-eYLZYOUS2.js.map +0 -1
- package/dist/chunks/config-ipvU0lzP2.js.map +0 -1
- package/dist/chunks/config-xR4XVmcy.js.map +0 -1
- package/dist/chunks/en-CfkDa4GX.js.map +0 -1
- package/dist/chunks/es-FkgECuCm.js.map +0 -1
- package/dist/chunks/grBadgeStyles-DrycBuKT.js.map +0 -1
- package/dist/chunks/grButtonStyles-C7Yga_Q1.js.map +0 -1
- package/dist/chunks/grModalStyles-DWd3i05Q.js.map +0 -1
- package/dist/chunks/grSelectStyles-CLK5hRd3.js.map +0 -1
- package/dist/chunks/grStyle-Blc9otAx.js.map +0 -1
- package/dist/chunks/ru-Bl8CxpEa.js.map +0 -1
- package/dist/chunks/shared-B6Ay2081.js +0 -174
- package/dist/chunks/shared-B6Ay2081.js.map +0 -1
- package/dist/components/GrAlert/chunks/GrAlert-DPJSU_fG.js +0 -163
- package/dist/components/GrAlert/chunks/GrAlert-DPJSU_fG.js.map +0 -1
- package/dist/components/GrAvatar/chunks/GrAvatar-96CpTCq5.js.map +0 -1
- package/dist/components/GrBadge/chunks/GrBadge-B77XlaqE.js.map +0 -1
- package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-CcktMOdg.js.map +0 -1
- package/dist/components/GrBottomNav/chunks/GrBottomNav-usuMgG8_.js.map +0 -1
- package/dist/components/GrButton/chunks/GrButton-BlffdeJr.js.map +0 -1
- package/dist/components/GrCard/chunks/GrCard-DUNMkuHW.js.map +0 -1
- package/dist/components/GrCheckbox/chunks/GrCheckbox-DJhzZZdO.js.map +0 -1
- package/dist/components/GrCollapse/chunks/GrCollapse-CPPLh_xU.js.map +0 -1
- package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-D8CkOtqv.js.map +0 -1
- package/dist/components/GrDataTable/chunks/GrDataTable-Ds5OeGat.js.map +0 -1
- package/dist/components/GrDialog/chunks/GrDialog-Ctucxju9.js.map +0 -1
- package/dist/components/GrDialogService/chunks/GrDialogService-CU1Fbonc.js.map +0 -1
- package/dist/components/GrDivider/chunks/GrDivider-5bcE-BB4.js.map +0 -1
- package/dist/components/GrDrawer/chunks/GrDrawer-SLGKCY2A.js.map +0 -1
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu--g9Vofcq.js.map +0 -1
- package/dist/components/GrEmptyState/chunks/GrEmptyState-CA3BiTV7.js.map +0 -1
- package/dist/components/GrFileUpload/chunks/GrFileUpload-DvWPpiJS.js.map +0 -1
- package/dist/components/GrFormField/chunks/GrFormField-DnfMHx_U.js.map +0 -1
- package/dist/components/GrFormFile/chunks/GrFormFile-CXcqqdvV.js.map +0 -1
- package/dist/components/GrFormSection/chunks/GrFormSection-Ce21jcgo.js.map +0 -1
- package/dist/components/GrInput/chunks/GrInput-B8dd3JaA.js.map +0 -1
- package/dist/components/GrInputTag/chunks/GrInputTag-zMgFqp2g.js.map +0 -1
- package/dist/components/GrKbd/chunks/GrKbd-BEoYxWhE.js.map +0 -1
- package/dist/components/GrList/chunks/GrList-Dx772Ns4.js.map +0 -1
- package/dist/components/GrLoading/chunks/GrLoading--X_7rdbb.js.map +0 -1
- package/dist/components/GrNavbar/chunks/GrNavbar-DW3MiIIf.js.map +0 -1
- package/dist/components/GrNumberInput/chunks/GrNumberInput-DxCEvL7V.js.map +0 -1
- package/dist/components/GrPagination/chunks/GrPagination-mlyfLjQY.js.map +0 -1
- package/dist/components/GrProgressBar/chunks/GrProgressBar-CC3z-Zqp.js.map +0 -1
- package/dist/components/GrPromptDialog/chunks/GrPromptDialog-C-_BMNuY.js.map +0 -1
- package/dist/components/GrRadio/chunks/GrRadio-Dr-pvs_9.js.map +0 -1
- package/dist/components/GrRadioGroup/chunks/GrRadioGroup-nOdvfV_g.js.map +0 -1
- package/dist/components/GrSegmented/chunks/GrSegmented-C1y0UXpQ.js.map +0 -1
- package/dist/components/GrSelect/chunks/GrSelect-BVCmitqa.js.map +0 -1
- package/dist/components/GrSidebar/chunks/GrSidebar-DkWozzwA.js.map +0 -1
- package/dist/components/GrSkeleton/chunks/GrSkeleton-DsN-_CDZ.js.map +0 -1
- package/dist/components/GrSwitch/chunks/GrSwitch-DAioyccZ.js.map +0 -1
- package/dist/components/GrTable/chunks/GrTable-Db3hRnKA.js.map +0 -1
- package/dist/components/GrTabs/chunks/GrTabs-DsLwWoRz.js.map +0 -1
- package/dist/components/GrTextarea/chunks/GrTextarea-CKukGlNl.js.map +0 -1
- package/dist/components/GrToaster/chunks/GrToaster-L2cu6cSR.js.map +0 -1
- package/dist/components/GrTooltip/chunks/GrTooltip-BeyZ8ssR.js.map +0 -1
- package/dist/components/GrTree/chunks/GrTree-B2_yW6g1.js.map +0 -1
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-0aM62xyu.js.map +0 -1
- package/dist/chunks/{config-8Pcutu1j2.js → config-8Pcutu1j.js} +0 -0
- package/dist/chunks/{config-BLHqZhy-2.js → config-BLHqZhy-.js} +0 -0
- package/dist/chunks/{config-BUHuGBik.js → config-BUHuGBik2.js} +0 -0
- package/dist/chunks/{config-BX1JTrkV2.js → config-BX1JTrkV.js} +0 -0
- package/dist/chunks/{config-BXtAmU3s2.js → config-BXtAmU3s.js} +0 -0
- package/dist/chunks/{config-CGHLoBlH.js → config-CGHLoBlH2.js} +0 -0
- package/dist/chunks/{config-Cpi9Mh2J.js → config-Dqy0rPPO2.js} +1 -1
- /package/dist/chunks/{config-JpHA4Xx02.js → config-JpHA4Xx0.js} +0 -0
- /package/dist/chunks/{config-QaIc_gRa.js → config-QaIc_gRa2.js} +0 -0
- /package/dist/chunks/{config-U4m9PSql.js → config-U4m9PSql2.js} +0 -0
- /package/dist/chunks/{config-eXB87DOi2.js → config-eXB87DOi.js} +0 -0
- /package/dist/chunks/{config-ipvU0lzP2.js → config-ipvU0lzP.js} +0 -0
- /package/dist/chunks/{config-xR4XVmcy.js → config-xR4XVmcy2.js} +0 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { o as useGrComponentSize } from "../../../chunks/context-DfWYCBB-.js";
|
|
2
|
+
import { n as useGrFormFieldContext } from "../../../chunks/context-DdNIxa1w.js";
|
|
3
|
+
import { a as sliderMarkTickClass, c as sliderThumbClass, i as sliderMarkLabelClassFor, l as sliderTooltipClass, o as sliderRailClass, r as sliderFillClass, s as sliderRootClass, u as sliderTrackHeightBySize } from "../../../chunks/config-BZFUM3Ky.js";
|
|
4
|
+
import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, defineComponent, normalizeClass, normalizeStyle, onBeforeUnmount, openBlock, ref, renderList, toDisplayString, unref } from "vue";
|
|
5
|
+
//#region src/components/GrSlider/GrSlider.vue?vue&type=script&setup=true&lang.ts
|
|
6
|
+
var _hoisted_1 = [
|
|
7
|
+
"id",
|
|
8
|
+
"data-testid",
|
|
9
|
+
"tabindex",
|
|
10
|
+
"aria-valuemin",
|
|
11
|
+
"aria-valuemax",
|
|
12
|
+
"aria-valuenow",
|
|
13
|
+
"aria-label",
|
|
14
|
+
"aria-disabled",
|
|
15
|
+
"aria-invalid",
|
|
16
|
+
"aria-describedby",
|
|
17
|
+
"aria-required",
|
|
18
|
+
"onKeydown",
|
|
19
|
+
"onMouseenter",
|
|
20
|
+
"onFocus"
|
|
21
|
+
];
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/components/GrSlider/GrSlider.vue
|
|
24
|
+
var GrSlider_default = /* @__PURE__ */ defineComponent({
|
|
25
|
+
__name: "GrSlider",
|
|
26
|
+
props: {
|
|
27
|
+
modelValue: {},
|
|
28
|
+
min: { default: 0 },
|
|
29
|
+
max: { default: 100 },
|
|
30
|
+
step: { default: 1 },
|
|
31
|
+
range: {
|
|
32
|
+
type: Boolean,
|
|
33
|
+
default: false
|
|
34
|
+
},
|
|
35
|
+
disabled: {
|
|
36
|
+
type: Boolean,
|
|
37
|
+
default: false
|
|
38
|
+
},
|
|
39
|
+
size: { default: void 0 },
|
|
40
|
+
marks: { default: void 0 },
|
|
41
|
+
showTooltip: {
|
|
42
|
+
type: [Boolean, String],
|
|
43
|
+
default: false
|
|
44
|
+
},
|
|
45
|
+
formatTooltip: {
|
|
46
|
+
type: Function,
|
|
47
|
+
default: void 0
|
|
48
|
+
},
|
|
49
|
+
ariaLabel: { default: void 0 }
|
|
50
|
+
},
|
|
51
|
+
emits: ["update:modelValue", "change"],
|
|
52
|
+
setup(__props, { emit: __emit }) {
|
|
53
|
+
const props = __props;
|
|
54
|
+
const resolvedSize = useGrComponentSize(() => props.size, {
|
|
55
|
+
component: "GrSlider",
|
|
56
|
+
supported: [
|
|
57
|
+
"sm",
|
|
58
|
+
"md",
|
|
59
|
+
"lg"
|
|
60
|
+
]
|
|
61
|
+
});
|
|
62
|
+
const emit = __emit;
|
|
63
|
+
const field = useGrFormFieldContext();
|
|
64
|
+
const resolvedId = computed(() => field?.id.value);
|
|
65
|
+
const isInvalid = computed(() => Boolean(field?.invalid.value));
|
|
66
|
+
const describedBy = computed(() => field?.describedById.value);
|
|
67
|
+
const isRequired = computed(() => Boolean(field?.required.value));
|
|
68
|
+
const trackEl = ref(null);
|
|
69
|
+
const thumbEls = ref([]);
|
|
70
|
+
const span = computed(() => props.max > props.min ? props.max - props.min : 1);
|
|
71
|
+
const stepDecimals = computed(() => {
|
|
72
|
+
const s = String(props.step);
|
|
73
|
+
const dot = s.indexOf(".");
|
|
74
|
+
return dot >= 0 ? s.length - dot - 1 : 0;
|
|
75
|
+
});
|
|
76
|
+
function clamp(value) {
|
|
77
|
+
return Math.min(props.max, Math.max(props.min, value));
|
|
78
|
+
}
|
|
79
|
+
function snap(value) {
|
|
80
|
+
const stepped = Math.round((value - props.min) / props.step) * props.step + props.min;
|
|
81
|
+
return Number(clamp(stepped).toFixed(stepDecimals.value));
|
|
82
|
+
}
|
|
83
|
+
function percent(value) {
|
|
84
|
+
return (clamp(value) - props.min) / span.value * 100;
|
|
85
|
+
}
|
|
86
|
+
const values = computed(() => {
|
|
87
|
+
if (props.range) {
|
|
88
|
+
const v = Array.isArray(props.modelValue) ? props.modelValue : [props.min, props.min];
|
|
89
|
+
return [snap(v[0] ?? props.min), snap(v[1] ?? props.min)];
|
|
90
|
+
}
|
|
91
|
+
return [snap(Array.isArray(props.modelValue) ? props.modelValue[0] ?? props.min : props.modelValue)];
|
|
92
|
+
});
|
|
93
|
+
const fillStyle = computed(() => {
|
|
94
|
+
if (props.range) {
|
|
95
|
+
const lo = Math.min(percent(values.value[0]), percent(values.value[1]));
|
|
96
|
+
const hi = Math.max(percent(values.value[0]), percent(values.value[1]));
|
|
97
|
+
return {
|
|
98
|
+
left: `${lo}%`,
|
|
99
|
+
right: `${100 - hi}%`
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
left: "0%",
|
|
104
|
+
right: `${100 - percent(values.value[0])}%`
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
const normalizedMarks = computed(() => {
|
|
108
|
+
if (!props.marks) return [];
|
|
109
|
+
if (Array.isArray(props.marks)) return props.marks.map((v) => ({
|
|
110
|
+
value: v,
|
|
111
|
+
label: String(v)
|
|
112
|
+
}));
|
|
113
|
+
return Object.entries(props.marks).map(([value, label]) => ({
|
|
114
|
+
value: Number(value),
|
|
115
|
+
label
|
|
116
|
+
}));
|
|
117
|
+
});
|
|
118
|
+
function tooltipText(value) {
|
|
119
|
+
return props.formatTooltip ? props.formatTooltip(value) : String(value);
|
|
120
|
+
}
|
|
121
|
+
function emitValue(next, commit) {
|
|
122
|
+
const payload = props.range ? [next[0], next[1]] : next[0];
|
|
123
|
+
emit("update:modelValue", payload);
|
|
124
|
+
if (commit) emit("change", payload);
|
|
125
|
+
}
|
|
126
|
+
function setThumb(index, value, commit) {
|
|
127
|
+
const next = values.value.slice();
|
|
128
|
+
next[index] = snap(value);
|
|
129
|
+
if (props.range) if (index === 0) next[0] = Math.min(next[0], next[1]);
|
|
130
|
+
else next[1] = Math.max(next[1], next[0]);
|
|
131
|
+
emitValue(next, commit);
|
|
132
|
+
}
|
|
133
|
+
const activeThumb = ref(null);
|
|
134
|
+
const hoveredThumb = ref(null);
|
|
135
|
+
function valueFromClientX(clientX) {
|
|
136
|
+
const rect = trackEl.value?.getBoundingClientRect();
|
|
137
|
+
if (!rect || rect.width === 0) return props.min;
|
|
138
|
+
const ratio = Math.min(1, Math.max(0, (clientX - rect.left) / rect.width));
|
|
139
|
+
return props.min + ratio * span.value;
|
|
140
|
+
}
|
|
141
|
+
function nearestThumb(value) {
|
|
142
|
+
if (!props.range) return 0;
|
|
143
|
+
return Math.abs(value - values.value[0]) <= Math.abs(value - values.value[1]) ? 0 : 1;
|
|
144
|
+
}
|
|
145
|
+
function onTrackPointerDown(event) {
|
|
146
|
+
if (props.disabled) return;
|
|
147
|
+
const value = valueFromClientX(event.clientX);
|
|
148
|
+
const index = nearestThumb(value);
|
|
149
|
+
activeThumb.value = index;
|
|
150
|
+
thumbEls.value[index]?.focus();
|
|
151
|
+
setThumb(index, value, false);
|
|
152
|
+
window.addEventListener("pointermove", onPointerMove);
|
|
153
|
+
window.addEventListener("pointerup", onPointerUp);
|
|
154
|
+
}
|
|
155
|
+
function onPointerMove(event) {
|
|
156
|
+
if (activeThumb.value === null) return;
|
|
157
|
+
event.preventDefault();
|
|
158
|
+
setThumb(activeThumb.value, valueFromClientX(event.clientX), false);
|
|
159
|
+
}
|
|
160
|
+
function onPointerUp() {
|
|
161
|
+
if (activeThumb.value !== null) emitValue(values.value.slice(), true);
|
|
162
|
+
activeThumb.value = null;
|
|
163
|
+
window.removeEventListener("pointermove", onPointerMove);
|
|
164
|
+
window.removeEventListener("pointerup", onPointerUp);
|
|
165
|
+
}
|
|
166
|
+
onBeforeUnmount(() => {
|
|
167
|
+
window.removeEventListener("pointermove", onPointerMove);
|
|
168
|
+
window.removeEventListener("pointerup", onPointerUp);
|
|
169
|
+
});
|
|
170
|
+
function bigStep() {
|
|
171
|
+
return Math.max(props.step * 10, Math.round(span.value / 10 / props.step) * props.step || props.step);
|
|
172
|
+
}
|
|
173
|
+
function onThumbKeydown(event, index) {
|
|
174
|
+
if (props.disabled) return;
|
|
175
|
+
const current = values.value[index];
|
|
176
|
+
let next = null;
|
|
177
|
+
switch (event.key) {
|
|
178
|
+
case "ArrowRight":
|
|
179
|
+
case "ArrowUp":
|
|
180
|
+
next = current + props.step;
|
|
181
|
+
break;
|
|
182
|
+
case "ArrowLeft":
|
|
183
|
+
case "ArrowDown":
|
|
184
|
+
next = current - props.step;
|
|
185
|
+
break;
|
|
186
|
+
case "PageUp":
|
|
187
|
+
next = current + bigStep();
|
|
188
|
+
break;
|
|
189
|
+
case "PageDown":
|
|
190
|
+
next = current - bigStep();
|
|
191
|
+
break;
|
|
192
|
+
case "Home":
|
|
193
|
+
next = props.min;
|
|
194
|
+
break;
|
|
195
|
+
case "End":
|
|
196
|
+
next = props.max;
|
|
197
|
+
break;
|
|
198
|
+
default: return;
|
|
199
|
+
}
|
|
200
|
+
event.preventDefault();
|
|
201
|
+
setThumb(index, next, true);
|
|
202
|
+
}
|
|
203
|
+
const showTooltipFor = (index) => {
|
|
204
|
+
if (props.showTooltip === "always") return true;
|
|
205
|
+
if (!props.showTooltip) return false;
|
|
206
|
+
return activeThumb.value === index || hoveredThumb.value === index;
|
|
207
|
+
};
|
|
208
|
+
function thumbAriaLabel(index) {
|
|
209
|
+
if (props.ariaLabel) return props.range ? `${props.ariaLabel} (${index === 0 ? "min" : "max"})` : props.ariaLabel;
|
|
210
|
+
}
|
|
211
|
+
return (_ctx, _cache) => {
|
|
212
|
+
return openBlock(), createElementBlock("div", {
|
|
213
|
+
"data-gr-slider": "",
|
|
214
|
+
class: normalizeClass(unref(sliderRootClass)({
|
|
215
|
+
size: unref(resolvedSize),
|
|
216
|
+
disabled: __props.disabled,
|
|
217
|
+
hasMarks: normalizedMarks.value.length > 0
|
|
218
|
+
}))
|
|
219
|
+
}, [createElementVNode("div", {
|
|
220
|
+
ref_key: "trackEl",
|
|
221
|
+
ref: trackEl,
|
|
222
|
+
"data-gr-slider-track": "",
|
|
223
|
+
class: normalizeClass(["relative w-full", unref(sliderTrackHeightBySize)[unref(resolvedSize)]]),
|
|
224
|
+
onPointerdown: onTrackPointerDown
|
|
225
|
+
}, [
|
|
226
|
+
createElementVNode("div", { class: normalizeClass(unref(sliderRailClass)) }, null, 2),
|
|
227
|
+
createElementVNode("div", {
|
|
228
|
+
"data-gr-slider-fill": "",
|
|
229
|
+
class: normalizeClass(unref(sliderFillClass)),
|
|
230
|
+
style: normalizeStyle(fillStyle.value)
|
|
231
|
+
}, null, 6),
|
|
232
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(normalizedMarks.value, (mark) => {
|
|
233
|
+
return openBlock(), createElementBlock(Fragment, { key: mark.value }, [createElementVNode("span", {
|
|
234
|
+
"data-gr-slider-mark": "",
|
|
235
|
+
class: normalizeClass(unref(sliderMarkTickClass)),
|
|
236
|
+
style: normalizeStyle({ left: `${percent(mark.value)}%` }),
|
|
237
|
+
"aria-hidden": "true"
|
|
238
|
+
}, null, 6), createElementVNode("span", {
|
|
239
|
+
"data-gr-slider-mark-label": "",
|
|
240
|
+
class: normalizeClass(unref(sliderMarkLabelClassFor)(percent(mark.value))),
|
|
241
|
+
style: normalizeStyle({ left: `${percent(mark.value)}%` })
|
|
242
|
+
}, toDisplayString(mark.label), 7)], 64);
|
|
243
|
+
}), 128)),
|
|
244
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(values.value, (value, index) => {
|
|
245
|
+
return openBlock(), createElementBlock("div", {
|
|
246
|
+
id: index === 0 ? resolvedId.value : void 0,
|
|
247
|
+
key: index,
|
|
248
|
+
ref_for: true,
|
|
249
|
+
ref: (el) => {
|
|
250
|
+
if (el) thumbEls.value[index] = el;
|
|
251
|
+
},
|
|
252
|
+
"data-gr-slider-thumb": "",
|
|
253
|
+
"data-testid": `gr-slider-thumb-${index}`,
|
|
254
|
+
class: normalizeClass(unref(sliderThumbClass)({
|
|
255
|
+
size: unref(resolvedSize),
|
|
256
|
+
disabled: __props.disabled
|
|
257
|
+
})),
|
|
258
|
+
style: normalizeStyle({ left: `${percent(value)}%` }),
|
|
259
|
+
role: "slider",
|
|
260
|
+
tabindex: __props.disabled ? -1 : 0,
|
|
261
|
+
"aria-valuemin": __props.range && index === 1 ? values.value[0] : __props.min,
|
|
262
|
+
"aria-valuemax": __props.range && index === 0 ? values.value[1] : __props.max,
|
|
263
|
+
"aria-valuenow": value,
|
|
264
|
+
"aria-orientation": "horizontal",
|
|
265
|
+
"aria-label": thumbAriaLabel(index),
|
|
266
|
+
"aria-disabled": __props.disabled ? "true" : void 0,
|
|
267
|
+
"aria-invalid": isInvalid.value ? "true" : void 0,
|
|
268
|
+
"aria-describedby": index === 0 ? describedBy.value : void 0,
|
|
269
|
+
"aria-required": isRequired.value && index === 0 ? "true" : void 0,
|
|
270
|
+
onKeydown: ($event) => onThumbKeydown($event, index),
|
|
271
|
+
onMouseenter: ($event) => hoveredThumb.value = index,
|
|
272
|
+
onMouseleave: _cache[0] || (_cache[0] = ($event) => hoveredThumb.value = null),
|
|
273
|
+
onFocus: ($event) => hoveredThumb.value = index,
|
|
274
|
+
onBlur: _cache[1] || (_cache[1] = ($event) => hoveredThumb.value = null)
|
|
275
|
+
}, [showTooltipFor(index) ? (openBlock(), createElementBlock("span", {
|
|
276
|
+
key: 0,
|
|
277
|
+
"data-gr-slider-tooltip": "",
|
|
278
|
+
class: normalizeClass(unref(sliderTooltipClass))
|
|
279
|
+
}, toDisplayString(tooltipText(value)), 3)) : createCommentVNode("", true)], 46, _hoisted_1);
|
|
280
|
+
}), 128))
|
|
281
|
+
], 34)], 2);
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
//#endregion
|
|
286
|
+
export { GrSlider_default as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrSlider-CzzJ3bD-.js","names":[],"sources":["../../../../src/components/GrSlider/GrSlider.vue","../../../../src/components/GrSlider/GrSlider.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref } from 'vue'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\n\nimport { useGrFormFieldContext } from '../GrFormField/context'\n\nimport {\n sliderFillClass,\n sliderMarkLabelClassFor,\n sliderMarkTickClass,\n sliderRailClass,\n sliderRootClass,\n sliderThumbClass,\n sliderTooltipClass,\n sliderTrackHeightBySize,\n type GrSliderMarks,\n type GrSliderModelValue,\n type GrSliderSize,\n} from './grSliderStyles'\n\nexport type {\n GrSliderMarks,\n GrSliderModelValue,\n GrSliderSize,\n} from './grSliderStyles'\n\n/**\n * Публичный GR-примитив «Slider» (WAI-ARIA slider pattern).\n *\n * Поддерживает одиночное значение и диапазон (`range` — два бегунка), шаг, метки\n * делений, всплывающее значение (tooltip), полную клавиатурную навигацию\n * (стрелки / PageUp/Down / Home / End) и `role=\"slider\"` с\n * `aria-valuemin`/`max`/`now` на каждом бегунке.\n */\nexport interface GrSliderProps {\n /** `number` — одиночное значение; `[lo, hi]` — диапазон (при `range=true`). */\n modelValue: GrSliderModelValue\n min?: number\n max?: number\n step?: number\n /** Диапазон с двумя бегунками; модель — кортеж `[lo, hi]`. */\n range?: boolean\n disabled?: boolean\n size?: GrSliderSize\n /** Метки делений: `{ [value]: label }` или массив значений. */\n marks?: GrSliderMarks\n /** Всплывающее значение над бегунком: `true`/`'hover'` — при hover/drag/focus, `'always'` — всегда. */\n showTooltip?: boolean | 'always' | 'hover'\n /** Форматирование значения в tooltip. */\n formatTooltip?: (value: number) => string\n ariaLabel?: string\n}\n\nconst props = withDefaults(\n defineProps<GrSliderProps>(),\n {\n min: 0,\n max: 100,\n step: 1,\n range: false,\n disabled: false,\n size: undefined,\n marks: undefined,\n showTooltip: false,\n formatTooltip: undefined,\n ariaLabel: undefined,\n },\n)\n\n// Эффективный размер: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedSize = useGrComponentSize(() => props.size, {\n component: 'GrSlider',\n supported: ['sm', 'md', 'lg'],\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: GrSliderModelValue): void\n /** Значение зафиксировано (отпущен бегунок / клавиша). */\n (e: 'change', value: GrSliderModelValue): void\n}>()\n\n// Контекст `GrFormField`: id/aria-describedby/invalid/required как fallback.\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 trackEl = ref<HTMLElement | null>(null)\nconst thumbEls = ref<HTMLElement[]>([])\n\n// Нормализованные границы (гард от max<=min).\nconst span = computed(() => (props.max > props.min ? props.max - props.min : 1))\n\nconst stepDecimals = computed(() => {\n const s = String(props.step)\n const dot = s.indexOf('.')\n return dot >= 0 ? s.length - dot - 1 : 0\n})\n\nfunction clamp(value: number): number {\n return Math.min(props.max, Math.max(props.min, value))\n}\n\nfunction snap(value: number): number {\n const stepped = Math.round((value - props.min) / props.step) * props.step + props.min\n return Number(clamp(stepped).toFixed(stepDecimals.value))\n}\n\nfunction percent(value: number): number {\n return ((clamp(value) - props.min) / span.value) * 100\n}\n\n// ————— Значения бегунков как массив (single = один бегунок).\nconst values = computed<number[]>(() => {\n if (props.range) {\n const v = Array.isArray(props.modelValue) ? props.modelValue : [props.min, props.min]\n return [snap(v[0] ?? props.min), snap(v[1] ?? props.min)]\n }\n const v = Array.isArray(props.modelValue) ? (props.modelValue[0] ?? props.min) : props.modelValue\n return [snap(v)]\n})\n\nconst fillStyle = computed(() => {\n if (props.range) {\n const lo = Math.min(percent(values.value[0]), percent(values.value[1]))\n const hi = Math.max(percent(values.value[0]), percent(values.value[1]))\n return { left: `${lo}%`, right: `${100 - hi}%` }\n }\n return { left: '0%', right: `${100 - percent(values.value[0])}%` }\n})\n\n// ————— Метки делений.\ntype SliderMark = { value: number, label: string }\nconst normalizedMarks = computed<SliderMark[]>(() => {\n if (!props.marks) return []\n if (Array.isArray(props.marks)) return props.marks.map(v => ({ value: v, label: String(v) }))\n return Object.entries(props.marks).map(([value, label]) => ({ value: Number(value), label }))\n})\n\nfunction tooltipText(value: number): string {\n return props.formatTooltip ? props.formatTooltip(value) : String(value)\n}\n\n// ————— Обновление значения конкретного бегунка.\nfunction emitValue(next: number[], commit: boolean): void {\n const payload: GrSliderModelValue = props.range ? [next[0], next[1]] : next[0]\n emit('update:modelValue', payload)\n if (commit) emit('change', payload)\n}\n\nfunction setThumb(index: number, value: number, commit: boolean): void {\n const next = values.value.slice()\n next[index] = snap(value)\n\n // range: не даём бегункам «перепрыгнуть» друг друга.\n if (props.range) {\n if (index === 0) next[0] = Math.min(next[0], next[1])\n else next[1] = Math.max(next[1], next[0])\n }\n\n emitValue(next, commit)\n}\n\n// ————— Pointer-драг.\nconst activeThumb = ref<number | null>(null)\nconst hoveredThumb = ref<number | null>(null)\n\nfunction valueFromClientX(clientX: number): number {\n const rect = trackEl.value?.getBoundingClientRect()\n if (!rect || rect.width === 0) return props.min\n const ratio = Math.min(1, Math.max(0, (clientX - rect.left) / rect.width))\n return props.min + ratio * span.value\n}\n\nfunction nearestThumb(value: number): number {\n if (!props.range) return 0\n return Math.abs(value - values.value[0]) <= Math.abs(value - values.value[1]) ? 0 : 1\n}\n\nfunction onTrackPointerDown(event: PointerEvent): void {\n if (props.disabled) return\n const value = valueFromClientX(event.clientX)\n const index = nearestThumb(value)\n activeThumb.value = index\n // Фокусируем активный бегунок сразу — чтобы клавиатура работала после клика по\n // дорожке (div не получает фокус по клику автоматически, только через `.focus()`).\n thumbEls.value[index]?.focus()\n setThumb(index, value, false)\n\n window.addEventListener('pointermove', onPointerMove)\n window.addEventListener('pointerup', onPointerUp)\n}\n\nfunction onPointerMove(event: PointerEvent): void {\n if (activeThumb.value === null) return\n event.preventDefault()\n setThumb(activeThumb.value, valueFromClientX(event.clientX), false)\n}\n\nfunction onPointerUp(): void {\n if (activeThumb.value !== null) {\n // Финальный commit значения.\n emitValue(values.value.slice(), true)\n }\n activeThumb.value = null\n window.removeEventListener('pointermove', onPointerMove)\n window.removeEventListener('pointerup', onPointerUp)\n}\n\nonBeforeUnmount(() => {\n window.removeEventListener('pointermove', onPointerMove)\n window.removeEventListener('pointerup', onPointerUp)\n})\n\n// ————— Клавиатура.\nfunction bigStep(): number {\n // PageUp/Down: 10 шагов либо 10% диапазона (что крупнее).\n return Math.max(props.step * 10, Math.round((span.value / 10) / props.step) * props.step || props.step)\n}\n\nfunction onThumbKeydown(event: KeyboardEvent, index: number): void {\n if (props.disabled) return\n const current = values.value[index]\n let next: number | null = null\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n next = current + props.step\n break\n case 'ArrowLeft':\n case 'ArrowDown':\n next = current - props.step\n break\n case 'PageUp':\n next = current + bigStep()\n break\n case 'PageDown':\n next = current - bigStep()\n break\n case 'Home':\n next = props.min\n break\n case 'End':\n next = props.max\n break\n default:\n return\n }\n\n event.preventDefault()\n setThumb(index, next, true)\n}\n\nconst showTooltipFor = (index: number): boolean => {\n if (props.showTooltip === 'always') return true\n if (!props.showTooltip) return false\n return activeThumb.value === index || hoveredThumb.value === index\n}\n\nfunction thumbAriaLabel(index: number): string | undefined {\n if (props.ariaLabel) return props.range ? `${props.ariaLabel} (${index === 0 ? 'min' : 'max'})` : props.ariaLabel\n return undefined\n}\n</script>\n\n<template>\n <div\n data-gr-slider\n :class=\"sliderRootClass({ size: resolvedSize, disabled, hasMarks: normalizedMarks.length > 0 })\"\n >\n <div\n ref=\"trackEl\"\n data-gr-slider-track\n class=\"relative w-full\"\n :class=\"sliderTrackHeightBySize[resolvedSize]\"\n @pointerdown=\"onTrackPointerDown\"\n >\n <div :class=\"sliderRailClass\" />\n <div data-gr-slider-fill :class=\"sliderFillClass\" :style=\"fillStyle\" />\n\n <!-- Метки делений. -->\n <template v-for=\"mark in normalizedMarks\" :key=\"mark.value\">\n <span\n data-gr-slider-mark\n :class=\"sliderMarkTickClass\"\n :style=\"{ left: `${percent(mark.value)}%` }\"\n aria-hidden=\"true\"\n />\n <span\n data-gr-slider-mark-label\n :class=\"sliderMarkLabelClassFor(percent(mark.value))\"\n :style=\"{ left: `${percent(mark.value)}%` }\"\n >\n {{ mark.label }}\n </span>\n </template>\n\n <!-- Бегунки. -->\n <div\n v-for=\"(value, index) in values\"\n :id=\"index === 0 ? resolvedId : undefined\"\n :key=\"index\"\n :ref=\"(el) => { if (el) thumbEls[index] = el as HTMLElement }\"\n data-gr-slider-thumb\n :data-testid=\"`gr-slider-thumb-${index}`\"\n :class=\"sliderThumbClass({ size: resolvedSize, disabled })\"\n :style=\"{ left: `${percent(value)}%` }\"\n role=\"slider\"\n :tabindex=\"disabled ? -1 : 0\"\n :aria-valuemin=\"range && index === 1 ? values[0] : min\"\n :aria-valuemax=\"range && index === 0 ? values[1] : max\"\n :aria-valuenow=\"value\"\n :aria-orientation=\"'horizontal'\"\n :aria-label=\"thumbAriaLabel(index)\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n :aria-invalid=\"isInvalid ? 'true' : undefined\"\n :aria-describedby=\"index === 0 ? describedBy : undefined\"\n :aria-required=\"isRequired && index === 0 ? 'true' : undefined\"\n @keydown=\"onThumbKeydown($event, index)\"\n @mouseenter=\"hoveredThumb = index\"\n @mouseleave=\"hoveredThumb = null\"\n @focus=\"hoveredThumb = index\"\n @blur=\"hoveredThumb = null\"\n >\n <span\n v-if=\"showTooltipFor(index)\"\n data-gr-slider-tooltip\n :class=\"sliderTooltipClass\"\n >\n {{ tooltipText(value) }}\n </span>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref } from 'vue'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\n\nimport { useGrFormFieldContext } from '../GrFormField/context'\n\nimport {\n sliderFillClass,\n sliderMarkLabelClassFor,\n sliderMarkTickClass,\n sliderRailClass,\n sliderRootClass,\n sliderThumbClass,\n sliderTooltipClass,\n sliderTrackHeightBySize,\n type GrSliderMarks,\n type GrSliderModelValue,\n type GrSliderSize,\n} from './grSliderStyles'\n\nexport type {\n GrSliderMarks,\n GrSliderModelValue,\n GrSliderSize,\n} from './grSliderStyles'\n\n/**\n * Публичный GR-примитив «Slider» (WAI-ARIA slider pattern).\n *\n * Поддерживает одиночное значение и диапазон (`range` — два бегунка), шаг, метки\n * делений, всплывающее значение (tooltip), полную клавиатурную навигацию\n * (стрелки / PageUp/Down / Home / End) и `role=\"slider\"` с\n * `aria-valuemin`/`max`/`now` на каждом бегунке.\n */\nexport interface GrSliderProps {\n /** `number` — одиночное значение; `[lo, hi]` — диапазон (при `range=true`). */\n modelValue: GrSliderModelValue\n min?: number\n max?: number\n step?: number\n /** Диапазон с двумя бегунками; модель — кортеж `[lo, hi]`. */\n range?: boolean\n disabled?: boolean\n size?: GrSliderSize\n /** Метки делений: `{ [value]: label }` или массив значений. */\n marks?: GrSliderMarks\n /** Всплывающее значение над бегунком: `true`/`'hover'` — при hover/drag/focus, `'always'` — всегда. */\n showTooltip?: boolean | 'always' | 'hover'\n /** Форматирование значения в tooltip. */\n formatTooltip?: (value: number) => string\n ariaLabel?: string\n}\n\nconst props = withDefaults(\n defineProps<GrSliderProps>(),\n {\n min: 0,\n max: 100,\n step: 1,\n range: false,\n disabled: false,\n size: undefined,\n marks: undefined,\n showTooltip: false,\n formatTooltip: undefined,\n ariaLabel: undefined,\n },\n)\n\n// Эффективный размер: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedSize = useGrComponentSize(() => props.size, {\n component: 'GrSlider',\n supported: ['sm', 'md', 'lg'],\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: GrSliderModelValue): void\n /** Значение зафиксировано (отпущен бегунок / клавиша). */\n (e: 'change', value: GrSliderModelValue): void\n}>()\n\n// Контекст `GrFormField`: id/aria-describedby/invalid/required как fallback.\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 trackEl = ref<HTMLElement | null>(null)\nconst thumbEls = ref<HTMLElement[]>([])\n\n// Нормализованные границы (гард от max<=min).\nconst span = computed(() => (props.max > props.min ? props.max - props.min : 1))\n\nconst stepDecimals = computed(() => {\n const s = String(props.step)\n const dot = s.indexOf('.')\n return dot >= 0 ? s.length - dot - 1 : 0\n})\n\nfunction clamp(value: number): number {\n return Math.min(props.max, Math.max(props.min, value))\n}\n\nfunction snap(value: number): number {\n const stepped = Math.round((value - props.min) / props.step) * props.step + props.min\n return Number(clamp(stepped).toFixed(stepDecimals.value))\n}\n\nfunction percent(value: number): number {\n return ((clamp(value) - props.min) / span.value) * 100\n}\n\n// ————— Значения бегунков как массив (single = один бегунок).\nconst values = computed<number[]>(() => {\n if (props.range) {\n const v = Array.isArray(props.modelValue) ? props.modelValue : [props.min, props.min]\n return [snap(v[0] ?? props.min), snap(v[1] ?? props.min)]\n }\n const v = Array.isArray(props.modelValue) ? (props.modelValue[0] ?? props.min) : props.modelValue\n return [snap(v)]\n})\n\nconst fillStyle = computed(() => {\n if (props.range) {\n const lo = Math.min(percent(values.value[0]), percent(values.value[1]))\n const hi = Math.max(percent(values.value[0]), percent(values.value[1]))\n return { left: `${lo}%`, right: `${100 - hi}%` }\n }\n return { left: '0%', right: `${100 - percent(values.value[0])}%` }\n})\n\n// ————— Метки делений.\ntype SliderMark = { value: number, label: string }\nconst normalizedMarks = computed<SliderMark[]>(() => {\n if (!props.marks) return []\n if (Array.isArray(props.marks)) return props.marks.map(v => ({ value: v, label: String(v) }))\n return Object.entries(props.marks).map(([value, label]) => ({ value: Number(value), label }))\n})\n\nfunction tooltipText(value: number): string {\n return props.formatTooltip ? props.formatTooltip(value) : String(value)\n}\n\n// ————— Обновление значения конкретного бегунка.\nfunction emitValue(next: number[], commit: boolean): void {\n const payload: GrSliderModelValue = props.range ? [next[0], next[1]] : next[0]\n emit('update:modelValue', payload)\n if (commit) emit('change', payload)\n}\n\nfunction setThumb(index: number, value: number, commit: boolean): void {\n const next = values.value.slice()\n next[index] = snap(value)\n\n // range: не даём бегункам «перепрыгнуть» друг друга.\n if (props.range) {\n if (index === 0) next[0] = Math.min(next[0], next[1])\n else next[1] = Math.max(next[1], next[0])\n }\n\n emitValue(next, commit)\n}\n\n// ————— Pointer-драг.\nconst activeThumb = ref<number | null>(null)\nconst hoveredThumb = ref<number | null>(null)\n\nfunction valueFromClientX(clientX: number): number {\n const rect = trackEl.value?.getBoundingClientRect()\n if (!rect || rect.width === 0) return props.min\n const ratio = Math.min(1, Math.max(0, (clientX - rect.left) / rect.width))\n return props.min + ratio * span.value\n}\n\nfunction nearestThumb(value: number): number {\n if (!props.range) return 0\n return Math.abs(value - values.value[0]) <= Math.abs(value - values.value[1]) ? 0 : 1\n}\n\nfunction onTrackPointerDown(event: PointerEvent): void {\n if (props.disabled) return\n const value = valueFromClientX(event.clientX)\n const index = nearestThumb(value)\n activeThumb.value = index\n // Фокусируем активный бегунок сразу — чтобы клавиатура работала после клика по\n // дорожке (div не получает фокус по клику автоматически, только через `.focus()`).\n thumbEls.value[index]?.focus()\n setThumb(index, value, false)\n\n window.addEventListener('pointermove', onPointerMove)\n window.addEventListener('pointerup', onPointerUp)\n}\n\nfunction onPointerMove(event: PointerEvent): void {\n if (activeThumb.value === null) return\n event.preventDefault()\n setThumb(activeThumb.value, valueFromClientX(event.clientX), false)\n}\n\nfunction onPointerUp(): void {\n if (activeThumb.value !== null) {\n // Финальный commit значения.\n emitValue(values.value.slice(), true)\n }\n activeThumb.value = null\n window.removeEventListener('pointermove', onPointerMove)\n window.removeEventListener('pointerup', onPointerUp)\n}\n\nonBeforeUnmount(() => {\n window.removeEventListener('pointermove', onPointerMove)\n window.removeEventListener('pointerup', onPointerUp)\n})\n\n// ————— Клавиатура.\nfunction bigStep(): number {\n // PageUp/Down: 10 шагов либо 10% диапазона (что крупнее).\n return Math.max(props.step * 10, Math.round((span.value / 10) / props.step) * props.step || props.step)\n}\n\nfunction onThumbKeydown(event: KeyboardEvent, index: number): void {\n if (props.disabled) return\n const current = values.value[index]\n let next: number | null = null\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n next = current + props.step\n break\n case 'ArrowLeft':\n case 'ArrowDown':\n next = current - props.step\n break\n case 'PageUp':\n next = current + bigStep()\n break\n case 'PageDown':\n next = current - bigStep()\n break\n case 'Home':\n next = props.min\n break\n case 'End':\n next = props.max\n break\n default:\n return\n }\n\n event.preventDefault()\n setThumb(index, next, true)\n}\n\nconst showTooltipFor = (index: number): boolean => {\n if (props.showTooltip === 'always') return true\n if (!props.showTooltip) return false\n return activeThumb.value === index || hoveredThumb.value === index\n}\n\nfunction thumbAriaLabel(index: number): string | undefined {\n if (props.ariaLabel) return props.range ? `${props.ariaLabel} (${index === 0 ? 'min' : 'max'})` : props.ariaLabel\n return undefined\n}\n</script>\n\n<template>\n <div\n data-gr-slider\n :class=\"sliderRootClass({ size: resolvedSize, disabled, hasMarks: normalizedMarks.length > 0 })\"\n >\n <div\n ref=\"trackEl\"\n data-gr-slider-track\n class=\"relative w-full\"\n :class=\"sliderTrackHeightBySize[resolvedSize]\"\n @pointerdown=\"onTrackPointerDown\"\n >\n <div :class=\"sliderRailClass\" />\n <div data-gr-slider-fill :class=\"sliderFillClass\" :style=\"fillStyle\" />\n\n <!-- Метки делений. -->\n <template v-for=\"mark in normalizedMarks\" :key=\"mark.value\">\n <span\n data-gr-slider-mark\n :class=\"sliderMarkTickClass\"\n :style=\"{ left: `${percent(mark.value)}%` }\"\n aria-hidden=\"true\"\n />\n <span\n data-gr-slider-mark-label\n :class=\"sliderMarkLabelClassFor(percent(mark.value))\"\n :style=\"{ left: `${percent(mark.value)}%` }\"\n >\n {{ mark.label }}\n </span>\n </template>\n\n <!-- Бегунки. -->\n <div\n v-for=\"(value, index) in values\"\n :id=\"index === 0 ? resolvedId : undefined\"\n :key=\"index\"\n :ref=\"(el) => { if (el) thumbEls[index] = el as HTMLElement }\"\n data-gr-slider-thumb\n :data-testid=\"`gr-slider-thumb-${index}`\"\n :class=\"sliderThumbClass({ size: resolvedSize, disabled })\"\n :style=\"{ left: `${percent(value)}%` }\"\n role=\"slider\"\n :tabindex=\"disabled ? -1 : 0\"\n :aria-valuemin=\"range && index === 1 ? values[0] : min\"\n :aria-valuemax=\"range && index === 0 ? values[1] : max\"\n :aria-valuenow=\"value\"\n :aria-orientation=\"'horizontal'\"\n :aria-label=\"thumbAriaLabel(index)\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n :aria-invalid=\"isInvalid ? 'true' : undefined\"\n :aria-describedby=\"index === 0 ? describedBy : undefined\"\n :aria-required=\"isRequired && index === 0 ? 'true' : undefined\"\n @keydown=\"onThumbKeydown($event, index)\"\n @mouseenter=\"hoveredThumb = index\"\n @mouseleave=\"hoveredThumb = null\"\n @focus=\"hoveredThumb = index\"\n @blur=\"hoveredThumb = null\"\n >\n <span\n v-if=\"showTooltipFor(index)\"\n data-gr-slider-tooltip\n :class=\"sliderTooltipClass\"\n >\n {{ tooltipText(value) }}\n </span>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { t as GrSkeleton_default } from "../../GrSkeleton/chunks/GrSkeleton-BucA5F4J.js";
|
|
2
|
+
import { a as statisticTitleClass, c as statisticTrendIconByTrend, i as statisticPlaceholderHeightBySize, l as statisticTrendSizeBySize, o as statisticTitleSizeBySize, r as statisticAffixSizeBySize, s as statisticTrendClassByTrend, u as statisticValueClass } from "../../../chunks/config-BDSHekVC.js";
|
|
3
|
+
import { computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, renderSlot, toDisplayString, unref } from "vue";
|
|
4
|
+
//#region src/components/GrStatistic/formatStatisticValue.ts
|
|
5
|
+
/**
|
|
6
|
+
* Форматирует значение показателя: фиксирует точность и расставляет разделители.
|
|
7
|
+
*
|
|
8
|
+
* Нечисловые значения возвращаются без изменений — это позволяет показывать в
|
|
9
|
+
* `GrStatistic` уже готовые строки («2 ч 15 мин», «—») без обходных пропов.
|
|
10
|
+
* Вынесено из SFC отдельным модулем, чтобы тестировалось без монтирования.
|
|
11
|
+
*/
|
|
12
|
+
function formatStatisticValue(value, options = {}) {
|
|
13
|
+
const { precision, groupSeparator = " ", decimalSeparator = "." } = options;
|
|
14
|
+
const numeric = typeof value === "number" ? value : Number(value);
|
|
15
|
+
if (typeof value === "string" && (value.trim() === "" || !Number.isFinite(numeric))) return value;
|
|
16
|
+
if (!Number.isFinite(numeric)) return String(value);
|
|
17
|
+
const fixed = precision === void 0 ? String(numeric) : numeric.toFixed(precision);
|
|
18
|
+
if (fixed.includes("e") || fixed.includes("E")) return fixed;
|
|
19
|
+
const negative = fixed.startsWith("-");
|
|
20
|
+
const [intPart, fracPart] = (negative ? fixed.slice(1) : fixed).split(".");
|
|
21
|
+
const grouped = groupSeparator ? intPart.replace(/\B(?=(\d{3})+(?!\d))/g, groupSeparator) : intPart;
|
|
22
|
+
return [
|
|
23
|
+
negative ? "-" : "",
|
|
24
|
+
grouped,
|
|
25
|
+
fracPart ? `${decimalSeparator}${fracPart}` : ""
|
|
26
|
+
].join("");
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/components/GrStatistic/GrStatistic.vue?vue&type=script&setup=true&lang.ts
|
|
30
|
+
var _hoisted_1 = {
|
|
31
|
+
"data-gr-statistic": "",
|
|
32
|
+
class: "flex items-start gap-3"
|
|
33
|
+
};
|
|
34
|
+
var _hoisted_2 = {
|
|
35
|
+
key: 0,
|
|
36
|
+
"data-gr-statistic-icon": "",
|
|
37
|
+
class: "mt-0.5 inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-[var(--gr-radius-lg)] bg-[var(--gr-muted)] text-[var(--gr-muted-fg)]"
|
|
38
|
+
};
|
|
39
|
+
var _hoisted_3 = { class: "min-w-0" };
|
|
40
|
+
var _hoisted_4 = {
|
|
41
|
+
key: 1,
|
|
42
|
+
"data-gr-statistic-placeholder": "",
|
|
43
|
+
"data-testid": "gr-statistic-placeholder",
|
|
44
|
+
class: "mt-1",
|
|
45
|
+
role: "status",
|
|
46
|
+
"aria-busy": "true"
|
|
47
|
+
};
|
|
48
|
+
var _hoisted_5 = {
|
|
49
|
+
key: 2,
|
|
50
|
+
"data-gr-statistic-value": "",
|
|
51
|
+
"data-testid": "gr-statistic-value",
|
|
52
|
+
class: "mt-0.5 flex items-baseline gap-1"
|
|
53
|
+
};
|
|
54
|
+
//#endregion
|
|
55
|
+
//#region src/components/GrStatistic/GrStatistic.vue
|
|
56
|
+
var GrStatistic_default = /* @__PURE__ */ defineComponent({
|
|
57
|
+
__name: "GrStatistic",
|
|
58
|
+
props: {
|
|
59
|
+
value: {},
|
|
60
|
+
title: { default: void 0 },
|
|
61
|
+
precision: { default: void 0 },
|
|
62
|
+
groupSeparator: { default: " " },
|
|
63
|
+
decimalSeparator: { default: "." },
|
|
64
|
+
prefix: { default: void 0 },
|
|
65
|
+
suffix: { default: void 0 },
|
|
66
|
+
icon: { default: void 0 },
|
|
67
|
+
size: { default: "md" },
|
|
68
|
+
tone: { default: "neutral" },
|
|
69
|
+
trend: { default: void 0 },
|
|
70
|
+
trendText: { default: void 0 },
|
|
71
|
+
loading: {
|
|
72
|
+
type: Boolean,
|
|
73
|
+
default: false
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
setup(__props) {
|
|
77
|
+
const props = __props;
|
|
78
|
+
const formatted = computed(() => formatStatisticValue(props.value, {
|
|
79
|
+
precision: props.precision,
|
|
80
|
+
groupSeparator: props.groupSeparator,
|
|
81
|
+
decimalSeparator: props.decimalSeparator
|
|
82
|
+
}));
|
|
83
|
+
return (_ctx, _cache) => {
|
|
84
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [__props.icon || _ctx.$slots.icon ? (openBlock(), createElementBlock("span", _hoisted_2, [renderSlot(_ctx.$slots, "icon", {}, () => [createElementVNode("span", {
|
|
85
|
+
class: normalizeClass(["block h-4 w-4", __props.icon]),
|
|
86
|
+
"aria-hidden": "true"
|
|
87
|
+
}, null, 2)])])) : createCommentVNode("", true), createElementVNode("div", _hoisted_3, [
|
|
88
|
+
__props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("div", {
|
|
89
|
+
key: 0,
|
|
90
|
+
"data-gr-statistic-title": "",
|
|
91
|
+
class: normalizeClass([unref(statisticTitleClass), unref(statisticTitleSizeBySize)[__props.size]])
|
|
92
|
+
}, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])], 2)) : createCommentVNode("", true),
|
|
93
|
+
__props.loading ? (openBlock(), createElementBlock("div", _hoisted_4, [createVNode(GrSkeleton_default, {
|
|
94
|
+
width: "6rem",
|
|
95
|
+
height: unref(statisticPlaceholderHeightBySize)[__props.size],
|
|
96
|
+
rounded: "var(--gr-radius-md)"
|
|
97
|
+
}, null, 8, ["height"])])) : (openBlock(), createElementBlock("div", _hoisted_5, [
|
|
98
|
+
__props.prefix || _ctx.$slots.prefix ? (openBlock(), createElementBlock("span", {
|
|
99
|
+
key: 0,
|
|
100
|
+
"data-gr-statistic-prefix": "",
|
|
101
|
+
class: normalizeClass(["text-[var(--gr-muted-fg)]", unref(statisticAffixSizeBySize)[__props.size]])
|
|
102
|
+
}, [renderSlot(_ctx.$slots, "prefix", {}, () => [createTextVNode(toDisplayString(__props.prefix), 1)])], 2)) : createCommentVNode("", true),
|
|
103
|
+
createElementVNode("span", { class: normalizeClass(unref(statisticValueClass)({
|
|
104
|
+
size: __props.size,
|
|
105
|
+
tone: __props.tone
|
|
106
|
+
})) }, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(formatted.value), 1)])], 2),
|
|
107
|
+
__props.suffix || _ctx.$slots.suffix ? (openBlock(), createElementBlock("span", {
|
|
108
|
+
key: 1,
|
|
109
|
+
"data-gr-statistic-suffix": "",
|
|
110
|
+
class: normalizeClass(["text-[var(--gr-muted-fg)]", unref(statisticAffixSizeBySize)[__props.size]])
|
|
111
|
+
}, [renderSlot(_ctx.$slots, "suffix", {}, () => [createTextVNode(toDisplayString(__props.suffix), 1)])], 2)) : createCommentVNode("", true)
|
|
112
|
+
])),
|
|
113
|
+
__props.trend || __props.trendText || _ctx.$slots.trend ? (openBlock(), createElementBlock("div", {
|
|
114
|
+
key: 3,
|
|
115
|
+
"data-gr-statistic-trend": "",
|
|
116
|
+
"data-testid": "gr-statistic-trend",
|
|
117
|
+
class: normalizeClass(["mt-1 inline-flex items-center gap-1", [unref(statisticTrendSizeBySize)[__props.size], unref(statisticTrendClassByTrend)[__props.trend ?? "flat"]]])
|
|
118
|
+
}, [renderSlot(_ctx.$slots, "trend", {}, () => [__props.trend ? (openBlock(), createElementBlock("span", {
|
|
119
|
+
key: 0,
|
|
120
|
+
class: normalizeClass(["block h-3.5 w-3.5", unref(statisticTrendIconByTrend)[__props.trend]]),
|
|
121
|
+
"aria-hidden": "true"
|
|
122
|
+
}, null, 2)) : createCommentVNode("", true), createElementVNode("span", null, toDisplayString(__props.trendText), 1)])], 2)) : createCommentVNode("", true)
|
|
123
|
+
])]);
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
//#endregion
|
|
128
|
+
export { formatStatisticValue as n, GrStatistic_default as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrStatistic-gHiAwrX5.js","names":["$slots"],"sources":["../../../../src/components/GrStatistic/formatStatisticValue.ts","../../../../src/components/GrStatistic/GrStatistic.vue","../../../../src/components/GrStatistic/GrStatistic.vue"],"sourcesContent":["export type GrStatisticFormatOptions = {\n /** Число знаков после запятой. `undefined` — оставить как есть. */\n precision?: number\n /** Разделитель групп разрядов. */\n groupSeparator?: string\n /** Десятичный разделитель. */\n decimalSeparator?: string\n}\n\n/**\n * Форматирует значение показателя: фиксирует точность и расставляет разделители.\n *\n * Нечисловые значения возвращаются без изменений — это позволяет показывать в\n * `GrStatistic` уже готовые строки («2 ч 15 мин», «—») без обходных пропов.\n * Вынесено из SFC отдельным модулем, чтобы тестировалось без монтирования.\n */\nexport function formatStatisticValue(\n value: number | string,\n options: GrStatisticFormatOptions = {},\n): string {\n const { precision, groupSeparator = ' ', decimalSeparator = '.' } = options\n\n const numeric = typeof value === 'number' ? value : Number(value)\n if (typeof value === 'string' && (value.trim() === '' || !Number.isFinite(numeric))) {\n return value\n }\n if (!Number.isFinite(numeric)) return String(value)\n\n const fixed = precision === undefined ? String(numeric) : numeric.toFixed(precision)\n // `toFixed` не даёт экспоненциальной записи, а `String(число)` — может (1e21+).\n // В таком случае группировать нечего: возвращаем как есть.\n if (fixed.includes('e') || fixed.includes('E')) return fixed\n\n const negative = fixed.startsWith('-')\n const [intPart, fracPart] = (negative ? fixed.slice(1) : fixed).split('.')\n\n const grouped = groupSeparator\n ? intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, groupSeparator)\n : intPart\n\n return [\n negative ? '-' : '',\n grouped,\n fracPart ? `${decimalSeparator}${fracPart}` : '',\n ].join('')\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport GrSkeleton from '../GrSkeleton/GrSkeleton.vue'\n\nimport { formatStatisticValue } from './formatStatisticValue'\n\nimport {\n statisticAffixSizeBySize,\n statisticPlaceholderHeightBySize,\n statisticTitleClass,\n statisticTitleSizeBySize,\n statisticTrendClassByTrend,\n statisticTrendIconByTrend,\n statisticTrendSizeBySize,\n statisticValueClass,\n type GrStatisticSize,\n type GrStatisticTone,\n type GrStatisticTrend,\n} from './grStatisticStyles'\n\nexport type {\n GrStatisticSize,\n GrStatisticTone,\n GrStatisticTrend,\n} from './grStatisticStyles'\nexport type { GrStatisticFormatOptions } from './formatStatisticValue'\n\n/**\n * Публичный GR-примитив «Statistic» — крупный числовой показатель с подписью,\n * префиксом/суффиксом и строкой динамики.\n *\n * Компонент презентационный: не грузит данные и не считает дельту, только\n * форматирует и подаёт. Форматирование — чистая функция `formatStatisticValue`.\n */\nexport interface GrStatisticProps {\n /** Значение показателя. Нечисловая строка выводится как есть. */\n value: number | string\n /** Подпись над значением. */\n title?: string\n /** Число знаков после запятой. */\n precision?: number\n /** Разделитель разрядов (по умолчанию — узкий пробел). */\n groupSeparator?: string\n decimalSeparator?: string\n /** Приписка перед значением (валюта, знак). */\n prefix?: string\n /** Приписка после значения (единица измерения, `%`). */\n suffix?: string\n /** UnoCSS-класс иконки слева от блока (например `i-lucide-users`). */\n icon?: string\n size?: GrStatisticSize\n /** Тон значения; точечно перекрывается `--gr-statistic-value-color`. */\n tone?: GrStatisticTone\n /** Направление динамики — задаёт цвет и иконку строки под значением. */\n trend?: GrStatisticTrend\n /** Текст динамики (например `+12,5% к прошлой неделе`). */\n trendText?: string\n /** Состояние загрузки: вместо значения — плейсхолдер. */\n loading?: boolean\n}\n\nconst props = withDefaults(\n defineProps<GrStatisticProps>(),\n {\n title: undefined,\n precision: undefined,\n groupSeparator: ' ',\n decimalSeparator: '.',\n prefix: undefined,\n suffix: undefined,\n icon: undefined,\n size: 'md',\n tone: 'neutral',\n trend: undefined,\n trendText: undefined,\n loading: false,\n },\n)\n\nconst formatted = computed(() => formatStatisticValue(props.value, {\n precision: props.precision,\n groupSeparator: props.groupSeparator,\n decimalSeparator: props.decimalSeparator,\n}))\n</script>\n\n<template>\n <div data-gr-statistic class=\"flex items-start gap-3\">\n <span\n v-if=\"icon || $slots.icon\"\n data-gr-statistic-icon\n class=\"mt-0.5 inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-[var(--gr-radius-lg)] bg-[var(--gr-muted)] text-[var(--gr-muted-fg)]\"\n >\n <slot name=\"icon\">\n <span class=\"block h-4 w-4\" :class=\"icon\" aria-hidden=\"true\" />\n </slot>\n </span>\n\n <div class=\"min-w-0\">\n <div\n v-if=\"title || $slots.title\"\n data-gr-statistic-title\n :class=\"[statisticTitleClass, statisticTitleSizeBySize[size]]\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </div>\n\n <!-- Плейсхолдер загрузки повторяет высоту строки значения, чтобы блок не прыгал. -->\n <div\n v-if=\"loading\"\n data-gr-statistic-placeholder\n data-testid=\"gr-statistic-placeholder\"\n class=\"mt-1\"\n role=\"status\"\n aria-busy=\"true\"\n >\n <GrSkeleton\n width=\"6rem\"\n :height=\"statisticPlaceholderHeightBySize[size]\"\n rounded=\"var(--gr-radius-md)\"\n />\n </div>\n\n <div\n v-else\n data-gr-statistic-value\n data-testid=\"gr-statistic-value\"\n class=\"mt-0.5 flex items-baseline gap-1\"\n >\n <span\n v-if=\"prefix || $slots.prefix\"\n data-gr-statistic-prefix\n class=\"text-[var(--gr-muted-fg)]\"\n :class=\"statisticAffixSizeBySize[size]\"\n >\n <slot name=\"prefix\">{{ prefix }}</slot>\n </span>\n\n <span :class=\"statisticValueClass({ size, tone })\">\n <slot>{{ formatted }}</slot>\n </span>\n\n <span\n v-if=\"suffix || $slots.suffix\"\n data-gr-statistic-suffix\n class=\"text-[var(--gr-muted-fg)]\"\n :class=\"statisticAffixSizeBySize[size]\"\n >\n <slot name=\"suffix\">{{ suffix }}</slot>\n </span>\n </div>\n\n <div\n v-if=\"trend || trendText || $slots.trend\"\n data-gr-statistic-trend\n data-testid=\"gr-statistic-trend\"\n class=\"mt-1 inline-flex items-center gap-1\"\n :class=\"[statisticTrendSizeBySize[size], statisticTrendClassByTrend[trend ?? 'flat']]\"\n >\n <slot name=\"trend\">\n <span\n v-if=\"trend\"\n class=\"block h-3.5 w-3.5\"\n :class=\"statisticTrendIconByTrend[trend]\"\n aria-hidden=\"true\"\n />\n <span>{{ trendText }}</span>\n </slot>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport GrSkeleton from '../GrSkeleton/GrSkeleton.vue'\n\nimport { formatStatisticValue } from './formatStatisticValue'\n\nimport {\n statisticAffixSizeBySize,\n statisticPlaceholderHeightBySize,\n statisticTitleClass,\n statisticTitleSizeBySize,\n statisticTrendClassByTrend,\n statisticTrendIconByTrend,\n statisticTrendSizeBySize,\n statisticValueClass,\n type GrStatisticSize,\n type GrStatisticTone,\n type GrStatisticTrend,\n} from './grStatisticStyles'\n\nexport type {\n GrStatisticSize,\n GrStatisticTone,\n GrStatisticTrend,\n} from './grStatisticStyles'\nexport type { GrStatisticFormatOptions } from './formatStatisticValue'\n\n/**\n * Публичный GR-примитив «Statistic» — крупный числовой показатель с подписью,\n * префиксом/суффиксом и строкой динамики.\n *\n * Компонент презентационный: не грузит данные и не считает дельту, только\n * форматирует и подаёт. Форматирование — чистая функция `formatStatisticValue`.\n */\nexport interface GrStatisticProps {\n /** Значение показателя. Нечисловая строка выводится как есть. */\n value: number | string\n /** Подпись над значением. */\n title?: string\n /** Число знаков после запятой. */\n precision?: number\n /** Разделитель разрядов (по умолчанию — узкий пробел). */\n groupSeparator?: string\n decimalSeparator?: string\n /** Приписка перед значением (валюта, знак). */\n prefix?: string\n /** Приписка после значения (единица измерения, `%`). */\n suffix?: string\n /** UnoCSS-класс иконки слева от блока (например `i-lucide-users`). */\n icon?: string\n size?: GrStatisticSize\n /** Тон значения; точечно перекрывается `--gr-statistic-value-color`. */\n tone?: GrStatisticTone\n /** Направление динамики — задаёт цвет и иконку строки под значением. */\n trend?: GrStatisticTrend\n /** Текст динамики (например `+12,5% к прошлой неделе`). */\n trendText?: string\n /** Состояние загрузки: вместо значения — плейсхолдер. */\n loading?: boolean\n}\n\nconst props = withDefaults(\n defineProps<GrStatisticProps>(),\n {\n title: undefined,\n precision: undefined,\n groupSeparator: ' ',\n decimalSeparator: '.',\n prefix: undefined,\n suffix: undefined,\n icon: undefined,\n size: 'md',\n tone: 'neutral',\n trend: undefined,\n trendText: undefined,\n loading: false,\n },\n)\n\nconst formatted = computed(() => formatStatisticValue(props.value, {\n precision: props.precision,\n groupSeparator: props.groupSeparator,\n decimalSeparator: props.decimalSeparator,\n}))\n</script>\n\n<template>\n <div data-gr-statistic class=\"flex items-start gap-3\">\n <span\n v-if=\"icon || $slots.icon\"\n data-gr-statistic-icon\n class=\"mt-0.5 inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-[var(--gr-radius-lg)] bg-[var(--gr-muted)] text-[var(--gr-muted-fg)]\"\n >\n <slot name=\"icon\">\n <span class=\"block h-4 w-4\" :class=\"icon\" aria-hidden=\"true\" />\n </slot>\n </span>\n\n <div class=\"min-w-0\">\n <div\n v-if=\"title || $slots.title\"\n data-gr-statistic-title\n :class=\"[statisticTitleClass, statisticTitleSizeBySize[size]]\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </div>\n\n <!-- Плейсхолдер загрузки повторяет высоту строки значения, чтобы блок не прыгал. -->\n <div\n v-if=\"loading\"\n data-gr-statistic-placeholder\n data-testid=\"gr-statistic-placeholder\"\n class=\"mt-1\"\n role=\"status\"\n aria-busy=\"true\"\n >\n <GrSkeleton\n width=\"6rem\"\n :height=\"statisticPlaceholderHeightBySize[size]\"\n rounded=\"var(--gr-radius-md)\"\n />\n </div>\n\n <div\n v-else\n data-gr-statistic-value\n data-testid=\"gr-statistic-value\"\n class=\"mt-0.5 flex items-baseline gap-1\"\n >\n <span\n v-if=\"prefix || $slots.prefix\"\n data-gr-statistic-prefix\n class=\"text-[var(--gr-muted-fg)]\"\n :class=\"statisticAffixSizeBySize[size]\"\n >\n <slot name=\"prefix\">{{ prefix }}</slot>\n </span>\n\n <span :class=\"statisticValueClass({ size, tone })\">\n <slot>{{ formatted }}</slot>\n </span>\n\n <span\n v-if=\"suffix || $slots.suffix\"\n data-gr-statistic-suffix\n class=\"text-[var(--gr-muted-fg)]\"\n :class=\"statisticAffixSizeBySize[size]\"\n >\n <slot name=\"suffix\">{{ suffix }}</slot>\n </span>\n </div>\n\n <div\n v-if=\"trend || trendText || $slots.trend\"\n data-gr-statistic-trend\n data-testid=\"gr-statistic-trend\"\n class=\"mt-1 inline-flex items-center gap-1\"\n :class=\"[statisticTrendSizeBySize[size], statisticTrendClassByTrend[trend ?? 'flat']]\"\n >\n <slot name=\"trend\">\n <span\n v-if=\"trend\"\n class=\"block h-3.5 w-3.5\"\n :class=\"statisticTrendIconByTrend[trend]\"\n aria-hidden=\"true\"\n />\n <span>{{ trendText }}</span>\n </slot>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { n as formatStatisticValue, t as GrStatistic_default } from "./chunks/GrStatistic-gHiAwrX5.js";
|
|
2
|
+
import { n as grStatisticSafelist, t as grStatisticConfig } from "../../chunks/config-BDSHekVC.js";
|
|
3
|
+
export { GrStatistic_default as GrStatistic, GrStatistic_default as default, formatStatisticValue, grStatisticConfig, grStatisticSafelist };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { o as useGrComponentSize } from "../../../chunks/context-DfWYCBB-.js";
|
|
2
|
+
import { a as grSwitchTrackClass, i as grSwitchThumbClass, r as grSwitchLabelClass } from "../../../chunks/config-LqDC_rvp.js";
|
|
2
3
|
import { computed, createCommentVNode, createElementBlock, createElementVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, renderSlot } from "vue";
|
|
3
4
|
//#region src/components/GrSwitch/GrSwitch.vue?vue&type=script&setup=true&lang.ts
|
|
4
5
|
var _hoisted_1 = [
|
|
@@ -17,7 +18,7 @@ var GrSwitch_default = /* @__PURE__ */ defineComponent({
|
|
|
17
18
|
default: false
|
|
18
19
|
},
|
|
19
20
|
ariaLabel: { default: void 0 },
|
|
20
|
-
size: { default:
|
|
21
|
+
size: { default: void 0 },
|
|
21
22
|
activeBackgroundColor: { default: void 0 },
|
|
22
23
|
inactiveBackgroundColor: { default: void 0 }
|
|
23
24
|
},
|
|
@@ -25,24 +26,32 @@ var GrSwitch_default = /* @__PURE__ */ defineComponent({
|
|
|
25
26
|
setup(__props, { emit: __emit }) {
|
|
26
27
|
const getCustomColor = (value) => value?.trim() || void 0;
|
|
27
28
|
const props = __props;
|
|
29
|
+
const resolvedSize = useGrComponentSize(() => props.size, {
|
|
30
|
+
component: "GrSwitch",
|
|
31
|
+
supported: [
|
|
32
|
+
"sm",
|
|
33
|
+
"md",
|
|
34
|
+
"lg"
|
|
35
|
+
]
|
|
36
|
+
});
|
|
28
37
|
const emit = __emit;
|
|
29
|
-
const trackClass = computed(() => grSwitchTrackClass(
|
|
38
|
+
const trackClass = computed(() => grSwitchTrackClass(resolvedSize.value));
|
|
30
39
|
const trackStyle = computed(() => {
|
|
31
40
|
const isChecked = props.modelValue;
|
|
32
|
-
const defaultBackgroundColor = isChecked ? "var(--primary)" : "var(--muted)";
|
|
41
|
+
const defaultBackgroundColor = isChecked ? "var(--gr-primary)" : "var(--gr-muted)";
|
|
33
42
|
const customBackgroundColor = getCustomColor(isChecked ? props.activeBackgroundColor : props.inactiveBackgroundColor);
|
|
34
43
|
const backgroundColor = customBackgroundColor ?? defaultBackgroundColor;
|
|
35
44
|
return {
|
|
36
45
|
"--gr-switch-track-bg": backgroundColor,
|
|
37
|
-
"--gr-switch-track-brd": customBackgroundColor ? backgroundColor : isChecked ? "var(--primary)" : "var(--brd)",
|
|
46
|
+
"--gr-switch-track-brd": customBackgroundColor ? backgroundColor : isChecked ? "var(--gr-primary)" : "var(--gr-brd)",
|
|
38
47
|
backgroundColor: "var(--gr-switch-track-bg)"
|
|
39
48
|
};
|
|
40
49
|
});
|
|
41
50
|
const thumbClass = computed(() => grSwitchThumbClass({
|
|
42
|
-
size:
|
|
51
|
+
size: resolvedSize.value,
|
|
43
52
|
checked: props.modelValue
|
|
44
53
|
}));
|
|
45
|
-
const labelClass = computed(() => grSwitchLabelClass(
|
|
54
|
+
const labelClass = computed(() => grSwitchLabelClass(resolvedSize.value));
|
|
46
55
|
function toggle() {
|
|
47
56
|
if (props.disabled) return;
|
|
48
57
|
emit("update:modelValue", !props.modelValue);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrSwitch-CJdRvS0s.js","names":["$slots"],"sources":["../../../../src/components/GrSwitch/GrSwitch.vue","../../../../src/components/GrSwitch/GrSwitch.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {computed} from 'vue'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\n\nimport {\n grSwitchLabelClass,\n grSwitchThumbClass,\n grSwitchTrackClass,\n type GrSwitchSize,\n} from './grSwitchStyles'\n\nexport type {GrSwitchSize} from './grSwitchStyles'\n\n/**\n * Пропсы публичного GR-примитива «Switch».\n */\nexport interface GrSwitchProps {\n modelValue: boolean\n disabled?: boolean\n ariaLabel?: string\n size?: GrSwitchSize\n /** Кастомный цвет фона в активном состоянии. Если не задан — `var(--gr-primary)`. */\n activeBackgroundColor?: string\n /** Кастомный цвет фона в неактивном состоянии. Если не задан — `var(--gr-muted)`. */\n inactiveBackgroundColor?: string\n}\n\nconst getCustomColor = (value?: string) => value?.trim() || undefined\n\nconst props = withDefaults(\n defineProps<GrSwitchProps>(),\n {\n disabled: false,\n ariaLabel: undefined,\n size: undefined,\n activeBackgroundColor: undefined,\n inactiveBackgroundColor: undefined,\n },\n)\n\n// Эффективный размер: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedSize = useGrComponentSize(() => props.size, {\n component: 'GrSwitch',\n supported: ['sm', 'md', 'lg'],\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: boolean): void\n}>()\n\nconst trackClass = computed(() => grSwitchTrackClass(resolvedSize.value))\n\nconst trackStyle = computed(() => {\n const isChecked = props.modelValue\n const defaultBackgroundColor = isChecked ? 'var(--gr-primary)' : 'var(--gr-muted)'\n const customBackgroundColor = getCustomColor(\n isChecked ? props.activeBackgroundColor : props.inactiveBackgroundColor,\n )\n const backgroundColor = customBackgroundColor ?? defaultBackgroundColor\n\n return {\n '--gr-switch-track-bg': backgroundColor,\n '--gr-switch-track-brd': customBackgroundColor\n ? backgroundColor\n : isChecked\n ? 'var(--gr-primary)'\n : 'var(--gr-brd)',\n backgroundColor: 'var(--gr-switch-track-bg)',\n }\n})\n\nconst thumbClass = computed(() => grSwitchThumbClass({size: resolvedSize.value, checked: props.modelValue}))\n\nconst labelClass = computed(() => grSwitchLabelClass(resolvedSize.value))\n\nfunction toggle(): void {\n if (props.disabled) {\n return\n }\n\n emit('update:modelValue', !props.modelValue)\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n role=\"switch\"\n data-gr-switch\n :aria-checked=\"modelValue ? 'true' : 'false'\"\n :aria-label=\"ariaLabel\"\n :disabled=\"disabled\"\n class=\"inline-flex items-center gap-2 select-none disabled:opacity-50 disabled:cursor-not-allowed\"\n @click=\"toggle\"\n >\n <span\n data-testid=\"gr-switch-track\"\n data-gr-switch-track\n :class=\"trackClass\"\n :style=\"trackStyle\"\n >\n <span\n data-testid=\"gr-switch-thumb\"\n data-gr-switch-thumb\n :class=\"thumbClass\"\n aria-hidden=\"true\"\n />\n </span>\n <span\n v-if=\"$slots.default\"\n data-gr-switch-label\n :class=\"labelClass\"\n >\n <slot />\n </span>\n </button>\n</template>\n","<script setup lang=\"ts\">\nimport {computed} from 'vue'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\n\nimport {\n grSwitchLabelClass,\n grSwitchThumbClass,\n grSwitchTrackClass,\n type GrSwitchSize,\n} from './grSwitchStyles'\n\nexport type {GrSwitchSize} from './grSwitchStyles'\n\n/**\n * Пропсы публичного GR-примитива «Switch».\n */\nexport interface GrSwitchProps {\n modelValue: boolean\n disabled?: boolean\n ariaLabel?: string\n size?: GrSwitchSize\n /** Кастомный цвет фона в активном состоянии. Если не задан — `var(--gr-primary)`. */\n activeBackgroundColor?: string\n /** Кастомный цвет фона в неактивном состоянии. Если не задан — `var(--gr-muted)`. */\n inactiveBackgroundColor?: string\n}\n\nconst getCustomColor = (value?: string) => value?.trim() || undefined\n\nconst props = withDefaults(\n defineProps<GrSwitchProps>(),\n {\n disabled: false,\n ariaLabel: undefined,\n size: undefined,\n activeBackgroundColor: undefined,\n inactiveBackgroundColor: undefined,\n },\n)\n\n// Эффективный размер: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedSize = useGrComponentSize(() => props.size, {\n component: 'GrSwitch',\n supported: ['sm', 'md', 'lg'],\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: boolean): void\n}>()\n\nconst trackClass = computed(() => grSwitchTrackClass(resolvedSize.value))\n\nconst trackStyle = computed(() => {\n const isChecked = props.modelValue\n const defaultBackgroundColor = isChecked ? 'var(--gr-primary)' : 'var(--gr-muted)'\n const customBackgroundColor = getCustomColor(\n isChecked ? props.activeBackgroundColor : props.inactiveBackgroundColor,\n )\n const backgroundColor = customBackgroundColor ?? defaultBackgroundColor\n\n return {\n '--gr-switch-track-bg': backgroundColor,\n '--gr-switch-track-brd': customBackgroundColor\n ? backgroundColor\n : isChecked\n ? 'var(--gr-primary)'\n : 'var(--gr-brd)',\n backgroundColor: 'var(--gr-switch-track-bg)',\n }\n})\n\nconst thumbClass = computed(() => grSwitchThumbClass({size: resolvedSize.value, checked: props.modelValue}))\n\nconst labelClass = computed(() => grSwitchLabelClass(resolvedSize.value))\n\nfunction toggle(): void {\n if (props.disabled) {\n return\n }\n\n emit('update:modelValue', !props.modelValue)\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n role=\"switch\"\n data-gr-switch\n :aria-checked=\"modelValue ? 'true' : 'false'\"\n :aria-label=\"ariaLabel\"\n :disabled=\"disabled\"\n class=\"inline-flex items-center gap-2 select-none disabled:opacity-50 disabled:cursor-not-allowed\"\n @click=\"toggle\"\n >\n <span\n data-testid=\"gr-switch-track\"\n data-gr-switch-track\n :class=\"trackClass\"\n :style=\"trackStyle\"\n >\n <span\n data-testid=\"gr-switch-thumb\"\n data-gr-switch-thumb\n :class=\"thumbClass\"\n aria-hidden=\"true\"\n />\n </span>\n <span\n v-if=\"$slots.default\"\n data-gr-switch-label\n :class=\"labelClass\"\n >\n <slot />\n </span>\n </button>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;EA4BA,MAAM,kBAAkB,UAAmB,OAAO,KAAK,KAAK,KAAA;EAE5D,MAAM,QAAQ;EAYd,MAAM,eAAe,yBAAyB,MAAM,MAAM;GACxD,WAAW;GACX,WAAW;IAAC;IAAM;IAAM;GAAI;EAC9B,CAAC;EAED,MAAM,OAAO;EAIb,MAAM,aAAa,eAAe,mBAAmB,aAAa,KAAK,CAAC;EAExE,MAAM,aAAa,eAAe;GAChC,MAAM,YAAY,MAAM;GACxB,MAAM,yBAAyB,YAAY,sBAAsB;GACjE,MAAM,wBAAwB,eAC1B,YAAY,MAAM,wBAAwB,MAAM,uBACpD;GACA,MAAM,kBAAkB,yBAAyB;GAEjD,OAAO;IACL,wBAAwB;IACxB,yBAAyB,wBACnB,kBACA,YACI,sBACA;IACV,iBAAiB;GACnB;EACF,CAAC;EAED,MAAM,aAAa,eAAe,mBAAmB;GAAC,MAAM,aAAa;GAAO,SAAS,MAAM;EAAU,CAAC,CAAC;EAE3G,MAAM,aAAa,eAAe,mBAAmB,aAAa,KAAK,CAAC;EAExE,SAAS,SAAe;GACtB,IAAI,MAAM,UACR;GAGF,KAAK,qBAAqB,CAAC,MAAM,UAAU;EAC7C;;uBAIE,mBA8BS,UAAA;IA7BL,MAAK;IACL,MAAK;IACL,kBAAA;IACC,gBAAc,QAAA,aAAU,SAAA;IACxB,cAAY,QAAA;IACZ,UAAU,QAAA;IACX,OAAM;IACL,SAAO;OAEV,mBAYO,QAAA;IAXH,eAAY;IACZ,wBAAA;IACC,OAAK,eAAE,WAAA,KAAU;IACjB,OAAK,eAAE,WAAA,KAAU;OAEpB,mBAKE,QAAA;IAJE,eAAY;IACZ,wBAAA;IACC,OAAK,eAAE,WAAA,KAAU;IAClB,eAAY;qBAIRA,KAAAA,OAAO,WAAA,UAAA,GADjB,mBAMO,QAAA;;IAJH,wBAAA;IACC,OAAK,eAAE,WAAA,KAAU;OAEpB,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,GAAA,GAAA,UAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { n as grSwitchSafelist, t as grSwitchConfig } from "../../chunks/config-
|
|
2
|
-
import { t as GrSwitch_default } from "./chunks/GrSwitch-
|
|
1
|
+
import { n as grSwitchSafelist, t as grSwitchConfig } from "../../chunks/config-LqDC_rvp.js";
|
|
2
|
+
import { t as GrSwitch_default } from "./chunks/GrSwitch-CJdRvS0s.js";
|
|
3
3
|
export { GrSwitch_default as GrSwitch, GrSwitch_default as default, grSwitchConfig, grSwitchSafelist };
|
package/dist/components/GrTabPanels/chunks/{GrTabPanels-DbKybwe-.js → GrTabPanels-DeEMgb_y.js}
RENAMED
|
@@ -59,7 +59,7 @@ var GrTabPanel_default = /* @__PURE__ */ defineComponent({
|
|
|
59
59
|
"aria-labelledby": tabId.value,
|
|
60
60
|
hidden: __props.keepAlive && !isActive.value ? true : void 0,
|
|
61
61
|
tabindex: isActive.value ? 0 : void 0,
|
|
62
|
-
class: "rounded-[var(--gr-radius-md)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)]"
|
|
62
|
+
class: "rounded-[var(--gr-radius-md)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]"
|
|
63
63
|
}, [renderSlot(_ctx.$slots, "default")], 8, _hoisted_1)) : createCommentVNode("", true);
|
|
64
64
|
};
|
|
65
65
|
}
|