@feugene/granularity 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/GrBadge.css +1 -1
- package/dist/GrFormFile.css +1 -1
- package/dist/GrToaster.css +1 -1
- package/dist/GrTree.css +1 -1
- package/dist/chunks/{config-ClhKPJvg.js → config-23WtUiAL.js} +1 -1
- package/dist/chunks/config-23WtUiAL.js.map +1 -0
- package/dist/chunks/config-8Pcutu1j.js.map +1 -0
- package/dist/chunks/{config-1uSYl98Y.js → config-B0i5r8kH.js} +1 -1
- package/dist/chunks/config-B0i5r8kH.js.map +1 -0
- package/dist/chunks/{config-BOlr7qw7.js → config-B5Rknzkd.js} +33 -39
- package/dist/chunks/config-B5Rknzkd.js.map +1 -0
- package/dist/chunks/config-B7W9VlZ7.js +5 -0
- package/dist/chunks/config-B7W9VlZ7.js.map +1 -0
- package/dist/chunks/config-BDSHekVC.js +84 -0
- package/dist/chunks/config-BDSHekVC.js.map +1 -0
- package/dist/chunks/config-BLHqZhy-.js.map +1 -0
- package/dist/chunks/{config-eYLZYOUS2.js → config-BMKNHFMD2.js} +15 -15
- package/dist/chunks/config-BMKNHFMD2.js.map +1 -0
- package/dist/chunks/config-BUHuGBik2.js.map +1 -0
- package/dist/chunks/config-BWiPnygb.js +5 -0
- package/dist/chunks/config-BWiPnygb.js.map +1 -0
- package/dist/chunks/config-BX1JTrkV.js.map +1 -0
- package/dist/chunks/config-BZFUM3Ky.js +75 -0
- package/dist/chunks/config-BZFUM3Ky.js.map +1 -0
- package/dist/chunks/{config-DUcu1D68.js → config-BmNT0Fmx.js} +2 -2
- package/dist/chunks/config-BmNT0Fmx.js.map +1 -0
- package/dist/chunks/{config-C49QUoJL.js → config-BvVq2gbd.js} +1 -1
- package/dist/chunks/{config-C49QUoJL.js.map → config-BvVq2gbd.js.map} +1 -1
- package/dist/chunks/{config-CrG1XiE7.js → config-C4hJxXDa.js} +5 -5
- package/dist/chunks/config-C4hJxXDa.js.map +1 -0
- package/dist/chunks/config-CB4RVt9M.js +66 -0
- package/dist/chunks/config-CB4RVt9M.js.map +1 -0
- package/dist/chunks/config-COE_vZ-l.js +52 -0
- package/dist/chunks/config-COE_vZ-l.js.map +1 -0
- package/dist/chunks/{config-CziwTDDL.js → config-CPdmr7tC.js} +1 -1
- package/dist/chunks/{config-CziwTDDL.js.map → config-CPdmr7tC.js.map} +1 -1
- package/dist/chunks/{config-BIRO0vDJ2.js → config-DPDFYzIa.js} +2 -2
- package/dist/chunks/config-DPDFYzIa.js.map +1 -0
- package/dist/chunks/{config-DnvPqu4g.js → config-DRKXJ9PW2.js} +1 -1
- package/dist/chunks/config-DRKXJ9PW2.js.map +1 -0
- package/dist/chunks/config-DToHb81g.js +45 -0
- package/dist/chunks/config-DToHb81g.js.map +1 -0
- package/dist/chunks/{config-jBp9wVv-.js → config-D_myOZbA.js} +1 -1
- package/dist/chunks/{config-jBp9wVv-.js.map → config-D_myOZbA.js.map} +1 -1
- package/dist/chunks/{config-D_R56_gT.js → config-Dg_6FTvJ.js} +1 -1
- package/dist/chunks/config-Dg_6FTvJ.js.map +1 -0
- package/dist/chunks/config-Dlm49Jp5.js +5 -0
- package/dist/chunks/config-Dlm49Jp5.js.map +1 -0
- package/dist/chunks/config-DpqOnJiz.js.map +1 -0
- package/dist/chunks/config-Dqy0rPPO2.js.map +1 -0
- package/dist/chunks/config-Droqn55j.js +8 -0
- package/dist/chunks/config-Droqn55j.js.map +1 -0
- package/dist/chunks/{config-C4snOIXg.js → config-KXuionN3.js} +1 -1
- package/dist/chunks/{config-C4snOIXg.js.map → config-KXuionN3.js.map} +1 -1
- package/dist/chunks/config-LGrZIdaZ.js.map +1 -0
- package/dist/chunks/{config-DezDih8_.js → config-LqDC_rvp.js} +2 -2
- package/dist/chunks/config-LqDC_rvp.js.map +1 -0
- package/dist/chunks/config-QaIc_gRa2.js.map +1 -0
- package/dist/chunks/config-U4m9PSql2.js.map +1 -0
- package/dist/chunks/{config-B7IIWGt_2.js → config-XmTv4pnI.js} +2 -2
- package/dist/chunks/config-XmTv4pnI.js.map +1 -0
- package/dist/chunks/config-eXB87DOi.js +9 -0
- package/dist/chunks/config-eXB87DOi.js.map +1 -0
- package/dist/chunks/{config-C7NpDrfO.js → config-gZWR75Bh2.js} +1 -1
- package/dist/chunks/config-gZWR75Bh2.js.map +1 -0
- package/dist/chunks/config-ipvU0lzP.js.map +1 -0
- package/dist/chunks/config-xR4XVmcy2.js.map +1 -0
- package/dist/chunks/context-Bfrgsluh.js +9 -0
- package/dist/chunks/context-Bfrgsluh.js.map +1 -0
- package/dist/chunks/context-DdNIxa1w.js +9 -0
- package/dist/chunks/context-DdNIxa1w.js.map +1 -0
- package/dist/chunks/context-DfWYCBB-.js +129 -0
- package/dist/chunks/context-DfWYCBB-.js.map +1 -0
- package/dist/chunks/{en-BdtiS2d3.js → en-Cr6EkG8c.js} +52 -4
- package/dist/chunks/en-Cr6EkG8c.js.map +1 -0
- package/dist/chunks/{es-DBhctWg-.js → es-DuYb1Qju.js} +3 -3
- package/dist/chunks/{es-DBhctWg-.js.map → es-DuYb1Qju.js.map} +1 -1
- package/dist/chunks/{es-BGRMZbe9.js → es-i08e9Sdo.js} +52 -4
- package/dist/chunks/es-i08e9Sdo.js.map +1 -0
- package/dist/chunks/{grBadgeStyles-DrycBuKT.js → grBadgeStyles-D3dFjr_N.js} +12 -12
- package/dist/chunks/grBadgeStyles-D3dFjr_N.js.map +1 -0
- package/dist/chunks/{grButtonStyles-C7Yga_Q1.js → grButtonStyles-DRBgDmOp.js} +28 -28
- package/dist/chunks/grButtonStyles-DRBgDmOp.js.map +1 -0
- package/dist/chunks/{grDropdownStyles-B_-DKytw.js → grDropdownStyles-HBPkghVr.js} +2 -2
- package/dist/chunks/{grDropdownStyles-B_-DKytw.js.map → grDropdownStyles-HBPkghVr.js.map} +1 -1
- package/dist/chunks/grModalEscStack-BXk-9mv7.js +43 -0
- package/dist/chunks/grModalEscStack-BXk-9mv7.js.map +1 -0
- package/dist/chunks/{grModalStyles-DWd3i05Q.js → grModalStyles-D8-shx9A.js} +1 -1
- package/dist/chunks/grModalStyles-D8-shx9A.js.map +1 -0
- package/dist/chunks/{grSelectStyles-CLK5hRd3.js → grSelectStyles-CwMUQrBZ.js} +12 -12
- package/dist/chunks/grSelectStyles-CwMUQrBZ.js.map +1 -0
- package/dist/chunks/{grStyle-Blc9otAx.js → grStyle-CdvxTXPH.js} +2 -2
- package/dist/chunks/grStyle-CdvxTXPH.js.map +1 -0
- package/dist/chunks/{granularityI18n-DoV7Ca2m.js → granularityI18n-SH0I--GW.js} +1 -1
- package/dist/chunks/{granularityI18n-DoV7Ca2m.js.map → granularityI18n-SH0I--GW.js.map} +1 -1
- package/dist/chunks/{ru-BFCnOiML.js → ru-B5XOOYZt.js} +52 -4
- package/dist/chunks/ru-B5XOOYZt.js.map +1 -0
- package/dist/chunks/{safelist-Do2RtzLB.js → safelist-BvO8HPnE.js} +1 -1
- package/dist/chunks/{safelist-Do2RtzLB.js.map → safelist-BvO8HPnE.js.map} +1 -1
- package/dist/chunks/shared-D-v9lit0.js +188 -0
- package/dist/chunks/shared-D-v9lit0.js.map +1 -0
- package/dist/chunks/{transition-TLFw4KBn.js → useScrollLock-K7kaP2Ud.js} +52 -1
- package/dist/chunks/useScrollLock-K7kaP2Ud.js.map +1 -0
- package/dist/components/GrAlert/chunks/GrAlert-B9gmpoPC.js +251 -0
- package/dist/components/GrAlert/chunks/GrAlert-B9gmpoPC.js.map +1 -0
- package/dist/components/GrAlert/index.js +2 -2
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-BVLoQ5tZ.js +499 -0
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-BVLoQ5tZ.js.map +1 -0
- package/dist/components/GrAutocomplete/index.js +3 -0
- package/dist/components/GrAvatar/chunks/{GrAvatar-96CpTCq5.js → GrAvatar-CTOUVBF7.js} +1 -1
- package/dist/components/GrAvatar/chunks/GrAvatar-CTOUVBF7.js.map +1 -0
- package/dist/components/GrAvatar/index.js +1 -1
- package/dist/components/GrBadge/chunks/{GrBadge-B77XlaqE.js → GrBadge-D1jefy4S.js} +12 -8
- package/dist/components/GrBadge/chunks/GrBadge-D1jefy4S.js.map +1 -0
- package/dist/components/GrBadge/index.js +2 -2
- package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-CcktMOdg.js → GrBadgeWrap-DWDxHdiQ.js} +1 -1
- package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-DWDxHdiQ.js.map +1 -0
- package/dist/components/GrBadgeWrap/index.js +1 -1
- package/dist/components/GrBottomNav/chunks/{GrBottomNav-usuMgG8_.js → GrBottomNav-vSE4LXmk.js} +2 -2
- package/dist/components/GrBottomNav/chunks/GrBottomNav-vSE4LXmk.js.map +1 -0
- package/dist/components/GrBottomNav/index.js +1 -1
- package/dist/components/GrButton/chunks/{GrButton-BlffdeJr.js → GrButton-DCi4CUpo.js} +18 -14
- package/dist/components/GrButton/chunks/GrButton-DCi4CUpo.js.map +1 -0
- package/dist/components/GrButton/index.js +4 -4
- package/dist/components/GrCard/chunks/{GrCard-DUNMkuHW.js → GrCard-CxCjyHMb.js} +1 -1
- package/dist/components/GrCard/chunks/GrCard-CxCjyHMb.js.map +1 -0
- package/dist/components/GrCard/index.js +1 -1
- package/dist/components/GrCheckbox/chunks/{GrCheckbox-DJhzZZdO.js → GrCheckbox-BbIDRXtl.js} +5 -5
- package/dist/components/GrCheckbox/chunks/GrCheckbox-BbIDRXtl.js.map +1 -0
- package/dist/components/GrCheckbox/index.js +1 -1
- package/dist/components/GrCollapse/chunks/{GrCollapse-CPPLh_xU.js → GrCollapse-DApXztn8.js} +6 -6
- package/dist/components/GrCollapse/chunks/GrCollapse-DApXztn8.js.map +1 -0
- package/dist/components/GrCollapse/index.js +2 -2
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-6OyvNbek.js +410 -0
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-6OyvNbek.js.map +1 -0
- package/dist/components/GrCommandPalette/index.js +3 -0
- package/dist/components/GrConfigProvider/chunks/GrConfigProvider-BtyeBGm8.js +57 -0
- package/dist/components/GrConfigProvider/chunks/GrConfigProvider-BtyeBGm8.js.map +1 -0
- package/dist/components/GrConfigProvider/index.js +4 -0
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-BWYKCsHd.js → GrConfirmDialog-e4120mWw.js} +5 -5
- package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-e4120mWw.js.map +1 -0
- package/dist/components/GrConfirmDialog/index.js +1 -1
- package/dist/components/GrDataTable/chunks/GrDataTable-C1CzxV0p.js +307 -0
- package/dist/components/GrDataTable/chunks/GrDataTable-C1CzxV0p.js.map +1 -0
- package/dist/components/GrDataTable/index.js +2 -2
- package/dist/components/GrDialog/chunks/{GrDialog-5DAS-1Lb.js → GrDialog-BPMvDHOz.js} +6 -6
- package/dist/components/GrDialog/chunks/GrDialog-BPMvDHOz.js.map +1 -0
- package/dist/components/GrDialog/index.js +1 -1
- package/dist/components/GrDialogService/chunks/{GrDialogService-DY_fmaMu.js → GrDialogService-CYXCTGm3.js} +36 -11
- package/dist/components/GrDialogService/chunks/GrDialogService-CYXCTGm3.js.map +1 -0
- package/dist/components/GrDialogService/index.js +2 -2
- package/dist/components/GrDivider/chunks/GrDivider-BdENZ1w0.js +54 -0
- package/dist/components/GrDivider/chunks/GrDivider-BdENZ1w0.js.map +1 -0
- package/dist/components/GrDivider/index.js +3 -0
- package/dist/components/GrDrawer/chunks/{GrDrawer-D1kzsjXN.js → GrDrawer-KevdZ5BB.js} +41 -17
- package/dist/components/GrDrawer/chunks/GrDrawer-KevdZ5BB.js.map +1 -0
- package/dist/components/GrDrawer/index.js +2 -2
- package/dist/components/GrDropdown/chunks/{GrDropdown-BXb5Cxxf.js → GrDropdown-BKoy8hm-.js} +91 -5
- package/dist/components/GrDropdown/chunks/GrDropdown-BKoy8hm-.js.map +1 -0
- package/dist/components/GrDropdown/index.js +2 -2
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-DFEJLPcV.js → GrDropdownMenu-zCatXzmt.js} +11 -11
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-zCatXzmt.js.map +1 -0
- package/dist/components/GrDropdownMenu/index.js +1 -1
- package/dist/components/GrEmptyState/chunks/{GrEmptyState-CA3BiTV7.js → GrEmptyState-CNb0BzjG.js} +3 -3
- package/dist/components/GrEmptyState/chunks/GrEmptyState-CNb0BzjG.js.map +1 -0
- package/dist/components/GrEmptyState/index.js +1 -1
- package/dist/components/GrFileUpload/chunks/{GrFileUpload-DvWPpiJS.js → GrFileUpload-CnLgUGDF.js} +12 -12
- package/dist/components/GrFileUpload/chunks/GrFileUpload-CnLgUGDF.js.map +1 -0
- package/dist/components/GrFileUpload/index.js +1 -1
- package/dist/components/GrForm/chunks/GrForm-CdaFjcyl.js +234 -0
- package/dist/components/GrForm/chunks/GrForm-CdaFjcyl.js.map +1 -0
- package/dist/components/GrForm/index.js +4 -0
- package/dist/components/GrFormField/chunks/GrFormField-CXCDBd99.js +100 -0
- package/dist/components/GrFormField/chunks/GrFormField-CXCDBd99.js.map +1 -0
- package/dist/components/GrFormField/index.js +3 -2
- package/dist/components/GrFormFile/chunks/{GrFormFile-CXcqqdvV.js → GrFormFile-CqacSbUl.js} +9 -9
- package/dist/components/GrFormFile/chunks/GrFormFile-CqacSbUl.js.map +1 -0
- package/dist/components/GrFormFile/index.js +1 -1
- package/dist/components/GrFormSection/chunks/{GrFormSection-Ce21jcgo.js → GrFormSection-C3w9DQJf.js} +1 -1
- package/dist/components/GrFormSection/chunks/GrFormSection-C3w9DQJf.js.map +1 -0
- package/dist/components/GrFormSection/index.js +1 -1
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-OCUIrNh2.js → GrImageViewer-DDLJkvIU.js} +312 -223
- package/dist/components/GrImageViewer/chunks/GrImageViewer-DDLJkvIU.js.map +1 -0
- package/dist/components/GrImageViewer/index.js +1 -1
- package/dist/components/GrInput/chunks/GrInput-C1VBL0dg.js +337 -0
- package/dist/components/GrInput/chunks/GrInput-C1VBL0dg.js.map +1 -0
- package/dist/components/GrInput/index.js +2 -2
- package/dist/components/GrInputTag/chunks/{GrInputTag-zMgFqp2g.js → GrInputTag-BMk9jm42.js} +6 -6
- package/dist/components/GrInputTag/chunks/GrInputTag-BMk9jm42.js.map +1 -0
- package/dist/components/GrInputTag/index.js +2 -2
- package/dist/components/GrKbd/chunks/GrKbd-DTspwtoN.js +22 -0
- package/dist/components/GrKbd/chunks/GrKbd-DTspwtoN.js.map +1 -0
- package/dist/components/GrKbd/index.js +3 -0
- package/dist/components/GrLink/chunks/{GrLink-CYUe-Q8k.js → GrLink-BP0YrnL9.js} +1 -1
- package/dist/components/GrLink/chunks/{GrLink-CYUe-Q8k.js.map → GrLink-BP0YrnL9.js.map} +1 -1
- package/dist/components/GrLink/index.js +2 -2
- package/dist/components/GrList/chunks/{GrList-Dx772Ns4.js → GrList-5RA-tZzE.js} +3 -3
- package/dist/components/GrList/chunks/GrList-5RA-tZzE.js.map +1 -0
- package/dist/components/GrList/index.js +1 -1
- package/dist/components/GrLoading/chunks/{GrLoading--X_7rdbb.js → GrLoading-fRDtVfi7.js} +3 -3
- package/dist/components/GrLoading/chunks/GrLoading-fRDtVfi7.js.map +1 -0
- package/dist/components/GrLoading/index.js +2 -2
- package/dist/components/GrModal/chunks/{GrModal-BkjW9jZS.js → GrModal-BTu1-5eY.js} +4 -57
- package/dist/components/GrModal/chunks/GrModal-BTu1-5eY.js.map +1 -0
- package/dist/components/GrModal/index.js +3 -3
- package/dist/components/GrNavbar/chunks/{GrNavbar-DW3MiIIf.js → GrNavbar-keKT_mIM.js} +3 -3
- package/dist/components/GrNavbar/chunks/GrNavbar-keKT_mIM.js.map +1 -0
- package/dist/components/GrNavbar/index.js +1 -1
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-CldPIWQx.js → GrNumberInput-l9ZOHG9D.js} +112 -28
- package/dist/components/GrNumberInput/chunks/GrNumberInput-l9ZOHG9D.js.map +1 -0
- package/dist/components/GrNumberInput/index.js +2 -2
- package/dist/components/GrPagination/chunks/{GrPagination-Bu9wv6it.js → GrPagination-C5Y69CuK.js} +59 -16
- package/dist/components/GrPagination/chunks/GrPagination-C5Y69CuK.js.map +1 -0
- package/dist/components/GrPagination/index.js +1 -1
- package/dist/components/GrProgressBar/chunks/{GrProgressBar-CC3z-Zqp.js → GrProgressBar-Dqg4Fj9S.js} +2 -2
- package/dist/components/GrProgressBar/chunks/GrProgressBar-Dqg4Fj9S.js.map +1 -0
- package/dist/components/GrProgressBar/index.js +2 -2
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-TmWXbpEP.js → GrPromptDialog-DNUjRVB9.js} +7 -7
- package/dist/components/GrPromptDialog/chunks/GrPromptDialog-DNUjRVB9.js.map +1 -0
- package/dist/components/GrPromptDialog/index.js +2 -2
- package/dist/components/GrRadio/chunks/{GrRadio-CPTixXaY.js → GrRadio-DlhxPGqf.js} +5 -7
- package/dist/components/GrRadio/chunks/GrRadio-DlhxPGqf.js.map +1 -0
- package/dist/components/GrRadio/index.js +2 -2
- package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-vKZCbkCp.js → GrRadioGroup-BXt9iw4q.js} +7 -5
- package/dist/components/GrRadioGroup/chunks/GrRadioGroup-BXt9iw4q.js.map +1 -0
- package/dist/components/GrRadioGroup/index.js +2 -2
- package/dist/components/GrRating/chunks/GrRating-Co-3Rk4h.js +241 -0
- package/dist/components/GrRating/chunks/GrRating-Co-3Rk4h.js.map +1 -0
- package/dist/components/GrRating/index.js +3 -0
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-BWJNe2gr.js → GrResponseErrorBanner-2CvM7Z08.js} +2 -2
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-BWJNe2gr.js.map → GrResponseErrorBanner-2CvM7Z08.js.map} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-Cdu9ekK9.js → GrResponseErrorBanner-C8NGx8pE.js} +3 -3
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-Cdu9ekK9.js.map → GrResponseErrorBanner-C8NGx8pE.js.map} +1 -1
- package/dist/components/GrResponseErrorBanner/index.js +2 -2
- package/dist/components/GrSegmented/chunks/{GrSegmented-C1y0UXpQ.js → GrSegmented-CTd3n4PA.js} +14 -11
- package/dist/components/GrSegmented/chunks/GrSegmented-CTd3n4PA.js.map +1 -0
- package/dist/components/GrSegmented/index.js +2 -2
- package/dist/components/GrSelect/chunks/{GrSelect-RShK21lK.js → GrSelect-Dn3FgJ3Z.js} +293 -87
- package/dist/components/GrSelect/chunks/GrSelect-Dn3FgJ3Z.js.map +1 -0
- package/dist/components/GrSelect/index.js +2 -2
- package/dist/components/GrSidebar/chunks/{GrSidebar-DkWozzwA.js → GrSidebar-cvnzBfj3.js} +7 -7
- package/dist/components/GrSidebar/chunks/GrSidebar-cvnzBfj3.js.map +1 -0
- package/dist/components/GrSidebar/index.js +1 -1
- package/dist/components/GrSkeleton/chunks/{GrSkeleton-DsN-_CDZ.js → GrSkeleton-BucA5F4J.js} +1 -1
- package/dist/components/GrSkeleton/chunks/GrSkeleton-BucA5F4J.js.map +1 -0
- package/dist/components/GrSkeleton/index.js +2 -2
- package/dist/components/GrSlider/chunks/GrSlider-CzzJ3bD-.js +286 -0
- package/dist/components/GrSlider/chunks/GrSlider-CzzJ3bD-.js.map +1 -0
- package/dist/components/GrSlider/index.js +3 -0
- package/dist/components/GrStatistic/chunks/GrStatistic-gHiAwrX5.js +128 -0
- package/dist/components/GrStatistic/chunks/GrStatistic-gHiAwrX5.js.map +1 -0
- package/dist/components/GrStatistic/index.js +3 -0
- package/dist/components/GrSwitch/chunks/{GrSwitch-DAioyccZ.js → GrSwitch-CJdRvS0s.js} +16 -7
- package/dist/components/GrSwitch/chunks/GrSwitch-CJdRvS0s.js.map +1 -0
- package/dist/components/GrSwitch/index.js +2 -2
- package/dist/components/GrTabPanels/chunks/GrTabPanels-DeEMgb_y.js +68 -0
- package/dist/components/GrTabPanels/chunks/GrTabPanels-DeEMgb_y.js.map +1 -0
- package/dist/components/GrTabPanels/index.js +3 -0
- package/dist/components/GrTable/chunks/{GrTable-Db3hRnKA.js → GrTable-sNvsA8wa.js} +24 -11
- package/dist/components/GrTable/chunks/GrTable-sNvsA8wa.js.map +1 -0
- package/dist/components/GrTable/index.js +2 -2
- package/dist/components/GrTabs/chunks/{GrTabs-Z-FDJUr_.js → GrTabs-BqTak0SR.js} +9 -4
- package/dist/components/GrTabs/chunks/GrTabs-BqTak0SR.js.map +1 -0
- package/dist/components/GrTabs/index.js +2 -2
- package/dist/components/GrTextarea/chunks/{GrTextarea-D56YxhKq.js → GrTextarea-DIYBAPpP.js} +16 -6
- package/dist/components/GrTextarea/chunks/GrTextarea-DIYBAPpP.js.map +1 -0
- package/dist/components/GrTextarea/index.js +2 -2
- package/dist/components/GrToaster/chunks/{GrToaster-eI8YvnIo.js → GrToaster-BVHjIHcM.js} +52 -11
- package/dist/components/GrToaster/chunks/GrToaster-BVHjIHcM.js.map +1 -0
- package/dist/components/GrToaster/index.js +2 -2
- package/dist/components/GrTooltip/chunks/{GrTooltip-BeyZ8ssR.js → GrTooltip-BMKH2lIx.js} +3 -3
- package/dist/components/GrTooltip/chunks/GrTooltip-BMKH2lIx.js.map +1 -0
- package/dist/components/GrTooltip/index.js +1 -1
- package/dist/components/GrTree/chunks/{GrTree-D3ODe2dB.js → GrTree-_12ChXRQ.js} +108 -9
- package/dist/components/GrTree/chunks/GrTree-_12ChXRQ.js.map +1 -0
- package/dist/components/GrTree/index.js +2 -2
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-B2xBKs5Q.js → GrTreeSelect-CdaLG7Xq.js} +10 -10
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-CdaLG7Xq.js.map +1 -0
- package/dist/components/GrTreeSelect/index.js +2 -2
- package/dist/composables/useToast.js +3 -1
- package/dist/composables/useToast.js.map +1 -1
- package/dist/directives/loading.js +1 -1
- package/dist/granular-provider-node.js +6 -6
- package/dist/granular-provider-node.js.map +1 -1
- package/dist/granular-provider.js +1 -1
- package/dist/i18n/all.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/index.js +112 -87
- package/dist/index.js.map +1 -1
- package/dist/styles/base.css +30 -8
- package/dist/styles/index.css +6 -3
- package/dist/styles/preflight.css +8 -4
- package/dist/styles/themes/dark.css +52 -40
- package/dist/styles/themes/light.css +70 -45
- package/dist/styles/tokens.css +20 -20
- package/dist/types/src/components/GrAlert/GrAlert.vue.d.ts +26 -14
- package/dist/types/src/components/GrAlert/defaults.d.ts +17 -0
- package/dist/types/src/components/GrAlert/grAlertStyles.d.ts +55 -0
- package/dist/types/src/components/GrAlert/index.d.ts +4 -1
- package/dist/types/src/components/GrAutocomplete/GrAutocomplete.vue.d.ts +153 -0
- package/dist/types/src/components/GrAutocomplete/config.d.ts +1 -0
- package/dist/types/src/components/GrAutocomplete/defaults.d.ts +15 -0
- package/dist/types/src/components/GrAutocomplete/grAutocompleteStyles.d.ts +27 -0
- package/dist/types/src/components/GrAutocomplete/index.d.ts +6 -0
- package/dist/types/src/components/GrAutocomplete/safelist.d.ts +1 -0
- package/dist/types/src/components/GrAvatar/GrAvatar.vue.d.ts +1 -1
- package/dist/types/src/components/GrBadge/GrBadge.vue.d.ts +7 -7
- package/dist/types/src/components/GrBadge/defaults.d.ts +15 -0
- package/dist/types/src/components/GrBadge/index.d.ts +1 -0
- package/dist/types/src/components/GrBadgeWrap/GrBadgeWrap.vue.d.ts +1 -1
- package/dist/types/src/components/GrButton/GrButton.vue.d.ts +12 -12
- package/dist/types/src/components/GrButton/defaults.d.ts +25 -0
- package/dist/types/src/components/GrButton/grButtonStyles.d.ts +2 -2
- package/dist/types/src/components/GrButton/index.d.ts +1 -0
- package/dist/types/src/components/GrCheckbox/GrCheckbox.vue.d.ts +4 -4
- package/dist/types/src/components/GrCollapse/GrCollapse.vue.d.ts +2 -2
- package/dist/types/src/components/GrCollapse/GrCollapseItem.vue.d.ts +1 -1
- package/dist/types/src/components/GrCommandPalette/GrCommandPalette.vue.d.ts +128 -0
- package/dist/types/src/components/GrCommandPalette/config.d.ts +1 -0
- package/dist/types/src/components/GrCommandPalette/filtering.d.ts +35 -0
- package/dist/types/src/components/GrCommandPalette/grCommandPaletteStyles.d.ts +20 -0
- package/dist/types/src/components/GrCommandPalette/hotkey.d.ts +23 -0
- package/dist/types/src/components/GrCommandPalette/index.d.ts +6 -0
- package/dist/types/src/components/GrCommandPalette/safelist.d.ts +1 -0
- package/dist/types/src/components/GrConfigProvider/GrConfigProvider.vue.d.ts +59 -0
- package/dist/types/src/components/GrConfigProvider/config.d.ts +1 -0
- package/dist/types/src/components/GrConfigProvider/context.d.ts +131 -0
- package/dist/types/src/components/GrConfigProvider/index.d.ts +5 -0
- package/dist/types/src/components/GrConfirmDialog/GrConfirmDialog.vue.d.ts +2 -2
- package/dist/types/src/components/GrDataTable/GrDataTable.vue.d.ts +48 -4
- package/dist/types/src/components/GrDialog/GrDialog.vue.d.ts +1 -1
- package/dist/types/src/components/GrDialogService/store.d.ts +18 -0
- package/dist/types/src/components/GrDivider/GrDivider.vue.d.ts +58 -0
- package/dist/types/src/components/GrDivider/config.d.ts +1 -0
- package/dist/types/src/components/GrDivider/index.d.ts +4 -0
- package/dist/types/src/components/GrDrawer/GrDrawer.vue.d.ts +5 -5
- package/dist/types/src/components/GrDropdown/GrDropdown.vue.d.ts +8 -1
- package/dist/types/src/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +7 -1
- package/dist/types/src/components/GrDropdownMenu/GrDropdownMenuItem.vue.d.ts +1 -1
- package/dist/types/src/components/GrFileUpload/GrFileUpload.vue.d.ts +3 -3
- package/dist/types/src/components/GrForm/GrForm.vue.d.ts +93 -0
- package/dist/types/src/components/GrForm/config.d.ts +1 -0
- package/dist/types/src/components/GrForm/context.d.ts +27 -0
- package/dist/types/src/components/GrForm/index.d.ts +6 -0
- package/dist/types/src/components/GrForm/validation.d.ts +52 -0
- package/dist/types/src/components/GrFormField/GrFormField.vue.d.ts +25 -2
- package/dist/types/src/components/GrFormField/context.d.ts +20 -0
- package/dist/types/src/components/GrFormField/index.d.ts +1 -0
- package/dist/types/src/components/GrFormFile/GrFormFile.vue.d.ts +4 -4
- package/dist/types/src/components/GrImageViewer/GrImageViewer.vue.d.ts +7 -3
- package/dist/types/src/components/GrImageViewer/composables/useViewerKeyboard.d.ts +20 -0
- package/dist/types/src/components/GrImageViewer/composables/useWheelGesture.d.ts +16 -0
- package/dist/types/src/components/GrImageViewer/composables/useZoomPan.d.ts +50 -0
- package/dist/types/src/components/GrInput/GrInput.vue.d.ts +49 -10
- package/dist/types/src/components/GrInput/defaults.d.ts +18 -0
- package/dist/types/src/components/GrInput/grInputStyles.d.ts +1 -1
- package/dist/types/src/components/GrInput/index.d.ts +1 -0
- package/dist/types/src/components/GrInputTag/GrInputTag.vue.d.ts +3 -3
- package/dist/types/src/components/GrKbd/GrKbd.vue.d.ts +46 -0
- package/dist/types/src/components/GrKbd/config.d.ts +1 -0
- package/dist/types/src/components/GrKbd/index.d.ts +4 -0
- package/dist/types/src/components/GrLink/GrLink.vue.d.ts +3 -3
- package/dist/types/src/components/GrLink/grLinkStyles.d.ts +3 -3
- package/dist/types/src/components/GrModal/grModalStyles.d.ts +1 -1
- package/dist/types/src/components/GrNumberInput/GrNumberInput.vue.d.ts +25 -9
- package/dist/types/src/components/GrNumberInput/defaults.d.ts +14 -0
- package/dist/types/src/components/GrNumberInput/index.d.ts +1 -0
- package/dist/types/src/components/GrPagination/GrPagination.vue.d.ts +18 -0
- package/dist/types/src/components/GrPromptDialog/GrPromptDialog.vue.d.ts +4 -4
- package/dist/types/src/components/GrRadio/GrRadio.vue.d.ts +5 -5
- package/dist/types/src/components/GrRadio/defaults.d.ts +14 -0
- package/dist/types/src/components/GrRadio/grRadioStyles.d.ts +3 -3
- package/dist/types/src/components/GrRadio/index.d.ts +1 -0
- package/dist/types/src/components/GrRadioGroup/GrRadioGroup.vue.d.ts +4 -4
- package/dist/types/src/components/GrRadioGroup/defaults.d.ts +14 -0
- package/dist/types/src/components/GrRadioGroup/index.d.ts +1 -0
- package/dist/types/src/components/GrRating/GrRating.vue.d.ts +124 -0
- package/dist/types/src/components/GrRating/config.d.ts +1 -0
- package/dist/types/src/components/GrRating/defaults.d.ts +14 -0
- package/dist/types/src/components/GrRating/grRatingStyles.d.ts +21 -0
- package/dist/types/src/components/GrRating/index.d.ts +6 -0
- package/dist/types/src/components/GrRating/safelist.d.ts +1 -0
- package/dist/types/src/components/GrResponseErrorBanner/GrUploadErrorBanner.vue.d.ts +1 -1
- package/dist/types/src/components/GrSegmented/GrSegmented.vue.d.ts +7 -7
- package/dist/types/src/components/GrSegmented/defaults.d.ts +15 -0
- package/dist/types/src/components/GrSegmented/grSegmentedStyles.d.ts +1 -1
- package/dist/types/src/components/GrSegmented/index.d.ts +1 -0
- package/dist/types/src/components/GrSelect/GrSelect.vue.d.ts +57 -17
- package/dist/types/src/components/GrSelect/defaults.d.ts +17 -0
- package/dist/types/src/components/GrSelect/grSelectStyles.d.ts +3 -3
- package/dist/types/src/components/GrSelect/index.d.ts +1 -0
- package/dist/types/src/components/GrSidebar/GrSidebarItem.vue.d.ts +2 -2
- package/dist/types/src/components/GrSkeleton/GrSkeleton.vue.d.ts +1 -1
- package/dist/types/src/components/GrSlider/GrSlider.vue.d.ts +88 -0
- package/dist/types/src/components/GrSlider/config.d.ts +1 -0
- package/dist/types/src/components/GrSlider/defaults.d.ts +14 -0
- package/dist/types/src/components/GrSlider/grSliderStyles.d.ts +36 -0
- package/dist/types/src/components/GrSlider/index.d.ts +6 -0
- package/dist/types/src/components/GrSlider/safelist.d.ts +1 -0
- package/dist/types/src/components/GrStatistic/GrStatistic.vue.d.ts +116 -0
- package/dist/types/src/components/GrStatistic/config.d.ts +1 -0
- package/dist/types/src/components/GrStatistic/formatStatisticValue.d.ts +16 -0
- package/dist/types/src/components/GrStatistic/grStatisticStyles.d.ts +24 -0
- package/dist/types/src/components/GrStatistic/index.d.ts +6 -0
- package/dist/types/src/components/GrStatistic/safelist.d.ts +1 -0
- package/dist/types/src/components/GrSwitch/GrSwitch.vue.d.ts +4 -4
- package/dist/types/src/components/GrSwitch/defaults.d.ts +14 -0
- package/dist/types/src/components/GrSwitch/grSwitchStyles.d.ts +2 -2
- package/dist/types/src/components/GrSwitch/index.d.ts +1 -0
- package/dist/types/src/components/GrTabPanels/GrTabPanel.vue.d.ts +46 -0
- package/dist/types/src/components/GrTabPanels/GrTabPanels.vue.d.ts +51 -0
- package/dist/types/src/components/GrTabPanels/config.d.ts +5 -0
- package/dist/types/src/components/GrTabPanels/context.d.ts +9 -0
- package/dist/types/src/components/GrTabPanels/index.d.ts +6 -0
- package/dist/types/src/components/GrTable/GrTable.vue.d.ts +16 -0
- package/dist/types/src/components/GrTabs/GrTabs.vue.d.ts +6 -0
- package/dist/types/src/components/GrTextarea/GrTextarea.vue.d.ts +5 -5
- package/dist/types/src/components/GrToaster/GrToaster.vue.d.ts +19 -2
- package/dist/types/src/components/GrToaster/index.d.ts +1 -1
- package/dist/types/src/components/GrTooltip/GrTooltip.vue.d.ts +1 -1
- package/dist/types/src/components/GrTree/grTreeInteractionContext.d.ts +2 -0
- package/dist/types/src/components/GrTreeSelect/GrTreeSelect.vue.d.ts +1 -1
- package/dist/types/src/components/GrTreeSelect/grTreeSelectStyles.d.ts +1 -1
- package/dist/types/src/composables/internal/useScrollLock.d.ts +24 -0
- package/dist/types/src/composables/useToast.d.ts +24 -0
- package/dist/types/src/granular-provider/shared.d.ts +10 -0
- package/dist/types/src/i18n/messages/en.d.ts +84 -0
- package/dist/types/src/i18n/messages/es.d.ts +84 -0
- package/dist/types/src/i18n/messages/ru.d.ts +84 -0
- package/dist/types/src/index.d.ts +10 -0
- package/dist/web-types.json +1642 -356
- package/package.json +41 -1
- package/dist/chunks/config-1uSYl98Y.js.map +0 -1
- package/dist/chunks/config-8Pcutu1j2.js.map +0 -1
- package/dist/chunks/config-B7IIWGt_2.js.map +0 -1
- package/dist/chunks/config-BIRO0vDJ2.js.map +0 -1
- package/dist/chunks/config-BLHqZhy-2.js.map +0 -1
- package/dist/chunks/config-BOlr7qw7.js.map +0 -1
- package/dist/chunks/config-BUHuGBik.js.map +0 -1
- package/dist/chunks/config-BX1JTrkV2.js.map +0 -1
- package/dist/chunks/config-C7NpDrfO.js.map +0 -1
- package/dist/chunks/config-ClhKPJvg.js.map +0 -1
- package/dist/chunks/config-Cpi9Mh2J.js.map +0 -1
- package/dist/chunks/config-CrG1XiE7.js.map +0 -1
- package/dist/chunks/config-DUcu1D68.js.map +0 -1
- package/dist/chunks/config-D_R56_gT.js.map +0 -1
- package/dist/chunks/config-DezDih8_.js.map +0 -1
- package/dist/chunks/config-DnvPqu4g.js.map +0 -1
- package/dist/chunks/config-DpqOnJiz2.js.map +0 -1
- package/dist/chunks/config-LGrZIdaZ2.js.map +0 -1
- package/dist/chunks/config-QaIc_gRa.js.map +0 -1
- package/dist/chunks/config-U4m9PSql.js.map +0 -1
- package/dist/chunks/config-eYLZYOUS2.js.map +0 -1
- package/dist/chunks/config-ipvU0lzP2.js.map +0 -1
- package/dist/chunks/config-xR4XVmcy.js.map +0 -1
- package/dist/chunks/en-BdtiS2d3.js.map +0 -1
- package/dist/chunks/es-BGRMZbe9.js.map +0 -1
- package/dist/chunks/grBadgeStyles-DrycBuKT.js.map +0 -1
- package/dist/chunks/grButtonStyles-C7Yga_Q1.js.map +0 -1
- package/dist/chunks/grModalStyles-DWd3i05Q.js.map +0 -1
- package/dist/chunks/grSelectStyles-CLK5hRd3.js.map +0 -1
- package/dist/chunks/grStyle-Blc9otAx.js.map +0 -1
- package/dist/chunks/ru-BFCnOiML.js.map +0 -1
- package/dist/chunks/shared-ChvcQgDl.js +0 -168
- package/dist/chunks/shared-ChvcQgDl.js.map +0 -1
- package/dist/chunks/transition-TLFw4KBn.js.map +0 -1
- package/dist/components/GrAlert/chunks/GrAlert-DPJSU_fG.js +0 -163
- package/dist/components/GrAlert/chunks/GrAlert-DPJSU_fG.js.map +0 -1
- package/dist/components/GrAvatar/chunks/GrAvatar-96CpTCq5.js.map +0 -1
- package/dist/components/GrBadge/chunks/GrBadge-B77XlaqE.js.map +0 -1
- package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-CcktMOdg.js.map +0 -1
- package/dist/components/GrBottomNav/chunks/GrBottomNav-usuMgG8_.js.map +0 -1
- package/dist/components/GrButton/chunks/GrButton-BlffdeJr.js.map +0 -1
- package/dist/components/GrCard/chunks/GrCard-DUNMkuHW.js.map +0 -1
- package/dist/components/GrCheckbox/chunks/GrCheckbox-DJhzZZdO.js.map +0 -1
- package/dist/components/GrCollapse/chunks/GrCollapse-CPPLh_xU.js.map +0 -1
- package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-BWYKCsHd.js.map +0 -1
- package/dist/components/GrDataTable/chunks/GrDataTable-ptbARmJ3.js +0 -179
- package/dist/components/GrDataTable/chunks/GrDataTable-ptbARmJ3.js.map +0 -1
- package/dist/components/GrDialog/chunks/GrDialog-5DAS-1Lb.js.map +0 -1
- package/dist/components/GrDialogService/chunks/GrDialogService-DY_fmaMu.js.map +0 -1
- package/dist/components/GrDrawer/chunks/GrDrawer-D1kzsjXN.js.map +0 -1
- package/dist/components/GrDropdown/chunks/GrDropdown-BXb5Cxxf.js.map +0 -1
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-DFEJLPcV.js.map +0 -1
- package/dist/components/GrEmptyState/chunks/GrEmptyState-CA3BiTV7.js.map +0 -1
- package/dist/components/GrFileUpload/chunks/GrFileUpload-DvWPpiJS.js.map +0 -1
- package/dist/components/GrFormField/chunks/GrFormField-BujNQrw8.js +0 -35
- package/dist/components/GrFormField/chunks/GrFormField-BujNQrw8.js.map +0 -1
- package/dist/components/GrFormFile/chunks/GrFormFile-CXcqqdvV.js.map +0 -1
- package/dist/components/GrFormSection/chunks/GrFormSection-Ce21jcgo.js.map +0 -1
- package/dist/components/GrImageViewer/chunks/GrImageViewer-OCUIrNh2.js.map +0 -1
- package/dist/components/GrInput/chunks/GrInput-C8pOJgCi.js +0 -188
- package/dist/components/GrInput/chunks/GrInput-C8pOJgCi.js.map +0 -1
- package/dist/components/GrInputTag/chunks/GrInputTag-zMgFqp2g.js.map +0 -1
- package/dist/components/GrList/chunks/GrList-Dx772Ns4.js.map +0 -1
- package/dist/components/GrLoading/chunks/GrLoading--X_7rdbb.js.map +0 -1
- package/dist/components/GrModal/chunks/GrModal-BkjW9jZS.js.map +0 -1
- package/dist/components/GrNavbar/chunks/GrNavbar-DW3MiIIf.js.map +0 -1
- package/dist/components/GrNumberInput/chunks/GrNumberInput-CldPIWQx.js.map +0 -1
- package/dist/components/GrPagination/chunks/GrPagination-Bu9wv6it.js.map +0 -1
- package/dist/components/GrProgressBar/chunks/GrProgressBar-CC3z-Zqp.js.map +0 -1
- package/dist/components/GrPromptDialog/chunks/GrPromptDialog-TmWXbpEP.js.map +0 -1
- package/dist/components/GrRadio/chunks/GrRadio-CPTixXaY.js.map +0 -1
- package/dist/components/GrRadioGroup/chunks/GrRadioGroup-vKZCbkCp.js.map +0 -1
- package/dist/components/GrSegmented/chunks/GrSegmented-C1y0UXpQ.js.map +0 -1
- package/dist/components/GrSelect/chunks/GrSelect-RShK21lK.js.map +0 -1
- package/dist/components/GrSidebar/chunks/GrSidebar-DkWozzwA.js.map +0 -1
- package/dist/components/GrSkeleton/chunks/GrSkeleton-DsN-_CDZ.js.map +0 -1
- package/dist/components/GrSwitch/chunks/GrSwitch-DAioyccZ.js.map +0 -1
- package/dist/components/GrTable/chunks/GrTable-Db3hRnKA.js.map +0 -1
- package/dist/components/GrTabs/chunks/GrTabs-Z-FDJUr_.js.map +0 -1
- package/dist/components/GrTextarea/chunks/GrTextarea-D56YxhKq.js.map +0 -1
- package/dist/components/GrToaster/chunks/GrToaster-eI8YvnIo.js.map +0 -1
- package/dist/components/GrTooltip/chunks/GrTooltip-BeyZ8ssR.js.map +0 -1
- package/dist/components/GrTree/chunks/GrTree-D3ODe2dB.js.map +0 -1
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-B2xBKs5Q.js.map +0 -1
- package/dist/chunks/{config-8Pcutu1j2.js → config-8Pcutu1j.js} +0 -0
- package/dist/chunks/{config-BLHqZhy-2.js → config-BLHqZhy-.js} +0 -0
- package/dist/chunks/{config-BUHuGBik.js → config-BUHuGBik2.js} +0 -0
- package/dist/chunks/{config-BX1JTrkV2.js → config-BX1JTrkV.js} +0 -0
- package/dist/chunks/{config-DpqOnJiz2.js → config-DpqOnJiz.js} +0 -0
- package/dist/chunks/{config-Cpi9Mh2J.js → config-Dqy0rPPO2.js} +1 -1
- /package/dist/chunks/{config-LGrZIdaZ2.js → config-LGrZIdaZ.js} +0 -0
- /package/dist/chunks/{config-QaIc_gRa.js → config-QaIc_gRa2.js} +0 -0
- /package/dist/chunks/{config-U4m9PSql.js → config-U4m9PSql2.js} +0 -0
- /package/dist/chunks/{config-ipvU0lzP2.js → config-ipvU0lzP.js} +0 -0
- /package/dist/chunks/{config-xR4XVmcy.js → config-xR4XVmcy2.js} +0 -0
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { t as
|
|
4
|
-
import { t as
|
|
5
|
-
import {
|
|
1
|
+
import { n as GR_CONFIG_KEY, s as useGrConfig } from "../../../chunks/context-DfWYCBB-.js";
|
|
2
|
+
import { t as GRANULARITY_I18N_KEY } from "../../../chunks/adapter-CAOxmn2G.js";
|
|
3
|
+
import { t as resolveGranularityI18n } from "../../../chunks/granularityI18n-SH0I--GW.js";
|
|
4
|
+
import { t as GrButton_default } from "../../GrButton/chunks/GrButton-DCi4CUpo.js";
|
|
5
|
+
import { n as coreResponseErrorParsers, r as createResponseErrorClassifier, s as responseErrorParserPresets } from "../../GrResponseErrorBanner/chunks/GrResponseErrorBanner-C8NGx8pE.js";
|
|
6
|
+
import { t as GrConfirmDialog_default } from "../../GrConfirmDialog/chunks/GrConfirmDialog-e4120mWw.js";
|
|
7
|
+
import { t as GrPromptDialog_default } from "../../GrPromptDialog/chunks/GrPromptDialog-DNUjRVB9.js";
|
|
8
|
+
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, getCurrentInstance, markRaw, mergeProps, nextTick, onBeforeUnmount, openBlock, provide, reactive, ref, render, shallowRef, toDisplayString, watch, withCtx } from "vue";
|
|
6
9
|
//#region src/components/GrDialogService/store.ts
|
|
7
10
|
/**
|
|
8
11
|
* Модульный синглтон очереди диалогов: единый источник правды для всех
|
|
@@ -33,6 +36,20 @@ var GrDialogServiceHost_default = /* @__PURE__ */ defineComponent({
|
|
|
33
36
|
* сервера через цепочку парсеров `GrResponseErrorBanner`.
|
|
34
37
|
*/
|
|
35
38
|
const active = computed(() => dialogQueue[0] ?? null);
|
|
39
|
+
const EMPTY_DEFAULTS = Object.freeze({});
|
|
40
|
+
provide(GR_CONFIG_KEY, {
|
|
41
|
+
size: computed(() => active.value?.config?.size.value),
|
|
42
|
+
componentDefaults: computed(() => active.value?.config?.componentDefaults.value ?? EMPTY_DEFAULTS)
|
|
43
|
+
});
|
|
44
|
+
const hostI18n = resolveGranularityI18n();
|
|
45
|
+
provide(GRANULARITY_I18N_KEY, {
|
|
46
|
+
t: (key, params) => {
|
|
47
|
+
return (active.value?.i18n ?? hostI18n)?.t(key, params) ?? key;
|
|
48
|
+
},
|
|
49
|
+
get locale() {
|
|
50
|
+
return (active.value?.i18n ?? hostI18n)?.locale;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
36
53
|
const open = ref(false);
|
|
37
54
|
const loading = ref(false);
|
|
38
55
|
const currentError = shallowRef(null);
|
|
@@ -324,9 +341,10 @@ function teardownDialogService() {
|
|
|
324
341
|
container = null;
|
|
325
342
|
}
|
|
326
343
|
mounted = false;
|
|
344
|
+
cachedAppContext = null;
|
|
327
345
|
dialogQueue.splice(0, dialogQueue.length);
|
|
328
346
|
}
|
|
329
|
-
function enqueue(kind, message, options, onConfirm) {
|
|
347
|
+
function enqueue(kind, message, options, onConfirm, captured) {
|
|
330
348
|
if (typeof window === "undefined" || typeof document === "undefined") throw new Error("[granularity] useDialogService is client-only and cannot be called during SSR (it mounts a host into document.body). Guard imperative dialog calls behind a client-side check.");
|
|
331
349
|
ensureMounted(options.appContext ?? cachedAppContext);
|
|
332
350
|
const id = makeDialogId();
|
|
@@ -343,7 +361,9 @@ function enqueue(kind, message, options, onConfirm) {
|
|
|
343
361
|
message
|
|
344
362
|
},
|
|
345
363
|
onConfirm,
|
|
346
|
-
resolve: resolveFn
|
|
364
|
+
resolve: resolveFn,
|
|
365
|
+
config: captured.config,
|
|
366
|
+
i18n: captured.i18n
|
|
347
367
|
};
|
|
348
368
|
dialogQueue.push(request);
|
|
349
369
|
const close = () => {
|
|
@@ -388,20 +408,25 @@ function mergeErrorDefaults(defaults, options) {
|
|
|
388
408
|
function useDialogService(defaults = {}) {
|
|
389
409
|
const instance = getCurrentInstance();
|
|
390
410
|
if (instance?.appContext && !cachedAppContext) cachedAppContext = instance.appContext;
|
|
411
|
+
const capturedI18n = instance ? resolveGranularityI18n() : null;
|
|
412
|
+
const captured = {
|
|
413
|
+
config: instance ? markRaw(useGrConfig()) : null,
|
|
414
|
+
i18n: capturedI18n ? markRaw(capturedI18n) : null
|
|
415
|
+
};
|
|
391
416
|
function confirm(message, options = {}) {
|
|
392
|
-
const { promise, close } = enqueue("confirm", message, mergeErrorDefaults(defaults, options), options.onConfirm);
|
|
417
|
+
const { promise, close } = enqueue("confirm", message, mergeErrorDefaults(defaults, options), options.onConfirm, captured);
|
|
393
418
|
return withClose(promise.then((r) => r.action === "confirm"), close);
|
|
394
419
|
}
|
|
395
420
|
function alert(message, options = {}) {
|
|
396
|
-
const { promise, close } = enqueue("alert", message, mergeErrorDefaults(defaults, options), options.onConfirm);
|
|
421
|
+
const { promise, close } = enqueue("alert", message, mergeErrorDefaults(defaults, options), options.onConfirm, captured);
|
|
397
422
|
return withClose(promise.then(() => void 0), close);
|
|
398
423
|
}
|
|
399
424
|
function prompt(message, options = {}) {
|
|
400
|
-
const { promise, close } = enqueue("prompt", message, mergeErrorDefaults(defaults, options), options.onConfirm);
|
|
425
|
+
const { promise, close } = enqueue("prompt", message, mergeErrorDefaults(defaults, options), options.onConfirm, captured);
|
|
401
426
|
return withClose(promise.then((r) => r.action === "confirm" ? r.value ?? "" : null), close);
|
|
402
427
|
}
|
|
403
428
|
function open(kind, message, options = {}) {
|
|
404
|
-
const { promise, close } = enqueue(kind, message, mergeErrorDefaults(defaults, options), options.onConfirm);
|
|
429
|
+
const { promise, close } = enqueue(kind, message, mergeErrorDefaults(defaults, options), options.onConfirm, captured);
|
|
405
430
|
return withClose(promise, close);
|
|
406
431
|
}
|
|
407
432
|
function closeAll() {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrDialogService-CYXCTGm3.js","names":[],"sources":["../../../../src/components/GrDialogService/store.ts","../../../../src/components/GrDialogService/GrDialogServiceHost.vue","../../../../src/components/GrDialogService/GrDialogServiceHost.vue","../../../../src/components/GrDialogService/useDialogService.ts"],"sourcesContent":["import { reactive } from 'vue'\nimport type { Raw } from 'vue'\n\nimport type { GrConfigContext } from '../GrConfigProvider/context'\nimport type { GranularityI18nLike } from '../../internal/granularityI18n'\n\nimport type {\n DialogBaseOptions,\n DialogKind,\n DialogOnConfirm,\n DialogResult,\n} from './types'\n\n/**\n * Внутреннее описание одного запроса диалога в очереди. Создаётся методами\n * сервиса (`confirm`/`alert`/`prompt`/`open`) и потребляется хостом\n * (`GrDialogServiceHost`), который рендерит «голову» очереди (FIFO).\n */\nexport interface DialogRequest {\n id: string\n kind: DialogKind\n message: string\n options: DialogBaseOptions\n onConfirm?: DialogOnConfirm<any>\n /** Резолвит промис вызова детальным результатом `{ action, value }`. */\n resolve: (result: DialogResult<any>) => void\n /**\n * Конфиг и i18n, захваченные в месте вызова сервиса (в `setup`, где вызывающий\n * компонент ещё находится внутри дерева провайдера). Хост монтируется в\n * `document.body` вне дерева, поэтому сам их не увидит — см.\n * `SPEC-GrConfig-resolver.md`.\n *\n * Лежат в запросе, а не в модульной переменной: два поддерева с разными\n * провайдерами должны получать каждое свой конфиг.\n *\n * `Raw<…>` обязателен: очередь — `reactive`, а он разворачивает вложенные рефы.\n * Без `markRaw` контекст превратился бы в объект значений, `size.value` стало\n * бы `undefined`, и мост молча перестал бы работать.\n */\n config?: Raw<GrConfigContext> | null\n i18n?: Raw<GranularityI18nLike> | null\n}\n\n/**\n * Модульный синглтон очереди диалогов: единый источник правды для всех\n * вызовов сервиса. Хост-компонент рендерит только `queue[0]` — это\n * сериализует диалоги (FIFO) и исключает конкуренцию за фокус-трап.\n */\nexport const dialogQueue = reactive<DialogRequest[]>([])\n\nlet counter = 0\n\nexport function makeDialogId(): string {\n counter += 1\n return `gr-dialog-${Date.now()}-${counter}`\n}\n","<script setup lang=\"ts\">\n/**\n * GrDialogServiceHost — внутренний компонент-оркестратор императивного\n * `useDialogService`. Не предназначен для прямого использования в шаблонах.\n *\n * Рендерит «голову» очереди `dialogQueue` (FIFO-сериализация), переиспользуя\n * декларативные `GrConfirmDialog`/`GrPromptDialog`. Управляет состоянием\n * загрузки и ошибок во время async-`onConfirm`, прогоняя «сырые» ответы\n * сервера через цепочку парсеров `GrResponseErrorBanner`.\n */\nimport { computed, nextTick, onBeforeUnmount, provide, ref, shallowRef, watch } from 'vue'\n\nimport GrButton from '../GrButton/GrButton.vue'\nimport GrConfirmDialog from '../GrConfirmDialog/GrConfirmDialog.vue'\nimport GrPromptDialog from '../GrPromptDialog/GrPromptDialog.vue'\nimport {\n coreResponseErrorParsers,\n createResponseErrorClassifier,\n responseErrorParserPresets,\n} from '../GrResponseErrorBanner'\nimport type { ResponseErrorInfo } from '../GrResponseErrorBanner'\n\nimport { GR_CONFIG_KEY, type GrComponentDefaults, type GrConfigContext } from '../GrConfigProvider/context'\nimport { GRANULARITY_I18N_KEY } from '../../i18n/adapter'\nimport { resolveGranularityI18n } from '../../internal/granularityI18n'\n\nimport { dialogQueue } from './store'\nimport type { DialogRequest } from './store'\nimport type { DialogCloseAction, DialogConfirmContext } from './types'\n\nconst active = computed<DialogRequest | null>(() => dialogQueue[0] ?? null)\n\n// ————— Мост конфига и i18n.\n//\n// Хост рендерится через `render(vnode, container)` в `document.body`, то есть вне\n// дерева компонентов. Vue в этом случае берёт `provides` только из `appContext`,\n// куда попадает лишь `app.provide()` — значения от `<GrConfigProvider>` до сюда\n// не доходят. Поэтому вызов сервиса захватывает их в `setup` и кладёт в запрос, а\n// хост раздаёт вниз конфиг **активного** запроса.\n//\n// Раздаём производный контекст, а не захваченный объект: хост один на всё\n// приложение и живёт между вызовами, а запросы приходят из разных поддеревьев с\n// разными провайдерами. Реактивность при этом сохраняется — внутри лежат те же\n// рефы, что и у исходного провайдера.\nconst EMPTY_DEFAULTS: GrComponentDefaults = Object.freeze({})\n\nprovide<GrConfigContext>(GR_CONFIG_KEY, {\n size: computed(() => active.value?.config?.size.value),\n componentDefaults: computed(() => active.value?.config?.componentDefaults.value ?? EMPTY_DEFAULTS),\n})\n\n// i18n: тот же приём. Адаптер хоста (из `appContext`) остаётся запасным вариантом,\n// если вызов пришёл без захваченного — так установка через `app.use()` продолжает\n// работать как раньше.\nconst hostI18n = resolveGranularityI18n()\n\nprovide(GRANULARITY_I18N_KEY, {\n t: (key: string, params?: Record<string, unknown>) => {\n const adapter = active.value?.i18n ?? hostI18n\n // Вернуть сам ключ — принятый в пакете сигнал «перевода нет»: потребитель\n // подставит свой fallback-текст (см. `useGranularityTranslations`).\n return adapter?.t(key, params) ?? key\n },\n get locale() {\n return (active.value?.i18n ?? hostI18n)?.locale\n },\n})\n\nconst open = ref(false)\nconst loading = ref(false)\nconst currentError = shallowRef<ResponseErrorInfo | null>(null)\nconst fieldError = ref<string | null>(null)\nconst promptValue = ref('')\n\nlet controller: AbortController | null = null\nlet finishing = false\nlet externalAbortCleanup: (() => void) | null = null\n\nfunction resetState(): void {\n loading.value = false\n currentError.value = null\n fieldError.value = null\n finishing = false\n}\n\nfunction buildClassifier(req: DialogRequest) {\n const opts = req.options\n const parsers = typeof opts.errorParsers === 'function'\n ? opts.errorParsers(responseErrorParserPresets)\n : opts.errorParsers ?? coreResponseErrorParsers\n\n return createResponseErrorClassifier({\n parsers,\n texts: opts.errorTexts,\n messageKey: opts.errorMessageKey,\n })\n}\n\nwatch(\n () => active.value?.id,\n (id) => {\n cleanupExternalAbort()\n resetState()\n\n const req = active.value\n if (!req || !id) {\n open.value = false\n return\n }\n\n promptValue.value = req.options && 'value' in req.options\n ? ((req.options as { value?: string }).value ?? '')\n : ''\n\n controller = new AbortController()\n\n // Внешний AbortSignal закрывает диалог как `close`.\n const sig = req.options.signal\n if (sig) {\n if (sig.aborted) {\n finish('close')\n return\n }\n const onAbort = () => finish('close')\n sig.addEventListener('abort', onAbort)\n externalAbortCleanup = () => sig.removeEventListener('abort', onAbort)\n }\n\n void nextTick(() => {\n open.value = true\n })\n },\n)\n\nfunction cleanupExternalAbort(): void {\n externalAbortCleanup?.()\n externalAbortCleanup = null\n}\n\nfunction finish(action: DialogCloseAction, value?: unknown): void {\n const req = active.value\n if (!req || finishing) return\n finishing = true\n\n open.value = false\n controller?.abort()\n controller = null\n cleanupExternalAbort()\n\n req.resolve({ action, value })\n\n // Снимаем «голову» очереди на следующем тике — watch откроет следующий диалог.\n void nextTick(() => {\n const index = dialogQueue.findIndex(item => item.id === req.id)\n if (index >= 0) dialogQueue.splice(index, 1)\n })\n}\n\nfunction buildContext(req: DialogRequest, value: unknown): DialogConfirmContext<any> & { _errorSet: () => boolean } {\n let errorSet = false\n\n const setError = (message: string | null): void => {\n if (message == null) {\n currentError.value = null\n return\n }\n errorSet = true\n currentError.value = { kind: 'unknown', message, raw: message }\n }\n\n const setFieldError = (field: string, message: string | null): void => {\n if (message == null) {\n fieldError.value = null\n return\n }\n errorSet = true\n fieldError.value = message\n }\n\n const clearErrors = (): void => {\n currentError.value = null\n fieldError.value = null\n }\n\n const setRawError = async (raw: unknown, meta?: Record<string, unknown>): Promise<ResponseErrorInfo | null> => {\n const info = await buildClassifier(req)(raw, meta)\n if (req.kind === 'prompt' && info.fieldErrors?.length) {\n const match = info.fieldErrors.find(f => f.field === 'value') ?? info.fieldErrors[0]\n fieldError.value = match.messages.join(' ')\n }\n currentError.value = info\n errorSet = true\n return info\n }\n\n return {\n value,\n signal: controller!.signal,\n setError,\n setRawError,\n setFieldError,\n clearErrors,\n setLoading: (v: boolean) => { loading.value = v },\n close: (action: DialogCloseAction = 'close') => finish(action),\n _errorSet: () => errorSet,\n }\n}\n\nasync function handleConfirm(): Promise<void> {\n const req = active.value\n if (!req) return\n\n const value = req.kind === 'prompt' ? promptValue.value : undefined\n\n if (!req.onConfirm) {\n finish('confirm', value)\n return\n }\n\n currentError.value = null\n fieldError.value = null\n loading.value = true\n\n const ctx = buildContext(req, value)\n\n try {\n const result = await req.onConfirm(ctx)\n loading.value = false\n if (finishing) return // ctx.close уже завершил диалог\n if (result === false) return // оставить открытым без ошибки\n if (currentError.value || fieldError.value || ctx._errorSet()) return // есть ошибка — не закрывать\n finish('confirm', value)\n }\n catch (error) {\n loading.value = false\n if (finishing) return\n if (!ctx._errorSet()) await ctx.setRawError(error)\n // оставить диалог открытым с показанной ошибкой\n }\n}\n\nfunction handleCancel(): void {\n finish('cancel')\n}\n\nfunction handleModelUpdate(value: boolean): void {\n if (!value) finish('close')\n}\n\nonBeforeUnmount(() => {\n cleanupExternalAbort()\n controller?.abort()\n})\n\n// Прокидываемые в дочерний диалог общие пропы.\nconst sharedProps = computed(() => {\n const o = active.value?.options ?? {}\n return {\n title: o.title,\n size: o.size,\n closeOnBackdrop: o.closeOnBackdrop,\n closeOnEsc: o.closeOnEsc,\n showHeader: o.showHeader,\n showCloseButton: o.showCloseButton,\n headerConfig: o.headerConfig,\n footerConfig: o.footerConfig,\n bodyConfig: o.bodyConfig,\n closeLabel: o.closeLabel,\n buttonSize: o.buttonSize,\n confirmText: o.confirmText,\n confirmVariant: o.confirmVariant,\n confirmTone: o.confirmTone,\n }\n})\n</script>\n\n<template>\n <template v-if=\"active\">\n <!-- prompt -->\n <GrPromptDialog\n v-if=\"active.kind === 'prompt'\"\n v-bind=\"sharedProps\"\n v-model:value=\"promptValue\"\n :model-value=\"open\"\n :description=\"active.options.message ?? active.options.description\"\n :label=\"(active.options as any).label\"\n :placeholder=\"(active.options as any).placeholder\"\n :required=\"(active.options as any).required ?? false\"\n :required-error-text=\"(active.options as any).requiredErrorText\"\n :cancel-text=\"(active.options as any).cancelText\"\n :error=\"currentError\"\n :field-error=\"fieldError\"\n :confirm-loading=\"loading\"\n :close-on-confirm=\"false\"\n @update:model-value=\"handleModelUpdate\"\n @confirm=\"handleConfirm\"\n @cancel=\"handleCancel\"\n />\n\n <!-- alert: confirm-диалог без кнопки Cancel -->\n <GrConfirmDialog\n v-else-if=\"active.kind === 'alert'\"\n :model-value=\"open\"\n v-bind=\"sharedProps\"\n :description=\"active.options.message ?? active.options.description\"\n :error=\"currentError\"\n :confirm-loading=\"loading\"\n :close-on-confirm=\"false\"\n @update:model-value=\"handleModelUpdate\"\n @confirm=\"handleConfirm\"\n >\n <template #footer>\n <div class=\"flex items-center justify-end gap-3\">\n <GrButton\n data-testid=\"gr-alert-confirm\"\n :variant=\"sharedProps.confirmVariant ?? 'primary'\"\n :tone=\"sharedProps.confirmTone ?? 'primary'\"\n :size=\"sharedProps.buttonSize\"\n :loading=\"loading\"\n @click=\"handleConfirm\"\n >\n {{ sharedProps.confirmText ?? 'OK' }}\n </GrButton>\n </div>\n </template>\n </GrConfirmDialog>\n\n <!-- confirm -->\n <GrConfirmDialog\n v-else\n :model-value=\"open\"\n v-bind=\"sharedProps\"\n :description=\"active.options.message ?? active.options.description\"\n :cancel-text=\"(active.options as any).cancelText\"\n :error=\"currentError\"\n :confirm-loading=\"loading\"\n :close-on-confirm=\"false\"\n @update:model-value=\"handleModelUpdate\"\n @confirm=\"handleConfirm\"\n @cancel=\"handleCancel\"\n />\n </template>\n</template>\n","<script setup lang=\"ts\">\n/**\n * GrDialogServiceHost — внутренний компонент-оркестратор императивного\n * `useDialogService`. Не предназначен для прямого использования в шаблонах.\n *\n * Рендерит «голову» очереди `dialogQueue` (FIFO-сериализация), переиспользуя\n * декларативные `GrConfirmDialog`/`GrPromptDialog`. Управляет состоянием\n * загрузки и ошибок во время async-`onConfirm`, прогоняя «сырые» ответы\n * сервера через цепочку парсеров `GrResponseErrorBanner`.\n */\nimport { computed, nextTick, onBeforeUnmount, provide, ref, shallowRef, watch } from 'vue'\n\nimport GrButton from '../GrButton/GrButton.vue'\nimport GrConfirmDialog from '../GrConfirmDialog/GrConfirmDialog.vue'\nimport GrPromptDialog from '../GrPromptDialog/GrPromptDialog.vue'\nimport {\n coreResponseErrorParsers,\n createResponseErrorClassifier,\n responseErrorParserPresets,\n} from '../GrResponseErrorBanner'\nimport type { ResponseErrorInfo } from '../GrResponseErrorBanner'\n\nimport { GR_CONFIG_KEY, type GrComponentDefaults, type GrConfigContext } from '../GrConfigProvider/context'\nimport { GRANULARITY_I18N_KEY } from '../../i18n/adapter'\nimport { resolveGranularityI18n } from '../../internal/granularityI18n'\n\nimport { dialogQueue } from './store'\nimport type { DialogRequest } from './store'\nimport type { DialogCloseAction, DialogConfirmContext } from './types'\n\nconst active = computed<DialogRequest | null>(() => dialogQueue[0] ?? null)\n\n// ————— Мост конфига и i18n.\n//\n// Хост рендерится через `render(vnode, container)` в `document.body`, то есть вне\n// дерева компонентов. Vue в этом случае берёт `provides` только из `appContext`,\n// куда попадает лишь `app.provide()` — значения от `<GrConfigProvider>` до сюда\n// не доходят. Поэтому вызов сервиса захватывает их в `setup` и кладёт в запрос, а\n// хост раздаёт вниз конфиг **активного** запроса.\n//\n// Раздаём производный контекст, а не захваченный объект: хост один на всё\n// приложение и живёт между вызовами, а запросы приходят из разных поддеревьев с\n// разными провайдерами. Реактивность при этом сохраняется — внутри лежат те же\n// рефы, что и у исходного провайдера.\nconst EMPTY_DEFAULTS: GrComponentDefaults = Object.freeze({})\n\nprovide<GrConfigContext>(GR_CONFIG_KEY, {\n size: computed(() => active.value?.config?.size.value),\n componentDefaults: computed(() => active.value?.config?.componentDefaults.value ?? EMPTY_DEFAULTS),\n})\n\n// i18n: тот же приём. Адаптер хоста (из `appContext`) остаётся запасным вариантом,\n// если вызов пришёл без захваченного — так установка через `app.use()` продолжает\n// работать как раньше.\nconst hostI18n = resolveGranularityI18n()\n\nprovide(GRANULARITY_I18N_KEY, {\n t: (key: string, params?: Record<string, unknown>) => {\n const adapter = active.value?.i18n ?? hostI18n\n // Вернуть сам ключ — принятый в пакете сигнал «перевода нет»: потребитель\n // подставит свой fallback-текст (см. `useGranularityTranslations`).\n return adapter?.t(key, params) ?? key\n },\n get locale() {\n return (active.value?.i18n ?? hostI18n)?.locale\n },\n})\n\nconst open = ref(false)\nconst loading = ref(false)\nconst currentError = shallowRef<ResponseErrorInfo | null>(null)\nconst fieldError = ref<string | null>(null)\nconst promptValue = ref('')\n\nlet controller: AbortController | null = null\nlet finishing = false\nlet externalAbortCleanup: (() => void) | null = null\n\nfunction resetState(): void {\n loading.value = false\n currentError.value = null\n fieldError.value = null\n finishing = false\n}\n\nfunction buildClassifier(req: DialogRequest) {\n const opts = req.options\n const parsers = typeof opts.errorParsers === 'function'\n ? opts.errorParsers(responseErrorParserPresets)\n : opts.errorParsers ?? coreResponseErrorParsers\n\n return createResponseErrorClassifier({\n parsers,\n texts: opts.errorTexts,\n messageKey: opts.errorMessageKey,\n })\n}\n\nwatch(\n () => active.value?.id,\n (id) => {\n cleanupExternalAbort()\n resetState()\n\n const req = active.value\n if (!req || !id) {\n open.value = false\n return\n }\n\n promptValue.value = req.options && 'value' in req.options\n ? ((req.options as { value?: string }).value ?? '')\n : ''\n\n controller = new AbortController()\n\n // Внешний AbortSignal закрывает диалог как `close`.\n const sig = req.options.signal\n if (sig) {\n if (sig.aborted) {\n finish('close')\n return\n }\n const onAbort = () => finish('close')\n sig.addEventListener('abort', onAbort)\n externalAbortCleanup = () => sig.removeEventListener('abort', onAbort)\n }\n\n void nextTick(() => {\n open.value = true\n })\n },\n)\n\nfunction cleanupExternalAbort(): void {\n externalAbortCleanup?.()\n externalAbortCleanup = null\n}\n\nfunction finish(action: DialogCloseAction, value?: unknown): void {\n const req = active.value\n if (!req || finishing) return\n finishing = true\n\n open.value = false\n controller?.abort()\n controller = null\n cleanupExternalAbort()\n\n req.resolve({ action, value })\n\n // Снимаем «голову» очереди на следующем тике — watch откроет следующий диалог.\n void nextTick(() => {\n const index = dialogQueue.findIndex(item => item.id === req.id)\n if (index >= 0) dialogQueue.splice(index, 1)\n })\n}\n\nfunction buildContext(req: DialogRequest, value: unknown): DialogConfirmContext<any> & { _errorSet: () => boolean } {\n let errorSet = false\n\n const setError = (message: string | null): void => {\n if (message == null) {\n currentError.value = null\n return\n }\n errorSet = true\n currentError.value = { kind: 'unknown', message, raw: message }\n }\n\n const setFieldError = (field: string, message: string | null): void => {\n if (message == null) {\n fieldError.value = null\n return\n }\n errorSet = true\n fieldError.value = message\n }\n\n const clearErrors = (): void => {\n currentError.value = null\n fieldError.value = null\n }\n\n const setRawError = async (raw: unknown, meta?: Record<string, unknown>): Promise<ResponseErrorInfo | null> => {\n const info = await buildClassifier(req)(raw, meta)\n if (req.kind === 'prompt' && info.fieldErrors?.length) {\n const match = info.fieldErrors.find(f => f.field === 'value') ?? info.fieldErrors[0]\n fieldError.value = match.messages.join(' ')\n }\n currentError.value = info\n errorSet = true\n return info\n }\n\n return {\n value,\n signal: controller!.signal,\n setError,\n setRawError,\n setFieldError,\n clearErrors,\n setLoading: (v: boolean) => { loading.value = v },\n close: (action: DialogCloseAction = 'close') => finish(action),\n _errorSet: () => errorSet,\n }\n}\n\nasync function handleConfirm(): Promise<void> {\n const req = active.value\n if (!req) return\n\n const value = req.kind === 'prompt' ? promptValue.value : undefined\n\n if (!req.onConfirm) {\n finish('confirm', value)\n return\n }\n\n currentError.value = null\n fieldError.value = null\n loading.value = true\n\n const ctx = buildContext(req, value)\n\n try {\n const result = await req.onConfirm(ctx)\n loading.value = false\n if (finishing) return // ctx.close уже завершил диалог\n if (result === false) return // оставить открытым без ошибки\n if (currentError.value || fieldError.value || ctx._errorSet()) return // есть ошибка — не закрывать\n finish('confirm', value)\n }\n catch (error) {\n loading.value = false\n if (finishing) return\n if (!ctx._errorSet()) await ctx.setRawError(error)\n // оставить диалог открытым с показанной ошибкой\n }\n}\n\nfunction handleCancel(): void {\n finish('cancel')\n}\n\nfunction handleModelUpdate(value: boolean): void {\n if (!value) finish('close')\n}\n\nonBeforeUnmount(() => {\n cleanupExternalAbort()\n controller?.abort()\n})\n\n// Прокидываемые в дочерний диалог общие пропы.\nconst sharedProps = computed(() => {\n const o = active.value?.options ?? {}\n return {\n title: o.title,\n size: o.size,\n closeOnBackdrop: o.closeOnBackdrop,\n closeOnEsc: o.closeOnEsc,\n showHeader: o.showHeader,\n showCloseButton: o.showCloseButton,\n headerConfig: o.headerConfig,\n footerConfig: o.footerConfig,\n bodyConfig: o.bodyConfig,\n closeLabel: o.closeLabel,\n buttonSize: o.buttonSize,\n confirmText: o.confirmText,\n confirmVariant: o.confirmVariant,\n confirmTone: o.confirmTone,\n }\n})\n</script>\n\n<template>\n <template v-if=\"active\">\n <!-- prompt -->\n <GrPromptDialog\n v-if=\"active.kind === 'prompt'\"\n v-bind=\"sharedProps\"\n v-model:value=\"promptValue\"\n :model-value=\"open\"\n :description=\"active.options.message ?? active.options.description\"\n :label=\"(active.options as any).label\"\n :placeholder=\"(active.options as any).placeholder\"\n :required=\"(active.options as any).required ?? false\"\n :required-error-text=\"(active.options as any).requiredErrorText\"\n :cancel-text=\"(active.options as any).cancelText\"\n :error=\"currentError\"\n :field-error=\"fieldError\"\n :confirm-loading=\"loading\"\n :close-on-confirm=\"false\"\n @update:model-value=\"handleModelUpdate\"\n @confirm=\"handleConfirm\"\n @cancel=\"handleCancel\"\n />\n\n <!-- alert: confirm-диалог без кнопки Cancel -->\n <GrConfirmDialog\n v-else-if=\"active.kind === 'alert'\"\n :model-value=\"open\"\n v-bind=\"sharedProps\"\n :description=\"active.options.message ?? active.options.description\"\n :error=\"currentError\"\n :confirm-loading=\"loading\"\n :close-on-confirm=\"false\"\n @update:model-value=\"handleModelUpdate\"\n @confirm=\"handleConfirm\"\n >\n <template #footer>\n <div class=\"flex items-center justify-end gap-3\">\n <GrButton\n data-testid=\"gr-alert-confirm\"\n :variant=\"sharedProps.confirmVariant ?? 'primary'\"\n :tone=\"sharedProps.confirmTone ?? 'primary'\"\n :size=\"sharedProps.buttonSize\"\n :loading=\"loading\"\n @click=\"handleConfirm\"\n >\n {{ sharedProps.confirmText ?? 'OK' }}\n </GrButton>\n </div>\n </template>\n </GrConfirmDialog>\n\n <!-- confirm -->\n <GrConfirmDialog\n v-else\n :model-value=\"open\"\n v-bind=\"sharedProps\"\n :description=\"active.options.message ?? active.options.description\"\n :cancel-text=\"(active.options as any).cancelText\"\n :error=\"currentError\"\n :confirm-loading=\"loading\"\n :close-on-confirm=\"false\"\n @update:model-value=\"handleModelUpdate\"\n @confirm=\"handleConfirm\"\n @cancel=\"handleCancel\"\n />\n </template>\n</template>\n","import { createVNode, getCurrentInstance, markRaw, render } from 'vue'\nimport type { AppContext, Raw } from 'vue'\n\nimport GrDialogServiceHost from './GrDialogServiceHost.vue'\nimport { useGrConfig, type GrConfigContext } from '../GrConfigProvider/context'\nimport { resolveGranularityI18n, type GranularityI18nLike } from '../../internal/granularityI18n'\nimport { dialogQueue, makeDialogId } from './store'\nimport type { DialogRequest } from './store'\nimport type {\n DialogAlertOptions,\n DialogBaseOptions,\n DialogConfirmOptions,\n DialogKind,\n DialogOnConfirm,\n DialogPromise,\n DialogPromptOptions,\n DialogResult,\n DialogService,\n DialogServiceDefaults,\n} from './types'\n\n/**\n * `useDialogService` — императивный сервис диалогов (в духе Element Plus\n * `ElMessageBox`). Позволяет вызывать `confirm`/`alert`/`prompt` из `<script>`\n * или `.ts` без вставки компонента в шаблон.\n *\n * Поверх существующих `GrConfirmDialog`/`GrPromptDialog`: лениво монтирует\n * единый хост (`GrDialogServiceHost`) в `document.body`, наследуя контекст\n * приложения (i18n / тема / `granular-provider`). Диалоги сериализуются\n * очередью FIFO.\n */\n\nlet mounted = false\nlet container: HTMLElement | null = null\nlet cachedAppContext: AppContext | null = null\n\nfunction ensureMounted(appContext?: AppContext | null): void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return\n\n if (appContext) cachedAppContext = appContext\n if (mounted) return\n\n container = document.createElement('div')\n container.setAttribute('data-gr-dialog-service-host', '')\n document.body.appendChild(container)\n\n const vnode = createVNode(GrDialogServiceHost)\n vnode.appContext = cachedAppContext ?? null\n render(vnode, container)\n mounted = true\n}\n\n/** Тестовая/служебная очистка смонтированного хоста. */\nexport function teardownDialogService(): void {\n if (container) {\n render(null, container)\n container.remove()\n container = null\n }\n mounted = false\n // Сбрасываем и кэш контекста приложения: без этого он переживает teardown и\n // протекает в следующее приложение (в тестах — в следующий тест), из-за чего\n // диалог может подхватить чужие provides и проверка соврёт.\n cachedAppContext = null\n dialogQueue.splice(0, dialogQueue.length)\n}\n\n/** Контекст, захваченный вызовом `useDialogService()` внутри `setup`. */\ntype CapturedContext = {\n config: Raw<GrConfigContext> | null\n i18n: Raw<GranularityI18nLike> | null\n}\n\nfunction enqueue(\n kind: DialogKind,\n message: string,\n options: DialogBaseOptions,\n onConfirm: DialogOnConfirm<any> | undefined,\n captured: CapturedContext,\n): { promise: Promise<DialogResult<any>>, close: () => void } {\n // Императивный сервис клиент-only: монтирует хост в `document.body`. В SSR\n // выполнять его нельзя — модульная очередь (`dialogQueue`) мутировалась бы на\n // сервере и текла между запросами. Явно запрещаем вместо тихого no-op.\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n throw new Error(\n '[granularity] useDialogService is client-only and cannot be called during SSR '\n + '(it mounts a host into document.body). Guard imperative dialog calls behind a client-side check.',\n )\n }\n\n ensureMounted(options.appContext ?? cachedAppContext)\n\n const id = makeDialogId()\n let resolveFn!: (result: DialogResult<any>) => void\n const promise = new Promise<DialogResult<any>>((resolve) => {\n resolveFn = resolve\n })\n\n const request: DialogRequest = {\n id,\n kind,\n message,\n options: { ...options, message },\n onConfirm,\n resolve: resolveFn,\n config: captured.config,\n i18n: captured.i18n,\n }\n\n dialogQueue.push(request)\n\n const close = (): void => {\n const index = dialogQueue.findIndex(item => item.id === id)\n if (index < 0) return\n dialogQueue.splice(index, 1)\n resolveFn({ action: 'close' })\n }\n\n return { promise, close }\n}\n\nfunction withClose<T>(promise: Promise<T>, close: () => void): DialogPromise<T> {\n const result = promise as DialogPromise<T>\n result.close = close\n return result\n}\n\nfunction mergeErrorDefaults(\n defaults: DialogServiceDefaults,\n options: DialogBaseOptions,\n): DialogBaseOptions {\n return {\n size: defaults.size,\n confirmText: defaults.confirmText,\n confirmVariant: defaults.confirmVariant,\n confirmTone: defaults.confirmTone,\n buttonSize: defaults.buttonSize,\n closeOnBackdrop: defaults.closeOnBackdrop,\n closeOnEsc: defaults.closeOnEsc,\n errorParsers: defaults.errorParsers,\n errorTexts: defaults.errorTexts,\n errorMessageKey: defaults.errorMessageKey,\n fieldLabels: defaults.fieldLabels,\n ...options,\n }\n}\n\n/**\n * Создаёт сервис диалогов. Опциональные `defaults` применяются ко всем\n * вызовам (можно переопределить в каждом конкретном вызове).\n *\n * Контекст приложения кэшируется автоматически при первом вызове внутри\n * `setup`. Для вызовов вне компонента используйте `setAppContext`.\n */\nexport function useDialogService(defaults: DialogServiceDefaults = {}): DialogService {\n // Авто-кэш appContext из текущего компонента (если вызвано в setup).\n const instance = getCurrentInstance()\n if (instance?.appContext && !cachedAppContext) {\n cachedAppContext = instance.appContext\n }\n\n // Конфиг и i18n захватываем здесь и только здесь: `inject` работает лишь в\n // `setup`, а хост монтируется вне дерева и сам до провайдера не дотянется.\n // Храним в замыкании сервиса, а не в модульной переменной, — иначе два\n // поддерева с разными провайдерами делили бы конфиг первого.\n // i18n захватываем не «на всякий случай»: дочерний `GrConfirmDialog` сам зовёт\n // `useGranularityTranslations()`, но его `inject` из хоста уходит в\n // `appContext.provides` — то есть видит только установку через `app.use()`.\n // Адаптер, переданный пропом `<GrConfigProvider i18n>`, живёт в дереве, и без\n // захвата диалог откатился бы на встроенные английские строки.\n //\n // `markRaw` — потому что дальше контекст ложится в `reactive`-очередь, а она\n // разворачивает вложенные рефы (см. комментарий в `store.ts`).\n const capturedI18n = instance ? resolveGranularityI18n() : null\n const captured: CapturedContext = {\n config: instance ? markRaw(useGrConfig()) : null,\n i18n: capturedI18n ? markRaw(capturedI18n) : null,\n }\n\n function confirm(message: string, options: DialogConfirmOptions = {}): DialogPromise<boolean> {\n const merged = mergeErrorDefaults(defaults, options)\n const { promise, close } = enqueue('confirm', message, merged, options.onConfirm, captured)\n return withClose(promise.then(r => r.action === 'confirm'), close)\n }\n\n function alert(message: string, options: DialogAlertOptions = {}): DialogPromise<void> {\n const merged = mergeErrorDefaults(defaults, options)\n const { promise, close } = enqueue('alert', message, merged, options.onConfirm, captured)\n return withClose(promise.then(() => undefined), close)\n }\n\n function prompt(message: string, options: DialogPromptOptions = {}): DialogPromise<string | null> {\n const merged = mergeErrorDefaults(defaults, options)\n const { promise, close } = enqueue('prompt', message, merged, options.onConfirm, captured)\n return withClose(\n promise.then(r => (r.action === 'confirm' ? ((r.value as string) ?? '') : null)),\n close,\n )\n }\n\n function open<V = unknown>(\n kind: DialogKind,\n message: string,\n options: DialogBaseOptions = {},\n ): DialogPromise<DialogResult<V>> {\n const merged = mergeErrorDefaults(defaults, options)\n const { promise, close } = enqueue(kind, message, merged, (options as DialogConfirmOptions).onConfirm, captured)\n return withClose(promise as Promise<DialogResult<V>>, close)\n }\n\n function closeAll(): void {\n while (dialogQueue.length > 0) {\n const request = dialogQueue.pop()!\n request.resolve({ action: 'close' })\n }\n }\n\n function setAppContext(ctx: AppContext | null): void {\n cachedAppContext = ctx\n }\n\n return { confirm, alert, prompt, open, closeAll, setAppContext }\n}\n\n/** Готовый синглтон-сервис с дефолтными настройками. */\nexport const dialogService: DialogService = useDialogService()\n"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { i as GrDialogServiceHost_default, n as teardownDialogService, r as useDialogService, t as dialogService } from "./chunks/GrDialogService-
|
|
2
|
-
import { t as grDialogServiceConfig } from "../../chunks/config-
|
|
1
|
+
import { i as GrDialogServiceHost_default, n as teardownDialogService, r as useDialogService, t as dialogService } from "./chunks/GrDialogService-CYXCTGm3.js";
|
|
2
|
+
import { t as grDialogServiceConfig } from "../../chunks/config-BX1JTrkV.js";
|
|
3
3
|
export { GrDialogServiceHost_default as GrDialogServiceHost, dialogService, grDialogServiceConfig, teardownDialogService, useDialogService };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, openBlock, renderSlot, toDisplayString, useSlots } from "vue";
|
|
2
|
+
//#region src/components/GrDivider/GrDivider.vue?vue&type=script&setup=true&lang.ts
|
|
3
|
+
var _hoisted_1 = {
|
|
4
|
+
key: 0,
|
|
5
|
+
"data-gr-divider": "",
|
|
6
|
+
role: "separator",
|
|
7
|
+
"aria-orientation": "vertical",
|
|
8
|
+
class: "inline-block w-px self-stretch bg-[var(--gr-brd)]"
|
|
9
|
+
};
|
|
10
|
+
var _hoisted_2 = {
|
|
11
|
+
key: 1,
|
|
12
|
+
"data-gr-divider": "",
|
|
13
|
+
role: "separator",
|
|
14
|
+
"aria-orientation": "horizontal",
|
|
15
|
+
class: "flex w-full items-center gap-3 text-xs text-[var(--gr-muted-fg)]"
|
|
16
|
+
};
|
|
17
|
+
var _hoisted_3 = {
|
|
18
|
+
key: 0,
|
|
19
|
+
class: "h-px flex-1 bg-[var(--gr-brd)]"
|
|
20
|
+
};
|
|
21
|
+
var _hoisted_4 = { class: "shrink-0" };
|
|
22
|
+
var _hoisted_5 = {
|
|
23
|
+
key: 1,
|
|
24
|
+
class: "h-px flex-1 bg-[var(--gr-brd)]"
|
|
25
|
+
};
|
|
26
|
+
var _hoisted_6 = {
|
|
27
|
+
key: 2,
|
|
28
|
+
"data-gr-divider": "",
|
|
29
|
+
class: "h-px w-full border-0 bg-[var(--gr-brd)]"
|
|
30
|
+
};
|
|
31
|
+
//#endregion
|
|
32
|
+
//#region src/components/GrDivider/GrDivider.vue
|
|
33
|
+
var GrDivider_default = /* @__PURE__ */ defineComponent({
|
|
34
|
+
__name: "GrDivider",
|
|
35
|
+
props: {
|
|
36
|
+
orientation: { default: "horizontal" },
|
|
37
|
+
label: { default: void 0 },
|
|
38
|
+
align: { default: "center" }
|
|
39
|
+
},
|
|
40
|
+
setup(__props) {
|
|
41
|
+
const props = __props;
|
|
42
|
+
const slots = useSlots();
|
|
43
|
+
const hasLabel = computed(() => props.orientation === "horizontal" && (Boolean(props.label) || Boolean(slots.default)));
|
|
44
|
+
return (_ctx, _cache) => {
|
|
45
|
+
return __props.orientation === "vertical" ? (openBlock(), createElementBlock("div", _hoisted_1)) : hasLabel.value ? (openBlock(), createElementBlock("div", _hoisted_2, [
|
|
46
|
+
__props.align !== "start" ? (openBlock(), createElementBlock("span", _hoisted_3)) : createCommentVNode("", true),
|
|
47
|
+
createElementVNode("span", _hoisted_4, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.label), 1)])]),
|
|
48
|
+
__props.align !== "end" ? (openBlock(), createElementBlock("span", _hoisted_5)) : createCommentVNode("", true)
|
|
49
|
+
])) : (openBlock(), createElementBlock("hr", _hoisted_6));
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
//#endregion
|
|
54
|
+
export { GrDivider_default as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrDivider-BdENZ1w0.js","names":[],"sources":["../../../../src/components/GrDivider/GrDivider.vue","../../../../src/components/GrDivider/GrDivider.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\n\n/**\n * GrDivider — разделитель контента.\n *\n * - `orientation=\"horizontal\"` (по умолчанию) — линия на всю ширину; с `label`\n * или default-слотом рисует текст по центру/краю между отрезками линии.\n * - `orientation=\"vertical\"` — тонкая вертикальная линия (для inline-разделения,\n * например в тулбарах).\n */\nexport type GrDividerOrientation = 'horizontal' | 'vertical'\nexport type GrDividerAlign = 'start' | 'center' | 'end'\n\nconst props = withDefaults(\n defineProps<{\n orientation?: GrDividerOrientation\n label?: string\n align?: GrDividerAlign\n }>(),\n {\n orientation: 'horizontal',\n label: undefined,\n align: 'center',\n },\n)\n\nconst slots = useSlots()\nconst hasLabel = computed(() =>\n props.orientation === 'horizontal' && (Boolean(props.label) || Boolean(slots.default)),\n)\n</script>\n\n<template>\n <div\n v-if=\"orientation === 'vertical'\"\n data-gr-divider\n role=\"separator\"\n aria-orientation=\"vertical\"\n class=\"inline-block w-px self-stretch bg-[var(--gr-brd)]\"\n />\n\n <div\n v-else-if=\"hasLabel\"\n data-gr-divider\n role=\"separator\"\n aria-orientation=\"horizontal\"\n class=\"flex w-full items-center gap-3 text-xs text-[var(--gr-muted-fg)]\"\n >\n <span v-if=\"align !== 'start'\" class=\"h-px flex-1 bg-[var(--gr-brd)]\" />\n <span class=\"shrink-0\"><slot>{{ label }}</slot></span>\n <span v-if=\"align !== 'end'\" class=\"h-px flex-1 bg-[var(--gr-brd)]\" />\n </div>\n\n <hr\n v-else\n data-gr-divider\n class=\"h-px w-full border-0 bg-[var(--gr-brd)]\"\n >\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\n\n/**\n * GrDivider — разделитель контента.\n *\n * - `orientation=\"horizontal\"` (по умолчанию) — линия на всю ширину; с `label`\n * или default-слотом рисует текст по центру/краю между отрезками линии.\n * - `orientation=\"vertical\"` — тонкая вертикальная линия (для inline-разделения,\n * например в тулбарах).\n */\nexport type GrDividerOrientation = 'horizontal' | 'vertical'\nexport type GrDividerAlign = 'start' | 'center' | 'end'\n\nconst props = withDefaults(\n defineProps<{\n orientation?: GrDividerOrientation\n label?: string\n align?: GrDividerAlign\n }>(),\n {\n orientation: 'horizontal',\n label: undefined,\n align: 'center',\n },\n)\n\nconst slots = useSlots()\nconst hasLabel = computed(() =>\n props.orientation === 'horizontal' && (Boolean(props.label) || Boolean(slots.default)),\n)\n</script>\n\n<template>\n <div\n v-if=\"orientation === 'vertical'\"\n data-gr-divider\n role=\"separator\"\n aria-orientation=\"vertical\"\n class=\"inline-block w-px self-stretch bg-[var(--gr-brd)]\"\n />\n\n <div\n v-else-if=\"hasLabel\"\n data-gr-divider\n role=\"separator\"\n aria-orientation=\"horizontal\"\n class=\"flex w-full items-center gap-3 text-xs text-[var(--gr-muted-fg)]\"\n >\n <span v-if=\"align !== 'start'\" class=\"h-px flex-1 bg-[var(--gr-brd)]\" />\n <span class=\"shrink-0\"><slot>{{ label }}</slot></span>\n <span v-if=\"align !== 'end'\" class=\"h-px flex-1 bg-[var(--gr-brd)]\" />\n </div>\n\n <hr\n v-else\n data-gr-divider\n class=\"h-px w-full border-0 bg-[var(--gr-brd)]\"\n >\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcA,MAAM,QAAQ;EAad,MAAM,QAAQ,SAAS;EACvB,MAAM,WAAW,eACf,MAAM,gBAAgB,iBAAiB,QAAQ,MAAM,KAAK,KAAK,QAAQ,MAAM,OAAO,EACtF;;UAKU,QAAA,gBAAW,cAAA,UAAA,GADnB,mBAME,OANF,UAME,KAGW,SAAA,SAAA,UAAA,GADb,mBAUM,OAVN,YAUM;IAHQ,QAAA,UAAK,WAAA,UAAA,GAAjB,mBAAwE,QAAxE,UAAwE,KAAA,mBAAA,IAAA,IAAA;IACxE,mBAAsD,QAAtD,YAAsD,CAA/B,WAAwB,KAAA,QAAA,WAAA,CAAA,SAAA,CAAA,gBAAA,gBAAf,QAAA,KAAK,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACzB,QAAA,UAAK,SAAA,UAAA,GAAjB,mBAAsE,QAAtE,UAAsE,KAAA,mBAAA,IAAA,IAAA;uBAGxE,mBAIC,MAJD,UAIC"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { t as x_default } from "../../../chunks/x-2KXnqxiD.js";
|
|
2
|
-
import {
|
|
3
|
-
import { t as GrButton_default } from "../../GrButton/chunks/GrButton-
|
|
2
|
+
import { n as useGranularityTranslations } from "../../../chunks/granularityI18n-SH0I--GW.js";
|
|
3
|
+
import { t as GrButton_default } from "../../GrButton/chunks/GrButton-DCi4CUpo.js";
|
|
4
4
|
import { t as GrIcon_default } from "../../GrIcon/chunks/GrIcon-D9AWQLk2.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
5
|
+
import { i as Ge, n as Se, o as Ve, r as he, s as Ye, t as useScrollLock } from "../../../chunks/useScrollLock-K7kaP2Ud.js";
|
|
6
|
+
import { n as removeGrModalEsc, t as pushGrModalEsc } from "../../../chunks/grModalEscStack-BXk-9mv7.js";
|
|
7
|
+
import { i as grDrawerPanelEnterFrom, r as grDrawerPanelClass } from "../../../chunks/config-BmNT0Fmx.js";
|
|
8
|
+
import { Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, onBeforeUnmount, openBlock, renderSlot, toDisplayString, unref, useId, watch, withCtx } from "vue";
|
|
8
9
|
//#region src/components/GrDrawer/GrDrawer.vue?vue&type=script&setup=true&lang.ts
|
|
9
10
|
var _hoisted_1 = { class: "fixed inset-0" };
|
|
10
11
|
var _hoisted_2 = {
|
|
11
12
|
"data-gr-drawer-header": "",
|
|
12
|
-
class: "px-5 py-4 border-b border-[var(--brd)] flex items-center justify-between gap-4"
|
|
13
|
+
class: "px-5 py-4 border-b border-[var(--gr-brd)] flex items-center justify-between gap-4"
|
|
13
14
|
};
|
|
14
15
|
var _hoisted_3 = {
|
|
15
16
|
"data-gr-drawer-body": "",
|
|
@@ -19,7 +20,7 @@ var _hoisted_4 = { class: "p-5" };
|
|
|
19
20
|
var _hoisted_5 = {
|
|
20
21
|
key: 0,
|
|
21
22
|
"data-gr-drawer-footer": "",
|
|
22
|
-
class: "px-5 py-4 border-t border-[var(--brd)]"
|
|
23
|
+
class: "px-5 py-4 border-t border-[var(--gr-brd)]"
|
|
23
24
|
};
|
|
24
25
|
//#endregion
|
|
25
26
|
//#region src/components/GrDrawer/GrDrawer.vue
|
|
@@ -48,6 +49,7 @@ var GrDrawer_default = /* @__PURE__ */ defineComponent({
|
|
|
48
49
|
const resolvedCloseLabel = computed(() => props.closeLabel ?? t("gr.common.close", "Close"));
|
|
49
50
|
const emit = __emit;
|
|
50
51
|
const titleId = useId();
|
|
52
|
+
const isClient = typeof window !== "undefined";
|
|
51
53
|
const panelClass = computed(() => {
|
|
52
54
|
return grDrawerPanelClass({
|
|
53
55
|
side: props.side,
|
|
@@ -66,15 +68,38 @@ var GrDrawer_default = /* @__PURE__ */ defineComponent({
|
|
|
66
68
|
if (!props.closeOnBackdrop) return;
|
|
67
69
|
close();
|
|
68
70
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
const { lock: lockBodyScroll, unlock: unlockBodyScroll } = useScrollLock();
|
|
72
|
+
let escEntryId = null;
|
|
73
|
+
function registerEsc() {
|
|
74
|
+
if (escEntryId !== null) return;
|
|
75
|
+
escEntryId = pushGrModalEsc({
|
|
76
|
+
shouldClose: () => props.closeOnEsc,
|
|
77
|
+
close
|
|
78
|
+
});
|
|
75
79
|
}
|
|
80
|
+
function unregisterEsc() {
|
|
81
|
+
if (escEntryId === null) return;
|
|
82
|
+
removeGrModalEsc(escEntryId);
|
|
83
|
+
escEntryId = null;
|
|
84
|
+
}
|
|
85
|
+
watch(() => props.modelValue, (value) => {
|
|
86
|
+
if (value) {
|
|
87
|
+
lockBodyScroll();
|
|
88
|
+
registerEsc();
|
|
89
|
+
} else {
|
|
90
|
+
unlockBodyScroll();
|
|
91
|
+
unregisterEsc();
|
|
92
|
+
}
|
|
93
|
+
}, { immediate: true });
|
|
94
|
+
onBeforeUnmount(() => {
|
|
95
|
+
unlockBodyScroll();
|
|
96
|
+
unregisterEsc();
|
|
97
|
+
});
|
|
76
98
|
return (_ctx, _cache) => {
|
|
77
|
-
return openBlock(), createBlock(Teleport, {
|
|
99
|
+
return openBlock(), createBlock(Teleport, {
|
|
100
|
+
to: "body",
|
|
101
|
+
disabled: !isClient
|
|
102
|
+
}, [createVNode(unref(Se), {
|
|
78
103
|
show: __props.modelValue,
|
|
79
104
|
as: "template"
|
|
80
105
|
}, {
|
|
@@ -84,8 +109,7 @@ var GrDrawer_default = /* @__PURE__ */ defineComponent({
|
|
|
84
109
|
class: "fixed inset-0 z-50",
|
|
85
110
|
static: true,
|
|
86
111
|
"aria-labelledby": unref(titleId),
|
|
87
|
-
onClose: onDialogClose
|
|
88
|
-
onKeydown
|
|
112
|
+
onClose: onDialogClose
|
|
89
113
|
}, {
|
|
90
114
|
default: withCtx(() => [createElementVNode("div", _hoisted_1, [createVNode(unref(he), {
|
|
91
115
|
as: "template",
|
|
@@ -152,7 +176,7 @@ var GrDrawer_default = /* @__PURE__ */ defineComponent({
|
|
|
152
176
|
_: 3
|
|
153
177
|
}, 8, ["aria-labelledby"])]),
|
|
154
178
|
_: 3
|
|
155
|
-
}, 8, ["show"])]);
|
|
179
|
+
}, 8, ["show"])], 8, ["disabled"]);
|
|
156
180
|
};
|
|
157
181
|
}
|
|
158
182
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrDrawer-KevdZ5BB.js","names":["$slots"],"sources":["../../../../src/components/GrDrawer/GrDrawer.vue","../../../../src/components/GrDrawer/GrDrawer.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, useId, watch } from 'vue'\nimport { Dialog, DialogPanel, DialogTitle, TransitionChild, TransitionRoot } from '@headlessui/vue'\n\nimport GrButton from '../GrButton/GrButton.vue'\nimport GrIcon from '../GrIcon/GrIcon.vue'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n// Переиспользуем инфраструктуру оверлеев GrModal: общий Esc-стек (Esc закрывает\n// верхний оверлей независимо от дерева рендера) и reference-counted scroll-lock.\nimport { pushGrModalEsc, removeGrModalEsc } from '../GrModal/grModalEscStack'\nimport { useScrollLock } from '../../composables/internal/useScrollLock'\nimport {\n grDrawerPanelClass,\n grDrawerPanelEnterFrom,\n type GrDrawerSide,\n type GrDrawerSize,\n} from './grDrawerStyles'\n\nimport IconClose from '~icons/lucide/x'\n\nexport interface GrDrawerProps {\n /** Контроль открытия через v-model. */\n modelValue: boolean\n /** Заголовок; если передан — покажется в хедере. Можно переопределить слотом `#title`. */\n title?: string\n /** Закрывать при клике по бэкдропу / через HeadlessUI close. */\n closeOnBackdrop?: boolean\n /** Закрывать по Esc. */\n closeOnEsc?: boolean\n /** Сторона, с которой выезжает панель. */\n side?: GrDrawerSide\n /** Размер панели. */\n size?: GrDrawerSize\n /** i18n-friendly aria-label для кнопки закрытия. */\n closeLabel?: string\n}\n\nconst props = withDefaults(defineProps<GrDrawerProps>(), {\n title: undefined,\n closeOnBackdrop: true,\n closeOnEsc: true,\n side: 'right',\n size: 'md',\n closeLabel: undefined,\n})\n\nconst { t } = useGranularityTranslations()\nconst resolvedTitle = computed(() => props.title ?? t('gr.drawer.title', 'Drawer'))\nconst resolvedCloseLabel = computed(() => props.closeLabel ?? t('gr.common.close', 'Close'))\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: boolean): void\n}>()\n\nconst titleId = useId()\n\n// SSR-guard: на сервере `document.body` недоступен — отключаем teleport\n// (в клиенте включаем после маунта). Раньше `<teleport to=\"body\">` без\n// `:disabled` падал при SSR — расхождение с GrModal.\nconst isClient = typeof window !== 'undefined'\n\nconst panelClass = computed(() => {\n return grDrawerPanelClass({ side: props.side, size: props.size })\n})\n\nconst panelEnterFrom = computed(() => grDrawerPanelEnterFrom(props.side))\n\nfunction close(): void {\n emit('update:modelValue', false)\n}\n\nfunction onDialogClose(): void {\n if (!props.closeOnBackdrop) return\n close()\n}\n\nfunction onOverlayClick(): void {\n if (!props.closeOnBackdrop) return\n close()\n}\n\n// ————— Esc через общий стек оверлеев + scroll-lock, синхронно с открытием.\nconst { lock: lockBodyScroll, unlock: unlockBodyScroll } = useScrollLock()\n\nlet escEntryId: number | null = null\n\nfunction registerEsc(): void {\n if (escEntryId !== null) return\n escEntryId = pushGrModalEsc({\n shouldClose: () => props.closeOnEsc,\n close,\n })\n}\n\nfunction unregisterEsc(): void {\n if (escEntryId === null) return\n removeGrModalEsc(escEntryId)\n escEntryId = null\n}\n\nwatch(\n () => props.modelValue,\n (value) => {\n if (value) {\n lockBodyScroll()\n registerEsc()\n }\n else {\n unlockBodyScroll()\n unregisterEsc()\n }\n },\n { immediate: true },\n)\n\nonBeforeUnmount(() => {\n unlockBodyScroll()\n unregisterEsc()\n})\n</script>\n\n<template>\n <teleport to=\"body\" :disabled=\"!isClient\">\n <TransitionRoot :show=\"modelValue\" as=\"template\">\n <Dialog\n as=\"div\"\n data-gr-drawer\n class=\"fixed inset-0 z-50\"\n :static=\"true\"\n :aria-labelledby=\"titleId\"\n @close=\"onDialogClose\"\n >\n <div class=\"fixed inset-0\">\n <TransitionChild\n as=\"template\"\n enter=\"duration-200 ease-out\"\n enter-from=\"opacity-0\"\n enter-to=\"opacity-100\"\n leave=\"duration-150 ease-in\"\n leave-from=\"opacity-100\"\n leave-to=\"opacity-0\"\n >\n <div\n data-gr-drawer-overlay\n class=\"fixed inset-0 bg-black/40\"\n aria-hidden=\"true\"\n @click=\"onOverlayClick\"\n />\n </TransitionChild>\n\n <TransitionChild\n as=\"template\"\n enter=\"duration-200 ease-out\"\n :enter-from=\"panelEnterFrom\"\n enter-to=\"translate-x-0\"\n leave=\"duration-150 ease-in\"\n leave-from=\"translate-x-0\"\n :leave-to=\"panelEnterFrom\"\n >\n <DialogPanel\n data-gr-drawer-panel\n tabindex=\"-1\"\n class=\"fixed inset-y-0 flex flex-col\"\n :class=\"panelClass\"\n >\n <div\n data-gr-drawer-header\n class=\"px-5 py-4 border-b border-[var(--gr-brd)] flex items-center justify-between gap-4\"\n >\n <DialogTitle :id=\"titleId\" as=\"div\" data-gr-drawer-title class=\"text-[14px] font-700 min-w-0 truncate\">\n <slot name=\"title\">\n {{ resolvedTitle }}\n </slot>\n </DialogTitle>\n\n <GrButton\n variant=\"ghost\"\n size=\"sm\"\n square\n :aria-label=\"resolvedCloseLabel\"\n @click=\"close\"\n >\n <GrIcon size=\"sm\" aria-hidden=\"true\">\n <IconClose />\n </GrIcon>\n </GrButton>\n </div>\n\n <div data-gr-drawer-body class=\"flex-1 overflow-y-auto\">\n <div class=\"p-5\">\n <slot />\n </div>\n </div>\n\n <div\n v-if=\"$slots.footer\"\n data-gr-drawer-footer\n class=\"px-5 py-4 border-t border-[var(--gr-brd)]\"\n >\n <slot name=\"footer\" />\n </div>\n </DialogPanel>\n </TransitionChild>\n </div>\n </Dialog>\n </TransitionRoot>\n </teleport>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, useId, watch } from 'vue'\nimport { Dialog, DialogPanel, DialogTitle, TransitionChild, TransitionRoot } from '@headlessui/vue'\n\nimport GrButton from '../GrButton/GrButton.vue'\nimport GrIcon from '../GrIcon/GrIcon.vue'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n// Переиспользуем инфраструктуру оверлеев GrModal: общий Esc-стек (Esc закрывает\n// верхний оверлей независимо от дерева рендера) и reference-counted scroll-lock.\nimport { pushGrModalEsc, removeGrModalEsc } from '../GrModal/grModalEscStack'\nimport { useScrollLock } from '../../composables/internal/useScrollLock'\nimport {\n grDrawerPanelClass,\n grDrawerPanelEnterFrom,\n type GrDrawerSide,\n type GrDrawerSize,\n} from './grDrawerStyles'\n\nimport IconClose from '~icons/lucide/x'\n\nexport interface GrDrawerProps {\n /** Контроль открытия через v-model. */\n modelValue: boolean\n /** Заголовок; если передан — покажется в хедере. Можно переопределить слотом `#title`. */\n title?: string\n /** Закрывать при клике по бэкдропу / через HeadlessUI close. */\n closeOnBackdrop?: boolean\n /** Закрывать по Esc. */\n closeOnEsc?: boolean\n /** Сторона, с которой выезжает панель. */\n side?: GrDrawerSide\n /** Размер панели. */\n size?: GrDrawerSize\n /** i18n-friendly aria-label для кнопки закрытия. */\n closeLabel?: string\n}\n\nconst props = withDefaults(defineProps<GrDrawerProps>(), {\n title: undefined,\n closeOnBackdrop: true,\n closeOnEsc: true,\n side: 'right',\n size: 'md',\n closeLabel: undefined,\n})\n\nconst { t } = useGranularityTranslations()\nconst resolvedTitle = computed(() => props.title ?? t('gr.drawer.title', 'Drawer'))\nconst resolvedCloseLabel = computed(() => props.closeLabel ?? t('gr.common.close', 'Close'))\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: boolean): void\n}>()\n\nconst titleId = useId()\n\n// SSR-guard: на сервере `document.body` недоступен — отключаем teleport\n// (в клиенте включаем после маунта). Раньше `<teleport to=\"body\">` без\n// `:disabled` падал при SSR — расхождение с GrModal.\nconst isClient = typeof window !== 'undefined'\n\nconst panelClass = computed(() => {\n return grDrawerPanelClass({ side: props.side, size: props.size })\n})\n\nconst panelEnterFrom = computed(() => grDrawerPanelEnterFrom(props.side))\n\nfunction close(): void {\n emit('update:modelValue', false)\n}\n\nfunction onDialogClose(): void {\n if (!props.closeOnBackdrop) return\n close()\n}\n\nfunction onOverlayClick(): void {\n if (!props.closeOnBackdrop) return\n close()\n}\n\n// ————— Esc через общий стек оверлеев + scroll-lock, синхронно с открытием.\nconst { lock: lockBodyScroll, unlock: unlockBodyScroll } = useScrollLock()\n\nlet escEntryId: number | null = null\n\nfunction registerEsc(): void {\n if (escEntryId !== null) return\n escEntryId = pushGrModalEsc({\n shouldClose: () => props.closeOnEsc,\n close,\n })\n}\n\nfunction unregisterEsc(): void {\n if (escEntryId === null) return\n removeGrModalEsc(escEntryId)\n escEntryId = null\n}\n\nwatch(\n () => props.modelValue,\n (value) => {\n if (value) {\n lockBodyScroll()\n registerEsc()\n }\n else {\n unlockBodyScroll()\n unregisterEsc()\n }\n },\n { immediate: true },\n)\n\nonBeforeUnmount(() => {\n unlockBodyScroll()\n unregisterEsc()\n})\n</script>\n\n<template>\n <teleport to=\"body\" :disabled=\"!isClient\">\n <TransitionRoot :show=\"modelValue\" as=\"template\">\n <Dialog\n as=\"div\"\n data-gr-drawer\n class=\"fixed inset-0 z-50\"\n :static=\"true\"\n :aria-labelledby=\"titleId\"\n @close=\"onDialogClose\"\n >\n <div class=\"fixed inset-0\">\n <TransitionChild\n as=\"template\"\n enter=\"duration-200 ease-out\"\n enter-from=\"opacity-0\"\n enter-to=\"opacity-100\"\n leave=\"duration-150 ease-in\"\n leave-from=\"opacity-100\"\n leave-to=\"opacity-0\"\n >\n <div\n data-gr-drawer-overlay\n class=\"fixed inset-0 bg-black/40\"\n aria-hidden=\"true\"\n @click=\"onOverlayClick\"\n />\n </TransitionChild>\n\n <TransitionChild\n as=\"template\"\n enter=\"duration-200 ease-out\"\n :enter-from=\"panelEnterFrom\"\n enter-to=\"translate-x-0\"\n leave=\"duration-150 ease-in\"\n leave-from=\"translate-x-0\"\n :leave-to=\"panelEnterFrom\"\n >\n <DialogPanel\n data-gr-drawer-panel\n tabindex=\"-1\"\n class=\"fixed inset-y-0 flex flex-col\"\n :class=\"panelClass\"\n >\n <div\n data-gr-drawer-header\n class=\"px-5 py-4 border-b border-[var(--gr-brd)] flex items-center justify-between gap-4\"\n >\n <DialogTitle :id=\"titleId\" as=\"div\" data-gr-drawer-title class=\"text-[14px] font-700 min-w-0 truncate\">\n <slot name=\"title\">\n {{ resolvedTitle }}\n </slot>\n </DialogTitle>\n\n <GrButton\n variant=\"ghost\"\n size=\"sm\"\n square\n :aria-label=\"resolvedCloseLabel\"\n @click=\"close\"\n >\n <GrIcon size=\"sm\" aria-hidden=\"true\">\n <IconClose />\n </GrIcon>\n </GrButton>\n </div>\n\n <div data-gr-drawer-body class=\"flex-1 overflow-y-auto\">\n <div class=\"p-5\">\n <slot />\n </div>\n </div>\n\n <div\n v-if=\"$slots.footer\"\n data-gr-drawer-footer\n class=\"px-5 py-4 border-t border-[var(--gr-brd)]\"\n >\n <slot name=\"footer\" />\n </div>\n </DialogPanel>\n </TransitionChild>\n </div>\n </Dialog>\n </TransitionRoot>\n </teleport>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { n as grDrawerSafelist, t as grDrawerConfig } from "../../chunks/config-
|
|
2
|
-
import { t as GrDrawer_default } from "./chunks/GrDrawer-
|
|
1
|
+
import { n as grDrawerSafelist, t as grDrawerConfig } from "../../chunks/config-BmNT0Fmx.js";
|
|
2
|
+
import { t as GrDrawer_default } from "./chunks/GrDrawer-KevdZ5BB.js";
|
|
3
3
|
export { GrDrawer_default as GrDrawer, GrDrawer_default as default, grDrawerConfig, grDrawerSafelist };
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { vClickOutside } from "../../../directives/clickOutside.js";
|
|
2
2
|
import { t as useFloating } from "../../../chunks/useFloating-DtM6TyE4.js";
|
|
3
3
|
import { t as useEscapeToClose } from "../../../chunks/useEscapeToClose-C2t_S1gh.js";
|
|
4
|
-
import { n as grDropdownOriginClass, r as grDropdownWidthClass, t as grDropdownContentClass } from "../../../chunks/grDropdownStyles-
|
|
5
|
-
import { Teleport, Transition, computed, createBlock, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, ref, renderSlot, unref, vShow, watch, withCtx, withDirectives } from "vue";
|
|
4
|
+
import { n as grDropdownOriginClass, r as grDropdownWidthClass, t as grDropdownContentClass } from "../../../chunks/grDropdownStyles-HBPkghVr.js";
|
|
5
|
+
import { Teleport, Transition, computed, createBlock, createElementBlock, createElementVNode, createVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, openBlock, ref, renderSlot, unref, useId, vShow, watch, withCtx, withDirectives } from "vue";
|
|
6
6
|
//#region src/components/GrDropdown/GrDropdown.vue?vue&type=script&setup=true&lang.ts
|
|
7
7
|
var _hoisted_1 = { "data-gr-dropdown": "" };
|
|
8
|
+
var _hoisted_2 = ["id"];
|
|
8
9
|
//#endregion
|
|
9
10
|
//#region src/components/GrDropdown/GrDropdown.vue
|
|
10
11
|
var GrDropdown_default = /* @__PURE__ */ defineComponent({
|
|
@@ -25,6 +26,84 @@ var GrDropdown_default = /* @__PURE__ */ defineComponent({
|
|
|
25
26
|
const rootEl = ref(null);
|
|
26
27
|
const panelEl = ref(null);
|
|
27
28
|
const clickOutsideExclude = [() => panelEl.value];
|
|
29
|
+
const panelId = useId();
|
|
30
|
+
let triggerFocusEl = null;
|
|
31
|
+
function panelItems() {
|
|
32
|
+
const root = panelEl.value;
|
|
33
|
+
if (!root) return [];
|
|
34
|
+
return Array.from(root.querySelectorAll("[role=\"menuitem\"], a[href], button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])")).filter((el) => el.offsetParent !== null || el === document.activeElement);
|
|
35
|
+
}
|
|
36
|
+
function focusItemAt(index) {
|
|
37
|
+
const items = panelItems();
|
|
38
|
+
if (items.length === 0) return;
|
|
39
|
+
items[(index + items.length) % items.length]?.focus();
|
|
40
|
+
}
|
|
41
|
+
async function openWithFocus(first) {
|
|
42
|
+
triggerFocusEl = document.activeElement ?? null;
|
|
43
|
+
open.value = true;
|
|
44
|
+
await nextTick();
|
|
45
|
+
focusItemAt(first ? 0 : -1);
|
|
46
|
+
}
|
|
47
|
+
function returnFocusToTrigger() {
|
|
48
|
+
const target = triggerFocusEl;
|
|
49
|
+
triggerFocusEl = null;
|
|
50
|
+
target?.focus?.();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Пропсы для реального фокусируемого триггера (кнопки). Консьюмер биндит их на
|
|
54
|
+
* элемент внутри слота `#trigger`: `<button v-bind="triggerProps">`. Даёт
|
|
55
|
+
* `aria-haspopup`/`aria-expanded`/`aria-controls` и клавиатуру (Enter/Space/стрелки).
|
|
56
|
+
*/
|
|
57
|
+
const triggerProps = computed(() => ({
|
|
58
|
+
"aria-haspopup": "menu",
|
|
59
|
+
"aria-expanded": open.value,
|
|
60
|
+
"aria-controls": open.value ? panelId : void 0,
|
|
61
|
+
"onKeydown": onTriggerKeydown
|
|
62
|
+
}));
|
|
63
|
+
function onTriggerKeydown(event) {
|
|
64
|
+
switch (event.key) {
|
|
65
|
+
case "Enter":
|
|
66
|
+
case " ":
|
|
67
|
+
case "ArrowDown":
|
|
68
|
+
event.preventDefault();
|
|
69
|
+
openWithFocus(true);
|
|
70
|
+
break;
|
|
71
|
+
case "ArrowUp":
|
|
72
|
+
event.preventDefault();
|
|
73
|
+
openWithFocus(false);
|
|
74
|
+
break;
|
|
75
|
+
case "Escape":
|
|
76
|
+
if (open.value) {
|
|
77
|
+
event.preventDefault();
|
|
78
|
+
close();
|
|
79
|
+
}
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function onPanelKeydown(event) {
|
|
84
|
+
const currentIndex = panelItems().indexOf(document.activeElement);
|
|
85
|
+
switch (event.key) {
|
|
86
|
+
case "ArrowDown":
|
|
87
|
+
event.preventDefault();
|
|
88
|
+
focusItemAt(currentIndex + 1);
|
|
89
|
+
break;
|
|
90
|
+
case "ArrowUp":
|
|
91
|
+
event.preventDefault();
|
|
92
|
+
focusItemAt(currentIndex - 1);
|
|
93
|
+
break;
|
|
94
|
+
case "Home":
|
|
95
|
+
event.preventDefault();
|
|
96
|
+
focusItemAt(0);
|
|
97
|
+
break;
|
|
98
|
+
case "End":
|
|
99
|
+
event.preventDefault();
|
|
100
|
+
focusItemAt(-1);
|
|
101
|
+
break;
|
|
102
|
+
case "Tab":
|
|
103
|
+
close();
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
28
107
|
const placementByAlign = {
|
|
29
108
|
left: "bottom-start",
|
|
30
109
|
right: "bottom-end",
|
|
@@ -38,7 +117,9 @@ var GrDropdown_default = /* @__PURE__ */ defineComponent({
|
|
|
38
117
|
open.value = !open.value;
|
|
39
118
|
}
|
|
40
119
|
function close() {
|
|
120
|
+
const wasOpen = open.value;
|
|
41
121
|
open.value = false;
|
|
122
|
+
if (wasOpen) returnFocusToTrigger();
|
|
42
123
|
}
|
|
43
124
|
useEscapeToClose(open, close);
|
|
44
125
|
watch(() => props.align, () => {
|
|
@@ -62,7 +143,8 @@ var GrDropdown_default = /* @__PURE__ */ defineComponent({
|
|
|
62
143
|
}, [renderSlot(_ctx.$slots, "trigger", {
|
|
63
144
|
open: open.value,
|
|
64
145
|
toggle,
|
|
65
|
-
close
|
|
146
|
+
close,
|
|
147
|
+
triggerProps: triggerProps.value
|
|
66
148
|
})])), [[unref(vClickOutside), {
|
|
67
149
|
handler: close,
|
|
68
150
|
enabled: open.value,
|
|
@@ -76,16 +158,20 @@ var GrDropdown_default = /* @__PURE__ */ defineComponent({
|
|
|
76
158
|
"leave-to-class": "transform opacity-0 scale-95"
|
|
77
159
|
}, {
|
|
78
160
|
default: withCtx(() => [withDirectives(createElementVNode("div", {
|
|
161
|
+
id: unref(panelId),
|
|
79
162
|
ref_key: "panelEl",
|
|
80
163
|
ref: panelEl,
|
|
81
164
|
"data-gr-dropdown-panel": "",
|
|
165
|
+
role: "menu",
|
|
166
|
+
tabindex: "-1",
|
|
82
167
|
class: normalizeClass(panelClasses.value),
|
|
83
168
|
style: normalizeStyle(unref(floatingStyle)),
|
|
84
|
-
onClick: onContentClick
|
|
169
|
+
onClick: onContentClick,
|
|
170
|
+
onKeydown: onPanelKeydown
|
|
85
171
|
}, [createElementVNode("div", {
|
|
86
172
|
"data-gr-dropdown-content": "",
|
|
87
173
|
class: normalizeClass(contentClasses.value)
|
|
88
|
-
}, [renderSlot(_ctx.$slots, "content", { close })], 2)],
|
|
174
|
+
}, [renderSlot(_ctx.$slots, "content", { close })], 2)], 46, _hoisted_2), [[vShow, open.value]])]),
|
|
89
175
|
_: 3
|
|
90
176
|
})], 8, ["to"]))]);
|
|
91
177
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrDropdown-BKoy8hm-.js","names":[],"sources":["../../../../src/components/GrDropdown/GrDropdown.vue","../../../../src/components/GrDropdown/GrDropdown.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, ref, useId, watch } from 'vue'\n\nimport { vClickOutside } from '../../directives'\nimport { useFloating } from '../../composables/internal/useFloating'\nimport { useEscapeToClose } from '../../composables/internal/useEscapeToClose'\nimport {\n grDropdownContentClass,\n grDropdownOriginClass,\n grDropdownWidthClass,\n type GrDropdownAlign,\n type GrDropdownWidth,\n} from './grDropdownStyles'\n\nexport interface GrDropdownProps {\n /** Выравнивание панели относительно триггера. */\n align?: GrDropdownAlign\n /** Ширина панели (tailwind-токены `w-*` или `auto`). */\n width?: GrDropdownWidth\n /** Закрывать панель по клику внутри content. */\n closeOnContentClick?: boolean\n /** Дополнительные классы контейнера content. */\n contentClass?: string\n /** Куда телепортировать панель (`body` по умолчанию). */\n teleportTo?: string | HTMLElement\n}\n\nconst props = withDefaults(defineProps<GrDropdownProps>(), {\n align: 'right',\n width: '48',\n closeOnContentClick: true,\n contentClass: '',\n teleportTo: 'body',\n})\n\nconst open = ref(false)\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst clickOutsideExclude = [() => panelEl.value]\n\nconst panelId = useId()\n\n// Элемент триггера, которому вернём фокус при закрытии (клавиатурный сценарий).\nlet triggerFocusEl: HTMLElement | null = null\n\n// Фокусируемые пункты панели для клавиатурной навигации (roving-фокус).\nfunction panelItems(): HTMLElement[] {\n const root = panelEl.value\n if (!root)\n return []\n const selector = '[role=\"menuitem\"], a[href], button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n return Array.from(root.querySelectorAll<HTMLElement>(selector)).filter(el => el.offsetParent !== null || el === document.activeElement)\n}\n\nfunction focusItemAt(index: number): void {\n const items = panelItems()\n if (items.length === 0)\n return\n const clamped = (index + items.length) % items.length\n items[clamped]?.focus()\n}\n\nasync function openWithFocus(first: boolean): Promise<void> {\n triggerFocusEl = (document.activeElement as HTMLElement) ?? null\n open.value = true\n await nextTick()\n focusItemAt(first ? 0 : -1)\n}\n\nfunction returnFocusToTrigger(): void {\n const target = triggerFocusEl\n triggerFocusEl = null\n target?.focus?.()\n}\n\n/**\n * Пропсы для реального фокусируемого триггера (кнопки). Консьюмер биндит их на\n * элемент внутри слота `#trigger`: `<button v-bind=\"triggerProps\">`. Даёт\n * `aria-haspopup`/`aria-expanded`/`aria-controls` и клавиатуру (Enter/Space/стрелки).\n */\nconst triggerProps = computed(() => ({\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': open.value,\n 'aria-controls': open.value ? panelId : undefined,\n 'onKeydown': onTriggerKeydown,\n}))\n\nfunction onTriggerKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n void openWithFocus(true)\n break\n case 'ArrowUp':\n event.preventDefault()\n void openWithFocus(false)\n break\n case 'Escape':\n if (open.value) {\n event.preventDefault()\n close()\n }\n break\n }\n}\n\nfunction onPanelKeydown(event: KeyboardEvent): void {\n const items = panelItems()\n const currentIndex = items.indexOf(document.activeElement as HTMLElement)\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n focusItemAt(currentIndex + 1)\n break\n case 'ArrowUp':\n event.preventDefault()\n focusItemAt(currentIndex - 1)\n break\n case 'Home':\n event.preventDefault()\n focusItemAt(0)\n break\n case 'End':\n event.preventDefault()\n focusItemAt(-1)\n break\n case 'Tab':\n close()\n break\n }\n}\n\n// `align='right'` — правый край панели совпадает с правым краем триггера (bottom-end);\n// `align='left'` — левые края (bottom-start); `align='center'` — floating-ui сам\n// центрирует панель под триггером при обычном `'bottom'` без суффикса.\nconst placementByAlign: Record<GrDropdownAlign, 'bottom-start' | 'bottom-end' | 'bottom'> = {\n left: 'bottom-start',\n right: 'bottom-end',\n center: 'bottom',\n}\n\nconst { floatingStyle, resolvedPlacement, update: updateFloatingPosition } = useFloating(\n rootEl,\n panelEl,\n open,\n {\n placement: () => placementByAlign[props.align],\n zIndexVar: '--gr-z-dropdown',\n },\n)\n\nfunction toggle(): void {\n open.value = !open.value\n}\n\nfunction close(): void {\n const wasOpen = open.value\n open.value = false\n // Возвращаем фокус на триггер только если панель была открыта с клавиатуры.\n if (wasOpen)\n returnFocusToTrigger()\n}\n\nuseEscapeToClose(open, close)\n\nwatch(\n () => props.align,\n () => {\n if (open.value) updateFloatingPosition()\n },\n)\n\nconst widthClass = computed(() => grDropdownWidthClass(props.width))\n\nconst contentClasses = computed(() => grDropdownContentClass(props.contentClass))\n\nconst panelClasses = computed(() => {\n return [widthClass.value, grDropdownOriginClass(resolvedPlacement.value)].filter(Boolean)\n})\n\nfunction onContentClick(): void {\n if (props.closeOnContentClick) {\n close()\n }\n}\n</script>\n\n<template>\n <div data-gr-dropdown>\n <div\n ref=\"rootEl\"\n v-click-outside=\"{ handler: close, enabled: open, exclude: clickOutsideExclude }\"\n data-gr-dropdown-trigger\n class=\"inline-block max-w-full\"\n @click=\"toggle\"\n >\n <slot name=\"trigger\" :open=\"open\" :toggle=\"toggle\" :close=\"close\" :triggerProps=\"triggerProps\" />\n </div>\n\n <teleport :to=\"teleportTo\">\n <transition\n enter-active-class=\"transition ease-out duration-150\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-100\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-show=\"open\"\n :id=\"panelId\"\n ref=\"panelEl\"\n data-gr-dropdown-panel\n role=\"menu\"\n tabindex=\"-1\"\n :class=\"panelClasses\"\n :style=\"floatingStyle\"\n @click=\"onContentClick\"\n @keydown=\"onPanelKeydown\"\n >\n <div data-gr-dropdown-content :class=\"contentClasses\">\n <slot name=\"content\" :close=\"close\" />\n </div>\n </div>\n </transition>\n </teleport>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref, useId, watch } from 'vue'\n\nimport { vClickOutside } from '../../directives'\nimport { useFloating } from '../../composables/internal/useFloating'\nimport { useEscapeToClose } from '../../composables/internal/useEscapeToClose'\nimport {\n grDropdownContentClass,\n grDropdownOriginClass,\n grDropdownWidthClass,\n type GrDropdownAlign,\n type GrDropdownWidth,\n} from './grDropdownStyles'\n\nexport interface GrDropdownProps {\n /** Выравнивание панели относительно триггера. */\n align?: GrDropdownAlign\n /** Ширина панели (tailwind-токены `w-*` или `auto`). */\n width?: GrDropdownWidth\n /** Закрывать панель по клику внутри content. */\n closeOnContentClick?: boolean\n /** Дополнительные классы контейнера content. */\n contentClass?: string\n /** Куда телепортировать панель (`body` по умолчанию). */\n teleportTo?: string | HTMLElement\n}\n\nconst props = withDefaults(defineProps<GrDropdownProps>(), {\n align: 'right',\n width: '48',\n closeOnContentClick: true,\n contentClass: '',\n teleportTo: 'body',\n})\n\nconst open = ref(false)\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst clickOutsideExclude = [() => panelEl.value]\n\nconst panelId = useId()\n\n// Элемент триггера, которому вернём фокус при закрытии (клавиатурный сценарий).\nlet triggerFocusEl: HTMLElement | null = null\n\n// Фокусируемые пункты панели для клавиатурной навигации (roving-фокус).\nfunction panelItems(): HTMLElement[] {\n const root = panelEl.value\n if (!root)\n return []\n const selector = '[role=\"menuitem\"], a[href], button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n return Array.from(root.querySelectorAll<HTMLElement>(selector)).filter(el => el.offsetParent !== null || el === document.activeElement)\n}\n\nfunction focusItemAt(index: number): void {\n const items = panelItems()\n if (items.length === 0)\n return\n const clamped = (index + items.length) % items.length\n items[clamped]?.focus()\n}\n\nasync function openWithFocus(first: boolean): Promise<void> {\n triggerFocusEl = (document.activeElement as HTMLElement) ?? null\n open.value = true\n await nextTick()\n focusItemAt(first ? 0 : -1)\n}\n\nfunction returnFocusToTrigger(): void {\n const target = triggerFocusEl\n triggerFocusEl = null\n target?.focus?.()\n}\n\n/**\n * Пропсы для реального фокусируемого триггера (кнопки). Консьюмер биндит их на\n * элемент внутри слота `#trigger`: `<button v-bind=\"triggerProps\">`. Даёт\n * `aria-haspopup`/`aria-expanded`/`aria-controls` и клавиатуру (Enter/Space/стрелки).\n */\nconst triggerProps = computed(() => ({\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': open.value,\n 'aria-controls': open.value ? panelId : undefined,\n 'onKeydown': onTriggerKeydown,\n}))\n\nfunction onTriggerKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n void openWithFocus(true)\n break\n case 'ArrowUp':\n event.preventDefault()\n void openWithFocus(false)\n break\n case 'Escape':\n if (open.value) {\n event.preventDefault()\n close()\n }\n break\n }\n}\n\nfunction onPanelKeydown(event: KeyboardEvent): void {\n const items = panelItems()\n const currentIndex = items.indexOf(document.activeElement as HTMLElement)\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n focusItemAt(currentIndex + 1)\n break\n case 'ArrowUp':\n event.preventDefault()\n focusItemAt(currentIndex - 1)\n break\n case 'Home':\n event.preventDefault()\n focusItemAt(0)\n break\n case 'End':\n event.preventDefault()\n focusItemAt(-1)\n break\n case 'Tab':\n close()\n break\n }\n}\n\n// `align='right'` — правый край панели совпадает с правым краем триггера (bottom-end);\n// `align='left'` — левые края (bottom-start); `align='center'` — floating-ui сам\n// центрирует панель под триггером при обычном `'bottom'` без суффикса.\nconst placementByAlign: Record<GrDropdownAlign, 'bottom-start' | 'bottom-end' | 'bottom'> = {\n left: 'bottom-start',\n right: 'bottom-end',\n center: 'bottom',\n}\n\nconst { floatingStyle, resolvedPlacement, update: updateFloatingPosition } = useFloating(\n rootEl,\n panelEl,\n open,\n {\n placement: () => placementByAlign[props.align],\n zIndexVar: '--gr-z-dropdown',\n },\n)\n\nfunction toggle(): void {\n open.value = !open.value\n}\n\nfunction close(): void {\n const wasOpen = open.value\n open.value = false\n // Возвращаем фокус на триггер только если панель была открыта с клавиатуры.\n if (wasOpen)\n returnFocusToTrigger()\n}\n\nuseEscapeToClose(open, close)\n\nwatch(\n () => props.align,\n () => {\n if (open.value) updateFloatingPosition()\n },\n)\n\nconst widthClass = computed(() => grDropdownWidthClass(props.width))\n\nconst contentClasses = computed(() => grDropdownContentClass(props.contentClass))\n\nconst panelClasses = computed(() => {\n return [widthClass.value, grDropdownOriginClass(resolvedPlacement.value)].filter(Boolean)\n})\n\nfunction onContentClick(): void {\n if (props.closeOnContentClick) {\n close()\n }\n}\n</script>\n\n<template>\n <div data-gr-dropdown>\n <div\n ref=\"rootEl\"\n v-click-outside=\"{ handler: close, enabled: open, exclude: clickOutsideExclude }\"\n data-gr-dropdown-trigger\n class=\"inline-block max-w-full\"\n @click=\"toggle\"\n >\n <slot name=\"trigger\" :open=\"open\" :toggle=\"toggle\" :close=\"close\" :triggerProps=\"triggerProps\" />\n </div>\n\n <teleport :to=\"teleportTo\">\n <transition\n enter-active-class=\"transition ease-out duration-150\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-100\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-show=\"open\"\n :id=\"panelId\"\n ref=\"panelEl\"\n data-gr-dropdown-panel\n role=\"menu\"\n tabindex=\"-1\"\n :class=\"panelClasses\"\n :style=\"floatingStyle\"\n @click=\"onContentClick\"\n @keydown=\"onPanelKeydown\"\n >\n <div data-gr-dropdown-content :class=\"contentClasses\">\n <slot name=\"content\" :close=\"close\" />\n </div>\n </div>\n </transition>\n </teleport>\n </div>\n</template>\n"],"mappings":"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"}
|