@feugene/granularity 0.19.0 → 0.20.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/README.md +8 -0
- package/dist/chunks/config-8Pcutu1j.js.map +1 -0
- package/dist/chunks/{config-06SQjBx0.js → config-B4w5gBD0.js} +1 -8
- package/dist/chunks/{config-06SQjBx0.js.map → config-B4w5gBD0.js.map} +1 -1
- package/dist/chunks/config-BE6n20np.js.map +1 -0
- package/dist/chunks/{config-B-iNaGdw.js → config-BEVBsvni.js} +1 -3
- package/dist/chunks/{config-B-iNaGdw.js.map → config-BEVBsvni.js.map} +1 -1
- package/dist/chunks/config-BKvX0q10.js.map +1 -0
- package/dist/chunks/config-BTCOJO5z.js +37 -0
- package/dist/chunks/config-BTCOJO5z.js.map +1 -0
- package/dist/chunks/{config-Rw9OyW702.js → config-BfsBepkH2.js} +1 -5
- package/dist/chunks/{config-Rw9OyW702.js.map → config-BfsBepkH2.js.map} +1 -1
- package/dist/chunks/{config-DP7eseR1.js → config-Bsh948nP.js} +1 -8
- package/dist/chunks/{config-DP7eseR1.js.map → config-Bsh948nP.js.map} +1 -1
- package/dist/chunks/config-CDat1wXf.js.map +1 -0
- package/dist/chunks/config-COpuWGr_2.js.map +1 -0
- package/dist/chunks/config-CY0_6cMi.js.map +1 -0
- package/dist/chunks/config-D94Z9po5.js.map +1 -0
- package/dist/chunks/config-DAX8Deh12.js.map +1 -0
- package/dist/chunks/{config-_qPUfb6-2.js → config-DWN4x6_e.js} +1 -7
- package/dist/chunks/config-DWN4x6_e.js.map +1 -0
- package/dist/chunks/{config-DhHbU3zO.js → config-Dgj1Q6JY.js} +1 -12
- package/dist/chunks/{config-DhHbU3zO.js.map → config-Dgj1Q6JY.js.map} +1 -1
- package/dist/chunks/{config-D3_g2KIn.js → config-Dguto_6o.js} +1 -13
- package/dist/chunks/{config-D3_g2KIn.js.map → config-Dguto_6o.js.map} +1 -1
- package/dist/chunks/config-WTNhdh6T.js.map +1 -0
- package/dist/chunks/config-eXB87DOi2.js.map +1 -0
- package/dist/chunks/{config-DvQIb4kb.js → config-vSji8w90.js} +1 -14
- package/dist/chunks/{config-DvQIb4kb.js.map → config-vSji8w90.js.map} +1 -1
- package/dist/chunks/{context-BSYR7RZs.js → context-CTbuwcYs.js} +1 -20
- package/dist/chunks/{context-BSYR7RZs.js.map → context-CTbuwcYs.js.map} +1 -1
- package/dist/chunks/{config-BqFjr3tN.js → grRadioStyles-BTjGNhtU.js} +1 -36
- package/dist/chunks/grRadioStyles-BTjGNhtU.js.map +1 -0
- package/dist/chunks/{granular-provider-C6uAujdJ.js → granular-provider-CZYm70Pm.js} +19 -19
- package/dist/chunks/{granular-provider-C6uAujdJ.js.map → granular-provider-CZYm70Pm.js.map} +1 -1
- package/dist/chunks/{useModalOverlay-DrQVYwwA.js → useModalOverlay-Cv5hF63W.js} +2 -2
- package/dist/chunks/{useModalOverlay-DrQVYwwA.js.map → useModalOverlay-Cv5hF63W.js.map} +1 -1
- package/dist/chunks/{usePortalTarget-Cn-Wiz5d.js → usePortalTarget-C0p-mhaM.js} +1 -1
- package/dist/chunks/{usePortalTarget-Cn-Wiz5d.js.map → usePortalTarget-C0p-mhaM.js.map} +1 -1
- package/dist/chunks/{validation-5HhpanPP.js → validation-DauXRIkL.js} +1 -1
- package/dist/chunks/{validation-5HhpanPP.js.map → validation-DauXRIkL.js.map} +1 -1
- package/dist/components/GrAlert/chunks/{GrAlert-BC1lplbY.js → GrAlert-B21QGele.js} +2 -16
- package/dist/components/GrAlert/chunks/{GrAlert-BC1lplbY.js.map → GrAlert-B21QGele.js.map} +1 -1
- package/dist/components/GrAlert/index.js +2 -2
- package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-gY4Xopza.js → GrAutocomplete-DsevPtiS.js} +3 -3
- package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-gY4Xopza.js.map → GrAutocomplete-DsevPtiS.js.map} +1 -1
- package/dist/components/GrAutocomplete/index.js +1 -1
- package/dist/components/GrAvatar/chunks/{GrAvatar-CVUujLmn.js → GrAvatar-BbdKRX8i.js} +3 -3
- package/dist/components/GrAvatar/chunks/{GrAvatar-CVUujLmn.js.map → GrAvatar-BbdKRX8i.js.map} +1 -1
- package/dist/components/GrAvatar/index.js +3 -3
- package/dist/components/GrBadge/chunks/{GrBadge-B1tgqfGQ.js → GrBadge-u2ZdS7CN.js} +1 -1
- package/dist/components/GrBadge/chunks/{GrBadge-B1tgqfGQ.js.map → GrBadge-u2ZdS7CN.js.map} +1 -1
- package/dist/components/GrBadge/index.js +1 -1
- package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-C-E9betg.js → GrBadgeWrap-DDoFQscR.js} +1 -1
- package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-C-E9betg.js.map → GrBadgeWrap-DDoFQscR.js.map} +1 -1
- package/dist/components/GrBadgeWrap/index.js +3 -3
- package/dist/components/GrBottomNav/chunks/{GrBottomNav-9GH7Dd9E.js → GrBottomNav-JUu4ylYv.js} +2 -2
- package/dist/components/GrBottomNav/chunks/{GrBottomNav-9GH7Dd9E.js.map → GrBottomNav-JUu4ylYv.js.map} +1 -1
- package/dist/components/GrBottomNav/index.js +3 -3
- package/dist/components/GrBreadcrumbs/chunks/{GrBreadcrumbs-DS_-PBVt.js → GrBreadcrumbs-CQ44iU2o.js} +2 -2
- package/dist/components/GrBreadcrumbs/chunks/{GrBreadcrumbs-DS_-PBVt.js.map → GrBreadcrumbs-CQ44iU2o.js.map} +1 -1
- package/dist/components/GrBreadcrumbs/index.js +1 -1
- package/dist/components/GrButton/chunks/{GrButton-D0m_z0XW.js → GrButton-Bw2AH4uX.js} +1 -1
- package/dist/components/GrButton/chunks/{GrButton-D0m_z0XW.js.map → GrButton-Bw2AH4uX.js.map} +1 -1
- package/dist/components/GrButton/index.js +2 -3
- package/dist/components/GrCard/chunks/{GrCard-DOrGHf2x.js → GrCard-DfIZOP5N.js} +1 -1
- package/dist/components/GrCard/chunks/{GrCard-DOrGHf2x.js.map → GrCard-DfIZOP5N.js.map} +1 -1
- package/dist/components/GrCard/index.js +1 -1
- package/dist/components/GrCheckbox/chunks/{GrCheckbox-BLOp8452.js → GrCheckbox-CEcHIsXM.js} +1 -1
- package/dist/components/GrCheckbox/chunks/{GrCheckbox-BLOp8452.js.map → GrCheckbox-CEcHIsXM.js.map} +1 -1
- package/dist/components/GrCheckbox/index.js +2 -2
- package/dist/components/GrCheckboxGroup/chunks/{GrCheckboxGroup-CXTx2Z5H.js → GrCheckboxGroup-BOwrVcFr.js} +2 -2
- package/dist/components/GrCheckboxGroup/chunks/{GrCheckboxGroup-CXTx2Z5H.js.map → GrCheckboxGroup-BOwrVcFr.js.map} +1 -1
- package/dist/components/GrCheckboxGroup/index.js +1 -1
- package/dist/components/GrCollapse/chunks/{GrCollapse-Kk0DE8tb.js → GrCollapse-KFcrji1L.js} +4 -18
- package/dist/components/GrCollapse/chunks/{GrCollapse-Kk0DE8tb.js.map → GrCollapse-KFcrji1L.js.map} +1 -1
- package/dist/components/GrCollapse/index.js +2 -2
- package/dist/components/GrColorPicker/chunks/{GrColorPicker-CkBTzkqn.js → GrColorPicker-qQdoEPHF.js} +5 -5
- package/dist/components/GrColorPicker/chunks/{GrColorPicker-CkBTzkqn.js.map → GrColorPicker-qQdoEPHF.js.map} +1 -1
- package/dist/components/GrColorPicker/index.js +2 -2
- package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-BugTlGdj.js → GrCommandPalette-BFcMf4Pn.js} +4 -4
- package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-BugTlGdj.js.map → GrCommandPalette-BFcMf4Pn.js.map} +1 -1
- package/dist/components/GrCommandPalette/index.js +2 -2
- package/dist/components/GrConfigProvider/chunks/{GrConfigProvider-BA6JO7V6.js → GrConfigProvider-UP-EaoAf.js} +1 -1
- package/dist/components/GrConfigProvider/chunks/{GrConfigProvider-BA6JO7V6.js.map → GrConfigProvider-UP-EaoAf.js.map} +1 -1
- package/dist/components/GrConfigProvider/index.js +3 -3
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-Ds5T0GiR.js → GrConfirmDialog-rRtMScJX.js} +4 -4
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-Ds5T0GiR.js.map → GrConfirmDialog-rRtMScJX.js.map} +1 -1
- package/dist/components/GrConfirmDialog/index.js +1 -1
- package/dist/components/GrDataTable/chunks/{GrDataTable-CYe2A2WA.js → GrDataTable-CNvZg2HZ.js} +5 -5
- package/dist/components/GrDataTable/chunks/{GrDataTable-CYe2A2WA.js.map → GrDataTable-CNvZg2HZ.js.map} +1 -1
- package/dist/components/GrDataTable/index.js +2 -2
- package/dist/components/GrDialog/chunks/{GrDialog-C3tYaA8v.js → GrDialog-D0U5iRqV.js} +3 -3
- package/dist/components/GrDialog/chunks/{GrDialog-C3tYaA8v.js.map → GrDialog-D0U5iRqV.js.map} +1 -1
- package/dist/components/GrDialog/index.js +2 -3
- package/dist/components/GrDialogService/chunks/{GrDialogService-CTBiiJDI.js → GrDialogService-CrwA4aJq.js} +6 -6
- package/dist/components/GrDialogService/chunks/GrDialogService-CrwA4aJq.js.map +1 -0
- package/dist/components/GrDialogService/index.js +2 -2
- package/dist/components/GrDivider/chunks/{GrDivider-xxq1_fIl.js → GrDivider-CAhm9jbE.js} +2 -2
- package/dist/components/GrDivider/chunks/{GrDivider-xxq1_fIl.js.map → GrDivider-CAhm9jbE.js.map} +1 -1
- package/dist/components/GrDivider/index.js +2 -2
- package/dist/components/GrDrawer/chunks/{GrDrawer-BSSuiNHU.js → GrDrawer-C3zAg2tG.js} +5 -5
- package/dist/components/GrDrawer/chunks/{GrDrawer-BSSuiNHU.js.map → GrDrawer-C3zAg2tG.js.map} +1 -1
- package/dist/components/GrDrawer/index.js +2 -2
- package/dist/components/GrDropdown/chunks/{GrDropdown-Bh6UK2M5.js → GrDropdown-BSfFOcDx.js} +2 -2
- package/dist/components/GrDropdown/chunks/{GrDropdown-Bh6UK2M5.js.map → GrDropdown-BSfFOcDx.js.map} +1 -1
- package/dist/components/GrDropdown/index.js +1 -1
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-LyfEFUbg.js → GrDropdownMenu-LOaFSCyd.js} +3 -3
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-LyfEFUbg.js.map → GrDropdownMenu-LOaFSCyd.js.map} +1 -1
- package/dist/components/GrDropdownMenu/index.js +3 -3
- package/dist/components/GrEmptyState/chunks/{GrEmptyState-W7Irx3vc.js → GrEmptyState-CS9do8eM.js} +3 -3
- package/dist/components/GrEmptyState/chunks/{GrEmptyState-W7Irx3vc.js.map → GrEmptyState-CS9do8eM.js.map} +1 -1
- package/dist/components/GrEmptyState/index.js +3 -3
- package/dist/components/GrFileUpload/chunks/{GrFileUpload-DuDzC43S.js → GrFileUpload-D3-vC-ap.js} +4 -4
- package/dist/components/GrFileUpload/chunks/{GrFileUpload-DuDzC43S.js.map → GrFileUpload-D3-vC-ap.js.map} +1 -1
- package/dist/components/GrFileUpload/index.js +3 -3
- package/dist/components/GrForm/chunks/{GrForm-BCHCfIMv.js → GrForm-DdJw23Pz.js} +1 -1
- package/dist/components/GrForm/chunks/{GrForm-BCHCfIMv.js.map → GrForm-DdJw23Pz.js.map} +1 -1
- package/dist/components/GrForm/index.js +4 -4
- package/dist/components/GrFormField/chunks/{GrFormField-CL5rcgj6.js → GrFormField-kqfVY30N.js} +1 -1
- package/dist/components/GrFormField/chunks/{GrFormField-CL5rcgj6.js.map → GrFormField-kqfVY30N.js.map} +1 -1
- package/dist/components/GrFormField/index.js +3 -3
- package/dist/components/GrFormFile/chunks/{GrFormFile-BikSD7bg.js → GrFormFile-D722xHn8.js} +3 -3
- package/dist/components/GrFormFile/chunks/{GrFormFile-BikSD7bg.js.map → GrFormFile-D722xHn8.js.map} +1 -1
- package/dist/components/GrFormFile/index.js +1 -1
- package/dist/components/GrFormSection/chunks/{GrFormSection-BEh5n4jF.js → GrFormSection-CdGWvzXO.js} +2 -2
- package/dist/components/GrFormSection/chunks/{GrFormSection-BEh5n4jF.js.map → GrFormSection-CdGWvzXO.js.map} +1 -1
- package/dist/components/GrFormSection/index.js +3 -3
- package/dist/components/GrIcon/chunks/{GrIcon-BvA2ZGXP.js → GrIcon-bQwtZtYT.js} +1 -1
- package/dist/components/GrIcon/chunks/{GrIcon-BvA2ZGXP.js.map → GrIcon-bQwtZtYT.js.map} +1 -1
- package/dist/components/GrIcon/index.js +1 -1
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-DfD4euH5.js → GrImageViewer-CMO10TS7.js} +2 -2
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-DfD4euH5.js.map → GrImageViewer-CMO10TS7.js.map} +1 -1
- package/dist/components/GrImageViewer/index.js +1 -1
- package/dist/components/GrInput/chunks/{GrInput-2wd7Crs0.js → GrInput-Bb_pxqpT.js} +1 -1
- package/dist/components/GrInput/chunks/{GrInput-2wd7Crs0.js.map → GrInput-Bb_pxqpT.js.map} +1 -1
- package/dist/components/GrInput/index.js +1 -1
- package/dist/components/GrInputTag/chunks/{GrInputTag-CyV2eY7Z.js → GrInputTag-Dghhg03-.js} +3 -3
- package/dist/components/GrInputTag/chunks/{GrInputTag-CyV2eY7Z.js.map → GrInputTag-Dghhg03-.js.map} +1 -1
- package/dist/components/GrInputTag/index.js +1 -1
- package/dist/components/GrKbd/chunks/{GrKbd-DU2lBkRV.js → GrKbd-BXbhsH0M.js} +1 -1
- package/dist/components/GrKbd/chunks/{GrKbd-DU2lBkRV.js.map → GrKbd-BXbhsH0M.js.map} +1 -1
- package/dist/components/GrKbd/index.js +1 -1
- package/dist/components/GrLink/chunks/{GrLink-D-cgUMXW.js → GrLink-BQb7U4so.js} +2 -2
- package/dist/components/GrLink/chunks/{GrLink-D-cgUMXW.js.map → GrLink-BQb7U4so.js.map} +1 -1
- package/dist/components/GrLink/index.js +1 -1
- package/dist/components/GrList/chunks/{GrList-4YU1NZtM.js → GrList-CHibO0xA.js} +2 -2
- package/dist/components/GrList/chunks/{GrList-4YU1NZtM.js.map → GrList-CHibO0xA.js.map} +1 -1
- package/dist/components/GrList/index.js +1 -1
- package/dist/components/GrLoading/chunks/{GrLoading-CH95CFzS.js → GrLoading-C3DZSSuh.js} +1 -1
- package/dist/components/GrLoading/chunks/{GrLoading-CH95CFzS.js.map → GrLoading-C3DZSSuh.js.map} +1 -1
- package/dist/components/GrLoading/index.js +1 -1
- package/dist/components/GrModal/chunks/{GrModal-CbMMr6W1.js → GrModal-CPz7SWD_.js} +2 -2
- package/dist/components/GrModal/chunks/{GrModal-CbMMr6W1.js.map → GrModal-CPz7SWD_.js.map} +1 -1
- package/dist/components/GrModal/index.js +1 -1
- package/dist/components/GrNavbar/chunks/{GrNavbar-CF0KbM_6.js → GrNavbar-DWaaoV7n.js} +2 -2
- package/dist/components/GrNavbar/chunks/{GrNavbar-CF0KbM_6.js.map → GrNavbar-DWaaoV7n.js.map} +1 -1
- package/dist/components/GrNavbar/index.js +1 -1
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-B5CHZDBj.js → GrNumberInput-BotnzW77.js} +2 -2
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-B5CHZDBj.js.map → GrNumberInput-BotnzW77.js.map} +1 -1
- package/dist/components/GrNumberInput/index.js +1 -1
- package/dist/components/GrPagination/chunks/{GrPagination-BM4FrD6Q.js → GrPagination-GtGtSMJG.js} +3 -3
- package/dist/components/GrPagination/chunks/{GrPagination-BM4FrD6Q.js.map → GrPagination-GtGtSMJG.js.map} +1 -1
- package/dist/components/GrPagination/index.js +1 -1
- package/dist/components/GrPopover/chunks/{GrPopover-DMH4Jjst.js → GrPopover-b70bIlQ9.js} +2 -2
- package/dist/components/GrPopover/chunks/{GrPopover-DMH4Jjst.js.map → GrPopover-b70bIlQ9.js.map} +1 -1
- package/dist/components/GrPopover/index.js +1 -1
- package/dist/components/GrProgressBar/chunks/{GrProgressBar-xwbNM9QB.js → GrProgressBar-hszUOC8f.js} +1 -1
- package/dist/components/GrProgressBar/chunks/{GrProgressBar-xwbNM9QB.js.map → GrProgressBar-hszUOC8f.js.map} +1 -1
- package/dist/components/GrProgressBar/index.js +1 -1
- package/dist/components/GrProgressCircle/chunks/{GrProgressCircle-B8olXRo5.js → GrProgressCircle-BeUx1g1f.js} +3 -11
- package/dist/components/GrProgressCircle/chunks/{GrProgressCircle-B8olXRo5.js.map → GrProgressCircle-BeUx1g1f.js.map} +1 -1
- package/dist/components/GrProgressCircle/index.js +2 -2
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-Pwr9NPxK.js → GrPromptDialog-CEI8bf-t.js} +8 -8
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-Pwr9NPxK.js.map → GrPromptDialog-CEI8bf-t.js.map} +1 -1
- package/dist/components/GrPromptDialog/index.js +1 -1
- package/dist/components/GrRadio/chunks/{GrRadio-DWiRaMzt.js → GrRadio-BdhknbO8.js} +2 -2
- package/dist/components/GrRadio/chunks/{GrRadio-DWiRaMzt.js.map → GrRadio-BdhknbO8.js.map} +1 -1
- package/dist/components/GrRadio/index.js +3 -3
- package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-DIuBw0wk.js → GrRadioGroup-BVmjKXcv.js} +2 -2
- package/dist/components/GrRadioGroup/chunks/GrRadioGroup-BVmjKXcv.js.map +1 -0
- package/dist/components/GrRadioGroup/index.js +1 -1
- package/dist/components/GrRating/chunks/{GrRating-DVFH3lYu.js → GrRating-BSEtaibx.js} +1 -1
- package/dist/components/GrRating/chunks/{GrRating-DVFH3lYu.js.map → GrRating-BSEtaibx.js.map} +1 -1
- package/dist/components/GrRating/index.js +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-C7W9mgYN.js → GrResponseErrorBanner-CZONq8uT.js} +3 -3
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-C7W9mgYN.js.map → GrResponseErrorBanner-CZONq8uT.js.map} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-DhX4jjay.js → GrResponseErrorBanner-CgfAwlg3.js} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-DhX4jjay.js.map → GrResponseErrorBanner-CgfAwlg3.js.map} +1 -1
- package/dist/components/GrResponseErrorBanner/index.js +3 -3
- package/dist/components/GrSegmented/chunks/{GrSegmented-CQw3ijqa.js → GrSegmented-DP9WMAbm.js} +2 -2
- package/dist/components/GrSegmented/chunks/{GrSegmented-CQw3ijqa.js.map → GrSegmented-DP9WMAbm.js.map} +1 -1
- package/dist/components/GrSegmented/index.js +3 -3
- package/dist/components/GrSelect/chunks/{GrSelect-B-Voni7D.js → GrSelect-CaGuyvtb.js} +5 -7
- package/dist/components/GrSelect/chunks/GrSelect-CaGuyvtb.js.map +1 -0
- package/dist/components/GrSelect/index.js +1 -1
- package/dist/components/GrSelect/styles.css +1 -1
- package/dist/components/GrSidebar/chunks/{GrSidebar-i7AxjhY_.js → GrSidebar-DG_t4aPE.js} +3 -3
- package/dist/components/GrSidebar/chunks/{GrSidebar-i7AxjhY_.js.map → GrSidebar-DG_t4aPE.js.map} +1 -1
- package/dist/components/GrSidebar/index.js +3 -3
- package/dist/components/GrSkeleton/chunks/{GrSkeleton-DEvNE3bC.js → GrSkeleton-CgfXxPQ2.js} +1 -7
- package/dist/components/GrSkeleton/chunks/{GrSkeleton-DEvNE3bC.js.map → GrSkeleton-CgfXxPQ2.js.map} +1 -1
- package/dist/components/GrSkeleton/index.js +3 -3
- package/dist/components/GrSlider/chunks/{GrSlider-CyhVsNKn.js → GrSlider-s99yAyz6.js} +1 -1
- package/dist/components/GrSlider/chunks/{GrSlider-CyhVsNKn.js.map → GrSlider-s99yAyz6.js.map} +1 -1
- package/dist/components/GrSlider/index.js +1 -1
- package/dist/components/GrSortableList/chunks/{GrSortableList-XB7mXM1W.js → GrSortableList-DJFPdUVv.js} +2 -2
- package/dist/components/GrSortableList/chunks/{GrSortableList-XB7mXM1W.js.map → GrSortableList-DJFPdUVv.js.map} +1 -1
- package/dist/components/GrSortableList/index.js +2 -2
- package/dist/components/GrSplitter/chunks/{GrSplitter-BzxVQwbY.js → GrSplitter-B9_JrT7q.js} +3 -12
- package/dist/components/GrSplitter/chunks/{GrSplitter-BzxVQwbY.js.map → GrSplitter-B9_JrT7q.js.map} +1 -1
- package/dist/components/GrSplitter/index.js +3 -3
- package/dist/components/GrStatistic/chunks/{GrStatistic-DOsM6s5V.js → GrStatistic-C3VpykHo.js} +2 -2
- package/dist/components/GrStatistic/chunks/{GrStatistic-DOsM6s5V.js.map → GrStatistic-C3VpykHo.js.map} +1 -1
- package/dist/components/GrStatistic/index.js +1 -1
- package/dist/components/GrSwitch/chunks/{GrSwitch-DpyvVrZG.js → GrSwitch-x_vQQ6ao.js} +1 -1
- package/dist/components/GrSwitch/chunks/{GrSwitch-DpyvVrZG.js.map → GrSwitch-x_vQQ6ao.js.map} +1 -1
- package/dist/components/GrSwitch/index.js +1 -1
- package/dist/components/GrTabPanels/chunks/{GrTabPanels-BVe1CZdJ.js → GrTabPanels-AJt1w1XC.js} +1 -1
- package/dist/components/GrTabPanels/chunks/{GrTabPanels-BVe1CZdJ.js.map → GrTabPanels-AJt1w1XC.js.map} +1 -1
- package/dist/components/GrTabPanels/index.js +3 -3
- package/dist/components/GrTable/chunks/{GrTable-BfqgwETQ.js → GrTable-f3qCWa99.js} +2 -2
- package/dist/components/GrTable/chunks/{GrTable-BfqgwETQ.js.map → GrTable-f3qCWa99.js.map} +1 -1
- package/dist/components/GrTable/index.js +2 -2
- package/dist/components/GrTabs/chunks/{GrTabs-f3-oQenu.js → GrTabs-CBHZkOFY.js} +2 -2
- package/dist/components/GrTabs/chunks/{GrTabs-f3-oQenu.js.map → GrTabs-CBHZkOFY.js.map} +1 -1
- package/dist/components/GrTabs/index.js +3 -3
- package/dist/components/GrTextarea/chunks/{GrTextarea-DSvd1nSy.js → GrTextarea-CNnkcIG1.js} +1 -1
- package/dist/components/GrTextarea/chunks/{GrTextarea-DSvd1nSy.js.map → GrTextarea-CNnkcIG1.js.map} +1 -1
- package/dist/components/GrTextarea/index.js +1 -1
- package/dist/components/GrTimeline/chunks/{GrTimeline-B-h2Yanw.js → GrTimeline-DlTraRn5.js} +4 -15
- package/dist/components/GrTimeline/chunks/{GrTimeline-B-h2Yanw.js.map → GrTimeline-DlTraRn5.js.map} +1 -1
- package/dist/components/GrTimeline/index.js +3 -3
- package/dist/components/GrToaster/chunks/{GrToaster-Dqja0Lf9.js → GrToaster-Db2NgrXu.js} +4 -4
- package/dist/components/GrToaster/chunks/{GrToaster-Dqja0Lf9.js.map → GrToaster-Db2NgrXu.js.map} +1 -1
- package/dist/components/GrToaster/index.js +1 -1
- package/dist/components/GrTooltip/chunks/{GrTooltip-Cn08heWz.js → GrTooltip-B6AwE_UX.js} +3 -3
- package/dist/components/GrTooltip/chunks/{GrTooltip-Cn08heWz.js.map → GrTooltip-B6AwE_UX.js.map} +1 -1
- package/dist/components/GrTooltip/index.js +1 -1
- package/dist/components/GrTree/chunks/{GrTree-BR9a2pay.js → GrTree-BvOeQ3xJ.js} +1 -1
- package/dist/components/GrTree/chunks/{GrTree-BR9a2pay.js.map → GrTree-BvOeQ3xJ.js.map} +1 -1
- package/dist/components/GrTree/index.js +2 -2
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect--muUeB0v.js → GrTreeSelect-_LjTRR7X.js} +5 -9
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-_LjTRR7X.js.map +1 -0
- package/dist/components/GrTreeSelect/index.js +1 -1
- package/dist/composables/useGrComponentConfig.js +1 -1
- package/dist/composables/usePortalTarget.js +1 -1
- package/dist/directives/loading.js +1 -1
- package/dist/granular-provider-node.js +1 -1
- package/dist/granular-provider.js +1 -1
- package/dist/index.js +95 -96
- package/dist/testing.js +33 -2
- package/dist/testing.js.map +1 -1
- package/dist/types/{src/components → components}/GrAlert/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrAvatar/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrBadgeWrap/index.d.ts +1 -1
- package/dist/types/{src/components → components}/GrBottomNav/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrButton/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrCheckbox/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrCollapse/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrColorPicker/index.d.ts +1 -1
- package/dist/types/{src/components → components}/GrCommandPalette/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrConfigProvider/index.d.ts +1 -1
- package/dist/types/{src/components → components}/GrDataTable/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrDialog/index.d.ts +1 -1
- package/dist/types/{src/components → components}/GrDialogService/index.d.ts +1 -1
- package/dist/types/{src/components → components}/GrDropdownMenu/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrEmptyState/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrFileUpload/index.d.ts +2 -3
- package/dist/types/{src/components → components}/GrForm/index.d.ts +2 -2
- package/dist/types/{src/components → components}/GrFormField/index.d.ts +1 -1
- package/dist/types/{src/components → components}/GrFormSection/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrProgressCircle/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrRadio/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrResponseErrorBanner/index.d.ts +2 -3
- package/dist/types/{src/components → components}/GrSegmented/index.d.ts +1 -1
- package/dist/types/{src/components → components}/GrSelect/GrSelect.vue.d.ts +0 -6
- package/dist/types/{src/components → components}/GrSidebar/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrSkeleton/index.d.ts +1 -1
- package/dist/types/{src/components → components}/GrSplitter/index.d.ts +1 -1
- package/dist/types/{src/components → components}/GrTabPanels/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrTabs/index.d.ts +0 -1
- package/dist/types/{src/components → components}/GrTimeline/index.d.ts +0 -2
- package/dist/types/{src/components → components}/GrTreeSelect/GrTreeSelect.vue.d.ts +0 -6
- package/dist/types/{src/testing → testing}/index.d.ts +1 -0
- package/dist/types/testing/keyboard.d.ts +32 -0
- package/dist/web-types.json +1 -9
- package/package.json +109 -106
- package/dist/chunks/config-8Pcutu1j2.js.map +0 -1
- package/dist/chunks/config-BE6n20np2.js.map +0 -1
- package/dist/chunks/config-BKvX0q102.js.map +0 -1
- package/dist/chunks/config-BqFjr3tN.js.map +0 -1
- package/dist/chunks/config-CDat1wXf2.js.map +0 -1
- package/dist/chunks/config-COpuWGr_.js.map +0 -1
- package/dist/chunks/config-CY0_6cMi2.js.map +0 -1
- package/dist/chunks/config-D94Z9po52.js.map +0 -1
- package/dist/chunks/config-DAX8Deh1.js.map +0 -1
- package/dist/chunks/config-WTNhdh6T2.js.map +0 -1
- package/dist/chunks/config-_qPUfb6-2.js.map +0 -1
- package/dist/chunks/config-eXB87DOi.js.map +0 -1
- package/dist/components/GrDialogService/chunks/GrDialogService-CTBiiJDI.js.map +0 -1
- package/dist/components/GrRadioGroup/chunks/GrRadioGroup-DIuBw0wk.js.map +0 -1
- package/dist/components/GrSelect/chunks/GrSelect-B-Voni7D.js.map +0 -1
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect--muUeB0v.js.map +0 -1
- /package/dist/chunks/{config-8Pcutu1j2.js → config-8Pcutu1j.js} +0 -0
- /package/dist/chunks/{config-BE6n20np2.js → config-BE6n20np.js} +0 -0
- /package/dist/chunks/{config-BKvX0q102.js → config-BKvX0q10.js} +0 -0
- /package/dist/chunks/{config-CDat1wXf2.js → config-CDat1wXf.js} +0 -0
- /package/dist/chunks/{config-COpuWGr_.js → config-COpuWGr_2.js} +0 -0
- /package/dist/chunks/{config-CY0_6cMi2.js → config-CY0_6cMi.js} +0 -0
- /package/dist/chunks/{config-D94Z9po52.js → config-D94Z9po5.js} +0 -0
- /package/dist/chunks/{config-DAX8Deh1.js → config-DAX8Deh12.js} +0 -0
- /package/dist/chunks/{config-WTNhdh6T2.js → config-WTNhdh6T.js} +0 -0
- /package/dist/chunks/{config-eXB87DOi.js → config-eXB87DOi2.js} +0 -0
- /package/dist/types/{src/components → components}/GrAlert/GrAlert.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAlert/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAlert/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAlert/grAlertStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAutocomplete/GrAutocomplete.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAutocomplete/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAutocomplete/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAutocomplete/grAutocompleteStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAutocomplete/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAutocomplete/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAvatar/GrAvatar.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAvatar/GrAvatarGroup.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAvatar/avatarContext.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAvatar/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAvatar/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAvatar/grAvatarStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrAvatar/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBadge/GrBadge.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBadge/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBadge/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBadge/grBadgeStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBadge/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBadge/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBadgeWrap/GrBadgeWrap.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBadgeWrap/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBadgeWrap/grBadgeWrapStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBadgeWrap/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBottomNav/GrBottomNav.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBottomNav/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBottomNav/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBottomNav/grBottomNavStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBottomNav/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBreadcrumbs/GrBreadcrumbs.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBreadcrumbs/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBreadcrumbs/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBreadcrumbs/grBreadcrumbsStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBreadcrumbs/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrBreadcrumbs/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrButton/GrButton.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrButton/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrButton/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrButton/grButtonStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrButton/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrButtonGroup/GrButtonGroup.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrButtonGroup/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrButtonGroup/context.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrButtonGroup/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCard/GrCard.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCard/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCard/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCard/grCardStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCard/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCard/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCheckbox/GrCheckbox.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCheckbox/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCheckbox/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCheckbox/grCheckboxGroupContext.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCheckbox/grCheckboxStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCheckbox/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCheckboxGroup/GrCheckboxGroup.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCheckboxGroup/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCheckboxGroup/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCheckboxGroup/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCollapse/GrCollapse.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCollapse/GrCollapseItem.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCollapse/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCollapse/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCollapse/grCollapseContext.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCollapse/grCollapseStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCollapse/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrColorPicker/GrColorPicker.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrColorPicker/color.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrColorPicker/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrColorPicker/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrColorPicker/grColorPickerStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrColorPicker/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCommandPalette/GrCommandPalette.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCommandPalette/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCommandPalette/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCommandPalette/filtering.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCommandPalette/grCommandPaletteStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrCommandPalette/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrConfigProvider/GrConfigProvider.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrConfigProvider/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrConfigProvider/context.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrConfigProvider/zIndexScale.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrConfirmDialog/GrConfirmDialog.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrConfirmDialog/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrConfirmDialog/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrConfirmDialog/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDataTable/GrDataTable.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDataTable/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDataTable/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDataTable/grDataTableSort.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDataTable/grDataTableStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDataTable/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDialog/GrDialog.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDialog/GrDialogCloseButton.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDialog/GrDialogFooter.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDialog/GrDialogHeader.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDialog/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDialog/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDialog/dialogShared.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDialog/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDialogService/GrDialogServiceHost.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDialogService/GrDialogServiceItem.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDialogService/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDialogService/store.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDialogService/types.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDialogService/useDialogService.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDivider/GrDivider.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDivider/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDivider/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDivider/grDividerStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDivider/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDivider/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDrawer/GrDrawer.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDrawer/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDrawer/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDrawer/grDrawerStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDrawer/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDrawer/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdown/GrDropdown.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdown/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdown/grDropdownStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdown/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdown/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenu.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenuColumn.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenuColumns.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenuDivider.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenuGroup.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenuHeader.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenuItem.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdownMenu/GrDropdownMenuList.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdownMenu/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdownMenu/grDropdownMenuStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdownMenu/menuModel.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrDropdownMenu/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrEmptyState/GrEmptyState.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrEmptyState/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrEmptyState/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrEmptyState/grEmptyStateStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrEmptyState/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/FileValidationError.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/GrFileUpload.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/acceptValidator.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/fileEntry.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/grFileUploadStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/matchAccept.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/maxFileSize.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/runFileValidators.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/types.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/uploadState.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/uploadViaXhr.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/useDropZone.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/usePerFileUpload.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFileUpload/useUploadState.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrForm/GrForm.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrForm/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrForm/context.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrForm/fileRule.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrForm/modelSnapshot.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrForm/validation.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormField/GrFormField.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormField/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormField/context.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormField/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormField/grFormFieldStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormField/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormFile/GrFormFile.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormFile/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormFile/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormFile/grFormFileStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormFile/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormFile/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormSection/GrFormSection.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormSection/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormSection/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormSection/grFormSectionStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrFormSection/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrIcon/GrIcon.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrIcon/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrIcon/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrIcon/grIconStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrIcon/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrIcon/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrImageViewer/GrImageViewer.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrImageViewer/composables/usePointerGestures.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrImageViewer/composables/useViewerKeyboard.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrImageViewer/composables/useWheelGesture.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrImageViewer/composables/useZoomPan.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrImageViewer/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrImageViewer/grImageViewerStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrImageViewer/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrImageViewer/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrInput/GrInput.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrInput/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrInput/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrInput/grInputStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrInput/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrInput/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrInputTag/GrInputTag.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrInputTag/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrInputTag/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrInputTag/grInputTagStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrInputTag/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrInputTag/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrKbd/GrKbd.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrKbd/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrKbd/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrKbd/grKbdStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrKbd/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrKbd/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrLink/GrLink.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrLink/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrLink/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrLink/grLinkStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrLink/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrLink/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrList/GrList.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrList/GrListItem.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrList/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrList/grListStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrList/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrList/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrLoading/GrLoading.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrLoading/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrLoading/grLoadingStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrLoading/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrLoading/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrModal/GrModal.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrModal/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrModal/context.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrModal/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrModal/grModalStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrModal/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrModal/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrNavbar/GrNavbar.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrNavbar/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrNavbar/grNavbarStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrNavbar/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrNavbar/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrNumberInput/GrNumberInput.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrNumberInput/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrNumberInput/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrNumberInput/grNumberInputStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrNumberInput/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrNumberInput/numberInputMath.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrNumberInput/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPagination/GrPagination.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPagination/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPagination/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPagination/grPaginationStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPagination/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPagination/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPopover/GrPopover.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPopover/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPopover/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPopover/grPopoverStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPopover/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPopover/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrProgressBar/GrProgressBar.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrProgressBar/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrProgressBar/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrProgressBar/grStyle.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrProgressBar/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrProgressBar/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrProgressCircle/GrProgressCircle.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrProgressCircle/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrProgressCircle/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrProgressCircle/geometry.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrProgressCircle/grProgressCircleStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrProgressCircle/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPromptDialog/GrPromptDialog.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPromptDialog/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPromptDialog/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrPromptDialog/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRadio/GrRadio.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRadio/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRadio/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRadio/grRadioGroupContext.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRadio/grRadioStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRadio/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRadioGroup/GrRadioGroup.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRadioGroup/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRadioGroup/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRadioGroup/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRating/GrRating.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRating/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRating/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRating/grRatingStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRating/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrRating/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/GrFormErrorBanner.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/GrResponseErrorBanner.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/GrUploadErrorBanner.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/abortErrorParser.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/createResponseErrorClassifier.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/fileValidationParser.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/httpStatusParser.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/jsonApiErrorParser.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/laravelValidationParser.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/networkErrorParser.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/normalizeError.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/plainMessageParser.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/parsers/problemDetailsParser.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/responseError.defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/responseError.types.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrResponseErrorBanner/useResponseError.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSegmented/GrSegmented.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSegmented/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSegmented/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSegmented/grSegmentedStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSegmented/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSelect/composables/useSelectNavigation.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSelect/composables/useSelectPanelItems.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSelect/composables/useSelectValues.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSelect/composables/useSelectVirtualization.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSelect/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSelect/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSelect/grSelectStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSelect/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSelect/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSelect/selectValue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSidebar/GrSidebar.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSidebar/GrSidebarGroup.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSidebar/GrSidebarItem.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSidebar/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSidebar/grSidebarStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSidebar/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSidebar/sidebarContext.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSkeleton/GrSkeleton.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSkeleton/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSkeleton/grSkeletonStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSlider/GrSlider.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSlider/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSlider/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSlider/grSliderStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSlider/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSlider/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSortableList/GrSortableList.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSortableList/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSortableList/grSortableListStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSortableList/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSortableList/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSplitter/GrSplitter.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSplitter/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSplitter/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSplitter/grSplitterStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSplitter/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSplitter/splitterGeometry.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrStatistic/GrStatistic.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrStatistic/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrStatistic/countUp.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrStatistic/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrStatistic/formatStatisticValue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrStatistic/grStatisticStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrStatistic/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrStatistic/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSwitch/GrSwitch.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSwitch/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSwitch/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSwitch/grSwitchStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSwitch/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrSwitch/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTabPanels/GrTabPanel.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTabPanels/GrTabPanels.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTabPanels/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTabPanels/context.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTable/GrTable.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTable/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTable/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTable/grTableStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTable/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTable/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTabs/GrTabs.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTabs/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTabs/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTabs/grTabsStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTabs/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTextarea/GrTextarea.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTextarea/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTextarea/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTextarea/grTextareaStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTextarea/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTextarea/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTimeline/GrTimeline.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTimeline/GrTimelineItem.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTimeline/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTimeline/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTimeline/grTimelineContext.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTimeline/grTimelineStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTimeline/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTimeline/timelineGroups.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrToaster/GrToaster.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrToaster/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrToaster/grToasterStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrToaster/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrToaster/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTooltip/GrTooltip.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTooltip/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTooltip/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTooltip/grTooltipStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTooltip/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTooltip/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTree/GrTree.vue.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTree/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTree/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTree/grTreeChecking.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTree/grTreeDataAdapter.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTree/grTreeInteractionContext.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTree/grTreeProps.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTree/grTreeStore.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTree/grTreeStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTree/grTreeTypes.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTree/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTree/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTreeSelect/config.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTreeSelect/defaults.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTreeSelect/grTreeSelectStyles.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTreeSelect/grTreeSelectTypes.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTreeSelect/index.d.ts +0 -0
- /package/dist/types/{src/components → components}/GrTreeSelect/safelist.d.ts +0 -0
- /package/dist/types/{src/components → components}/shared/classTokens.d.ts +0 -0
- /package/dist/types/{src/components → components}/shared/hotkey.d.ts +0 -0
- /package/dist/types/{src/components → components}/shared/hotkeyTokens.d.ts +0 -0
- /package/dist/types/{src/components → components}/shared/icon.d.ts +0 -0
- /package/dist/types/{src/components → components}/shared/instance.d.ts +0 -0
- /package/dist/types/{src/components → components}/shared/optionFilter.d.ts +0 -0
- /package/dist/types/{src/components → components}/shared/sizes.d.ts +0 -0
- /package/dist/types/{src/components → components}/shared/slotNodes.d.ts +0 -0
- /package/dist/types/{src/components → components}/shared/tones.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/internal/dragSortGeometry.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/internal/focusables.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/internal/inert.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/internal/overlayStack.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/internal/portalRoot.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/internal/useAddonMeasurement.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/internal/useControlAddons.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/internal/useControlledOpen.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/internal/useFilePreviews.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/internal/useFocusWithin.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/internal/useInertOthers.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/internal/useModalOverlay.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/internal/useOverlayPresence.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/internal/useScrollLock.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/internal/useTeleportEnabled.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/useAnnouncer.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/useComboboxNavigation.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/useDismissible.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/useDragGesture.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/useDragSort.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/useFloating.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/useFocusTrap.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/useGrComponentConfig.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/useGrFormControl.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/useGranularityTranslations.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/useOverlayLayer.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/usePortalTarget.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/useRovingFocus.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/useTheme.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/useToast.d.ts +0 -0
- /package/dist/types/{src/composables → composables}/useVirtualList.d.ts +0 -0
- /package/dist/types/{src/directives → directives}/autofocus.d.ts +0 -0
- /package/dist/types/{src/directives → directives}/autosize.d.ts +0 -0
- /package/dist/types/{src/directives → directives}/clickOutside.d.ts +0 -0
- /package/dist/types/{src/directives → directives}/dropzone.d.ts +0 -0
- /package/dist/types/{src/directives → directives}/globalDirectives.d.ts +0 -0
- /package/dist/types/{src/directives → directives}/hotkey.d.ts +0 -0
- /package/dist/types/{src/directives → directives}/index.d.ts +0 -0
- /package/dist/types/{src/directives → directives}/loading.d.ts +0 -0
- /package/dist/types/{src/fileValidation → fileValidation}/FileValidationError.d.ts +0 -0
- /package/dist/types/{src/fileValidation → fileValidation}/acceptValidator.d.ts +0 -0
- /package/dist/types/{src/fileValidation → fileValidation}/allowedExtensionsValidator.d.ts +0 -0
- /package/dist/types/{src/fileValidation → fileValidation}/allowedMimeTypesValidator.d.ts +0 -0
- /package/dist/types/{src/fileValidation → fileValidation}/i18n.d.ts +0 -0
- /package/dist/types/{src/fileValidation → fileValidation}/index.d.ts +0 -0
- /package/dist/types/{src/fileValidation → fileValidation}/matchAccept.d.ts +0 -0
- /package/dist/types/{src/fileValidation → fileValidation}/maxCountValidator.d.ts +0 -0
- /package/dist/types/{src/fileValidation → fileValidation}/maxFileSize.d.ts +0 -0
- /package/dist/types/{src/fileValidation → fileValidation}/maxTotalSizeBytesValidator.d.ts +0 -0
- /package/dist/types/{src/fileValidation → fileValidation}/runFileValidators.d.ts +0 -0
- /package/dist/types/{src/fileValidation → fileValidation}/types.d.ts +0 -0
- /package/dist/types/{src/granular-provider → granular-provider}/index.d.ts +0 -0
- /package/dist/types/{src/granular-provider → granular-provider}/node.d.ts +0 -0
- /package/dist/types/{src/granular-provider → granular-provider}/shared.d.ts +0 -0
- /package/dist/types/{src/i18n → i18n}/adapter.d.ts +0 -0
- /package/dist/types/{src/i18n → i18n}/all.d.ts +0 -0
- /package/dist/types/{src/i18n → i18n}/index.d.ts +0 -0
- /package/dist/types/{src/i18n → i18n}/messages/const.d.ts +0 -0
- /package/dist/types/{src/i18n → i18n}/messages/en.d.ts +0 -0
- /package/dist/types/{src/i18n → i18n}/messages/es.d.ts +0 -0
- /package/dist/types/{src/i18n → i18n}/messages/index.d.ts +0 -0
- /package/dist/types/{src/i18n → i18n}/messages/ru.d.ts +0 -0
- /package/dist/types/{src/index.d.ts → index.d.ts} +0 -0
- /package/dist/types/{src/internal → internal}/granularityFormat.d.ts +0 -0
- /package/dist/types/{src/internal → internal}/granularityI18n.d.ts +0 -0
- /package/dist/types/{src/internal → internal}/keyboard.d.ts +0 -0
- /package/dist/types/{src/testing → testing}/announcer.d.ts +0 -0
- /package/dist/types/{src/testing → testing}/context.d.ts +0 -0
- /package/dist/types/{src/testing → testing}/env.d.ts +0 -0
- /package/dist/types/{src/testing → testing}/geometry.d.ts +0 -0
- /package/dist/types/{src/testing → testing}/pointer.d.ts +0 -0
- /package/dist/types/{src/theme → theme}/apply.d.ts +0 -0
- /package/dist/types/{src/theme → theme}/color.d.ts +0 -0
- /package/dist/types/{src/theme → theme}/extendTheme.d.ts +0 -0
- /package/dist/types/{src/theme → theme}/index.d.ts +0 -0
- /package/dist/types/{src/theme → theme}/roles.d.ts +0 -0
- /package/dist/types/{src/theme → theme}/tone.d.ts +0 -0
- /package/dist/types/{src/theme → theme}/validate.d.ts +0 -0
- /package/dist/types/{src/tokens → tokens}/generated.d.ts +0 -0
- /package/dist/types/{src/tokens → tokens}/index.d.ts +0 -0
- /package/dist/types/{src/tokens → tokens}/types.d.ts +0 -0
- /package/dist/types/{src/vue → vue}/index.d.ts +0 -0
- /package/dist/types/{src/vue → vue}/plugin.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrBreadcrumbs-DS_-PBVt.js","names":[],"sources":["../../../../src/components/GrBreadcrumbs/GrBreadcrumbs.vue","../../../../src/components/GrBreadcrumbs/GrBreadcrumbs.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nimport GrLink from '../GrLink/GrLink.vue'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { iconClass, iconTag } from '../shared/icon'\n\nimport {\n breadcrumbsCurrentClass,\n breadcrumbsEllipsisClass,\n breadcrumbsItemIconClass,\n breadcrumbsLabelClass,\n breadcrumbsListClass,\n breadcrumbsListNowrapClass,\n breadcrumbsListWrapClass,\n breadcrumbsRootClass,\n breadcrumbsSeparatorClass,\n breadcrumbsSizeClassBySize,\n type GrBreadcrumbItem,\n type GrBreadcrumbsLinkComponent,\n type GrBreadcrumbsSize,\n resolveBreadcrumbsFit,\n resolveBreadcrumbsLayout,\n} from './grBreadcrumbsStyles'\n\nexport type { GrBreadcrumbItem, GrBreadcrumbsSize } from './grBreadcrumbsStyles'\n\n/**\n * Путь до текущей страницы (WAI-ARIA breadcrumb): `<nav>` с именем, внутри\n * упорядоченный список ссылок, последний пункт — текущая страница.\n *\n * Ссылки рисует `GrLink`, поэтому роутер подключается тем же способом, что и\n * везде в пакете: `as` + `to`.\n */\nexport interface GrBreadcrumbsProps {\n /** Путь от корня к текущей странице. Последний пункт — текущая страница. */\n items: GrBreadcrumbItem[]\n /** Компонент ссылки для всех пунктов: `RouterLink`, `NuxtLink`, `Link` Inertia. */\n as?: GrBreadcrumbsLinkComponent\n /** Разделитель между пунктами. Декоративен: диктору не читается. */\n separator?: string\n size?: GrBreadcrumbsSize\n /**\n * С какого числа пунктов схлопывать середину в «…». `0`/не задано — показывать\n * путь целиком.\n */\n maxItems?: number\n /** Сколько пунктов оставить в начале при схлопывании. */\n itemsBeforeCollapse?: number\n /** Сколько пунктов оставить в конце при схлопывании. */\n itemsAfterCollapse?: number\n /** Имя лендмарка. Не задано — берётся из локали. */\n ariaLabel?: string\n /** Последний пункт остаётся ссылкой (текущая страница кликабельна). */\n linkCurrent?: boolean\n /** i18n-метка кнопки раскрытия схлопнутого пути. */\n expandLabel?: string\n /**\n * Схлопывать по доступной ширине, а не по числу пунктов. Путь становится\n * однострочным, середина уходит под «…» ровно настолько, насколько не влезает.\n *\n * Без пропа поведение прежнее: список переносится на вторую строку, а порог\n * задаёт `maxItems`. Вместе пропы совместимы — `maxItems` остаётся жёстким\n * потолком, ширина ужимает дальше.\n */\n autoCollapse?: boolean\n}\n\nconst props = withDefaults(defineProps<GrBreadcrumbsProps>(), {\n as: undefined,\n separator: undefined,\n size: undefined,\n maxItems: undefined,\n itemsBeforeCollapse: 1,\n itemsAfterCollapse: 1,\n ariaLabel: undefined,\n linkCurrent: false,\n expandLabel: undefined,\n autoCollapse: false,\n})\n\ndefineSlots<{\n /** Содержимое пункта целиком (иконка и подпись). */\n item?: (props: { item: GrBreadcrumbItem, index: number, isCurrent: boolean }) => unknown\n /** Разделитель между пунктами. */\n separator?: () => unknown\n /** Кнопка раскрытия схлопнутой середины. */\n ellipsis?: (props: { hiddenCount: number, expand: () => void }) => unknown\n}>()\n\nconst { t } = useGranularityTranslations()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrBreadcrumbs' })\nconst resolvedSeparator = useGrComponentProp('GrBreadcrumbs', 'separator', () => props.separator, '/')\n\nconst resolvedAriaLabel = computed(() => props.ariaLabel ?? t('gr.breadcrumbs.label', 'Breadcrumb'))\nconst resolvedExpandLabel = computed(() => props.expandLabel ?? t('gr.breadcrumbs.expand', 'Show hidden path'))\n\nconst rootEl = ref<HTMLElement | null>(null)\nconst listEl = ref<HTMLElement | null>(null)\nconst expanded = ref(false)\n\n/**\n * Схлопывание по ширине: сколько пунктов хвоста влезает.\n *\n * `undefined` — ещё не мерили, показываем путь целиком. Первый кадр в режиме\n * `autoCollapse` намеренно полный: ширины снимаются с него, а посчитать их до\n * рендера неоткуда.\n */\nconst fitAfter = ref<number | undefined>(undefined)\n\n/** Ширины не зависят от контейнера, поэтому живут до смены самого пути. */\nlet measured: { items: number[], separator: number } | null = null\n/**\n * Ширина кнопки «…» узнаётся только когда она отрисована, то есть уже после\n * первого схлопывания. До этого считаем её нулевой: поправка может лишь\n * ужать хвост ещё на пункт, а не вернуть спрятанное, поэтому качелей не будет.\n */\nlet ellipsisWidth = 0\n/** Ширина, на которой считали в прошлый раз: по её смене раскрытый путь сворачивается. */\nlet lastAvailable = 0\n\n// Новый путь — новая страница: раскрытая середина прошлого пути к ней отношения\n// не имеет, а измеренные ширины относятся к прошлым подписям.\nwatch(() => props.items, () => {\n expanded.value = false\n measured = null\n ellipsisWidth = 0\n fitAfter.value = undefined\n void nextTick(measure)\n})\n\nconst lastIndex = computed(() => props.items.length - 1)\n\n/**\n * Схлопывание по ширине выражается через тот же `maxItems`: раскладку считает\n * одна функция, а режимы отличаются только тем, откуда взялось число.\n */\nconst autoMaxItems = computed(() => {\n if (!props.autoCollapse || fitAfter.value === undefined) return undefined\n if (fitAfter.value >= props.items.length) return undefined\n\n return props.items.length - 1\n})\n\nconst effectiveMaxItems = computed(() => {\n const limits = [props.maxItems, autoMaxItems.value].filter((value): value is number => typeof value === 'number' && value > 0)\n\n return limits.length > 0 ? Math.min(...limits) : undefined\n})\n\nconst effectiveAfter = computed(() => (\n props.autoCollapse && fitAfter.value !== undefined ? fitAfter.value : props.itemsAfterCollapse\n))\n\nconst entries = computed(() => resolveBreadcrumbsLayout({\n items: props.items,\n maxItems: effectiveMaxItems.value,\n itemsBeforeCollapse: props.itemsBeforeCollapse,\n itemsAfterCollapse: effectiveAfter.value,\n expanded: expanded.value,\n}))\n\nfunction isCurrent(index: number): boolean {\n return index === lastIndex.value\n}\n\n/** Ссылкой пункт становится, только если ведёт куда-то и не выключен. */\nfunction isLink(item: GrBreadcrumbItem, index: number): boolean {\n if (item.disabled) return false\n if (isCurrent(index) && !props.linkCurrent) return false\n return item.href !== undefined || item.to !== undefined || props.as !== undefined\n}\n\nfunction widthOf(el: Element | null | undefined): number {\n // `scrollWidth`, а не прямоугольник: у подписи стоит `truncate`, и в узком\n // контейнере прямоугольник вернул бы уже ужатую ширину, а не собственную.\n return el ? (el as HTMLElement).scrollWidth : 0\n}\n\n/**\n * Снять ширины с полного пути и пересчитать, сколько пунктов хвоста влезает.\n *\n * Замер делается один раз на путь: подписи от ширины контейнера не зависят,\n * поэтому `resize` пересчитывает только арифметику.\n */\nfunction measure(): void {\n if (!props.autoCollapse) return\n\n const list = listEl.value\n if (!list) return\n\n const ellipsis = list.querySelector('[data-gr-breadcrumbs-ellipsis-item]')\n if (ellipsis) ellipsisWidth = widthOf(ellipsis)\n\n if (!measured) {\n // Ширины снимаем только с полного пути: спрятанных пунктов в DOM нет.\n if (fitAfter.value !== undefined) return\n\n const wraps = [...list.querySelectorAll('[data-gr-breadcrumbs-item-wrap]')]\n if (wraps.length !== props.items.length) return\n\n measured = {\n items: wraps.map(widthOf),\n separator: widthOf(list.querySelector('[data-gr-breadcrumbs-separator]')),\n }\n }\n\n const available = list.clientWidth\n // jsdom и скрытый контейнер отдают 0 — решать по такой ширине нечего.\n if (available <= 0) return\n\n lastAvailable = available\n\n fitAfter.value = resolveBreadcrumbsFit({\n itemWidths: measured.items,\n separatorWidth: measured.separator,\n ellipsisWidth,\n available,\n itemsBeforeCollapse: props.itemsBeforeCollapse,\n gapWidth: listGap(list),\n })\n}\n\n/** Зазор списка в пикселях: он задан классом, а не пропом, поэтому спрашиваем стиль. */\nfunction listGap(list: HTMLElement): number {\n if (typeof getComputedStyle !== 'function') return 0\n\n return Number.parseFloat(getComputedStyle(list).columnGap) || 0\n}\n\n/**\n * Ширина кнопки «…» известна только после того, как она отрисована, то есть\n * после первого схлопывания. Поэтому решение пересчитывается ещё раз: поправка\n * либо ничего не меняет, либо ужимает хвост на пункт. Цикла нет — второй проход\n * оставляет `fitAfter` прежним, и наблюдатель больше не срабатывает.\n */\nwatch(fitAfter, () => void nextTick(measure))\n\nlet observer: ResizeObserver | null = null\n\nwatch(() => props.autoCollapse, (enabled) => {\n if (enabled) {\n void nextTick(measure)\n return\n }\n\n measured = null\n ellipsisWidth = 0\n fitAfter.value = undefined\n})\n\nonMounted(() => {\n void nextTick(measure)\n\n // На сервере и в jsdom `ResizeObserver` отсутствует — измерять там нечего.\n if (typeof ResizeObserver === 'undefined') return\n\n observer = new ResizeObserver(() => {\n // Смена ширины — новая раскладка, и раскрытая руками середина относилась к\n // прежней. Свернуть её иначе нечем: в раскрытом пути кнопки «…» нет, то есть\n // поворот телефона оставлял бы путь развёрнутым навсегда. Высота меняется от\n // самого раскрытия (путь переносится на вторую строку) — на неё не реагируем.\n if (expanded.value && listEl.value && listEl.value.clientWidth !== lastAvailable)\n expanded.value = false\n\n measure()\n })\n if (listEl.value) observer.observe(listEl.value)\n})\n\nonBeforeUnmount(() => observer?.disconnect())\n\nasync function expand(): Promise<void> {\n expanded.value = true\n\n // Кнопка исчезает вместе со схлопыванием, и фокус ушёл бы на `<body>`.\n // Переводим его на первый раскрытый пункт — там, где кнопка и стояла. Пункты\n // без ссылки держат `tabindex=\"-1\"` именно ради этого случая.\n await nextTick()\n const before = Math.max(0, Math.min(props.itemsBeforeCollapse, props.items.length))\n const revealed = rootEl.value?.querySelectorAll<HTMLElement>('[data-gr-breadcrumbs-item]')\n revealed?.[before]?.focus()\n}\n</script>\n\n<template>\n <nav\n ref=\"rootEl\"\n data-gr-breadcrumbs\n :class=\"[breadcrumbsRootClass, breadcrumbsSizeClassBySize[resolvedSize]]\"\n :aria-label=\"resolvedAriaLabel\"\n >\n <ol\n ref=\"listEl\"\n data-gr-breadcrumbs-list\n :class=\"[breadcrumbsListClass, autoCollapse && !expanded ? breadcrumbsListNowrapClass : breadcrumbsListWrapClass]\"\n >\n <template v-for=\"(entry, position) in entries\" :key=\"entry.kind === 'item' ? `item-${entry.index}` : 'ellipsis'\">\n <!--\n Разделитель — отдельный элемент списка и помечен `aria-hidden`:\n структуру пути диктору сообщает сам список, а «/» он бы читал вслух.\n -->\n <li\n v-if=\"position > 0\"\n data-gr-breadcrumbs-separator\n :class=\"breadcrumbsSeparatorClass\"\n aria-hidden=\"true\"\n >\n <slot name=\"separator\">\n {{ resolvedSeparator }}\n </slot>\n </li>\n\n <li v-if=\"entry.kind === 'ellipsis'\" data-gr-breadcrumbs-ellipsis-item class=\"min-w-0\">\n <slot name=\"ellipsis\" :hidden-count=\"entry.hiddenCount\" :expand=\"expand\">\n <button\n type=\"button\"\n data-gr-breadcrumbs-ellipsis\n data-testid=\"gr-breadcrumbs-ellipsis\"\n :class=\"breadcrumbsEllipsisClass\"\n :aria-label=\"resolvedExpandLabel\"\n @click=\"expand\"\n >\n …\n </button>\n </slot>\n </li>\n\n <li v-else data-gr-breadcrumbs-item-wrap class=\"min-w-0\">\n <GrLink\n v-if=\"isLink(entry.item, entry.index)\"\n :key=\"`link-${entry.index}`\"\n data-gr-breadcrumbs-item\n :as=\"as\"\n :href=\"entry.item.href\"\n :to=\"entry.item.to\"\n :size=\"resolvedSize\"\n :variant=\"isCurrent(entry.index) ? 'default' : 'muted'\"\n :aria-label=\"entry.item.ariaLabel\"\n :aria-current=\"isCurrent(entry.index) ? 'page' : undefined\"\n >\n <slot name=\"item\" :item=\"entry.item\" :index=\"entry.index\" :is-current=\"isCurrent(entry.index)\">\n <component\n :is=\"iconTag(entry.item.icon)\"\n v-if=\"entry.item.icon\"\n :class=\"[breadcrumbsItemIconClass, iconClass(entry.item.icon)]\"\n aria-hidden=\"true\"\n />\n <span :class=\"breadcrumbsLabelClass\">{{ entry.item.label }}</span>\n </slot>\n </GrLink>\n\n <!--\n Текущая страница и выключенный пункт — не ссылки. `aria-current`\n остаётся на текущем: именно он отвечает на вопрос «где я».\n -->\n <span\n v-else\n data-gr-breadcrumbs-item\n :class=\"breadcrumbsCurrentClass\"\n :aria-label=\"entry.item.ariaLabel\"\n :aria-current=\"isCurrent(entry.index) ? 'page' : undefined\"\n :aria-disabled=\"entry.item.disabled ? 'true' : undefined\"\n tabindex=\"-1\"\n >\n <slot name=\"item\" :item=\"entry.item\" :index=\"entry.index\" :is-current=\"isCurrent(entry.index)\">\n <component\n :is=\"iconTag(entry.item.icon)\"\n v-if=\"entry.item.icon\"\n :class=\"[breadcrumbsItemIconClass, iconClass(entry.item.icon)]\"\n aria-hidden=\"true\"\n />\n <span :class=\"breadcrumbsLabelClass\">{{ entry.item.label }}</span>\n </slot>\n </span>\n </li>\n </template>\n </ol>\n </nav>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nimport GrLink from '../GrLink/GrLink.vue'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { iconClass, iconTag } from '../shared/icon'\n\nimport {\n breadcrumbsCurrentClass,\n breadcrumbsEllipsisClass,\n breadcrumbsItemIconClass,\n breadcrumbsLabelClass,\n breadcrumbsListClass,\n breadcrumbsListNowrapClass,\n breadcrumbsListWrapClass,\n breadcrumbsRootClass,\n breadcrumbsSeparatorClass,\n breadcrumbsSizeClassBySize,\n type GrBreadcrumbItem,\n type GrBreadcrumbsLinkComponent,\n type GrBreadcrumbsSize,\n resolveBreadcrumbsFit,\n resolveBreadcrumbsLayout,\n} from './grBreadcrumbsStyles'\n\nexport type { GrBreadcrumbItem, GrBreadcrumbsSize } from './grBreadcrumbsStyles'\n\n/**\n * Путь до текущей страницы (WAI-ARIA breadcrumb): `<nav>` с именем, внутри\n * упорядоченный список ссылок, последний пункт — текущая страница.\n *\n * Ссылки рисует `GrLink`, поэтому роутер подключается тем же способом, что и\n * везде в пакете: `as` + `to`.\n */\nexport interface GrBreadcrumbsProps {\n /** Путь от корня к текущей странице. Последний пункт — текущая страница. */\n items: GrBreadcrumbItem[]\n /** Компонент ссылки для всех пунктов: `RouterLink`, `NuxtLink`, `Link` Inertia. */\n as?: GrBreadcrumbsLinkComponent\n /** Разделитель между пунктами. Декоративен: диктору не читается. */\n separator?: string\n size?: GrBreadcrumbsSize\n /**\n * С какого числа пунктов схлопывать середину в «…». `0`/не задано — показывать\n * путь целиком.\n */\n maxItems?: number\n /** Сколько пунктов оставить в начале при схлопывании. */\n itemsBeforeCollapse?: number\n /** Сколько пунктов оставить в конце при схлопывании. */\n itemsAfterCollapse?: number\n /** Имя лендмарка. Не задано — берётся из локали. */\n ariaLabel?: string\n /** Последний пункт остаётся ссылкой (текущая страница кликабельна). */\n linkCurrent?: boolean\n /** i18n-метка кнопки раскрытия схлопнутого пути. */\n expandLabel?: string\n /**\n * Схлопывать по доступной ширине, а не по числу пунктов. Путь становится\n * однострочным, середина уходит под «…» ровно настолько, насколько не влезает.\n *\n * Без пропа поведение прежнее: список переносится на вторую строку, а порог\n * задаёт `maxItems`. Вместе пропы совместимы — `maxItems` остаётся жёстким\n * потолком, ширина ужимает дальше.\n */\n autoCollapse?: boolean\n}\n\nconst props = withDefaults(defineProps<GrBreadcrumbsProps>(), {\n as: undefined,\n separator: undefined,\n size: undefined,\n maxItems: undefined,\n itemsBeforeCollapse: 1,\n itemsAfterCollapse: 1,\n ariaLabel: undefined,\n linkCurrent: false,\n expandLabel: undefined,\n autoCollapse: false,\n})\n\ndefineSlots<{\n /** Содержимое пункта целиком (иконка и подпись). */\n item?: (props: { item: GrBreadcrumbItem, index: number, isCurrent: boolean }) => unknown\n /** Разделитель между пунктами. */\n separator?: () => unknown\n /** Кнопка раскрытия схлопнутой середины. */\n ellipsis?: (props: { hiddenCount: number, expand: () => void }) => unknown\n}>()\n\nconst { t } = useGranularityTranslations()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrBreadcrumbs' })\nconst resolvedSeparator = useGrComponentProp('GrBreadcrumbs', 'separator', () => props.separator, '/')\n\nconst resolvedAriaLabel = computed(() => props.ariaLabel ?? t('gr.breadcrumbs.label', 'Breadcrumb'))\nconst resolvedExpandLabel = computed(() => props.expandLabel ?? t('gr.breadcrumbs.expand', 'Show hidden path'))\n\nconst rootEl = ref<HTMLElement | null>(null)\nconst listEl = ref<HTMLElement | null>(null)\nconst expanded = ref(false)\n\n/**\n * Схлопывание по ширине: сколько пунктов хвоста влезает.\n *\n * `undefined` — ещё не мерили, показываем путь целиком. Первый кадр в режиме\n * `autoCollapse` намеренно полный: ширины снимаются с него, а посчитать их до\n * рендера неоткуда.\n */\nconst fitAfter = ref<number | undefined>(undefined)\n\n/** Ширины не зависят от контейнера, поэтому живут до смены самого пути. */\nlet measured: { items: number[], separator: number } | null = null\n/**\n * Ширина кнопки «…» узнаётся только когда она отрисована, то есть уже после\n * первого схлопывания. До этого считаем её нулевой: поправка может лишь\n * ужать хвост ещё на пункт, а не вернуть спрятанное, поэтому качелей не будет.\n */\nlet ellipsisWidth = 0\n/** Ширина, на которой считали в прошлый раз: по её смене раскрытый путь сворачивается. */\nlet lastAvailable = 0\n\n// Новый путь — новая страница: раскрытая середина прошлого пути к ней отношения\n// не имеет, а измеренные ширины относятся к прошлым подписям.\nwatch(() => props.items, () => {\n expanded.value = false\n measured = null\n ellipsisWidth = 0\n fitAfter.value = undefined\n void nextTick(measure)\n})\n\nconst lastIndex = computed(() => props.items.length - 1)\n\n/**\n * Схлопывание по ширине выражается через тот же `maxItems`: раскладку считает\n * одна функция, а режимы отличаются только тем, откуда взялось число.\n */\nconst autoMaxItems = computed(() => {\n if (!props.autoCollapse || fitAfter.value === undefined) return undefined\n if (fitAfter.value >= props.items.length) return undefined\n\n return props.items.length - 1\n})\n\nconst effectiveMaxItems = computed(() => {\n const limits = [props.maxItems, autoMaxItems.value].filter((value): value is number => typeof value === 'number' && value > 0)\n\n return limits.length > 0 ? Math.min(...limits) : undefined\n})\n\nconst effectiveAfter = computed(() => (\n props.autoCollapse && fitAfter.value !== undefined ? fitAfter.value : props.itemsAfterCollapse\n))\n\nconst entries = computed(() => resolveBreadcrumbsLayout({\n items: props.items,\n maxItems: effectiveMaxItems.value,\n itemsBeforeCollapse: props.itemsBeforeCollapse,\n itemsAfterCollapse: effectiveAfter.value,\n expanded: expanded.value,\n}))\n\nfunction isCurrent(index: number): boolean {\n return index === lastIndex.value\n}\n\n/** Ссылкой пункт становится, только если ведёт куда-то и не выключен. */\nfunction isLink(item: GrBreadcrumbItem, index: number): boolean {\n if (item.disabled) return false\n if (isCurrent(index) && !props.linkCurrent) return false\n return item.href !== undefined || item.to !== undefined || props.as !== undefined\n}\n\nfunction widthOf(el: Element | null | undefined): number {\n // `scrollWidth`, а не прямоугольник: у подписи стоит `truncate`, и в узком\n // контейнере прямоугольник вернул бы уже ужатую ширину, а не собственную.\n return el ? (el as HTMLElement).scrollWidth : 0\n}\n\n/**\n * Снять ширины с полного пути и пересчитать, сколько пунктов хвоста влезает.\n *\n * Замер делается один раз на путь: подписи от ширины контейнера не зависят,\n * поэтому `resize` пересчитывает только арифметику.\n */\nfunction measure(): void {\n if (!props.autoCollapse) return\n\n const list = listEl.value\n if (!list) return\n\n const ellipsis = list.querySelector('[data-gr-breadcrumbs-ellipsis-item]')\n if (ellipsis) ellipsisWidth = widthOf(ellipsis)\n\n if (!measured) {\n // Ширины снимаем только с полного пути: спрятанных пунктов в DOM нет.\n if (fitAfter.value !== undefined) return\n\n const wraps = [...list.querySelectorAll('[data-gr-breadcrumbs-item-wrap]')]\n if (wraps.length !== props.items.length) return\n\n measured = {\n items: wraps.map(widthOf),\n separator: widthOf(list.querySelector('[data-gr-breadcrumbs-separator]')),\n }\n }\n\n const available = list.clientWidth\n // jsdom и скрытый контейнер отдают 0 — решать по такой ширине нечего.\n if (available <= 0) return\n\n lastAvailable = available\n\n fitAfter.value = resolveBreadcrumbsFit({\n itemWidths: measured.items,\n separatorWidth: measured.separator,\n ellipsisWidth,\n available,\n itemsBeforeCollapse: props.itemsBeforeCollapse,\n gapWidth: listGap(list),\n })\n}\n\n/** Зазор списка в пикселях: он задан классом, а не пропом, поэтому спрашиваем стиль. */\nfunction listGap(list: HTMLElement): number {\n if (typeof getComputedStyle !== 'function') return 0\n\n return Number.parseFloat(getComputedStyle(list).columnGap) || 0\n}\n\n/**\n * Ширина кнопки «…» известна только после того, как она отрисована, то есть\n * после первого схлопывания. Поэтому решение пересчитывается ещё раз: поправка\n * либо ничего не меняет, либо ужимает хвост на пункт. Цикла нет — второй проход\n * оставляет `fitAfter` прежним, и наблюдатель больше не срабатывает.\n */\nwatch(fitAfter, () => void nextTick(measure))\n\nlet observer: ResizeObserver | null = null\n\nwatch(() => props.autoCollapse, (enabled) => {\n if (enabled) {\n void nextTick(measure)\n return\n }\n\n measured = null\n ellipsisWidth = 0\n fitAfter.value = undefined\n})\n\nonMounted(() => {\n void nextTick(measure)\n\n // На сервере и в jsdom `ResizeObserver` отсутствует — измерять там нечего.\n if (typeof ResizeObserver === 'undefined') return\n\n observer = new ResizeObserver(() => {\n // Смена ширины — новая раскладка, и раскрытая руками середина относилась к\n // прежней. Свернуть её иначе нечем: в раскрытом пути кнопки «…» нет, то есть\n // поворот телефона оставлял бы путь развёрнутым навсегда. Высота меняется от\n // самого раскрытия (путь переносится на вторую строку) — на неё не реагируем.\n if (expanded.value && listEl.value && listEl.value.clientWidth !== lastAvailable)\n expanded.value = false\n\n measure()\n })\n if (listEl.value) observer.observe(listEl.value)\n})\n\nonBeforeUnmount(() => observer?.disconnect())\n\nasync function expand(): Promise<void> {\n expanded.value = true\n\n // Кнопка исчезает вместе со схлопыванием, и фокус ушёл бы на `<body>`.\n // Переводим его на первый раскрытый пункт — там, где кнопка и стояла. Пункты\n // без ссылки держат `tabindex=\"-1\"` именно ради этого случая.\n await nextTick()\n const before = Math.max(0, Math.min(props.itemsBeforeCollapse, props.items.length))\n const revealed = rootEl.value?.querySelectorAll<HTMLElement>('[data-gr-breadcrumbs-item]')\n revealed?.[before]?.focus()\n}\n</script>\n\n<template>\n <nav\n ref=\"rootEl\"\n data-gr-breadcrumbs\n :class=\"[breadcrumbsRootClass, breadcrumbsSizeClassBySize[resolvedSize]]\"\n :aria-label=\"resolvedAriaLabel\"\n >\n <ol\n ref=\"listEl\"\n data-gr-breadcrumbs-list\n :class=\"[breadcrumbsListClass, autoCollapse && !expanded ? breadcrumbsListNowrapClass : breadcrumbsListWrapClass]\"\n >\n <template v-for=\"(entry, position) in entries\" :key=\"entry.kind === 'item' ? `item-${entry.index}` : 'ellipsis'\">\n <!--\n Разделитель — отдельный элемент списка и помечен `aria-hidden`:\n структуру пути диктору сообщает сам список, а «/» он бы читал вслух.\n -->\n <li\n v-if=\"position > 0\"\n data-gr-breadcrumbs-separator\n :class=\"breadcrumbsSeparatorClass\"\n aria-hidden=\"true\"\n >\n <slot name=\"separator\">\n {{ resolvedSeparator }}\n </slot>\n </li>\n\n <li v-if=\"entry.kind === 'ellipsis'\" data-gr-breadcrumbs-ellipsis-item class=\"min-w-0\">\n <slot name=\"ellipsis\" :hidden-count=\"entry.hiddenCount\" :expand=\"expand\">\n <button\n type=\"button\"\n data-gr-breadcrumbs-ellipsis\n data-testid=\"gr-breadcrumbs-ellipsis\"\n :class=\"breadcrumbsEllipsisClass\"\n :aria-label=\"resolvedExpandLabel\"\n @click=\"expand\"\n >\n …\n </button>\n </slot>\n </li>\n\n <li v-else data-gr-breadcrumbs-item-wrap class=\"min-w-0\">\n <GrLink\n v-if=\"isLink(entry.item, entry.index)\"\n :key=\"`link-${entry.index}`\"\n data-gr-breadcrumbs-item\n :as=\"as\"\n :href=\"entry.item.href\"\n :to=\"entry.item.to\"\n :size=\"resolvedSize\"\n :variant=\"isCurrent(entry.index) ? 'default' : 'muted'\"\n :aria-label=\"entry.item.ariaLabel\"\n :aria-current=\"isCurrent(entry.index) ? 'page' : undefined\"\n >\n <slot name=\"item\" :item=\"entry.item\" :index=\"entry.index\" :is-current=\"isCurrent(entry.index)\">\n <component\n :is=\"iconTag(entry.item.icon)\"\n v-if=\"entry.item.icon\"\n :class=\"[breadcrumbsItemIconClass, iconClass(entry.item.icon)]\"\n aria-hidden=\"true\"\n />\n <span :class=\"breadcrumbsLabelClass\">{{ entry.item.label }}</span>\n </slot>\n </GrLink>\n\n <!--\n Текущая страница и выключенный пункт — не ссылки. `aria-current`\n остаётся на текущем: именно он отвечает на вопрос «где я».\n -->\n <span\n v-else\n data-gr-breadcrumbs-item\n :class=\"breadcrumbsCurrentClass\"\n :aria-label=\"entry.item.ariaLabel\"\n :aria-current=\"isCurrent(entry.index) ? 'page' : undefined\"\n :aria-disabled=\"entry.item.disabled ? 'true' : undefined\"\n tabindex=\"-1\"\n >\n <slot name=\"item\" :item=\"entry.item\" :index=\"entry.index\" :is-current=\"isCurrent(entry.index)\">\n <component\n :is=\"iconTag(entry.item.icon)\"\n v-if=\"entry.item.icon\"\n :class=\"[breadcrumbsItemIconClass, iconClass(entry.item.icon)]\"\n aria-hidden=\"true\"\n />\n <span :class=\"breadcrumbsLabelClass\">{{ entry.item.label }}</span>\n </slot>\n </span>\n </li>\n </template>\n </ol>\n </nav>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GrBreadcrumbs-CQ44iU2o.js","names":[],"sources":["../../../../src/components/GrBreadcrumbs/GrBreadcrumbs.vue","../../../../src/components/GrBreadcrumbs/GrBreadcrumbs.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nimport GrLink from '../GrLink/GrLink.vue'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { iconClass, iconTag } from '../shared/icon'\n\nimport {\n breadcrumbsCurrentClass,\n breadcrumbsEllipsisClass,\n breadcrumbsItemIconClass,\n breadcrumbsLabelClass,\n breadcrumbsListClass,\n breadcrumbsListNowrapClass,\n breadcrumbsListWrapClass,\n breadcrumbsRootClass,\n breadcrumbsSeparatorClass,\n breadcrumbsSizeClassBySize,\n type GrBreadcrumbItem,\n type GrBreadcrumbsLinkComponent,\n type GrBreadcrumbsSize,\n resolveBreadcrumbsFit,\n resolveBreadcrumbsLayout,\n} from './grBreadcrumbsStyles'\n\nexport type { GrBreadcrumbItem, GrBreadcrumbsSize } from './grBreadcrumbsStyles'\n\n/**\n * Путь до текущей страницы (WAI-ARIA breadcrumb): `<nav>` с именем, внутри\n * упорядоченный список ссылок, последний пункт — текущая страница.\n *\n * Ссылки рисует `GrLink`, поэтому роутер подключается тем же способом, что и\n * везде в пакете: `as` + `to`.\n */\nexport interface GrBreadcrumbsProps {\n /** Путь от корня к текущей странице. Последний пункт — текущая страница. */\n items: GrBreadcrumbItem[]\n /** Компонент ссылки для всех пунктов: `RouterLink`, `NuxtLink`, `Link` Inertia. */\n as?: GrBreadcrumbsLinkComponent\n /** Разделитель между пунктами. Декоративен: диктору не читается. */\n separator?: string\n size?: GrBreadcrumbsSize\n /**\n * С какого числа пунктов схлопывать середину в «…». `0`/не задано — показывать\n * путь целиком.\n */\n maxItems?: number\n /** Сколько пунктов оставить в начале при схлопывании. */\n itemsBeforeCollapse?: number\n /** Сколько пунктов оставить в конце при схлопывании. */\n itemsAfterCollapse?: number\n /** Имя лендмарка. Не задано — берётся из локали. */\n ariaLabel?: string\n /** Последний пункт остаётся ссылкой (текущая страница кликабельна). */\n linkCurrent?: boolean\n /** i18n-метка кнопки раскрытия схлопнутого пути. */\n expandLabel?: string\n /**\n * Схлопывать по доступной ширине, а не по числу пунктов. Путь становится\n * однострочным, середина уходит под «…» ровно настолько, насколько не влезает.\n *\n * Без пропа поведение прежнее: список переносится на вторую строку, а порог\n * задаёт `maxItems`. Вместе пропы совместимы — `maxItems` остаётся жёстким\n * потолком, ширина ужимает дальше.\n */\n autoCollapse?: boolean\n}\n\nconst props = withDefaults(defineProps<GrBreadcrumbsProps>(), {\n as: undefined,\n separator: undefined,\n size: undefined,\n maxItems: undefined,\n itemsBeforeCollapse: 1,\n itemsAfterCollapse: 1,\n ariaLabel: undefined,\n linkCurrent: false,\n expandLabel: undefined,\n autoCollapse: false,\n})\n\ndefineSlots<{\n /** Содержимое пункта целиком (иконка и подпись). */\n item?: (props: { item: GrBreadcrumbItem, index: number, isCurrent: boolean }) => unknown\n /** Разделитель между пунктами. */\n separator?: () => unknown\n /** Кнопка раскрытия схлопнутой середины. */\n ellipsis?: (props: { hiddenCount: number, expand: () => void }) => unknown\n}>()\n\nconst { t } = useGranularityTranslations()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrBreadcrumbs' })\nconst resolvedSeparator = useGrComponentProp('GrBreadcrumbs', 'separator', () => props.separator, '/')\n\nconst resolvedAriaLabel = computed(() => props.ariaLabel ?? t('gr.breadcrumbs.label', 'Breadcrumb'))\nconst resolvedExpandLabel = computed(() => props.expandLabel ?? t('gr.breadcrumbs.expand', 'Show hidden path'))\n\nconst rootEl = ref<HTMLElement | null>(null)\nconst listEl = ref<HTMLElement | null>(null)\nconst expanded = ref(false)\n\n/**\n * Схлопывание по ширине: сколько пунктов хвоста влезает.\n *\n * `undefined` — ещё не мерили, показываем путь целиком. Первый кадр в режиме\n * `autoCollapse` намеренно полный: ширины снимаются с него, а посчитать их до\n * рендера неоткуда.\n */\nconst fitAfter = ref<number | undefined>(undefined)\n\n/** Ширины не зависят от контейнера, поэтому живут до смены самого пути. */\nlet measured: { items: number[], separator: number } | null = null\n/**\n * Ширина кнопки «…» узнаётся только когда она отрисована, то есть уже после\n * первого схлопывания. До этого считаем её нулевой: поправка может лишь\n * ужать хвост ещё на пункт, а не вернуть спрятанное, поэтому качелей не будет.\n */\nlet ellipsisWidth = 0\n/** Ширина, на которой считали в прошлый раз: по её смене раскрытый путь сворачивается. */\nlet lastAvailable = 0\n\n// Новый путь — новая страница: раскрытая середина прошлого пути к ней отношения\n// не имеет, а измеренные ширины относятся к прошлым подписям.\nwatch(() => props.items, () => {\n expanded.value = false\n measured = null\n ellipsisWidth = 0\n fitAfter.value = undefined\n void nextTick(measure)\n})\n\nconst lastIndex = computed(() => props.items.length - 1)\n\n/**\n * Схлопывание по ширине выражается через тот же `maxItems`: раскладку считает\n * одна функция, а режимы отличаются только тем, откуда взялось число.\n */\nconst autoMaxItems = computed(() => {\n if (!props.autoCollapse || fitAfter.value === undefined) return undefined\n if (fitAfter.value >= props.items.length) return undefined\n\n return props.items.length - 1\n})\n\nconst effectiveMaxItems = computed(() => {\n const limits = [props.maxItems, autoMaxItems.value].filter((value): value is number => typeof value === 'number' && value > 0)\n\n return limits.length > 0 ? Math.min(...limits) : undefined\n})\n\nconst effectiveAfter = computed(() => (\n props.autoCollapse && fitAfter.value !== undefined ? fitAfter.value : props.itemsAfterCollapse\n))\n\nconst entries = computed(() => resolveBreadcrumbsLayout({\n items: props.items,\n maxItems: effectiveMaxItems.value,\n itemsBeforeCollapse: props.itemsBeforeCollapse,\n itemsAfterCollapse: effectiveAfter.value,\n expanded: expanded.value,\n}))\n\nfunction isCurrent(index: number): boolean {\n return index === lastIndex.value\n}\n\n/** Ссылкой пункт становится, только если ведёт куда-то и не выключен. */\nfunction isLink(item: GrBreadcrumbItem, index: number): boolean {\n if (item.disabled) return false\n if (isCurrent(index) && !props.linkCurrent) return false\n return item.href !== undefined || item.to !== undefined || props.as !== undefined\n}\n\nfunction widthOf(el: Element | null | undefined): number {\n // `scrollWidth`, а не прямоугольник: у подписи стоит `truncate`, и в узком\n // контейнере прямоугольник вернул бы уже ужатую ширину, а не собственную.\n return el ? (el as HTMLElement).scrollWidth : 0\n}\n\n/**\n * Снять ширины с полного пути и пересчитать, сколько пунктов хвоста влезает.\n *\n * Замер делается один раз на путь: подписи от ширины контейнера не зависят,\n * поэтому `resize` пересчитывает только арифметику.\n */\nfunction measure(): void {\n if (!props.autoCollapse) return\n\n const list = listEl.value\n if (!list) return\n\n const ellipsis = list.querySelector('[data-gr-breadcrumbs-ellipsis-item]')\n if (ellipsis) ellipsisWidth = widthOf(ellipsis)\n\n if (!measured) {\n // Ширины снимаем только с полного пути: спрятанных пунктов в DOM нет.\n if (fitAfter.value !== undefined) return\n\n const wraps = [...list.querySelectorAll('[data-gr-breadcrumbs-item-wrap]')]\n if (wraps.length !== props.items.length) return\n\n measured = {\n items: wraps.map(widthOf),\n separator: widthOf(list.querySelector('[data-gr-breadcrumbs-separator]')),\n }\n }\n\n const available = list.clientWidth\n // jsdom и скрытый контейнер отдают 0 — решать по такой ширине нечего.\n if (available <= 0) return\n\n lastAvailable = available\n\n fitAfter.value = resolveBreadcrumbsFit({\n itemWidths: measured.items,\n separatorWidth: measured.separator,\n ellipsisWidth,\n available,\n itemsBeforeCollapse: props.itemsBeforeCollapse,\n gapWidth: listGap(list),\n })\n}\n\n/** Зазор списка в пикселях: он задан классом, а не пропом, поэтому спрашиваем стиль. */\nfunction listGap(list: HTMLElement): number {\n if (typeof getComputedStyle !== 'function') return 0\n\n return Number.parseFloat(getComputedStyle(list).columnGap) || 0\n}\n\n/**\n * Ширина кнопки «…» известна только после того, как она отрисована, то есть\n * после первого схлопывания. Поэтому решение пересчитывается ещё раз: поправка\n * либо ничего не меняет, либо ужимает хвост на пункт. Цикла нет — второй проход\n * оставляет `fitAfter` прежним, и наблюдатель больше не срабатывает.\n */\nwatch(fitAfter, () => void nextTick(measure))\n\nlet observer: ResizeObserver | null = null\n\nwatch(() => props.autoCollapse, (enabled) => {\n if (enabled) {\n void nextTick(measure)\n return\n }\n\n measured = null\n ellipsisWidth = 0\n fitAfter.value = undefined\n})\n\nonMounted(() => {\n void nextTick(measure)\n\n // На сервере и в jsdom `ResizeObserver` отсутствует — измерять там нечего.\n if (typeof ResizeObserver === 'undefined') return\n\n observer = new ResizeObserver(() => {\n // Смена ширины — новая раскладка, и раскрытая руками середина относилась к\n // прежней. Свернуть её иначе нечем: в раскрытом пути кнопки «…» нет, то есть\n // поворот телефона оставлял бы путь развёрнутым навсегда. Высота меняется от\n // самого раскрытия (путь переносится на вторую строку) — на неё не реагируем.\n if (expanded.value && listEl.value && listEl.value.clientWidth !== lastAvailable)\n expanded.value = false\n\n measure()\n })\n if (listEl.value) observer.observe(listEl.value)\n})\n\nonBeforeUnmount(() => observer?.disconnect())\n\nasync function expand(): Promise<void> {\n expanded.value = true\n\n // Кнопка исчезает вместе со схлопыванием, и фокус ушёл бы на `<body>`.\n // Переводим его на первый раскрытый пункт — там, где кнопка и стояла. Пункты\n // без ссылки держат `tabindex=\"-1\"` именно ради этого случая.\n await nextTick()\n const before = Math.max(0, Math.min(props.itemsBeforeCollapse, props.items.length))\n const revealed = rootEl.value?.querySelectorAll<HTMLElement>('[data-gr-breadcrumbs-item]')\n revealed?.[before]?.focus()\n}\n</script>\n\n<template>\n <nav\n ref=\"rootEl\"\n data-gr-breadcrumbs\n :class=\"[breadcrumbsRootClass, breadcrumbsSizeClassBySize[resolvedSize]]\"\n :aria-label=\"resolvedAriaLabel\"\n >\n <ol\n ref=\"listEl\"\n data-gr-breadcrumbs-list\n :class=\"[breadcrumbsListClass, autoCollapse && !expanded ? breadcrumbsListNowrapClass : breadcrumbsListWrapClass]\"\n >\n <template v-for=\"(entry, position) in entries\" :key=\"entry.kind === 'item' ? `item-${entry.index}` : 'ellipsis'\">\n <!--\n Разделитель — отдельный элемент списка и помечен `aria-hidden`:\n структуру пути диктору сообщает сам список, а «/» он бы читал вслух.\n -->\n <li\n v-if=\"position > 0\"\n data-gr-breadcrumbs-separator\n :class=\"breadcrumbsSeparatorClass\"\n aria-hidden=\"true\"\n >\n <slot name=\"separator\">\n {{ resolvedSeparator }}\n </slot>\n </li>\n\n <li v-if=\"entry.kind === 'ellipsis'\" data-gr-breadcrumbs-ellipsis-item class=\"min-w-0\">\n <slot name=\"ellipsis\" :hidden-count=\"entry.hiddenCount\" :expand=\"expand\">\n <button\n type=\"button\"\n data-gr-breadcrumbs-ellipsis\n data-testid=\"gr-breadcrumbs-ellipsis\"\n :class=\"breadcrumbsEllipsisClass\"\n :aria-label=\"resolvedExpandLabel\"\n @click=\"expand\"\n >\n …\n </button>\n </slot>\n </li>\n\n <li v-else data-gr-breadcrumbs-item-wrap class=\"min-w-0\">\n <GrLink\n v-if=\"isLink(entry.item, entry.index)\"\n :key=\"`link-${entry.index}`\"\n data-gr-breadcrumbs-item\n :as=\"as\"\n :href=\"entry.item.href\"\n :to=\"entry.item.to\"\n :size=\"resolvedSize\"\n :variant=\"isCurrent(entry.index) ? 'default' : 'muted'\"\n :aria-label=\"entry.item.ariaLabel\"\n :aria-current=\"isCurrent(entry.index) ? 'page' : undefined\"\n >\n <slot name=\"item\" :item=\"entry.item\" :index=\"entry.index\" :is-current=\"isCurrent(entry.index)\">\n <component\n :is=\"iconTag(entry.item.icon)\"\n v-if=\"entry.item.icon\"\n :class=\"[breadcrumbsItemIconClass, iconClass(entry.item.icon)]\"\n aria-hidden=\"true\"\n />\n <span :class=\"breadcrumbsLabelClass\">{{ entry.item.label }}</span>\n </slot>\n </GrLink>\n\n <!--\n Текущая страница и выключенный пункт — не ссылки. `aria-current`\n остаётся на текущем: именно он отвечает на вопрос «где я».\n -->\n <span\n v-else\n data-gr-breadcrumbs-item\n :class=\"breadcrumbsCurrentClass\"\n :aria-label=\"entry.item.ariaLabel\"\n :aria-current=\"isCurrent(entry.index) ? 'page' : undefined\"\n :aria-disabled=\"entry.item.disabled ? 'true' : undefined\"\n tabindex=\"-1\"\n >\n <slot name=\"item\" :item=\"entry.item\" :index=\"entry.index\" :is-current=\"isCurrent(entry.index)\">\n <component\n :is=\"iconTag(entry.item.icon)\"\n v-if=\"entry.item.icon\"\n :class=\"[breadcrumbsItemIconClass, iconClass(entry.item.icon)]\"\n aria-hidden=\"true\"\n />\n <span :class=\"breadcrumbsLabelClass\">{{ entry.item.label }}</span>\n </slot>\n </span>\n </li>\n </template>\n </ol>\n </nav>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nimport GrLink from '../GrLink/GrLink.vue'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { iconClass, iconTag } from '../shared/icon'\n\nimport {\n breadcrumbsCurrentClass,\n breadcrumbsEllipsisClass,\n breadcrumbsItemIconClass,\n breadcrumbsLabelClass,\n breadcrumbsListClass,\n breadcrumbsListNowrapClass,\n breadcrumbsListWrapClass,\n breadcrumbsRootClass,\n breadcrumbsSeparatorClass,\n breadcrumbsSizeClassBySize,\n type GrBreadcrumbItem,\n type GrBreadcrumbsLinkComponent,\n type GrBreadcrumbsSize,\n resolveBreadcrumbsFit,\n resolveBreadcrumbsLayout,\n} from './grBreadcrumbsStyles'\n\nexport type { GrBreadcrumbItem, GrBreadcrumbsSize } from './grBreadcrumbsStyles'\n\n/**\n * Путь до текущей страницы (WAI-ARIA breadcrumb): `<nav>` с именем, внутри\n * упорядоченный список ссылок, последний пункт — текущая страница.\n *\n * Ссылки рисует `GrLink`, поэтому роутер подключается тем же способом, что и\n * везде в пакете: `as` + `to`.\n */\nexport interface GrBreadcrumbsProps {\n /** Путь от корня к текущей странице. Последний пункт — текущая страница. */\n items: GrBreadcrumbItem[]\n /** Компонент ссылки для всех пунктов: `RouterLink`, `NuxtLink`, `Link` Inertia. */\n as?: GrBreadcrumbsLinkComponent\n /** Разделитель между пунктами. Декоративен: диктору не читается. */\n separator?: string\n size?: GrBreadcrumbsSize\n /**\n * С какого числа пунктов схлопывать середину в «…». `0`/не задано — показывать\n * путь целиком.\n */\n maxItems?: number\n /** Сколько пунктов оставить в начале при схлопывании. */\n itemsBeforeCollapse?: number\n /** Сколько пунктов оставить в конце при схлопывании. */\n itemsAfterCollapse?: number\n /** Имя лендмарка. Не задано — берётся из локали. */\n ariaLabel?: string\n /** Последний пункт остаётся ссылкой (текущая страница кликабельна). */\n linkCurrent?: boolean\n /** i18n-метка кнопки раскрытия схлопнутого пути. */\n expandLabel?: string\n /**\n * Схлопывать по доступной ширине, а не по числу пунктов. Путь становится\n * однострочным, середина уходит под «…» ровно настолько, насколько не влезает.\n *\n * Без пропа поведение прежнее: список переносится на вторую строку, а порог\n * задаёт `maxItems`. Вместе пропы совместимы — `maxItems` остаётся жёстким\n * потолком, ширина ужимает дальше.\n */\n autoCollapse?: boolean\n}\n\nconst props = withDefaults(defineProps<GrBreadcrumbsProps>(), {\n as: undefined,\n separator: undefined,\n size: undefined,\n maxItems: undefined,\n itemsBeforeCollapse: 1,\n itemsAfterCollapse: 1,\n ariaLabel: undefined,\n linkCurrent: false,\n expandLabel: undefined,\n autoCollapse: false,\n})\n\ndefineSlots<{\n /** Содержимое пункта целиком (иконка и подпись). */\n item?: (props: { item: GrBreadcrumbItem, index: number, isCurrent: boolean }) => unknown\n /** Разделитель между пунктами. */\n separator?: () => unknown\n /** Кнопка раскрытия схлопнутой середины. */\n ellipsis?: (props: { hiddenCount: number, expand: () => void }) => unknown\n}>()\n\nconst { t } = useGranularityTranslations()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrBreadcrumbs' })\nconst resolvedSeparator = useGrComponentProp('GrBreadcrumbs', 'separator', () => props.separator, '/')\n\nconst resolvedAriaLabel = computed(() => props.ariaLabel ?? t('gr.breadcrumbs.label', 'Breadcrumb'))\nconst resolvedExpandLabel = computed(() => props.expandLabel ?? t('gr.breadcrumbs.expand', 'Show hidden path'))\n\nconst rootEl = ref<HTMLElement | null>(null)\nconst listEl = ref<HTMLElement | null>(null)\nconst expanded = ref(false)\n\n/**\n * Схлопывание по ширине: сколько пунктов хвоста влезает.\n *\n * `undefined` — ещё не мерили, показываем путь целиком. Первый кадр в режиме\n * `autoCollapse` намеренно полный: ширины снимаются с него, а посчитать их до\n * рендера неоткуда.\n */\nconst fitAfter = ref<number | undefined>(undefined)\n\n/** Ширины не зависят от контейнера, поэтому живут до смены самого пути. */\nlet measured: { items: number[], separator: number } | null = null\n/**\n * Ширина кнопки «…» узнаётся только когда она отрисована, то есть уже после\n * первого схлопывания. До этого считаем её нулевой: поправка может лишь\n * ужать хвост ещё на пункт, а не вернуть спрятанное, поэтому качелей не будет.\n */\nlet ellipsisWidth = 0\n/** Ширина, на которой считали в прошлый раз: по её смене раскрытый путь сворачивается. */\nlet lastAvailable = 0\n\n// Новый путь — новая страница: раскрытая середина прошлого пути к ней отношения\n// не имеет, а измеренные ширины относятся к прошлым подписям.\nwatch(() => props.items, () => {\n expanded.value = false\n measured = null\n ellipsisWidth = 0\n fitAfter.value = undefined\n void nextTick(measure)\n})\n\nconst lastIndex = computed(() => props.items.length - 1)\n\n/**\n * Схлопывание по ширине выражается через тот же `maxItems`: раскладку считает\n * одна функция, а режимы отличаются только тем, откуда взялось число.\n */\nconst autoMaxItems = computed(() => {\n if (!props.autoCollapse || fitAfter.value === undefined) return undefined\n if (fitAfter.value >= props.items.length) return undefined\n\n return props.items.length - 1\n})\n\nconst effectiveMaxItems = computed(() => {\n const limits = [props.maxItems, autoMaxItems.value].filter((value): value is number => typeof value === 'number' && value > 0)\n\n return limits.length > 0 ? Math.min(...limits) : undefined\n})\n\nconst effectiveAfter = computed(() => (\n props.autoCollapse && fitAfter.value !== undefined ? fitAfter.value : props.itemsAfterCollapse\n))\n\nconst entries = computed(() => resolveBreadcrumbsLayout({\n items: props.items,\n maxItems: effectiveMaxItems.value,\n itemsBeforeCollapse: props.itemsBeforeCollapse,\n itemsAfterCollapse: effectiveAfter.value,\n expanded: expanded.value,\n}))\n\nfunction isCurrent(index: number): boolean {\n return index === lastIndex.value\n}\n\n/** Ссылкой пункт становится, только если ведёт куда-то и не выключен. */\nfunction isLink(item: GrBreadcrumbItem, index: number): boolean {\n if (item.disabled) return false\n if (isCurrent(index) && !props.linkCurrent) return false\n return item.href !== undefined || item.to !== undefined || props.as !== undefined\n}\n\nfunction widthOf(el: Element | null | undefined): number {\n // `scrollWidth`, а не прямоугольник: у подписи стоит `truncate`, и в узком\n // контейнере прямоугольник вернул бы уже ужатую ширину, а не собственную.\n return el ? (el as HTMLElement).scrollWidth : 0\n}\n\n/**\n * Снять ширины с полного пути и пересчитать, сколько пунктов хвоста влезает.\n *\n * Замер делается один раз на путь: подписи от ширины контейнера не зависят,\n * поэтому `resize` пересчитывает только арифметику.\n */\nfunction measure(): void {\n if (!props.autoCollapse) return\n\n const list = listEl.value\n if (!list) return\n\n const ellipsis = list.querySelector('[data-gr-breadcrumbs-ellipsis-item]')\n if (ellipsis) ellipsisWidth = widthOf(ellipsis)\n\n if (!measured) {\n // Ширины снимаем только с полного пути: спрятанных пунктов в DOM нет.\n if (fitAfter.value !== undefined) return\n\n const wraps = [...list.querySelectorAll('[data-gr-breadcrumbs-item-wrap]')]\n if (wraps.length !== props.items.length) return\n\n measured = {\n items: wraps.map(widthOf),\n separator: widthOf(list.querySelector('[data-gr-breadcrumbs-separator]')),\n }\n }\n\n const available = list.clientWidth\n // jsdom и скрытый контейнер отдают 0 — решать по такой ширине нечего.\n if (available <= 0) return\n\n lastAvailable = available\n\n fitAfter.value = resolveBreadcrumbsFit({\n itemWidths: measured.items,\n separatorWidth: measured.separator,\n ellipsisWidth,\n available,\n itemsBeforeCollapse: props.itemsBeforeCollapse,\n gapWidth: listGap(list),\n })\n}\n\n/** Зазор списка в пикселях: он задан классом, а не пропом, поэтому спрашиваем стиль. */\nfunction listGap(list: HTMLElement): number {\n if (typeof getComputedStyle !== 'function') return 0\n\n return Number.parseFloat(getComputedStyle(list).columnGap) || 0\n}\n\n/**\n * Ширина кнопки «…» известна только после того, как она отрисована, то есть\n * после первого схлопывания. Поэтому решение пересчитывается ещё раз: поправка\n * либо ничего не меняет, либо ужимает хвост на пункт. Цикла нет — второй проход\n * оставляет `fitAfter` прежним, и наблюдатель больше не срабатывает.\n */\nwatch(fitAfter, () => void nextTick(measure))\n\nlet observer: ResizeObserver | null = null\n\nwatch(() => props.autoCollapse, (enabled) => {\n if (enabled) {\n void nextTick(measure)\n return\n }\n\n measured = null\n ellipsisWidth = 0\n fitAfter.value = undefined\n})\n\nonMounted(() => {\n void nextTick(measure)\n\n // На сервере и в jsdom `ResizeObserver` отсутствует — измерять там нечего.\n if (typeof ResizeObserver === 'undefined') return\n\n observer = new ResizeObserver(() => {\n // Смена ширины — новая раскладка, и раскрытая руками середина относилась к\n // прежней. Свернуть её иначе нечем: в раскрытом пути кнопки «…» нет, то есть\n // поворот телефона оставлял бы путь развёрнутым навсегда. Высота меняется от\n // самого раскрытия (путь переносится на вторую строку) — на неё не реагируем.\n if (expanded.value && listEl.value && listEl.value.clientWidth !== lastAvailable)\n expanded.value = false\n\n measure()\n })\n if (listEl.value) observer.observe(listEl.value)\n})\n\nonBeforeUnmount(() => observer?.disconnect())\n\nasync function expand(): Promise<void> {\n expanded.value = true\n\n // Кнопка исчезает вместе со схлопыванием, и фокус ушёл бы на `<body>`.\n // Переводим его на первый раскрытый пункт — там, где кнопка и стояла. Пункты\n // без ссылки держат `tabindex=\"-1\"` именно ради этого случая.\n await nextTick()\n const before = Math.max(0, Math.min(props.itemsBeforeCollapse, props.items.length))\n const revealed = rootEl.value?.querySelectorAll<HTMLElement>('[data-gr-breadcrumbs-item]')\n revealed?.[before]?.focus()\n}\n</script>\n\n<template>\n <nav\n ref=\"rootEl\"\n data-gr-breadcrumbs\n :class=\"[breadcrumbsRootClass, breadcrumbsSizeClassBySize[resolvedSize]]\"\n :aria-label=\"resolvedAriaLabel\"\n >\n <ol\n ref=\"listEl\"\n data-gr-breadcrumbs-list\n :class=\"[breadcrumbsListClass, autoCollapse && !expanded ? breadcrumbsListNowrapClass : breadcrumbsListWrapClass]\"\n >\n <template v-for=\"(entry, position) in entries\" :key=\"entry.kind === 'item' ? `item-${entry.index}` : 'ellipsis'\">\n <!--\n Разделитель — отдельный элемент списка и помечен `aria-hidden`:\n структуру пути диктору сообщает сам список, а «/» он бы читал вслух.\n -->\n <li\n v-if=\"position > 0\"\n data-gr-breadcrumbs-separator\n :class=\"breadcrumbsSeparatorClass\"\n aria-hidden=\"true\"\n >\n <slot name=\"separator\">\n {{ resolvedSeparator }}\n </slot>\n </li>\n\n <li v-if=\"entry.kind === 'ellipsis'\" data-gr-breadcrumbs-ellipsis-item class=\"min-w-0\">\n <slot name=\"ellipsis\" :hidden-count=\"entry.hiddenCount\" :expand=\"expand\">\n <button\n type=\"button\"\n data-gr-breadcrumbs-ellipsis\n data-testid=\"gr-breadcrumbs-ellipsis\"\n :class=\"breadcrumbsEllipsisClass\"\n :aria-label=\"resolvedExpandLabel\"\n @click=\"expand\"\n >\n …\n </button>\n </slot>\n </li>\n\n <li v-else data-gr-breadcrumbs-item-wrap class=\"min-w-0\">\n <GrLink\n v-if=\"isLink(entry.item, entry.index)\"\n :key=\"`link-${entry.index}`\"\n data-gr-breadcrumbs-item\n :as=\"as\"\n :href=\"entry.item.href\"\n :to=\"entry.item.to\"\n :size=\"resolvedSize\"\n :variant=\"isCurrent(entry.index) ? 'default' : 'muted'\"\n :aria-label=\"entry.item.ariaLabel\"\n :aria-current=\"isCurrent(entry.index) ? 'page' : undefined\"\n >\n <slot name=\"item\" :item=\"entry.item\" :index=\"entry.index\" :is-current=\"isCurrent(entry.index)\">\n <component\n :is=\"iconTag(entry.item.icon)\"\n v-if=\"entry.item.icon\"\n :class=\"[breadcrumbsItemIconClass, iconClass(entry.item.icon)]\"\n aria-hidden=\"true\"\n />\n <span :class=\"breadcrumbsLabelClass\">{{ entry.item.label }}</span>\n </slot>\n </GrLink>\n\n <!--\n Текущая страница и выключенный пункт — не ссылки. `aria-current`\n остаётся на текущем: именно он отвечает на вопрос «где я».\n -->\n <span\n v-else\n data-gr-breadcrumbs-item\n :class=\"breadcrumbsCurrentClass\"\n :aria-label=\"entry.item.ariaLabel\"\n :aria-current=\"isCurrent(entry.index) ? 'page' : undefined\"\n :aria-disabled=\"entry.item.disabled ? 'true' : undefined\"\n tabindex=\"-1\"\n >\n <slot name=\"item\" :item=\"entry.item\" :index=\"entry.index\" :is-current=\"isCurrent(entry.index)\">\n <component\n :is=\"iconTag(entry.item.icon)\"\n v-if=\"entry.item.icon\"\n :class=\"[breadcrumbsItemIconClass, iconClass(entry.item.icon)]\"\n aria-hidden=\"true\"\n />\n <span :class=\"breadcrumbsLabelClass\">{{ entry.item.label }}</span>\n </slot>\n </span>\n </li>\n </template>\n </ol>\n </nav>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { m as resolveBreadcrumbsLayout, n as grBreadcrumbsSafelist, p as resolveBreadcrumbsFit, t as grBreadcrumbsConfig } from "../../chunks/config-DKdlqXiY.js";
|
|
2
|
-
import { t as GrBreadcrumbs_default } from "./chunks/GrBreadcrumbs-
|
|
2
|
+
import { t as GrBreadcrumbs_default } from "./chunks/GrBreadcrumbs-CQ44iU2o.js";
|
|
3
3
|
export { GrBreadcrumbs_default as GrBreadcrumbs, GrBreadcrumbs_default as default, grBreadcrumbsConfig, grBreadcrumbsSafelist, resolveBreadcrumbsFit, resolveBreadcrumbsLayout };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as
|
|
1
|
+
import { a as useGrComponentSize, i as useGrComponentProp } from "../../../chunks/context-CTbuwcYs.js";
|
|
2
2
|
import { n as useGranularityTranslations } from "../../../chunks/granularityI18n-BC5zsj_d.js";
|
|
3
3
|
import { t as loader_circle_default } from "../../../chunks/loader-circle-CfVLz7lb.js";
|
|
4
4
|
import { n as useGrButtonGroup } from "../../../chunks/context-BfIQv7m1.js";
|
package/dist/components/GrButton/chunks/{GrButton-D0m_z0XW.js.map → GrButton-Bw2AH4uX.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrButton-D0m_z0XW.js","names":[],"sources":["../../../../src/components/GrButton/GrButton.vue","../../../../src/components/GrButton/GrButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, markRaw, ref, type Component } from 'vue'\n\nimport IconLoader from '~icons/lucide/loader-circle'\n\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrButtonGroup } from '../GrButtonGroup/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n\nexport type { GrButtonSize, GrButtonTone, GrButtonVariant } from './grButtonStyles'\n\nimport {\n grButtonBaseClass,\n grButtonClass,\n type GrButtonSize,\n type GrButtonTone,\n type GrButtonVariant,\n} from './grButtonStyles'\n\nexport interface GrButtonProps {\n variant?: GrButtonVariant\n tone?: GrButtonTone\n size?: GrButtonSize\n loading?: boolean\n /** i18n: что именно грузится. `aria-busy` сам по себе часть AT не объявляет. */\n loadingText?: string\n disabled?: boolean\n square?: boolean\n /** Кнопка на всю ширину контейнера. */\n block?: boolean\n type?: 'button' | 'submit' | 'reset'\n ariaLabel?: string\n /** Полиморфизм: кастомный корневой тег/компонент (например, RouterLink). */\n as?: string | Component\n /** Рендерит кнопку как `<a href>` (если не задан `as`). */\n href?: string\n target?: string\n rel?: string\n external?: boolean\n}\n\nconst props = withDefaults(\n defineProps<GrButtonProps>(),\n {\n // `variant`/`tone`/`size`/`square` настраиваются через `GrConfigProvider`,\n // поэтому их дефолты живут в резолверах ниже, а не здесь: Vue подставил бы\n // дефолт до того, как компонент успеет заглянуть в конфиг.\n variant: undefined,\n tone: undefined,\n size: undefined,\n loading: false,\n loadingText: undefined,\n disabled: false,\n square: undefined,\n block: false,\n type: 'button',\n ariaLabel: undefined,\n as: undefined,\n href: undefined,\n target: undefined,\n rel: undefined,\n external: false,\n },\n)\n\n// Эффективные значения: проп кнопки → группа → `GrConfigProvider` → дефолт.\n// Группа ближе к кнопке, чем глобальный провайдер, поэтому она подставляется\n// как «локальное» значение — и побеждает конфиг, но не собственный проп.\nconst group = useGrButtonGroup()\n\nconst resolvedSize = useGrComponentSize(() => props.size ?? group?.size.value, { component: 'GrButton' })\nconst resolvedVariant = useGrComponentProp('GrButton', 'variant', () => props.variant ?? group?.variant.value, 'primary')\nconst resolvedTone = useGrComponentProp('GrButton', 'tone', () => props.tone ?? group?.tone.value, 'primary')\nconst isSquare = useGrComponentProp('GrButton', 'square', () => props.square, false)\n\nconst { t } = useGranularityTranslations()\nconst resolvedLoadingText = computed(() => props.loadingText ?? t('gr.button.loading', 'Loading…'))\n\n// Полиморфный корень: `as` → `<a href>` → `<button>`.\nconst isLink = computed(() => Boolean(props.as || props.href))\nconst renderAs = computed<string | Component>(() => {\n if (props.as) return typeof props.as === 'string' ? props.as : markRaw(props.as)\n return props.href ? 'a' : 'button'\n})\n\n// Неинтерактивно при явном `disabled` ИЛИ во время `loading`.\nconst blocked = computed(() => props.disabled || props.loading)\n\n// Ключевое: `loading` НЕ ставит нативный `disabled` (элемент бы выпал из фокуса и\n// скринридер потерял бы контекст) — вместо этого `aria-disabled` + перехват клика.\n// Нативный `disabled` (только у `<button>`) оставляем лишь для явного `disabled`.\nconst nativeDisabled = computed(() => (renderAs.value === 'button' && props.disabled) ? true : undefined)\nconst ariaDisabled = computed(() => (props.loading || (isLink.value && props.disabled)) ? 'true' : undefined)\n\nconst resolvedTarget = computed(() => props.target ?? (props.external ? '_blank' : undefined))\nconst resolvedRel = computed(() => props.rel ?? (resolvedTarget.value === '_blank' ? 'noopener noreferrer' : undefined))\n\nfunction onClickCapture(e: MouseEvent): void {\n // Блокируем и дефолт (submit/навигация), и внешние обработчики (в т.ч. по Enter/Space),\n // сохраняя фокус на элементе.\n if (blocked.value) {\n e.preventDefault()\n e.stopImmediatePropagation()\n }\n}\n\n// Корень динамический (`as` принимает и тег, и компонент), поэтому ref может\n// оказаться как элементом, так и инстансом — например роутерной ссылкой.\nconst rootEl = ref<HTMLElement | { $el?: HTMLElement } | null>(null)\n\n/**\n * Фокус на кнопку из кода. Нужен там, где окно обязано открываться с фокусом\n * на конкретном действии (`GrConfirmDialog`), и потребителю не должно быть\n * важно, тегом или компонентом отрисован корень.\n */\nfunction focus(): void {\n const root = rootEl.value\n const el = root instanceof HTMLElement ? root : root?.$el\n el?.focus?.()\n}\n\nfunction blur(): void {\n const root = rootEl.value\n const el = root instanceof HTMLElement ? root : root?.$el\n el?.blur?.()\n}\n\ndefineExpose({ focus, blur })\n\nconst className = computed(() => {\n return grButtonClass({\n variant: resolvedVariant.value,\n tone: resolvedTone.value,\n size: resolvedSize.value,\n square: isSquare.value,\n disabled: props.disabled,\n block: props.block,\n })\n})\n</script>\n\n<template>\n <component\n :is=\"renderAs\"\n ref=\"rootEl\"\n data-gr-button\n :data-gr-variant=\"resolvedVariant\"\n :data-gr-tone=\"resolvedTone\"\n :type=\"renderAs === 'button' ? props.type : undefined\"\n :disabled=\"nativeDisabled\"\n :href=\"isLink && !props.disabled ? props.href : undefined\"\n :target=\"isLink && !props.disabled ? resolvedTarget : undefined\"\n :rel=\"isLink && !props.disabled ? resolvedRel : undefined\"\n :aria-busy=\"props.loading ? 'true' : undefined\"\n :aria-disabled=\"ariaDisabled\"\n :aria-label=\"props.ariaLabel\"\n :tabindex=\"isLink && props.disabled ? -1 : undefined\"\n :class=\"[grButtonBaseClass, className, blocked ? 'cursor-not-allowed' : '']\"\n @click.capture=\"onClickCapture\"\n >\n <!-- Спиннер занимает место префикса: две иконки рядом читались бы как ошибка. -->\n <IconLoader v-if=\"props.loading\" class=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n <slot v-else name=\"prefix\" />\n\n <slot />\n\n <slot name=\"suffix\" />\n\n <span v-if=\"props.loading\" class=\"sr-only\">{{ resolvedLoadingText }}</span>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, markRaw, ref, type Component } from 'vue'\n\nimport IconLoader from '~icons/lucide/loader-circle'\n\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrButtonGroup } from '../GrButtonGroup/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n\nexport type { GrButtonSize, GrButtonTone, GrButtonVariant } from './grButtonStyles'\n\nimport {\n grButtonBaseClass,\n grButtonClass,\n type GrButtonSize,\n type GrButtonTone,\n type GrButtonVariant,\n} from './grButtonStyles'\n\nexport interface GrButtonProps {\n variant?: GrButtonVariant\n tone?: GrButtonTone\n size?: GrButtonSize\n loading?: boolean\n /** i18n: что именно грузится. `aria-busy` сам по себе часть AT не объявляет. */\n loadingText?: string\n disabled?: boolean\n square?: boolean\n /** Кнопка на всю ширину контейнера. */\n block?: boolean\n type?: 'button' | 'submit' | 'reset'\n ariaLabel?: string\n /** Полиморфизм: кастомный корневой тег/компонент (например, RouterLink). */\n as?: string | Component\n /** Рендерит кнопку как `<a href>` (если не задан `as`). */\n href?: string\n target?: string\n rel?: string\n external?: boolean\n}\n\nconst props = withDefaults(\n defineProps<GrButtonProps>(),\n {\n // `variant`/`tone`/`size`/`square` настраиваются через `GrConfigProvider`,\n // поэтому их дефолты живут в резолверах ниже, а не здесь: Vue подставил бы\n // дефолт до того, как компонент успеет заглянуть в конфиг.\n variant: undefined,\n tone: undefined,\n size: undefined,\n loading: false,\n loadingText: undefined,\n disabled: false,\n square: undefined,\n block: false,\n type: 'button',\n ariaLabel: undefined,\n as: undefined,\n href: undefined,\n target: undefined,\n rel: undefined,\n external: false,\n },\n)\n\n// Эффективные значения: проп кнопки → группа → `GrConfigProvider` → дефолт.\n// Группа ближе к кнопке, чем глобальный провайдер, поэтому она подставляется\n// как «локальное» значение — и побеждает конфиг, но не собственный проп.\nconst group = useGrButtonGroup()\n\nconst resolvedSize = useGrComponentSize(() => props.size ?? group?.size.value, { component: 'GrButton' })\nconst resolvedVariant = useGrComponentProp('GrButton', 'variant', () => props.variant ?? group?.variant.value, 'primary')\nconst resolvedTone = useGrComponentProp('GrButton', 'tone', () => props.tone ?? group?.tone.value, 'primary')\nconst isSquare = useGrComponentProp('GrButton', 'square', () => props.square, false)\n\nconst { t } = useGranularityTranslations()\nconst resolvedLoadingText = computed(() => props.loadingText ?? t('gr.button.loading', 'Loading…'))\n\n// Полиморфный корень: `as` → `<a href>` → `<button>`.\nconst isLink = computed(() => Boolean(props.as || props.href))\nconst renderAs = computed<string | Component>(() => {\n if (props.as) return typeof props.as === 'string' ? props.as : markRaw(props.as)\n return props.href ? 'a' : 'button'\n})\n\n// Неинтерактивно при явном `disabled` ИЛИ во время `loading`.\nconst blocked = computed(() => props.disabled || props.loading)\n\n// Ключевое: `loading` НЕ ставит нативный `disabled` (элемент бы выпал из фокуса и\n// скринридер потерял бы контекст) — вместо этого `aria-disabled` + перехват клика.\n// Нативный `disabled` (только у `<button>`) оставляем лишь для явного `disabled`.\nconst nativeDisabled = computed(() => (renderAs.value === 'button' && props.disabled) ? true : undefined)\nconst ariaDisabled = computed(() => (props.loading || (isLink.value && props.disabled)) ? 'true' : undefined)\n\nconst resolvedTarget = computed(() => props.target ?? (props.external ? '_blank' : undefined))\nconst resolvedRel = computed(() => props.rel ?? (resolvedTarget.value === '_blank' ? 'noopener noreferrer' : undefined))\n\nfunction onClickCapture(e: MouseEvent): void {\n // Блокируем и дефолт (submit/навигация), и внешние обработчики (в т.ч. по Enter/Space),\n // сохраняя фокус на элементе.\n if (blocked.value) {\n e.preventDefault()\n e.stopImmediatePropagation()\n }\n}\n\n// Корень динамический (`as` принимает и тег, и компонент), поэтому ref может\n// оказаться как элементом, так и инстансом — например роутерной ссылкой.\nconst rootEl = ref<HTMLElement | { $el?: HTMLElement } | null>(null)\n\n/**\n * Фокус на кнопку из кода. Нужен там, где окно обязано открываться с фокусом\n * на конкретном действии (`GrConfirmDialog`), и потребителю не должно быть\n * важно, тегом или компонентом отрисован корень.\n */\nfunction focus(): void {\n const root = rootEl.value\n const el = root instanceof HTMLElement ? root : root?.$el\n el?.focus?.()\n}\n\nfunction blur(): void {\n const root = rootEl.value\n const el = root instanceof HTMLElement ? root : root?.$el\n el?.blur?.()\n}\n\ndefineExpose({ focus, blur })\n\nconst className = computed(() => {\n return grButtonClass({\n variant: resolvedVariant.value,\n tone: resolvedTone.value,\n size: resolvedSize.value,\n square: isSquare.value,\n disabled: props.disabled,\n block: props.block,\n })\n})\n</script>\n\n<template>\n <component\n :is=\"renderAs\"\n ref=\"rootEl\"\n data-gr-button\n :data-gr-variant=\"resolvedVariant\"\n :data-gr-tone=\"resolvedTone\"\n :type=\"renderAs === 'button' ? props.type : undefined\"\n :disabled=\"nativeDisabled\"\n :href=\"isLink && !props.disabled ? props.href : undefined\"\n :target=\"isLink && !props.disabled ? resolvedTarget : undefined\"\n :rel=\"isLink && !props.disabled ? resolvedRel : undefined\"\n :aria-busy=\"props.loading ? 'true' : undefined\"\n :aria-disabled=\"ariaDisabled\"\n :aria-label=\"props.ariaLabel\"\n :tabindex=\"isLink && props.disabled ? -1 : undefined\"\n :class=\"[grButtonBaseClass, className, blocked ? 'cursor-not-allowed' : '']\"\n @click.capture=\"onClickCapture\"\n >\n <!-- Спиннер занимает место префикса: две иконки рядом читались бы как ошибка. -->\n <IconLoader v-if=\"props.loading\" class=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n <slot v-else name=\"prefix\" />\n\n <slot />\n\n <slot name=\"suffix\" />\n\n <span v-if=\"props.loading\" class=\"sr-only\">{{ resolvedLoadingText }}</span>\n </component>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GrButton-Bw2AH4uX.js","names":[],"sources":["../../../../src/components/GrButton/GrButton.vue","../../../../src/components/GrButton/GrButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, markRaw, ref, type Component } from 'vue'\n\nimport IconLoader from '~icons/lucide/loader-circle'\n\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrButtonGroup } from '../GrButtonGroup/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n\nexport type { GrButtonSize, GrButtonTone, GrButtonVariant } from './grButtonStyles'\n\nimport {\n grButtonBaseClass,\n grButtonClass,\n type GrButtonSize,\n type GrButtonTone,\n type GrButtonVariant,\n} from './grButtonStyles'\n\nexport interface GrButtonProps {\n variant?: GrButtonVariant\n tone?: GrButtonTone\n size?: GrButtonSize\n loading?: boolean\n /** i18n: что именно грузится. `aria-busy` сам по себе часть AT не объявляет. */\n loadingText?: string\n disabled?: boolean\n square?: boolean\n /** Кнопка на всю ширину контейнера. */\n block?: boolean\n type?: 'button' | 'submit' | 'reset'\n ariaLabel?: string\n /** Полиморфизм: кастомный корневой тег/компонент (например, RouterLink). */\n as?: string | Component\n /** Рендерит кнопку как `<a href>` (если не задан `as`). */\n href?: string\n target?: string\n rel?: string\n external?: boolean\n}\n\nconst props = withDefaults(\n defineProps<GrButtonProps>(),\n {\n // `variant`/`tone`/`size`/`square` настраиваются через `GrConfigProvider`,\n // поэтому их дефолты живут в резолверах ниже, а не здесь: Vue подставил бы\n // дефолт до того, как компонент успеет заглянуть в конфиг.\n variant: undefined,\n tone: undefined,\n size: undefined,\n loading: false,\n loadingText: undefined,\n disabled: false,\n square: undefined,\n block: false,\n type: 'button',\n ariaLabel: undefined,\n as: undefined,\n href: undefined,\n target: undefined,\n rel: undefined,\n external: false,\n },\n)\n\n// Эффективные значения: проп кнопки → группа → `GrConfigProvider` → дефолт.\n// Группа ближе к кнопке, чем глобальный провайдер, поэтому она подставляется\n// как «локальное» значение — и побеждает конфиг, но не собственный проп.\nconst group = useGrButtonGroup()\n\nconst resolvedSize = useGrComponentSize(() => props.size ?? group?.size.value, { component: 'GrButton' })\nconst resolvedVariant = useGrComponentProp('GrButton', 'variant', () => props.variant ?? group?.variant.value, 'primary')\nconst resolvedTone = useGrComponentProp('GrButton', 'tone', () => props.tone ?? group?.tone.value, 'primary')\nconst isSquare = useGrComponentProp('GrButton', 'square', () => props.square, false)\n\nconst { t } = useGranularityTranslations()\nconst resolvedLoadingText = computed(() => props.loadingText ?? t('gr.button.loading', 'Loading…'))\n\n// Полиморфный корень: `as` → `<a href>` → `<button>`.\nconst isLink = computed(() => Boolean(props.as || props.href))\nconst renderAs = computed<string | Component>(() => {\n if (props.as) return typeof props.as === 'string' ? props.as : markRaw(props.as)\n return props.href ? 'a' : 'button'\n})\n\n// Неинтерактивно при явном `disabled` ИЛИ во время `loading`.\nconst blocked = computed(() => props.disabled || props.loading)\n\n// Ключевое: `loading` НЕ ставит нативный `disabled` (элемент бы выпал из фокуса и\n// скринридер потерял бы контекст) — вместо этого `aria-disabled` + перехват клика.\n// Нативный `disabled` (только у `<button>`) оставляем лишь для явного `disabled`.\nconst nativeDisabled = computed(() => (renderAs.value === 'button' && props.disabled) ? true : undefined)\nconst ariaDisabled = computed(() => (props.loading || (isLink.value && props.disabled)) ? 'true' : undefined)\n\nconst resolvedTarget = computed(() => props.target ?? (props.external ? '_blank' : undefined))\nconst resolvedRel = computed(() => props.rel ?? (resolvedTarget.value === '_blank' ? 'noopener noreferrer' : undefined))\n\nfunction onClickCapture(e: MouseEvent): void {\n // Блокируем и дефолт (submit/навигация), и внешние обработчики (в т.ч. по Enter/Space),\n // сохраняя фокус на элементе.\n if (blocked.value) {\n e.preventDefault()\n e.stopImmediatePropagation()\n }\n}\n\n// Корень динамический (`as` принимает и тег, и компонент), поэтому ref может\n// оказаться как элементом, так и инстансом — например роутерной ссылкой.\nconst rootEl = ref<HTMLElement | { $el?: HTMLElement } | null>(null)\n\n/**\n * Фокус на кнопку из кода. Нужен там, где окно обязано открываться с фокусом\n * на конкретном действии (`GrConfirmDialog`), и потребителю не должно быть\n * важно, тегом или компонентом отрисован корень.\n */\nfunction focus(): void {\n const root = rootEl.value\n const el = root instanceof HTMLElement ? root : root?.$el\n el?.focus?.()\n}\n\nfunction blur(): void {\n const root = rootEl.value\n const el = root instanceof HTMLElement ? root : root?.$el\n el?.blur?.()\n}\n\ndefineExpose({ focus, blur })\n\nconst className = computed(() => {\n return grButtonClass({\n variant: resolvedVariant.value,\n tone: resolvedTone.value,\n size: resolvedSize.value,\n square: isSquare.value,\n disabled: props.disabled,\n block: props.block,\n })\n})\n</script>\n\n<template>\n <component\n :is=\"renderAs\"\n ref=\"rootEl\"\n data-gr-button\n :data-gr-variant=\"resolvedVariant\"\n :data-gr-tone=\"resolvedTone\"\n :type=\"renderAs === 'button' ? props.type : undefined\"\n :disabled=\"nativeDisabled\"\n :href=\"isLink && !props.disabled ? props.href : undefined\"\n :target=\"isLink && !props.disabled ? resolvedTarget : undefined\"\n :rel=\"isLink && !props.disabled ? resolvedRel : undefined\"\n :aria-busy=\"props.loading ? 'true' : undefined\"\n :aria-disabled=\"ariaDisabled\"\n :aria-label=\"props.ariaLabel\"\n :tabindex=\"isLink && props.disabled ? -1 : undefined\"\n :class=\"[grButtonBaseClass, className, blocked ? 'cursor-not-allowed' : '']\"\n @click.capture=\"onClickCapture\"\n >\n <!-- Спиннер занимает место префикса: две иконки рядом читались бы как ошибка. -->\n <IconLoader v-if=\"props.loading\" class=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n <slot v-else name=\"prefix\" />\n\n <slot />\n\n <slot name=\"suffix\" />\n\n <span v-if=\"props.loading\" class=\"sr-only\">{{ resolvedLoadingText }}</span>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, markRaw, ref, type Component } from 'vue'\n\nimport IconLoader from '~icons/lucide/loader-circle'\n\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrButtonGroup } from '../GrButtonGroup/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n\nexport type { GrButtonSize, GrButtonTone, GrButtonVariant } from './grButtonStyles'\n\nimport {\n grButtonBaseClass,\n grButtonClass,\n type GrButtonSize,\n type GrButtonTone,\n type GrButtonVariant,\n} from './grButtonStyles'\n\nexport interface GrButtonProps {\n variant?: GrButtonVariant\n tone?: GrButtonTone\n size?: GrButtonSize\n loading?: boolean\n /** i18n: что именно грузится. `aria-busy` сам по себе часть AT не объявляет. */\n loadingText?: string\n disabled?: boolean\n square?: boolean\n /** Кнопка на всю ширину контейнера. */\n block?: boolean\n type?: 'button' | 'submit' | 'reset'\n ariaLabel?: string\n /** Полиморфизм: кастомный корневой тег/компонент (например, RouterLink). */\n as?: string | Component\n /** Рендерит кнопку как `<a href>` (если не задан `as`). */\n href?: string\n target?: string\n rel?: string\n external?: boolean\n}\n\nconst props = withDefaults(\n defineProps<GrButtonProps>(),\n {\n // `variant`/`tone`/`size`/`square` настраиваются через `GrConfigProvider`,\n // поэтому их дефолты живут в резолверах ниже, а не здесь: Vue подставил бы\n // дефолт до того, как компонент успеет заглянуть в конфиг.\n variant: undefined,\n tone: undefined,\n size: undefined,\n loading: false,\n loadingText: undefined,\n disabled: false,\n square: undefined,\n block: false,\n type: 'button',\n ariaLabel: undefined,\n as: undefined,\n href: undefined,\n target: undefined,\n rel: undefined,\n external: false,\n },\n)\n\n// Эффективные значения: проп кнопки → группа → `GrConfigProvider` → дефолт.\n// Группа ближе к кнопке, чем глобальный провайдер, поэтому она подставляется\n// как «локальное» значение — и побеждает конфиг, но не собственный проп.\nconst group = useGrButtonGroup()\n\nconst resolvedSize = useGrComponentSize(() => props.size ?? group?.size.value, { component: 'GrButton' })\nconst resolvedVariant = useGrComponentProp('GrButton', 'variant', () => props.variant ?? group?.variant.value, 'primary')\nconst resolvedTone = useGrComponentProp('GrButton', 'tone', () => props.tone ?? group?.tone.value, 'primary')\nconst isSquare = useGrComponentProp('GrButton', 'square', () => props.square, false)\n\nconst { t } = useGranularityTranslations()\nconst resolvedLoadingText = computed(() => props.loadingText ?? t('gr.button.loading', 'Loading…'))\n\n// Полиморфный корень: `as` → `<a href>` → `<button>`.\nconst isLink = computed(() => Boolean(props.as || props.href))\nconst renderAs = computed<string | Component>(() => {\n if (props.as) return typeof props.as === 'string' ? props.as : markRaw(props.as)\n return props.href ? 'a' : 'button'\n})\n\n// Неинтерактивно при явном `disabled` ИЛИ во время `loading`.\nconst blocked = computed(() => props.disabled || props.loading)\n\n// Ключевое: `loading` НЕ ставит нативный `disabled` (элемент бы выпал из фокуса и\n// скринридер потерял бы контекст) — вместо этого `aria-disabled` + перехват клика.\n// Нативный `disabled` (только у `<button>`) оставляем лишь для явного `disabled`.\nconst nativeDisabled = computed(() => (renderAs.value === 'button' && props.disabled) ? true : undefined)\nconst ariaDisabled = computed(() => (props.loading || (isLink.value && props.disabled)) ? 'true' : undefined)\n\nconst resolvedTarget = computed(() => props.target ?? (props.external ? '_blank' : undefined))\nconst resolvedRel = computed(() => props.rel ?? (resolvedTarget.value === '_blank' ? 'noopener noreferrer' : undefined))\n\nfunction onClickCapture(e: MouseEvent): void {\n // Блокируем и дефолт (submit/навигация), и внешние обработчики (в т.ч. по Enter/Space),\n // сохраняя фокус на элементе.\n if (blocked.value) {\n e.preventDefault()\n e.stopImmediatePropagation()\n }\n}\n\n// Корень динамический (`as` принимает и тег, и компонент), поэтому ref может\n// оказаться как элементом, так и инстансом — например роутерной ссылкой.\nconst rootEl = ref<HTMLElement | { $el?: HTMLElement } | null>(null)\n\n/**\n * Фокус на кнопку из кода. Нужен там, где окно обязано открываться с фокусом\n * на конкретном действии (`GrConfirmDialog`), и потребителю не должно быть\n * важно, тегом или компонентом отрисован корень.\n */\nfunction focus(): void {\n const root = rootEl.value\n const el = root instanceof HTMLElement ? root : root?.$el\n el?.focus?.()\n}\n\nfunction blur(): void {\n const root = rootEl.value\n const el = root instanceof HTMLElement ? root : root?.$el\n el?.blur?.()\n}\n\ndefineExpose({ focus, blur })\n\nconst className = computed(() => {\n return grButtonClass({\n variant: resolvedVariant.value,\n tone: resolvedTone.value,\n size: resolvedSize.value,\n square: isSquare.value,\n disabled: props.disabled,\n block: props.block,\n })\n})\n</script>\n\n<template>\n <component\n :is=\"renderAs\"\n ref=\"rootEl\"\n data-gr-button\n :data-gr-variant=\"resolvedVariant\"\n :data-gr-tone=\"resolvedTone\"\n :type=\"renderAs === 'button' ? props.type : undefined\"\n :disabled=\"nativeDisabled\"\n :href=\"isLink && !props.disabled ? props.href : undefined\"\n :target=\"isLink && !props.disabled ? resolvedTarget : undefined\"\n :rel=\"isLink && !props.disabled ? resolvedRel : undefined\"\n :aria-busy=\"props.loading ? 'true' : undefined\"\n :aria-disabled=\"ariaDisabled\"\n :aria-label=\"props.ariaLabel\"\n :tabindex=\"isLink && props.disabled ? -1 : undefined\"\n :class=\"[grButtonBaseClass, className, blocked ? 'cursor-not-allowed' : '']\"\n @click.capture=\"onClickCapture\"\n >\n <!-- Спиннер занимает место префикса: две иконки рядом читались бы как ошибка. -->\n <IconLoader v-if=\"props.loading\" class=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n <slot v-else name=\"prefix\" />\n\n <slot />\n\n <slot name=\"suffix\" />\n\n <span v-if=\"props.loading\" class=\"sr-only\">{{ resolvedLoadingText }}</span>\n </component>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as GrButton_default } from "./chunks/GrButton-D0m_z0XW.js";
|
|
1
|
+
import { t as GrButton_default } from "./chunks/GrButton-Bw2AH4uX.js";
|
|
3
2
|
import { t as grButtonSafelist } from "../../chunks/safelist-CudBLyAD.js";
|
|
4
3
|
import { t as grButtonConfig } from "../../chunks/config-B84z1aos.js";
|
|
5
|
-
export { GrButton_default as GrButton, GrButton_default as default,
|
|
4
|
+
export { GrButton_default as GrButton, GrButton_default as default, grButtonConfig, grButtonSafelist };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i as useGrComponentProp } from "../../../chunks/context-CTbuwcYs.js";
|
|
2
2
|
import { a as sectionDividerBottomClass, i as paddingClass, o as sectionDividerTopClass, r as grCardRootClass } from "../../../chunks/config-gwro_7yn.js";
|
|
3
3
|
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, markRaw, normalizeClass, openBlock, renderSlot, resolveDynamicComponent, useSlots, withCtx } from "vue";
|
|
4
4
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrCard-
|
|
1
|
+
{"version":3,"file":"GrCard-DfIZOP5N.js","names":["$slots"],"sources":["../../../../src/components/GrCard/GrCard.vue","../../../../src/components/GrCard/GrCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, markRaw, useSlots, type Component } from 'vue'\n\nimport { useGrComponentProp } from '../GrConfigProvider/context'\n\nimport {\n grCardRootClass,\n paddingClass,\n sectionDividerBottomClass,\n sectionDividerTopClass,\n type GrCardPadding,\n type GrCardVariant,\n} from './grCardStyles'\n\nexport type { GrCardPadding, GrCardVariant } from './grCardStyles'\n\nexport interface GrCardProps {\n /**\n * Внутренние отступы. По умолчанию `none`: карточка — поверхность, а её\n * содержимое (`GrCollapse`, `GrList`) само знает про свои отступы.\n */\n padding?: GrCardPadding\n /** `elevated` — рамка, фон и тень; `outlined` — без тени; `ghost` — без рамки. */\n variant?: GrCardVariant\n /** Свой корневой тег (`RouterLink`, `Link` от Inertia). Сильнее `href`. */\n as?: string | Component\n /** Карточка-ссылка. */\n href?: string\n /** Карточка-кнопка: интерактивна вся поверхность. */\n clickable?: boolean\n /** Подсветка при наведении без интерактивности. */\n hoverable?: boolean\n /** Классы обёртки тела — она появляется вместе с секциями. */\n bodyClass?: string\n}\n\nexport interface GrCardEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nconst props = withDefaults(defineProps<GrCardProps>(), {\n // Настраивается через `GrConfigProvider`; дефолты — в резолверах ниже.\n padding: undefined,\n variant: undefined,\n as: undefined,\n href: undefined,\n clickable: false,\n hoverable: false,\n bodyClass: undefined,\n})\n\nconst emit = defineEmits<GrCardEmits>()\n\nconst slots = useSlots()\n\nconst resolvedPadding = useGrComponentProp('GrCard', 'padding', () => props.padding, 'none')\nconst resolvedVariant = useGrComponentProp('GrCard', 'variant', () => props.variant, 'elevated')\n\nconst isInteractive = computed(() => !!props.as || !!props.href || props.clickable)\n\nconst rootTag = computed<string | Component>(() => {\n if (props.as)\n return typeof props.as === 'string' ? props.as : markRaw(props.as)\n\n if (props.href)\n return 'a'\n\n return props.clickable ? 'button' : 'div'\n})\n\n/**\n * Обёртки появляются, только когда их попросили: карточка без секций остаётся\n * одним `<div>` со слотом внутри — ровно тем, что рендерили `GrCollapse` и\n * `GrList` до появления пропов.\n */\nconst hasSections = computed(() => Boolean(slots.header || slots.footer || props.bodyClass))\n\nconst rootClass = computed(() => grCardRootClass({\n variant: resolvedVariant.value,\n // С секциями отступ принадлежит каждой из них, а не поверхности целиком.\n padding: hasSections.value ? 'none' : resolvedPadding.value,\n interactive: isInteractive.value,\n hoverable: props.hoverable,\n}))\n\nconst sectionPaddingClass = computed(() => paddingClass[resolvedPadding.value])\n\nconst headerClass = computed(() => [sectionPaddingClass.value, sectionDividerBottomClass].filter(Boolean).join(' '))\nconst footerClass = computed(() => [sectionPaddingClass.value, sectionDividerTopClass].filter(Boolean).join(' '))\nconst bodySectionClass = computed(() => [sectionPaddingClass.value, props.bodyClass].filter(Boolean).join(' '))\n\nfunction onClick(event: MouseEvent): void {\n emit('click', event)\n}\n</script>\n\n<template>\n <component\n :is=\"rootTag\"\n data-gr-card\n :type=\"rootTag === 'button' ? 'button' : undefined\"\n :href=\"rootTag === 'a' ? href : undefined\"\n :class=\"rootClass\"\n @click=\"onClick\"\n >\n <template v-if=\"hasSections\">\n <div v-if=\"$slots.header\" data-gr-card-header :class=\"headerClass\">\n <slot name=\"header\" />\n </div>\n\n <div data-gr-card-body :class=\"bodySectionClass\">\n <slot />\n </div>\n\n <div v-if=\"$slots.footer\" data-gr-card-footer :class=\"footerClass\">\n <slot name=\"footer\" />\n </div>\n </template>\n\n <slot v-else />\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, markRaw, useSlots, type Component } from 'vue'\n\nimport { useGrComponentProp } from '../GrConfigProvider/context'\n\nimport {\n grCardRootClass,\n paddingClass,\n sectionDividerBottomClass,\n sectionDividerTopClass,\n type GrCardPadding,\n type GrCardVariant,\n} from './grCardStyles'\n\nexport type { GrCardPadding, GrCardVariant } from './grCardStyles'\n\nexport interface GrCardProps {\n /**\n * Внутренние отступы. По умолчанию `none`: карточка — поверхность, а её\n * содержимое (`GrCollapse`, `GrList`) само знает про свои отступы.\n */\n padding?: GrCardPadding\n /** `elevated` — рамка, фон и тень; `outlined` — без тени; `ghost` — без рамки. */\n variant?: GrCardVariant\n /** Свой корневой тег (`RouterLink`, `Link` от Inertia). Сильнее `href`. */\n as?: string | Component\n /** Карточка-ссылка. */\n href?: string\n /** Карточка-кнопка: интерактивна вся поверхность. */\n clickable?: boolean\n /** Подсветка при наведении без интерактивности. */\n hoverable?: boolean\n /** Классы обёртки тела — она появляется вместе с секциями. */\n bodyClass?: string\n}\n\nexport interface GrCardEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nconst props = withDefaults(defineProps<GrCardProps>(), {\n // Настраивается через `GrConfigProvider`; дефолты — в резолверах ниже.\n padding: undefined,\n variant: undefined,\n as: undefined,\n href: undefined,\n clickable: false,\n hoverable: false,\n bodyClass: undefined,\n})\n\nconst emit = defineEmits<GrCardEmits>()\n\nconst slots = useSlots()\n\nconst resolvedPadding = useGrComponentProp('GrCard', 'padding', () => props.padding, 'none')\nconst resolvedVariant = useGrComponentProp('GrCard', 'variant', () => props.variant, 'elevated')\n\nconst isInteractive = computed(() => !!props.as || !!props.href || props.clickable)\n\nconst rootTag = computed<string | Component>(() => {\n if (props.as)\n return typeof props.as === 'string' ? props.as : markRaw(props.as)\n\n if (props.href)\n return 'a'\n\n return props.clickable ? 'button' : 'div'\n})\n\n/**\n * Обёртки появляются, только когда их попросили: карточка без секций остаётся\n * одним `<div>` со слотом внутри — ровно тем, что рендерили `GrCollapse` и\n * `GrList` до появления пропов.\n */\nconst hasSections = computed(() => Boolean(slots.header || slots.footer || props.bodyClass))\n\nconst rootClass = computed(() => grCardRootClass({\n variant: resolvedVariant.value,\n // С секциями отступ принадлежит каждой из них, а не поверхности целиком.\n padding: hasSections.value ? 'none' : resolvedPadding.value,\n interactive: isInteractive.value,\n hoverable: props.hoverable,\n}))\n\nconst sectionPaddingClass = computed(() => paddingClass[resolvedPadding.value])\n\nconst headerClass = computed(() => [sectionPaddingClass.value, sectionDividerBottomClass].filter(Boolean).join(' '))\nconst footerClass = computed(() => [sectionPaddingClass.value, sectionDividerTopClass].filter(Boolean).join(' '))\nconst bodySectionClass = computed(() => [sectionPaddingClass.value, props.bodyClass].filter(Boolean).join(' '))\n\nfunction onClick(event: MouseEvent): void {\n emit('click', event)\n}\n</script>\n\n<template>\n <component\n :is=\"rootTag\"\n data-gr-card\n :type=\"rootTag === 'button' ? 'button' : undefined\"\n :href=\"rootTag === 'a' ? href : undefined\"\n :class=\"rootClass\"\n @click=\"onClick\"\n >\n <template v-if=\"hasSections\">\n <div v-if=\"$slots.header\" data-gr-card-header :class=\"headerClass\">\n <slot name=\"header\" />\n </div>\n\n <div data-gr-card-body :class=\"bodySectionClass\">\n <slot />\n </div>\n\n <div v-if=\"$slots.footer\" data-gr-card-footer :class=\"footerClass\">\n <slot name=\"footer\" />\n </div>\n </template>\n\n <slot v-else />\n </component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;EAwCA,MAAM,QAAQ;EAWd,MAAM,OAAO;EAEb,MAAM,QAAQ,SAAS;EAEvB,MAAM,kBAAkB,mBAAmB,UAAU,iBAAiB,MAAM,SAAS,MAAM;EAC3F,MAAM,kBAAkB,mBAAmB,UAAU,iBAAiB,MAAM,SAAS,UAAU;EAE/F,MAAM,gBAAgB,eAAe,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,QAAQ,MAAM,SAAS;EAElF,MAAM,UAAU,eAAmC;GACjD,IAAI,MAAM,IACR,OAAO,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK,QAAQ,MAAM,EAAE;GAEnE,IAAI,MAAM,MACR,OAAO;GAET,OAAO,MAAM,YAAY,WAAW;EACtC,CAAC;;;;;;EAOD,MAAM,cAAc,eAAe,QAAQ,MAAM,UAAU,MAAM,UAAU,MAAM,SAAS,CAAC;EAE3F,MAAM,YAAY,eAAe,gBAAgB;GAC/C,SAAS,gBAAgB;GAEzB,SAAS,YAAY,QAAQ,SAAS,gBAAgB;GACtD,aAAa,cAAc;GAC3B,WAAW,MAAM;EACnB,CAAC,CAAC;EAEF,MAAM,sBAAsB,eAAe,aAAa,gBAAgB,MAAM;EAE9E,MAAM,cAAc,eAAe,CAAC,oBAAoB,OAAO,yBAAyB,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC;EACnH,MAAM,cAAc,eAAe,CAAC,oBAAoB,OAAO,sBAAsB,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC;EAChH,MAAM,mBAAmB,eAAe,CAAC,oBAAoB,OAAO,MAAM,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC;EAE9G,SAAS,QAAQ,OAAyB;GACxC,KAAK,SAAS,KAAK;EACrB;;uBAIE,YAuBY,wBAtBL,QAAA,KAAO,GAAA;IACZ,gBAAA;IACC,MAAM,QAAA,UAAO,WAAA,WAA2B,KAAA;IACxC,MAAM,QAAA,UAAO,MAAW,QAAA,OAAO,KAAA;IAC/B,OAAK,eAAE,UAAA,KAAS;IACT;;2BAcG,CAZK,YAAA,SAAA,UAAA,GAAhB,mBAYW,UAAA,EAAA,KAAA,EAAA,GAAA;KAXEA,KAAAA,OAAO,UAAA,UAAA,GAAlB,mBAEM,OAAA;;MAFoB,uBAAA;MAAqB,OAAK,eAAE,YAAA,KAAW;SAC/D,WAAsB,KAAA,QAAA,QAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;KAGxB,mBAEM,OAAA;MAFD,qBAAA;MAAmB,OAAK,eAAE,iBAAA,KAAgB;SAC7C,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA;KAGCA,KAAAA,OAAO,UAAA,UAAA,GAAlB,mBAEM,OAAA;;MAFoB,uBAAA;MAAqB,OAAK,eAAE,YAAA,KAAW;SAC/D,WAAsB,KAAA,QAAA,QAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;cAI1B,WAAe,KAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { n as grCardSafelist, t as grCardConfig } from "../../chunks/config-gwro_7yn.js";
|
|
2
|
-
import { t as GrCard_default } from "./chunks/GrCard-
|
|
2
|
+
import { t as GrCard_default } from "./chunks/GrCard-DfIZOP5N.js";
|
|
3
3
|
export { GrCard_default as GrCard, GrCard_default as default, grCardConfig, grCardSafelist };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as useGrComponentSize } from "../../../chunks/context-CTbuwcYs.js";
|
|
2
2
|
import { useGrFormControl } from "../../../composables/useGrFormControl.js";
|
|
3
3
|
import { t as check_default } from "../../../chunks/check-BZI24Qs4.js";
|
|
4
4
|
import { t as minus_default } from "../../../chunks/minus-oxdbHF33.js";
|
package/dist/components/GrCheckbox/chunks/{GrCheckbox-BLOp8452.js.map → GrCheckbox-CEcHIsXM.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrCheckbox-BLOp8452.js","names":[],"sources":["../../../../src/components/GrCheckbox/grCheckboxGroupContext.ts","../../../../src/components/GrCheckbox/GrCheckbox.vue","../../../../src/components/GrCheckbox/GrCheckbox.vue"],"sourcesContent":["import type { ComputedRef, InjectionKey } from 'vue'\n\nimport type { GrCheckboxSize } from './grCheckboxStyles'\n\nexport type GrCheckboxGroupContext = {\n /** Выбранные значения группы. Чекбокс сравнивает с ними свой `value`. */\n modelValue: ComputedRef<string[]>\n name: ComputedRef<string | undefined>\n disabled: ComputedRef<boolean>\n readonly: ComputedRef<boolean>\n invalid: ComputedRef<boolean>\n /**\n * Обязательность группы объявляют её чекбоксы: `role=\"group\"` не поддерживает\n * `aria-required` (axe: `aria-allowed-attr`), а `role=\"checkbox\"` — да.\n */\n required: ComputedRef<boolean>\n size: ComputedRef<GrCheckboxSize>\n /** Добавляет или убирает значение из выбранных. */\n toggle: (value: string, checked: boolean) => void\n}\n\nexport const GR_CHECKBOX_GROUP_CONTEXT: InjectionKey<GrCheckboxGroupContext> = Symbol('GR_CHECKBOX_GROUP_CONTEXT')\n","<script setup lang=\"ts\">\n/**\n * GrCheckbox — GR-примитив чекбокса с нативным скрытым `<input type=\"checkbox\">`\n * для интеграции с HTML-формами (`FormData`, `form`).\n *\n * Источник истины — нативный input: клик по нему (в т.ч. по внешнему\n * `<label for=\"...\">`) слушается через `@change` и эмитит модель. Клик по видимой\n * части компонента переключает через корневой обработчик.\n *\n * Клавиатура: `Space` переключает значение (Enter — намеренно нет, это нестандартно\n * для чекбоксов). Фокус — на самом контроле (квадратике), как у нативного чекбокса.\n *\n * A11y: `role=\"checkbox\"` + `aria-checked` (`true`/`false`/`mixed`) + `aria-disabled`.\n * Роль висит **только на контроле**, а не на всей строке с подписью — по двум причинам:\n * - роль объявляет своих потомков презентационными, поэтому ни нативный input, ни\n * интерактивная подпись (ссылка на политику, кнопка «показать изменения») не могут\n * жить внутри: скринридер теряет их, axe падает на `nested-interactive`;\n * - имя виджета берётся из подписи через `aria-labelledby`, что и позволяет держать\n * её снаружи вместе со всем её интерактивным содержимым.\n *\n * `required` объявляется только через `aria-required`, на скрытый input он не уходит.\n * Нативная проверка потребовала бы фокуса на невалидном контроле, а он невидим и\n * `aria-hidden` — Chrome в таком случае молча отменяет сабмит всей формы\n * («An invalid form control … is not focusable»). Обязательность проверяет\n * `GrForm` правилом `required` — см. `docs/components/GrCheckbox.md`.\n *\n * Внутри `GrCheckboxGroup` значение приходит из группы: свой `modelValue` не\n * задаётся, а `value` сравнивается с массивом выбранных.\n */\nimport { computed, inject, onMounted, ref, useId, useSlots, watch } from 'vue'\nimport IconCheck from '~icons/lucide/check'\nimport IconMinus from '~icons/lucide/minus'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrFormControl } from '../../composables/useGrFormControl'\n\nimport { GR_CHECKBOX_GROUP_CONTEXT } from './grCheckboxGroupContext'\nimport {\n grCheckboxCheckIconClass,\n grCheckboxControlClass,\n grCheckboxIndeterminateIconClass,\n grCheckboxLabelClass,\n grCheckboxRootClass,\n type GrCheckboxLabelPosition,\n type GrCheckboxSize,\n} from './grCheckboxStyles'\n\nexport type { GrCheckboxLabelPosition, GrCheckboxSize } from './grCheckboxStyles'\n\nexport interface GrCheckboxProps {\n /** Не задан внутри `GrCheckboxGroup` — состояние берётся из группы. */\n modelValue?: boolean\n disabled?: boolean\n name?: string\n value?: string\n /** Обязательное поле: объявляется как `aria-required`, нативной проверки нет. */\n required?: boolean\n /** Только для чтения: состояние видно, но не переключается. */\n readonly?: boolean\n /** Визуальное и ARIA-состояние ошибки. */\n invalid?: boolean\n form?: string\n /** Пробрасывается на скрытый нативный `<input>`, чтобы работал `<label for=\"...\">`. */\n id?: string\n /** Промежуточное («смешанное») состояние: `aria-checked=\"mixed\"`, индикатор — тире. */\n indeterminate?: boolean\n /** Имя контрола, когда подписи в слоте нет (или она чисто визуальная). */\n ariaLabel?: string\n /** Сторона подписи относительно контрола. */\n labelPosition?: GrCheckboxLabelPosition\n /** Размер контрола. Не задан — берётся из группы, затем из `GrConfigProvider`, иначе `md`. */\n size?: GrCheckboxSize\n}\n\nexport interface GrCheckboxEmits {\n (e: 'update:modelValue', value: boolean): void\n (e: 'change', value: boolean): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nconst hiddenInputStyle = {\n position: 'absolute',\n opacity: '0',\n width: '0',\n height: '0',\n pointerEvents: 'none',\n} as const\n\nconst props = withDefaults(defineProps<GrCheckboxProps>(), {\n modelValue: undefined,\n disabled: undefined,\n name: undefined,\n value: 'on',\n required: false,\n readonly: false,\n invalid: false,\n form: undefined,\n id: undefined,\n indeterminate: false,\n ariaLabel: undefined,\n labelPosition: 'end',\n size: undefined,\n})\n\nconst emit = defineEmits<GrCheckboxEmits>()\ndefineSlots<{\n /** Подпись флажка. Может содержать ссылки: роль остаётся на самом контроле. */\n default?: () => any\n}>()\n\n\nconst slots = useSlots()\n\nconst labelId = useId()\nconst hasLabel = computed(() => Boolean(slots.default))\n\nconst group = inject(GR_CHECKBOX_GROUP_CONTEXT, null)\n\nconst checked = computed(() => {\n if (props.modelValue !== undefined)\n return props.modelValue\n\n if (group)\n return group.modelValue.value.includes(props.value)\n\n return false\n})\n\nconst resolvedName = computed(() => props.name ?? group?.name.value)\n\n// Контекст `GrFormField`. Id поля вешается на `span[role=\"checkbox\"]` — именно он\n// виджет и держит фокус; на скрытом `aria-hidden`-инпуте он был бы бесполезен\n// (клик по подписи уводил бы фокус в невидимый элемент). Роль-виджет не является\n// labelable-элементом, поэтому имя от подписи поля приходит через `aria-labelledby`.\nconst {\n disabled: isDisabled,\n id: fieldControlId,\n labelId: fieldLabelId,\n describedBy,\n invalid: fieldInvalid,\n required: fieldRequired,\n readonly: fieldReadonly,\n} = useGrFormControl(() => props)\n\n// «Или», а не `??`: `isDisabled` уже сведён к булеву (свой проп + контекст\n// поля и формы), и `??` до группы просто не дошёл бы.\nconst resolvedDisabled = computed(() => isDisabled.value || Boolean(group?.disabled.value))\n\n// `role=\"group\"` не поддерживает `aria-required` и `aria-readonly` — объявлять\n// обязательность и режим чтения группы обязаны сами чекбоксы.\nconst isRequired = computed(() => fieldRequired.value || Boolean(group?.required.value))\n\nconst isReadonly = computed(() => fieldReadonly.value || Boolean(group?.readonly.value))\n\n// Ошибка группы красит чекбоксы, но не объявляется на каждом из них: `aria-invalid`\n// уже висит на самой группе, и дублировать его на всех пунктах — значит заставить\n// диктор повторить «неверное значение» столько раз, сколько в группе чекбоксов.\nconst isInvalid = computed(() => fieldInvalid.value)\nconst showsInvalid = computed(() => isInvalid.value || Boolean(group?.invalid.value))\n\nconst labelledBy = computed(() => {\n if (props.ariaLabel) return undefined\n if (hasLabel.value) return labelId\n return fieldLabelId.value\n})\n\n// Эффективный размер: локальный проп → группа → `GrConfigProvider` → `md`.\nconst resolvedSize = useGrComponentSize(\n () => props.size ?? group?.size.value,\n { component: 'GrCheckbox' },\n)\n\nconst rootClassName = computed(() => grCheckboxRootClass({\n size: resolvedSize.value,\n disabled: resolvedDisabled.value,\n labelPosition: props.labelPosition,\n}))\n\nconst controlClassName = computed(() => grCheckboxControlClass({\n size: resolvedSize.value,\n active: checked.value || props.indeterminate,\n disabled: resolvedDisabled.value,\n invalid: showsInvalid.value,\n}))\n\nconst indeterminateIconClassName = computed(() => grCheckboxIndeterminateIconClass(resolvedSize.value))\n\nconst checkIconClassName = computed(() => grCheckboxCheckIconClass({\n size: resolvedSize.value,\n checked: checked.value,\n}))\n\nconst labelClassName = computed(() => grCheckboxLabelClass(resolvedSize.value))\n\n// Держим `.checked` на нативном input синхронно с состоянием — `:checked`-биндинг\n// на скрытом элементе иногда отстаёт при программных обновлениях.\nconst nativeInput = ref<HTMLInputElement | null>(null)\nconst control = ref<HTMLElement | null>(null)\nwatch(\n checked,\n (value) => {\n if (nativeInput.value && nativeInput.value.checked !== value)\n nativeInput.value.checked = value\n },\n)\n\n// `indeterminate` можно выставить только через JS-свойство (не атрибут).\nfunction syncIndeterminate(): void {\n if (nativeInput.value)\n nativeInput.value.indeterminate = props.indeterminate\n}\nwatch(() => props.indeterminate, syncIndeterminate)\nonMounted(syncIndeterminate)\n\nfunction setChecked(next: boolean): void {\n if (resolvedDisabled.value || isReadonly.value) {\n // Нативный input мог уже переключиться от клика по внешнему `<label for>` —\n // возвращаем его к состоянию модели, иначе форма отправит непринятое значение.\n if (nativeInput.value)\n nativeInput.value.checked = checked.value\n return\n }\n\n if (props.modelValue !== undefined || !group) {\n emit('update:modelValue', next)\n emit('change', next)\n return\n }\n\n group.toggle(props.value, next)\n emit('change', next)\n}\n\nfunction toggle(): void {\n // Из промежуточного состояния переключаемся во «включено» (стандартное поведение).\n setChecked(props.indeterminate ? true : !checked.value)\n}\n\n// Клик по нативному input (в т.ч. по внешнему `<label for=\"...\">`) уже переключил его\n// `.checked` — берём значение как источник истины и эмитим модель.\nfunction onNativeChange(e: Event): void {\n setChecked((e.target as HTMLInputElement).checked)\n}\n\n// `<label for>` уводит фокус на скрытый input — визуально фокус пропадает. Возвращаем\n// его на контрол, который этот фокус и показывает.\nfunction onNativeFocus(): void {\n control.value?.focus()\n}\n\nfunction focus(): void {\n control.value?.focus()\n}\n\nfunction blur(): void {\n control.value?.blur()\n}\n\ndefineExpose({ focus, blur })\n\n// Подпись держится снаружи роли-виджета именно для того, чтобы могла содержать\n// ссылки и кнопки, — поэтому клик по её интерактивному содержимому чекбокс не\n// переключает. Вложенный `<label>` считается интерактивным: он адресует\n// собственный контрол, и переключение чекбокса «заодно» было бы сюрпризом.\nfunction isInteractiveTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el)\n return false\n return !!el.closest('a,button,input,select,textarea,label,[role=\"button\"],[role=\"link\"]')\n}\n\nfunction onClick(e: MouseEvent): void {\n if (isInteractiveTarget(e.target))\n return\n toggle()\n}\n</script>\n<template>\n <div\n data-gr-checkbox\n :class=\"rootClassName\"\n @click=\"onClick\"\n >\n <input\n :id=\"id\"\n ref=\"nativeInput\"\n type=\"checkbox\"\n :checked=\"checked\"\n :disabled=\"resolvedDisabled\"\n :name=\"resolvedName\"\n :value=\"value\"\n :form=\"form\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :style=\"hiddenInputStyle\"\n @change=\"onNativeChange\"\n @focus=\"onNativeFocus\"\n >\n <span\n :id=\"fieldControlId\"\n ref=\"control\"\n data-gr-checkbox-indicator\n role=\"checkbox\"\n :aria-checked=\"indeterminate ? 'mixed' : (checked ? 'true' : 'false')\"\n :aria-disabled=\"resolvedDisabled ? 'true' : undefined\"\n :aria-required=\"isRequired ? 'true' : undefined\"\n :aria-readonly=\"isReadonly ? 'true' : undefined\"\n :aria-invalid=\"isInvalid ? 'true' : undefined\"\n :aria-describedby=\"describedBy\"\n :aria-label=\"ariaLabel\"\n :aria-labelledby=\"labelledBy\"\n :tabindex=\"resolvedDisabled ? -1 : 0\"\n :class=\"controlClassName\"\n @keydown.space.prevent=\"toggle\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n >\n <IconMinus\n v-if=\"indeterminate\"\n :class=\"indeterminateIconClassName\"\n />\n <IconCheck\n v-else\n :class=\"checkIconClassName\"\n />\n </span>\n <span\n v-if=\"hasLabel\"\n :id=\"labelId\"\n :class=\"labelClassName\"\n >\n <slot />\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * GrCheckbox — GR-примитив чекбокса с нативным скрытым `<input type=\"checkbox\">`\n * для интеграции с HTML-формами (`FormData`, `form`).\n *\n * Источник истины — нативный input: клик по нему (в т.ч. по внешнему\n * `<label for=\"...\">`) слушается через `@change` и эмитит модель. Клик по видимой\n * части компонента переключает через корневой обработчик.\n *\n * Клавиатура: `Space` переключает значение (Enter — намеренно нет, это нестандартно\n * для чекбоксов). Фокус — на самом контроле (квадратике), как у нативного чекбокса.\n *\n * A11y: `role=\"checkbox\"` + `aria-checked` (`true`/`false`/`mixed`) + `aria-disabled`.\n * Роль висит **только на контроле**, а не на всей строке с подписью — по двум причинам:\n * - роль объявляет своих потомков презентационными, поэтому ни нативный input, ни\n * интерактивная подпись (ссылка на политику, кнопка «показать изменения») не могут\n * жить внутри: скринридер теряет их, axe падает на `nested-interactive`;\n * - имя виджета берётся из подписи через `aria-labelledby`, что и позволяет держать\n * её снаружи вместе со всем её интерактивным содержимым.\n *\n * `required` объявляется только через `aria-required`, на скрытый input он не уходит.\n * Нативная проверка потребовала бы фокуса на невалидном контроле, а он невидим и\n * `aria-hidden` — Chrome в таком случае молча отменяет сабмит всей формы\n * («An invalid form control … is not focusable»). Обязательность проверяет\n * `GrForm` правилом `required` — см. `docs/components/GrCheckbox.md`.\n *\n * Внутри `GrCheckboxGroup` значение приходит из группы: свой `modelValue` не\n * задаётся, а `value` сравнивается с массивом выбранных.\n */\nimport { computed, inject, onMounted, ref, useId, useSlots, watch } from 'vue'\nimport IconCheck from '~icons/lucide/check'\nimport IconMinus from '~icons/lucide/minus'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrFormControl } from '../../composables/useGrFormControl'\n\nimport { GR_CHECKBOX_GROUP_CONTEXT } from './grCheckboxGroupContext'\nimport {\n grCheckboxCheckIconClass,\n grCheckboxControlClass,\n grCheckboxIndeterminateIconClass,\n grCheckboxLabelClass,\n grCheckboxRootClass,\n type GrCheckboxLabelPosition,\n type GrCheckboxSize,\n} from './grCheckboxStyles'\n\nexport type { GrCheckboxLabelPosition, GrCheckboxSize } from './grCheckboxStyles'\n\nexport interface GrCheckboxProps {\n /** Не задан внутри `GrCheckboxGroup` — состояние берётся из группы. */\n modelValue?: boolean\n disabled?: boolean\n name?: string\n value?: string\n /** Обязательное поле: объявляется как `aria-required`, нативной проверки нет. */\n required?: boolean\n /** Только для чтения: состояние видно, но не переключается. */\n readonly?: boolean\n /** Визуальное и ARIA-состояние ошибки. */\n invalid?: boolean\n form?: string\n /** Пробрасывается на скрытый нативный `<input>`, чтобы работал `<label for=\"...\">`. */\n id?: string\n /** Промежуточное («смешанное») состояние: `aria-checked=\"mixed\"`, индикатор — тире. */\n indeterminate?: boolean\n /** Имя контрола, когда подписи в слоте нет (или она чисто визуальная). */\n ariaLabel?: string\n /** Сторона подписи относительно контрола. */\n labelPosition?: GrCheckboxLabelPosition\n /** Размер контрола. Не задан — берётся из группы, затем из `GrConfigProvider`, иначе `md`. */\n size?: GrCheckboxSize\n}\n\nexport interface GrCheckboxEmits {\n (e: 'update:modelValue', value: boolean): void\n (e: 'change', value: boolean): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nconst hiddenInputStyle = {\n position: 'absolute',\n opacity: '0',\n width: '0',\n height: '0',\n pointerEvents: 'none',\n} as const\n\nconst props = withDefaults(defineProps<GrCheckboxProps>(), {\n modelValue: undefined,\n disabled: undefined,\n name: undefined,\n value: 'on',\n required: false,\n readonly: false,\n invalid: false,\n form: undefined,\n id: undefined,\n indeterminate: false,\n ariaLabel: undefined,\n labelPosition: 'end',\n size: undefined,\n})\n\nconst emit = defineEmits<GrCheckboxEmits>()\ndefineSlots<{\n /** Подпись флажка. Может содержать ссылки: роль остаётся на самом контроле. */\n default?: () => any\n}>()\n\n\nconst slots = useSlots()\n\nconst labelId = useId()\nconst hasLabel = computed(() => Boolean(slots.default))\n\nconst group = inject(GR_CHECKBOX_GROUP_CONTEXT, null)\n\nconst checked = computed(() => {\n if (props.modelValue !== undefined)\n return props.modelValue\n\n if (group)\n return group.modelValue.value.includes(props.value)\n\n return false\n})\n\nconst resolvedName = computed(() => props.name ?? group?.name.value)\n\n// Контекст `GrFormField`. Id поля вешается на `span[role=\"checkbox\"]` — именно он\n// виджет и держит фокус; на скрытом `aria-hidden`-инпуте он был бы бесполезен\n// (клик по подписи уводил бы фокус в невидимый элемент). Роль-виджет не является\n// labelable-элементом, поэтому имя от подписи поля приходит через `aria-labelledby`.\nconst {\n disabled: isDisabled,\n id: fieldControlId,\n labelId: fieldLabelId,\n describedBy,\n invalid: fieldInvalid,\n required: fieldRequired,\n readonly: fieldReadonly,\n} = useGrFormControl(() => props)\n\n// «Или», а не `??`: `isDisabled` уже сведён к булеву (свой проп + контекст\n// поля и формы), и `??` до группы просто не дошёл бы.\nconst resolvedDisabled = computed(() => isDisabled.value || Boolean(group?.disabled.value))\n\n// `role=\"group\"` не поддерживает `aria-required` и `aria-readonly` — объявлять\n// обязательность и режим чтения группы обязаны сами чекбоксы.\nconst isRequired = computed(() => fieldRequired.value || Boolean(group?.required.value))\n\nconst isReadonly = computed(() => fieldReadonly.value || Boolean(group?.readonly.value))\n\n// Ошибка группы красит чекбоксы, но не объявляется на каждом из них: `aria-invalid`\n// уже висит на самой группе, и дублировать его на всех пунктах — значит заставить\n// диктор повторить «неверное значение» столько раз, сколько в группе чекбоксов.\nconst isInvalid = computed(() => fieldInvalid.value)\nconst showsInvalid = computed(() => isInvalid.value || Boolean(group?.invalid.value))\n\nconst labelledBy = computed(() => {\n if (props.ariaLabel) return undefined\n if (hasLabel.value) return labelId\n return fieldLabelId.value\n})\n\n// Эффективный размер: локальный проп → группа → `GrConfigProvider` → `md`.\nconst resolvedSize = useGrComponentSize(\n () => props.size ?? group?.size.value,\n { component: 'GrCheckbox' },\n)\n\nconst rootClassName = computed(() => grCheckboxRootClass({\n size: resolvedSize.value,\n disabled: resolvedDisabled.value,\n labelPosition: props.labelPosition,\n}))\n\nconst controlClassName = computed(() => grCheckboxControlClass({\n size: resolvedSize.value,\n active: checked.value || props.indeterminate,\n disabled: resolvedDisabled.value,\n invalid: showsInvalid.value,\n}))\n\nconst indeterminateIconClassName = computed(() => grCheckboxIndeterminateIconClass(resolvedSize.value))\n\nconst checkIconClassName = computed(() => grCheckboxCheckIconClass({\n size: resolvedSize.value,\n checked: checked.value,\n}))\n\nconst labelClassName = computed(() => grCheckboxLabelClass(resolvedSize.value))\n\n// Держим `.checked` на нативном input синхронно с состоянием — `:checked`-биндинг\n// на скрытом элементе иногда отстаёт при программных обновлениях.\nconst nativeInput = ref<HTMLInputElement | null>(null)\nconst control = ref<HTMLElement | null>(null)\nwatch(\n checked,\n (value) => {\n if (nativeInput.value && nativeInput.value.checked !== value)\n nativeInput.value.checked = value\n },\n)\n\n// `indeterminate` можно выставить только через JS-свойство (не атрибут).\nfunction syncIndeterminate(): void {\n if (nativeInput.value)\n nativeInput.value.indeterminate = props.indeterminate\n}\nwatch(() => props.indeterminate, syncIndeterminate)\nonMounted(syncIndeterminate)\n\nfunction setChecked(next: boolean): void {\n if (resolvedDisabled.value || isReadonly.value) {\n // Нативный input мог уже переключиться от клика по внешнему `<label for>` —\n // возвращаем его к состоянию модели, иначе форма отправит непринятое значение.\n if (nativeInput.value)\n nativeInput.value.checked = checked.value\n return\n }\n\n if (props.modelValue !== undefined || !group) {\n emit('update:modelValue', next)\n emit('change', next)\n return\n }\n\n group.toggle(props.value, next)\n emit('change', next)\n}\n\nfunction toggle(): void {\n // Из промежуточного состояния переключаемся во «включено» (стандартное поведение).\n setChecked(props.indeterminate ? true : !checked.value)\n}\n\n// Клик по нативному input (в т.ч. по внешнему `<label for=\"...\">`) уже переключил его\n// `.checked` — берём значение как источник истины и эмитим модель.\nfunction onNativeChange(e: Event): void {\n setChecked((e.target as HTMLInputElement).checked)\n}\n\n// `<label for>` уводит фокус на скрытый input — визуально фокус пропадает. Возвращаем\n// его на контрол, который этот фокус и показывает.\nfunction onNativeFocus(): void {\n control.value?.focus()\n}\n\nfunction focus(): void {\n control.value?.focus()\n}\n\nfunction blur(): void {\n control.value?.blur()\n}\n\ndefineExpose({ focus, blur })\n\n// Подпись держится снаружи роли-виджета именно для того, чтобы могла содержать\n// ссылки и кнопки, — поэтому клик по её интерактивному содержимому чекбокс не\n// переключает. Вложенный `<label>` считается интерактивным: он адресует\n// собственный контрол, и переключение чекбокса «заодно» было бы сюрпризом.\nfunction isInteractiveTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el)\n return false\n return !!el.closest('a,button,input,select,textarea,label,[role=\"button\"],[role=\"link\"]')\n}\n\nfunction onClick(e: MouseEvent): void {\n if (isInteractiveTarget(e.target))\n return\n toggle()\n}\n</script>\n<template>\n <div\n data-gr-checkbox\n :class=\"rootClassName\"\n @click=\"onClick\"\n >\n <input\n :id=\"id\"\n ref=\"nativeInput\"\n type=\"checkbox\"\n :checked=\"checked\"\n :disabled=\"resolvedDisabled\"\n :name=\"resolvedName\"\n :value=\"value\"\n :form=\"form\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :style=\"hiddenInputStyle\"\n @change=\"onNativeChange\"\n @focus=\"onNativeFocus\"\n >\n <span\n :id=\"fieldControlId\"\n ref=\"control\"\n data-gr-checkbox-indicator\n role=\"checkbox\"\n :aria-checked=\"indeterminate ? 'mixed' : (checked ? 'true' : 'false')\"\n :aria-disabled=\"resolvedDisabled ? 'true' : undefined\"\n :aria-required=\"isRequired ? 'true' : undefined\"\n :aria-readonly=\"isReadonly ? 'true' : undefined\"\n :aria-invalid=\"isInvalid ? 'true' : undefined\"\n :aria-describedby=\"describedBy\"\n :aria-label=\"ariaLabel\"\n :aria-labelledby=\"labelledBy\"\n :tabindex=\"resolvedDisabled ? -1 : 0\"\n :class=\"controlClassName\"\n @keydown.space.prevent=\"toggle\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n >\n <IconMinus\n v-if=\"indeterminate\"\n :class=\"indeterminateIconClassName\"\n />\n <IconCheck\n v-else\n :class=\"checkIconClassName\"\n />\n </span>\n <span\n v-if=\"hasLabel\"\n :id=\"labelId\"\n :class=\"labelClassName\"\n >\n <slot />\n </span>\n </div>\n</template>\n"],"mappings":";;;;;;;AAqBA,IAAa,4BAAkE,OAAO,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EC4DjH,MAAM,mBAAmB;GACvB,UAAU;GACV,SAAS;GACT,OAAO;GACP,QAAQ;GACR,eAAe;EACjB;EAEA,MAAM,QAAQ;EAgBd,MAAM,OAAO;EAOb,MAAM,QAAQ,SAAS;EAEvB,MAAM,UAAU,MAAM;EACtB,MAAM,WAAW,eAAe,QAAQ,MAAM,OAAO,CAAC;EAEtD,MAAM,QAAQ,OAAO,2BAA2B,IAAI;EAEpD,MAAM,UAAU,eAAe;GAC7B,IAAI,MAAM,eAAe,KAAA,GACvB,OAAO,MAAM;GAEf,IAAI,OACF,OAAO,MAAM,WAAW,MAAM,SAAS,MAAM,KAAK;GAEpD,OAAO;EACT,CAAC;EAED,MAAM,eAAe,eAAe,MAAM,QAAQ,OAAO,KAAK,KAAK;EAMnE,MAAM,EACJ,UAAU,YACV,IAAI,gBACJ,SAAS,cACT,aACA,SAAS,cACT,UAAU,eACV,UAAU,kBACR,uBAAuB,KAAK;EAIhC,MAAM,mBAAmB,eAAe,WAAW,SAAS,QAAQ,OAAO,SAAS,KAAK,CAAC;EAI1F,MAAM,aAAa,eAAe,cAAc,SAAS,QAAQ,OAAO,SAAS,KAAK,CAAC;EAEvF,MAAM,aAAa,eAAe,cAAc,SAAS,QAAQ,OAAO,SAAS,KAAK,CAAC;EAKvF,MAAM,YAAY,eAAe,aAAa,KAAK;EACnD,MAAM,eAAe,eAAe,UAAU,SAAS,QAAQ,OAAO,QAAQ,KAAK,CAAC;EAEpF,MAAM,aAAa,eAAe;GAChC,IAAI,MAAM,WAAW,OAAO,KAAA;GAC5B,IAAI,SAAS,OAAO,OAAO;GAC3B,OAAO,aAAa;EACtB,CAAC;EAGD,MAAM,eAAe,yBACb,MAAM,QAAQ,OAAO,KAAK,OAChC,EAAE,WAAW,aAAa,CAC5B;EAEA,MAAM,gBAAgB,eAAe,oBAAoB;GACvD,MAAM,aAAa;GACnB,UAAU,iBAAiB;GAC3B,eAAe,MAAM;EACvB,CAAC,CAAC;EAEF,MAAM,mBAAmB,eAAe,uBAAuB;GAC7D,MAAM,aAAa;GACnB,QAAQ,QAAQ,SAAS,MAAM;GAC/B,UAAU,iBAAiB;GAC3B,SAAS,aAAa;EACxB,CAAC,CAAC;EAEF,MAAM,6BAA6B,eAAe,iCAAiC,aAAa,KAAK,CAAC;EAEtG,MAAM,qBAAqB,eAAe,yBAAyB;GACjE,MAAM,aAAa;GACnB,SAAS,QAAQ;EACnB,CAAC,CAAC;EAEF,MAAM,iBAAiB,eAAe,qBAAqB,aAAa,KAAK,CAAC;EAI9E,MAAM,cAAc,IAA6B,IAAI;EACrD,MAAM,UAAU,IAAwB,IAAI;EAC5C,MACE,UACC,UAAU;GACT,IAAI,YAAY,SAAS,YAAY,MAAM,YAAY,OACrD,YAAY,MAAM,UAAU;EAChC,CACF;EAGA,SAAS,oBAA0B;GACjC,IAAI,YAAY,OACd,YAAY,MAAM,gBAAgB,MAAM;EAC5C;EACA,YAAY,MAAM,eAAe,iBAAiB;EAClD,UAAU,iBAAiB;EAE3B,SAAS,WAAW,MAAqB;GACvC,IAAI,iBAAiB,SAAS,WAAW,OAAO;IAG9C,IAAI,YAAY,OACd,YAAY,MAAM,UAAU,QAAQ;IACtC;GACF;GAEA,IAAI,MAAM,eAAe,KAAA,KAAa,CAAC,OAAO;IAC5C,KAAK,qBAAqB,IAAI;IAC9B,KAAK,UAAU,IAAI;IACnB;GACF;GAEA,MAAM,OAAO,MAAM,OAAO,IAAI;GAC9B,KAAK,UAAU,IAAI;EACrB;EAEA,SAAS,SAAe;GAEtB,WAAW,MAAM,gBAAgB,OAAO,CAAC,QAAQ,KAAK;EACxD;EAIA,SAAS,eAAe,GAAgB;GACtC,WAAY,EAAE,OAA4B,OAAO;EACnD;EAIA,SAAS,gBAAsB;GAC7B,QAAQ,OAAO,MAAM;EACvB;EAEA,SAAS,QAAc;GACrB,QAAQ,OAAO,MAAM;EACvB;EAEA,SAAS,OAAa;GACpB,QAAQ,OAAO,KAAK;EACtB;EAEA,SAAa;GAAE;GAAO;EAAK,CAAC;EAM5B,SAAS,oBAAoB,QAAqC;GAChE,MAAM,KAAK;GACX,IAAI,CAAC,IACH,OAAO;GACT,OAAO,CAAC,CAAC,GAAG,QAAQ,wEAAoE;EAC1F;EAEA,SAAS,QAAQ,GAAqB;GACpC,IAAI,oBAAoB,EAAE,MAAM,GAC9B;GACF,OAAO;EACT;;uBAGE,mBAuDM,OAAA;IAtDJ,oBAAA;IACC,OAAK,eAAE,cAAA,KAAa;IACb;;IAER,mBAcC,SAAA;KAbE,IAAI,QAAA;cACD;KAAJ,KAAI;KACJ,MAAK;KACJ,SAAS,QAAA;KACT,UAAU,iBAAA;KACV,MAAM,aAAA;KACN,OAAO,QAAA;KACP,MAAM,QAAA;KACP,UAAS;KACT,eAAY;KACX,OAAO;KACP,UAAQ;KACR,SAAO;;IAEV,mBA2BO,QAAA;KA1BJ,IAAI,MAAA,cAAA;cACD;KAAJ,KAAI;KACJ,8BAAA;KACA,MAAK;KACJ,gBAAc,QAAA,gBAAa,UAAc,QAAA,QAAO,SAAA;KAChD,iBAAe,iBAAA,QAAgB,SAAY,KAAA;KAC3C,iBAAe,WAAA,QAAU,SAAY,KAAA;KACrC,iBAAe,WAAA,QAAU,SAAY,KAAA;KACrC,gBAAc,UAAA,QAAS,SAAY,KAAA;KACnC,oBAAkB,MAAA,WAAA;KAClB,cAAY,QAAA;KACZ,mBAAiB,WAAA;KACjB,UAAU,iBAAA,QAAgB,KAAA;KAC1B,OAAK,eAAE,iBAAA,KAAgB;KACvB,WAAO,SAAA,cAAgB,QAAM,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;KAC7B,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAU,MAAM;KAC3B,QAAI,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,QAAS,MAAM;QAGlB,QAAA,iBAAA,UAAA,GADR,YAGE,MAAA,aAAA,GAAA;;KADC,OAAK,eAAE,2BAAA,KAA0B;4CAEpC,YAGE,MAAA,aAAA,GAAA;;KADC,OAAK,eAAE,mBAAA,KAAkB;;IAItB,SAAA,SAAA,UAAA,GADR,mBAMO,QAAA;;KAJJ,IAAI,MAAA,OAAA;KACJ,OAAK,eAAE,eAAA,KAAc;QAEtB,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,IAAA,UAAA,KAAA,mBAAA,IAAA,IAAA"}
|
|
1
|
+
{"version":3,"file":"GrCheckbox-CEcHIsXM.js","names":[],"sources":["../../../../src/components/GrCheckbox/grCheckboxGroupContext.ts","../../../../src/components/GrCheckbox/GrCheckbox.vue","../../../../src/components/GrCheckbox/GrCheckbox.vue"],"sourcesContent":["import type { ComputedRef, InjectionKey } from 'vue'\n\nimport type { GrCheckboxSize } from './grCheckboxStyles'\n\nexport type GrCheckboxGroupContext = {\n /** Выбранные значения группы. Чекбокс сравнивает с ними свой `value`. */\n modelValue: ComputedRef<string[]>\n name: ComputedRef<string | undefined>\n disabled: ComputedRef<boolean>\n readonly: ComputedRef<boolean>\n invalid: ComputedRef<boolean>\n /**\n * Обязательность группы объявляют её чекбоксы: `role=\"group\"` не поддерживает\n * `aria-required` (axe: `aria-allowed-attr`), а `role=\"checkbox\"` — да.\n */\n required: ComputedRef<boolean>\n size: ComputedRef<GrCheckboxSize>\n /** Добавляет или убирает значение из выбранных. */\n toggle: (value: string, checked: boolean) => void\n}\n\nexport const GR_CHECKBOX_GROUP_CONTEXT: InjectionKey<GrCheckboxGroupContext> = Symbol('GR_CHECKBOX_GROUP_CONTEXT')\n","<script setup lang=\"ts\">\n/**\n * GrCheckbox — GR-примитив чекбокса с нативным скрытым `<input type=\"checkbox\">`\n * для интеграции с HTML-формами (`FormData`, `form`).\n *\n * Источник истины — нативный input: клик по нему (в т.ч. по внешнему\n * `<label for=\"...\">`) слушается через `@change` и эмитит модель. Клик по видимой\n * части компонента переключает через корневой обработчик.\n *\n * Клавиатура: `Space` переключает значение (Enter — намеренно нет, это нестандартно\n * для чекбоксов). Фокус — на самом контроле (квадратике), как у нативного чекбокса.\n *\n * A11y: `role=\"checkbox\"` + `aria-checked` (`true`/`false`/`mixed`) + `aria-disabled`.\n * Роль висит **только на контроле**, а не на всей строке с подписью — по двум причинам:\n * - роль объявляет своих потомков презентационными, поэтому ни нативный input, ни\n * интерактивная подпись (ссылка на политику, кнопка «показать изменения») не могут\n * жить внутри: скринридер теряет их, axe падает на `nested-interactive`;\n * - имя виджета берётся из подписи через `aria-labelledby`, что и позволяет держать\n * её снаружи вместе со всем её интерактивным содержимым.\n *\n * `required` объявляется только через `aria-required`, на скрытый input он не уходит.\n * Нативная проверка потребовала бы фокуса на невалидном контроле, а он невидим и\n * `aria-hidden` — Chrome в таком случае молча отменяет сабмит всей формы\n * («An invalid form control … is not focusable»). Обязательность проверяет\n * `GrForm` правилом `required` — см. `docs/components/GrCheckbox.md`.\n *\n * Внутри `GrCheckboxGroup` значение приходит из группы: свой `modelValue` не\n * задаётся, а `value` сравнивается с массивом выбранных.\n */\nimport { computed, inject, onMounted, ref, useId, useSlots, watch } from 'vue'\nimport IconCheck from '~icons/lucide/check'\nimport IconMinus from '~icons/lucide/minus'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrFormControl } from '../../composables/useGrFormControl'\n\nimport { GR_CHECKBOX_GROUP_CONTEXT } from './grCheckboxGroupContext'\nimport {\n grCheckboxCheckIconClass,\n grCheckboxControlClass,\n grCheckboxIndeterminateIconClass,\n grCheckboxLabelClass,\n grCheckboxRootClass,\n type GrCheckboxLabelPosition,\n type GrCheckboxSize,\n} from './grCheckboxStyles'\n\nexport type { GrCheckboxLabelPosition, GrCheckboxSize } from './grCheckboxStyles'\n\nexport interface GrCheckboxProps {\n /** Не задан внутри `GrCheckboxGroup` — состояние берётся из группы. */\n modelValue?: boolean\n disabled?: boolean\n name?: string\n value?: string\n /** Обязательное поле: объявляется как `aria-required`, нативной проверки нет. */\n required?: boolean\n /** Только для чтения: состояние видно, но не переключается. */\n readonly?: boolean\n /** Визуальное и ARIA-состояние ошибки. */\n invalid?: boolean\n form?: string\n /** Пробрасывается на скрытый нативный `<input>`, чтобы работал `<label for=\"...\">`. */\n id?: string\n /** Промежуточное («смешанное») состояние: `aria-checked=\"mixed\"`, индикатор — тире. */\n indeterminate?: boolean\n /** Имя контрола, когда подписи в слоте нет (или она чисто визуальная). */\n ariaLabel?: string\n /** Сторона подписи относительно контрола. */\n labelPosition?: GrCheckboxLabelPosition\n /** Размер контрола. Не задан — берётся из группы, затем из `GrConfigProvider`, иначе `md`. */\n size?: GrCheckboxSize\n}\n\nexport interface GrCheckboxEmits {\n (e: 'update:modelValue', value: boolean): void\n (e: 'change', value: boolean): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nconst hiddenInputStyle = {\n position: 'absolute',\n opacity: '0',\n width: '0',\n height: '0',\n pointerEvents: 'none',\n} as const\n\nconst props = withDefaults(defineProps<GrCheckboxProps>(), {\n modelValue: undefined,\n disabled: undefined,\n name: undefined,\n value: 'on',\n required: false,\n readonly: false,\n invalid: false,\n form: undefined,\n id: undefined,\n indeterminate: false,\n ariaLabel: undefined,\n labelPosition: 'end',\n size: undefined,\n})\n\nconst emit = defineEmits<GrCheckboxEmits>()\ndefineSlots<{\n /** Подпись флажка. Может содержать ссылки: роль остаётся на самом контроле. */\n default?: () => any\n}>()\n\n\nconst slots = useSlots()\n\nconst labelId = useId()\nconst hasLabel = computed(() => Boolean(slots.default))\n\nconst group = inject(GR_CHECKBOX_GROUP_CONTEXT, null)\n\nconst checked = computed(() => {\n if (props.modelValue !== undefined)\n return props.modelValue\n\n if (group)\n return group.modelValue.value.includes(props.value)\n\n return false\n})\n\nconst resolvedName = computed(() => props.name ?? group?.name.value)\n\n// Контекст `GrFormField`. Id поля вешается на `span[role=\"checkbox\"]` — именно он\n// виджет и держит фокус; на скрытом `aria-hidden`-инпуте он был бы бесполезен\n// (клик по подписи уводил бы фокус в невидимый элемент). Роль-виджет не является\n// labelable-элементом, поэтому имя от подписи поля приходит через `aria-labelledby`.\nconst {\n disabled: isDisabled,\n id: fieldControlId,\n labelId: fieldLabelId,\n describedBy,\n invalid: fieldInvalid,\n required: fieldRequired,\n readonly: fieldReadonly,\n} = useGrFormControl(() => props)\n\n// «Или», а не `??`: `isDisabled` уже сведён к булеву (свой проп + контекст\n// поля и формы), и `??` до группы просто не дошёл бы.\nconst resolvedDisabled = computed(() => isDisabled.value || Boolean(group?.disabled.value))\n\n// `role=\"group\"` не поддерживает `aria-required` и `aria-readonly` — объявлять\n// обязательность и режим чтения группы обязаны сами чекбоксы.\nconst isRequired = computed(() => fieldRequired.value || Boolean(group?.required.value))\n\nconst isReadonly = computed(() => fieldReadonly.value || Boolean(group?.readonly.value))\n\n// Ошибка группы красит чекбоксы, но не объявляется на каждом из них: `aria-invalid`\n// уже висит на самой группе, и дублировать его на всех пунктах — значит заставить\n// диктор повторить «неверное значение» столько раз, сколько в группе чекбоксов.\nconst isInvalid = computed(() => fieldInvalid.value)\nconst showsInvalid = computed(() => isInvalid.value || Boolean(group?.invalid.value))\n\nconst labelledBy = computed(() => {\n if (props.ariaLabel) return undefined\n if (hasLabel.value) return labelId\n return fieldLabelId.value\n})\n\n// Эффективный размер: локальный проп → группа → `GrConfigProvider` → `md`.\nconst resolvedSize = useGrComponentSize(\n () => props.size ?? group?.size.value,\n { component: 'GrCheckbox' },\n)\n\nconst rootClassName = computed(() => grCheckboxRootClass({\n size: resolvedSize.value,\n disabled: resolvedDisabled.value,\n labelPosition: props.labelPosition,\n}))\n\nconst controlClassName = computed(() => grCheckboxControlClass({\n size: resolvedSize.value,\n active: checked.value || props.indeterminate,\n disabled: resolvedDisabled.value,\n invalid: showsInvalid.value,\n}))\n\nconst indeterminateIconClassName = computed(() => grCheckboxIndeterminateIconClass(resolvedSize.value))\n\nconst checkIconClassName = computed(() => grCheckboxCheckIconClass({\n size: resolvedSize.value,\n checked: checked.value,\n}))\n\nconst labelClassName = computed(() => grCheckboxLabelClass(resolvedSize.value))\n\n// Держим `.checked` на нативном input синхронно с состоянием — `:checked`-биндинг\n// на скрытом элементе иногда отстаёт при программных обновлениях.\nconst nativeInput = ref<HTMLInputElement | null>(null)\nconst control = ref<HTMLElement | null>(null)\nwatch(\n checked,\n (value) => {\n if (nativeInput.value && nativeInput.value.checked !== value)\n nativeInput.value.checked = value\n },\n)\n\n// `indeterminate` можно выставить только через JS-свойство (не атрибут).\nfunction syncIndeterminate(): void {\n if (nativeInput.value)\n nativeInput.value.indeterminate = props.indeterminate\n}\nwatch(() => props.indeterminate, syncIndeterminate)\nonMounted(syncIndeterminate)\n\nfunction setChecked(next: boolean): void {\n if (resolvedDisabled.value || isReadonly.value) {\n // Нативный input мог уже переключиться от клика по внешнему `<label for>` —\n // возвращаем его к состоянию модели, иначе форма отправит непринятое значение.\n if (nativeInput.value)\n nativeInput.value.checked = checked.value\n return\n }\n\n if (props.modelValue !== undefined || !group) {\n emit('update:modelValue', next)\n emit('change', next)\n return\n }\n\n group.toggle(props.value, next)\n emit('change', next)\n}\n\nfunction toggle(): void {\n // Из промежуточного состояния переключаемся во «включено» (стандартное поведение).\n setChecked(props.indeterminate ? true : !checked.value)\n}\n\n// Клик по нативному input (в т.ч. по внешнему `<label for=\"...\">`) уже переключил его\n// `.checked` — берём значение как источник истины и эмитим модель.\nfunction onNativeChange(e: Event): void {\n setChecked((e.target as HTMLInputElement).checked)\n}\n\n// `<label for>` уводит фокус на скрытый input — визуально фокус пропадает. Возвращаем\n// его на контрол, который этот фокус и показывает.\nfunction onNativeFocus(): void {\n control.value?.focus()\n}\n\nfunction focus(): void {\n control.value?.focus()\n}\n\nfunction blur(): void {\n control.value?.blur()\n}\n\ndefineExpose({ focus, blur })\n\n// Подпись держится снаружи роли-виджета именно для того, чтобы могла содержать\n// ссылки и кнопки, — поэтому клик по её интерактивному содержимому чекбокс не\n// переключает. Вложенный `<label>` считается интерактивным: он адресует\n// собственный контрол, и переключение чекбокса «заодно» было бы сюрпризом.\nfunction isInteractiveTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el)\n return false\n return !!el.closest('a,button,input,select,textarea,label,[role=\"button\"],[role=\"link\"]')\n}\n\nfunction onClick(e: MouseEvent): void {\n if (isInteractiveTarget(e.target))\n return\n toggle()\n}\n</script>\n<template>\n <div\n data-gr-checkbox\n :class=\"rootClassName\"\n @click=\"onClick\"\n >\n <input\n :id=\"id\"\n ref=\"nativeInput\"\n type=\"checkbox\"\n :checked=\"checked\"\n :disabled=\"resolvedDisabled\"\n :name=\"resolvedName\"\n :value=\"value\"\n :form=\"form\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :style=\"hiddenInputStyle\"\n @change=\"onNativeChange\"\n @focus=\"onNativeFocus\"\n >\n <span\n :id=\"fieldControlId\"\n ref=\"control\"\n data-gr-checkbox-indicator\n role=\"checkbox\"\n :aria-checked=\"indeterminate ? 'mixed' : (checked ? 'true' : 'false')\"\n :aria-disabled=\"resolvedDisabled ? 'true' : undefined\"\n :aria-required=\"isRequired ? 'true' : undefined\"\n :aria-readonly=\"isReadonly ? 'true' : undefined\"\n :aria-invalid=\"isInvalid ? 'true' : undefined\"\n :aria-describedby=\"describedBy\"\n :aria-label=\"ariaLabel\"\n :aria-labelledby=\"labelledBy\"\n :tabindex=\"resolvedDisabled ? -1 : 0\"\n :class=\"controlClassName\"\n @keydown.space.prevent=\"toggle\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n >\n <IconMinus\n v-if=\"indeterminate\"\n :class=\"indeterminateIconClassName\"\n />\n <IconCheck\n v-else\n :class=\"checkIconClassName\"\n />\n </span>\n <span\n v-if=\"hasLabel\"\n :id=\"labelId\"\n :class=\"labelClassName\"\n >\n <slot />\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * GrCheckbox — GR-примитив чекбокса с нативным скрытым `<input type=\"checkbox\">`\n * для интеграции с HTML-формами (`FormData`, `form`).\n *\n * Источник истины — нативный input: клик по нему (в т.ч. по внешнему\n * `<label for=\"...\">`) слушается через `@change` и эмитит модель. Клик по видимой\n * части компонента переключает через корневой обработчик.\n *\n * Клавиатура: `Space` переключает значение (Enter — намеренно нет, это нестандартно\n * для чекбоксов). Фокус — на самом контроле (квадратике), как у нативного чекбокса.\n *\n * A11y: `role=\"checkbox\"` + `aria-checked` (`true`/`false`/`mixed`) + `aria-disabled`.\n * Роль висит **только на контроле**, а не на всей строке с подписью — по двум причинам:\n * - роль объявляет своих потомков презентационными, поэтому ни нативный input, ни\n * интерактивная подпись (ссылка на политику, кнопка «показать изменения») не могут\n * жить внутри: скринридер теряет их, axe падает на `nested-interactive`;\n * - имя виджета берётся из подписи через `aria-labelledby`, что и позволяет держать\n * её снаружи вместе со всем её интерактивным содержимым.\n *\n * `required` объявляется только через `aria-required`, на скрытый input он не уходит.\n * Нативная проверка потребовала бы фокуса на невалидном контроле, а он невидим и\n * `aria-hidden` — Chrome в таком случае молча отменяет сабмит всей формы\n * («An invalid form control … is not focusable»). Обязательность проверяет\n * `GrForm` правилом `required` — см. `docs/components/GrCheckbox.md`.\n *\n * Внутри `GrCheckboxGroup` значение приходит из группы: свой `modelValue` не\n * задаётся, а `value` сравнивается с массивом выбранных.\n */\nimport { computed, inject, onMounted, ref, useId, useSlots, watch } from 'vue'\nimport IconCheck from '~icons/lucide/check'\nimport IconMinus from '~icons/lucide/minus'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrFormControl } from '../../composables/useGrFormControl'\n\nimport { GR_CHECKBOX_GROUP_CONTEXT } from './grCheckboxGroupContext'\nimport {\n grCheckboxCheckIconClass,\n grCheckboxControlClass,\n grCheckboxIndeterminateIconClass,\n grCheckboxLabelClass,\n grCheckboxRootClass,\n type GrCheckboxLabelPosition,\n type GrCheckboxSize,\n} from './grCheckboxStyles'\n\nexport type { GrCheckboxLabelPosition, GrCheckboxSize } from './grCheckboxStyles'\n\nexport interface GrCheckboxProps {\n /** Не задан внутри `GrCheckboxGroup` — состояние берётся из группы. */\n modelValue?: boolean\n disabled?: boolean\n name?: string\n value?: string\n /** Обязательное поле: объявляется как `aria-required`, нативной проверки нет. */\n required?: boolean\n /** Только для чтения: состояние видно, но не переключается. */\n readonly?: boolean\n /** Визуальное и ARIA-состояние ошибки. */\n invalid?: boolean\n form?: string\n /** Пробрасывается на скрытый нативный `<input>`, чтобы работал `<label for=\"...\">`. */\n id?: string\n /** Промежуточное («смешанное») состояние: `aria-checked=\"mixed\"`, индикатор — тире. */\n indeterminate?: boolean\n /** Имя контрола, когда подписи в слоте нет (или она чисто визуальная). */\n ariaLabel?: string\n /** Сторона подписи относительно контрола. */\n labelPosition?: GrCheckboxLabelPosition\n /** Размер контрола. Не задан — берётся из группы, затем из `GrConfigProvider`, иначе `md`. */\n size?: GrCheckboxSize\n}\n\nexport interface GrCheckboxEmits {\n (e: 'update:modelValue', value: boolean): void\n (e: 'change', value: boolean): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nconst hiddenInputStyle = {\n position: 'absolute',\n opacity: '0',\n width: '0',\n height: '0',\n pointerEvents: 'none',\n} as const\n\nconst props = withDefaults(defineProps<GrCheckboxProps>(), {\n modelValue: undefined,\n disabled: undefined,\n name: undefined,\n value: 'on',\n required: false,\n readonly: false,\n invalid: false,\n form: undefined,\n id: undefined,\n indeterminate: false,\n ariaLabel: undefined,\n labelPosition: 'end',\n size: undefined,\n})\n\nconst emit = defineEmits<GrCheckboxEmits>()\ndefineSlots<{\n /** Подпись флажка. Может содержать ссылки: роль остаётся на самом контроле. */\n default?: () => any\n}>()\n\n\nconst slots = useSlots()\n\nconst labelId = useId()\nconst hasLabel = computed(() => Boolean(slots.default))\n\nconst group = inject(GR_CHECKBOX_GROUP_CONTEXT, null)\n\nconst checked = computed(() => {\n if (props.modelValue !== undefined)\n return props.modelValue\n\n if (group)\n return group.modelValue.value.includes(props.value)\n\n return false\n})\n\nconst resolvedName = computed(() => props.name ?? group?.name.value)\n\n// Контекст `GrFormField`. Id поля вешается на `span[role=\"checkbox\"]` — именно он\n// виджет и держит фокус; на скрытом `aria-hidden`-инпуте он был бы бесполезен\n// (клик по подписи уводил бы фокус в невидимый элемент). Роль-виджет не является\n// labelable-элементом, поэтому имя от подписи поля приходит через `aria-labelledby`.\nconst {\n disabled: isDisabled,\n id: fieldControlId,\n labelId: fieldLabelId,\n describedBy,\n invalid: fieldInvalid,\n required: fieldRequired,\n readonly: fieldReadonly,\n} = useGrFormControl(() => props)\n\n// «Или», а не `??`: `isDisabled` уже сведён к булеву (свой проп + контекст\n// поля и формы), и `??` до группы просто не дошёл бы.\nconst resolvedDisabled = computed(() => isDisabled.value || Boolean(group?.disabled.value))\n\n// `role=\"group\"` не поддерживает `aria-required` и `aria-readonly` — объявлять\n// обязательность и режим чтения группы обязаны сами чекбоксы.\nconst isRequired = computed(() => fieldRequired.value || Boolean(group?.required.value))\n\nconst isReadonly = computed(() => fieldReadonly.value || Boolean(group?.readonly.value))\n\n// Ошибка группы красит чекбоксы, но не объявляется на каждом из них: `aria-invalid`\n// уже висит на самой группе, и дублировать его на всех пунктах — значит заставить\n// диктор повторить «неверное значение» столько раз, сколько в группе чекбоксов.\nconst isInvalid = computed(() => fieldInvalid.value)\nconst showsInvalid = computed(() => isInvalid.value || Boolean(group?.invalid.value))\n\nconst labelledBy = computed(() => {\n if (props.ariaLabel) return undefined\n if (hasLabel.value) return labelId\n return fieldLabelId.value\n})\n\n// Эффективный размер: локальный проп → группа → `GrConfigProvider` → `md`.\nconst resolvedSize = useGrComponentSize(\n () => props.size ?? group?.size.value,\n { component: 'GrCheckbox' },\n)\n\nconst rootClassName = computed(() => grCheckboxRootClass({\n size: resolvedSize.value,\n disabled: resolvedDisabled.value,\n labelPosition: props.labelPosition,\n}))\n\nconst controlClassName = computed(() => grCheckboxControlClass({\n size: resolvedSize.value,\n active: checked.value || props.indeterminate,\n disabled: resolvedDisabled.value,\n invalid: showsInvalid.value,\n}))\n\nconst indeterminateIconClassName = computed(() => grCheckboxIndeterminateIconClass(resolvedSize.value))\n\nconst checkIconClassName = computed(() => grCheckboxCheckIconClass({\n size: resolvedSize.value,\n checked: checked.value,\n}))\n\nconst labelClassName = computed(() => grCheckboxLabelClass(resolvedSize.value))\n\n// Держим `.checked` на нативном input синхронно с состоянием — `:checked`-биндинг\n// на скрытом элементе иногда отстаёт при программных обновлениях.\nconst nativeInput = ref<HTMLInputElement | null>(null)\nconst control = ref<HTMLElement | null>(null)\nwatch(\n checked,\n (value) => {\n if (nativeInput.value && nativeInput.value.checked !== value)\n nativeInput.value.checked = value\n },\n)\n\n// `indeterminate` можно выставить только через JS-свойство (не атрибут).\nfunction syncIndeterminate(): void {\n if (nativeInput.value)\n nativeInput.value.indeterminate = props.indeterminate\n}\nwatch(() => props.indeterminate, syncIndeterminate)\nonMounted(syncIndeterminate)\n\nfunction setChecked(next: boolean): void {\n if (resolvedDisabled.value || isReadonly.value) {\n // Нативный input мог уже переключиться от клика по внешнему `<label for>` —\n // возвращаем его к состоянию модели, иначе форма отправит непринятое значение.\n if (nativeInput.value)\n nativeInput.value.checked = checked.value\n return\n }\n\n if (props.modelValue !== undefined || !group) {\n emit('update:modelValue', next)\n emit('change', next)\n return\n }\n\n group.toggle(props.value, next)\n emit('change', next)\n}\n\nfunction toggle(): void {\n // Из промежуточного состояния переключаемся во «включено» (стандартное поведение).\n setChecked(props.indeterminate ? true : !checked.value)\n}\n\n// Клик по нативному input (в т.ч. по внешнему `<label for=\"...\">`) уже переключил его\n// `.checked` — берём значение как источник истины и эмитим модель.\nfunction onNativeChange(e: Event): void {\n setChecked((e.target as HTMLInputElement).checked)\n}\n\n// `<label for>` уводит фокус на скрытый input — визуально фокус пропадает. Возвращаем\n// его на контрол, который этот фокус и показывает.\nfunction onNativeFocus(): void {\n control.value?.focus()\n}\n\nfunction focus(): void {\n control.value?.focus()\n}\n\nfunction blur(): void {\n control.value?.blur()\n}\n\ndefineExpose({ focus, blur })\n\n// Подпись держится снаружи роли-виджета именно для того, чтобы могла содержать\n// ссылки и кнопки, — поэтому клик по её интерактивному содержимому чекбокс не\n// переключает. Вложенный `<label>` считается интерактивным: он адресует\n// собственный контрол, и переключение чекбокса «заодно» было бы сюрпризом.\nfunction isInteractiveTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el)\n return false\n return !!el.closest('a,button,input,select,textarea,label,[role=\"button\"],[role=\"link\"]')\n}\n\nfunction onClick(e: MouseEvent): void {\n if (isInteractiveTarget(e.target))\n return\n toggle()\n}\n</script>\n<template>\n <div\n data-gr-checkbox\n :class=\"rootClassName\"\n @click=\"onClick\"\n >\n <input\n :id=\"id\"\n ref=\"nativeInput\"\n type=\"checkbox\"\n :checked=\"checked\"\n :disabled=\"resolvedDisabled\"\n :name=\"resolvedName\"\n :value=\"value\"\n :form=\"form\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :style=\"hiddenInputStyle\"\n @change=\"onNativeChange\"\n @focus=\"onNativeFocus\"\n >\n <span\n :id=\"fieldControlId\"\n ref=\"control\"\n data-gr-checkbox-indicator\n role=\"checkbox\"\n :aria-checked=\"indeterminate ? 'mixed' : (checked ? 'true' : 'false')\"\n :aria-disabled=\"resolvedDisabled ? 'true' : undefined\"\n :aria-required=\"isRequired ? 'true' : undefined\"\n :aria-readonly=\"isReadonly ? 'true' : undefined\"\n :aria-invalid=\"isInvalid ? 'true' : undefined\"\n :aria-describedby=\"describedBy\"\n :aria-label=\"ariaLabel\"\n :aria-labelledby=\"labelledBy\"\n :tabindex=\"resolvedDisabled ? -1 : 0\"\n :class=\"controlClassName\"\n @keydown.space.prevent=\"toggle\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n >\n <IconMinus\n v-if=\"indeterminate\"\n :class=\"indeterminateIconClassName\"\n />\n <IconCheck\n v-else\n :class=\"checkIconClassName\"\n />\n </span>\n <span\n v-if=\"hasLabel\"\n :id=\"labelId\"\n :class=\"labelClassName\"\n >\n <slot />\n </span>\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { t as GrCheckbox_default } from "./chunks/GrCheckbox-CEcHIsXM.js";
|
|
2
2
|
import { n as grCheckboxSafelist, t as grCheckboxConfig } from "../../chunks/config-esdviAPL.js";
|
|
3
|
-
export {
|
|
3
|
+
export { GrCheckbox_default as GrCheckbox, GrCheckbox_default as default, grCheckboxConfig, grCheckboxSafelist };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as useGrComponentSize } from "../../../chunks/context-CTbuwcYs.js";
|
|
2
2
|
import { useGrFormControl } from "../../../composables/useGrFormControl.js";
|
|
3
3
|
import { t as useFocusWithin } from "../../../chunks/useFocusWithin-BwHE0rzm.js";
|
|
4
|
-
import { n as GR_CHECKBOX_GROUP_CONTEXT, t as GrCheckbox_default } from "../../GrCheckbox/chunks/GrCheckbox-
|
|
4
|
+
import { n as GR_CHECKBOX_GROUP_CONTEXT, t as GrCheckbox_default } from "../../GrCheckbox/chunks/GrCheckbox-CEcHIsXM.js";
|
|
5
5
|
import { Fragment, computed, createBlock, createElementBlock, createTextVNode, defineComponent, normalizeClass, openBlock, provide, ref, renderList, renderSlot, toDisplayString, unref, withCtx } from "vue";
|
|
6
6
|
//#region src/components/GrCheckboxGroup/GrCheckboxGroup.vue?vue&type=script&setup=true&lang.ts
|
|
7
7
|
var _hoisted_1 = [
|