@feugene/granularity 0.30.0 → 0.31.1
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 +0 -1
- package/dist/chunks/adapter-CAOxmn2G.js.map +1 -1
- package/dist/chunks/{config-BHcS5Cwm.js → config-87fszqnD.js} +1 -1
- package/dist/chunks/{config-BHcS5Cwm.js.map → config-87fszqnD.js.map} +1 -1
- package/dist/chunks/config-A-bBiotF.js.map +1 -1
- package/dist/chunks/config-B3J0alyY.js.map +1 -1
- package/dist/chunks/config-BhfNgyWL.js.map +1 -1
- package/dist/chunks/config-Bjn30smH.js.map +1 -1
- package/dist/chunks/config-BqT6PMzO.js.map +1 -1
- package/dist/chunks/config-C0Ea9ePP.js.map +1 -1
- package/dist/chunks/config-C0Eu8jpG.js.map +1 -1
- package/dist/chunks/config-CDat1wXf.js.map +1 -1
- package/dist/chunks/{config-DO8mjeIo.js → config-CIkdsWUk.js} +6 -2
- package/dist/chunks/config-CIkdsWUk.js.map +1 -0
- package/dist/chunks/config-CQLNjc9X2.js.map +1 -1
- package/dist/chunks/config-CbEbLyDE.js.map +1 -1
- package/dist/chunks/{config-jyr6AIZt2.js → config-CuQmUkMw2.js} +2 -2
- package/dist/chunks/{config-jyr6AIZt2.js.map → config-CuQmUkMw2.js.map} +1 -1
- package/dist/chunks/config-DeyT9dJl.js.map +1 -1
- package/dist/chunks/config-DnF472Ox.js.map +1 -1
- package/dist/chunks/config-DwABJHEo.js.map +1 -1
- package/dist/chunks/{config-tiUtEn4Q.js → config-E1cTyRVV.js} +1 -1
- package/dist/chunks/{config-tiUtEn4Q.js.map → config-E1cTyRVV.js.map} +1 -1
- package/dist/chunks/config-MmPym-Z72.js.map +1 -1
- package/dist/chunks/config-T3-DMXYm.js.map +1 -1
- package/dist/chunks/config-Yy67uWHY.js.map +1 -1
- package/dist/chunks/config-_jbgsFpw.js.map +1 -1
- package/dist/chunks/config-g8-JGZ_Y.js.map +1 -1
- package/dist/chunks/config-mlheIMtV.js.map +1 -1
- package/dist/chunks/config-rLkc9Zn2.js.map +1 -1
- package/dist/chunks/config-uzUuosv7.js.map +1 -1
- package/dist/chunks/context-CTbuwcYs.js.map +1 -1
- package/dist/chunks/deltaTone-B5OoS1vo.js.map +1 -1
- package/dist/chunks/es-Do2CNrC2.js.map +1 -1
- package/dist/chunks/fileValidation-D5TFBhbv.js.map +1 -1
- package/dist/chunks/focusables-BkzK42SQ.js.map +1 -1
- package/dist/chunks/{generated-DJ2dJ__C.js → generated-CSyPsWtM.js} +1 -1
- package/dist/chunks/{generated-DJ2dJ__C.js.map → generated-CSyPsWtM.js.map} +1 -1
- package/dist/chunks/grBadgeStyles-D8Mz73B5.js.map +1 -1
- package/dist/chunks/{grButtonStyles-B_-YRE__.js → grButtonStyles-B3wRWW_i.js} +4 -4
- package/dist/chunks/grButtonStyles-B3wRWW_i.js.map +1 -0
- package/dist/chunks/{grInputStyles-CAk3xKIb.js → grInputStyles-DgQYjJvD.js} +17 -1
- package/dist/chunks/{grInputStyles-CAk3xKIb.js.map → grInputStyles-DgQYjJvD.js.map} +1 -1
- package/dist/chunks/grLinkStyles-FME_qMpi.js.map +1 -1
- package/dist/chunks/grLoadingStyles-CnQaf5ry.js.map +1 -1
- package/dist/chunks/{grRadioStyles-D4gnU65n.js → grRadioStyles-DGL2QLy6.js} +1 -1
- package/dist/chunks/{grRadioStyles-D4gnU65n.js.map → grRadioStyles-DGL2QLy6.js.map} +1 -1
- package/dist/chunks/grSelectStyles-Cdtd10eY.js.map +1 -1
- package/dist/chunks/{grSliderStyles-B5uNxNJq.js → grSliderStyles-kaz6VXZ3.js} +9 -1
- package/dist/chunks/grSliderStyles-kaz6VXZ3.js.map +1 -0
- package/dist/chunks/{granular-provider-CHFaw3wU.js → granular-provider-Da2CJO6j.js} +4 -4
- package/dist/chunks/{granular-provider-CHFaw3wU.js.map → granular-provider-Da2CJO6j.js.map} +1 -1
- package/dist/chunks/granularityI18n-BC5zsj_d.js.map +1 -1
- package/dist/chunks/icon-Dag2tIMs.js.map +1 -1
- package/dist/chunks/inert-DIHCCn_1.js.map +1 -1
- package/dist/chunks/keyboard-DE2yhz_b.js.map +1 -1
- package/dist/chunks/numericStep-Bq2lj4ew.js.map +1 -1
- package/dist/chunks/optionFilter-DYw9XPPx.js.map +1 -1
- package/dist/chunks/overlayStack-C8cfsqXa.js.map +1 -1
- package/dist/chunks/portalRoot-CVhCgdG6.js.map +1 -1
- package/dist/chunks/renamedProp-BwcN-SJg.js.map +1 -1
- package/dist/chunks/{safelist-BOq5Li7p.js → safelist-DxkMj5IW.js} +1 -1
- package/dist/chunks/{safelist-BOq5Li7p.js.map → safelist-DxkMj5IW.js.map} +1 -1
- package/dist/chunks/slotNodes-DxNXpC7v.js.map +1 -1
- package/dist/chunks/useControlAddons-asUr10Pf.js.map +1 -1
- package/dist/chunks/useControlledOpen-DV3SqLTP.js.map +1 -1
- package/dist/chunks/useDragSort-0l47h4yb.js.map +1 -1
- package/dist/chunks/useFilePreviews-DnwgdyBs.js.map +1 -1
- package/dist/chunks/useFocusWithin-BwHE0rzm.js.map +1 -1
- package/dist/chunks/useModalOverlay-Cv5hF63W.js.map +1 -1
- package/dist/chunks/usePortalTarget-C0p-mhaM.js.map +1 -1
- package/dist/chunks/validation-5HhpanPP.js.map +1 -1
- package/dist/components/GrAlert/chunks/GrAlert-FAVf-ksH.js.map +1 -1
- package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-X6RlmiJQ.js → GrAutocomplete-rYEY15UI.js} +1 -1
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-rYEY15UI.js.map +1 -0
- package/dist/components/GrAutocomplete/index.js +1 -1
- package/dist/components/GrAutocomplete/styles.css +1 -1
- package/dist/components/GrAvatar/chunks/GrAvatar-CNmLmgcr.js.map +1 -1
- package/dist/components/GrBadge/chunks/{GrBadge-BsoocpF-.js → GrBadge-D2MfThPz.js} +1 -1
- package/dist/components/GrBadge/chunks/GrBadge-D2MfThPz.js.map +1 -0
- package/dist/components/GrBadge/index.js +1 -1
- package/dist/components/GrBadge/styles.css +1 -1
- package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-B-A3PRkE.js.map +1 -1
- package/dist/components/GrBottomNav/chunks/GrBottomNav-wtFatLjB.js.map +1 -1
- package/dist/components/GrBreadcrumbs/chunks/GrBreadcrumbs-DRDNan_n.js.map +1 -1
- package/dist/components/GrButton/chunks/{GrButton-Bw2AH4uX.js → GrButton-7GP0zObj.js} +1 -1
- package/dist/components/GrButton/chunks/GrButton-7GP0zObj.js.map +1 -0
- package/dist/components/GrButton/index.js +3 -3
- package/dist/components/GrButtonGroup/chunks/GrButtonGroup-CKyiAV8K.js.map +1 -1
- package/dist/components/GrCard/chunks/GrCard-BttXz1pQ.js.map +1 -1
- package/dist/components/GrCheckbox/chunks/GrCheckbox-CEcHIsXM.js.map +1 -1
- package/dist/components/GrCheckboxGroup/chunks/GrCheckboxGroup-BOwrVcFr.js.map +1 -1
- package/dist/components/GrChip/chunks/GrChip-C0vU69tf.js.map +1 -1
- package/dist/components/GrChipGroup/chunks/GrChipGroup-C78Vcwos.js.map +1 -1
- package/dist/components/GrCodeBlock/chunks/{GrCodeBlock-Dkvkr91t.js → GrCodeBlock-Dp0eEBTZ.js} +1 -1
- package/dist/components/GrCodeBlock/chunks/GrCodeBlock-Dp0eEBTZ.js.map +1 -0
- package/dist/components/GrCodeBlock/index.js +1 -1
- package/dist/components/GrCollapse/chunks/GrCollapse-BlW6ybdL.js.map +1 -1
- package/dist/components/GrColorPicker/chunks/{GrColorPicker-CE-xtNP-.js → GrColorPicker-B20gQ6AR.js} +2 -2
- package/dist/components/GrColorPicker/chunks/GrColorPicker-B20gQ6AR.js.map +1 -0
- package/dist/components/GrColorPicker/index.js +1 -1
- package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-C5abL2Y7.js → GrCommandPalette-Cd0Yo3Dw.js} +1 -1
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-Cd0Yo3Dw.js.map +1 -0
- package/dist/components/GrCommandPalette/index.js +1 -1
- package/dist/components/GrCommandPalette/styles.css +1 -1
- package/dist/components/GrConfigProvider/chunks/GrConfigProvider-BF7R3hgg.js.map +1 -1
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-B9mIU78E.js → GrConfirmDialog-DOsbRhoZ.js} +3 -3
- package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-DOsbRhoZ.js.map +1 -0
- package/dist/components/GrConfirmDialog/index.js +1 -1
- package/dist/components/GrContextMenu/chunks/GrContextMenu-_FKwQvuQ.js.map +1 -1
- package/dist/components/GrDataTable/chunks/{GrDataTable-C8a9_nCg.js → GrDataTable-CAGgRk27.js} +5 -3
- package/dist/components/GrDataTable/chunks/GrDataTable-CAGgRk27.js.map +1 -0
- package/dist/components/GrDataTable/index.js +1 -1
- package/dist/components/GrDelta/chunks/GrDelta-BZwkgQW-.js.map +1 -1
- package/dist/components/GrDescriptionList/chunks/GrDescriptionList-BMeCgFV3.js.map +1 -1
- package/dist/components/GrDialog/chunks/{GrDialog-bOUDYfmh.js → GrDialog-S1Vl-OhX.js} +1 -1
- package/dist/components/GrDialog/chunks/{GrDialog-bOUDYfmh.js.map → GrDialog-S1Vl-OhX.js.map} +1 -1
- package/dist/components/GrDialog/index.js +1 -1
- package/dist/components/GrDialogService/chunks/{GrDialogService-k4SYIv64.js → GrDialogService-Cuhc4YLp.js} +4 -4
- package/dist/components/GrDialogService/chunks/GrDialogService-Cuhc4YLp.js.map +1 -0
- package/dist/components/GrDialogService/index.js +1 -1
- package/dist/components/GrDivider/chunks/GrDivider-BXavGcMX.js.map +1 -1
- package/dist/components/GrDrawer/chunks/{GrDrawer-B7PiAcbU.js → GrDrawer-C0YqVE9e.js} +1 -1
- package/dist/components/GrDrawer/chunks/GrDrawer-C0YqVE9e.js.map +1 -0
- package/dist/components/GrDrawer/index.js +1 -1
- package/dist/components/GrDropdown/chunks/GrDropdown-13Wt9eB_.js.map +1 -1
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-GOzuAXsi.js.map +1 -1
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenuList-B33ZzwfB.js.map +1 -1
- package/dist/components/GrFilePreview/chunks/GrFilePreview-C9Z7hMK8.js.map +1 -1
- package/dist/components/GrFileUpload/chunks/GrFileUpload-NsHkRRIa.js.map +1 -1
- package/dist/components/GrForm/chunks/GrForm-CrnfCsgj.js.map +1 -1
- package/dist/components/GrFormField/chunks/GrFormField-DSylU7IU.js.map +1 -1
- package/dist/components/GrFormFile/chunks/{GrFormFile-CYtXU9HV.js → GrFormFile-B1jGZyIj.js} +2 -2
- package/dist/components/GrFormFile/chunks/GrFormFile-B1jGZyIj.js.map +1 -0
- package/dist/components/GrFormFile/index.js +1 -1
- package/dist/components/GrFormFile/styles.css +1 -1
- package/dist/components/GrIcon/chunks/GrIcon-Dmf0c9ba.js.map +1 -1
- package/dist/components/GrImageViewer/chunks/GrImageViewer-CyVN6Zpc.js.map +1 -1
- package/dist/components/GrInput/chunks/{GrInput-BqqoEl1b.js → GrInput-BLywRZUN.js} +10 -6
- package/dist/components/GrInput/chunks/GrInput-BLywRZUN.js.map +1 -0
- package/dist/components/GrInput/index.js +2 -2
- package/dist/components/GrInputTag/chunks/GrInputTag-Cj4A9Xgs.js.map +1 -1
- package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-CgwjoUJt.js → GrJsonViewer-BCZ7lE2k.js} +3 -3
- package/dist/components/GrJsonViewer/chunks/GrJsonViewer-BCZ7lE2k.js.map +1 -0
- package/dist/components/GrJsonViewer/index.js +1 -1
- package/dist/components/GrKbd/chunks/GrKbd-D2ga1H9i.js.map +1 -1
- package/dist/components/GrLink/chunks/GrLink-DYXw3W9w.js.map +1 -1
- package/dist/components/GrList/chunks/{GrList-DmT4qzLO.js → GrList-B_CRJB4c.js} +1 -1
- package/dist/components/GrList/chunks/GrList-B_CRJB4c.js.map +1 -0
- package/dist/components/GrList/index.js +1 -1
- package/dist/components/GrList/styles.css +1 -1
- package/dist/components/GrModal/chunks/GrModal-CCoWZuIl.js.map +1 -1
- package/dist/components/GrNavbar/chunks/{GrNavbar-C5EjMKaC.js → GrNavbar-_rtHKwTf.js} +1 -1
- package/dist/components/GrNavbar/chunks/{GrNavbar-C5EjMKaC.js.map → GrNavbar-_rtHKwTf.js.map} +1 -1
- package/dist/components/GrNavbar/index.js +1 -1
- package/dist/components/GrNumberInput/chunks/GrNumberInput-DQ59YICu.js.map +1 -1
- package/dist/components/GrPagination/chunks/{GrPagination-kYCx6PAS.js → GrPagination-B_kAhoAV.js} +2 -2
- package/dist/components/GrPagination/chunks/{GrPagination-kYCx6PAS.js.map → GrPagination-B_kAhoAV.js.map} +1 -1
- package/dist/components/GrPagination/index.js +1 -1
- package/dist/components/GrPopover/chunks/GrPopover-CofG-Tfe.js.map +1 -1
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-D1ADRFxx.js → GrPromptDialog-BuJQMZLM.js} +5 -5
- package/dist/components/GrPromptDialog/chunks/GrPromptDialog-BuJQMZLM.js.map +1 -0
- package/dist/components/GrPromptDialog/index.js +1 -1
- package/dist/components/GrRadio/chunks/{GrRadio-C_rESc5g.js → GrRadio-Aq3v8XgG.js} +1 -1
- package/dist/components/GrRadio/chunks/GrRadio-Aq3v8XgG.js.map +1 -0
- package/dist/components/GrRadio/index.js +2 -2
- package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-CdQO4G-U.js → GrRadioGroup-y9LVdTWh.js} +1 -1
- package/dist/components/GrRadioGroup/chunks/GrRadioGroup-y9LVdTWh.js.map +1 -0
- package/dist/components/GrRadioGroup/index.js +1 -1
- package/dist/components/GrRating/chunks/GrRating-IEiTOdnF.js.map +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-C_skObtv.js → GrResponseErrorBanner-CBVRpgIG.js} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-C_skObtv.js.map → GrResponseErrorBanner-CBVRpgIG.js.map} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-DudGc9LO.js → GrResponseErrorBanner-DMeOWlzj.js} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/GrResponseErrorBanner-DMeOWlzj.js.map +1 -0
- package/dist/components/GrResponseErrorBanner/index.js +2 -2
- package/dist/components/GrSegmented/chunks/GrSegmented-CB-VR-yL.js.map +1 -1
- package/dist/components/GrSelect/chunks/{GrSelect-CBp0twbF.js → GrSelect-gCeRFgQo.js} +2 -2
- package/dist/components/GrSelect/chunks/GrSelect-gCeRFgQo.js.map +1 -0
- package/dist/components/GrSelect/index.js +1 -1
- package/dist/components/GrSelect/styles.css +1 -1
- package/dist/components/GrSidebar/chunks/{GrSidebar-B8EQIlfW.js → GrSidebar-alkwBUzL.js} +1 -1
- package/dist/components/GrSidebar/chunks/GrSidebar-alkwBUzL.js.map +1 -0
- package/dist/components/GrSidebar/index.js +1 -1
- package/dist/components/GrSkeleton/chunks/GrSkeleton-CgfXxPQ2.js.map +1 -1
- package/dist/components/GrSlider/chunks/{GrSlider-DJfeEl4h.js → GrSlider-DTTrZTHK.js} +3 -3
- package/dist/components/GrSlider/chunks/GrSlider-DTTrZTHK.js.map +1 -0
- package/dist/components/GrSlider/index.js +2 -2
- package/dist/components/GrSortableList/chunks/GrSortableList-HyKX--rO.js.map +1 -1
- package/dist/components/GrSplitter/chunks/GrSplitter-MltjaADn.js.map +1 -1
- package/dist/components/GrStatistic/chunks/GrStatistic-qHVasK37.js.map +1 -1
- package/dist/components/GrSteps/chunks/GrSteps-C2jxpZoN.js.map +1 -1
- package/dist/components/GrSwitch/chunks/{GrSwitch-g_OOSkh7.js → GrSwitch-7Oe5QfQZ.js} +1 -1
- package/dist/components/GrSwitch/chunks/GrSwitch-7Oe5QfQZ.js.map +1 -0
- package/dist/components/GrSwitch/index.js +1 -1
- package/dist/components/GrTabPanels/chunks/GrTabPanels-BZQS8-JM.js.map +1 -1
- package/dist/components/GrTable/chunks/GrTable-Zcdz2St_.js.map +1 -1
- package/dist/components/GrTextarea/chunks/{GrTextarea-KREK75Bu.js → GrTextarea-DinXG12-.js} +10 -10
- package/dist/components/GrTextarea/chunks/GrTextarea-DinXG12-.js.map +1 -0
- package/dist/components/GrTextarea/index.js +1 -1
- package/dist/components/GrTimeline/chunks/GrTimeline-BiHpArsg.js.map +1 -1
- package/dist/components/GrToaster/chunks/{GrToaster-Dp7-4B8k.js → GrToaster-COXIBKzq.js} +2 -2
- package/dist/components/GrToaster/chunks/GrToaster-COXIBKzq.js.map +1 -0
- package/dist/components/GrToaster/index.js +1 -1
- package/dist/components/GrToaster/styles.css +1 -1
- package/dist/components/GrTooltip/chunks/GrTooltip-uYETdbCD.js.map +1 -1
- package/dist/components/GrTree/chunks/{GrTree-DC89I4AP.js → GrTree-Ci6CZfKR.js} +5 -5
- package/dist/components/GrTree/chunks/GrTree-Ci6CZfKR.js.map +1 -0
- package/dist/components/GrTree/index.js +1 -1
- package/dist/components/GrTree/styles.css +1 -1
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-CymO68Cv.js → GrTreeSelect-BHwgGJcT.js} +2 -2
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-BHwgGJcT.js.map +1 -0
- package/dist/components/GrTreeSelect/index.js +1 -1
- package/dist/composables/useAnnouncer.js.map +1 -1
- package/dist/composables/useComboboxNavigation.js.map +1 -1
- package/dist/composables/useDragGesture.js.map +1 -1
- package/dist/composables/useFocusTrap.js.map +1 -1
- package/dist/composables/useOverlayLayer.js.map +1 -1
- package/dist/composables/useRovingFocus.js.map +1 -1
- package/dist/composables/useTheme.js.map +1 -1
- package/dist/composables/useToast.js.map +1 -1
- package/dist/composables/useVirtualList.js.map +1 -1
- package/dist/directives/autofocus.js.map +1 -1
- package/dist/directives/autosize.js.map +1 -1
- package/dist/directives/clickOutside.js.map +1 -1
- package/dist/directives/dropzone.js.map +1 -1
- package/dist/directives/hotkey.js.map +1 -1
- package/dist/directives/loading.js.map +1 -1
- package/dist/granular-provider-node.js +1 -1
- package/dist/granular-provider.js +1 -1
- package/dist/index.js +35 -35
- package/dist/testing.js +2 -2
- package/dist/testing.js.map +1 -1
- package/dist/theme-apply.js.map +1 -1
- package/dist/theme.js +1 -1
- package/dist/theme.js.map +1 -1
- package/dist/tokens.js +1 -1
- package/dist/types/components/GrCodeBlock/tokenizeJson.d.ts +1 -3
- package/dist/types/components/GrImageViewer/GrImageViewer.vue.d.ts +1 -1
- package/dist/types/components/GrInput/GrInput.vue.d.ts +29 -13
- package/dist/types/components/GrInput/grInputStyles.d.ts +16 -0
- package/dist/types/components/GrSlider/grSliderStyles.d.ts +9 -1
- package/dist/types/components/GrTabPanels/GrTabPanel.vue.d.ts +3 -3
- package/dist/vue/index.js.map +1 -1
- package/dist/web-types.json +10 -1
- package/package.json +3 -3
- package/dist/chunks/config-DO8mjeIo.js.map +0 -1
- package/dist/chunks/grButtonStyles-B_-YRE__.js.map +0 -1
- package/dist/chunks/grSliderStyles-B5uNxNJq.js.map +0 -1
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-X6RlmiJQ.js.map +0 -1
- package/dist/components/GrBadge/chunks/GrBadge-BsoocpF-.js.map +0 -1
- package/dist/components/GrButton/chunks/GrButton-Bw2AH4uX.js.map +0 -1
- package/dist/components/GrCodeBlock/chunks/GrCodeBlock-Dkvkr91t.js.map +0 -1
- package/dist/components/GrColorPicker/chunks/GrColorPicker-CE-xtNP-.js.map +0 -1
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-C5abL2Y7.js.map +0 -1
- package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-B9mIU78E.js.map +0 -1
- package/dist/components/GrDataTable/chunks/GrDataTable-C8a9_nCg.js.map +0 -1
- package/dist/components/GrDialogService/chunks/GrDialogService-k4SYIv64.js.map +0 -1
- package/dist/components/GrDrawer/chunks/GrDrawer-B7PiAcbU.js.map +0 -1
- package/dist/components/GrFormFile/chunks/GrFormFile-CYtXU9HV.js.map +0 -1
- package/dist/components/GrInput/chunks/GrInput-BqqoEl1b.js.map +0 -1
- package/dist/components/GrJsonViewer/chunks/GrJsonViewer-CgwjoUJt.js.map +0 -1
- package/dist/components/GrList/chunks/GrList-DmT4qzLO.js.map +0 -1
- package/dist/components/GrPromptDialog/chunks/GrPromptDialog-D1ADRFxx.js.map +0 -1
- package/dist/components/GrRadio/chunks/GrRadio-C_rESc5g.js.map +0 -1
- package/dist/components/GrRadioGroup/chunks/GrRadioGroup-CdQO4G-U.js.map +0 -1
- package/dist/components/GrResponseErrorBanner/chunks/GrResponseErrorBanner-DudGc9LO.js.map +0 -1
- package/dist/components/GrSelect/chunks/GrSelect-CBp0twbF.js.map +0 -1
- package/dist/components/GrSidebar/chunks/GrSidebar-B8EQIlfW.js.map +0 -1
- package/dist/components/GrSlider/chunks/GrSlider-DJfeEl4h.js.map +0 -1
- package/dist/components/GrSwitch/chunks/GrSwitch-g_OOSkh7.js.map +0 -1
- package/dist/components/GrTextarea/chunks/GrTextarea-KREK75Bu.js.map +0 -1
- package/dist/components/GrToaster/chunks/GrToaster-Dp7-4B8k.js.map +0 -1
- package/dist/components/GrTree/chunks/GrTree-DC89I4AP.js.map +0 -1
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-CymO68Cv.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grBadgeStyles-D8Mz73B5.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\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}\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')
|
|
1
|
+
{"version":3,"file":"grBadgeStyles-D8Mz73B5.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\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}\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"],"mappings":";AAOA,IAAa,kBAA+C;CAC1D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AACA,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"}
|
|
@@ -14,10 +14,10 @@ var blockClass = "w-full";
|
|
|
14
14
|
* иначе стрелка пагинации превращалась бы в залитую плашку.
|
|
15
15
|
*/
|
|
16
16
|
var disabledClassByVariant = {
|
|
17
|
-
primary: "bg-[var(--gr-button-disabled-bg)] text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed",
|
|
18
|
-
secondary: "bg-[var(--gr-button-disabled-bg)] text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed",
|
|
19
|
-
outline: "bg-transparent text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed",
|
|
20
|
-
ghost: "bg-transparent text-[var(--gr-button-disabled-fg)] cursor-not-allowed",
|
|
17
|
+
"primary": "bg-[var(--gr-button-disabled-bg)] text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed",
|
|
18
|
+
"secondary": "bg-[var(--gr-button-disabled-bg)] text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed",
|
|
19
|
+
"outline": "bg-transparent text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed",
|
|
20
|
+
"ghost": "bg-transparent text-[var(--gr-button-disabled-fg)] cursor-not-allowed",
|
|
21
21
|
"ghost-border": "bg-transparent text-[var(--gr-button-disabled-fg)] border border-transparent cursor-not-allowed"
|
|
22
22
|
};
|
|
23
23
|
var grButtonBaseClass = base;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grButtonStyles-B3wRWW_i.js","names":[],"sources":["../../src/components/GrButton/grButtonStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { GrTone } from '../shared/tones'\n\nexport type GrButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'ghost-border'\nexport type GrButtonTone = GrTone\nexport type GrButtonSize = GrComponentSize\n\nexport type GrButtonClassOptions = {\n variant: GrButtonVariant\n tone: GrButtonTone\n size: GrButtonSize\n square: boolean\n /** Необязательные: `grButtonClass` — публичный хелпер, его зовёт и `GrRadio`. */\n disabled?: boolean\n block?: boolean\n}\n\nexport type GrButtonToneTokens = {\n solidBackground: string\n solidBackgroundHover: string\n solidBackgroundActive: string\n solidForeground: string\n accentText: string\n softBackground: string\n softBackgroundHover: string\n softBackgroundActive: string\n softForeground: string\n border: string\n borderHover: string\n borderActive: string\n}\n\nexport const base\n = 'inline-flex items-center justify-center gap-2 select-none whitespace-nowrap rounded-[var(--gr-button-radius,0.375rem)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] disabled:cursor-not-allowed'\n\n/** Кнопка на всю ширину контейнера. */\nexport const blockClass = 'w-full'\n\n/**\n * Отключённая кнопка гасится токенами, а не `opacity`: прозрачность разбавляет\n * выверенные на AA цвета, а кнопка чаще всего оказывается на цветной подложке,\n * где разбавленный текст проваливается первым.\n *\n * Классы применяются ВМЕСТО вариантных, а не поверх: два `bg-*` одной\n * специфичности разрулил бы порядок в сгенерированном CSS, а не порядок в\n * списке классов. Отсюда же и разбиение по вариантам: у прозрачных\n * (`outline`, `ghost`, `ghost-border`) заливки нет и в отключённом виде —\n * иначе стрелка пагинации превращалась бы в залитую плашку.\n */\nexport const disabledClassByVariant: Record<GrButtonVariant, string> = {\n 'primary': 'bg-[var(--gr-button-disabled-bg)] text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed',\n 'secondary': 'bg-[var(--gr-button-disabled-bg)] text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed',\n 'outline': 'bg-transparent text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed',\n 'ghost': 'bg-transparent text-[var(--gr-button-disabled-fg)] cursor-not-allowed',\n 'ghost-border': 'bg-transparent text-[var(--gr-button-disabled-fg)] border border-transparent cursor-not-allowed',\n}\n\nexport const grButtonBaseClass = base\n\nexport const sizes: Record<GrButtonSize, string> = {\n xs: 'h-7 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)] px-2.5',\n sm: 'h-8 text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)] px-3',\n md: 'h-10 text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)] px-4',\n lg: 'h-11 text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)] px-5',\n}\n\n/**\n * Квадратный режим — через `--gr-button-square-size` с размерным дефолтом в\n * fallback: потребитель задаёт переменную в своём CSS и подгоняет кнопку под\n * свою сетку (приём из `GrSlider`). Размер задаётся только здесь: инлайн-стиль\n * в SFC перекрыл бы эти классы, и переменная перестала бы что-либо значить.\n */\nexport const squareSizes: Record<GrButtonSize, string> = {\n xs: 'h-[var(--gr-button-square-size,1.75rem)] w-[var(--gr-button-square-size,1.75rem)] min-w-[var(--gr-button-square-size,1.75rem)] p-0',\n sm: 'h-[var(--gr-button-square-size,2rem)] w-[var(--gr-button-square-size,2rem)] min-w-[var(--gr-button-square-size,2rem)] p-0',\n md: 'h-[var(--gr-button-square-size,2.5rem)] w-[var(--gr-button-square-size,2.5rem)] min-w-[var(--gr-button-square-size,2.5rem)] p-0',\n lg: 'h-[var(--gr-button-square-size,2.75rem)] w-[var(--gr-button-square-size,2.75rem)] min-w-[var(--gr-button-square-size,2.75rem)] p-0',\n}\n\nexport const tones: Record<GrButtonTone, GrButtonToneTokens> = {\n primary: {\n solidBackground: 'var(--gr-button-primary-bg,var(--gr-primary))',\n solidBackgroundHover: 'var(--gr-button-primary-bg-hover,var(--gr-primary-hover))',\n solidBackgroundActive: 'var(--gr-button-primary-bg-active,var(--gr-primary-active))',\n solidForeground: 'var(--gr-button-primary-fg,var(--gr-primary-fg))',\n accentText: 'var(--gr-accent-fg)',\n softBackground: 'var(--gr-button-primary-soft-bg)',\n softBackgroundHover: 'var(--gr-button-primary-soft-bg-hover)',\n softBackgroundActive: 'var(--gr-button-primary-soft-bg-active)',\n softForeground: 'var(--gr-accent-fg)',\n border: 'var(--gr-primary)',\n borderHover: 'var(--gr-primary-hover)',\n borderActive: 'var(--gr-primary-active)',\n },\n neutral: {\n solidBackground: 'var(--gr-secondary)',\n solidBackgroundHover: 'var(--gr-secondary-hover)',\n solidBackgroundActive: 'var(--gr-secondary-active)',\n solidForeground: 'var(--gr-secondary-fg)',\n accentText: 'var(--gr-fg)',\n softBackground: 'var(--gr-secondary)',\n softBackgroundHover: 'var(--gr-secondary-hover)',\n softBackgroundActive: 'var(--gr-secondary-active)',\n softForeground: 'var(--gr-secondary-fg)',\n border: 'var(--gr-brd)',\n borderHover: 'var(--gr-brd-hover,var(--gr-brd))',\n borderActive: 'var(--gr-brd-active,var(--gr-brd))',\n },\n success: {\n solidBackground: 'var(--gr-button-success-bg,var(--gr-success))',\n solidBackgroundHover: 'var(--gr-button-success-bg-hover,var(--gr-success-hover))',\n solidBackgroundActive: 'var(--gr-button-success-bg-active,var(--gr-success-active))',\n solidForeground: 'var(--gr-button-success-fg,var(--gr-success-fg,var(--gr-fg)))',\n accentText: 'var(--gr-success-text,var(--gr-success))',\n softBackground: 'var(--gr-button-success-soft-bg)',\n softBackgroundHover: 'var(--gr-button-success-soft-bg-hover)',\n softBackgroundActive: 'var(--gr-button-success-soft-bg-active)',\n softForeground: 'var(--gr-success-text,var(--gr-success))',\n border: 'var(--gr-success)',\n borderHover: 'var(--gr-success-hover)',\n borderActive: 'var(--gr-success-active)',\n },\n warning: {\n solidBackground: 'var(--gr-button-warning-bg,var(--gr-warning))',\n solidBackgroundHover: 'var(--gr-button-warning-bg-hover,var(--gr-warning-hover))',\n solidBackgroundActive: 'var(--gr-button-warning-bg-active,var(--gr-warning-active))',\n solidForeground: 'var(--gr-button-warning-fg,var(--gr-warning-fg,var(--gr-fg)))',\n accentText: 'var(--gr-warning-text,var(--gr-warning))',\n softBackground: 'var(--gr-button-warning-soft-bg)',\n softBackgroundHover: 'var(--gr-button-warning-soft-bg-hover)',\n softBackgroundActive: 'var(--gr-button-warning-soft-bg-active)',\n softForeground: 'var(--gr-warning-text,var(--gr-warning))',\n border: 'var(--gr-warning)',\n borderHover: 'var(--gr-warning-hover)',\n borderActive: 'var(--gr-warning-active)',\n },\n danger: {\n solidBackground: 'var(--gr-button-danger-bg,var(--gr-danger))',\n solidBackgroundHover: 'var(--gr-button-danger-bg-hover,var(--gr-danger-hover))',\n solidBackgroundActive: 'var(--gr-button-danger-bg-active,var(--gr-danger-active))',\n solidForeground: 'var(--gr-button-danger-fg,var(--gr-danger-fg,var(--gr-fg)))',\n accentText: 'var(--gr-danger-text,var(--gr-danger))',\n softBackground: 'var(--gr-button-danger-soft-bg)',\n softBackgroundHover: 'var(--gr-button-danger-soft-bg-hover)',\n softBackgroundActive: 'var(--gr-button-danger-soft-bg-active)',\n softForeground: 'var(--gr-danger-text,var(--gr-danger))',\n border: 'var(--gr-danger)',\n borderHover: 'var(--gr-danger-hover)',\n borderActive: 'var(--gr-danger-active)',\n },\n info: {\n solidBackground: 'var(--gr-button-info-bg,var(--gr-info))',\n solidBackgroundHover: 'var(--gr-button-info-bg-hover,var(--gr-info-hover))',\n solidBackgroundActive: 'var(--gr-button-info-bg-active,var(--gr-info-active))',\n solidForeground: 'var(--gr-button-info-fg,var(--gr-info-fg,var(--gr-fg)))',\n accentText: 'var(--gr-info-text,var(--gr-info))',\n softBackground: 'var(--gr-button-info-soft-bg)',\n softBackgroundHover: 'var(--gr-button-info-soft-bg-hover)',\n softBackgroundActive: 'var(--gr-button-info-soft-bg-active)',\n softForeground: 'var(--gr-info-text,var(--gr-info))',\n border: 'var(--gr-info)',\n borderHover: 'var(--gr-info-hover)',\n borderActive: 'var(--gr-info-active)',\n },\n slate: {\n solidBackground: 'var(--gr-button-slate-bg,var(--gr-slate))',\n solidBackgroundHover: 'var(--gr-button-slate-bg-hover,var(--gr-slate-hover))',\n solidBackgroundActive: 'var(--gr-button-slate-bg-active,var(--gr-slate-active))',\n solidForeground: 'var(--gr-button-slate-fg,var(--gr-slate-fg,var(--gr-fg)))',\n accentText: 'var(--gr-slate-text,var(--gr-slate))',\n softBackground: 'var(--gr-button-slate-soft-bg)',\n softBackgroundHover: 'var(--gr-button-slate-soft-bg-hover)',\n softBackgroundActive: 'var(--gr-button-slate-soft-bg-active)',\n softForeground: 'var(--gr-slate-text,var(--gr-slate))',\n border: 'var(--gr-slate)',\n borderHover: 'var(--gr-slate-hover)',\n borderActive: 'var(--gr-slate-active)',\n },\n azure: {\n solidBackground: 'var(--gr-button-azure-bg,var(--gr-azure))',\n solidBackgroundHover: 'var(--gr-button-azure-bg-hover,var(--gr-azure-hover))',\n solidBackgroundActive: 'var(--gr-button-azure-bg-active,var(--gr-azure-active))',\n solidForeground: 'var(--gr-button-azure-fg,var(--gr-azure-fg,var(--gr-fg)))',\n accentText: 'var(--gr-azure-text,var(--gr-azure))',\n softBackground: 'var(--gr-button-azure-soft-bg)',\n softBackgroundHover: 'var(--gr-button-azure-soft-bg-hover)',\n softBackgroundActive: 'var(--gr-button-azure-soft-bg-active)',\n softForeground: 'var(--gr-azure-text,var(--gr-azure))',\n border: 'var(--gr-azure)',\n borderHover: 'var(--gr-azure-hover)',\n borderActive: 'var(--gr-azure-active)',\n },\n}\n\nfunction withVar(token: string): string {\n return `[${token}]`\n}\n\nexport function variantClass(variant: GrButtonVariant, tone: GrButtonTone): string {\n const tokens = tones[tone]\n\n if (variant === 'primary') {\n return [\n `bg-${withVar(tokens.solidBackground)}`,\n `text-${withVar(tokens.solidForeground)}`,\n `border border-${withVar(tokens.solidBackground)}`,\n `hover:bg-${withVar(tokens.solidBackgroundHover)}`,\n `hover:border-${withVar(tokens.solidBackgroundHover)}`,\n `active:bg-${withVar(tokens.solidBackgroundActive)}`,\n `hover:active:bg-${withVar(tokens.solidBackgroundActive)}`,\n `active:border-${withVar(tokens.solidBackgroundActive)}`,\n `hover:active:border-${withVar(tokens.solidBackgroundActive)}`,\n ].join(' ')\n }\n\n if (variant === 'secondary') {\n return [\n `bg-${withVar(tokens.softBackground)}`,\n `text-${withVar(tokens.softForeground)}`,\n `border border-${withVar(tokens.border)}`,\n `hover:bg-${withVar(tokens.softBackgroundHover)}`,\n `hover:border-${withVar(tokens.borderHover)}`,\n `active:bg-${withVar(tokens.softBackgroundActive)}`,\n `hover:active:bg-${withVar(tokens.softBackgroundActive)}`,\n `active:border-${withVar(tokens.borderActive)}`,\n `hover:active:border-${withVar(tokens.borderActive)}`,\n ].join(' ')\n }\n\n if (variant === 'outline') {\n return [\n 'bg-transparent',\n `text-${withVar(tokens.accentText)}`,\n `border border-${withVar(tokens.border)}`,\n `hover:bg-${withVar(tokens.softBackgroundHover)}`,\n `hover:border-${withVar(tokens.borderHover)}`,\n `active:bg-${withVar(tokens.softBackgroundActive)}`,\n `hover:active:bg-${withVar(tokens.softBackgroundActive)}`,\n `active:border-${withVar(tokens.borderActive)}`,\n `hover:active:border-${withVar(tokens.borderActive)}`,\n ].join(' ')\n }\n\n if (variant === 'ghost') {\n return [\n 'bg-transparent',\n `text-${withVar(tokens.accentText)}`,\n `hover:bg-${withVar(tokens.softBackgroundHover)}`,\n `active:bg-${withVar(tokens.softBackgroundActive)}`,\n `hover:active:bg-${withVar(tokens.softBackgroundActive)}`,\n ].join(' ')\n }\n\n return [\n 'bg-transparent',\n `text-${withVar(tokens.accentText)}`,\n 'border border-transparent',\n `hover:bg-${withVar(tokens.softBackgroundHover)}`,\n `hover:border-${withVar(tokens.borderHover)}`,\n `active:bg-${withVar(tokens.softBackgroundActive)}`,\n `hover:active:bg-${withVar(tokens.softBackgroundActive)}`,\n `active:border-${withVar(tokens.borderActive)}`,\n `hover:active:border-${withVar(tokens.borderActive)}`,\n ].join(' ')\n}\n\nexport function grButtonClass(options: GrButtonClassOptions): string {\n return [\n options.square ? squareSizes[options.size] : sizes[options.size],\n options.block ? blockClass : '',\n // `loading` сюда не входит: у него свой спиннер, и выглядеть отключённым он\n // не должен.\n options.disabled ? disabledClassByVariant[options.variant] : variantClass(options.variant, options.tone),\n ].filter(Boolean).join(' ')\n}\n"],"mappings":";AAiCA,IAAa,OACT;;AAGJ,IAAa,aAAa;;;;;;;;;;;;AAa1B,IAAa,yBAA0D;CACrE,WAAW;CACX,aAAa;CACb,WAAW;CACX,SAAS;CACT,gBAAgB;AAClB;AAEA,IAAa,oBAAoB;AAEjC,IAAa,QAAsC;CACjD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;AAQA,IAAa,cAA4C;CACvD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,QAAkD;CAC7D,SAAS;EACP,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;CACA,SAAS;EACP,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;CACA,SAAS;EACP,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;CACA,SAAS;EACP,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;CACA,QAAQ;EACN,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;CACA,MAAM;EACJ,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;CACA,OAAO;EACL,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;CACA,OAAO;EACL,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;AACF;AAEA,SAAS,QAAQ,OAAuB;CACtC,OAAO,IAAI,MAAM;AACnB;AAEA,SAAgB,aAAa,SAA0B,MAA4B;CACjF,MAAM,SAAS,MAAM;CAErB,IAAI,YAAY,WACd,OAAO;EACL,MAAM,QAAQ,OAAO,eAAe;EACpC,QAAQ,QAAQ,OAAO,eAAe;EACtC,iBAAiB,QAAQ,OAAO,eAAe;EAC/C,YAAY,QAAQ,OAAO,oBAAoB;EAC/C,gBAAgB,QAAQ,OAAO,oBAAoB;EACnD,aAAa,QAAQ,OAAO,qBAAqB;EACjD,mBAAmB,QAAQ,OAAO,qBAAqB;EACvD,iBAAiB,QAAQ,OAAO,qBAAqB;EACrD,uBAAuB,QAAQ,OAAO,qBAAqB;CAC7D,CAAC,CAAC,KAAK,GAAG;CAGZ,IAAI,YAAY,aACd,OAAO;EACL,MAAM,QAAQ,OAAO,cAAc;EACnC,QAAQ,QAAQ,OAAO,cAAc;EACrC,iBAAiB,QAAQ,OAAO,MAAM;EACtC,YAAY,QAAQ,OAAO,mBAAmB;EAC9C,gBAAgB,QAAQ,OAAO,WAAW;EAC1C,aAAa,QAAQ,OAAO,oBAAoB;EAChD,mBAAmB,QAAQ,OAAO,oBAAoB;EACtD,iBAAiB,QAAQ,OAAO,YAAY;EAC5C,uBAAuB,QAAQ,OAAO,YAAY;CACpD,CAAC,CAAC,KAAK,GAAG;CAGZ,IAAI,YAAY,WACd,OAAO;EACL;EACA,QAAQ,QAAQ,OAAO,UAAU;EACjC,iBAAiB,QAAQ,OAAO,MAAM;EACtC,YAAY,QAAQ,OAAO,mBAAmB;EAC9C,gBAAgB,QAAQ,OAAO,WAAW;EAC1C,aAAa,QAAQ,OAAO,oBAAoB;EAChD,mBAAmB,QAAQ,OAAO,oBAAoB;EACtD,iBAAiB,QAAQ,OAAO,YAAY;EAC5C,uBAAuB,QAAQ,OAAO,YAAY;CACpD,CAAC,CAAC,KAAK,GAAG;CAGZ,IAAI,YAAY,SACd,OAAO;EACL;EACA,QAAQ,QAAQ,OAAO,UAAU;EACjC,YAAY,QAAQ,OAAO,mBAAmB;EAC9C,aAAa,QAAQ,OAAO,oBAAoB;EAChD,mBAAmB,QAAQ,OAAO,oBAAoB;CACxD,CAAC,CAAC,KAAK,GAAG;CAGZ,OAAO;EACL;EACA,QAAQ,QAAQ,OAAO,UAAU;EACjC;EACA,YAAY,QAAQ,OAAO,mBAAmB;EAC9C,gBAAgB,QAAQ,OAAO,WAAW;EAC1C,aAAa,QAAQ,OAAO,oBAAoB;EAChD,mBAAmB,QAAQ,OAAO,oBAAoB;EACtD,iBAAiB,QAAQ,OAAO,YAAY;EAC5C,uBAAuB,QAAQ,OAAO,YAAY;CACpD,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,SAAgB,cAAc,SAAuC;CACnE,OAAO;EACL,QAAQ,SAAS,YAAY,QAAQ,QAAQ,MAAM,QAAQ;EAC3D,QAAQ,QAAQ,aAAa;EAG7B,QAAQ,WAAW,uBAAuB,QAAQ,WAAW,aAAa,QAAQ,SAAS,QAAQ,IAAI;CACzG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC5B"}
|
|
@@ -62,5 +62,21 @@ function grInputShellClass(options) {
|
|
|
62
62
|
function grInputFieldClass(options) {
|
|
63
63
|
return [sizes[options.size], textAlign[options.align]].join(" ");
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Аддон-сегмент: отрезан рамкой и держит ширину не меньше ступени размера — так
|
|
67
|
+
* поле с «₽» и поле с «USD» выстраиваются в колонку, а не пляшут по ширине.
|
|
68
|
+
*/
|
|
69
|
+
var addonSegmentPrefixClass = "border-r border-[var(--gr-brd)] px-2";
|
|
70
|
+
var addonSegmentSuffixClass = "border-l border-[var(--gr-brd)] px-2";
|
|
71
|
+
/**
|
|
72
|
+
* Украшение внутри рамки: ни разделителя, ни своей ширины — лупа в поисковой
|
|
73
|
+
* строке, единица измерения, счётчик.
|
|
74
|
+
*
|
|
75
|
+
* Отдельный режим, а не «сегмент без рамки»: у сегмента ширина выровнена по
|
|
76
|
+
* ступени размера, и иконка в нём висела бы в пустом отсеке. Здесь поле берёт
|
|
77
|
+
* ровно ту ширину, что заняло содержимое, а текст начинается сразу за ним.
|
|
78
|
+
*/
|
|
79
|
+
var addonInlinePrefixClass = "pl-3 pr-2";
|
|
80
|
+
var addonInlineSuffixClass = "pl-2 pr-3";
|
|
65
81
|
//#endregion
|
|
66
|
-
export {
|
|
82
|
+
export { grInputFieldClass as a, paddingX as c, shellEnabledClass as d, sizes as f, addonSegmentSuffixClass as i, shellBaseClass as l, textAlign as m, addonInlineSuffixClass as n, grInputShellClass as o, states as p, addonSegmentPrefixClass as r, invalidClass as s, addonInlinePrefixClass as t, shellDisabledClass as u };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grInputStyles-
|
|
1
|
+
{"version":3,"file":"grInputStyles-DgQYjJvD.js","names":[],"sources":["../../src/components/GrInput/grInputStyles.ts"],"sourcesContent":["/**\n * Классы `GrInput`.\n *\n * Единственный источник правды: те же карты были продублированы инлайн в\n * `GrInput.vue`, копии разошлись (`focus-visible:` против `focus-within:`), и\n * safelist декларировал классы, которых в разметке нет.\n *\n * Кольцо фокуса живёт на оболочке через `focus-within`: фокус получает инпут\n * внутри, а рамку рисует оболочка вместе с аддонами.\n */\n\nexport const sizes = {\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} as const\n\n/**\n * Горизонтальный padding из `sizes`, но числом: аддоны задают паддинги инлайн-\n * стилем, а он перекрывает класс — значение нужно обеим формам, и расходиться\n * им нельзя.\n */\nexport const paddingX = {\n xs: '10px',\n sm: '12px',\n md: '12px',\n lg: '16px',\n} as const\n\nexport const textAlign = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n} as const\n\nexport const states = {\n default: 'border-[var(--gr-brd)]',\n success: 'border-[var(--gr-success)] focus-within:ring-[var(--gr-success)]',\n warning: 'border-[var(--gr-warning)] focus-within:ring-[var(--gr-warning)]',\n danger: 'border-[var(--gr-danger)] focus-within:ring-[var(--gr-danger)]',\n} as const\n\n/**\n * Ошибка валидации красится своей ролью, а не декоративным тоном `danger`:\n * `state=\"danger\"` — это подсветка по решению разработчика, `invalid` — вердикт\n * валидации, и тема вправе развести их по цвету.\n */\nexport const invalidClass = 'border-[var(--gr-invalid-brd)] focus-within:ring-[var(--gr-invalid-ring)]'\n\nexport type GrInputState = keyof typeof states\n\nexport const shellBaseClass = 'relative w-full overflow-hidden rounded-[var(--gr-radius-control)] border transition-colors duration-[var(--gr-duration-fast)] focus-within:ring-2 focus-within:ring-[var(--gr-ring)]'\n\nexport const shellEnabledClass = 'bg-[var(--gr-bg)]'\n\n/**\n * Заблокированное поле гасится фоном, а не `opacity`: прозрачность разбавляет\n * выверенные на AA токены текста и роняет контраст. Фон взаимоисключающий с\n * `shellEnabledClass` — два `bg-*` одной специфичности разрулил бы порядок в\n * сгенерированном CSS, а не порядок в списке классов.\n */\nexport const shellDisabledClass = 'bg-[var(--gr-muted)] text-[var(--gr-muted-fg)] cursor-not-allowed'\n\nexport function grInputShellClass(options: {\n state: GrInputState\n invalid: boolean\n disabled: boolean\n}): string {\n return [\n shellBaseClass,\n options.invalid ? invalidClass : states[options.state],\n options.disabled ? shellDisabledClass : shellEnabledClass,\n ].join(' ')\n}\n\nexport function grInputFieldClass(options: {\n size: keyof typeof sizes\n align: keyof typeof textAlign\n}): string {\n return [sizes[options.size], textAlign[options.align]].join(' ')\n}\n\n/**\n * Аддон-сегмент: отрезан рамкой и держит ширину не меньше ступени размера — так\n * поле с «₽» и поле с «USD» выстраиваются в колонку, а не пляшут по ширине.\n */\nexport const addonSegmentPrefixClass = 'border-r border-[var(--gr-brd)] px-2'\nexport const addonSegmentSuffixClass = 'border-l border-[var(--gr-brd)] px-2'\n\n/**\n * Украшение внутри рамки: ни разделителя, ни своей ширины — лупа в поисковой\n * строке, единица измерения, счётчик.\n *\n * Отдельный режим, а не «сегмент без рамки»: у сегмента ширина выровнена по\n * ступени размера, и иконка в нём висела бы в пустом отсеке. Здесь поле берёт\n * ровно ту ширину, что заняло содержимое, а текст начинается сразу за ним.\n */\nexport const addonInlinePrefixClass = 'pl-3 pr-2'\nexport const addonInlineSuffixClass = 'pl-2 pr-3'\n"],"mappings":";;;;;;;;;;;AAWA,IAAa,QAAQ;CACnB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;AAOA,IAAa,WAAW;CACtB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,YAAY;CACvB,MAAM;CACN,QAAQ;CACR,OAAO;AACT;AAEA,IAAa,SAAS;CACpB,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;AACV;;;;;;AAOA,IAAa,eAAe;AAI5B,IAAa,iBAAiB;AAE9B,IAAa,oBAAoB;;;;;;;AAQjC,IAAa,qBAAqB;AAElC,SAAgB,kBAAkB,SAIvB;CACT,OAAO;EACL;EACA,QAAQ,UAAU,eAAe,OAAO,QAAQ;EAChD,QAAQ,WAAW,qBAAqB;CAC1C,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,SAAgB,kBAAkB,SAGvB;CACT,OAAO,CAAC,MAAM,QAAQ,OAAO,UAAU,QAAQ,MAAM,CAAC,CAAC,KAAK,GAAG;AACjE;;;;;AAMA,IAAa,0BAA0B;AACvC,IAAa,0BAA0B;;;;;;;;;AAUvC,IAAa,yBAAyB;AACtC,IAAa,yBAAyB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grLinkStyles-FME_qMpi.js","names":[],"sources":["../../src/components/GrLink/grLinkStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { GrTone } from '../shared/tones'\n\n/**\n * Архитектура цвета GrLink (согласована с остальной GR, ср. GrButton):\n *\n * - `tone` — семантический ЦВЕТ из общей палитры `GrTone`\n * (`primary | neutral | success | warning | danger | info | slate | azure`).\n * - `variant` — уровень акцента (СТРУКТУРА), независимый от цвета:\n * - `default` — текст окрашен в `tone` в покое, `tone-hover`/`tone-active` при\n * наведении/нажатии (обычная акцентная ссылка);\n * - `muted` — приглушённый текст (`--gr-muted-fg`) в покое, окрашивается в `tone`\n * при наведении (вторичные/inline-ссылки в плотных областях).\n *\n * Оси ортогональны намеренно: «красная ссылка» и «приглушённая ссылка» —\n * независимые решения, и любая их комбинация осмысленна.\n */\nexport type GrLinkTone = GrTone\nexport type GrLinkVariant = 'default' | 'muted'\nexport type GrLinkUnderline = 'auto' | 'always' | 'none'\nexport type GrLinkSize = GrComponentSize\n\n// Базовые классы корневого элемента (`<a>`/`<span>`). Вынесены сюда,\n// чтобы быть единственным источником истины как для шаблона, так и для safelist.\nexport const baseRootClass = 'inline-flex items-center gap-1 rounded-[var(--gr-radius-control)] transition-colors duration-[var(--gr-duration-fast)]'\nexport const focusRingClass = 'focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport const sizeClassBySize: Record<GrLinkSize, 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// Цвет управляется CSS-переменными (как трек в GrSwitch): один набор классов\n// вместо class-эксплозии 8 тонов × 3 состояния. Safelist остаётся крошечным.\nexport const colorClass = 'text-[var(--gr-link-color)] visited:text-[var(--gr-link-color)] hover:text-[var(--gr-link-color-hover)] active:text-[var(--gr-link-color-active)]'\n\ntype GrLinkToneColors = { base: string, hover: string, active: string }\n\n/**\n * Пары «цвет / hover / active» на каждый тон из ролей темы.\n *\n * Ссылка — это ТЕКСТ на фоне страницы, поэтому тона берутся из `-text`, а не\n * из насыщенного `--gr-{tone}`: последний под текст не рассчитан\n * (`--gr-success` на `--gr-bg` — 2.2:1). Готовых `-text-hover/-active` в\n * системе нет, поэтому они выводятся тем же приёмом, что и `--gr-{tone}-hover`\n * в `tokens.css` — подмесом `--gr-fg`. В светлой теме это делает ссылку темнее\n * при наведении, в тёмной — светлее, то есть в обеих контраст растёт.\n */\nfunction toneTextColors(tone: string): GrLinkToneColors {\n const base = `var(--gr-${tone}-text)`\n\n return {\n base,\n hover: `color-mix(in srgb, ${base} 92%, var(--gr-fg))`,\n active: `color-mix(in srgb, ${base} 84%, var(--gr-fg))`,\n }\n}\n\nconst primaryTextColors = toneTextColors('primary')\n\nconst linkToneColors: Record<GrLinkTone, GrLinkToneColors> = {\n primary: primaryTextColors,\n // Нейтральная ссылка: читаемый `--gr-fg` в покое, акцент при наведении — тот\n // же, что у тона `primary`, и по тому же правилу «текст берётся из `-text`».\n neutral: { base: 'var(--gr-fg)', hover: primaryTextColors.base, active: primaryTextColors.active },\n success: toneTextColors('success'),\n warning: toneTextColors('warning'),\n danger: toneTextColors('danger'),\n info: toneTextColors('info'),\n slate: toneTextColors('slate'),\n azure: toneTextColors('azure'),\n}\n\n/** Инлайновые CSS-переменные цвета для текущей комбинации `tone` × `variant`. */\nexport function grLinkColorStyle(options: { tone: GrLinkTone, variant: GrLinkVariant, disabled: boolean }): Record<string, string> {\n if (options.disabled)
|
|
1
|
+
{"version":3,"file":"grLinkStyles-FME_qMpi.js","names":[],"sources":["../../src/components/GrLink/grLinkStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { GrTone } from '../shared/tones'\n\n/**\n * Архитектура цвета GrLink (согласована с остальной GR, ср. GrButton):\n *\n * - `tone` — семантический ЦВЕТ из общей палитры `GrTone`\n * (`primary | neutral | success | warning | danger | info | slate | azure`).\n * - `variant` — уровень акцента (СТРУКТУРА), независимый от цвета:\n * - `default` — текст окрашен в `tone` в покое, `tone-hover`/`tone-active` при\n * наведении/нажатии (обычная акцентная ссылка);\n * - `muted` — приглушённый текст (`--gr-muted-fg`) в покое, окрашивается в `tone`\n * при наведении (вторичные/inline-ссылки в плотных областях).\n *\n * Оси ортогональны намеренно: «красная ссылка» и «приглушённая ссылка» —\n * независимые решения, и любая их комбинация осмысленна.\n */\nexport type GrLinkTone = GrTone\nexport type GrLinkVariant = 'default' | 'muted'\nexport type GrLinkUnderline = 'auto' | 'always' | 'none'\nexport type GrLinkSize = GrComponentSize\n\n// Базовые классы корневого элемента (`<a>`/`<span>`). Вынесены сюда,\n// чтобы быть единственным источником истины как для шаблона, так и для safelist.\nexport const baseRootClass = 'inline-flex items-center gap-1 rounded-[var(--gr-radius-control)] transition-colors duration-[var(--gr-duration-fast)]'\nexport const focusRingClass = 'focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport const sizeClassBySize: Record<GrLinkSize, 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// Цвет управляется CSS-переменными (как трек в GrSwitch): один набор классов\n// вместо class-эксплозии 8 тонов × 3 состояния. Safelist остаётся крошечным.\nexport const colorClass = 'text-[var(--gr-link-color)] visited:text-[var(--gr-link-color)] hover:text-[var(--gr-link-color-hover)] active:text-[var(--gr-link-color-active)]'\n\ntype GrLinkToneColors = { base: string, hover: string, active: string }\n\n/**\n * Пары «цвет / hover / active» на каждый тон из ролей темы.\n *\n * Ссылка — это ТЕКСТ на фоне страницы, поэтому тона берутся из `-text`, а не\n * из насыщенного `--gr-{tone}`: последний под текст не рассчитан\n * (`--gr-success` на `--gr-bg` — 2.2:1). Готовых `-text-hover/-active` в\n * системе нет, поэтому они выводятся тем же приёмом, что и `--gr-{tone}-hover`\n * в `tokens.css` — подмесом `--gr-fg`. В светлой теме это делает ссылку темнее\n * при наведении, в тёмной — светлее, то есть в обеих контраст растёт.\n */\nfunction toneTextColors(tone: string): GrLinkToneColors {\n const base = `var(--gr-${tone}-text)`\n\n return {\n base,\n hover: `color-mix(in srgb, ${base} 92%, var(--gr-fg))`,\n active: `color-mix(in srgb, ${base} 84%, var(--gr-fg))`,\n }\n}\n\nconst primaryTextColors = toneTextColors('primary')\n\nconst linkToneColors: Record<GrLinkTone, GrLinkToneColors> = {\n primary: primaryTextColors,\n // Нейтральная ссылка: читаемый `--gr-fg` в покое, акцент при наведении — тот\n // же, что у тона `primary`, и по тому же правилу «текст берётся из `-text`».\n neutral: { base: 'var(--gr-fg)', hover: primaryTextColors.base, active: primaryTextColors.active },\n success: toneTextColors('success'),\n warning: toneTextColors('warning'),\n danger: toneTextColors('danger'),\n info: toneTextColors('info'),\n slate: toneTextColors('slate'),\n azure: toneTextColors('azure'),\n}\n\n/** Инлайновые CSS-переменные цвета для текущей комбинации `tone` × `variant`. */\nexport function grLinkColorStyle(options: { tone: GrLinkTone, variant: GrLinkVariant, disabled: boolean }): Record<string, string> {\n if (options.disabled)\n return {}\n\n const colors = linkToneColors[options.tone] ?? linkToneColors.primary\n\n if (options.variant === 'muted') {\n return {\n '--gr-link-color': 'var(--gr-muted-fg)',\n '--gr-link-color-hover': colors.base,\n '--gr-link-color-active': colors.active,\n }\n }\n\n return {\n '--gr-link-color': colors.base,\n '--gr-link-color-hover': colors.hover,\n '--gr-link-color-active': colors.active,\n }\n}\n\n/**\n * Отключённая ссылка гасится цветом, а не `opacity`: прозрачность разбавляет\n * выверенный на AA `--gr-muted-fg` и роняет контраст ниже нормы.\n */\nexport const disabledStateClass = 'cursor-not-allowed text-[var(--gr-muted-fg)]'\n\nconst UNDERLINE_VALUES: readonly GrLinkUnderline[] = ['auto', 'always', 'none']\n\nfunction underlineClass(underline: GrLinkUnderline, disabled: boolean): string {\n if (disabled)\n return 'no-underline'\n if (underline === 'always')\n return 'underline underline-offset-4'\n if (underline === 'none')\n return 'no-underline'\n return 'no-underline hover:underline hover:underline-offset-4'\n}\n\n// Derived from `underlineClass` so that there is a single source of truth:\n// any change/extension of the underline logic is automatically reflected\n// in the safelist without manual updates.\nexport const underlineClasses: readonly string[] = [...new Set(\n UNDERLINE_VALUES.flatMap(u => [underlineClass(u, false), underlineClass(u, true)]),\n)]\n\nexport function grLinkClass(options: { size: GrLinkSize, underline: GrLinkUnderline, disabled: boolean }): string {\n return [\n sizeClassBySize[options.size],\n underlineClass(options.underline, options.disabled),\n options.disabled ? disabledStateClass : colorClass,\n ]\n .filter(Boolean)\n .join(' ')\n}\n"],"mappings":";AAyBA,IAAa,gBAAgB;AAC7B,IAAa,iBAAiB;AAE9B,IAAa,kBAA8C;CACzD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAIA,IAAa,aAAa;;;;;;;;;;;AAc1B,SAAS,eAAe,MAAgC;CACtD,MAAM,OAAO,YAAY,KAAK;CAE9B,OAAO;EACL;EACA,OAAO,sBAAsB,KAAK;EAClC,QAAQ,sBAAsB,KAAK;CACrC;AACF;AAEA,IAAM,oBAAoB,eAAe,SAAS;AAElD,IAAM,iBAAuD;CAC3D,SAAS;CAGT,SAAS;EAAE,MAAM;EAAgB,OAAO,kBAAkB;EAAM,QAAQ,kBAAkB;CAAO;CACjG,SAAS,eAAe,SAAS;CACjC,SAAS,eAAe,SAAS;CACjC,QAAQ,eAAe,QAAQ;CAC/B,MAAM,eAAe,MAAM;CAC3B,OAAO,eAAe,OAAO;CAC7B,OAAO,eAAe,OAAO;AAC/B;;AAGA,SAAgB,iBAAiB,SAAkG;CACjI,IAAI,QAAQ,UACV,OAAO,CAAC;CAEV,MAAM,SAAS,eAAe,QAAQ,SAAS,eAAe;CAE9D,IAAI,QAAQ,YAAY,SACtB,OAAO;EACL,mBAAmB;EACnB,yBAAyB,OAAO;EAChC,0BAA0B,OAAO;CACnC;CAGF,OAAO;EACL,mBAAmB,OAAO;EAC1B,yBAAyB,OAAO;EAChC,0BAA0B,OAAO;CACnC;AACF;;;;;AAMA,IAAa,qBAAqB;AAElC,IAAM,mBAA+C;CAAC;CAAQ;CAAU;AAAM;AAE9E,SAAS,eAAe,WAA4B,UAA2B;CAC7E,IAAI,UACF,OAAO;CACT,IAAI,cAAc,UAChB,OAAO;CACT,IAAI,cAAc,QAChB,OAAO;CACT,OAAO;AACT;AAKA,IAAa,mBAAsC,CAAC,GAAG,IAAI,IACzD,iBAAiB,SAAQ,MAAK,CAAC,eAAe,GAAG,KAAK,GAAG,eAAe,GAAG,IAAI,CAAC,CAAC,CACnF,CAAC;AAED,SAAgB,YAAY,SAAsF;CAChH,OAAO;EACL,gBAAgB,QAAQ;EACxB,eAAe,QAAQ,WAAW,QAAQ,QAAQ;EAClD,QAAQ,WAAW,qBAAqB;CAC1C,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grLoadingStyles-CnQaf5ry.js","names":[],"sources":["../../src/components/GrLoading/grLoadingStyles.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\n\n/**\n * Полноэкранный оверлей сидит на собственном слое шкалы: он блокирует всё\n * приложение целиком, поэтому обязан лечь выше модалки (`--gr-z-modal`), но\n * ниже тоста — уведомление о фоновой ошибке загрузка прятать не должна.\n * Инлайновый режим к шкале отношения не имеет: `z-10` — порядок внутри\n * собственного контейнера.\n */\nexport const rootModeClass = {\n
|
|
1
|
+
{"version":3,"file":"grLoadingStyles-CnQaf5ry.js","names":[],"sources":["../../src/components/GrLoading/grLoadingStyles.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\n\n/**\n * Полноэкранный оверлей сидит на собственном слое шкалы: он блокирует всё\n * приложение целиком, поэтому обязан лечь выше модалки (`--gr-z-modal`), но\n * ниже тоста — уведомление о фоновой ошибке загрузка прятать не должна.\n * Инлайновый режим к шкале отношения не имеет: `z-10` — порядок внутри\n * собственного контейнера.\n */\nexport const rootModeClass = {\n fullscreen: 'fixed inset-0 z-[var(--gr-z-loading)]',\n inline: 'absolute inset-0 z-10',\n} as const\nexport const rootBackgroundClass = 'bg-[var(--gr-overlay-bg)]'\nexport const rootBackdropBlurClass = 'backdrop-blur-sm'\n\nexport function grLoadingRootClass(options: {\n fullscreen: boolean\n hasBackground: boolean\n customClass?: string\n}): string {\n return [\n options.fullscreen ? rootModeClass.fullscreen : rootModeClass.inline,\n !options.hasBackground ? rootBackgroundClass : '',\n rootBackdropBlurClass,\n options.customClass,\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nexport const grLoadingClassTokens = [\n ...Object.values(rootModeClass).flatMap(splitClassTokens),\n ...splitClassTokens(rootBackgroundClass),\n ...splitClassTokens(rootBackdropBlurClass),\n]\n"],"mappings":";;;;;;;;;AASA,IAAa,gBAAgB;CAC3B,YAAY;CACZ,QAAQ;AACV;AACA,IAAa,sBAAsB;AACnC,IAAa,wBAAwB;AAErC,SAAgB,mBAAmB,SAIxB;CACT,OAAO;EACL,QAAQ,aAAa,cAAc,aAAa,cAAc;EAC9D,CAAC,QAAQ,gBAAgB,sBAAsB;EAC/C;EACA,QAAQ;CACV,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb;AAEA,IAAa,uBAAuB;CAClC,GAAG,OAAO,OAAO,aAAa,CAAC,CAAC,QAAQ,gBAAgB;CACxD,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,qBAAqB;AAC3C"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as grButtonClass, i as grButtonBaseClass, o as sizes } from "./grButtonStyles-
|
|
1
|
+
import { a as grButtonClass, i as grButtonBaseClass, o as sizes } from "./grButtonStyles-B3wRWW_i.js";
|
|
2
2
|
//#region src/components/GrRadio/grRadioStyles.ts
|
|
3
3
|
var grRadioEnabledClass = "cursor-pointer";
|
|
4
4
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grRadioStyles-
|
|
1
|
+
{"version":3,"file":"grRadioStyles-DGL2QLy6.js","names":[],"sources":["../../src/components/GrRadio/grRadioStyles.ts"],"sourcesContent":["import {\n grButtonBaseClass,\n grButtonClass,\n sizes as grButtonSizes,\n type GrButtonSize,\n type GrButtonTone,\n type GrButtonVariant,\n} from '../GrButton/grButtonStyles'\n\nexport type GrRadioVariant = 'radiobox' | 'button'\n\nexport const grRadioEnabledClass = 'cursor-pointer'\n\n/**\n * Отключённая кнопка-радио гасится, но НЕ теряет состояние: в отключённой\n * группе всё равно должно быть видно, что выбрано. Поэтому не отдаём вид\n * `GrButton`-у (его disabled состояние-слепой), а держим свою пару.\n */\nexport const grRadioButtonDisabledClass = 'cursor-not-allowed bg-transparent text-[var(--gr-muted-fg)] border border-[var(--gr-brd)]'\nexport const grRadioButtonDisabledCheckedClass = 'cursor-not-allowed bg-[var(--gr-muted)] text-[var(--gr-fg)] border border-[var(--gr-muted-fg)]'\n\n/**\n * Отключённый переключатель гасится токенами, а не `opacity`: прозрачность\n * разбавляет выверенные на AA цвета текста.\n */\nexport const grRadioRootDisabledClass = 'cursor-not-allowed text-[var(--gr-muted-fg)]'\nexport const grRadioRootEnabledClass = 'cursor-pointer'\n/** Только для чтения: значение видно и читается, но курсор не обещает клика. */\nexport const grRadioRootReadonlyClass = 'cursor-default'\n\nexport const grRadioControlCheckedClass = 'border-[var(--gr-primary)] bg-[color-mix(in_srgb,var(--gr-primary)_10%,var(--gr-bg))]'\nexport const grRadioControlUncheckedClass = 'border-[var(--gr-brd)] bg-[var(--gr-bg)]'\nexport const grRadioControlDisabledClass = 'border-[var(--gr-brd)] bg-[var(--gr-muted)]'\nexport const grRadioControlInvalidClass = 'border-[var(--gr-danger)] bg-[var(--gr-bg)]'\n\nexport const grRadioDotCheckedClass = 'bg-[var(--gr-primary)] opacity-100 scale-100'\nexport const grRadioDotUncheckedClass = 'bg-transparent opacity-0 scale-75'\nexport const grRadioDotDisabledClass = 'bg-[var(--gr-muted-fg)] opacity-100 scale-100'\n// Базовые классы «точки» внутри radiobox — нестандартный transition. Вынесены сюда,\n// чтобы `safelist` гарантировал их присутствие в сборке даже при tree-shaking шаблона.\nexport const grRadioDotBaseClass = 'rounded-[var(--gr-radius-full)] transition-[transform,opacity,background-color] duration-[var(--gr-duration-fast)]'\n\n/**\n * Ступени `radiobox`: коробка, точка и кегли подписи с описанием.\n *\n * До этого коробка была зашита `h-4 w-4` в шаблоне, а кегли — фиксированным\n * `--gr-text-sm`: вариант `radiobox` не масштабировался вовсе, хотя `size` у\n * компонента был и работал для варианта `button`. Ступени согласованы с высотой\n * кнопки (`grButtonStyles.sizes`: 28/32/40/44) — радио стоит в тех же формах.\n */\nexport const grRadioControlSizes: Record<GrButtonSize, string> = {\n xs: 'h-3.5 w-3.5',\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-6 w-6',\n}\n\nexport const grRadioDotSizes: Record<GrButtonSize, string> = {\n xs: 'h-[5px] w-[5px]',\n sm: 'h-[6px] w-[6px]',\n md: 'h-2 w-2',\n lg: 'h-2.5 w-2.5',\n}\n\nconst grRadioLabelTexts: Record<GrButtonSize, string> = {\n xs: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n md: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\nexport const grRadioDescriptionSizes: Record<GrButtonSize, string> = {\n xs: 'text-[length:var(--gr-text-2xs)] leading-[var(--gr-leading-2xs)] text-[var(--gr-muted-fg)]',\n sm: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)] text-[var(--gr-muted-fg)]',\n md: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)] text-[var(--gr-muted-fg)]',\n lg: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)] text-[var(--gr-muted-fg)]',\n}\n\n/** Выбранный вариант выделяется текстом, а не только точкой. */\nexport const grRadioLabelCheckedColorClass = 'text-[var(--gr-fg)] font-500'\nexport const grRadioLabelColorClass = 'text-[var(--gr-muted-fg)]'\n\nexport function grRadioLabelClassFor(size: GrButtonSize, checked: boolean): string {\n return [\n grRadioLabelTexts[size],\n checked ? grRadioLabelCheckedColorClass : grRadioLabelColorClass,\n ].join(' ')\n}\n\nexport const grRadioLabelSizes = grRadioLabelTexts\n\nexport function grRadioButtonClass(options: {\n checked: boolean\n disabled: boolean\n readonly: boolean\n size: GrButtonSize\n buttonVariant: GrButtonVariant\n buttonTone: GrButtonTone\n selectedButtonVariant: GrButtonVariant\n selectedButtonTone: GrButtonTone\n}): string {\n if (options.disabled) {\n return [\n grButtonBaseClass,\n grButtonSizes[options.size],\n options.checked ? grRadioButtonDisabledCheckedClass : grRadioButtonDisabledClass,\n ].join(' ')\n }\n\n const variant = options.checked ? options.selectedButtonVariant : options.buttonVariant\n const tone = options.checked ? options.selectedButtonTone : options.buttonTone\n\n return [\n grButtonBaseClass,\n grButtonClass({\n variant,\n tone,\n size: options.size,\n square: false,\n }),\n options.readonly ? grRadioRootReadonlyClass : grRadioEnabledClass,\n ].join(' ')\n}\n\nexport function grRadioRootClass(options: { disabled: boolean, readonly: boolean }): string {\n if (options.disabled)\n return grRadioRootDisabledClass\n return options.readonly ? grRadioRootReadonlyClass : grRadioRootEnabledClass\n}\n\nexport function grRadioControlClass(options: {\n checked: boolean\n disabled: boolean\n invalid: boolean\n size: GrButtonSize\n}): string {\n const state = options.disabled\n ? grRadioControlDisabledClass\n : options.invalid && !options.checked\n ? grRadioControlInvalidClass\n : options.checked ? grRadioControlCheckedClass : grRadioControlUncheckedClass\n\n return [grRadioControlSizes[options.size], state].join(' ')\n}\n\nexport function grRadioDotClass(options: { checked: boolean, disabled: boolean }): string {\n if (!options.checked)\n return grRadioDotUncheckedClass\n\n return options.disabled ? grRadioDotDisabledClass : grRadioDotCheckedClass\n}\n"],"mappings":";;AAWA,IAAa,sBAAsB;;;;;;AAOnC,IAAa,6BAA6B;AAC1C,IAAa,oCAAoC;;;;;AAMjD,IAAa,2BAA2B;AACxC,IAAa,0BAA0B;;AAEvC,IAAa,2BAA2B;AAExC,IAAa,6BAA6B;AAC1C,IAAa,+BAA+B;AAC5C,IAAa,8BAA8B;AAC3C,IAAa,6BAA6B;AAE1C,IAAa,yBAAyB;AACtC,IAAa,2BAA2B;AACxC,IAAa,0BAA0B;AAGvC,IAAa,sBAAsB;;;;;;;;;AAUnC,IAAa,sBAAoD;CAC/D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,kBAAgD;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAM,oBAAkD;CACtD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,0BAAwD;CACnE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,gCAAgC;AAC7C,IAAa,yBAAyB;AAEtC,SAAgB,qBAAqB,MAAoB,SAA0B;CACjF,OAAO,CACL,kBAAkB,OAClB,UAAU,gCAAgC,sBAC5C,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,IAAa,oBAAoB;AAEjC,SAAgB,mBAAmB,SASxB;CACT,IAAI,QAAQ,UACV,OAAO;EACL;EACA,MAAc,QAAQ;EACtB,QAAQ,UAAU,oCAAoC;CACxD,CAAC,CAAC,KAAK,GAAG;CAMZ,OAAO;EACL;EACA,cAAc;GACZ,SANY,QAAQ,UAAU,QAAQ,wBAAwB,QAAQ;GAOtE,MANS,QAAQ,UAAU,QAAQ,qBAAqB,QAAQ;GAOhE,MAAM,QAAQ;GACd,QAAQ;EACV,CAAC;EACD,QAAQ,WAAW,2BAA2B;CAChD,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,SAAgB,iBAAiB,SAA2D;CAC1F,IAAI,QAAQ,UACV,OAAO;CACT,OAAO,QAAQ,WAAW,2BAA2B;AACvD;AAEA,SAAgB,oBAAoB,SAKzB;CACT,MAAM,QAAQ,QAAQ,WAClB,8BACA,QAAQ,WAAW,CAAC,QAAQ,UAC1B,6BACA,QAAQ,UAAU,6BAA6B;CAErD,OAAO,CAAC,oBAAoB,QAAQ,OAAO,KAAK,CAAC,CAAC,KAAK,GAAG;AAC5D;AAEA,SAAgB,gBAAgB,SAA0D;CACxF,IAAI,CAAC,QAAQ,SACX,OAAO;CAET,OAAO,QAAQ,WAAW,0BAA0B;AACtD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grSelectStyles-Cdtd10eY.js","names":[],"sources":["../../src/components/GrSelect/grSelectStyles.ts"],"sourcesContent":["import type { GrComponentSize, GrControlState } from '../shared/sizes'\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\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) return 'no-underline'\n if (options.underline === 'always') return 'underline underline-offset-4'\n if (options.underline === 'none') 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) return 'no-underline'\n if (options.underline === 'always') return 'underline underline-offset-4'\n if (options.underline === 'none') 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 = 'rounded-[var(--gr-radius-xl)] border border-[var(--gr-brd)] bg-[var(--gr-card)] text-[var(--gr-card-fg)] shadow-[var(--gr-shadow-2)] 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":";AAiDA,IAAa,mBAAmB;;;;;AAMhC,IAAa,qBAAoD;CAC/D,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;AACV;;;;;;AAOA,IAAa,qBAAqB;AAClC,IAAa,gBAAgB;AAG7B,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,UAAU,OAAO;CAC7B,IAAI,QAAQ,cAAc,UAAU,OAAO;CAC3C,IAAI,QAAQ,cAAc,QAAQ,OAAO;CACzC,OAAO;AACT;;;;;;;AAQA,SAAS,oCAAoC,SAAsE;CACjH,IAAI,QAAQ,UAAU,OAAO;CAC7B,IAAI,QAAQ,cAAc,UAAU,OAAO;CAC3C,IAAI,QAAQ,cAAc,QAAQ,OAAO;CACzC,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;;AAGpC,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"}
|
|
1
|
+
{"version":3,"file":"grSelectStyles-Cdtd10eY.js","names":[],"sources":["../../src/components/GrSelect/grSelectStyles.ts"],"sourcesContent":["import type { GrComponentSize, GrControlState } from '../shared/sizes'\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 = 'rounded-[var(--gr-radius-xl)] border border-[var(--gr-brd)] bg-[var(--gr-card)] text-[var(--gr-card-fg)] shadow-[var(--gr-shadow-2)] 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":";AAiDA,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;;AAGpC,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"}
|
|
@@ -38,7 +38,15 @@ var sliderPaddingBySize = {
|
|
|
38
38
|
md: "py-2",
|
|
39
39
|
lg: "py-2.5"
|
|
40
40
|
};
|
|
41
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Дорожка — `--gr-brd`, а не полупрозрачный `--gr-muted`.
|
|
43
|
+
*
|
|
44
|
+
* Прежний дефолт (`color-mix(--gr-muted 45%, transparent)`) на светлой теме
|
|
45
|
+
* давал #f1f5f9 при 45 % поверх почти такой же поверхности: непройденная часть
|
|
46
|
+
* шкалы не читалась вовсе, и слайдер выглядел точкой на пустом месте — по нему
|
|
47
|
+
* нельзя было понять ни диапазон, ни положение внутри него.
|
|
48
|
+
*/
|
|
49
|
+
var sliderRailClass = "absolute inset-0 rounded-[var(--gr-radius-full)] bg-[var(--gr-slider-rail,var(--gr-brd))]";
|
|
42
50
|
var sliderFillBaseClass = "absolute rounded-[var(--gr-radius-full)]";
|
|
43
51
|
/** Заливка растёт вдоль дорожки: по горизонтали — влево-вправо, по вертикали — снизу вверх. */
|
|
44
52
|
var sliderFillOrientationClass = {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grSliderStyles-kaz6VXZ3.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`), чтобы бегунок не сливался ни с фоном страницы, ни с заливкой.\nexport const 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)]'\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;AAIA,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"}
|
|
@@ -5,7 +5,7 @@ import { t as grBadgeConfig } from "./config-g8-JGZ_Y.js";
|
|
|
5
5
|
import { t as grBadgeWrapConfig } from "./config-DwABJHEo.js";
|
|
6
6
|
import { t as grBottomNavConfig } from "./config-DM0lsduD.js";
|
|
7
7
|
import { t as grBreadcrumbsConfig } from "./config-C0Eu8jpG.js";
|
|
8
|
-
import { t as grButtonConfig } from "./config-
|
|
8
|
+
import { t as grButtonConfig } from "./config-87fszqnD.js";
|
|
9
9
|
import { t as grButtonGroupConfig } from "./config-DBmdgoVf2.js";
|
|
10
10
|
import { t as grCardConfig } from "./config-DUbbGcfw.js";
|
|
11
11
|
import { t as grCheckboxConfig } from "./config-DZCUPHPU.js";
|
|
@@ -38,7 +38,7 @@ import { t as grFormFieldConfig } from "./config-B0uvcTPH.js";
|
|
|
38
38
|
import { t as grFormFileConfig } from "./config-BcXX7S7B.js";
|
|
39
39
|
import { t as grFormSectionConfig } from "./config-BEO7brpO.js";
|
|
40
40
|
import { t as grImageViewerConfig } from "./config-BDSaD-5p.js";
|
|
41
|
-
import { t as grInputConfig } from "./config-
|
|
41
|
+
import { t as grInputConfig } from "./config-CIkdsWUk.js";
|
|
42
42
|
import { t as grInputTagConfig } from "./config-BqT6PMzO.js";
|
|
43
43
|
import { t as grJsonViewerConfig } from "./config-DpAYidyY2.js";
|
|
44
44
|
import { t as grKbdConfig } from "./config-BRESvs9g.js";
|
|
@@ -53,14 +53,14 @@ import { t as grPopoverConfig } from "./config-BTwYMQaz2.js";
|
|
|
53
53
|
import { t as grProgressBarConfig } from "./config-DWL81-aM.js";
|
|
54
54
|
import { t as grProgressCircleConfig } from "./config-CJzmDHfI.js";
|
|
55
55
|
import { t as grPromptDialogConfig } from "./config-C0Ea9ePP.js";
|
|
56
|
-
import { t as grRadioConfig } from "./config-
|
|
56
|
+
import { t as grRadioConfig } from "./config-CuQmUkMw2.js";
|
|
57
57
|
import { t as grRadioGroupConfig } from "./config-QaIc_gRa.js";
|
|
58
58
|
import { t as grRatingConfig } from "./config-DRbojEzO.js";
|
|
59
59
|
import { t as grSegmentedConfig } from "./config-rLkc9Zn2.js";
|
|
60
60
|
import { t as grSelectConfig } from "./config-DnF472Ox.js";
|
|
61
61
|
import { t as grSidebarConfig } from "./config-DNDgp9bB.js";
|
|
62
62
|
import { t as grSkeletonConfig } from "./config-8Pcutu1j.js";
|
|
63
|
-
import { t as grSliderConfig } from "./config-
|
|
63
|
+
import { t as grSliderConfig } from "./config-E1cTyRVV.js";
|
|
64
64
|
import { t as grSortableListConfig } from "./config-CbEbLyDE.js";
|
|
65
65
|
import { t as grSplitterConfig } from "./config-CvbVM4ep.js";
|
|
66
66
|
import { t as grStatisticConfig } from "./config-DGC00bTp.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"granular-provider-CHFaw3wU.js","names":[],"sources":["../../src/components/GrDialog/config.ts","../../src/components/GrResponseErrorBanner/config.ts","../../src/granular-provider/shared.ts","../../src/granular-provider/index.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDialogSafelist } from './safelist'\n\nexport const grDialogConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDialog',\n dependencies: ['GrButton', 'GrModal'],\n safelist: grDialogSafelist,\n})\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grResponseErrorBannerConfig = defineGranularComponent(import.meta.url, {\n name: 'GrResponseErrorBanner',\n dependencies: ['GrAlert', 'GrButton'],\n})\n","// `id`, `theme.*`, `packageBaseUrl` и реестр компонентов провайдера.\n//\n// Все `new URL('../styles/...', import.meta.url)` обязаны лежать именно здесь:\n// `shared.ts` в одной директории с `index.ts` / `node.ts`, поэтому\n// относительные пути совпадают. Для браузера безопасно — бандлеры\n// транслируют такие литералы в статические asset-URL.\n//\n// `apps/showcase/scripts/generate-component-api.mjs` читает список компонентов\n// из `Object.keys(granularityComponentConfigs)` через vite SSR.\nimport {\n defineGranularProvider,\n type GranularComponentDescriptor,\n type GranularProvider,\n resolvePackageBaseUrl,\n} from '@feugene/unocss-preset-granular/contract'\n// <granularity:components:imports> — блок генерируется `yarn generate:registry`\nimport { grAlertConfig } from '../components/GrAlert/config'\nimport { grAutocompleteConfig } from '../components/GrAutocomplete/config'\nimport { grAvatarConfig } from '../components/GrAvatar/config'\nimport { grBadgeConfig } from '../components/GrBadge/config'\nimport { grBadgeWrapConfig } from '../components/GrBadgeWrap/config'\nimport { grBottomNavConfig } from '../components/GrBottomNav/config'\nimport { grBreadcrumbsConfig } from '../components/GrBreadcrumbs/config'\nimport { grButtonConfig } from '../components/GrButton/config'\nimport { grButtonGroupConfig } from '../components/GrButtonGroup/config'\nimport { grCardConfig } from '../components/GrCard/config'\nimport { grCheckboxConfig } from '../components/GrCheckbox/config'\nimport { grCheckboxGroupConfig } from '../components/GrCheckboxGroup/config'\nimport { grChipConfig } from '../components/GrChip/config'\nimport { grChipGroupConfig } from '../components/GrChipGroup/config'\nimport { grCodeBlockConfig } from '../components/GrCodeBlock/config'\nimport { grCollapseConfig } from '../components/GrCollapse/config'\nimport { grColorPickerConfig } from '../components/GrColorPicker/config'\nimport { grCommandPaletteConfig } from '../components/GrCommandPalette/config'\nimport { grConfigProviderConfig } from '../components/GrConfigProvider/config'\nimport { grConfirmDialogConfig } from '../components/GrConfirmDialog/config'\nimport { grContextMenuConfig } from '../components/GrContextMenu/config'\nimport { grDataTableConfig } from '../components/GrDataTable/config'\nimport { grDeltaConfig } from '../components/GrDelta/config'\nimport { grDescriptionListConfig } from '../components/GrDescriptionList/config'\nimport { grDialogConfig } from '../components/GrDialog/config'\nimport { grDialogServiceConfig } from '../components/GrDialogService/config'\nimport { grDividerConfig } from '../components/GrDivider/config'\nimport { grDrawerConfig } from '../components/GrDrawer/config'\nimport { grDropdownConfig } from '../components/GrDropdown/config'\nimport { grDropdownMenuConfig } from '../components/GrDropdownMenu/config'\nimport { grEmptyStateConfig } from '../components/GrEmptyState/config'\nimport { grFilePreviewConfig } from '../components/GrFilePreview/config'\nimport { grFileUploadConfig } from '../components/GrFileUpload/config'\nimport { grFormConfig } from '../components/GrForm/config'\nimport { grFormFieldConfig } from '../components/GrFormField/config'\nimport { grFormFileConfig } from '../components/GrFormFile/config'\nimport { grFormSectionConfig } from '../components/GrFormSection/config'\nimport { grIconConfig } from '../components/GrIcon/config'\nimport { grImageViewerConfig } from '../components/GrImageViewer/config'\nimport { grInputConfig } from '../components/GrInput/config'\nimport { grInputTagConfig } from '../components/GrInputTag/config'\nimport { grJsonViewerConfig } from '../components/GrJsonViewer/config'\nimport { grKbdConfig } from '../components/GrKbd/config'\nimport { grLinkConfig } from '../components/GrLink/config'\nimport { grListConfig } from '../components/GrList/config'\nimport { grLoadingConfig } from '../components/GrLoading/config'\nimport { grModalConfig } from '../components/GrModal/config'\nimport { grNavbarConfig } from '../components/GrNavbar/config'\nimport { grNumberInputConfig } from '../components/GrNumberInput/config'\nimport { grPaginationConfig } from '../components/GrPagination/config'\nimport { grPopoverConfig } from '../components/GrPopover/config'\nimport { grProgressBarConfig } from '../components/GrProgressBar/config'\nimport { grProgressCircleConfig } from '../components/GrProgressCircle/config'\nimport { grPromptDialogConfig } from '../components/GrPromptDialog/config'\nimport { grRadioConfig } from '../components/GrRadio/config'\nimport { grRadioGroupConfig } from '../components/GrRadioGroup/config'\nimport { grRatingConfig } from '../components/GrRating/config'\nimport { grResponseErrorBannerConfig } from '../components/GrResponseErrorBanner/config'\nimport { grSegmentedConfig } from '../components/GrSegmented/config'\nimport { grSelectConfig } from '../components/GrSelect/config'\nimport { grSidebarConfig } from '../components/GrSidebar/config'\nimport { grSkeletonConfig } from '../components/GrSkeleton/config'\nimport { grSliderConfig } from '../components/GrSlider/config'\nimport { grSortableListConfig } from '../components/GrSortableList/config'\nimport { grSplitterConfig } from '../components/GrSplitter/config'\nimport { grStatisticConfig } from '../components/GrStatistic/config'\nimport { grStepsConfig } from '../components/GrSteps/config'\nimport { grSwitchConfig } from '../components/GrSwitch/config'\nimport { grTableConfig } from '../components/GrTable/config'\nimport { grTabPanelsConfig } from '../components/GrTabPanels/config'\nimport { grTabsConfig } from '../components/GrTabs/config'\nimport { grTextareaConfig } from '../components/GrTextarea/config'\nimport { grTimelineConfig } from '../components/GrTimeline/config'\nimport { grToasterConfig } from '../components/GrToaster/config'\nimport { grTooltipConfig } from '../components/GrTooltip/config'\nimport { grTreeConfig } from '../components/GrTree/config'\nimport { grTreeSelectConfig } from '../components/GrTreeSelect/config'\nimport { grValueConfig } from '../components/GrValue/config'\n// </granularity:components:imports>\n\n/** Идентификатор провайдера — совпадает с именем пакета. */\nexport const GRANULARITY_PROVIDER_ID = '@feugene/granularity'\n\n// Не заменять на `new URL('..', import.meta.url)`: Vite и rolldown распознают\n// этот литерал и подставляют `data:`-URL, после чего scan-директории пустеют.\nconst packageBaseUrl = resolvePackageBaseUrl(import.meta.url)\n\n/** Встроенные темы пакета. Единственный источник правды о списке тем. */\nexport const granularityThemeNames = ['light', 'dark'] as const\nexport type GranularityThemeName = (typeof granularityThemeNames)[number]\n\n/** Темы, активные по умолчанию, если окружение не переопределяет выбор. */\nexport const granularityDefaultThemes: readonly GranularityThemeName[] = ['light']\n\nconst theme = {\n baseCssUrl: new URL('../styles/base.css', import.meta.url).href,\n tokensCssUrl: new URL('../styles/tokens.css', import.meta.url).href,\n themes: {\n light: new URL('../styles/themes/light.css', import.meta.url).href,\n dark: new URL('../styles/themes/dark.css', import.meta.url).href,\n },\n defaultThemes: granularityDefaultThemes,\n} as const\n\n/**\n * Реестр публичных компонентов. Ключи совпадают с subpath-экспортом\n * `@feugene/granularity/components/<Name>`.\n */\nexport const granularityComponentConfigs = {\n // <granularity:components:registry> — блок генерируется `yarn generate:registry`\n GrAlert: grAlertConfig,\n GrAutocomplete: grAutocompleteConfig,\n GrAvatar: grAvatarConfig,\n GrBadge: grBadgeConfig,\n GrBadgeWrap: grBadgeWrapConfig,\n GrBottomNav: grBottomNavConfig,\n GrBreadcrumbs: grBreadcrumbsConfig,\n GrButton: grButtonConfig,\n GrButtonGroup: grButtonGroupConfig,\n GrCard: grCardConfig,\n GrCheckbox: grCheckboxConfig,\n GrCheckboxGroup: grCheckboxGroupConfig,\n GrChip: grChipConfig,\n GrChipGroup: grChipGroupConfig,\n GrCodeBlock: grCodeBlockConfig,\n GrCollapse: grCollapseConfig,\n GrColorPicker: grColorPickerConfig,\n GrCommandPalette: grCommandPaletteConfig,\n GrConfigProvider: grConfigProviderConfig,\n GrConfirmDialog: grConfirmDialogConfig,\n GrContextMenu: grContextMenuConfig,\n GrDataTable: grDataTableConfig,\n GrDelta: grDeltaConfig,\n GrDescriptionList: grDescriptionListConfig,\n GrDialog: grDialogConfig,\n GrDialogService: grDialogServiceConfig,\n GrDivider: grDividerConfig,\n GrDrawer: grDrawerConfig,\n GrDropdown: grDropdownConfig,\n GrDropdownMenu: grDropdownMenuConfig,\n GrEmptyState: grEmptyStateConfig,\n GrFilePreview: grFilePreviewConfig,\n GrFileUpload: grFileUploadConfig,\n GrForm: grFormConfig,\n GrFormField: grFormFieldConfig,\n GrFormFile: grFormFileConfig,\n GrFormSection: grFormSectionConfig,\n GrIcon: grIconConfig,\n GrImageViewer: grImageViewerConfig,\n GrInput: grInputConfig,\n GrInputTag: grInputTagConfig,\n GrJsonViewer: grJsonViewerConfig,\n GrKbd: grKbdConfig,\n GrLink: grLinkConfig,\n GrList: grListConfig,\n GrLoading: grLoadingConfig,\n GrModal: grModalConfig,\n GrNavbar: grNavbarConfig,\n GrNumberInput: grNumberInputConfig,\n GrPagination: grPaginationConfig,\n GrPopover: grPopoverConfig,\n GrProgressBar: grProgressBarConfig,\n GrProgressCircle: grProgressCircleConfig,\n GrPromptDialog: grPromptDialogConfig,\n GrRadio: grRadioConfig,\n GrRadioGroup: grRadioGroupConfig,\n GrRating: grRatingConfig,\n GrResponseErrorBanner: grResponseErrorBannerConfig,\n GrSegmented: grSegmentedConfig,\n GrSelect: grSelectConfig,\n GrSidebar: grSidebarConfig,\n GrSkeleton: grSkeletonConfig,\n GrSlider: grSliderConfig,\n GrSortableList: grSortableListConfig,\n GrSplitter: grSplitterConfig,\n GrStatistic: grStatisticConfig,\n GrSteps: grStepsConfig,\n GrSwitch: grSwitchConfig,\n GrTable: grTableConfig,\n GrTabPanels: grTabPanelsConfig,\n GrTabs: grTabsConfig,\n GrTextarea: grTextareaConfig,\n GrTimeline: grTimelineConfig,\n GrToaster: grToasterConfig,\n GrTooltip: grTooltipConfig,\n GrTree: grTreeConfig,\n GrTreeSelect: grTreeSelectConfig,\n GrValue: grValueConfig,\n // </granularity:components:registry>\n}\n\nexport type GranularityComponentName = keyof typeof granularityComponentConfigs\n\n/** Базовый набор компонентов в порядке реестра. */\nconst baseComponents: readonly GranularComponentDescriptor[] = Object.values(\n granularityComponentConfigs,\n)\n\n/**\n * Собирает granular-provider пакета.\n *\n * `overrides` — точка расширения для потребителя: дескриптор с именем из\n * базового реестра заменяет его, остальные дописываются в конец.\n */\nexport function createGranularityProvider(\n overrides: readonly GranularComponentDescriptor[] = [],\n): GranularProvider {\n const overrideByName = new Map(\n overrides.map(component => [component.name, component]),\n )\n const components: GranularComponentDescriptor[] = [\n ...baseComponents.map(component => overrideByName.get(component.name) ?? component),\n ...overrides.filter(component => !baseComponents.some(base => base.name === component.name)),\n ]\n\n return defineGranularProvider({\n id: GRANULARITY_PROVIDER_ID,\n contractVersion: 1,\n packageBaseUrl,\n components,\n theme,\n })\n}\n","import { createGranularityProvider } from './shared'\n\nexport * from './shared'\n\nexport const granularityProvider = createGranularityProvider()\n\nexport default granularityProvider\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,cAAc,CAAC,YAAY,SAAS;CACpC,UAAU;AACZ,CAAC;;;ACND,IAAa,8BAA8B,wBAAwB,OAAO,KAAK,KAAK;CAClF,MAAM;CACN,cAAc,CAAC,WAAW,UAAU;AACtC,CAAC;;;;AC4FD,IAAa,0BAA0B;AAIvC,IAAM,iBAAiB,sBAAsB,OAAO,KAAK,GAAG;;AAG5D,IAAa,wBAAwB,CAAC,SAAS,MAAM;;AAIrD,IAAa,2BAA4D,CAAC,OAAO;AAEjF,IAAM,QAAQ;CACZ,YAAY,IAAA,IAAA,q5KAAA,KAAA,OAAA,KAAA,GAAA,CAA8C,CAAC;CAC3D,cAAc,IAAA,IAAA,65YAAA,KAAA,OAAA,KAAA,GAAA,CAAgD,CAAC;CAC/D,QAAQ;EACN,OAAO,IAAA,IAAA,iyYAAA,KAAA,OAAA,KAAA,GAAA,CAAsD,CAAC;EAC9D,MAAM,IAAA,IAAA,y/SAAA,KAAA,OAAA,KAAA,GAAA,CAAqD,CAAC;CAC9D;CACA,eAAe;AACjB;;;;;AAMA,IAAa,8BAA8B;CAEzC,SAAS;CACT,gBAAgB;CAChB,UAAU;CACV,SAAS;CACT,aAAa;CACb,aAAa;CACb,eAAe;CACf,UAAU;CACV,eAAe;CACf,QAAQ;CACR,YAAY;CACZ,iBAAiB;CACjB,QAAQ;CACR,aAAa;CACb,aAAa;CACb,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,eAAe;CACf,aAAa;CACb,SAAS;CACT,mBAAmB;CACnB,UAAU;CACV,iBAAiB;CACjB,WAAW;CACX,UAAU;CACV,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,eAAe;CACf,cAAc;CACd,QAAQ;CACR,aAAa;CACb,YAAY;CACZ,eAAe;CACf,QAAQ;CACR,eAAe;CACf,SAAS;CACT,YAAY;CACZ,cAAc;CACd,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,SAAS;CACT,UAAU;CACV,eAAe;CACf,cAAc;CACd,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,cAAc;CACd,UAAU;CACV,uBAAuB;CACvB,aAAa;CACb,UAAU;CACV,WAAW;CACX,YAAY;CACZ,UAAU;CACV,gBAAgB;CAChB,YAAY;CACZ,aAAa;CACb,SAAS;CACT,UAAU;CACV,SAAS;CACT,aAAa;CACb,QAAQ;CACR,YAAY;CACZ,YAAY;CACZ,WAAW;CACX,WAAW;CACX,QAAQ;CACR,cAAc;CACd,SAAS;AAEX;;AAKA,IAAM,iBAAyD,OAAO,OACpE,2BACF;;;;;;;AAQA,SAAgB,0BACd,YAAoD,CAAC,GACnC;CAClB,MAAM,iBAAiB,IAAI,IACzB,UAAU,KAAI,cAAa,CAAC,UAAU,MAAM,SAAS,CAAC,CACxD;CAMA,OAAO,uBAAuB;EAC5B,IAAI;EACJ,iBAAiB;EACjB;EACA,aARA,GAAG,eAAe,KAAI,cAAa,eAAe,IAAI,UAAU,IAAI,KAAK,SAAS,GAClF,GAAG,UAAU,QAAO,cAAa,CAAC,eAAe,MAAK,SAAQ,KAAK,SAAS,UAAU,IAAI,CAAC,CAO3F;EACA;CACF,CAAC;AACH;;;AC1OA,IAAa,sBAAsB,0BAA0B"}
|
|
1
|
+
{"version":3,"file":"granular-provider-Da2CJO6j.js","names":[],"sources":["../../src/components/GrDialog/config.ts","../../src/components/GrResponseErrorBanner/config.ts","../../src/granular-provider/shared.ts","../../src/granular-provider/index.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDialogSafelist } from './safelist'\n\nexport const grDialogConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDialog',\n dependencies: ['GrButton', 'GrModal'],\n safelist: grDialogSafelist,\n})\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grResponseErrorBannerConfig = defineGranularComponent(import.meta.url, {\n name: 'GrResponseErrorBanner',\n dependencies: ['GrAlert', 'GrButton'],\n})\n","// `id`, `theme.*`, `packageBaseUrl` и реестр компонентов провайдера.\n//\n// Все `new URL('../styles/...', import.meta.url)` обязаны лежать именно здесь:\n// `shared.ts` в одной директории с `index.ts` / `node.ts`, поэтому\n// относительные пути совпадают. Для браузера безопасно — бандлеры\n// транслируют такие литералы в статические asset-URL.\n//\n// `apps/showcase/scripts/generate-component-api.mjs` читает список компонентов\n// из `Object.keys(granularityComponentConfigs)` через vite SSR.\nimport {\n defineGranularProvider,\n type GranularComponentDescriptor,\n type GranularProvider,\n resolvePackageBaseUrl,\n} from '@feugene/unocss-preset-granular/contract'\n// <granularity:components:imports> — блок генерируется `yarn generate:registry`\nimport { grAlertConfig } from '../components/GrAlert/config'\nimport { grAutocompleteConfig } from '../components/GrAutocomplete/config'\nimport { grAvatarConfig } from '../components/GrAvatar/config'\nimport { grBadgeConfig } from '../components/GrBadge/config'\nimport { grBadgeWrapConfig } from '../components/GrBadgeWrap/config'\nimport { grBottomNavConfig } from '../components/GrBottomNav/config'\nimport { grBreadcrumbsConfig } from '../components/GrBreadcrumbs/config'\nimport { grButtonConfig } from '../components/GrButton/config'\nimport { grButtonGroupConfig } from '../components/GrButtonGroup/config'\nimport { grCardConfig } from '../components/GrCard/config'\nimport { grCheckboxConfig } from '../components/GrCheckbox/config'\nimport { grCheckboxGroupConfig } from '../components/GrCheckboxGroup/config'\nimport { grChipConfig } from '../components/GrChip/config'\nimport { grChipGroupConfig } from '../components/GrChipGroup/config'\nimport { grCodeBlockConfig } from '../components/GrCodeBlock/config'\nimport { grCollapseConfig } from '../components/GrCollapse/config'\nimport { grColorPickerConfig } from '../components/GrColorPicker/config'\nimport { grCommandPaletteConfig } from '../components/GrCommandPalette/config'\nimport { grConfigProviderConfig } from '../components/GrConfigProvider/config'\nimport { grConfirmDialogConfig } from '../components/GrConfirmDialog/config'\nimport { grContextMenuConfig } from '../components/GrContextMenu/config'\nimport { grDataTableConfig } from '../components/GrDataTable/config'\nimport { grDeltaConfig } from '../components/GrDelta/config'\nimport { grDescriptionListConfig } from '../components/GrDescriptionList/config'\nimport { grDialogConfig } from '../components/GrDialog/config'\nimport { grDialogServiceConfig } from '../components/GrDialogService/config'\nimport { grDividerConfig } from '../components/GrDivider/config'\nimport { grDrawerConfig } from '../components/GrDrawer/config'\nimport { grDropdownConfig } from '../components/GrDropdown/config'\nimport { grDropdownMenuConfig } from '../components/GrDropdownMenu/config'\nimport { grEmptyStateConfig } from '../components/GrEmptyState/config'\nimport { grFilePreviewConfig } from '../components/GrFilePreview/config'\nimport { grFileUploadConfig } from '../components/GrFileUpload/config'\nimport { grFormConfig } from '../components/GrForm/config'\nimport { grFormFieldConfig } from '../components/GrFormField/config'\nimport { grFormFileConfig } from '../components/GrFormFile/config'\nimport { grFormSectionConfig } from '../components/GrFormSection/config'\nimport { grIconConfig } from '../components/GrIcon/config'\nimport { grImageViewerConfig } from '../components/GrImageViewer/config'\nimport { grInputConfig } from '../components/GrInput/config'\nimport { grInputTagConfig } from '../components/GrInputTag/config'\nimport { grJsonViewerConfig } from '../components/GrJsonViewer/config'\nimport { grKbdConfig } from '../components/GrKbd/config'\nimport { grLinkConfig } from '../components/GrLink/config'\nimport { grListConfig } from '../components/GrList/config'\nimport { grLoadingConfig } from '../components/GrLoading/config'\nimport { grModalConfig } from '../components/GrModal/config'\nimport { grNavbarConfig } from '../components/GrNavbar/config'\nimport { grNumberInputConfig } from '../components/GrNumberInput/config'\nimport { grPaginationConfig } from '../components/GrPagination/config'\nimport { grPopoverConfig } from '../components/GrPopover/config'\nimport { grProgressBarConfig } from '../components/GrProgressBar/config'\nimport { grProgressCircleConfig } from '../components/GrProgressCircle/config'\nimport { grPromptDialogConfig } from '../components/GrPromptDialog/config'\nimport { grRadioConfig } from '../components/GrRadio/config'\nimport { grRadioGroupConfig } from '../components/GrRadioGroup/config'\nimport { grRatingConfig } from '../components/GrRating/config'\nimport { grResponseErrorBannerConfig } from '../components/GrResponseErrorBanner/config'\nimport { grSegmentedConfig } from '../components/GrSegmented/config'\nimport { grSelectConfig } from '../components/GrSelect/config'\nimport { grSidebarConfig } from '../components/GrSidebar/config'\nimport { grSkeletonConfig } from '../components/GrSkeleton/config'\nimport { grSliderConfig } from '../components/GrSlider/config'\nimport { grSortableListConfig } from '../components/GrSortableList/config'\nimport { grSplitterConfig } from '../components/GrSplitter/config'\nimport { grStatisticConfig } from '../components/GrStatistic/config'\nimport { grStepsConfig } from '../components/GrSteps/config'\nimport { grSwitchConfig } from '../components/GrSwitch/config'\nimport { grTableConfig } from '../components/GrTable/config'\nimport { grTabPanelsConfig } from '../components/GrTabPanels/config'\nimport { grTabsConfig } from '../components/GrTabs/config'\nimport { grTextareaConfig } from '../components/GrTextarea/config'\nimport { grTimelineConfig } from '../components/GrTimeline/config'\nimport { grToasterConfig } from '../components/GrToaster/config'\nimport { grTooltipConfig } from '../components/GrTooltip/config'\nimport { grTreeConfig } from '../components/GrTree/config'\nimport { grTreeSelectConfig } from '../components/GrTreeSelect/config'\nimport { grValueConfig } from '../components/GrValue/config'\n// </granularity:components:imports>\n\n/** Идентификатор провайдера — совпадает с именем пакета. */\nexport const GRANULARITY_PROVIDER_ID = '@feugene/granularity'\n\n// Не заменять на `new URL('..', import.meta.url)`: Vite и rolldown распознают\n// этот литерал и подставляют `data:`-URL, после чего scan-директории пустеют.\nconst packageBaseUrl = resolvePackageBaseUrl(import.meta.url)\n\n/** Встроенные темы пакета. Единственный источник правды о списке тем. */\nexport const granularityThemeNames = ['light', 'dark'] as const\nexport type GranularityThemeName = (typeof granularityThemeNames)[number]\n\n/** Темы, активные по умолчанию, если окружение не переопределяет выбор. */\nexport const granularityDefaultThemes: readonly GranularityThemeName[] = ['light']\n\nconst theme = {\n baseCssUrl: new URL('../styles/base.css', import.meta.url).href,\n tokensCssUrl: new URL('../styles/tokens.css', import.meta.url).href,\n themes: {\n light: new URL('../styles/themes/light.css', import.meta.url).href,\n dark: new URL('../styles/themes/dark.css', import.meta.url).href,\n },\n defaultThemes: granularityDefaultThemes,\n} as const\n\n/**\n * Реестр публичных компонентов. Ключи совпадают с subpath-экспортом\n * `@feugene/granularity/components/<Name>`.\n */\nexport const granularityComponentConfigs = {\n // <granularity:components:registry> — блок генерируется `yarn generate:registry`\n GrAlert: grAlertConfig,\n GrAutocomplete: grAutocompleteConfig,\n GrAvatar: grAvatarConfig,\n GrBadge: grBadgeConfig,\n GrBadgeWrap: grBadgeWrapConfig,\n GrBottomNav: grBottomNavConfig,\n GrBreadcrumbs: grBreadcrumbsConfig,\n GrButton: grButtonConfig,\n GrButtonGroup: grButtonGroupConfig,\n GrCard: grCardConfig,\n GrCheckbox: grCheckboxConfig,\n GrCheckboxGroup: grCheckboxGroupConfig,\n GrChip: grChipConfig,\n GrChipGroup: grChipGroupConfig,\n GrCodeBlock: grCodeBlockConfig,\n GrCollapse: grCollapseConfig,\n GrColorPicker: grColorPickerConfig,\n GrCommandPalette: grCommandPaletteConfig,\n GrConfigProvider: grConfigProviderConfig,\n GrConfirmDialog: grConfirmDialogConfig,\n GrContextMenu: grContextMenuConfig,\n GrDataTable: grDataTableConfig,\n GrDelta: grDeltaConfig,\n GrDescriptionList: grDescriptionListConfig,\n GrDialog: grDialogConfig,\n GrDialogService: grDialogServiceConfig,\n GrDivider: grDividerConfig,\n GrDrawer: grDrawerConfig,\n GrDropdown: grDropdownConfig,\n GrDropdownMenu: grDropdownMenuConfig,\n GrEmptyState: grEmptyStateConfig,\n GrFilePreview: grFilePreviewConfig,\n GrFileUpload: grFileUploadConfig,\n GrForm: grFormConfig,\n GrFormField: grFormFieldConfig,\n GrFormFile: grFormFileConfig,\n GrFormSection: grFormSectionConfig,\n GrIcon: grIconConfig,\n GrImageViewer: grImageViewerConfig,\n GrInput: grInputConfig,\n GrInputTag: grInputTagConfig,\n GrJsonViewer: grJsonViewerConfig,\n GrKbd: grKbdConfig,\n GrLink: grLinkConfig,\n GrList: grListConfig,\n GrLoading: grLoadingConfig,\n GrModal: grModalConfig,\n GrNavbar: grNavbarConfig,\n GrNumberInput: grNumberInputConfig,\n GrPagination: grPaginationConfig,\n GrPopover: grPopoverConfig,\n GrProgressBar: grProgressBarConfig,\n GrProgressCircle: grProgressCircleConfig,\n GrPromptDialog: grPromptDialogConfig,\n GrRadio: grRadioConfig,\n GrRadioGroup: grRadioGroupConfig,\n GrRating: grRatingConfig,\n GrResponseErrorBanner: grResponseErrorBannerConfig,\n GrSegmented: grSegmentedConfig,\n GrSelect: grSelectConfig,\n GrSidebar: grSidebarConfig,\n GrSkeleton: grSkeletonConfig,\n GrSlider: grSliderConfig,\n GrSortableList: grSortableListConfig,\n GrSplitter: grSplitterConfig,\n GrStatistic: grStatisticConfig,\n GrSteps: grStepsConfig,\n GrSwitch: grSwitchConfig,\n GrTable: grTableConfig,\n GrTabPanels: grTabPanelsConfig,\n GrTabs: grTabsConfig,\n GrTextarea: grTextareaConfig,\n GrTimeline: grTimelineConfig,\n GrToaster: grToasterConfig,\n GrTooltip: grTooltipConfig,\n GrTree: grTreeConfig,\n GrTreeSelect: grTreeSelectConfig,\n GrValue: grValueConfig,\n // </granularity:components:registry>\n}\n\nexport type GranularityComponentName = keyof typeof granularityComponentConfigs\n\n/** Базовый набор компонентов в порядке реестра. */\nconst baseComponents: readonly GranularComponentDescriptor[] = Object.values(\n granularityComponentConfigs,\n)\n\n/**\n * Собирает granular-provider пакета.\n *\n * `overrides` — точка расширения для потребителя: дескриптор с именем из\n * базового реестра заменяет его, остальные дописываются в конец.\n */\nexport function createGranularityProvider(\n overrides: readonly GranularComponentDescriptor[] = [],\n): GranularProvider {\n const overrideByName = new Map(\n overrides.map(component => [component.name, component]),\n )\n const components: GranularComponentDescriptor[] = [\n ...baseComponents.map(component => overrideByName.get(component.name) ?? component),\n ...overrides.filter(component => !baseComponents.some(base => base.name === component.name)),\n ]\n\n return defineGranularProvider({\n id: GRANULARITY_PROVIDER_ID,\n contractVersion: 1,\n packageBaseUrl,\n components,\n theme,\n })\n}\n","import { createGranularityProvider } from './shared'\n\nexport * from './shared'\n\nexport const granularityProvider = createGranularityProvider()\n\nexport default granularityProvider\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,cAAc,CAAC,YAAY,SAAS;CACpC,UAAU;AACZ,CAAC;;;ACND,IAAa,8BAA8B,wBAAwB,OAAO,KAAK,KAAK;CAClF,MAAM;CACN,cAAc,CAAC,WAAW,UAAU;AACtC,CAAC;;;;AC4FD,IAAa,0BAA0B;AAIvC,IAAM,iBAAiB,sBAAsB,OAAO,KAAK,GAAG;;AAG5D,IAAa,wBAAwB,CAAC,SAAS,MAAM;;AAIrD,IAAa,2BAA4D,CAAC,OAAO;AAEjF,IAAM,QAAQ;CACZ,YAAY,IAAA,IAAA,q5KAAA,KAAA,OAAA,KAAA,GAAA,CAA8C,CAAC;CAC3D,cAAc,IAAA,IAAA,65YAAA,KAAA,OAAA,KAAA,GAAA,CAAgD,CAAC;CAC/D,QAAQ;EACN,OAAO,IAAA,IAAA,iyYAAA,KAAA,OAAA,KAAA,GAAA,CAAsD,CAAC;EAC9D,MAAM,IAAA,IAAA,y/SAAA,KAAA,OAAA,KAAA,GAAA,CAAqD,CAAC;CAC9D;CACA,eAAe;AACjB;;;;;AAMA,IAAa,8BAA8B;CAEzC,SAAS;CACT,gBAAgB;CAChB,UAAU;CACV,SAAS;CACT,aAAa;CACb,aAAa;CACb,eAAe;CACf,UAAU;CACV,eAAe;CACf,QAAQ;CACR,YAAY;CACZ,iBAAiB;CACjB,QAAQ;CACR,aAAa;CACb,aAAa;CACb,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,eAAe;CACf,aAAa;CACb,SAAS;CACT,mBAAmB;CACnB,UAAU;CACV,iBAAiB;CACjB,WAAW;CACX,UAAU;CACV,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,eAAe;CACf,cAAc;CACd,QAAQ;CACR,aAAa;CACb,YAAY;CACZ,eAAe;CACf,QAAQ;CACR,eAAe;CACf,SAAS;CACT,YAAY;CACZ,cAAc;CACd,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,SAAS;CACT,UAAU;CACV,eAAe;CACf,cAAc;CACd,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,cAAc;CACd,UAAU;CACV,uBAAuB;CACvB,aAAa;CACb,UAAU;CACV,WAAW;CACX,YAAY;CACZ,UAAU;CACV,gBAAgB;CAChB,YAAY;CACZ,aAAa;CACb,SAAS;CACT,UAAU;CACV,SAAS;CACT,aAAa;CACb,QAAQ;CACR,YAAY;CACZ,YAAY;CACZ,WAAW;CACX,WAAW;CACX,QAAQ;CACR,cAAc;CACd,SAAS;AAEX;;AAKA,IAAM,iBAAyD,OAAO,OACpE,2BACF;;;;;;;AAQA,SAAgB,0BACd,YAAoD,CAAC,GACnC;CAClB,MAAM,iBAAiB,IAAI,IACzB,UAAU,KAAI,cAAa,CAAC,UAAU,MAAM,SAAS,CAAC,CACxD;CAMA,OAAO,uBAAuB;EAC5B,IAAI;EACJ,iBAAiB;EACjB;EACA,aARA,GAAG,eAAe,KAAI,cAAa,eAAe,IAAI,UAAU,IAAI,KAAK,SAAS,GAClF,GAAG,UAAU,QAAO,cAAa,CAAC,eAAe,MAAK,SAAQ,KAAK,SAAS,UAAU,IAAI,CAAC,CAO3F;EACA;CACF,CAAC;AACH;;;AC1OA,IAAa,sBAAsB,0BAA0B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"granularityI18n-BC5zsj_d.js","names":[],"sources":["../../src/internal/granularityI18n.ts"],"sourcesContent":["import { computed, getCurrentInstance, inject, type AppContext } from 'vue'\n\nimport { GRANULARITY_I18N_KEY, type GranularityI18nAdapter } from '../i18n/adapter'\n\nexport type GranularityI18nLike = GranularityI18nAdapter\n\n/**\n * Ключ provide/inject из `@feugene/fint-i18n` (`Symbol.for(\"FintI18n\")`).\n *\n * Дублируем константу здесь, чтобы не делать `@feugene/fint-i18n` обязательной\n * runtime-зависимостью пакета: достаточно, чтобы приложение само установило\n * fint-i18n через `installI18n(app, i18n)` — символ глобальный (Symbol.for),\n * поэтому ключи будут совпадать без прямого импорта.\n */\nconst FINT_I18N_KEY: symbol = Symbol.for('FintI18n')\n\nfunction isGranularityI18nLike(value: unknown): value is GranularityI18nLike {\n return typeof (value as GranularityI18nLike | null)?.t === 'function'\n}\n\nexport function resolveGranularityI18n(context?: AppContext | GranularityI18nLike | null): GranularityI18nLike | null {\n if (isGranularityI18nLike(context)) {\n return context\n }\n\n const provides = context?.provides\n\n if (provides) {\n const fromGranularity = provides[GRANULARITY_I18N_KEY as symbol] as GranularityI18nLike | null | undefined\n if (isGranularityI18nLike(fromGranularity)) {\n return fromGranularity\n }\n\n const fromFint = provides[FINT_I18N_KEY] as GranularityI18nLike | null | undefined\n if (isGranularityI18nLike(fromFint)) {\n return fromFint\n }\n\n return null\n }\n\n if (!getCurrentInstance()) {\n return null\n }\n\n const fromGranularity = inject<GranularityI18nLike | null>(GRANULARITY_I18N_KEY, null)\n if (isGranularityI18nLike(fromGranularity)) {\n return fromGranularity\n }\n\n const fromFint = inject<GranularityI18nLike | null>(FINT_I18N_KEY, null)\n if (isGranularityI18nLike(fromFint)) {\n return fromFint\n }\n\n return null\n}\n\n// Совпадает с синтаксисом плейсхолдеров `@feugene/fint-i18n` (`{name}`, экранирование\n// `{{`/`}}` — см. docs/en/api.md → \"Template Interpolation\"), чтобы fallback-текст вёл\n// себя идентично реальному переводу, когда параметры переданы.\nconst FALLBACK_PLACEHOLDER_RE = /\\{\\{|\\}\\}|\\{([a-zA-Z0-9_.-]+)\\}/g\n\n/**\n * Интерполирует `{name}`-плейсхолдеры во fallback-строке. Нужен, чтобы `t(key, fallback,\n * params)` корректно подставлял параметры и тогда, когда i18n не подключён (или ключ не\n * найден) — иначе вызывающий код получил бы сырой `'Add \"{value}\"'` вместо `'Add \"foo\"'`.\n */\nfunction interpolateFallback(template: string, params?: Record<string, any>): string {\n // `{{`/`}}`-экранирование обязано работать независимо от того, переданы ли `params`\n // (совпадает с fint-i18n: `t('literal')` без параметров тоже разэкранирует `{{name}}`).\n // Ранний выход по `!params` здесь недопустим.\n return template.replace(FALLBACK_PLACEHOLDER_RE, (match, name: string | undefined) => {\n if (match === '{{')
|
|
1
|
+
{"version":3,"file":"granularityI18n-BC5zsj_d.js","names":[],"sources":["../../src/internal/granularityI18n.ts"],"sourcesContent":["import { computed, getCurrentInstance, inject, type AppContext } from 'vue'\n\nimport { GRANULARITY_I18N_KEY, type GranularityI18nAdapter } from '../i18n/adapter'\n\nexport type GranularityI18nLike = GranularityI18nAdapter\n\n/**\n * Ключ provide/inject из `@feugene/fint-i18n` (`Symbol.for(\"FintI18n\")`).\n *\n * Дублируем константу здесь, чтобы не делать `@feugene/fint-i18n` обязательной\n * runtime-зависимостью пакета: достаточно, чтобы приложение само установило\n * fint-i18n через `installI18n(app, i18n)` — символ глобальный (Symbol.for),\n * поэтому ключи будут совпадать без прямого импорта.\n */\nconst FINT_I18N_KEY: symbol = Symbol.for('FintI18n')\n\nfunction isGranularityI18nLike(value: unknown): value is GranularityI18nLike {\n return typeof (value as GranularityI18nLike | null)?.t === 'function'\n}\n\nexport function resolveGranularityI18n(context?: AppContext | GranularityI18nLike | null): GranularityI18nLike | null {\n if (isGranularityI18nLike(context)) {\n return context\n }\n\n const provides = context?.provides\n\n if (provides) {\n const fromGranularity = provides[GRANULARITY_I18N_KEY as symbol] as GranularityI18nLike | null | undefined\n if (isGranularityI18nLike(fromGranularity)) {\n return fromGranularity\n }\n\n const fromFint = provides[FINT_I18N_KEY] as GranularityI18nLike | null | undefined\n if (isGranularityI18nLike(fromFint)) {\n return fromFint\n }\n\n return null\n }\n\n if (!getCurrentInstance()) {\n return null\n }\n\n const fromGranularity = inject<GranularityI18nLike | null>(GRANULARITY_I18N_KEY, null)\n if (isGranularityI18nLike(fromGranularity)) {\n return fromGranularity\n }\n\n const fromFint = inject<GranularityI18nLike | null>(FINT_I18N_KEY, null)\n if (isGranularityI18nLike(fromFint)) {\n return fromFint\n }\n\n return null\n}\n\n// Совпадает с синтаксисом плейсхолдеров `@feugene/fint-i18n` (`{name}`, экранирование\n// `{{`/`}}` — см. docs/en/api.md → \"Template Interpolation\"), чтобы fallback-текст вёл\n// себя идентично реальному переводу, когда параметры переданы.\nconst FALLBACK_PLACEHOLDER_RE = /\\{\\{|\\}\\}|\\{([a-zA-Z0-9_.-]+)\\}/g\n\n/**\n * Интерполирует `{name}`-плейсхолдеры во fallback-строке. Нужен, чтобы `t(key, fallback,\n * params)` корректно подставлял параметры и тогда, когда i18n не подключён (или ключ не\n * найден) — иначе вызывающий код получил бы сырой `'Add \"{value}\"'` вместо `'Add \"foo\"'`.\n */\nfunction interpolateFallback(template: string, params?: Record<string, any>): string {\n // `{{`/`}}`-экранирование обязано работать независимо от того, переданы ли `params`\n // (совпадает с fint-i18n: `t('literal')` без параметров тоже разэкранирует `{{name}}`).\n // Ранний выход по `!params` здесь недопустим.\n return template.replace(FALLBACK_PLACEHOLDER_RE, (match, name: string | undefined) => {\n if (match === '{{')\n return '{'\n if (match === '}}')\n return '}'\n if (name === undefined)\n return match\n\n const value = params?.[name]\n return value == null ? match : String(value)\n })\n}\n\nexport function useGranularityTranslations(context?: AppContext | GranularityI18nLike | null) {\n const i18n = resolveGranularityI18n(context)\n\n const t = (key: string, fallback: string, params?: Record<string, any>): string => {\n if (!i18n) {\n return interpolateFallback(fallback, params)\n }\n\n // `te()` — единственный честный способ спросить «есть ли перевод».\n // Сравнение `t(key) === key` врёт на словаре, где значение совпадает с\n // ключом: такой перевод считался бы отсутствующим. Оставляем эвристику\n // только для адаптеров, которые `te()` не умеют.\n if (i18n.te) {\n return i18n.te(key) ? i18n.t(key, params) : interpolateFallback(fallback, params)\n }\n\n const result = i18n.t(key, params)\n return result === key ? interpolateFallback(fallback, params) : result\n }\n\n return {\n i18n,\n t,\n /**\n * Активная локаль адаптера — для `Intl.*` и `localeCompare`. `undefined`,\n * когда адаптера нет или он её не отдаёт: тогда сравнение уходит на локаль\n * среды, как и было.\n */\n locale: computed(() => i18n?.locale?.value),\n }\n}\n"],"mappings":";;;;;;;;;;;AAcA,IAAM,gBAAwB,OAAO,IAAI,UAAU;AAEnD,SAAS,sBAAsB,OAA8C;CAC3E,OAAO,OAAQ,OAAsC,MAAM;AAC7D;AAEA,SAAgB,uBAAuB,SAA+E;CACpH,IAAI,sBAAsB,OAAO,GAC/B,OAAO;CAGT,MAAM,WAAW,SAAS;CAE1B,IAAI,UAAU;EACZ,MAAM,kBAAkB,SAAS;EACjC,IAAI,sBAAsB,eAAe,GACvC,OAAO;EAGT,MAAM,WAAW,SAAS;EAC1B,IAAI,sBAAsB,QAAQ,GAChC,OAAO;EAGT,OAAO;CACT;CAEA,IAAI,CAAC,mBAAmB,GACtB,OAAO;CAGT,MAAM,kBAAkB,OAAmC,sBAAsB,IAAI;CACrF,IAAI,sBAAsB,eAAe,GACvC,OAAO;CAGT,MAAM,WAAW,OAAmC,eAAe,IAAI;CACvE,IAAI,sBAAsB,QAAQ,GAChC,OAAO;CAGT,OAAO;AACT;AAKA,IAAM,0BAA0B;;;;;;AAOhC,SAAS,oBAAoB,UAAkB,QAAsC;CAInF,OAAO,SAAS,QAAQ,0BAA0B,OAAO,SAA6B;EACpF,IAAI,UAAU,MACZ,OAAO;EACT,IAAI,UAAU,MACZ,OAAO;EACT,IAAI,SAAS,KAAA,GACX,OAAO;EAET,MAAM,QAAQ,SAAS;EACvB,OAAO,SAAS,OAAO,QAAQ,OAAO,KAAK;CAC7C,CAAC;AACH;AAEA,SAAgB,2BAA2B,SAAmD;CAC5F,MAAM,OAAO,uBAAuB,OAAO;CAE3C,MAAM,KAAK,KAAa,UAAkB,WAAyC;EACjF,IAAI,CAAC,MACH,OAAO,oBAAoB,UAAU,MAAM;EAO7C,IAAI,KAAK,IACP,OAAO,KAAK,GAAG,GAAG,IAAI,KAAK,EAAE,KAAK,MAAM,IAAI,oBAAoB,UAAU,MAAM;EAGlF,MAAM,SAAS,KAAK,EAAE,KAAK,MAAM;EACjC,OAAO,WAAW,MAAM,oBAAoB,UAAU,MAAM,IAAI;CAClE;CAEA,OAAO;EACL;EACA;;;;;;EAMA,QAAQ,eAAe,MAAM,QAAQ,KAAK;CAC5C;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon-Dag2tIMs.js","names":[],"sources":["../../src/components/shared/icon.ts"],"sourcesContent":["import type { Component } from 'vue'\nimport { markRaw } from 'vue'\n\n/**\n * Иконку компонент получает двумя способами, и рисуются они разными тегами.\n *\n * Vue-компонент пакет рисует сам — он ни от чего не зависит. Класс иконки\n * (`i-lucide-*`) генерирует не пакет, а UnoCSS-сборка приложения: без своего\n * `presetIcons` потребитель получит пустое место вместо картинки\n * (`docs/installation.md`). Поэтому класс уезжает в `:class` пустого `span`,\n * а компонент — в `:is`.\n */\nexport function iconTag(\n icon: string | Component | undefined,\n fallback: string | Component = 'span',\n): string | Component {\n if (!icon)
|
|
1
|
+
{"version":3,"file":"icon-Dag2tIMs.js","names":[],"sources":["../../src/components/shared/icon.ts"],"sourcesContent":["import type { Component } from 'vue'\nimport { markRaw } from 'vue'\n\n/**\n * Иконку компонент получает двумя способами, и рисуются они разными тегами.\n *\n * Vue-компонент пакет рисует сам — он ни от чего не зависит. Класс иконки\n * (`i-lucide-*`) генерирует не пакет, а UnoCSS-сборка приложения: без своего\n * `presetIcons` потребитель получит пустое место вместо картинки\n * (`docs/installation.md`). Поэтому класс уезжает в `:class` пустого `span`,\n * а компонент — в `:is`.\n */\nexport function iconTag(\n icon: string | Component | undefined,\n fallback: string | Component = 'span',\n): string | Component {\n if (!icon)\n return fallback\n\n return typeof icon === 'string' ? 'span' : markRaw(icon)\n}\n\n/** Класс иконки, если она задана строкой; для компонента классов нет. */\nexport function iconClass(icon: string | Component | undefined): string {\n return typeof icon === 'string' ? icon : ''\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,QACd,MACA,WAA+B,QACX;CACpB,IAAI,CAAC,MACH,OAAO;CAET,OAAO,OAAO,SAAS,WAAW,SAAS,QAAQ,IAAI;AACzD;;AAGA,SAAgB,UAAU,MAA8C;CACtE,OAAO,OAAO,SAAS,WAAW,OAAO;AAC3C"}
|