@feugene/granularity 0.48.0 → 0.50.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 +3 -3
- package/dist/chunks/chevron-up-BhW6hi8L.js +23 -0
- package/dist/chunks/chevron-up-BhW6hi8L.js.map +1 -0
- package/dist/chunks/{config-E1cTyRVV.js → config-8n1VR0ju.js} +1 -1
- package/dist/chunks/{config-E1cTyRVV.js.map → config-8n1VR0ju.js.map} +1 -1
- package/dist/chunks/{config-2vrOFn2f.js → config-AKpLyIGD.js} +2 -2
- package/dist/chunks/{config-2vrOFn2f.js.map → config-AKpLyIGD.js.map} +1 -1
- package/dist/chunks/{config-DIDz_E5m.js → config-B34mkd53.js} +66 -1
- package/dist/chunks/config-B34mkd53.js.map +1 -0
- package/dist/chunks/{config-B5SBUa6u.js → config-B7qZqiUB.js} +28 -1
- package/dist/chunks/config-B7qZqiUB.js.map +1 -0
- package/dist/chunks/config-BBrPUEye.js +8 -0
- package/dist/chunks/config-BBrPUEye.js.map +1 -0
- package/dist/chunks/config-BBtBQE3s.js +108 -0
- package/dist/chunks/config-BBtBQE3s.js.map +1 -0
- package/dist/chunks/{config-CT4lP6S4.js → config-BOCzHqWh.js} +2 -2
- package/dist/chunks/{config-CT4lP6S4.js.map → config-BOCzHqWh.js.map} +1 -1
- package/dist/chunks/{config-iemgzS4x.js → config-BP1ktzwh.js} +2 -24
- package/dist/chunks/config-BP1ktzwh.js.map +1 -0
- package/dist/chunks/config-BTxmdRzT.js +28 -0
- package/dist/chunks/config-BTxmdRzT.js.map +1 -0
- package/dist/chunks/{config-CjWOTgLL.js → config-Bk52xd5l.js} +12 -5
- package/dist/chunks/config-Bk52xd5l.js.map +1 -0
- package/dist/chunks/{config-D3HOuHDe.js → config-C3SqBqSQ.js} +3 -1
- package/dist/chunks/config-C3SqBqSQ.js.map +1 -0
- package/dist/chunks/{config-2ZHRsdOc.js → config-C3uqd-sW.js} +1 -1
- package/dist/chunks/config-C3uqd-sW.js.map +1 -0
- package/dist/chunks/{config-BXRmsn3t.js → config-CPhcZzHi.js} +72 -10
- package/dist/chunks/config-CPhcZzHi.js.map +1 -0
- package/dist/chunks/config-CWtfxkM9.js.map +1 -1
- package/dist/chunks/{config--t2dxj0t.js → config-CmLTCmY9.js} +2 -2
- package/dist/chunks/{config--t2dxj0t.js.map → config-CmLTCmY9.js.map} +1 -1
- package/dist/chunks/{config-BAse0laT.js → config-CvtqB4ki.js} +8 -3
- package/dist/chunks/config-CvtqB4ki.js.map +1 -0
- package/dist/chunks/{config-BcXX7S7B.js → config-D-JgqV0J.js} +5 -1
- package/dist/chunks/{config-BcXX7S7B.js.map → config-D-JgqV0J.js.map} +1 -1
- package/dist/chunks/{config-BHLMTJaR.js → config-D1oVht-E.js} +8 -3
- package/dist/chunks/config-D1oVht-E.js.map +1 -0
- package/dist/chunks/{config-BscVxZR3.js → config-DF1ezU6y.js} +1 -1
- package/dist/chunks/{config-BscVxZR3.js.map → config-DF1ezU6y.js.map} +1 -1
- package/dist/chunks/{config-B42iJ48O.js → config-DG41PD9i.js} +13 -1
- package/dist/chunks/config-DG41PD9i.js.map +1 -0
- package/dist/chunks/{config-Bs1HwUcx.js → config-DPJ3jtiB.js} +12 -2
- package/dist/chunks/config-DPJ3jtiB.js.map +1 -0
- package/dist/chunks/{config-tNqtapcT.js → config-DpqjlCfB.js} +2 -2
- package/dist/chunks/{config-tNqtapcT.js.map → config-DpqjlCfB.js.map} +1 -1
- package/dist/chunks/{config-DNDgp9bB.js → config-DpzFoSIh.js} +64 -2
- package/dist/chunks/config-DpzFoSIh.js.map +1 -0
- package/dist/chunks/config-MUkhktTP.js +267 -0
- package/dist/chunks/config-MUkhktTP.js.map +1 -0
- package/dist/chunks/config-SPugeaHT.js +37 -0
- package/dist/chunks/config-SPugeaHT.js.map +1 -0
- package/dist/chunks/{en-Bxyn5lW7.js → en-mIFywnV2.js} +27 -7
- package/dist/chunks/en-mIFywnV2.js.map +1 -0
- package/dist/chunks/{es-Dtl-a7ui.js → es-CvthYwtB.js} +27 -7
- package/dist/chunks/es-CvthYwtB.js.map +1 -0
- package/dist/chunks/{es-Bj_vc18Z.js → es-DlGd6Mrj.js} +3 -3
- package/dist/chunks/{es-Bj_vc18Z.js.map → es-DlGd6Mrj.js.map} +1 -1
- package/dist/chunks/{generated-hELWB0gZ.js → generated-Cx4C7GRN.js} +126 -0
- package/dist/chunks/{generated-hELWB0gZ.js.map → generated-Cx4C7GRN.js.map} +1 -1
- package/dist/chunks/{grBadgeStyles-DV0DrAew.js → grBadgeStyles-D51AXbj5.js} +57 -1
- package/dist/chunks/grBadgeStyles-D51AXbj5.js.map +1 -0
- package/dist/chunks/{grChipStyles-DcDyxAL0.js → grChipStyles-CA9Wj1_E.js} +1 -1
- package/dist/chunks/{grChipStyles-DcDyxAL0.js.map → grChipStyles-CA9Wj1_E.js.map} +1 -1
- package/dist/chunks/{grPopoverStyles-CYAeO3Ov.js → grPopoverStyles-CncEkiPu.js} +1 -1
- package/dist/chunks/{grPopoverStyles-CYAeO3Ov.js.map → grPopoverStyles-CncEkiPu.js.map} +1 -1
- package/dist/chunks/{grSelectStyles-D9EQ-pgK.js → grSelectStyles-Cam-IG9s.js} +3 -2
- package/dist/chunks/grSelectStyles-Cam-IG9s.js.map +1 -0
- package/dist/chunks/{grSliderStyles-kaz6VXZ3.js → grSliderStyles-CqzV0hll.js} +1 -1
- package/dist/chunks/grSliderStyles-CqzV0hll.js.map +1 -0
- package/dist/chunks/{config-CbEbLyDE.js → grSortableListStyles-CxieDmpe.js} +1 -27
- package/dist/chunks/grSortableListStyles-CxieDmpe.js.map +1 -0
- package/dist/chunks/grTableStyles-CPSxDTOW.js +66 -0
- package/dist/chunks/grTableStyles-CPSxDTOW.js.map +1 -0
- package/dist/chunks/{config-CMNfZO7S.js → grTabsStyles-DIz2VdIm.js} +1 -36
- package/dist/chunks/grTabsStyles-DIz2VdIm.js.map +1 -0
- package/dist/chunks/grTooltipStyles-CtbGEEGV.js +24 -0
- package/dist/chunks/grTooltipStyles-CtbGEEGV.js.map +1 -0
- package/dist/chunks/{granular-provider-BOQp7N5o.js → granular-provider-cv5vaM1a.js} +26 -22
- package/dist/chunks/granular-provider-cv5vaM1a.js.map +1 -0
- package/dist/chunks/hotkeySequence-BTHIM_5A.js +46 -0
- package/dist/chunks/hotkeySequence-BTHIM_5A.js.map +1 -0
- package/dist/chunks/{keyboard-DE2yhz_b.js → keyboard-BiFSgWLt.js} +70 -1
- package/dist/chunks/keyboard-BiFSgWLt.js.map +1 -0
- package/dist/chunks/optionPanel-DvY7Tv_4.js +182 -0
- package/dist/chunks/optionPanel-DvY7Tv_4.js.map +1 -0
- package/dist/chunks/overlayListPanel-D91jBCHU.js +21 -0
- package/dist/chunks/overlayListPanel-D91jBCHU.js.map +1 -0
- package/dist/chunks/{overlayStack-DH4Z7am1.js → overlayStack-DCkCgXZP.js} +1 -1
- package/dist/chunks/{overlayStack-DH4Z7am1.js.map → overlayStack-DCkCgXZP.js.map} +1 -1
- package/dist/chunks/{overlayPanelSurface-BKeMhRx4.js → overlayTransition-C0FDMx7Q.js} +24 -24
- package/dist/chunks/overlayTransition-C0FDMx7Q.js.map +1 -0
- package/dist/chunks/{ru-hrB4I1u_.js → ru-CQKDR-kD.js} +27 -7
- package/dist/chunks/ru-CQKDR-kD.js.map +1 -0
- package/dist/chunks/{safelist-x8USecK8.js → safelist-CSfynUC1.js} +5 -1
- package/dist/chunks/safelist-CSfynUC1.js.map +1 -0
- package/dist/chunks/{useMenuItemsFocus-B7Bl_aFA.js → useMenuItemsFocus-C031blYS.js} +1 -1
- package/dist/chunks/{useMenuItemsFocus-B7Bl_aFA.js.map → useMenuItemsFocus-C031blYS.js.map} +1 -1
- package/dist/chunks/{useModalOverlay-ACRkflzx.js → useModalOverlay-CKCQkGdB.js} +1 -1
- package/dist/chunks/{useModalOverlay-ACRkflzx.js.map → useModalOverlay-CKCQkGdB.js.map} +1 -1
- package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-C-uovdv8.js → GrAutocomplete-Cyr1-ENw.js} +183 -125
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-Cyr1-ENw.js.map +1 -0
- package/dist/components/GrAutocomplete/index.js +2 -2
- package/dist/components/GrAutocomplete/styles.css +1 -1
- package/dist/components/GrBadge/chunks/GrBadge-C42KLyUD.js +71 -0
- package/dist/components/GrBadge/chunks/GrBadge-C42KLyUD.js.map +1 -0
- package/dist/components/GrBadge/index.js +3 -3
- package/dist/components/GrBadge/styles.css +1 -1
- package/dist/components/GrCarousel/chunks/{GrCarousel-ByuughtI.js → GrCarousel-CBj-PEPB.js} +186 -37
- package/dist/components/GrCarousel/chunks/GrCarousel-CBj-PEPB.js.map +1 -0
- package/dist/components/GrCarousel/index.js +2 -2
- package/dist/components/GrCarousel/styles.css +1 -1
- package/dist/components/GrCheckbox/chunks/{GrCheckbox-Dp201frb.js → GrCheckbox-B4NJc7Ur.js} +2 -1
- package/dist/components/GrCheckbox/chunks/GrCheckbox-B4NJc7Ur.js.map +1 -0
- package/dist/components/GrCheckbox/index.js +1 -1
- package/dist/components/GrCheckboxGroup/chunks/{GrCheckboxGroup-IpqG5qwm.js → GrCheckboxGroup-qZHpNFCX.js} +1 -1
- package/dist/components/GrCheckboxGroup/chunks/{GrCheckboxGroup-IpqG5qwm.js.map → GrCheckboxGroup-qZHpNFCX.js.map} +1 -1
- package/dist/components/GrCheckboxGroup/index.js +1 -1
- package/dist/components/GrChip/chunks/{GrChip-CKqyzYcv.js → GrChip-DoyS1Dr4.js} +1 -1
- package/dist/components/GrChip/chunks/{GrChip-CKqyzYcv.js.map → GrChip-DoyS1Dr4.js.map} +1 -1
- package/dist/components/GrChip/index.js +2 -2
- package/dist/components/GrColorPicker/chunks/{GrColorPicker-BRM_4lyI.js → GrColorPicker-vGSgpUV9.js} +353 -38
- package/dist/components/GrColorPicker/chunks/GrColorPicker-vGSgpUV9.js.map +1 -0
- package/dist/components/GrColorPicker/index.js +2 -2
- package/dist/components/GrColorPicker/styles.css +1 -1
- package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-BJHmkDQv.js → GrCommandPalette-CAHgj0Aa.js} +23 -7
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-CAHgj0Aa.js.map +1 -0
- package/dist/components/GrCommandPalette/index.js +1 -1
- package/dist/components/GrCommandPalette/styles.css +1 -1
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-BzUQwbec.js → GrConfirmDialog-dg021BMd.js} +1 -1
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-BzUQwbec.js.map → GrConfirmDialog-dg021BMd.js.map} +1 -1
- package/dist/components/GrConfirmDialog/index.js +1 -1
- package/dist/components/GrContextMenu/chunks/{GrContextMenu-RpxMHQXH.js → GrContextMenu-bQ1Vvy2c.js} +3 -3
- package/dist/components/GrContextMenu/chunks/{GrContextMenu-RpxMHQXH.js.map → GrContextMenu-bQ1Vvy2c.js.map} +1 -1
- package/dist/components/GrContextMenu/index.js +1 -1
- package/dist/components/GrDataTable/chunks/{GrDataTable-DQxYYgQk.js → GrDataTable-Bb2jWnRG.js} +576 -136
- package/dist/components/GrDataTable/chunks/GrDataTable-Bb2jWnRG.js.map +1 -0
- package/dist/components/GrDataTable/index.js +2 -2
- package/dist/components/GrDelta/chunks/{GrDelta-CgTvfoIN.js → GrDelta-BSv1KdMy.js} +0 -0
- package/dist/components/GrDelta/chunks/{GrDelta-CgTvfoIN.js.map → GrDelta-BSv1KdMy.js.map} +1 -1
- package/dist/components/GrDelta/index.js +2 -2
- package/dist/components/GrDialog/chunks/{GrDialog-DDz_OEhk.js → GrDialog-C9Zu72jB.js} +1 -1
- package/dist/components/GrDialog/chunks/{GrDialog-DDz_OEhk.js.map → GrDialog-C9Zu72jB.js.map} +1 -1
- package/dist/components/GrDialog/index.js +1 -1
- package/dist/components/GrDialogService/chunks/{GrDialogService-Dtq0ZCN5.js → GrDialogService-DLBifO61.js} +2 -2
- package/dist/components/GrDialogService/chunks/{GrDialogService-Dtq0ZCN5.js.map → GrDialogService-DLBifO61.js.map} +1 -1
- package/dist/components/GrDialogService/index.js +1 -1
- package/dist/components/GrDrawer/chunks/{GrDrawer-CNpSMuN-.js → GrDrawer-DOcRTE8G.js} +1 -1
- package/dist/components/GrDrawer/chunks/{GrDrawer-CNpSMuN-.js.map → GrDrawer-DOcRTE8G.js.map} +1 -1
- package/dist/components/GrDrawer/index.js +1 -1
- package/dist/components/GrDropdown/chunks/{GrDropdown-cLZuZMEY.js → GrDropdown-kxwmgfSe.js} +2 -2
- package/dist/components/GrDropdown/chunks/{GrDropdown-cLZuZMEY.js.map → GrDropdown-kxwmgfSe.js.map} +1 -1
- package/dist/components/GrDropdown/index.js +2 -2
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-Dxkz_ry4.js → GrDropdownMenu--VoK3VY0.js} +3 -34
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu--VoK3VY0.js.map +1 -0
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-CkM3BFPL.js +34 -0
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-CkM3BFPL.js.map +1 -0
- package/dist/components/GrDropdownMenu/index.js +2 -1
- package/dist/components/GrEmptyState/chunks/{GrEmptyState-BbvwE-E0.js → GrEmptyState-Bz6-_ED4.js} +42 -6
- package/dist/components/GrEmptyState/chunks/GrEmptyState-Bz6-_ED4.js.map +1 -0
- package/dist/components/GrEmptyState/index.js +1 -1
- package/dist/components/GrFileUpload/chunks/{GrFileUpload-BwMR71zN.js → GrFileUpload-Bgdfnkd8.js} +5 -2
- package/dist/components/GrFileUpload/chunks/GrFileUpload-Bgdfnkd8.js.map +1 -0
- package/dist/components/GrFileUpload/index.js +1 -1
- package/dist/components/GrFormFile/chunks/{GrFormFile-Dlxx-9zi.js → GrFormFile-Ctq1isz-.js} +78 -11
- package/dist/components/GrFormFile/chunks/GrFormFile-Ctq1isz-.js.map +1 -0
- package/dist/components/GrFormFile/index.js +2 -2
- package/dist/components/GrFormFile/styles.css +1 -1
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-DK-iVHHC.js → GrImageViewer-Bnql_dNP.js} +1 -1
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-DK-iVHHC.js.map → GrImageViewer-Bnql_dNP.js.map} +1 -1
- package/dist/components/GrImageViewer/index.js +1 -1
- package/dist/components/GrInput/chunks/{GrInput-DV4gMWPR.js → GrInput-CoaFLpaU.js} +43 -22
- package/dist/components/GrInput/chunks/GrInput-CoaFLpaU.js.map +1 -0
- package/dist/components/GrInput/index.js +1 -1
- package/dist/components/GrInputTag/chunks/{GrInputTag-CO0YU-ok.js → GrInputTag-BzzNRBe3.js} +247 -20
- package/dist/components/GrInputTag/chunks/GrInputTag-BzzNRBe3.js.map +1 -0
- package/dist/components/GrInputTag/index.js +2 -2
- package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-D7CyWzhT.js → GrJsonViewer-B6ZJ3GFH.js} +2 -2
- package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-D7CyWzhT.js.map → GrJsonViewer-B6ZJ3GFH.js.map} +1 -1
- package/dist/components/GrJsonViewer/index.js +1 -1
- package/dist/components/GrKbd/chunks/{GrKbd-BNMeoaLV.js → GrKbd-D2rHDkQv.js} +42 -37
- package/dist/components/GrKbd/chunks/GrKbd-D2rHDkQv.js.map +1 -0
- package/dist/components/GrKbd/index.js +1 -1
- package/dist/components/GrModal/chunks/{GrModal-Cm0mtSXk.js → GrModal-SHb1U2qx.js} +1 -1
- package/dist/components/GrModal/chunks/{GrModal-Cm0mtSXk.js.map → GrModal-SHb1U2qx.js.map} +1 -1
- package/dist/components/GrModal/index.js +1 -1
- package/dist/components/GrNavbar/chunks/{GrNavbar-BRGuksiy.js → GrNavbar-IEIHC5Vt.js} +10 -4
- package/dist/components/GrNavbar/chunks/GrNavbar-IEIHC5Vt.js.map +1 -0
- package/dist/components/GrNavbar/index.js +2 -2
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-BI6-vkcs.js → GrNumberInput-CmnUDaKi.js} +2 -22
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-BI6-vkcs.js.map → GrNumberInput-CmnUDaKi.js.map} +1 -1
- package/dist/components/GrNumberInput/index.js +1 -1
- package/dist/components/GrOtpInput/chunks/GrOtpInput-B_Q-RDLw.js +419 -0
- package/dist/components/GrOtpInput/chunks/GrOtpInput-B_Q-RDLw.js.map +1 -0
- package/dist/components/GrOtpInput/index.js +3 -0
- package/dist/components/GrOtpInput/styles.css +1 -0
- package/dist/components/GrPagination/chunks/{GrPagination-BbaF5eXk.js → GrPagination-AMbn5D8I.js} +1 -1
- package/dist/components/GrPagination/chunks/{GrPagination-BbaF5eXk.js.map → GrPagination-AMbn5D8I.js.map} +1 -1
- package/dist/components/GrPagination/index.js +1 -1
- package/dist/components/GrPopover/chunks/{GrPopover-CcWvr1ZA.js → GrPopover-DjVxt8bf.js} +3 -3
- package/dist/components/GrPopover/chunks/{GrPopover-CcWvr1ZA.js.map → GrPopover-DjVxt8bf.js.map} +1 -1
- package/dist/components/GrPopover/index.js +2 -2
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-BEL-QgwE.js → GrPromptDialog-BhbIZP1f.js} +3 -3
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-BEL-QgwE.js.map → GrPromptDialog-BhbIZP1f.js.map} +1 -1
- package/dist/components/GrPromptDialog/index.js +1 -1
- package/dist/components/GrSelect/chunks/{GrSelect-0iI4wdR_.js → GrSelect-B-ykrHpL.js} +26 -182
- package/dist/components/GrSelect/chunks/GrSelect-B-ykrHpL.js.map +1 -0
- package/dist/components/GrSelect/index.js +2 -2
- package/dist/components/GrSelect/styles.css +1 -1
- package/dist/components/GrSidebar/chunks/GrSidebar-jVvoLGDO.js +543 -0
- package/dist/components/GrSidebar/chunks/GrSidebar-jVvoLGDO.js.map +1 -0
- package/dist/components/GrSidebar/index.js +2 -2
- package/dist/components/GrSlider/chunks/{GrSlider-CO8N9SF6.js → GrSlider-DF2Cq0rV.js} +29 -4
- package/dist/components/GrSlider/chunks/GrSlider-DF2Cq0rV.js.map +1 -0
- package/dist/components/GrSlider/index.js +2 -2
- package/dist/components/GrSortableList/chunks/{GrSortableList-NKriuGm_.js → GrSortableList-ChH9nQBv.js} +1 -1
- package/dist/components/GrSortableList/chunks/{GrSortableList-NKriuGm_.js.map → GrSortableList-ChH9nQBv.js.map} +1 -1
- package/dist/components/GrSortableList/index.js +2 -2
- package/dist/components/GrSwitch/chunks/{GrSwitch-CriHWT2A.js → GrSwitch-D7X42uIA.js} +61 -7
- package/dist/components/GrSwitch/chunks/GrSwitch-D7X42uIA.js.map +1 -0
- package/dist/components/GrSwitch/index.js +2 -2
- package/dist/components/GrTabPanels/chunks/GrTabPanels-BDt5oVdd.js +30 -0
- package/dist/components/GrTabPanels/chunks/GrTabPanels-BDt5oVdd.js.map +1 -0
- package/dist/components/GrTabPanels/chunks/GrTabPanels-BJvAflnA.js +83 -0
- package/dist/components/GrTabPanels/chunks/GrTabPanels-BJvAflnA.js.map +1 -0
- package/dist/components/GrTabPanels/index.js +2 -1
- package/dist/components/GrTable/chunks/{GrTable-CKJ-HrsN.js → GrTable-BQitSDep.js} +52 -16
- package/dist/components/GrTable/chunks/GrTable-BQitSDep.js.map +1 -0
- package/dist/components/GrTable/index.js +2 -2
- package/dist/components/GrTabs/chunks/{GrTabs-s9RzC1WX.js → GrTabs-DVC6nfWB.js} +1 -1
- package/dist/components/GrTabs/chunks/{GrTabs-s9RzC1WX.js.map → GrTabs-DVC6nfWB.js.map} +1 -1
- package/dist/components/GrTabs/index.js +2 -2
- package/dist/components/GrTabsWithPanels/chunks/GrTabsWithPanels-BYtuzouj.js +98 -0
- package/dist/components/GrTabsWithPanels/chunks/GrTabsWithPanels-BYtuzouj.js.map +1 -0
- package/dist/components/GrTabsWithPanels/index.js +3 -0
- package/dist/components/GrTextarea/chunks/{GrTextarea-Bfgc0DD2.js → GrTextarea-BFwyqcHB.js} +22 -5
- package/dist/components/GrTextarea/chunks/GrTextarea-BFwyqcHB.js.map +1 -0
- package/dist/components/GrTextarea/index.js +1 -1
- package/dist/components/GrToaster/chunks/{GrToaster-CZixNk0l.js → GrToaster-OzT1VKcp.js} +163 -32
- package/dist/components/GrToaster/chunks/GrToaster-OzT1VKcp.js.map +1 -0
- package/dist/components/GrToaster/index.js +2 -2
- package/dist/components/GrToaster/styles.css +1 -1
- package/dist/components/GrTooltip/chunks/{GrTooltip-DkMMM0uq.js → GrTooltip-BDcFycvW.js} +26 -13
- package/dist/components/GrTooltip/chunks/GrTooltip-BDcFycvW.js.map +1 -0
- package/dist/components/GrTooltip/index.js +2 -2
- package/dist/components/GrTransfer/chunks/{GrTransfer-DdfBUf35.js → GrTransfer-CV7BL5UK.js} +114 -12
- package/dist/components/GrTransfer/chunks/GrTransfer-CV7BL5UK.js.map +1 -0
- package/dist/components/GrTransfer/index.js +1 -1
- package/dist/components/GrTransfer/styles.css +1 -1
- package/dist/components/GrTree/chunks/{GrTree-6yZrncJE.js → GrTree-DpgaP8hk.js} +39 -1
- package/dist/components/GrTree/chunks/GrTree-DpgaP8hk.js.map +1 -0
- package/dist/components/GrTree/index.js +1 -1
- package/dist/components/GrTree/styles.css +1 -1
- package/dist/components/GrTreeSections/chunks/{GrTreeSections-DcmDcLwj.js → GrTreeSections-BeOj__44.js} +1 -1
- package/dist/components/GrTreeSections/chunks/{GrTreeSections-DcmDcLwj.js.map → GrTreeSections-BeOj__44.js.map} +1 -1
- package/dist/components/GrTreeSections/index.js +1 -1
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-B6KoDYiZ.js → GrTreeSelect-BHq-T8wH.js} +113 -14
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-BHq-T8wH.js.map +1 -0
- package/dist/components/GrTreeSelect/index.js +2 -2
- package/dist/composables/useFloating.js +1 -1
- package/dist/composables/useHotkeys.js +89 -0
- package/dist/composables/useHotkeys.js.map +1 -0
- package/dist/composables/useOverlayLayer.js +1 -1
- package/dist/directives/hotkey.js +19 -46
- package/dist/directives/hotkey.js.map +1 -1
- package/dist/granular-provider-node.js +1 -1
- package/dist/granular-provider.js +1 -1
- package/dist/i18n/all.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/index.js +80 -71
- package/dist/theme.js +1 -1
- package/dist/tokens.js +1 -1
- package/dist/types/components/GrAutocomplete/GrAutocomplete.vue.d.ts +4 -4
- package/dist/types/components/GrAutocomplete/composables/useAutocompleteNavigation.d.ts +12 -3
- package/dist/types/components/GrAutocomplete/composables/useAutocompletePanel.d.ts +12 -2
- package/dist/types/components/GrAutocomplete/composables/useAutocompleteValues.d.ts +7 -4
- package/dist/types/components/GrAutocomplete/composables/useRemoteOptions.d.ts +4 -4
- package/dist/types/components/GrAutocomplete/grAutocompleteStyles.d.ts +15 -1
- package/dist/types/components/GrAutocomplete/index.d.ts +1 -1
- package/dist/types/components/GrBadge/GrBadge.vue.d.ts +15 -1
- package/dist/types/components/GrBadge/grBadgeStyles.d.ts +57 -0
- package/dist/types/components/GrBadge/index.d.ts +1 -1
- package/dist/types/components/GrCarousel/GrCarousel.vue.d.ts +29 -1
- package/dist/types/components/GrCarousel/composables/useCarouselSwipe.d.ts +5 -0
- package/dist/types/components/GrCarousel/grCarouselContext.d.ts +21 -0
- package/dist/types/components/GrCarousel/grCarouselStyles.d.ts +39 -9
- package/dist/types/components/GrCheckbox/GrCheckbox.vue.d.ts +13 -0
- package/dist/types/components/GrColorPicker/GrColorPicker.vue.d.ts +18 -2
- package/dist/types/components/GrColorPicker/color.d.ts +13 -1
- package/dist/types/components/GrColorPicker/colorArea.d.ts +59 -0
- package/dist/types/components/GrColorPicker/defaults.d.ts +3 -1
- package/dist/types/components/GrColorPicker/eyeDropper.d.ts +21 -0
- package/dist/types/components/GrColorPicker/grColorPickerStyles.d.ts +42 -0
- package/dist/types/components/GrCommandPalette/GrCommandPalette.vue.d.ts +10 -1
- package/dist/types/components/GrDataTable/GrDataTable.vue.d.ts +41 -1
- package/dist/types/components/GrDataTable/composables/useDataTableGridNavigation.d.ts +53 -0
- package/dist/types/components/GrDataTable/grDataTableStyles.d.ts +8 -0
- package/dist/types/components/GrDataTable/index.d.ts +1 -1
- package/dist/types/components/GrDelta/grDeltaStyles.d.ts +10 -3
- package/dist/types/components/GrEmptyState/GrEmptyState.vue.d.ts +11 -2
- package/dist/types/components/GrEmptyState/grEmptyStateStyles.d.ts +10 -0
- package/dist/types/components/GrEmptyState/index.d.ts +1 -1
- package/dist/types/components/GrFileUpload/GrFileUpload.vue.d.ts +2 -1
- package/dist/types/components/GrFormFile/GrFormFile.vue.d.ts +10 -0
- package/dist/types/components/GrInput/GrInput.vue.d.ts +15 -0
- package/dist/types/components/GrInputTag/GrInputTag.vue.d.ts +16 -0
- package/dist/types/components/GrInputTag/grInputTagStyles.d.ts +11 -0
- package/dist/types/components/GrKbd/GrKbd.vue.d.ts +14 -0
- package/dist/types/components/GrNavbar/GrNavbar.vue.d.ts +18 -0
- package/dist/types/components/GrNavbar/grNavbarStyles.d.ts +10 -1
- package/dist/types/components/GrNavbar/index.d.ts +1 -0
- package/dist/types/components/GrOtpInput/GrOtpInput.vue.d.ts +164 -0
- package/dist/types/components/GrOtpInput/config.d.ts +1 -0
- package/dist/types/components/GrOtpInput/defaults.d.ts +15 -0
- package/dist/types/components/GrOtpInput/grOtpInputStyles.d.ts +62 -0
- package/dist/types/components/GrOtpInput/index.d.ts +9 -0
- package/dist/types/components/GrOtpInput/otpValue.d.ts +71 -0
- package/dist/types/components/GrOtpInput/safelist.d.ts +7 -0
- package/dist/types/components/GrSelect/composables/useSelectPanelItems.d.ts +8 -34
- package/dist/types/components/GrSelect/composables/useSelectVirtualization.d.ts +7 -0
- package/dist/types/components/GrSelect/grSelectStyles.d.ts +1 -1
- package/dist/types/components/GrSidebar/GrSidebar.vue.d.ts +20 -0
- package/dist/types/components/GrSidebar/GrSidebarItem.vue.d.ts +39 -5
- package/dist/types/components/GrSidebar/grSidebarStyles.d.ts +32 -0
- package/dist/types/components/GrSidebar/index.d.ts +1 -1
- package/dist/types/components/GrSidebar/sidebarContext.d.ts +23 -1
- package/dist/types/components/GrSlider/GrSlider.vue.d.ts +39 -1
- package/dist/types/components/GrSlider/grSliderStyles.d.ts +1 -1
- package/dist/types/components/GrSwitch/GrSwitch.vue.d.ts +42 -4
- package/dist/types/components/GrSwitch/defaults.d.ts +2 -0
- package/dist/types/components/GrSwitch/grSwitchStyles.d.ts +129 -25
- package/dist/types/components/GrSwitch/index.d.ts +1 -1
- package/dist/types/components/GrSwitch/safelist.d.ts +4 -3
- package/dist/types/components/GrTabPanels/context.d.ts +6 -0
- package/dist/types/components/GrTable/GrTable.vue.d.ts +37 -0
- package/dist/types/components/GrTable/grTableStyles.d.ts +16 -7
- package/dist/types/components/GrTabsWithPanels/GrTabsWithPanels.vue.d.ts +77 -0
- package/dist/types/components/GrTabsWithPanels/config.d.ts +1 -0
- package/dist/types/components/GrTabsWithPanels/index.d.ts +4 -0
- package/dist/types/components/GrTextarea/GrTextarea.vue.d.ts +19 -1
- package/dist/types/components/GrToaster/GrToaster.vue.d.ts +12 -0
- package/dist/types/components/GrToaster/grToasterStyles.d.ts +26 -0
- package/dist/types/components/GrTooltip/GrTooltip.vue.d.ts +22 -0
- package/dist/types/components/GrTransfer/GrTransfer.vue.d.ts +23 -0
- package/dist/types/components/GrTreeSelect/grTreeSelectStyles.d.ts +1 -1
- package/dist/types/components/GrTreeSelect/grTreeSelectTypes.d.ts +20 -0
- package/dist/types/components/shared/hotkey.d.ts +8 -9
- package/dist/types/components/shared/optionPanel.d.ts +100 -0
- package/dist/types/components/shared/overlayListPanel.d.ts +18 -0
- package/dist/types/composables/useHotkeys.d.ts +43 -0
- package/dist/types/granular-provider/shared.d.ts +2 -0
- package/dist/types/i18n/messages/en.d.ts +32 -0
- package/dist/types/i18n/messages/es.d.ts +32 -0
- package/dist/types/i18n/messages/ru.d.ts +32 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/internal/hotkeySequence.d.ts +22 -0
- package/dist/types/internal/keyboard.d.ts +45 -0
- package/dist/web-types.json +784 -101
- package/package.json +13 -1
- package/dist/chunks/config-2ZHRsdOc.js.map +0 -1
- package/dist/chunks/config-B42iJ48O.js.map +0 -1
- package/dist/chunks/config-B5SBUa6u.js.map +0 -1
- package/dist/chunks/config-BAse0laT.js.map +0 -1
- package/dist/chunks/config-BHLMTJaR.js.map +0 -1
- package/dist/chunks/config-BXRmsn3t.js.map +0 -1
- package/dist/chunks/config-Bs1HwUcx.js.map +0 -1
- package/dist/chunks/config-CMNfZO7S.js.map +0 -1
- package/dist/chunks/config-CbEbLyDE.js.map +0 -1
- package/dist/chunks/config-CjWOTgLL.js.map +0 -1
- package/dist/chunks/config-D3HOuHDe.js.map +0 -1
- package/dist/chunks/config-DIDz_E5m.js.map +0 -1
- package/dist/chunks/config-DNDgp9bB.js.map +0 -1
- package/dist/chunks/config-Yy67uWHY.js +0 -140
- package/dist/chunks/config-Yy67uWHY.js.map +0 -1
- package/dist/chunks/config-iemgzS4x.js.map +0 -1
- package/dist/chunks/en-Bxyn5lW7.js.map +0 -1
- package/dist/chunks/es-Dtl-a7ui.js.map +0 -1
- package/dist/chunks/grBadgeStyles-DV0DrAew.js.map +0 -1
- package/dist/chunks/grSelectStyles-D9EQ-pgK.js.map +0 -1
- package/dist/chunks/grSliderStyles-kaz6VXZ3.js.map +0 -1
- package/dist/chunks/grTableStyles-DkQPMfx9.js +0 -39
- package/dist/chunks/grTableStyles-DkQPMfx9.js.map +0 -1
- package/dist/chunks/granular-provider-BOQp7N5o.js.map +0 -1
- package/dist/chunks/keyboard-DE2yhz_b.js.map +0 -1
- package/dist/chunks/overlayPanelSurface-BKeMhRx4.js.map +0 -1
- package/dist/chunks/ru-hrB4I1u_.js.map +0 -1
- package/dist/chunks/safelist-x8USecK8.js.map +0 -1
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-C-uovdv8.js.map +0 -1
- package/dist/components/GrBadge/chunks/GrBadge-DBeQXEir.js +0 -47
- package/dist/components/GrBadge/chunks/GrBadge-DBeQXEir.js.map +0 -1
- package/dist/components/GrCarousel/chunks/GrCarousel-ByuughtI.js.map +0 -1
- package/dist/components/GrCheckbox/chunks/GrCheckbox-Dp201frb.js.map +0 -1
- package/dist/components/GrColorPicker/chunks/GrColorPicker-BRM_4lyI.js.map +0 -1
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-BJHmkDQv.js.map +0 -1
- package/dist/components/GrDataTable/chunks/GrDataTable-DQxYYgQk.js.map +0 -1
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-Dxkz_ry4.js.map +0 -1
- package/dist/components/GrEmptyState/chunks/GrEmptyState-BbvwE-E0.js.map +0 -1
- package/dist/components/GrFileUpload/chunks/GrFileUpload-BwMR71zN.js.map +0 -1
- package/dist/components/GrFormFile/chunks/GrFormFile-Dlxx-9zi.js.map +0 -1
- package/dist/components/GrInput/chunks/GrInput-DV4gMWPR.js.map +0 -1
- package/dist/components/GrInputTag/chunks/GrInputTag-CO0YU-ok.js.map +0 -1
- package/dist/components/GrKbd/chunks/GrKbd-BNMeoaLV.js.map +0 -1
- package/dist/components/GrNavbar/chunks/GrNavbar-BRGuksiy.js.map +0 -1
- package/dist/components/GrSelect/chunks/GrSelect-0iI4wdR_.js.map +0 -1
- package/dist/components/GrSidebar/chunks/GrSidebar-DoKLlHSw.js +0 -264
- package/dist/components/GrSidebar/chunks/GrSidebar-DoKLlHSw.js.map +0 -1
- package/dist/components/GrSlider/chunks/GrSlider-CO8N9SF6.js.map +0 -1
- package/dist/components/GrSwitch/chunks/GrSwitch-CriHWT2A.js.map +0 -1
- package/dist/components/GrTabPanels/chunks/GrTabPanels-5zsbqS1v.js +0 -92
- package/dist/components/GrTabPanels/chunks/GrTabPanels-5zsbqS1v.js.map +0 -1
- package/dist/components/GrTable/chunks/GrTable-CKJ-HrsN.js.map +0 -1
- package/dist/components/GrTextarea/chunks/GrTextarea-Bfgc0DD2.js.map +0 -1
- package/dist/components/GrToaster/chunks/GrToaster-CZixNk0l.js.map +0 -1
- package/dist/components/GrTooltip/chunks/GrTooltip-DkMMM0uq.js.map +0 -1
- package/dist/components/GrTransfer/chunks/GrTransfer-DdfBUf35.js.map +0 -1
- package/dist/components/GrTree/chunks/GrTree-6yZrncJE.js.map +0 -1
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-B6KoDYiZ.js.map +0 -1
- package/dist/types/components/GrAutocomplete/composables/useAutocompleteVirtual.d.ts +0 -33
|
@@ -78,5 +78,61 @@ function grBadgeClass(options) {
|
|
|
78
78
|
toneClass(options.tone, options.dark)
|
|
79
79
|
].join(" ");
|
|
80
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Точка-маркер перед подписью.
|
|
83
|
+
*
|
|
84
|
+
* Кружок мельче иконки и растёт медленнее: маркер обязан оставаться маркером,
|
|
85
|
+
* а не превращаться в третий элемент строки. Повтор значений на концах шкалы —
|
|
86
|
+
* тот же приём, что у `badgeIconSizeClassBySize`.
|
|
87
|
+
*/
|
|
88
|
+
var badgeDotSizeClassBySize = {
|
|
89
|
+
xs: "h-1.5 w-1.5",
|
|
90
|
+
sm: "h-1.5 w-1.5",
|
|
91
|
+
md: "h-2 w-2",
|
|
92
|
+
lg: "h-2 w-2"
|
|
93
|
+
};
|
|
94
|
+
/** Маркер не жмётся: подпись бейджа не переносится, сжиматься нечему. */
|
|
95
|
+
var badgeDotClass = "shrink-0 rounded-[var(--gr-radius-full)]";
|
|
96
|
+
/**
|
|
97
|
+
* Маркер на мягкой подложке красится **тем же покомпонентным слоем**, что и
|
|
98
|
+
* заливка filled-бейджа, и это не экономия на токенах.
|
|
99
|
+
*
|
|
100
|
+
* Роль тона напрямую здесь не работает ни в одном виде, и обе ветки измерены:
|
|
101
|
+
* `--gr-{tone}` в светлой теме — яркая заливка под тёмный текст, как маркер она
|
|
102
|
+
* не берёт 3:1 **ни на одной** подложке (`success` 2.06–2.32, `warning`
|
|
103
|
+
* 2.27–2.56); `--gr-{tone}-solid` берёт светлую тему и заваливает тёмную
|
|
104
|
+
* (до 1.37). Слой `--gr-badge-{tone}-bg` как раз и означает «насыщенный вес,
|
|
105
|
+
* который читается в этой теме»: `-solid` в светлой, роль тона в тёмной.
|
|
106
|
+
*
|
|
107
|
+
* На нём проходят все 128 пар «тон маркера × тон бейджа × тема», включая
|
|
108
|
+
* одноимённую, — поэтому булев `dot` берёт тон самого бейджа, а не отдельный
|
|
109
|
+
* цвет. Гейт — `__tests__/grBadgeContrast.test.ts`.
|
|
110
|
+
*/
|
|
111
|
+
var badgeDotToneClass = {
|
|
112
|
+
neutral: "bg-[var(--gr-badge-neutral-bg)]",
|
|
113
|
+
primary: "bg-[var(--gr-badge-primary-bg)]",
|
|
114
|
+
success: "bg-[var(--gr-badge-success-bg)]",
|
|
115
|
+
warning: "bg-[var(--gr-badge-warning-bg)]",
|
|
116
|
+
danger: "bg-[var(--gr-badge-danger-bg)]",
|
|
117
|
+
info: "bg-[var(--gr-badge-info-bg)]",
|
|
118
|
+
slate: "bg-[var(--gr-badge-slate-bg)]",
|
|
119
|
+
azure: "bg-[var(--gr-badge-azure-bg)]"
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Маркер на **заливке** — цветом текста бейджа.
|
|
123
|
+
*
|
|
124
|
+
* Тон здесь не годится по построению: подложка filled-бейджа сама берётся из
|
|
125
|
+
* `--gr-badge-{tone}-bg`, и маркер того же тона слился бы с ней в один цвет.
|
|
126
|
+
* `currentColor` равен тексту бейджа, а он поверен на AA 4.5:1 — то есть
|
|
127
|
+
* заведомо проходит порог для графики.
|
|
128
|
+
*/
|
|
129
|
+
var badgeDotCurrentColorClass = "bg-[currentColor]";
|
|
130
|
+
function badgeDotClassFor(options) {
|
|
131
|
+
return [
|
|
132
|
+
badgeDotClass,
|
|
133
|
+
badgeDotSizeClassBySize[options.size],
|
|
134
|
+
options.dark ? badgeDotCurrentColorClass : badgeDotToneClass[options.tone]
|
|
135
|
+
].join(" ");
|
|
136
|
+
}
|
|
81
137
|
//#endregion
|
|
82
|
-
export {
|
|
138
|
+
export { badgeDotToneClass as a, darkToneClassByTone as c, radiusClass as d, semiRadiusClassBySize as f, badgeDotSizeClassBySize as i, grBadgeClass as l, toneClass as m, badgeDotClassFor as n, badgeIconClass as o, sizeClassBySize as p, badgeDotCurrentColorClass as r, badgeIconSizeClassBySize as s, badgeDotClass as t, lightToneClassByTone as u };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grBadgeStyles-D51AXbj5.js","names":[],"sources":["../../src/components/GrBadge/grBadgeStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { GrTone } from '../shared/tones'\n\nexport type GrBadgeTone = GrTone\n\n/**\n * Тон маркера — отдельным литеральным перечислением, а не `GrTone`.\n *\n * Компилятор SFC выводит рантайм-типы пропов из TypeScript, но `GrTone` это\n * `typeof GR_TONES[number]`, и развернуть его в конструкторы он не умеет. У\n * `dot?: GrTone | boolean` из объединения выживал один `Boolean`, и строковый\n * тон отбраковывался предупреждением Vue у каждого потребителя — при том, что\n * компонент работал. Литеральное объединение разрешается и даёт\n * `type: [Boolean, String]`; так же написан `showTooltip` у `GrSlider`.\n *\n * От расхождения с `GR_TONES` держит `assertDotToneCoversTones` ниже: списки\n * обязаны совпадать в обе стороны, иначе `vue-tsc` роняет сборку.\n */\nexport type GrBadgeDotTone = 'primary' | 'neutral' | 'success' | 'warning' | 'danger' | 'info' | 'slate' | 'azure'\n\ntype AssertMutual<A, B> = [A] extends [B] ? ([B] extends [A] ? true : never) : never\n\nexport const assertDotToneCoversTones: AssertMutual<GrBadgeDotTone, GrTone> = true\nexport type GrBadgeSize = GrComponentSize\nexport type GrBadgeRadius = 'square' | 'semi' | 'round'\nexport const sizeClassBySize: Record<GrBadgeSize, string> = {\n xs: 'px-2 py-0.4 text-[length:var(--gr-control-text-2xs)] leading-[var(--gr-control-leading-2xs)]',\n sm: 'px-2.5 py-0.5 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n md: 'px-3 py-1 text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n lg: 'px-3.5 py-1.5 text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n}\n/**\n * Иконка перед подписью растёт медленнее кегля: на нижних ступенях плашка\n * узкая, и иконка «один в один с текстом» разгоняла бы её по высоте.\n *\n * Своя карта, а не заимствованная у `GrChip`: у чипа фиксированная высота\n * плитки и своя шкала кегля, и совпадение значений на средних ступенях —\n * совпадение, а не общий контракт.\n */\nexport const badgeIconSizeClassBySize: Record<GrBadgeSize, string> = {\n xs: 'h-3 w-3',\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n lg: 'h-4 w-4',\n}\n\n/** Иконка не жмётся: подпись бейджа не переносится, сжиматься должно нечему. */\nexport const badgeIconClass = 'shrink-0'\n\nexport const semiRadiusClassBySize: Record<GrBadgeSize, string> = {\n xs: 'rounded-[var(--gr-badge-semi-radius-xs,3px)]',\n sm: 'rounded-[var(--gr-badge-semi-radius-sm,3px)]',\n md: 'rounded-[var(--gr-badge-semi-radius-md,5px)]',\n lg: 'rounded-[var(--gr-badge-semi-radius-lg,7px)]',\n}\nexport const lightToneClassByTone: Record<GrBadgeTone, string> = {\n neutral: 'bg-[var(--gr-muted)] text-[var(--gr-fg)] border-[var(--gr-brd)]',\n primary:\n 'bg-[var(--gr-accent)] text-[var(--gr-accent-fg)] border-[color-mix(in_srgb,var(--gr-primary)_30%,var(--gr-accent))]',\n // Текст на тонированной подложке — только `-text`, никогда не насыщенный тон:\n // `--gr-success` на `--gr-success-light` даёт 2.24:1, `-text` — 6.78:1.\n // slate/azure ниже уже были сделаны правильно.\n success: 'bg-[var(--gr-success-light)] text-[var(--gr-success-text)] border-[color-mix(in_srgb,var(--gr-success)_30%,var(--gr-success-light))]',\n warning: 'bg-[var(--gr-warning-light)] text-[var(--gr-warning-text)] border-[color-mix(in_srgb,var(--gr-warning)_30%,var(--gr-warning-light))]',\n danger: 'bg-[var(--gr-danger-light)] text-[var(--gr-danger-text)] border-[color-mix(in_srgb,var(--gr-danger)_30%,var(--gr-danger-light))]',\n info: 'bg-[var(--gr-info-light)] text-[var(--gr-info-text)] border-[color-mix(in_srgb,var(--gr-info)_30%,var(--gr-info-light))]',\n slate: 'bg-[var(--gr-slate-light)] text-[var(--gr-slate-text)] border-[color-mix(in_srgb,var(--gr-slate)_30%,var(--gr-slate-light))]',\n azure: 'bg-[var(--gr-azure-light)] text-[var(--gr-azure-text)] border-[color-mix(in_srgb,var(--gr-azure)_30%,var(--gr-azure-light))]',\n}\n/**\n * Заливка filled-бейджа идёт через покомпонентный слой `--gr-badge-{tone}-*`, а\n * не напрямую из роли тона, потому что нужный вес у тем разный.\n *\n * В светлой теме `--gr-{tone}` — это яркая заливка под **тёмный** текст (`-fg`\n * там обязан быть тёмным: белый на `--gr-success` даёт 2.54:1), и filled-бейдж\n * читался как тяжёлая почти чёрная плашка. Слой уводит его на `-solid`/`-solid-fg`\n * — заливку кнопочного веса под светлый текст, ту же, что у solid-кнопок.\n * В тёмной теме пастельная заливка с тёмным текстом — штатная конвенция, и слой\n * оставляет прежние роли. Значения — `themes/{light,dark}.css`.\n */\nexport const darkToneClassByTone: Record<GrBadgeTone, string> = {\n // Нейтральный вес — инверсия страницы, а не тон: `-solid`-роли у него нет.\n neutral: 'bg-[var(--gr-badge-neutral-bg,var(--gr-fg))] text-[var(--gr-badge-neutral-fg,var(--gr-bg))] border-[color-mix(in_srgb,var(--gr-fg)_35%,var(--gr-brd))]',\n primary: 'bg-[var(--gr-badge-primary-bg,var(--gr-primary-solid))] text-[var(--gr-badge-primary-fg,var(--gr-primary-solid-fg))] border-[var(--gr-badge-primary-bg,var(--gr-primary-solid))]',\n success: 'bg-[var(--gr-badge-success-bg,var(--gr-success-solid))] text-[var(--gr-badge-success-fg,var(--gr-success-solid-fg))] border-[var(--gr-badge-success-bg,var(--gr-success-solid))]',\n warning: 'bg-[var(--gr-badge-warning-bg,var(--gr-warning-solid))] text-[var(--gr-badge-warning-fg,var(--gr-warning-solid-fg))] border-[var(--gr-badge-warning-bg,var(--gr-warning-solid))]',\n danger: 'bg-[var(--gr-badge-danger-bg,var(--gr-danger-solid))] text-[var(--gr-badge-danger-fg,var(--gr-danger-solid-fg))] border-[var(--gr-badge-danger-bg,var(--gr-danger-solid))]',\n info: 'bg-[var(--gr-badge-info-bg,var(--gr-info-solid))] text-[var(--gr-badge-info-fg,var(--gr-info-solid-fg))] border-[var(--gr-badge-info-bg,var(--gr-info-solid))]',\n slate: 'bg-[var(--gr-badge-slate-bg,var(--gr-slate-solid))] text-[var(--gr-badge-slate-fg,var(--gr-slate-solid-fg))] border-[var(--gr-badge-slate-bg,var(--gr-slate-solid))]',\n azure: 'bg-[var(--gr-badge-azure-bg,var(--gr-azure-solid))] text-[var(--gr-badge-azure-fg,var(--gr-azure-solid-fg))] border-[var(--gr-badge-azure-bg,var(--gr-azure-solid))]',\n}\n/**\n * Экспортируются ради `GrChip`: у чипа те же три радиуса и та же палитра тонов,\n * и копия этих двух ветвлений разошлась бы с оригиналом молча. Свои у чипа\n * только размеры — он интерактивен, и цель нажатия у него не метки, а контрола.\n */\nexport function radiusClass(radius: GrBadgeRadius, size: GrBadgeSize): string {\n if (radius === 'square')\n return 'rounded-[var(--gr-radius-none)]'\n if (radius === 'semi')\n return semiRadiusClassBySize[size]\n return 'rounded-[var(--gr-radius-full)]'\n}\nexport function toneClass(tone: GrBadgeTone, dark: boolean): string {\n return dark ? darkToneClassByTone[tone] : lightToneClassByTone[tone]\n}\nexport function grBadgeClass(options: { tone: GrBadgeTone, dark: boolean, size: GrBadgeSize, radius: GrBadgeRadius }): string {\n return [\n radiusClass(options.radius, options.size),\n sizeClassBySize[options.size],\n toneClass(options.tone, options.dark),\n ].join(' ')\n}\n\n/**\n * Точка-маркер перед подписью.\n *\n * Кружок мельче иконки и растёт медленнее: маркер обязан оставаться маркером,\n * а не превращаться в третий элемент строки. Повтор значений на концах шкалы —\n * тот же приём, что у `badgeIconSizeClassBySize`.\n */\nexport const badgeDotSizeClassBySize: Record<GrBadgeSize, string> = {\n xs: 'h-1.5 w-1.5',\n sm: 'h-1.5 w-1.5',\n md: 'h-2 w-2',\n lg: 'h-2 w-2',\n}\n\n/** Маркер не жмётся: подпись бейджа не переносится, сжиматься нечему. */\nexport const badgeDotClass = 'shrink-0 rounded-[var(--gr-radius-full)]'\n\n/**\n * Маркер на мягкой подложке красится **тем же покомпонентным слоем**, что и\n * заливка filled-бейджа, и это не экономия на токенах.\n *\n * Роль тона напрямую здесь не работает ни в одном виде, и обе ветки измерены:\n * `--gr-{tone}` в светлой теме — яркая заливка под тёмный текст, как маркер она\n * не берёт 3:1 **ни на одной** подложке (`success` 2.06–2.32, `warning`\n * 2.27–2.56); `--gr-{tone}-solid` берёт светлую тему и заваливает тёмную\n * (до 1.37). Слой `--gr-badge-{tone}-bg` как раз и означает «насыщенный вес,\n * который читается в этой теме»: `-solid` в светлой, роль тона в тёмной.\n *\n * На нём проходят все 128 пар «тон маркера × тон бейджа × тема», включая\n * одноимённую, — поэтому булев `dot` берёт тон самого бейджа, а не отдельный\n * цвет. Гейт — `__tests__/grBadgeContrast.test.ts`.\n */\nexport const badgeDotToneClass: Record<GrBadgeTone, string> = {\n neutral: 'bg-[var(--gr-badge-neutral-bg)]',\n primary: 'bg-[var(--gr-badge-primary-bg)]',\n success: 'bg-[var(--gr-badge-success-bg)]',\n warning: 'bg-[var(--gr-badge-warning-bg)]',\n danger: 'bg-[var(--gr-badge-danger-bg)]',\n info: 'bg-[var(--gr-badge-info-bg)]',\n slate: 'bg-[var(--gr-badge-slate-bg)]',\n azure: 'bg-[var(--gr-badge-azure-bg)]',\n}\n\n/**\n * Маркер на **заливке** — цветом текста бейджа.\n *\n * Тон здесь не годится по построению: подложка filled-бейджа сама берётся из\n * `--gr-badge-{tone}-bg`, и маркер того же тона слился бы с ней в один цвет.\n * `currentColor` равен тексту бейджа, а он поверен на AA 4.5:1 — то есть\n * заведомо проходит порог для графики.\n */\nexport const badgeDotCurrentColorClass = 'bg-[currentColor]'\n\nexport function badgeDotClassFor(options: {\n tone: GrBadgeTone\n dark: boolean\n size: GrBadgeSize\n}): string {\n return [\n badgeDotClass,\n badgeDotSizeClassBySize[options.size],\n options.dark ? badgeDotCurrentColorClass : badgeDotToneClass[options.tone],\n ].join(' ')\n}\n"],"mappings":";AA0BA,IAAa,kBAA+C;CAC1D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;;;AASA,IAAa,2BAAwD;CACnE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,iBAAiB;AAE9B,IAAa,wBAAqD;CAChE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AACA,IAAa,uBAAoD;CAC/D,SAAS;CACT,SACE;CAIF,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;AACT;;;;;;;;;;;;AAYA,IAAa,sBAAmD;CAE9D,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;AACT;;;;;;AAMA,SAAgB,YAAY,QAAuB,MAA2B;CAC5E,IAAI,WAAW,UACb,OAAO;CACT,IAAI,WAAW,QACb,OAAO,sBAAsB;CAC/B,OAAO;AACT;AACA,SAAgB,UAAU,MAAmB,MAAuB;CAClE,OAAO,OAAO,oBAAoB,QAAQ,qBAAqB;AACjE;AACA,SAAgB,aAAa,SAAiG;CAC5H,OAAO;EACL,YAAY,QAAQ,QAAQ,QAAQ,IAAI;EACxC,gBAAgB,QAAQ;EACxB,UAAU,QAAQ,MAAM,QAAQ,IAAI;CACtC,CAAC,CAAC,KAAK,GAAG;AACZ;;;;;;;;AASA,IAAa,0BAAuD;CAClE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,gBAAgB;;;;;;;;;;;;;;;;AAiB7B,IAAa,oBAAiD;CAC5D,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;AACT;;;;;;;;;AAUA,IAAa,4BAA4B;AAEzC,SAAgB,iBAAiB,SAItB;CACT,OAAO;EACL;EACA,wBAAwB,QAAQ;EAChC,QAAQ,OAAO,4BAA4B,kBAAkB,QAAQ;CACvE,CAAC,CAAC,KAAK,GAAG;AACZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grChipStyles-
|
|
1
|
+
{"version":3,"file":"grChipStyles-CA9Wj1_E.js","names":[],"sources":["../../src/components/GrChip/grChipStyles.ts"],"sourcesContent":["import type { GrBadgeRadius, GrBadgeTone } from '../GrBadge/grBadgeStyles'\nimport { radiusClass, toneClass } from '../GrBadge/grBadgeStyles'\n\nimport type { GrComponentSize } from '../shared/sizes'\n\nexport type GrChipTone = GrBadgeTone\nexport type GrChipSize = GrComponentSize\nexport type GrChipRadius = GrBadgeRadius\n\n/**\n * Размеры у чипа свои, а не бейджевые.\n *\n * Шкал кегля в пакете две: контрольная `xs…lg` (12/13/14/16) у полей и мельче\n * `3xs…md` (10/11/12/14) у метки — `GrBadge`, `GrTooltip`. Чип берёт\n * контрольную: по нему кликают, и цель нажатия обязана совпадать с соседним\n * контролом, а не с подписью. Отсюда же явная высота — у метки её нет вовсе,\n * а у цели нажатия она и есть главное.\n *\n * Тона и радиусы при этом переиспользуются у `GrBadge` без изменений: чип\n * должен стоять с бейджем в одном ряду и не расходиться с ним по цвету.\n */\nexport const chipSizeClassBySize: Record<GrChipSize, string> = {\n xs: 'h-6 gap-1 px-2 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'h-7 gap-1 px-2.5 text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'h-8 gap-1.5 px-3 text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n lg: 'h-9 gap-1.5 px-3.5 text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]',\n}\n\n/** Крестик и иконка не растут вместе с кеглем один в один — плитка бы разъехалась. */\nexport const chipIconSizeClassBySize: Record<GrChipSize, string> = {\n xs: 'h-3 w-3',\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n lg: 'h-4 w-4',\n}\n\nexport const chipRootClass = 'inline-flex max-w-full items-center border align-middle whitespace-nowrap'\n\n/** Подпись жмётся, а не ломает ряд: чип с длинным тегом не должен рвать раскладку. */\nexport const chipLabelClass = 'min-w-0 truncate'\n\nexport const chipInteractiveClass = 'cursor-pointer transition-colors duration-[var(--gr-duration-fast)] ease-[var(--gr-ease-out)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] focus-visible:ring-offset-1 focus-visible:ring-offset-[var(--gr-bg)]'\n\n/**\n * Disabled гасится токеном фона, а не `opacity`: прозрачность разбавляет\n * выверенные на AA токены текста и роняет контраст (`library-conventions.md`).\n */\nexport const chipDisabledClass = 'cursor-not-allowed bg-[var(--gr-chip-disabled-bg,var(--gr-muted))] text-[var(--gr-chip-disabled-fg,var(--gr-disabled-fg))] border-[var(--gr-chip-disabled-brd,var(--gr-brd))]'\n\n/**\n * Выбранный чип берёт **плотный** вариант своего тона, а не оттенок соседнего.\n *\n * Тон остаётся тем же — иначе набор фильтров превратился бы в радугу, — но\n * меняется вес заливки: светлая подложка сменяется насыщенной, как у\n * filled-бейджа. Это перепад светлоты, а не оттенка, поэтому различие\n * переживает и монохром, и дальтонизм.\n *\n * Одной заливки всё же мало: **`font-600` остаётся вторым, нецветовым\n * каналом** (WCAG 1.4.1). Он же вытягивает случай, когда потребитель поставил\n * `dark` всему набору и заливка у выбранного и невыбранного совпадает.\n */\nexport const chipSelectedClass = 'font-600'\n\n/** Крестик наследует цвет тона: своей роли у него нет, он часть плитки. */\nexport const chipCloseClass = 'shrink-0 inline-flex items-center justify-center rounded-[var(--gr-radius-full)] text-current transition-colors duration-[var(--gr-duration-fast)] ease-[var(--gr-ease-out)] hover:bg-[color-mix(in_srgb,currentColor_18%,transparent)]'\n\n/**\n * Крестик-кнопка стоит в таб-порядке и обязана показывать фокус сама: она\n * появляется только там, где чип не виджет, то есть кольца на корне нет.\n */\nexport const chipCloseButtonClass = `${chipCloseClass} cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]`\n\nexport const chipIconClass = 'shrink-0'\n\nexport function grChipClass(options: {\n tone: GrChipTone\n dark: boolean\n size: GrChipSize\n radius: GrChipRadius\n interactive: boolean\n selected: boolean\n disabled: boolean\n}): string {\n return [\n chipRootClass,\n radiusClass(options.radius, options.size),\n chipSizeClassBySize[options.size],\n // Выбор поднимает вес заливки до плотного варианта того же тона.\n options.disabled ? chipDisabledClass : toneClass(options.tone, options.dark || options.selected),\n options.interactive && !options.disabled ? chipInteractiveClass : '',\n options.selected ? chipSelectedClass : '',\n ].filter(Boolean).join(' ')\n}\n\n/**\n * Ступень чипа, равная по кеглю ступени бейджа.\n *\n * Нужна там, где чип заменил собой бейдж внутри контрола (`GrInputTag`,\n * `GrAutocomplete`, `GrSelect`): проп `tagSize` у них публичный, и `md` обязан\n * означать для потребителя то же, что означал. Шкалы сдвинуты на ступень —\n * бейдж `md` это 13px, а чип 13px — это `sm`.\n */\nexport function chipSizeForBadgeScale(size: GrChipSize): GrChipSize {\n const byBadgeStep: Record<GrChipSize, GrChipSize> = { xs: 'xs', sm: 'xs', md: 'sm', lg: 'md' }\n\n return byBadgeStep[size]\n}\n"],"mappings":";;;;;;;;;;;;;;AAqBA,IAAa,sBAAkD;CAC7D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,0BAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,gBAAgB;;AAG7B,IAAa,iBAAiB;AAE9B,IAAa,uBAAuB;;;;;AAMpC,IAAa,oBAAoB;;;;;;;;;;;;;AAcjC,IAAa,oBAAoB;;AAGjC,IAAa,iBAAiB;;;;;AAM9B,IAAa,uBAAuB,GAAG,eAAe;AAEtD,IAAa,gBAAgB;AAE7B,SAAgB,YAAY,SAQjB;CACT,OAAO;EACL;EACA,YAAY,QAAQ,QAAQ,QAAQ,IAAI;EACxC,oBAAoB,QAAQ;EAE5B,QAAQ,WAAW,oBAAoB,UAAU,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;EAC/F,QAAQ,eAAe,CAAC,QAAQ,WAAW,uBAAuB;EAClE,QAAQ,WAAW,oBAAoB;CACzC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC5B;;;;;;;;;AAUA,SAAgB,sBAAsB,MAA8B;CAGlE,OAAO;EAF+C,IAAI;EAAM,IAAI;EAAM,IAAI;EAAM,IAAI;CAEjF,EAAY;AACrB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as overlayPanelSurfaceClass } from "./overlayTransition-C0FDMx7Q.js";
|
|
2
2
|
//#region src/components/shared/overlayOrigin.ts
|
|
3
3
|
/**
|
|
4
4
|
* `transform-origin` для scale-анимации всплывающей панели.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grPopoverStyles-
|
|
1
|
+
{"version":3,"file":"grPopoverStyles-CncEkiPu.js","names":[],"sources":["../../src/components/shared/overlayOrigin.ts","../../src/components/GrPopover/grPopoverStyles.ts"],"sourcesContent":["import type { Placement } from '@floating-ui/dom'\n\n/**\n * `transform-origin` для scale-анимации всплывающей панели.\n *\n * Ключ — `resolvedPlacement`, то есть положение **после** `flip`: если снизу не\n * хватило места и панель перевернуло вверх, origin переворачивается вместе с\n * ней. Координаты панели к этому моменту уже посчитал `useFloating`, здесь\n * остаётся только направление роста относительно триггера.\n *\n * До выноса карта существовала копиями в `GrPopover` и `GrDropdown` — двенадцать\n * записей, совпадавших дословно, вместе с комментарием об одном и том же.\n *\n * Отдельным модулем от поверхности намеренно: списки выбора берут поверхность,\n * но своей анимации роста не имеют, и импорт соседа затащил бы им в чанк восемь\n * классов, которыми они не пользуются. Гейт `src/__tests__/safelist.test.ts`\n * назвал бы их поимённо — и был бы прав.\n *\n * Модуль безадресный: в `dist` он уезжает в общий чанк, который пресет не\n * сканирует, поэтому каждый потребитель объявляет эти классы в своём `safelist.ts`.\n */\nexport const overlayOriginClassByPlacement: Record<Placement, string> = {\n 'bottom-start': 'origin-top-left',\n 'bottom-end': 'origin-top-right',\n 'bottom': 'origin-top',\n 'top-start': 'origin-bottom-left',\n 'top-end': 'origin-bottom-right',\n 'top': 'origin-bottom',\n 'left-start': 'origin-top-right',\n 'left-end': 'origin-bottom-right',\n 'left': 'origin-right',\n 'right-start': 'origin-top-left',\n 'right-end': 'origin-bottom-left',\n 'right': 'origin-left',\n}\n\nexport function overlayOriginClass(placement: Placement): string {\n return overlayOriginClassByPlacement[placement] ?? 'origin-top'\n}\n","import type { Placement } from '@floating-ui/dom'\n\nimport { overlayOriginClass } from '../shared/overlayOrigin'\nimport { overlayPanelSurfaceClass } from '../shared/overlayPanelSurface'\nimport type { GrComponentSize } from '../shared/sizes'\n\nexport type GrPopoverSize = GrComponentSize\n\n/**\n * Роль панели.\n *\n * `dialog` — произвольный интерактивный контент (значение по умолчанию).\n * Остальные нужны компонентам, которые строятся поверх этого примитива:\n * меню (`GrMenu`, `GrContextMenu`), списки, палитры. Роль задаёт потребитель,\n * потому что клавиатурный паттерн принадлежит ему, а не поповеру.\n */\nexport type GrPopoverRole = 'dialog' | 'menu' | 'listbox' | 'grid' | 'group' | 'none'\n\n/** Поле панели. `none` — поле рисует содержимое (меню, список опций). */\nexport type GrPopoverPadding = 'default' | 'none'\n\nexport const panelSizes: Record<GrPopoverSize, string> = {\n xs: 'p-2 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'p-2.5 text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'p-3 text-[length:var(--gr-control-text-md)] leading-[var(--gr-leading-sm)]',\n lg: 'p-4 text-[length:var(--gr-control-text-lg)] leading-[var(--gr-leading-base)]',\n}\n\n/**\n * Поверхность панели.\n *\n * Ширина — `min()` из двух пределов, и они разной природы. Первый, `22rem`, —\n * потолок содержимого: читаемая ширина колонки текста. Он **дефолт**, а не\n * закон, и снимается хуком `--gr-popover-max-width` — примитив объявил, что\n * содержимое панели дело потребителя, и навязывать ему форму не вправе.\n * Тулбар, палитра и сетка шире прозы законно.\n *\n * Второй, `calc(100vw-1rem)`, — инвариант слоя: `useFloating` смещает панель в\n * пределах вьюпорта, но не сужает её. Он не настраивается ничем и снаружи не\n * отключается, потому что стоит вторым операндом `min()`: даже\n * `--gr-popover-max-width: 100vw` его не снимает, а лишь уступает ему место.\n *\n * Хуком, а не пропом, — по трём причинам. Спор специфичности не возникает\n * вовсе: кастомное свойство разрешается каскадом на самом элементе, а не\n * порядком правил в сгенерированном CSS (та же ловушка, что описана у\n * `panelSizesFlush`). Потолок можно менять по брейкпоинту и по теме — пропом\n * этого не сделать. И словарь компонента не растёт: значение остаётся\n * значением. Так же устроена высота списка у `GrCommandPalette`.\n */\n/**\n * Кегль без поля.\n *\n * Отдельная мапа, а не `contentClass=\"p-0\"`: поле и кегль приезжают одной\n * строкой равной специфичности, и кто победит — решал бы порядок правил в\n * сгенерированном CSS. Меню внутри поповера с `p-3` — визуально не меню.\n */\nexport const panelSizesFlush: Record<GrPopoverSize, string> = {\n xs: 'text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'text-[length:var(--gr-control-text-md)] leading-[var(--gr-leading-sm)]',\n lg: 'text-[length:var(--gr-control-text-lg)] leading-[var(--gr-leading-base)]',\n}\n\n/**\n * Высота — тоже `min()` из двух пределов, но устроена иначе, чем ширина.\n *\n * Потолок ширины статичен: `calc(100vw-1rem)` не зависит от того, где стоит\n * триггер. Потолок высоты статичным быть не может — доступное место есть\n * расстояние до края вьюпорта на той стороне, куда панель встала, и меняется\n * оно на каждом скролле. Поэтому второй операнд здесь — не константа, а замер\n * слоя (`--gr-floating-available-height`, см. `useFloating`), и он пересчитан\n * уже **после** `flip`: сторона окончательная.\n *\n * `overflow-y: auto` идёт с потолком одной строкой намеренно. Потолок без\n * скролла не ограничивает, а обрезает: содержимое молча уходит под нижний край\n * панели, и добраться до него нельзя ничем. Пока потолок не упёрся, полоса не\n * рисуется, так что для коротких панелей не меняется ничего.\n *\n * Хук `--gr-popover-max-height` по умолчанию `100vh` — то есть «мнения нет»,\n * и высоту диктует замер. Он же служит фолбэком, пока позиция не посчитана\n * (первый кадр, SSR): панель не схлопывается в ноль, а просто не ограничена.\n */\nexport const popoverPanelBaseClass = `${overlayPanelSurfaceClass} max-w-[min(var(--gr-popover-max-width,22rem),calc(100vw-1rem))] max-h-[min(var(--gr-popover-max-height,100vh),var(--gr-floating-available-height,100vh))] overflow-y-auto focus:outline-none`\n\nexport function grPopoverPanelClass(\n size: GrPopoverSize,\n placement: Placement,\n extra?: string,\n padding: GrPopoverPadding = 'default',\n): string {\n return [\n popoverPanelBaseClass,\n padding === 'none' ? panelSizesFlush[size] : panelSizes[size],\n overlayOriginClass(placement),\n extra ?? '',\n ].filter(Boolean).join(' ')\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAqBA,IAAa,gCAA2D;CACtE,gBAAgB;CAChB,cAAc;CACd,UAAU;CACV,aAAa;CACb,WAAW;CACX,OAAO;CACP,cAAc;CACd,YAAY;CACZ,QAAQ;CACR,eAAe;CACf,aAAa;CACb,SAAS;AACX;AAEA,SAAgB,mBAAmB,WAA8B;CAC/D,OAAO,8BAA8B,cAAc;AACrD;;;ACjBA,IAAa,aAA4C;CACvD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAa,kBAAiD;CAC5D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;;;;;;;;;;;;;;AAqBA,IAAa,wBAAwB,GAAG,yBAAyB;AAEjE,SAAgB,oBACd,MACA,WACA,OACA,UAA4B,WACpB;CACR,OAAO;EACL;EACA,YAAY,SAAS,gBAAgB,QAAQ,WAAW;EACxD,mBAAmB,SAAS;EAC5B,SAAS;CACX,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC5B"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { t as
|
|
1
|
+
import { t as overlayListPanelClass } from "./overlayListPanel-D91jBCHU.js";
|
|
2
|
+
import { n as overlayPanelSurfaceClass } from "./overlayTransition-C0FDMx7Q.js";
|
|
2
3
|
//#region src/components/GrSelect/grSelectStyles.ts
|
|
3
4
|
var defaultBaseClass = "w-full rounded-[var(--gr-radius-control)] border bg-[var(--gr-bg)] text-[var(--gr-fg)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]";
|
|
4
5
|
/**
|
|
@@ -126,7 +127,7 @@ function grSelectTriggerClass(options) {
|
|
|
126
127
|
if (options.view === "link") return [grSelectClass(options), "inline-flex items-center gap-1 text-left"].join(" ");
|
|
127
128
|
return [grSelectClass(options), "flex items-center justify-between text-left"].join(" ");
|
|
128
129
|
}
|
|
129
|
-
var grSelectPanelClasses = `${overlayPanelSurfaceClass} overflow-hidden`;
|
|
130
|
+
var grSelectPanelClasses = `${overlayPanelSurfaceClass} ${overlayListPanelClass} overflow-hidden`;
|
|
130
131
|
/** Общая подсветка наведения и активной опции панели. */
|
|
131
132
|
var selectOptionHighlight = "bg-[color-mix(in_srgb,var(--gr-muted)_30%,transparent)]";
|
|
132
133
|
var selectOptionBaseClass = "rounded-[var(--gr-radius-md)] px-3 py-2 text-left text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grSelectStyles-Cam-IG9s.js","names":[],"sources":["../../src/components/GrSelect/grSelectStyles.ts"],"sourcesContent":["import type { GrComponentSize, GrControlState } from '../shared/sizes'\nimport { overlayListPanelClass } from '../shared/overlayListPanel'\nimport { overlayPanelSurfaceClass } from '../shared/overlayPanelSurface'\n\nexport type GrSelectView = 'default' | 'link'\nexport type GrSelectSize = GrComponentSize\nexport type GrSelectVariant = 'primary' | 'default' | 'muted' | 'danger'\nexport type GrSelectUnderline = 'auto' | 'always' | 'none'\nimport type { GrChipTone } from '../GrChip/grChipStyles'\n\nexport type GrSelectOptionsView = 'native' | 'panel'\n/**\n * Тип значения опции. Ограничен примитивами, которые переживают путь через DOM:\n * нативный `<select>` хранит в `option.value` только строку, поэтому значение\n * должно однозначно восстанавливаться из своего строкового представления.\n * Объектные модели потребовали бы отдельного key-экстрактора — см. `docs/components.md`.\n */\n/**\n * Значение опции. Объект допустим, но тогда обязателен проп `valueKey`: в DOM\n * значение живёт строкой, и без ключа объекты неотличимы друг от друга.\n */\nexport type GrSelectValue = string | number | object\nexport type GrSelectState = GrControlState\n\nexport type GrSelectOption<TValue extends GrSelectValue = string> = {\n value: TValue\n label: string\n disabled?: boolean\n /**\n * Тон чипа в режиме `tags` — перекрывает `tagTone` для этой опции.\n *\n * Цвет у каждого тега свой — обычная модель (метки, категории, статусы), и\n * без неё потребитель уходил в слот `#value` рисовать выбранное сам, теряя\n * ровно то, что в `tags` сделано правильно: чипы снаружи `role=\"combobox\"`,\n * снятие крестиком, сворачивание в «+N» и клавиатуру.\n */\n tone?: GrChipTone\n /** Плотная заливка чипа этой опции — перекрывает `tagDark`. */\n dark?: boolean\n}\n/** Группа опций: заголовок `label` + вложенные опции `options`. */\nexport type GrSelectOptionGroup<TValue extends GrSelectValue = string> = {\n label: string\n options: GrSelectOption<TValue>[]\n}\n/** Элемент списка опций: либо одиночная опция, либо группа опций. */\nexport type GrSelectOptionOrGroup<TValue extends GrSelectValue = string>\n = | GrSelectOption<TValue>\n | GrSelectOptionGroup<TValue>\nexport type GrSelectModelValue<TValue extends GrSelectValue = string> = TValue | TValue[]\n\nexport const defaultBaseClass = 'w-full rounded-[var(--gr-radius-control)] border bg-[var(--gr-bg)] text-[var(--gr-fg)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\n/**\n * Цвет рамки по состоянию — та же карта, что у `GrInput` и `GrTextarea`: поля\n * одной формы обязаны показывать ошибку одинаково.\n */\nexport const borderClassByState: Record<GrSelectState, string> = {\n default: 'border-[var(--gr-brd)]',\n success: 'border-[var(--gr-success)] focus-visible:ring-[var(--gr-success)]',\n warning: 'border-[var(--gr-warning)] focus-visible:ring-[var(--gr-warning)]',\n danger: 'border-[var(--gr-danger)] focus-visible:ring-[var(--gr-danger)]',\n}\n\n/**\n * Ошибка валидации красится своей ролью, а не декоративным тоном `danger`:\n * `state=\"danger\"` — это подсветка по решению разработчика, `invalid` — вердикт\n * валидации, и тема вправе развести их по цвету.\n */\nexport const invalidBorderClass = 'border-[var(--gr-invalid-brd)] focus-visible:ring-[var(--gr-invalid-ring)]'\nexport const linkBaseClass = 'cursor-pointer inline-block w-auto align-baseline appearance-none bg-transparent border border-transparent px-0 py-0 rounded-[var(--gr-radius-control)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport const selectSizeClassBySize: Record<GrSelectSize, string> = {\n xs: 'h-7 px-2.5 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'h-8 px-3 text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'h-10 px-3 text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n lg: 'h-11 px-4 text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]',\n}\n\nexport const selectLinkSizeClassBySize: Record<GrSelectSize, string> = {\n xs: 'text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n lg: 'text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]',\n}\n\n/**\n * Ссылка — это ТЕКСТ на фоне страницы, поэтому опасный тон берётся из\n * `--gr-danger-text`, а не из насыщенного `--gr-danger` (последний под текст не\n * рассчитан). Hover/active выводятся подмесом `--gr-fg` — той же формулой, что\n * `GrLink`. `primary` берётся из `--gr-primary-text` по той же причине: на фоне\n * страницы насыщенный `--gr-primary` под текст не рассчитан.\n *\n * Классы записаны литералами, а не собраны интерполяцией: safelist и скан\n * UnoCSS читают исходник, и вычисленная строка для них не класс.\n */\nexport const selectLinkVariantClassByVariant: Record<GrSelectVariant, string> = {\n primary: 'text-[var(--gr-primary-text)] hover:text-[color-mix(in_srgb,var(--gr-primary-text)_92%,var(--gr-fg))] active:text-[color-mix(in_srgb,var(--gr-primary-text)_84%,var(--gr-fg))]',\n default: 'text-[var(--gr-fg)] hover:text-[var(--gr-primary-text)] active:text-[color-mix(in_srgb,var(--gr-primary-text)_84%,var(--gr-fg))]',\n muted: 'text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)] active:text-[var(--gr-fg)]',\n danger: 'text-[var(--gr-danger-text)] hover:text-[color-mix(in_srgb,var(--gr-danger-text)_92%,var(--gr-fg))] active:text-[color-mix(in_srgb,var(--gr-danger-text)_84%,var(--gr-fg))]',\n}\n\n/**\n * Variant-классы для видимой метки в `view=\"link\"` + `optionsView=\"native\"`.\n * Hover-цвет приходит через `peer-hover:` от прозрачного `<select>`-overlay,\n * т.к. видимая метка имеет `pointer-events-none` и не получает hover напрямую.\n */\nexport const selectLinkNativeLabelVariantClassByVariant: Record<GrSelectVariant, string> = {\n primary: 'text-[var(--gr-primary-text)] peer-hover:text-[color-mix(in_srgb,var(--gr-primary-text)_92%,var(--gr-fg))] peer-active:text-[color-mix(in_srgb,var(--gr-primary-text)_84%,var(--gr-fg))]',\n default: 'text-[var(--gr-fg)] peer-hover:text-[var(--gr-primary-text)] peer-active:text-[color-mix(in_srgb,var(--gr-primary-text)_84%,var(--gr-fg))]',\n muted: 'text-[var(--gr-muted-fg)] peer-hover:text-[var(--gr-fg)] peer-active:text-[var(--gr-fg)]',\n danger: 'text-[var(--gr-danger-text)] peer-hover:text-[color-mix(in_srgb,var(--gr-danger-text)_92%,var(--gr-fg))] peer-active:text-[color-mix(in_srgb,var(--gr-danger-text)_84%,var(--gr-fg))]',\n}\n\nfunction selectLinkUnderlineClass(options: { underline: GrSelectUnderline, disabled: boolean }): string {\n if (options.disabled)\n return 'no-underline'\n if (options.underline === 'always')\n return 'underline underline-offset-4'\n if (options.underline === 'none')\n return 'no-underline'\n return 'no-underline hover:underline hover:underline-offset-4'\n}\n\n/**\n * Underline-классы для видимой метки в `view=\"link\"` + `optionsView=\"native\"`.\n * Видимая метка имеет `pointer-events-none`, а hover получает прозрачный\n * `<select>`-overlay (peer), поэтому для `underline=\"auto\"` используем\n * `peer-hover:underline` вместо `hover:underline`.\n */\nfunction selectLinkNativeLabelUnderlineClass(options: { underline: GrSelectUnderline, disabled: boolean }): string {\n if (options.disabled)\n return 'no-underline'\n if (options.underline === 'always')\n return 'underline underline-offset-4'\n if (options.underline === 'none')\n return 'no-underline'\n return 'no-underline peer-hover:underline peer-hover:underline-offset-4'\n}\n\n/**\n * Классы прозрачного `<select>`-overlay для `view=\"link\"` + `optionsView=\"native\"`.\n * Нативный селект растягивается на всю обёртку, но визуально невидим — ширину обёртки\n * задаёт видимый `<span>` с выбранной меткой, благодаря чему компонент в закрытом\n * состоянии занимает столько места, сколько нужно текущей опции (а не самой длинной).\n */\nexport const grSelectLinkNativeOverlayClass = 'peer absolute inset-0 w-full h-full m-0 p-0 border-0 bg-transparent text-transparent appearance-none opacity-0 cursor-pointer disabled:cursor-not-allowed focus:outline-none'\n\n/**\n * Классы видимой метки для `view=\"link\"` + `optionsView=\"native\"` (поверх прозрачного `<select>`).\n * Получает все link-стили (size/variant/underline), а также focus-ring через `peer-focus-visible`.\n */\nexport const grSelectLinkNativeLabelBaseClass = 'pointer-events-none inline-block whitespace-nowrap align-baseline rounded-[var(--gr-radius-control)] transition-colors duration-[var(--gr-duration-fast)]'\nexport const grSelectLinkNativeLabelDisabledClass = 'cursor-not-allowed text-[var(--gr-muted-fg)] no-underline'\nexport const grSelectLinkNativeLabelFocusClass = 'peer-focus-visible:outline-none peer-focus-visible:ring-2 peer-focus-visible:ring-[var(--gr-ring)]'\n\nexport function grSelectLinkNativeLabelClass(options: {\n size: GrSelectSize\n variant: GrSelectVariant\n underline: GrSelectUnderline\n disabled: boolean\n}): string {\n return [\n grSelectLinkNativeLabelBaseClass,\n selectLinkSizeClassBySize[options.size],\n selectLinkNativeLabelUnderlineClass({ underline: options.underline, disabled: options.disabled }),\n selectLinkNativeLabelVariantClassByVariant[options.variant],\n options.disabled ? grSelectLinkNativeLabelDisabledClass : '',\n grSelectLinkNativeLabelFocusClass,\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nexport function grSelectClass(options: {\n view: GrSelectView\n size: GrSelectSize\n disabled: boolean\n variant: GrSelectVariant\n underline: GrSelectUnderline\n state?: GrSelectState\n invalid?: boolean\n}): string {\n if (options.view === 'link') {\n return [\n selectLinkSizeClassBySize[options.size],\n selectLinkUnderlineClass({ underline: options.underline, disabled: options.disabled }),\n selectLinkVariantClassByVariant[options.variant],\n 'disabled:cursor-not-allowed disabled:text-[var(--gr-muted-fg)] disabled:no-underline',\n ].join(' ')\n }\n\n return [\n selectSizeClassBySize[options.size],\n // `invalid` сильнее `state`: ошибка перекрывает любую другую подсветку.\n options.invalid ? invalidBorderClass : borderClassByState[options.state ?? 'default'],\n // Заблокированный контрол гасится фоном и цветом текста, а не `opacity`:\n // прозрачность разбавляет выверенные на AA токены и роняет контраст.\n 'disabled:cursor-not-allowed disabled:bg-[var(--gr-muted)] disabled:text-[var(--gr-muted-fg)]',\n ].join(' ')\n}\n\nexport function grSelectNativeClass(options: {\n view: GrSelectView\n size: GrSelectSize\n disabled: boolean\n variant: GrSelectVariant\n underline: GrSelectUnderline\n showNativeChevron: boolean\n state?: GrSelectState\n invalid?: boolean\n}): string {\n return [\n grSelectClass(options),\n options.showNativeChevron ? 'appearance-none pr-9' : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nexport function grSelectTriggerClass(options: {\n view: GrSelectView\n optionsView: GrSelectOptionsView\n size: GrSelectSize\n disabled: boolean\n variant: GrSelectVariant\n underline: GrSelectUnderline\n state?: GrSelectState\n invalid?: boolean\n}): string {\n if (options.optionsView !== 'panel') {\n return grSelectClass(options)\n }\n\n if (options.view === 'link') {\n return [\n grSelectClass(options),\n 'inline-flex items-center gap-1 text-left',\n ].join(' ')\n }\n\n return [\n grSelectClass(options),\n 'flex items-center justify-between text-left',\n ].join(' ')\n}\n\nexport const grSelectPanelClasses = `${overlayPanelSurfaceClass} ${overlayListPanelClass} overflow-hidden`\n\n/** Общая подсветка наведения и активной опции панели. */\nconst selectOptionHighlight = 'bg-[color-mix(in_srgb,var(--gr-muted)_30%,transparent)]'\n\nexport const selectOptionBaseClass = 'rounded-[var(--gr-radius-md)] px-3 py-2 text-left text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]'\nexport const selectOptionLinkWidthClass = 'block min-w-full w-max whitespace-nowrap'\nexport const selectOptionWidthClass = 'w-full'\nexport const selectOptionEnabledClass = `hover:${selectOptionHighlight}`\nexport const selectOptionActiveClass = selectOptionHighlight\n/** Выключенная опция гасится токеном текста — по той же причине, что и контрол. */\nexport const selectOptionDisabledClass = 'cursor-not-allowed text-[var(--gr-muted-fg)]'\n\nexport function grSelectOptionClass(options: {\n view: GrSelectView\n disabled: boolean\n active: boolean\n}): string {\n return [\n selectOptionBaseClass,\n options.view === 'link' ? selectOptionLinkWidthClass : selectOptionWidthClass,\n options.disabled ? selectOptionDisabledClass : selectOptionEnabledClass,\n !options.disabled && options.active ? selectOptionActiveClass : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n"],"mappings":";;;AAmDA,IAAa,mBAAmB;;;;;AAMhC,IAAa,qBAAoD;CAC/D,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;AACV;;;;;;AAOA,IAAa,qBAAqB;AAClC,IAAa,gBAAgB;AAE7B,IAAa,wBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,4BAA0D;CACrE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;;;;;AAYA,IAAa,kCAAmE;CAC9E,SAAS;CACT,SAAS;CACT,OAAO;CACP,QAAQ;AACV;;;;;;AAOA,IAAa,6CAA8E;CACzF,SAAS;CACT,SAAS;CACT,OAAO;CACP,QAAQ;AACV;AAEA,SAAS,yBAAyB,SAAsE;CACtG,IAAI,QAAQ,UACV,OAAO;CACT,IAAI,QAAQ,cAAc,UACxB,OAAO;CACT,IAAI,QAAQ,cAAc,QACxB,OAAO;CACT,OAAO;AACT;;;;;;;AAQA,SAAS,oCAAoC,SAAsE;CACjH,IAAI,QAAQ,UACV,OAAO;CACT,IAAI,QAAQ,cAAc,UACxB,OAAO;CACT,IAAI,QAAQ,cAAc,QACxB,OAAO;CACT,OAAO;AACT;;;;;;;AAQA,IAAa,iCAAiC;;;;;AAM9C,IAAa,mCAAmC;AAChD,IAAa,uCAAuC;AACpD,IAAa,oCAAoC;AAEjD,SAAgB,6BAA6B,SAKlC;CACT,OAAO;EACL;EACA,0BAA0B,QAAQ;EAClC,oCAAoC;GAAE,WAAW,QAAQ;GAAW,UAAU,QAAQ;EAAS,CAAC;EAChG,2CAA2C,QAAQ;EACnD,QAAQ,WAAW,uCAAuC;EAC1D;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb;AAEA,SAAgB,cAAc,SAQnB;CACT,IAAI,QAAQ,SAAS,QACnB,OAAO;EACL,0BAA0B,QAAQ;EAClC,yBAAyB;GAAE,WAAW,QAAQ;GAAW,UAAU,QAAQ;EAAS,CAAC;EACrF,gCAAgC,QAAQ;EACxC;CACF,CAAC,CAAC,KAAK,GAAG;CAGZ,OAAO;EACL,sBAAsB,QAAQ;EAE9B,QAAQ,UAAU,qBAAqB,mBAAmB,QAAQ,SAAS;EAG3E;CACF,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,SAAgB,oBAAoB,SASzB;CACT,OAAO,CACL,cAAc,OAAO,GACrB,QAAQ,oBAAoB,yBAAyB,EACvD,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb;AAEA,SAAgB,qBAAqB,SAS1B;CACT,IAAI,QAAQ,gBAAgB,SAC1B,OAAO,cAAc,OAAO;CAG9B,IAAI,QAAQ,SAAS,QACnB,OAAO,CACL,cAAc,OAAO,GACrB,0CACF,CAAC,CAAC,KAAK,GAAG;CAGZ,OAAO,CACL,cAAc,OAAO,GACrB,6CACF,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,IAAa,uBAAuB,GAAG,yBAAyB,GAAG,sBAAsB;;AAGzF,IAAM,wBAAwB;AAE9B,IAAa,wBAAwB;AACrC,IAAa,6BAA6B;AAC1C,IAAa,yBAAyB;AACtC,IAAa,2BAA2B,SAAS;AACjD,IAAa,0BAA0B;;AAEvC,IAAa,4BAA4B;AAEzC,SAAgB,oBAAoB,SAIzB;CACT,OAAO;EACL;EACA,QAAQ,SAAS,SAAS,6BAA6B;EACvD,QAAQ,WAAW,4BAA4B;EAC/C,CAAC,QAAQ,YAAY,QAAQ,SAAS,0BAA0B;CAClE,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb"}
|
|
@@ -62,7 +62,7 @@ var sliderFillEnabledClass = "bg-[var(--gr-slider-fill,var(--gr-primary))]";
|
|
|
62
62
|
function sliderFillClass(disabled) {
|
|
63
63
|
return [sliderFillBaseClass, disabled ? sliderFillDisabledClass : sliderFillEnabledClass].join(" ");
|
|
64
64
|
}
|
|
65
|
-
var sliderThumbBaseClass = "absolute rounded-[var(--gr-radius-full)] border-2 border-[var(--gr-slider-thumb-border,var(--gr-slider-fill,var(--gr-primary)))] bg-[var(--gr-slider-thumb-bg,var(--gr-bg))] ring-1 ring-[color-mix(in_srgb,var(--gr-fg)_22%,transparent)] shadow-[var(--gr-shadow-1)] transition-[box-shadow,transform] duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] focus-visible:ring-offset-1 focus-visible:ring-offset-[var(--gr-bg)]";
|
|
65
|
+
var sliderThumbBaseClass = "absolute inline-flex items-center justify-center overflow-visible rounded-[var(--gr-radius-full)] border-2 border-[var(--gr-slider-thumb-border,var(--gr-slider-fill,var(--gr-primary)))] bg-[var(--gr-slider-thumb-bg,var(--gr-bg))] ring-1 ring-[color-mix(in_srgb,var(--gr-fg)_22%,transparent)] shadow-[var(--gr-shadow-1)] transition-[box-shadow,transform] duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] focus-visible:ring-offset-1 focus-visible:ring-offset-[var(--gr-bg)]";
|
|
66
66
|
/** Бегунок центрируется поперёк дорожки, а вдоль неё его ведёт inline-стиль. */
|
|
67
67
|
var sliderThumbOrientationClass = {
|
|
68
68
|
horizontal: "top-1/2 -translate-x-1/2 -translate-y-1/2",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grSliderStyles-CqzV0hll.js","names":[],"sources":["../../src/components/GrSlider/grSliderStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrSliderSize = GrComponentSize\n/** Значение: число (single) или кортеж `[lo, hi]` (range при `range=true`). */\nexport type GrSliderModelValue = number | [number, number]\n/** Метка деления: словарь `value → label` или просто массив значений (label = значение). */\nexport type GrSliderMarks = Record<number, string> | number[]\n\n/** Ориентация дорожки. В вертикальной минимум внизу — как на регуляторе громкости. */\nexport const GR_SLIDER_ORIENTATIONS = ['horizontal', 'vertical'] as const\nexport type GrSliderOrientation = typeof GR_SLIDER_ORIENTATIONS[number]\n\n/**\n * Кастомизация через CSS-переменные (можно задать на самом слайдере или любом\n * предке — inline `style`, класс, тема). Значение по умолчанию — второй аргумент\n * `var(--name, default)`, поэтому переопределять можно точечно:\n *\n * - `--gr-slider-rail` — цвет фона дорожки (неактивная часть).\n * - `--gr-slider-fill` — цвет активной (заполненной) части.\n * - `--gr-slider-thumb-bg` — заливка бегунка.\n * - `--gr-slider-thumb-border` — цвет окантовки бегунка (по умолчанию = fill).\n * - `--gr-slider-thumb-size` — диаметр бегунка (по умолчанию — из `size`).\n * - `--gr-slider-track-height` — толщина дорожки (по умолчанию — из `size`).\n * - `--gr-slider-length` — длина вертикальной дорожки (по умолчанию `10rem`).\n */\n\n// Высота дорожки (rail/fill) по размеру — дефолт для `--gr-slider-track-height`.\nexport const sliderTrackHeightBySize: Record<GrSliderSize, string> = {\n xs: 'h-[var(--gr-slider-track-height,0.1875rem)]',\n sm: 'h-[var(--gr-slider-track-height,0.25rem)]',\n md: 'h-[var(--gr-slider-track-height,0.375rem)]',\n lg: 'h-[var(--gr-slider-track-height,0.5rem)]',\n}\n\n/** В вертикали та же толщина задаёт ширину, а длину берёт `--gr-slider-length`. */\nexport const sliderTrackWidthBySize: Record<GrSliderSize, string> = {\n xs: 'w-[var(--gr-slider-track-height,0.1875rem)]',\n sm: 'w-[var(--gr-slider-track-height,0.25rem)]',\n md: 'w-[var(--gr-slider-track-height,0.375rem)]',\n lg: 'w-[var(--gr-slider-track-height,0.5rem)]',\n}\n\nexport const sliderTrackVerticalLengthClass = 'h-[var(--gr-slider-length,10rem)]'\n\n// Размер «бегунка» (thumb) по размеру — дефолт для `--gr-slider-thumb-size`.\nexport const sliderThumbSizeBySize: Record<GrSliderSize, string> = {\n xs: 'h-[var(--gr-slider-thumb-size,0.75rem)] w-[var(--gr-slider-thumb-size,0.75rem)]',\n sm: 'h-[var(--gr-slider-thumb-size,0.875rem)] w-[var(--gr-slider-thumb-size,0.875rem)]',\n md: 'h-[var(--gr-slider-thumb-size,1rem)] w-[var(--gr-slider-thumb-size,1rem)]',\n lg: 'h-[var(--gr-slider-thumb-size,1.25rem)] w-[var(--gr-slider-thumb-size,1.25rem)]',\n}\n\n// Вертикальный отступ обёртки, чтобы thumb не обрезался краями дорожки.\nexport const sliderPaddingBySize: Record<GrSliderSize, string> = {\n xs: 'py-1',\n sm: 'py-1.5',\n md: 'py-2',\n lg: 'py-2.5',\n}\n\n/**\n * Дорожка — `--gr-brd`, а не полупрозрачный `--gr-muted`.\n *\n * Прежний дефолт (`color-mix(--gr-muted 45%, transparent)`) на светлой теме\n * давал #f1f5f9 при 45 % поверх почти такой же поверхности: непройденная часть\n * шкалы не читалась вовсе, и слайдер выглядел точкой на пустом месте — по нему\n * нельзя было понять ни диапазон, ни положение внутри него.\n */\nexport const sliderRailClass = 'absolute inset-0 rounded-[var(--gr-radius-full)] bg-[var(--gr-slider-rail,var(--gr-brd))]'\n\nexport const sliderFillBaseClass = 'absolute rounded-[var(--gr-radius-full)]'\n\n/** Заливка растёт вдоль дорожки: по горизонтали — влево-вправо, по вертикали — снизу вверх. */\nexport const sliderFillOrientationClass: Record<GrSliderOrientation, string> = {\n horizontal: 'top-0 bottom-0',\n vertical: 'left-0 right-0',\n}\n\n/**\n * Недоступный слайдер гасится токенами, а не `opacity`: прозрачность разбавляет\n * выверенные на AA токены и роняет контраст подписей меток.\n */\nexport const sliderFillDisabledClass = 'bg-[var(--gr-disabled-fg)]'\nexport const sliderFillEnabledClass = 'bg-[var(--gr-slider-fill,var(--gr-primary))]'\n\nexport function sliderFillClass(disabled: boolean): string {\n return [sliderFillBaseClass, disabled ? sliderFillDisabledClass : sliderFillEnabledClass].join(' ')\n}\n\n// Окантовка бегунка: цветной border (по умолчанию = fill) + тонкая контрастная\n// обводка (`ring`), чтобы бегунок не сливался ни с фоном страницы, ни с заливкой.\n/*\n * `inline-flex` с центрированием — ради слота `#thumb`: без него содержимое\n * ручки прижималось бы к её верхнему левому углу, и центрировать его пришлось\n * бы каждому потребителю. Пустой ручке объявление ничего не меняет: она\n * позиционирована абсолютно и имеет заданный размер.\n */\nexport const sliderThumbBaseClass = 'absolute inline-flex items-center justify-center overflow-visible rounded-[var(--gr-radius-full)] border-2 border-[var(--gr-slider-thumb-border,var(--gr-slider-fill,var(--gr-primary)))] bg-[var(--gr-slider-thumb-bg,var(--gr-bg))] ring-1 ring-[color-mix(in_srgb,var(--gr-fg)_22%,transparent)] shadow-[var(--gr-shadow-1)] transition-[box-shadow,transform] duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] focus-visible:ring-offset-1 focus-visible:ring-offset-[var(--gr-bg)]'\n\n/** Бегунок центрируется поперёк дорожки, а вдоль неё его ведёт inline-стиль. */\nexport const sliderThumbOrientationClass: Record<GrSliderOrientation, string> = {\n horizontal: 'top-1/2 -translate-x-1/2 -translate-y-1/2',\n vertical: 'left-1/2 -translate-x-1/2 translate-y-1/2',\n}\n\nexport const sliderThumbDisabledClass = 'cursor-not-allowed border-[var(--gr-disabled-fg)] bg-[var(--gr-disabled-bg)]'\nexport const sliderThumbEnabledClass = 'cursor-grab active:cursor-grabbing hover:scale-110'\n\nexport function sliderThumbClass(options: {\n size: GrSliderSize\n disabled: boolean\n orientation?: GrSliderOrientation\n}): string {\n return [\n sliderThumbBaseClass,\n sliderThumbOrientationClass[options.orientation ?? 'horizontal'],\n sliderThumbSizeBySize[options.size],\n options.disabled ? sliderThumbDisabledClass : sliderThumbEnabledClass,\n ].join(' ')\n}\n\nexport const sliderTooltipBaseClass = 'pointer-events-none absolute whitespace-nowrap rounded-[var(--gr-radius-control)] bg-[var(--gr-fg)] px-1.5 py-0.5 text-[length:var(--gr-text-2xs)] font-medium leading-tight text-[var(--gr-bg)] shadow-[var(--gr-shadow-2)]'\n\n/** В вертикали подсказка уходит вбок: над бегунком она легла бы на дорожку. */\nexport const sliderTooltipOrientationClass: Record<GrSliderOrientation, string> = {\n horizontal: 'bottom-full left-1/2 mb-2 -translate-x-1/2',\n vertical: 'right-full top-1/2 mr-2 -translate-y-1/2',\n}\n\nexport function sliderTooltipClass(orientation: GrSliderOrientation = 'horizontal'): string {\n return [sliderTooltipBaseClass, sliderTooltipOrientationClass[orientation]].join(' ')\n}\n\nexport const sliderMarkTickBaseClass = 'absolute h-1.5 w-1.5 rounded-[var(--gr-radius-full)] bg-[var(--gr-bg)] ring-1 ring-[var(--gr-brd)]'\n\nexport const sliderMarkTickOrientationClass: Record<GrSliderOrientation, string> = {\n horizontal: 'top-1/2 -translate-x-1/2 -translate-y-1/2',\n vertical: 'left-1/2 -translate-x-1/2 translate-y-1/2',\n}\n\nexport function sliderMarkTickClass(orientation: GrSliderOrientation = 'horizontal'): string {\n return [sliderMarkTickBaseClass, sliderMarkTickOrientationClass[orientation]].join(' ')\n}\n// Подписи меток уводим под дорожку (`top-full` + отступ, ниже бегунка) и запрещаем\n// перенос (`whitespace-nowrap`) — иначе крайняя подпись рвётся по буквам.\nexport const sliderMarkLabelClass = 'absolute whitespace-nowrap text-[length:var(--gr-text-2xs)] leading-none text-[var(--gr-muted-fg)]'\n\nexport const sliderMarkLabelDisabledClass = 'text-[var(--gr-disabled-fg)]'\n\n/** Вертикальные подписи уходят вправо от дорожки: под ней им места нет. */\nexport const sliderMarkLabelVerticalClass = 'left-full ml-2.5 translate-y-1/2'\nexport const sliderMarkLabelHorizontalClass = 'top-full mt-2.5'\n\n// Выравнивание подписи по позиции: центр для внутренних меток, а крайние (0% и\n// 100%) прижимаем внутрь, чтобы они не вылезали за края дорожки и не обрезались.\nexport function sliderMarkLabelClassFor(\n pct: number,\n options: { orientation?: GrSliderOrientation, disabled?: boolean } = {},\n): string {\n const orientation = options.orientation ?? 'horizontal'\n const tone = options.disabled ? sliderMarkLabelDisabledClass : ''\n\n if (orientation === 'vertical')\n return [sliderMarkLabelClass, sliderMarkLabelVerticalClass, tone].filter(Boolean).join(' ')\n\n const align = pct <= 0.5 ? 'translate-x-0' : pct >= 99.5 ? '-translate-x-full' : '-translate-x-1/2'\n return [sliderMarkLabelClass, sliderMarkLabelHorizontalClass, align, tone].filter(Boolean).join(' ')\n}\n\nexport const sliderRootBaseClass = 'relative select-none'\n\nexport const sliderRootOrientationClass: Record<GrSliderOrientation, string> = {\n horizontal: 'w-full',\n vertical: 'inline-flex',\n}\n\n/** Горизонтальный отступ обёртки вертикали — та же роль, что у `py-*` у горизонтали. */\nexport const sliderPaddingVerticalBySize: Record<GrSliderSize, string> = {\n xs: 'px-1',\n sm: 'px-1.5',\n md: 'px-2',\n lg: 'px-2.5',\n}\n\nexport function sliderRootClass(options: {\n size: GrSliderSize\n disabled: boolean\n hasMarks?: boolean\n orientation?: GrSliderOrientation\n}): string {\n const orientation = options.orientation ?? 'horizontal'\n const vertical = orientation === 'vertical'\n\n return [\n sliderRootBaseClass,\n sliderRootOrientationClass[orientation],\n vertical ? sliderPaddingVerticalBySize[options.size] : sliderPaddingBySize[options.size],\n // Резервируем место под подписи меток, чтобы они не наезжали на соседний контент.\n options.hasMarks ? (vertical ? 'mr-10' : 'mb-7') : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n"],"mappings":";;;;;;;;;;;;;;AA2BA,IAAa,0BAAwD;CACnE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,yBAAuD;CAClE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,iCAAiC;AAG9C,IAAa,wBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAGA,IAAa,sBAAoD;CAC/D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;;;AAUA,IAAa,kBAAkB;AAE/B,IAAa,sBAAsB;;AAGnC,IAAa,6BAAkE;CAC7E,YAAY;CACZ,UAAU;AACZ;;;;;AAMA,IAAa,0BAA0B;AACvC,IAAa,yBAAyB;AAEtC,SAAgB,gBAAgB,UAA2B;CACzD,OAAO,CAAC,qBAAqB,WAAW,0BAA0B,sBAAsB,CAAC,CAAC,KAAK,GAAG;AACpG;AAUA,IAAa,uBAAuB;;AAGpC,IAAa,8BAAmE;CAC9E,YAAY;CACZ,UAAU;AACZ;AAEA,IAAa,2BAA2B;AACxC,IAAa,0BAA0B;AAEvC,SAAgB,iBAAiB,SAItB;CACT,OAAO;EACL;EACA,4BAA4B,QAAQ,eAAe;EACnD,sBAAsB,QAAQ;EAC9B,QAAQ,WAAW,2BAA2B;CAChD,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,IAAa,yBAAyB;;AAGtC,IAAa,gCAAqE;CAChF,YAAY;CACZ,UAAU;AACZ;AAEA,SAAgB,mBAAmB,cAAmC,cAAsB;CAC1F,OAAO,CAAC,wBAAwB,8BAA8B,YAAY,CAAC,CAAC,KAAK,GAAG;AACtF;AAEA,IAAa,0BAA0B;AAEvC,IAAa,iCAAsE;CACjF,YAAY;CACZ,UAAU;AACZ;AAEA,SAAgB,oBAAoB,cAAmC,cAAsB;CAC3F,OAAO,CAAC,yBAAyB,+BAA+B,YAAY,CAAC,CAAC,KAAK,GAAG;AACxF;AAGA,IAAa,uBAAuB;AAEpC,IAAa,+BAA+B;;AAG5C,IAAa,+BAA+B;AAC5C,IAAa,iCAAiC;AAI9C,SAAgB,wBACd,KACA,UAAqE,CAAC,GAC9D;CACR,MAAM,cAAc,QAAQ,eAAe;CAC3C,MAAM,OAAO,QAAQ,WAAW,+BAA+B;CAE/D,IAAI,gBAAgB,YAClB,OAAO;EAAC;EAAsB;EAA8B;CAAI,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAG5F,OAAO;EAAC;EAAsB;EADhB,OAAO,KAAM,kBAAkB,OAAO,OAAO,sBAAsB;EACZ;CAAI,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AACrG;AAEA,IAAa,sBAAsB;AAEnC,IAAa,6BAAkE;CAC7E,YAAY;CACZ,UAAU;AACZ;;AAGA,IAAa,8BAA4D;CACvE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,SAAgB,gBAAgB,SAKrB;CACT,MAAM,cAAc,QAAQ,eAAe;CAC3C,MAAM,WAAW,gBAAgB;CAEjC,OAAO;EACL;EACA,2BAA2B;EAC3B,WAAW,4BAA4B,QAAQ,QAAQ,oBAAoB,QAAQ;EAEnF,QAAQ,WAAY,WAAW,UAAU,SAAU;CACrD,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { n as splitClassTokens } from "./classTokens-8v2XC74x.js";
|
|
2
|
-
import { defineGranularComponent } from "@feugene/unocss-preset-granular/contract";
|
|
3
1
|
//#region src/components/GrSortableList/grSortableListStyles.ts
|
|
4
2
|
/**
|
|
5
3
|
* Классы `GrSortableList`. Единственный источник правды для шаблона и
|
|
@@ -41,28 +39,4 @@ var contentClass = "min-w-0 flex-1 text-[length:var(--gr-text-sm)] leading-[var(
|
|
|
41
39
|
var indicatorBeforeClass = "before:absolute before:inset-x-0 before:top-0 before:h-[var(--gr-sortable-indicator-width,2px)] before:bg-[var(--gr-sortable-indicator,var(--gr-primary))] before:content-empty";
|
|
42
40
|
var indicatorAfterClass = "after:absolute after:inset-x-0 after:bottom-0 after:h-[var(--gr-sortable-indicator-width,2px)] after:bg-[var(--gr-sortable-indicator,var(--gr-primary))] after:content-empty";
|
|
43
41
|
//#endregion
|
|
44
|
-
|
|
45
|
-
var grSortableListSafelist = [.../* @__PURE__ */ new Set([
|
|
46
|
-
...Object.values(listClass).flatMap(splitClassTokens),
|
|
47
|
-
...splitClassTokens(rowLayoutClass),
|
|
48
|
-
...splitClassTokens(rowFocusClass),
|
|
49
|
-
...splitClassTokens(rowDraggingClass),
|
|
50
|
-
...splitClassTokens(rowGrabbedClass),
|
|
51
|
-
...splitClassTokens(rowDisabledClass),
|
|
52
|
-
...splitClassTokens(dividedClass),
|
|
53
|
-
...splitClassTokens(emptyClass),
|
|
54
|
-
...splitClassTokens(handleClass),
|
|
55
|
-
...splitClassTokens(handleDisabledClass),
|
|
56
|
-
...splitClassTokens(contentClass),
|
|
57
|
-
...splitClassTokens(indicatorBeforeClass),
|
|
58
|
-
...splitClassTokens(indicatorAfterClass)
|
|
59
|
-
])];
|
|
60
|
-
//#endregion
|
|
61
|
-
//#region src/components/GrSortableList/config.ts
|
|
62
|
-
var grSortableListConfig = defineGranularComponent(import.meta.url, {
|
|
63
|
-
name: "GrSortableList",
|
|
64
|
-
safelist: grSortableListSafelist,
|
|
65
|
-
dependencies: ["GrCard"]
|
|
66
|
-
});
|
|
67
|
-
//#endregion
|
|
68
|
-
export { emptyClass as a, indicatorAfterClass as c, rowDisabledClass as d, rowDraggingClass as f, rowLayoutClass as h, dividedClass as i, indicatorBeforeClass as l, rowGrabbedClass as m, grSortableListSafelist as n, handleClass as o, rowFocusClass as p, contentClass as r, handleDisabledClass as s, grSortableListConfig as t, listClass as u };
|
|
42
|
+
export { handleDisabledClass as a, listClass as c, rowFocusClass as d, rowGrabbedClass as f, handleClass as i, rowDisabledClass as l, dividedClass as n, indicatorAfterClass as o, rowLayoutClass as p, emptyClass as r, indicatorBeforeClass as s, contentClass as t, rowDraggingClass as u };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grSortableListStyles-CxieDmpe.js","names":[],"sources":["../../src/components/GrSortableList/grSortableListStyles.ts"],"sourcesContent":["export type GrSortableOrientation = 'horizontal' | 'vertical'\n\n/**\n * Классы `GrSortableList`. Единственный источник правды для шаблона и\n * `safelist.ts`: литерал, живущий только здесь, до скана UnoCSS не доходит —\n * хелпер уезжает в общий чанк `dist/chunks/`.\n */\n\nexport const listClass: Record<GrSortableOrientation, string> = {\n vertical: 'flex flex-col',\n horizontal: 'flex flex-row flex-wrap',\n}\n\nexport const rowLayoutClass = 'relative flex items-center gap-2 px-4 py-3 transition-colors duration-[var(--gr-duration-fast)]'\n\n/**\n * Строка — остановка роверного фокуса, поэтому кольцо на ней, а не на ручке:\n * с клавиатуры берут строку целиком, ручка остаётся affordance для мыши.\n */\nexport const rowFocusClass = 'focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] focus-visible:ring-inset'\n\nexport const rowDraggingClass = 'bg-[var(--gr-sortable-row-bg-active,var(--gr-muted))]'\n\n/** Взятая с клавиатуры строка обязана отличаться от просто сфокусированной. */\nexport const rowGrabbedClass = 'bg-[var(--gr-sortable-row-bg-active,var(--gr-muted))] ring-2 ring-[var(--gr-ring)] ring-inset'\n\nexport const rowDisabledClass = 'cursor-not-allowed bg-[var(--gr-muted)] text-[var(--gr-muted-fg)]'\n\nexport const dividedClass = 'divide-y divide-[var(--gr-brd)]'\n\nexport const emptyClass = 'px-4 py-6 text-center text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)] text-[var(--gr-muted-fg)]'\n\n/**\n * Ручка не табируется: внутри роверного композита свой таб-стоп сломал бы\n * правило «один Tab на список» — тот же приём, что у ручки `GrTree`.\n */\n/**\n * `[touch-action:none]` вместо `touch-none`: утилиты нет ни в `presetMini`, ни\n * в extra-rules, класс молча не превратился бы в CSS — и вертикальный свайп по\n * ручке ушёл бы в прокрутку страницы. Тот же приём у дорожки `GrSlider`.\n */\nexport const handleClass = 'flex shrink-0 items-center justify-center rounded-[var(--gr-radius-sm)] text-[var(--gr-sortable-handle-color,var(--gr-muted-fg))] size-[var(--gr-sortable-handle-size,1.5rem)] cursor-grab [touch-action:none] focus:outline-none'\n\nexport const handleDisabledClass = 'cursor-not-allowed text-[var(--gr-muted-fg)]'\n\nexport const contentClass = 'min-w-0 flex-1 text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]'\n\n/**\n * Куда встанет строка — псевдоэлемент самой строки, а не отдельный узел:\n * лишний узел между строками ломает и `divide-y`, и подсчёт позиций.\n */\nexport const indicatorBeforeClass = 'before:absolute before:inset-x-0 before:top-0 before:h-[var(--gr-sortable-indicator-width,2px)] before:bg-[var(--gr-sortable-indicator,var(--gr-primary))] before:content-empty'\n\nexport const indicatorAfterClass = 'after:absolute after:inset-x-0 after:bottom-0 after:h-[var(--gr-sortable-indicator-width,2px)] after:bg-[var(--gr-sortable-indicator,var(--gr-primary))] after:content-empty'\n"],"mappings":";;;;;;AAQA,IAAa,YAAmD;CAC9D,UAAU;CACV,YAAY;AACd;AAEA,IAAa,iBAAiB;;;;;AAM9B,IAAa,gBAAgB;AAE7B,IAAa,mBAAmB;;AAGhC,IAAa,kBAAkB;AAE/B,IAAa,mBAAmB;AAEhC,IAAa,eAAe;AAE5B,IAAa,aAAa;;;;;;;;;;AAW1B,IAAa,cAAc;AAE3B,IAAa,sBAAsB;AAEnC,IAAa,eAAe;;;;;AAM5B,IAAa,uBAAuB;AAEpC,IAAa,sBAAsB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
//#region src/components/GrTable/grTableStyles.ts
|
|
2
|
+
/**
|
|
3
|
+
* `GrTable` — «тонкий» контейнер: он задаёт только кегль таблицы, паддинги
|
|
4
|
+
* ячеек остаются за потребителем (см. `GrTableProps`). Поэтому карта здесь
|
|
5
|
+
* одна, а метрики ячеек живут в `GrDataTable`, который рисует их сам.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Лестница 12/13/14/16 совпадает с `GrInput`, `GrTextarea` и `GrSelect` — это
|
|
9
|
+
* типографика контролов пакета, а не самодеятельность таблицы. В шкале
|
|
10
|
+
* `--gr-text-*` ступени 13px нет, и подстановка `--gr-text-sm` схлопнула бы
|
|
11
|
+
* `sm` и `md` в один кегль. Перевод всей лестницы на токены — отдельная
|
|
12
|
+
* системная задача.
|
|
13
|
+
*/
|
|
14
|
+
var tableSizes = {
|
|
15
|
+
xs: "text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]",
|
|
16
|
+
sm: "text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]",
|
|
17
|
+
md: "text-[length:var(--gr-control-text-md)] leading-[var(--gr-leading-sm)]",
|
|
18
|
+
lg: "text-[length:var(--gr-control-text-lg)] leading-[var(--gr-leading-base)]"
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Строка или группа строк, которая не входит в набор: подробности раскрытой
|
|
22
|
+
* строки, распорки виртуализатора. Помеченная ею `<tr>` не полосатится, не
|
|
23
|
+
* подсвечивается и **не участвует в счёте чётности** соседей.
|
|
24
|
+
*/
|
|
25
|
+
var DETAIL_ROW_ATTR = "data-gr-table-off-grid";
|
|
26
|
+
/**
|
|
27
|
+
* Только оттенок, без утилиты вокруг: целый класс отдельным литералом гейт
|
|
28
|
+
* safelist читает как употреблённый в разметке и требует его объявить, хотя
|
|
29
|
+
* сам по себе он нигде не стоит — он всегда хвост варианта.
|
|
30
|
+
*/
|
|
31
|
+
var STRIPE_TINT = "color-mix(in_srgb,var(--gr-muted)_35%,transparent)";
|
|
32
|
+
var HOVER_TINT = "color-mix(in_srgb,var(--gr-muted)_45%,transparent)";
|
|
33
|
+
/**
|
|
34
|
+
* Чередование строк и подсветка под курсором — на таблице, а не на ячейках.
|
|
35
|
+
*
|
|
36
|
+
* Форм тела две, и селектора поэтому тоже два. Обычное тело — одна `<tbody>`
|
|
37
|
+
* со строками; тело `GrDataTable` — группа `<tbody>` на строку, потому что
|
|
38
|
+
* второй ярус обязан лежать со своей строкой в одной группе (см. `rowGroups`
|
|
39
|
+
* у `GrTable`). Каждый селектор в чужой форме не совпадает ни с чем: в одной
|
|
40
|
+
* группе строка набора всегда первая, а единственная `<tbody>` никогда не
|
|
41
|
+
* чётная, — так что оба живут рядом и не спорят.
|
|
42
|
+
*
|
|
43
|
+
* `of S` здесь обязателен, и `:not()` снаружи его не заменяет: `nth-child`
|
|
44
|
+
* считает позицию среди **всех** сиблингов, поэтому обычный фильтр убрал бы
|
|
45
|
+
* полосу с самой служебной строки, но сдвинул бы чётность у всех, кто ниже.
|
|
46
|
+
* Форма `of S` перенумеровывает по отфильтрованному набору — это и нужно.
|
|
47
|
+
*/
|
|
48
|
+
var stripedClass = [`[&>tbody>tr:nth-child(even_of_:not([${DETAIL_ROW_ATTR}]))]:bg-[${STRIPE_TINT}]`, `[&>tbody:nth-child(even_of_tbody:not([${DETAIL_ROW_ATTR}]))>tr:not([${DETAIL_ROW_ATTR}])]:bg-[${STRIPE_TINT}]`].join(" ");
|
|
49
|
+
var hoverableClass = `[&>tbody>tr:not([${DETAIL_ROW_ATTR}]):hover]:bg-[${HOVER_TINT}]`;
|
|
50
|
+
/**
|
|
51
|
+
* Фон первой ячейки, когда колонка липкая.
|
|
52
|
+
*
|
|
53
|
+
* Наследовать фон строки нельзя, хотя это и просится: оттенки полосы и
|
|
54
|
+
* подсветки **полупрозрачны** (`color-mix(…, transparent)`), и сквозь такую
|
|
55
|
+
* ячейку уезжающие числа видно насквозь — проверено глазами. Поэтому те же
|
|
56
|
+
* оттенки собираются заново поверх непрозрачной карточки: визуально это тот же
|
|
57
|
+
* цвет, но без дыры.
|
|
58
|
+
*/
|
|
59
|
+
var STRIPE_OPAQUE = "color-mix(in_srgb,var(--gr-muted)_35%,var(--gr-card))";
|
|
60
|
+
var HOVER_OPAQUE = "color-mix(in_srgb,var(--gr-muted)_45%,var(--gr-card))";
|
|
61
|
+
var stickyColumnStripedClass = `[&>tbody>tr:nth-child(even_of_:not([${DETAIL_ROW_ATTR}]))>*:first-child]:bg-[${STRIPE_OPAQUE}]`;
|
|
62
|
+
var stickyColumnHoverableClass = `[&>tbody>tr:not([${DETAIL_ROW_ATTR}]):hover>*:first-child]:bg-[${HOVER_OPAQUE}]`;
|
|
63
|
+
var emptyCellClass = "px-4 py-8 text-center text-[var(--gr-muted-fg)]";
|
|
64
|
+
var loadingRowCellClass = "px-4 py-3";
|
|
65
|
+
//#endregion
|
|
66
|
+
export { stickyColumnStripedClass as a, stickyColumnHoverableClass as i, hoverableClass as n, stripedClass as o, loadingRowCellClass as r, tableSizes as s, emptyCellClass as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grTableStyles-CPSxDTOW.js","names":[],"sources":["../../src/components/GrTable/grTableStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrTableSize = GrComponentSize\n\n/**\n * `GrTable` — «тонкий» контейнер: он задаёт только кегль таблицы, паддинги\n * ячеек остаются за потребителем (см. `GrTableProps`). Поэтому карта здесь\n * одна, а метрики ячеек живут в `GrDataTable`, который рисует их сам.\n */\n/**\n * Лестница 12/13/14/16 совпадает с `GrInput`, `GrTextarea` и `GrSelect` — это\n * типографика контролов пакета, а не самодеятельность таблицы. В шкале\n * `--gr-text-*` ступени 13px нет, и подстановка `--gr-text-sm` схлопнула бы\n * `sm` и `md` в один кегль. Перевод всей лестницы на токены — отдельная\n * системная задача.\n */\nexport const tableSizes: Record<GrTableSize, string> = {\n xs: 'text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'text-[length:var(--gr-control-text-md)] leading-[var(--gr-leading-sm)]',\n lg: 'text-[length:var(--gr-control-text-lg)] leading-[var(--gr-leading-base)]',\n}\n\n/**\n * Строка или группа строк, которая не входит в набор: подробности раскрытой\n * строки, распорки виртуализатора. Помеченная ею `<tr>` не полосатится, не\n * подсвечивается и **не участвует в счёте чётности** соседей.\n */\nexport const DETAIL_ROW_ATTR = 'data-gr-table-off-grid'\n\n/**\n * Только оттенок, без утилиты вокруг: целый класс отдельным литералом гейт\n * safelist читает как употреблённый в разметке и требует его объявить, хотя\n * сам по себе он нигде не стоит — он всегда хвост варианта.\n */\nconst STRIPE_TINT = 'color-mix(in_srgb,var(--gr-muted)_35%,transparent)'\nconst HOVER_TINT = 'color-mix(in_srgb,var(--gr-muted)_45%,transparent)'\n\n/**\n * Чередование строк и подсветка под курсором — на таблице, а не на ячейках.\n *\n * Форм тела две, и селектора поэтому тоже два. Обычное тело — одна `<tbody>`\n * со строками; тело `GrDataTable` — группа `<tbody>` на строку, потому что\n * второй ярус обязан лежать со своей строкой в одной группе (см. `rowGroups`\n * у `GrTable`). Каждый селектор в чужой форме не совпадает ни с чем: в одной\n * группе строка набора всегда первая, а единственная `<tbody>` никогда не\n * чётная, — так что оба живут рядом и не спорят.\n *\n * `of S` здесь обязателен, и `:not()` снаружи его не заменяет: `nth-child`\n * считает позицию среди **всех** сиблингов, поэтому обычный фильтр убрал бы\n * полосу с самой служебной строки, но сдвинул бы чётность у всех, кто ниже.\n * Форма `of S` перенумеровывает по отфильтрованному набору — это и нужно.\n */\nexport const stripedClass = [\n `[&>tbody>tr:nth-child(even_of_:not([${DETAIL_ROW_ATTR}]))]:bg-[${STRIPE_TINT}]`,\n `[&>tbody:nth-child(even_of_tbody:not([${DETAIL_ROW_ATTR}]))>tr:not([${DETAIL_ROW_ATTR}])]:bg-[${STRIPE_TINT}]`,\n].join(' ')\n\nexport const hoverableClass = `[&>tbody>tr:not([${DETAIL_ROW_ATTR}]):hover]:bg-[${HOVER_TINT}]`\n\n/**\n * Фон первой ячейки, когда колонка липкая.\n *\n * Наследовать фон строки нельзя, хотя это и просится: оттенки полосы и\n * подсветки **полупрозрачны** (`color-mix(…, transparent)`), и сквозь такую\n * ячейку уезжающие числа видно насквозь — проверено глазами. Поэтому те же\n * оттенки собираются заново поверх непрозрачной карточки: визуально это тот же\n * цвет, но без дыры.\n */\nconst STRIPE_OPAQUE = 'color-mix(in_srgb,var(--gr-muted)_35%,var(--gr-card))'\nconst HOVER_OPAQUE = 'color-mix(in_srgb,var(--gr-muted)_45%,var(--gr-card))'\n\nexport const stickyColumnStripedClass = `[&>tbody>tr:nth-child(even_of_:not([${DETAIL_ROW_ATTR}]))>*:first-child]:bg-[${STRIPE_OPAQUE}]`\n\nexport const stickyColumnHoverableClass = `[&>tbody>tr:not([${DETAIL_ROW_ATTR}]):hover>*:first-child]:bg-[${HOVER_OPAQUE}]`\n\nexport const emptyCellClass = 'px-4 py-8 text-center text-[var(--gr-muted-fg)]'\nexport const loadingRowCellClass = 'px-4 py-3'\n"],"mappings":";;;;;;;;;;;;;AAgBA,IAAa,aAA0C;CACrD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;AAOA,IAAa,kBAAkB;;;;;;AAO/B,IAAM,cAAc;AACpB,IAAM,aAAa;;;;;;;;;;;;;;;;AAiBnB,IAAa,eAAe,CAC1B,uCAAuC,gBAAgB,WAAW,YAAY,IAC9E,yCAAyC,gBAAgB,cAAc,gBAAgB,UAAU,YAAY,EAC/G,CAAC,CAAC,KAAK,GAAG;AAEV,IAAa,iBAAiB,oBAAoB,gBAAgB,gBAAgB,WAAW;;;;;;;;;;AAW7F,IAAM,gBAAgB;AACtB,IAAM,eAAe;AAErB,IAAa,2BAA2B,uCAAuC,gBAAgB,yBAAyB,cAAc;AAEtI,IAAa,6BAA6B,oBAAoB,gBAAgB,8BAA8B,aAAa;AAEzH,IAAa,iBAAiB;AAC9B,IAAa,sBAAsB"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { n as splitClassTokens } from "./classTokens-8v2XC74x.js";
|
|
2
|
-
import { defineGranularComponent } from "@feugene/unocss-preset-granular/contract";
|
|
3
1
|
//#region src/components/GrTabs/grTabsStyles.ts
|
|
4
2
|
/** Высота вкладки повторяет шкалу `GrButton`: вкладки часто стоят с ним в один ряд. */
|
|
5
3
|
var tabSizes = {
|
|
@@ -123,37 +121,4 @@ function grTabsEmptyClass(size) {
|
|
|
123
121
|
return [tabsEmptyBase, tabSizes[size]].join(" ");
|
|
124
122
|
}
|
|
125
123
|
//#endregion
|
|
126
|
-
|
|
127
|
-
var grTabsSafelist = [.../* @__PURE__ */ new Set([
|
|
128
|
-
...Object.values(tabSizes).flatMap(splitClassTokens),
|
|
129
|
-
...Object.values(tabBadgeSizes).flatMap(splitClassTokens),
|
|
130
|
-
...Object.values(tabCloseSizes).flatMap(splitClassTokens),
|
|
131
|
-
...Object.values(tabCloseIconSizes).flatMap(splitClassTokens),
|
|
132
|
-
...Object.values(tablistSizes).flatMap(splitClassTokens),
|
|
133
|
-
...Object.values(tablistLineSizes).flatMap(splitClassTokens),
|
|
134
|
-
...Object.values(tablistVariants).flatMap(splitClassTokens),
|
|
135
|
-
...Object.values(tablistVerticalVariants).flatMap(splitClassTokens),
|
|
136
|
-
...Object.values(tabVariantBase).flatMap(splitClassTokens),
|
|
137
|
-
...Object.values(tabStateClasses).flatMap((state) => [
|
|
138
|
-
...splitClassTokens(state.active),
|
|
139
|
-
...splitClassTokens(state.idle),
|
|
140
|
-
...splitClassTokens(state.disabled)
|
|
141
|
-
]),
|
|
142
|
-
...splitClassTokens(tablistBase),
|
|
143
|
-
...splitClassTokens(tablistScrollClass),
|
|
144
|
-
...splitClassTokens(tablistColumnClass),
|
|
145
|
-
...splitClassTokens(tabBase),
|
|
146
|
-
...splitClassTokens(tabBadgeBase),
|
|
147
|
-
...splitClassTokens(tabContentClass),
|
|
148
|
-
...splitClassTokens(tabIconClass),
|
|
149
|
-
...splitClassTokens(tabCloseBase),
|
|
150
|
-
...splitClassTokens(tabsEmptyBase)
|
|
151
|
-
])];
|
|
152
|
-
//#endregion
|
|
153
|
-
//#region src/components/GrTabs/config.ts
|
|
154
|
-
var grTabsConfig = defineGranularComponent(import.meta.url, {
|
|
155
|
-
name: "GrTabs",
|
|
156
|
-
safelist: grTabsSafelist
|
|
157
|
-
});
|
|
158
|
-
//#endregion
|
|
159
|
-
export { grTabsEmptyClass as a, tabCloseIconSizes as c, grTabsCloseClass as i, tabContentClass as l, grTabsSafelist as n, grTabsListClass as o, grTabsBadgeClass as r, grTabsTabClass as s, grTabsConfig as t, tabIconClass as u };
|
|
124
|
+
export { tablistVerticalVariants as C, tablistVariants as S, tablistBase as _, grTabsTabClass as a, tablistScrollClass as b, tabBase as c, tabCloseSizes as d, tabContentClass as f, tabVariantBase as g, tabStateClasses as h, grTabsListClass as i, tabCloseBase as l, tabSizes as m, grTabsCloseClass as n, tabBadgeBase as o, tabIconClass as p, grTabsEmptyClass as r, tabBadgeSizes as s, grTabsBadgeClass as t, tabCloseIconSizes as u, tablistColumnClass as v, tabsEmptyBase as w, tablistSizes as x, tablistLineSizes as y };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grTabsStyles-DIz2VdIm.js","names":[],"sources":["../../src/components/GrTabs/grTabsStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrTabsSize = GrComponentSize\n\n/**\n * `pills` — вкладки-таблетки в общей обойме, `line` — классический ряд с\n * подчёркиванием активной. Имя `pills` общее с `GrSegmented`: у компонентов\n * одна роль, и вид с таким названием у них совпадает.\n */\nexport const GR_TABS_VARIANTS = ['pills', 'line'] as const\nexport type GrTabsVariant = typeof GR_TABS_VARIANTS[number]\n\nexport type GrTabsOrientation = 'horizontal' | 'vertical'\n\n/** Высота вкладки повторяет шкалу `GrButton`: вкладки часто стоят с ним в один ряд. */\nexport const tabSizes: Record<GrTabsSize, string> = {\n xs: 'h-7 px-2 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'h-8 px-2.5 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n md: 'h-10 px-3 text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'h-11 px-4 text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\n/** Счётчик у вкладки: на ступень мельче подписи. */\nexport const tabBadgeSizes: Record<GrTabsSize, string> = {\n xs: 'text-[length:var(--gr-text-2xs)] leading-[var(--gr-leading-2xs)] px-1 py-0.5',\n sm: 'text-[length:var(--gr-text-2xs)] leading-[var(--gr-leading-2xs)] px-1.5 py-0.5',\n md: 'text-[length:var(--gr-text-2xs)] leading-[var(--gr-leading-2xs)] px-1.5 py-0.5',\n lg: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)] px-2 py-0.5',\n}\n\n/** Обойма вокруг вкладок: на мелких ступенях рамка съедала бы высоту. */\nexport const tablistSizes: Record<GrTabsSize, string> = {\n xs: 'gap-0.5 p-0.5',\n sm: 'gap-1 p-1',\n md: 'gap-1 p-1',\n lg: 'gap-1 p-1.5',\n}\n\n/** `line` живёт без обоймы, поэтому и без внутренних отступов. */\nexport const tablistLineSizes: Record<GrTabsSize, string> = {\n xs: 'gap-1',\n sm: 'gap-2',\n md: 'gap-2',\n lg: 'gap-3',\n}\n\nexport const tablistBase = 'inline-flex max-w-full'\n\nexport const tablistVariants: Record<GrTabsVariant, string> = {\n pills: 'rounded-[var(--gr-radius-lg)] border border-[var(--gr-brd)] bg-[var(--gr-muted)]',\n line: 'border-b border-[var(--gr-brd)]',\n}\n\n/**\n * Вертикальный `line` подчёркивает вкладку сбоку, а не снизу: линия должна идти\n * вдоль списка, иначе она отделяет вкладки друг от друга вместо ряда целиком.\n */\nexport const tablistVerticalVariants: Record<GrTabsVariant, string> = {\n pills: '',\n line: 'border-b-0 border-r border-[var(--gr-brd)]',\n}\n\n/**\n * Переполнение прокручивается, а не переносится строкой: перенос ломает ряд и\n * уводит вкладки под панель. Полоса прокрутки скрыта — ряд ведёт клавиатура и\n * автоскролл к активной вкладке.\n */\nexport const tablistScrollClass = 'overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden'\n\n/** Вертикальный ряд — колонка; прокрутки ему не нужно: он растёт вниз. */\nexport const tablistColumnClass = 'flex-col'\n\nexport const tabBase = 'shrink-0 font-600 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\n// Цвет подчёркивания задаёт только состояние: `border-transparent` в базе имеет\n// ту же специфичность, что и цвет активной вкладки, и побеждал бы через раз —\n// по порядку правил в сгенерированном CSS, а не по порядку классов в атрибуте.\nexport const tabVariantBase: Record<GrTabsVariant, string> = {\n pills: 'rounded-[var(--gr-radius-md)]',\n line: 'rounded-[var(--gr-radius-md)] rounded-b-[var(--gr-radius-none)] border-b-2 -mb-px',\n}\n\nexport const tabStateClasses: Record<GrTabsVariant, { active: string, idle: string, disabled: string }> = {\n pills: {\n active: 'bg-[var(--gr-card)] text-[var(--gr-fg)] border border-[var(--gr-brd)]',\n idle: 'text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)] hover:bg-[color-mix(in_srgb,var(--gr-card)_70%,transparent)]',\n disabled: 'cursor-not-allowed text-[var(--gr-disabled-fg)]',\n },\n line: {\n active: 'border-[var(--gr-primary)] text-[var(--gr-fg)]',\n idle: 'border-transparent text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)] hover:border-[var(--gr-brd)]',\n disabled: 'border-transparent cursor-not-allowed text-[var(--gr-disabled-fg)]',\n },\n}\n\nexport const tabIconClass = 'h-4 w-4 shrink-0'\n\nexport const tabContentClass = 'inline-flex items-center gap-2'\n\n/**\n * Крестик закрытия. Кнопкой он быть не может: `role=\"tab\"` объявляет потомков\n * презентационными, и вложенный интерактив теряется у скринридера (axe:\n * `nested-interactive`). Поэтому это `<span>`, а клик по нему разбирает\n * обработчик самой вкладки.\n *\n * Своего фокус-кольца у него нет по той же причине — в таб-порядке он не стоит,\n * с клавиатуры закрытие идёт по `Delete`/`Backspace`.\n */\nexport const tabCloseBase = 'inline-flex items-center justify-center shrink-0 rounded-[var(--gr-radius-sm)] text-[var(--gr-muted-fg)] transition-colors hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)]'\n\nexport const tabCloseSizes: Record<GrTabsSize, string> = {\n xs: 'h-4 w-4',\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-5 w-5',\n}\n\nexport const tabCloseIconSizes: Record<GrTabsSize, string> = {\n xs: 'h-3 w-3',\n sm: 'h-3 w-3',\n md: 'h-4 w-4',\n lg: 'h-4 w-4',\n}\n\n/** Пустой ряд держит высоту вкладки: иначе соседние блоки прыгают при закрытии последней. */\nexport const tabsEmptyBase = 'inline-flex items-center text-[var(--gr-muted-fg)]'\n\nexport const tabBadgeBase = 'rounded-[var(--gr-radius-full)] bg-[var(--gr-secondary)] text-[var(--gr-secondary-fg)]'\n\nexport function grTabsListClass(options: {\n variant: GrTabsVariant\n size: GrTabsSize\n orientation: GrTabsOrientation\n}): string {\n const vertical = options.orientation === 'vertical'\n\n return [\n tablistBase,\n tablistVariants[options.variant],\n vertical ? tablistVerticalVariants[options.variant] : '',\n options.variant === 'pills' ? tablistSizes[options.size] : tablistLineSizes[options.size],\n vertical ? tablistColumnClass : tablistScrollClass,\n ].filter(Boolean).join(' ')\n}\n\nexport function grTabsTabClass(options: {\n variant: GrTabsVariant\n size: GrTabsSize\n active: boolean\n disabled: boolean\n}): string {\n const state = tabStateClasses[options.variant]\n\n return [\n tabBase,\n tabVariantBase[options.variant],\n tabSizes[options.size],\n options.disabled ? state.disabled : options.active ? state.active : state.idle,\n ].join(' ')\n}\n\nexport function grTabsBadgeClass(size: GrTabsSize): string {\n return [tabBadgeBase, tabBadgeSizes[size]].join(' ')\n}\n\nexport function grTabsCloseClass(size: GrTabsSize): string {\n return [tabCloseBase, tabCloseSizes[size]].join(' ')\n}\n\nexport function grTabsEmptyClass(size: GrTabsSize): string {\n return [tabsEmptyBase, tabSizes[size]].join(' ')\n}\n"],"mappings":";;AAeA,IAAa,WAAuC;CAClD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,gBAA4C;CACvD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,eAA2C;CACtD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,mBAA+C;CAC1D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,cAAc;AAE3B,IAAa,kBAAiD;CAC5D,OAAO;CACP,MAAM;AACR;;;;;AAMA,IAAa,0BAAyD;CACpE,OAAO;CACP,MAAM;AACR;;;;;;AAOA,IAAa,qBAAqB;;AAGlC,IAAa,qBAAqB;AAElC,IAAa,UAAU;AAKvB,IAAa,iBAAgD;CAC3D,OAAO;CACP,MAAM;AACR;AAEA,IAAa,kBAA6F;CACxG,OAAO;EACL,QAAQ;EACR,MAAM;EACN,UAAU;CACZ;CACA,MAAM;EACJ,QAAQ;EACR,MAAM;EACN,UAAU;CACZ;AACF;AAEA,IAAa,eAAe;AAE5B,IAAa,kBAAkB;;;;;;;;;;AAW/B,IAAa,eAAe;AAE5B,IAAa,gBAA4C;CACvD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,oBAAgD;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,gBAAgB;AAE7B,IAAa,eAAe;AAE5B,SAAgB,gBAAgB,SAIrB;CACT,MAAM,WAAW,QAAQ,gBAAgB;CAEzC,OAAO;EACL;EACA,gBAAgB,QAAQ;EACxB,WAAW,wBAAwB,QAAQ,WAAW;EACtD,QAAQ,YAAY,UAAU,aAAa,QAAQ,QAAQ,iBAAiB,QAAQ;EACpF,WAAW,qBAAqB;CAClC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC5B;AAEA,SAAgB,eAAe,SAKpB;CACT,MAAM,QAAQ,gBAAgB,QAAQ;CAEtC,OAAO;EACL;EACA,eAAe,QAAQ;EACvB,SAAS,QAAQ;EACjB,QAAQ,WAAW,MAAM,WAAW,QAAQ,SAAS,MAAM,SAAS,MAAM;CAC5E,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,SAAgB,iBAAiB,MAA0B;CACzD,OAAO,CAAC,cAAc,cAAc,KAAK,CAAC,CAAC,KAAK,GAAG;AACrD;AAEA,SAAgB,iBAAiB,MAA0B;CACzD,OAAO,CAAC,cAAc,cAAc,KAAK,CAAC,CAAC,KAAK,GAAG;AACrD;AAEA,SAAgB,iBAAiB,MAA0B;CACzD,OAAO,CAAC,eAAe,SAAS,KAAK,CAAC,CAAC,KAAK,GAAG;AACjD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/components/GrTooltip/grTooltipStyles.ts
|
|
2
|
+
/** Панель подсказки: кегль и внутренние поля. */
|
|
3
|
+
var panelSizes = {
|
|
4
|
+
xs: "px-1.5 py-0.5 text-[length:var(--gr-control-text-3xs)] leading-[var(--gr-control-leading-3xs)]",
|
|
5
|
+
sm: "px-2 py-1 text-[length:var(--gr-control-text-2xs)] leading-[var(--gr-control-leading-2xs)]",
|
|
6
|
+
md: "px-2 py-1 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]",
|
|
7
|
+
lg: "px-3 py-1.5 text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]"
|
|
8
|
+
};
|
|
9
|
+
/** Ширина панели растёт вместе с кеглем — иначе на `lg` строка рвётся втрое. */
|
|
10
|
+
var panelWidths = {
|
|
11
|
+
xs: "max-w-[220px]",
|
|
12
|
+
sm: "max-w-[260px]",
|
|
13
|
+
md: "max-w-[280px]",
|
|
14
|
+
lg: "max-w-[340px]"
|
|
15
|
+
};
|
|
16
|
+
/** Дефолтный триггер — иконка info из шкалы `GrIcon` (`xs…lg` → `14…20px`). */
|
|
17
|
+
var triggerIconSizes = {
|
|
18
|
+
xs: "xs",
|
|
19
|
+
sm: "xs",
|
|
20
|
+
md: "sm",
|
|
21
|
+
lg: "md"
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
export { panelWidths as n, triggerIconSizes as r, panelSizes as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grTooltipStyles-CtbGEEGV.js","names":[],"sources":["../../src/components/GrTooltip/grTooltipStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrTooltipSize = GrComponentSize\n\n/** Панель подсказки: кегль и внутренние поля. */\nexport const panelSizes: Record<GrTooltipSize, string> = {\n xs: 'px-1.5 py-0.5 text-[length:var(--gr-control-text-3xs)] leading-[var(--gr-control-leading-3xs)]',\n sm: 'px-2 py-1 text-[length:var(--gr-control-text-2xs)] leading-[var(--gr-control-leading-2xs)]',\n md: 'px-2 py-1 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n lg: 'px-3 py-1.5 text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n}\n\n/** Ширина панели растёт вместе с кеглем — иначе на `lg` строка рвётся втрое. */\nexport const panelWidths: Record<GrTooltipSize, string> = {\n xs: 'max-w-[220px]',\n sm: 'max-w-[260px]',\n md: 'max-w-[280px]',\n lg: 'max-w-[340px]',\n}\n\n/** Дефолтный триггер — иконка info из шкалы `GrIcon` (`xs…lg` → `14…20px`). */\nexport const triggerIconSizes: Record<GrTooltipSize, GrComponentSize> = {\n xs: 'xs',\n sm: 'xs',\n md: 'sm',\n lg: 'md',\n}\n"],"mappings":";;AAKA,IAAa,aAA4C;CACvD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,cAA6C;CACxD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,mBAA2D;CACtE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN"}
|