@soyfri/shared-library 2.0.0-beta8 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Alert-B3SMPD1s.cjs +31 -0
- package/Alert-B3SMPD1s.cjs.map +1 -0
- package/Alert-YsPScpSE.js +32 -0
- package/Alert-YsPScpSE.js.map +1 -0
- package/{Autocomplete-BA-cGASd.js → Autocomplete-C_lW1VER.js} +57 -36
- package/Autocomplete-C_lW1VER.js.map +1 -0
- package/{Autocomplete-C2x-lBvZ.cjs → Autocomplete-CejWztBY.cjs} +56 -35
- package/Autocomplete-CejWztBY.cjs.map +1 -0
- package/{Avatar-9L7YMxya.cjs → Avatar-Dw5rzayR.cjs} +28 -24
- package/Avatar-Dw5rzayR.cjs.map +1 -0
- package/{Avatar-BJTr-PBd.js → Avatar-H8akSege.js} +28 -24
- package/Avatar-H8akSege.js.map +1 -0
- package/Breadcrumbs-B9I3vxPb.cjs +25 -0
- package/Breadcrumbs-B9I3vxPb.cjs.map +1 -0
- package/Breadcrumbs-C41SPbtX.js +26 -0
- package/Breadcrumbs-C41SPbtX.js.map +1 -0
- package/Button-C17mExpd.cjs.map +1 -1
- package/Button-UkkP-bNw.js.map +1 -1
- package/ButtonGroup-CNunDofQ.cjs +33 -0
- package/ButtonGroup-CNunDofQ.cjs.map +1 -0
- package/ButtonGroup-CcKUZ-lT.js +34 -0
- package/ButtonGroup-CcKUZ-lT.js.map +1 -0
- package/Card-DYKGY-NG.js +116 -0
- package/Card-DYKGY-NG.js.map +1 -0
- package/Card-Dr1-ATRY.cjs +115 -0
- package/Card-Dr1-ATRY.cjs.map +1 -0
- package/Checkbox-BCqMFWt4.cjs +187 -0
- package/Checkbox-BCqMFWt4.cjs.map +1 -0
- package/Checkbox-gB5YKkVo.js +188 -0
- package/Checkbox-gB5YKkVo.js.map +1 -0
- package/{DatePicker-8f_9bwhS.js → DatePicker-_IGWc3I5.js} +38 -62
- package/DatePicker-_IGWc3I5.js.map +1 -0
- package/{DatePicker-DLSfkgGA.cjs → DatePicker-t7uDTZMl.cjs} +42 -66
- package/DatePicker-t7uDTZMl.cjs.map +1 -0
- package/{DateTimePicker-CWNW09-O.cjs → DateTimePicker-BxQyjTCY.cjs} +33 -24
- package/DateTimePicker-BxQyjTCY.cjs.map +1 -0
- package/{DateTimePicker-D4L9GAod.js → DateTimePicker-CrmWav_j.js} +29 -20
- package/DateTimePicker-CrmWav_j.js.map +1 -0
- package/Divider-BApcM5CV.js +28 -0
- package/Divider-BApcM5CV.js.map +1 -0
- package/Divider-CIY0JK4U.cjs +27 -0
- package/Divider-CIY0JK4U.cjs.map +1 -0
- package/{Input-Cp911l23.js → Input-BL1NUIbr.js} +36 -15
- package/Input-BL1NUIbr.js.map +1 -0
- package/{Input-DI0jfq5X.cjs → Input-BcLJlPRo.cjs} +39 -18
- package/Input-BcLJlPRo.cjs.map +1 -0
- package/{Modal-Bnz6d9m9.js → Modal-C_QY7ZzY.js} +137 -105
- package/Modal-C_QY7ZzY.js.map +1 -0
- package/{Modal-Bm_HH9cv.cjs → Modal-D_6ZdSzw.cjs} +132 -100
- package/Modal-D_6ZdSzw.cjs.map +1 -0
- package/README.md +181 -173
- package/{RadioGroup-CxqDHap1.cjs → RadioGroup-Dd0rHXSX.cjs} +10 -8
- package/RadioGroup-Dd0rHXSX.cjs.map +1 -0
- package/{RadioGroup-DMi9FvMP.js → RadioGroup-bO-ahP9T.js} +10 -8
- package/RadioGroup-bO-ahP9T.js.map +1 -0
- package/{Select-3CBOfM2H.js → Select-BY5Y0qZ1.js} +160 -231
- package/Select-BY5Y0qZ1.js.map +1 -0
- package/{Select-Bku4f4f8.cjs → Select-CURrHSyl.cjs} +155 -226
- package/Select-CURrHSyl.cjs.map +1 -0
- package/Spinner-B6sThC1p.js +74 -0
- package/Spinner-B6sThC1p.js.map +1 -0
- package/Spinner-D7qRmNS9.cjs +73 -0
- package/Spinner-D7qRmNS9.cjs.map +1 -0
- package/StatusMessage-B3nXpuRl.cjs +88 -0
- package/StatusMessage-B3nXpuRl.cjs.map +1 -0
- package/StatusMessage-D0WgSBx7.js +89 -0
- package/StatusMessage-D0WgSBx7.js.map +1 -0
- package/Step-BArsou1V.js +301 -0
- package/Step-BArsou1V.js.map +1 -0
- package/Step-Nd7SJbRZ.cjs +300 -0
- package/Step-Nd7SJbRZ.cjs.map +1 -0
- package/{Switch-BIeobv6i.cjs → Switch-CQFOopYy.cjs} +6 -3
- package/Switch-CQFOopYy.cjs.map +1 -0
- package/{Switch-DQEOxM2R.js → Switch-D72dpkH2.js} +6 -3
- package/Switch-D72dpkH2.js.map +1 -0
- package/Tab-D1S7kxXI.cjs +137 -0
- package/Tab-D1S7kxXI.cjs.map +1 -0
- package/Tab-DycIMXmQ.js +138 -0
- package/Tab-DycIMXmQ.js.map +1 -0
- package/components/ActionMenu/ActionMenu.cjs +52 -52
- package/components/ActionMenu/ActionMenu.cjs.map +1 -1
- package/components/ActionMenu/ActionMenu.d.ts +20 -36
- package/components/ActionMenu/ActionMenu.js +55 -55
- package/components/ActionMenu/ActionMenu.js.map +1 -1
- package/components/ActionMenu/index.d.ts +2 -2
- package/components/Alert/Alert.cjs +6 -0
- package/components/Alert/Alert.cjs.map +1 -0
- package/components/Alert/Alert.d.ts +31 -0
- package/components/Alert/Alert.js +6 -0
- package/components/Alert/Alert.js.map +1 -0
- package/components/Alert/index.d.ts +2 -0
- package/components/Alert.d.ts +6 -0
- package/components/AppBar/AppBar.cjs +2 -219
- package/components/AppBar/AppBar.cjs.map +1 -1
- package/components/AppBar/AppBar.d.ts +6 -6
- package/components/AppBar/AppBar.js +5 -222
- package/components/AppBar/AppBar.js.map +1 -1
- package/components/AppBar/index.d.ts +0 -6
- package/components/Autocomplete/Autocomplete.cjs +1 -1
- package/components/Autocomplete/Autocomplete.d.ts +8 -6
- package/components/Autocomplete/Autocomplete.helpers.d.ts +8 -4
- package/components/Autocomplete/Autocomplete.js +1 -1
- package/components/Autocomplete/_parts/AutocompleteOption.d.ts +5 -8
- package/components/Autocomplete/index.d.ts +1 -1
- package/components/Avatar/Avatar.cjs +1 -1
- package/components/Avatar/Avatar.d.ts +16 -1
- package/components/Avatar/Avatar.js +1 -1
- package/components/Avatar/index.d.ts +1 -0
- package/components/Breadcrumbs/Breadcrumbs.cjs +6 -0
- package/components/Breadcrumbs/Breadcrumbs.cjs.map +1 -0
- package/components/Breadcrumbs/Breadcrumbs.d.ts +16 -0
- package/components/Breadcrumbs/Breadcrumbs.js +6 -0
- package/components/Breadcrumbs/Breadcrumbs.js.map +1 -0
- package/components/Breadcrumbs/index.d.ts +2 -0
- package/components/Breadcrumbs.d.ts +6 -0
- package/components/Button/Button.d.ts +5 -5
- package/components/Button/index.d.ts +1 -0
- package/components/ButtonGroup/ButtonGroup.cjs +6 -0
- package/components/ButtonGroup/ButtonGroup.cjs.map +1 -0
- package/components/ButtonGroup/ButtonGroup.d.ts +18 -0
- package/components/ButtonGroup/ButtonGroup.js +6 -0
- package/components/ButtonGroup/ButtonGroup.js.map +1 -0
- package/components/ButtonGroup/index.d.ts +2 -0
- package/components/ButtonGroup.d.ts +6 -0
- package/components/Card/Card.cjs +1 -4
- package/components/Card/Card.cjs.map +1 -1
- package/components/Card/Card.d.ts +21 -50
- package/components/Card/Card.js +1 -4
- package/components/Card/Card.sx.d.ts +3 -6
- package/components/Card/index.d.ts +1 -1
- package/components/Checkbox/Checkbox.cjs +6 -0
- package/components/Checkbox/Checkbox.cjs.map +1 -0
- package/components/Checkbox/Checkbox.d.ts +55 -0
- package/components/Checkbox/Checkbox.js +6 -0
- package/components/Checkbox/Checkbox.js.map +1 -0
- package/components/Checkbox/Checkbox.sx.d.ts +13 -0
- package/components/Checkbox/index.d.ts +2 -0
- package/components/Checkbox.d.ts +6 -0
- package/components/Chip/Chip.cjs +2 -1
- package/components/Chip/Chip.cjs.map +1 -1
- package/components/Chip/Chip.js +3 -2
- package/components/Chip/index.d.ts +2 -1
- package/components/Chip.d.ts +4 -0
- package/components/DatePicker/DatePicker.cjs +1 -1
- package/components/DatePicker/DatePicker.d.ts +1 -13
- package/components/DatePicker/DatePicker.js +1 -1
- package/components/DatePicker/index.d.ts +1 -1
- package/components/DateTimePicker/DateTimePicker.cjs +1 -1
- package/components/DateTimePicker/DateTimePicker.d.ts +10 -6
- package/components/DateTimePicker/DateTimePicker.definitions.d.ts +2 -0
- package/components/DateTimePicker/DateTimePicker.helpers.d.ts +4 -2
- package/components/DateTimePicker/DateTimePicker.js +1 -1
- package/components/DateTimePicker/index.d.ts +1 -1
- package/components/Divider/Divider.cjs +6 -0
- package/components/Divider/Divider.cjs.map +1 -0
- package/components/Divider/Divider.d.ts +17 -0
- package/components/Divider/Divider.js +6 -0
- package/components/Divider/Divider.js.map +1 -0
- package/components/Divider/index.d.ts +2 -0
- package/components/Divider.d.ts +6 -0
- package/components/Drawer/Drawer.cjs +10 -6
- package/components/Drawer/Drawer.cjs.map +1 -1
- package/components/Drawer/Drawer.js +11 -7
- package/components/Drawer/Drawer.js.map +1 -1
- package/components/Drawer/DrawerItem.d.ts +6 -1
- package/components/Gallery/Gallery.cjs +154 -79
- package/components/Gallery/Gallery.cjs.map +1 -1
- package/components/Gallery/Gallery.d.ts +25 -9
- package/components/Gallery/Gallery.js +154 -79
- package/components/Gallery/Gallery.js.map +1 -1
- package/components/Gallery/GalleryLightbox.d.ts +6 -10
- package/components/Gallery/GalleryMain.d.ts +3 -7
- package/components/Gallery/GalleryThumbnails.d.ts +7 -11
- package/components/Gallery/index.d.ts +2 -1
- package/components/Gallery.d.ts +4 -0
- package/components/Icon/Icon.cjs +6 -8
- package/components/Icon/Icon.cjs.map +1 -1
- package/components/Icon/Icon.d.ts +11 -17
- package/components/Icon/Icon.js +6 -8
- package/components/Icon/Icon.js.map +1 -1
- package/components/Icon/index.d.ts +2 -1
- package/components/Icon.d.ts +4 -0
- package/components/Input/Input.cjs +1 -1
- package/components/Input/Input.d.ts +13 -2
- package/components/Input/Input.helpers.d.ts +4 -4
- package/components/Input/Input.js +1 -1
- package/components/Input/index.d.ts +1 -1
- package/components/InputGroup/InputGroup.cjs +23 -22
- package/components/InputGroup/InputGroup.cjs.map +1 -1
- package/components/InputGroup/InputGroup.d.ts +4 -4
- package/components/InputGroup/InputGroup.js +22 -21
- package/components/InputGroup/InputGroup.js.map +1 -1
- package/components/InputGroup/index.d.ts +2 -1
- package/components/InputGroup.d.ts +4 -0
- package/components/Modal/Modal.cjs +2 -2
- package/components/Modal/Modal.d.ts +27 -5
- package/components/Modal/Modal.js +2 -2
- package/components/Modal/ModalBody.d.ts +6 -1
- package/components/Modal/ModalFooter.d.ts +4 -4
- package/components/Modal/ModalHeader.d.ts +6 -1
- package/components/Modal/index.d.ts +3 -2
- package/components/RadioGroup/RadioGroup.cjs +1 -1
- package/components/RadioGroup/RadioGroup.d.ts +9 -3
- package/components/RadioGroup/RadioGroup.js +1 -1
- package/components/RadioGroup/index.d.ts +1 -1
- package/components/Select/Select.cjs +1 -1
- package/components/Select/Select.d.ts +37 -18
- package/components/Select/Select.helpers.d.ts +5 -19
- package/components/Select/Select.js +1 -1
- package/components/Select/index.d.ts +1 -1
- package/components/Spinner/Spinner.cjs +6 -0
- package/components/Spinner/Spinner.cjs.map +1 -0
- package/components/Spinner/Spinner.d.ts +26 -0
- package/components/Spinner/Spinner.js +6 -0
- package/components/Spinner/Spinner.js.map +1 -0
- package/components/Spinner/index.d.ts +2 -0
- package/components/Spinner.d.ts +6 -0
- package/components/Stat/Stat.cjs +2 -2
- package/components/Stat/Stat.js +3 -3
- package/components/Stat/Stat.js.map +1 -1
- package/components/Stat/index.d.ts +2 -1
- package/components/Stat.d.ts +4 -0
- package/components/StatusMessage/StatusMessage.cjs +1 -1
- package/components/StatusMessage/StatusMessage.d.ts +20 -36
- package/components/StatusMessage/StatusMessage.js +1 -1
- package/components/Stepper/Stepper.cjs +6 -2
- package/components/Stepper/Stepper.cjs.map +1 -1
- package/components/Stepper/Stepper.d.ts +9 -8
- package/components/Stepper/Stepper.js +6 -2
- package/{hooks/Wizard/WizardContext.d.ts → components/Stepper/StepperContext.d.ts} +28 -22
- package/components/Stepper/_hooks/useHorizontalScroll.d.ts +19 -0
- package/components/Stepper/_parts/StepperScrollArrow.d.ts +19 -0
- package/components/Stepper/index.d.ts +6 -2
- package/components/Stepper.d.ts +4 -0
- package/components/Switch/Switch.cjs +1 -1
- package/components/Switch/Switch.d.ts +7 -2
- package/components/Switch/Switch.js +1 -1
- package/components/Tabs/Tab.d.ts +13 -2
- package/components/Tabs/Tabs.cjs +3 -2
- package/components/Tabs/Tabs.cjs.map +1 -1
- package/components/Tabs/Tabs.d.ts +33 -16
- package/components/Tabs/Tabs.js +3 -2
- package/components/Tabs/index.d.ts +4 -2
- package/components/Tabs.d.ts +4 -0
- package/components/Timeline/Timeline.cjs +3 -2
- package/components/Timeline/Timeline.cjs.map +1 -1
- package/components/Timeline/Timeline.d.ts +4 -8
- package/components/Timeline/Timeline.js +3 -2
- package/components/Timeline/Timeline.js.map +1 -1
- package/components/Timeline/index.d.ts +4 -2
- package/components/Timeline.d.ts +4 -0
- package/components/_shared/mergeSx.d.ts +7 -0
- package/{formField.sx-DfVbMe0V.js → formField.sx-8_QRnKxv.js} +2 -11
- package/formField.sx-8_QRnKxv.js.map +1 -0
- package/{formField.sx-CQ1mbk9M.cjs → formField.sx-BAX7KwMR.cjs} +10 -19
- package/formField.sx-BAX7KwMR.cjs.map +1 -0
- package/index.cjs +49 -26
- package/index.cjs.map +1 -1
- package/index.d.ts +13 -1
- package/index.js +45 -25
- package/index.js.map +1 -1
- package/local/affiliations/affiliations.dev.soyfri.com-key.pem +28 -0
- package/local/affiliations/affiliations.dev.soyfri.com.pem +27 -0
- package/local/aficiliaciones/afiliaciones.dev.soyfri.com-key.pem +28 -0
- package/local/aficiliaciones/afiliaciones.dev.soyfri.com.pem +27 -0
- package/local/afiliaciones/afiliaciones.dev.soyfri.com-key.pem +28 -0
- package/local/afiliaciones/afiliaciones.dev.soyfri.com.pem +27 -0
- package/local/root/rootCA-key.pem +40 -0
- package/local/root/rootCA.pem +30 -0
- package/local/soporte/supportweb.dev.soyfri.com-key.pem +28 -0
- package/local/soporte/supportweb.dev.soyfri.com.pem +27 -0
- package/local/support/supportweb.dev.soyfri.com-key.pem +28 -0
- package/local/support/supportweb.dev.soyfri.com.pem +27 -0
- package/mergeSx-BXoNZjB_.js +10 -0
- package/mergeSx-BXoNZjB_.js.map +1 -0
- package/mergeSx-Dbccoo_H.cjs +9 -0
- package/mergeSx-Dbccoo_H.cjs.map +1 -0
- package/mui.d.ts +2 -1
- package/package.json +83 -76
- package/theme/componentStyles.d.ts +1 -1
- package/tokens-BRrcP_p_.js +21 -0
- package/tokens-BRrcP_p_.js.map +1 -0
- package/tokens-jaWWNk39.cjs +20 -0
- package/tokens-jaWWNk39.cjs.map +1 -0
- package/utils/index.d.ts +2 -0
- package/{components/ScrollTopButton → utils}/scrollToTop.d.ts +6 -7
- package/Autocomplete-BA-cGASd.js.map +0 -1
- package/Autocomplete-C2x-lBvZ.cjs.map +0 -1
- package/Avatar-9L7YMxya.cjs.map +0 -1
- package/Avatar-BJTr-PBd.js.map +0 -1
- package/Card-DG_crfkK.cjs +0 -185
- package/Card-DG_crfkK.cjs.map +0 -1
- package/Card-Ug-ttVSh.js +0 -186
- package/Card-Ug-ttVSh.js.map +0 -1
- package/DatePicker-8f_9bwhS.js.map +0 -1
- package/DatePicker-DLSfkgGA.cjs.map +0 -1
- package/DateRangePicker-BVpeJCHI.js +0 -76
- package/DateRangePicker-BVpeJCHI.js.map +0 -1
- package/DateRangePicker-B_hKQhbj.cjs +0 -75
- package/DateRangePicker-B_hKQhbj.cjs.map +0 -1
- package/DateTimePicker-CWNW09-O.cjs.map +0 -1
- package/DateTimePicker-D4L9GAod.js.map +0 -1
- package/Input-Cp911l23.js.map +0 -1
- package/Input-DI0jfq5X.cjs.map +0 -1
- package/Modal-Bm_HH9cv.cjs.map +0 -1
- package/Modal-Bnz6d9m9.js.map +0 -1
- package/RadioGroup-CxqDHap1.cjs.map +0 -1
- package/RadioGroup-DMi9FvMP.js.map +0 -1
- package/Select-3CBOfM2H.js.map +0 -1
- package/Select-Bku4f4f8.cjs.map +0 -1
- package/StatusMessage-C5B6oGZ_.cjs +0 -78
- package/StatusMessage-C5B6oGZ_.cjs.map +0 -1
- package/StatusMessage-D1GlfQdz.js +0 -79
- package/StatusMessage-D1GlfQdz.js.map +0 -1
- package/Step-Dq0N72YB.js +0 -49
- package/Step-Dq0N72YB.js.map +0 -1
- package/Step-a8U8O-91.cjs +0 -48
- package/Step-a8U8O-91.cjs.map +0 -1
- package/Switch-BIeobv6i.cjs.map +0 -1
- package/Switch-DQEOxM2R.js.map +0 -1
- package/Tab-Co31KY2k.cjs +0 -95
- package/Tab-Co31KY2k.cjs.map +0 -1
- package/Tab-DiK62gRz.js +0 -96
- package/Tab-DiK62gRz.js.map +0 -1
- package/components/AppBar/AppBarBrand.d.ts +0 -31
- package/components/AppBar/AppBarUserMenu.d.ts +0 -65
- package/components/Autocomplete/Autocomplete.types.d.ts +0 -1
- package/components/DatePicker/DatePicker.types.d.ts +0 -1
- package/components/DateRangePicker/DateRangePicker.cjs +0 -5
- package/components/DateRangePicker/DateRangePicker.cjs.map +0 -1
- package/components/DateRangePicker/DateRangePicker.d.ts +0 -15
- package/components/DateRangePicker/DateRangePicker.definitions.d.ts +0 -6
- package/components/DateRangePicker/DateRangePicker.js +0 -5
- package/components/DateRangePicker/DateRangePicker.js.map +0 -1
- package/components/DateRangePicker/index.d.ts +0 -1
- package/components/DateRangePicker.d.ts +0 -2
- package/components/DateTimePicker/DateTimePicker.types.d.ts +0 -1
- package/components/Input/Input.types.d.ts +0 -1
- package/components/PageLoader/PageLoader.cjs +0 -61
- package/components/PageLoader/PageLoader.cjs.map +0 -1
- package/components/PageLoader/PageLoader.d.ts +0 -38
- package/components/PageLoader/PageLoader.js +0 -61
- package/components/PageLoader/PageLoader.js.map +0 -1
- package/components/PageLoader/index.d.ts +0 -2
- package/components/PageLoader.d.ts +0 -6
- package/components/RadioGroup/RadioGroup.types.d.ts +0 -1
- package/components/ScrollTopButton/ScrollTopButton.cjs +0 -79
- package/components/ScrollTopButton/ScrollTopButton.cjs.map +0 -1
- package/components/ScrollTopButton/ScrollTopButton.d.ts +0 -48
- package/components/ScrollTopButton/ScrollTopButton.js +0 -79
- package/components/ScrollTopButton/ScrollTopButton.js.map +0 -1
- package/components/ScrollTopButton/index.d.ts +0 -4
- package/components/ScrollTopButton.d.ts +0 -6
- package/components/Select/Select.definitions.d.ts +0 -17
- package/components/Select/Select.types.d.ts +0 -1
- package/components/Select/_parts/SelectSearchHeader.d.ts +0 -15
- package/formField.sx-CQ1mbk9M.cjs.map +0 -1
- package/formField.sx-DfVbMe0V.js.map +0 -1
- package/hooks/Wizard/Wizard.cjs +0 -7
- package/hooks/Wizard/Wizard.cjs.map +0 -1
- package/hooks/Wizard/Wizard.js +0 -7
- package/hooks/Wizard/Wizard.js.map +0 -1
- package/hooks/Wizard/index.d.ts +0 -3
- package/hooks/Wizard/useWizard.d.ts +0 -9
- package/hooks/Wizard.d.ts +0 -2
- package/useWizard-CWdIxZzX.cjs +0 -94
- package/useWizard-CWdIxZzX.cjs.map +0 -1
- package/useWizard-CWq--C3o.js +0 -95
- package/useWizard-CWq--C3o.js.map +0 -1
- /package/{styles.css → index.css} +0 -0
|
@@ -47,6 +47,9 @@ const mergeSx = (base, extra) => {
|
|
|
47
47
|
};
|
|
48
48
|
const Avatar = ({
|
|
49
49
|
items,
|
|
50
|
+
src,
|
|
51
|
+
alt,
|
|
52
|
+
fallback,
|
|
50
53
|
type,
|
|
51
54
|
displayedAvatars = 4,
|
|
52
55
|
size = "sm",
|
|
@@ -58,20 +61,23 @@ const Avatar = ({
|
|
|
58
61
|
overlap
|
|
59
62
|
}) => {
|
|
60
63
|
var _a;
|
|
61
|
-
const [
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
+
const resolvedItems = items && items.length > 0 ? items : src || fallback ? [{ imageUrl: src, text: alt, content: fallback }] : [];
|
|
65
|
+
const showCaption = items && items.length > 0 ? showText : false;
|
|
66
|
+
const [failedUrls, setFailedUrls] = React.useState(/* @__PURE__ */ new Set());
|
|
67
|
+
const handleImageError = (url) => {
|
|
68
|
+
setFailedUrls((prev) => {
|
|
69
|
+
if (prev.has(url)) return prev;
|
|
64
70
|
const next = new Set(prev);
|
|
65
|
-
next.add(
|
|
71
|
+
next.add(url);
|
|
66
72
|
return next;
|
|
67
73
|
});
|
|
68
74
|
};
|
|
69
|
-
if (
|
|
75
|
+
if (resolvedItems.length === 0) {
|
|
70
76
|
return null;
|
|
71
77
|
}
|
|
72
78
|
const s = resolveSize(size);
|
|
73
79
|
const effectiveOverlap = overlap != null ? overlap : s.overlap;
|
|
74
|
-
const visibleItems =
|
|
80
|
+
const visibleItems = resolvedItems.slice(0, displayedAvatars);
|
|
75
81
|
const baseAvatarSx = {
|
|
76
82
|
width: s.px,
|
|
77
83
|
height: s.px,
|
|
@@ -81,12 +87,13 @@ const Avatar = ({
|
|
|
81
87
|
boxSizing: "content-box"
|
|
82
88
|
};
|
|
83
89
|
const renderSingleAvatar = (item, i) => {
|
|
84
|
-
var _a2, _b;
|
|
85
|
-
const hasImage = !!item.imageUrl && !
|
|
90
|
+
var _a2, _b, _c, _d, _e;
|
|
91
|
+
const hasImage = !!item.imageUrl && !failedUrls.has(item.imageUrl);
|
|
86
92
|
const showBadgeFallback = !!item.badge;
|
|
93
|
+
const itemKey = (_c = item.imageUrl) != null ? _c : `${(_a2 = item.text) != null ? _a2 : ""}-${(_b = item.badge) != null ? _b : ""}-${i}`;
|
|
87
94
|
const itemSx = __spreadProps(__spreadValues({
|
|
88
|
-
bgcolor: (
|
|
89
|
-
color: (
|
|
95
|
+
bgcolor: (_d = item.backgroundColor) != null ? _d : "action.selected",
|
|
96
|
+
color: (_e = item.color) != null ? _e : "text.secondary"
|
|
90
97
|
}, i > 0 && { marginLeft: `-${effectiveOverlap}px` }), {
|
|
91
98
|
zIndex: visibleItems.length - i
|
|
92
99
|
});
|
|
@@ -94,18 +101,17 @@ const Avatar = ({
|
|
|
94
101
|
const avatarEl = /* @__PURE__ */ jsxRuntime.jsx(
|
|
95
102
|
material.Avatar,
|
|
96
103
|
{
|
|
97
|
-
"data-testid": "avatar",
|
|
98
104
|
alt: item.text || "User avatar",
|
|
99
105
|
src: hasImage ? item.imageUrl : void 0,
|
|
100
106
|
imgProps: {
|
|
101
|
-
|
|
102
|
-
|
|
107
|
+
onError: () => {
|
|
108
|
+
if (item.imageUrl) handleImageError(item.imageUrl);
|
|
109
|
+
}
|
|
103
110
|
},
|
|
104
111
|
sx: finalSx,
|
|
105
|
-
children: !hasImage && showBadgeFallback ? /* @__PURE__ */ jsxRuntime.jsx("span", { "
|
|
112
|
+
children: !hasImage && item.content != null ? item.content : !hasImage && showBadgeFallback ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-label": item.text, children: item.badge }) : !hasImage ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
106
113
|
AccountCircleIcon,
|
|
107
114
|
{
|
|
108
|
-
"data-testid": "icon",
|
|
109
115
|
"aria-label": item.text,
|
|
110
116
|
sx: { width: "100%", height: "100%" }
|
|
111
117
|
}
|
|
@@ -113,14 +119,13 @@ const Avatar = ({
|
|
|
113
119
|
}
|
|
114
120
|
);
|
|
115
121
|
if (showTooltip && item.text) {
|
|
116
|
-
return /* @__PURE__ */ jsxRuntime.jsx(material.Tooltip, { title: item.text, children: avatarEl },
|
|
122
|
+
return /* @__PURE__ */ jsxRuntime.jsx(material.Tooltip, { title: item.text, children: avatarEl }, itemKey);
|
|
117
123
|
}
|
|
118
|
-
return /* @__PURE__ */ jsxRuntime.jsx(React.Fragment, { children: avatarEl },
|
|
124
|
+
return /* @__PURE__ */ jsxRuntime.jsx(React.Fragment, { children: avatarEl }, itemKey);
|
|
119
125
|
};
|
|
120
126
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
121
127
|
material.Box,
|
|
122
128
|
{
|
|
123
|
-
"data-testid": "avatar-container",
|
|
124
129
|
className,
|
|
125
130
|
sx: mergeSx(
|
|
126
131
|
{
|
|
@@ -133,10 +138,9 @@ const Avatar = ({
|
|
|
133
138
|
),
|
|
134
139
|
children: [
|
|
135
140
|
/* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { display: "flex", alignItems: "center" }, children: visibleItems.map((item, i) => renderSingleAvatar(item, i)) }),
|
|
136
|
-
|
|
141
|
+
showCaption && ((_a = resolvedItems[0]) == null ? void 0 : _a.text) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
137
142
|
material.Typography,
|
|
138
143
|
{
|
|
139
|
-
"data-testid": "text",
|
|
140
144
|
variant: "caption",
|
|
141
145
|
sx: {
|
|
142
146
|
ml: 1,
|
|
@@ -145,12 +149,12 @@ const Avatar = ({
|
|
|
145
149
|
color: "text.primary"
|
|
146
150
|
},
|
|
147
151
|
children: [
|
|
148
|
-
type &&
|
|
152
|
+
type && resolvedItems.length === 1 && /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { component: "span", sx: { mr: 0.5 }, children: [
|
|
149
153
|
type,
|
|
150
154
|
":"
|
|
151
155
|
] }),
|
|
152
|
-
|
|
153
|
-
|
|
156
|
+
resolvedItems[0].text,
|
|
157
|
+
resolvedItems.length > 1 && ` +${resolvedItems.length - 1}`
|
|
154
158
|
]
|
|
155
159
|
}
|
|
156
160
|
)
|
|
@@ -159,4 +163,4 @@ const Avatar = ({
|
|
|
159
163
|
);
|
|
160
164
|
};
|
|
161
165
|
exports.Avatar = Avatar;
|
|
162
|
-
//# sourceMappingURL=Avatar-
|
|
166
|
+
//# sourceMappingURL=Avatar-Dw5rzayR.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Avatar-Dw5rzayR.cjs","sources":["../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Avatar as MuiAvatar,\n Box,\n Tooltip,\n Typography,\n type SxProps,\n type Theme,\n} from '@mui/material';\nimport AccountCircleIcon from '@mui/icons-material/AccountCircle';\n\nexport interface AvatarItem {\n text?: string;\n imageUrl?: string;\n badge?: string;\n color?: string;\n backgroundColor?: string;\n /** Contenido a renderizar como fallback cuando no hay imagen (ej. iniciales). */\n content?: React.ReactNode;\n}\n\nexport type AvatarSize = 'sm' | 'md' | 'lg' | 'xl' | number;\n\nexport interface AvatarProps {\n type?: string;\n /**\n * Lista de avatares (grupo apilado). Para un solo avatar puedes usar\n * `src`/`alt` en su lugar.\n */\n items?: AvatarItem[];\n /**\n * Atajo para un único avatar por URL de imagen. Equivale a\n * `items={[{ imageUrl: src, text: alt }]}`. Ignorado si `items` tiene elementos.\n */\n src?: string;\n /** Texto alternativo de la imagen cuando se usa `src` (modo single). */\n alt?: string;\n /** Fallback (ej. iniciales) cuando no hay imagen, en modo single (`src`). */\n fallback?: React.ReactNode;\n displayedAvatars?: number;\n size?: AvatarSize;\n showText?: boolean;\n showTooltip?: boolean;\n /**\n * sx aplicado al contenedor raíz.\n */\n sx?: SxProps<Theme>;\n /**\n * sx aplicado a cada MuiAvatar individual (se mergea sobre los defaults).\n */\n avatarSx?: SxProps<Theme>;\n className?: string;\n /**\n * Overlap (px) entre avatares cuando hay varios. Default depende del tamaño.\n */\n overlap?: number;\n}\n\n// Escala alineada con la escala de MUI (sm=32, md=40, lg=56, xl=96) con borde\n// proporcional para el efecto stacked.\nconst sizeMap: Record<\n Exclude<AvatarSize, number>,\n { px: number; border: number; font: number; overlap: number }\n> = {\n sm: { px: 32, border: 2, font: 14, overlap: 8 },\n md: { px: 40, border: 2, font: 16, overlap: 10 },\n lg: { px: 56, border: 3, font: 22, overlap: 14 },\n xl: { px: 96, border: 4, font: 36, overlap: 20 },\n};\n\nconst resolveSize = (size: AvatarSize) => {\n if (typeof size === 'number') {\n return {\n px: size,\n border: Math.max(2, Math.round(size * 0.05)),\n font: Math.round(size * 0.4),\n overlap: Math.round(size * 0.25),\n };\n }\n return sizeMap[size];\n};\n\nconst mergeSx = (base: SxProps<Theme>, extra?: SxProps<Theme>): SxProps<Theme> => {\n if (!extra) return base;\n const baseArr = Array.isArray(base) ? base : [base];\n const extraArr = Array.isArray(extra) ? extra : [extra];\n return [...baseArr, ...extraArr] as SxProps<Theme>;\n};\n\nexport const Avatar: React.FC<AvatarProps> = ({\n items,\n src,\n alt,\n fallback,\n type,\n displayedAvatars = 4,\n size = 'sm',\n showText = true,\n showTooltip = false,\n sx,\n avatarSx,\n className,\n overlap,\n}) => {\n // Modo single (`src`) vs grupo (`items`). En single no mostramos caption.\n const resolvedItems: AvatarItem[] =\n items && items.length > 0\n ? items\n : src || fallback\n ? [{ imageUrl: src, text: alt, content: fallback }]\n : [];\n const showCaption = items && items.length > 0 ? showText : false;\n // Indexamos por URL (no por posición) para que cambios en `items` — reorder,\n // filtrado, paginación — no hagan que un avatar válido \"herede\" el estado de\n // imagen rota de un item anterior que estaba en la misma posición.\n const [failedUrls, setFailedUrls] = useState<Set<string>>(new Set());\n\n const handleImageError = (url: string) => {\n setFailedUrls((prev) => {\n if (prev.has(url)) return prev;\n const next = new Set(prev);\n next.add(url);\n return next;\n });\n };\n\n if (resolvedItems.length === 0) {\n return null;\n }\n\n const s = resolveSize(size);\n const effectiveOverlap = overlap ?? s.overlap;\n const visibleItems = resolvedItems.slice(0, displayedAvatars);\n\n const baseAvatarSx: SxProps<Theme> = {\n width: s.px,\n height: s.px,\n fontSize: s.font,\n fontWeight: 700,\n border: (theme) => `${s.border}px solid ${theme.palette.background.paper}`,\n boxSizing: 'content-box',\n };\n\n const renderSingleAvatar = (item: AvatarItem, i: number) => {\n const hasImage = !!item.imageUrl && !failedUrls.has(item.imageUrl);\n const showBadgeFallback = !!item.badge;\n const itemKey = item.imageUrl ?? `${item.text ?? ''}-${item.badge ?? ''}-${i}`;\n\n // Defaults tirando al theme; item.color / item.backgroundColor tienen prioridad.\n const itemSx: SxProps<Theme> = {\n bgcolor: item.backgroundColor ?? 'action.selected',\n color: item.color ?? 'text.secondary',\n // Stacking manual: margen negativo al segundo avatar en adelante.\n ...(i > 0 && { marginLeft: `-${effectiveOverlap}px` }),\n zIndex: visibleItems.length - i,\n };\n\n const finalSx = mergeSx(mergeSx(baseAvatarSx, itemSx), avatarSx);\n\n const avatarEl = (\n <MuiAvatar\n alt={item.text || 'User avatar'}\n src={hasImage ? item.imageUrl : undefined}\n imgProps={{\n onError: () => {\n if (item.imageUrl) handleImageError(item.imageUrl);\n },\n }}\n sx={finalSx}\n >\n {!hasImage && item.content != null ? (\n item.content\n ) : !hasImage && showBadgeFallback ? (\n <span aria-label={item.text}>{item.badge}</span>\n ) : !hasImage ? (\n <AccountCircleIcon\n aria-label={item.text}\n sx={{ width: '100%', height: '100%' }}\n />\n ) : null}\n </MuiAvatar>\n );\n\n if (showTooltip && item.text) {\n return (\n <Tooltip key={itemKey} title={item.text}>\n {avatarEl}\n </Tooltip>\n );\n }\n return <React.Fragment key={itemKey}>{avatarEl}</React.Fragment>;\n };\n\n return (\n <Box\n className={className}\n sx={mergeSx(\n {\n display: 'flex',\n alignItems: 'center',\n lineHeight: 1,\n width: 'fit-content',\n },\n sx,\n )}\n >\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n {visibleItems.map((item, i) => renderSingleAvatar(item, i))}\n </Box>\n\n {showCaption && resolvedItems[0]?.text && (\n <Typography\n variant=\"caption\"\n sx={{\n ml: 1,\n fontSize: '0.75rem',\n fontWeight: 400,\n color: 'text.primary',\n }}\n >\n {type && resolvedItems.length === 1 && (\n <Box component=\"span\" sx={{ mr: 0.5 }}>\n {type}:\n </Box>\n )}\n {resolvedItems[0].text}\n {resolvedItems.length > 1 && ` +${resolvedItems.length - 1}`}\n </Typography>\n )}\n </Box>\n );\n};\n\nexport default Avatar;\n"],"names":["useState","_a","jsx","MuiAvatar","Tooltip","jsxs","Box","Typography"],"mappings":"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"}
|
|
@@ -46,6 +46,9 @@ const mergeSx = (base, extra) => {
|
|
|
46
46
|
};
|
|
47
47
|
const Avatar = ({
|
|
48
48
|
items,
|
|
49
|
+
src,
|
|
50
|
+
alt,
|
|
51
|
+
fallback,
|
|
49
52
|
type,
|
|
50
53
|
displayedAvatars = 4,
|
|
51
54
|
size = "sm",
|
|
@@ -57,20 +60,23 @@ const Avatar = ({
|
|
|
57
60
|
overlap
|
|
58
61
|
}) => {
|
|
59
62
|
var _a;
|
|
60
|
-
const [
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
+
const resolvedItems = items && items.length > 0 ? items : src || fallback ? [{ imageUrl: src, text: alt, content: fallback }] : [];
|
|
64
|
+
const showCaption = items && items.length > 0 ? showText : false;
|
|
65
|
+
const [failedUrls, setFailedUrls] = useState(/* @__PURE__ */ new Set());
|
|
66
|
+
const handleImageError = (url) => {
|
|
67
|
+
setFailedUrls((prev) => {
|
|
68
|
+
if (prev.has(url)) return prev;
|
|
63
69
|
const next = new Set(prev);
|
|
64
|
-
next.add(
|
|
70
|
+
next.add(url);
|
|
65
71
|
return next;
|
|
66
72
|
});
|
|
67
73
|
};
|
|
68
|
-
if (
|
|
74
|
+
if (resolvedItems.length === 0) {
|
|
69
75
|
return null;
|
|
70
76
|
}
|
|
71
77
|
const s = resolveSize(size);
|
|
72
78
|
const effectiveOverlap = overlap != null ? overlap : s.overlap;
|
|
73
|
-
const visibleItems =
|
|
79
|
+
const visibleItems = resolvedItems.slice(0, displayedAvatars);
|
|
74
80
|
const baseAvatarSx = {
|
|
75
81
|
width: s.px,
|
|
76
82
|
height: s.px,
|
|
@@ -80,12 +86,13 @@ const Avatar = ({
|
|
|
80
86
|
boxSizing: "content-box"
|
|
81
87
|
};
|
|
82
88
|
const renderSingleAvatar = (item, i) => {
|
|
83
|
-
var _a2, _b;
|
|
84
|
-
const hasImage = !!item.imageUrl && !
|
|
89
|
+
var _a2, _b, _c, _d, _e;
|
|
90
|
+
const hasImage = !!item.imageUrl && !failedUrls.has(item.imageUrl);
|
|
85
91
|
const showBadgeFallback = !!item.badge;
|
|
92
|
+
const itemKey = (_c = item.imageUrl) != null ? _c : `${(_a2 = item.text) != null ? _a2 : ""}-${(_b = item.badge) != null ? _b : ""}-${i}`;
|
|
86
93
|
const itemSx = __spreadProps(__spreadValues({
|
|
87
|
-
bgcolor: (
|
|
88
|
-
color: (
|
|
94
|
+
bgcolor: (_d = item.backgroundColor) != null ? _d : "action.selected",
|
|
95
|
+
color: (_e = item.color) != null ? _e : "text.secondary"
|
|
89
96
|
}, i > 0 && { marginLeft: `-${effectiveOverlap}px` }), {
|
|
90
97
|
zIndex: visibleItems.length - i
|
|
91
98
|
});
|
|
@@ -93,18 +100,17 @@ const Avatar = ({
|
|
|
93
100
|
const avatarEl = /* @__PURE__ */ jsx(
|
|
94
101
|
Avatar$1,
|
|
95
102
|
{
|
|
96
|
-
"data-testid": "avatar",
|
|
97
103
|
alt: item.text || "User avatar",
|
|
98
104
|
src: hasImage ? item.imageUrl : void 0,
|
|
99
105
|
imgProps: {
|
|
100
|
-
|
|
101
|
-
|
|
106
|
+
onError: () => {
|
|
107
|
+
if (item.imageUrl) handleImageError(item.imageUrl);
|
|
108
|
+
}
|
|
102
109
|
},
|
|
103
110
|
sx: finalSx,
|
|
104
|
-
children: !hasImage && showBadgeFallback ? /* @__PURE__ */ jsx("span", { "
|
|
111
|
+
children: !hasImage && item.content != null ? item.content : !hasImage && showBadgeFallback ? /* @__PURE__ */ jsx("span", { "aria-label": item.text, children: item.badge }) : !hasImage ? /* @__PURE__ */ jsx(
|
|
105
112
|
AccountCircleIcon,
|
|
106
113
|
{
|
|
107
|
-
"data-testid": "icon",
|
|
108
114
|
"aria-label": item.text,
|
|
109
115
|
sx: { width: "100%", height: "100%" }
|
|
110
116
|
}
|
|
@@ -112,14 +118,13 @@ const Avatar = ({
|
|
|
112
118
|
}
|
|
113
119
|
);
|
|
114
120
|
if (showTooltip && item.text) {
|
|
115
|
-
return /* @__PURE__ */ jsx(Tooltip, { title: item.text, children: avatarEl },
|
|
121
|
+
return /* @__PURE__ */ jsx(Tooltip, { title: item.text, children: avatarEl }, itemKey);
|
|
116
122
|
}
|
|
117
|
-
return /* @__PURE__ */ jsx(React__default.Fragment, { children: avatarEl },
|
|
123
|
+
return /* @__PURE__ */ jsx(React__default.Fragment, { children: avatarEl }, itemKey);
|
|
118
124
|
};
|
|
119
125
|
return /* @__PURE__ */ jsxs(
|
|
120
126
|
Box,
|
|
121
127
|
{
|
|
122
|
-
"data-testid": "avatar-container",
|
|
123
128
|
className,
|
|
124
129
|
sx: mergeSx(
|
|
125
130
|
{
|
|
@@ -132,10 +137,9 @@ const Avatar = ({
|
|
|
132
137
|
),
|
|
133
138
|
children: [
|
|
134
139
|
/* @__PURE__ */ jsx(Box, { sx: { display: "flex", alignItems: "center" }, children: visibleItems.map((item, i) => renderSingleAvatar(item, i)) }),
|
|
135
|
-
|
|
140
|
+
showCaption && ((_a = resolvedItems[0]) == null ? void 0 : _a.text) && /* @__PURE__ */ jsxs(
|
|
136
141
|
Typography,
|
|
137
142
|
{
|
|
138
|
-
"data-testid": "text",
|
|
139
143
|
variant: "caption",
|
|
140
144
|
sx: {
|
|
141
145
|
ml: 1,
|
|
@@ -144,12 +148,12 @@ const Avatar = ({
|
|
|
144
148
|
color: "text.primary"
|
|
145
149
|
},
|
|
146
150
|
children: [
|
|
147
|
-
type &&
|
|
151
|
+
type && resolvedItems.length === 1 && /* @__PURE__ */ jsxs(Box, { component: "span", sx: { mr: 0.5 }, children: [
|
|
148
152
|
type,
|
|
149
153
|
":"
|
|
150
154
|
] }),
|
|
151
|
-
|
|
152
|
-
|
|
155
|
+
resolvedItems[0].text,
|
|
156
|
+
resolvedItems.length > 1 && ` +${resolvedItems.length - 1}`
|
|
153
157
|
]
|
|
154
158
|
}
|
|
155
159
|
)
|
|
@@ -160,4 +164,4 @@ const Avatar = ({
|
|
|
160
164
|
export {
|
|
161
165
|
Avatar as A
|
|
162
166
|
};
|
|
163
|
-
//# sourceMappingURL=Avatar-
|
|
167
|
+
//# sourceMappingURL=Avatar-H8akSege.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Avatar-H8akSege.js","sources":["../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Avatar as MuiAvatar,\n Box,\n Tooltip,\n Typography,\n type SxProps,\n type Theme,\n} from '@mui/material';\nimport AccountCircleIcon from '@mui/icons-material/AccountCircle';\n\nexport interface AvatarItem {\n text?: string;\n imageUrl?: string;\n badge?: string;\n color?: string;\n backgroundColor?: string;\n /** Contenido a renderizar como fallback cuando no hay imagen (ej. iniciales). */\n content?: React.ReactNode;\n}\n\nexport type AvatarSize = 'sm' | 'md' | 'lg' | 'xl' | number;\n\nexport interface AvatarProps {\n type?: string;\n /**\n * Lista de avatares (grupo apilado). Para un solo avatar puedes usar\n * `src`/`alt` en su lugar.\n */\n items?: AvatarItem[];\n /**\n * Atajo para un único avatar por URL de imagen. Equivale a\n * `items={[{ imageUrl: src, text: alt }]}`. Ignorado si `items` tiene elementos.\n */\n src?: string;\n /** Texto alternativo de la imagen cuando se usa `src` (modo single). */\n alt?: string;\n /** Fallback (ej. iniciales) cuando no hay imagen, en modo single (`src`). */\n fallback?: React.ReactNode;\n displayedAvatars?: number;\n size?: AvatarSize;\n showText?: boolean;\n showTooltip?: boolean;\n /**\n * sx aplicado al contenedor raíz.\n */\n sx?: SxProps<Theme>;\n /**\n * sx aplicado a cada MuiAvatar individual (se mergea sobre los defaults).\n */\n avatarSx?: SxProps<Theme>;\n className?: string;\n /**\n * Overlap (px) entre avatares cuando hay varios. Default depende del tamaño.\n */\n overlap?: number;\n}\n\n// Escala alineada con la escala de MUI (sm=32, md=40, lg=56, xl=96) con borde\n// proporcional para el efecto stacked.\nconst sizeMap: Record<\n Exclude<AvatarSize, number>,\n { px: number; border: number; font: number; overlap: number }\n> = {\n sm: { px: 32, border: 2, font: 14, overlap: 8 },\n md: { px: 40, border: 2, font: 16, overlap: 10 },\n lg: { px: 56, border: 3, font: 22, overlap: 14 },\n xl: { px: 96, border: 4, font: 36, overlap: 20 },\n};\n\nconst resolveSize = (size: AvatarSize) => {\n if (typeof size === 'number') {\n return {\n px: size,\n border: Math.max(2, Math.round(size * 0.05)),\n font: Math.round(size * 0.4),\n overlap: Math.round(size * 0.25),\n };\n }\n return sizeMap[size];\n};\n\nconst mergeSx = (base: SxProps<Theme>, extra?: SxProps<Theme>): SxProps<Theme> => {\n if (!extra) return base;\n const baseArr = Array.isArray(base) ? base : [base];\n const extraArr = Array.isArray(extra) ? extra : [extra];\n return [...baseArr, ...extraArr] as SxProps<Theme>;\n};\n\nexport const Avatar: React.FC<AvatarProps> = ({\n items,\n src,\n alt,\n fallback,\n type,\n displayedAvatars = 4,\n size = 'sm',\n showText = true,\n showTooltip = false,\n sx,\n avatarSx,\n className,\n overlap,\n}) => {\n // Modo single (`src`) vs grupo (`items`). En single no mostramos caption.\n const resolvedItems: AvatarItem[] =\n items && items.length > 0\n ? items\n : src || fallback\n ? [{ imageUrl: src, text: alt, content: fallback }]\n : [];\n const showCaption = items && items.length > 0 ? showText : false;\n // Indexamos por URL (no por posición) para que cambios en `items` — reorder,\n // filtrado, paginación — no hagan que un avatar válido \"herede\" el estado de\n // imagen rota de un item anterior que estaba en la misma posición.\n const [failedUrls, setFailedUrls] = useState<Set<string>>(new Set());\n\n const handleImageError = (url: string) => {\n setFailedUrls((prev) => {\n if (prev.has(url)) return prev;\n const next = new Set(prev);\n next.add(url);\n return next;\n });\n };\n\n if (resolvedItems.length === 0) {\n return null;\n }\n\n const s = resolveSize(size);\n const effectiveOverlap = overlap ?? s.overlap;\n const visibleItems = resolvedItems.slice(0, displayedAvatars);\n\n const baseAvatarSx: SxProps<Theme> = {\n width: s.px,\n height: s.px,\n fontSize: s.font,\n fontWeight: 700,\n border: (theme) => `${s.border}px solid ${theme.palette.background.paper}`,\n boxSizing: 'content-box',\n };\n\n const renderSingleAvatar = (item: AvatarItem, i: number) => {\n const hasImage = !!item.imageUrl && !failedUrls.has(item.imageUrl);\n const showBadgeFallback = !!item.badge;\n const itemKey = item.imageUrl ?? `${item.text ?? ''}-${item.badge ?? ''}-${i}`;\n\n // Defaults tirando al theme; item.color / item.backgroundColor tienen prioridad.\n const itemSx: SxProps<Theme> = {\n bgcolor: item.backgroundColor ?? 'action.selected',\n color: item.color ?? 'text.secondary',\n // Stacking manual: margen negativo al segundo avatar en adelante.\n ...(i > 0 && { marginLeft: `-${effectiveOverlap}px` }),\n zIndex: visibleItems.length - i,\n };\n\n const finalSx = mergeSx(mergeSx(baseAvatarSx, itemSx), avatarSx);\n\n const avatarEl = (\n <MuiAvatar\n alt={item.text || 'User avatar'}\n src={hasImage ? item.imageUrl : undefined}\n imgProps={{\n onError: () => {\n if (item.imageUrl) handleImageError(item.imageUrl);\n },\n }}\n sx={finalSx}\n >\n {!hasImage && item.content != null ? (\n item.content\n ) : !hasImage && showBadgeFallback ? (\n <span aria-label={item.text}>{item.badge}</span>\n ) : !hasImage ? (\n <AccountCircleIcon\n aria-label={item.text}\n sx={{ width: '100%', height: '100%' }}\n />\n ) : null}\n </MuiAvatar>\n );\n\n if (showTooltip && item.text) {\n return (\n <Tooltip key={itemKey} title={item.text}>\n {avatarEl}\n </Tooltip>\n );\n }\n return <React.Fragment key={itemKey}>{avatarEl}</React.Fragment>;\n };\n\n return (\n <Box\n className={className}\n sx={mergeSx(\n {\n display: 'flex',\n alignItems: 'center',\n lineHeight: 1,\n width: 'fit-content',\n },\n sx,\n )}\n >\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n {visibleItems.map((item, i) => renderSingleAvatar(item, i))}\n </Box>\n\n {showCaption && resolvedItems[0]?.text && (\n <Typography\n variant=\"caption\"\n sx={{\n ml: 1,\n fontSize: '0.75rem',\n fontWeight: 400,\n color: 'text.primary',\n }}\n >\n {type && resolvedItems.length === 1 && (\n <Box component=\"span\" sx={{ mr: 0.5 }}>\n {type}:\n </Box>\n )}\n {resolvedItems[0].text}\n {resolvedItems.length > 1 && ` +${resolvedItems.length - 1}`}\n </Typography>\n )}\n </Box>\n );\n};\n\nexport default Avatar;\n"],"names":["_a","MuiAvatar","React"],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
3
|
+
const material = require("@mui/material");
|
|
4
|
+
function Breadcrumbs({
|
|
5
|
+
children,
|
|
6
|
+
separator,
|
|
7
|
+
maxItems,
|
|
8
|
+
sx,
|
|
9
|
+
className,
|
|
10
|
+
"aria-label": ariaLabel = "breadcrumb"
|
|
11
|
+
}) {
|
|
12
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
13
|
+
material.Breadcrumbs,
|
|
14
|
+
{
|
|
15
|
+
separator,
|
|
16
|
+
maxItems,
|
|
17
|
+
sx,
|
|
18
|
+
className,
|
|
19
|
+
"aria-label": ariaLabel,
|
|
20
|
+
children
|
|
21
|
+
}
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
exports.Breadcrumbs = Breadcrumbs;
|
|
25
|
+
//# sourceMappingURL=Breadcrumbs-B9I3vxPb.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumbs-B9I3vxPb.cjs","sources":["../src/components/Breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { Breadcrumbs as MuiBreadcrumbs } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface BreadcrumbsProps {\n /** Items (Links / Typography). */\n children?: ReactNode;\n /** Separador entre items. Default: `/`. */\n separator?: ReactNode;\n /** Colapsa si hay más de N items. */\n maxItems?: number;\n sx?: SxProps<Theme>;\n className?: string;\n 'aria-label'?: string;\n}\n\n/** Migas de pan. Wrapper fino sobre MUI `Breadcrumbs`. */\nexport function Breadcrumbs({\n children,\n separator,\n maxItems,\n sx,\n className,\n 'aria-label': ariaLabel = 'breadcrumb',\n}: BreadcrumbsProps) {\n return (\n <MuiBreadcrumbs\n separator={separator}\n maxItems={maxItems}\n sx={sx}\n className={className}\n aria-label={ariaLabel}\n >\n {children}\n </MuiBreadcrumbs>\n );\n}\n\nexport default Breadcrumbs;\n"],"names":["jsx","MuiBreadcrumbs"],"mappings":";;;AAiBO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc,YAAY;AAC5B,GAAqB;AACnB,SACEA,2BAAAA;AAAAA,IAACC,SAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAY;AAAA,MAEX;AAAA,IAAA;AAAA,EAAA;AAGP;;"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Breadcrumbs as Breadcrumbs$1 } from "@mui/material";
|
|
3
|
+
function Breadcrumbs({
|
|
4
|
+
children,
|
|
5
|
+
separator,
|
|
6
|
+
maxItems,
|
|
7
|
+
sx,
|
|
8
|
+
className,
|
|
9
|
+
"aria-label": ariaLabel = "breadcrumb"
|
|
10
|
+
}) {
|
|
11
|
+
return /* @__PURE__ */ jsx(
|
|
12
|
+
Breadcrumbs$1,
|
|
13
|
+
{
|
|
14
|
+
separator,
|
|
15
|
+
maxItems,
|
|
16
|
+
sx,
|
|
17
|
+
className,
|
|
18
|
+
"aria-label": ariaLabel,
|
|
19
|
+
children
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
Breadcrumbs as B
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=Breadcrumbs-C41SPbtX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumbs-C41SPbtX.js","sources":["../src/components/Breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { Breadcrumbs as MuiBreadcrumbs } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface BreadcrumbsProps {\n /** Items (Links / Typography). */\n children?: ReactNode;\n /** Separador entre items. Default: `/`. */\n separator?: ReactNode;\n /** Colapsa si hay más de N items. */\n maxItems?: number;\n sx?: SxProps<Theme>;\n className?: string;\n 'aria-label'?: string;\n}\n\n/** Migas de pan. Wrapper fino sobre MUI `Breadcrumbs`. */\nexport function Breadcrumbs({\n children,\n separator,\n maxItems,\n sx,\n className,\n 'aria-label': ariaLabel = 'breadcrumb',\n}: BreadcrumbsProps) {\n return (\n <MuiBreadcrumbs\n separator={separator}\n maxItems={maxItems}\n sx={sx}\n className={className}\n aria-label={ariaLabel}\n >\n {children}\n </MuiBreadcrumbs>\n );\n}\n\nexport default Breadcrumbs;\n"],"names":["MuiBreadcrumbs"],"mappings":";;AAiBO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc,YAAY;AAC5B,GAAqB;AACnB,SACE;AAAA,IAACA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAY;AAAA,MAEX;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
package/Button-C17mExpd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button-C17mExpd.cjs","sources":["../src/components/Button/Button.tsx"],"sourcesContent":["import { Button as MuiButton } from \"@mui/material\";\nimport type {
|
|
1
|
+
{"version":3,"file":"Button-C17mExpd.cjs","sources":["../src/components/Button/Button.tsx"],"sourcesContent":["import { Button as MuiButton } from \"@mui/material\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport React from \"react\";\n\nexport interface ButtonProps {\n children?: React.ReactNode;\n variant?: \"text\" | \"outlined\" | \"contained\";\n disabled?: boolean;\n endIcon?: React.ReactNode;\n startIcon?: React.ReactNode;\n size?: \"small\" | \"medium\" | \"large\";\n className?: string;\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n loading?: boolean;\n loadingIndicator?: React.ReactNode;\n loadingPosition?: \"start\" | \"end\" | \"center\";\n color?: \"inherit\" | \"primary\" | \"secondary\" | \"success\" | \"error\" | \"info\" | \"warning\";\n href?: string;\n \"data-testid\"?: string;\n type?: \"button\" | \"submit\";\n sx?: SxProps<Theme>;\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n children,\n variant,\n disabled,\n startIcon,\n endIcon,\n size,\n className,\n onClick,\n loading,\n loadingPosition,\n loadingIndicator,\n color,\n href,\n \"data-testid\": dataTestId,\n type,\n sx\n}) => {\n return (\n <MuiButton\n disabled={disabled}\n variant={variant}\n startIcon={startIcon}\n endIcon={endIcon}\n size={size}\n className={className}\n onClick={onClick}\n loading={loading}\n loadingPosition={loadingPosition}\n loadingIndicator={loadingIndicator}\n sx={{ textTransform: \"none\", ...sx }}\n disableRipple={true}\n disableElevation={true}\n color={color}\n data-testid={dataTestId}\n href={href}\n type={type}\n >\n {children}\n </MuiButton>);\n};\n\nexport default Button;"],"names":["jsx","MuiButton"],"mappings":";;;;;;;;;;;;;;;;;;;AAuBO,MAAM,SAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AACF,MAAM;AACJ,SACEA,2BAAAA;AAAAA,IAACC,SAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,iBAAE,eAAe,UAAW;AAAA,MAChC,eAAe;AAAA,MACf,kBAAkB;AAAA,MAClB;AAAA,MACA,eAAa;AAAA,MACb;AAAA,MACA;AAAA,MAEC;AAAA,IAAA;AAAA,EAAA;AAEP;;"}
|
package/Button-UkkP-bNw.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button-UkkP-bNw.js","sources":["../src/components/Button/Button.tsx"],"sourcesContent":["import { Button as MuiButton } from \"@mui/material\";\nimport type {
|
|
1
|
+
{"version":3,"file":"Button-UkkP-bNw.js","sources":["../src/components/Button/Button.tsx"],"sourcesContent":["import { Button as MuiButton } from \"@mui/material\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport React from \"react\";\n\nexport interface ButtonProps {\n children?: React.ReactNode;\n variant?: \"text\" | \"outlined\" | \"contained\";\n disabled?: boolean;\n endIcon?: React.ReactNode;\n startIcon?: React.ReactNode;\n size?: \"small\" | \"medium\" | \"large\";\n className?: string;\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n loading?: boolean;\n loadingIndicator?: React.ReactNode;\n loadingPosition?: \"start\" | \"end\" | \"center\";\n color?: \"inherit\" | \"primary\" | \"secondary\" | \"success\" | \"error\" | \"info\" | \"warning\";\n href?: string;\n \"data-testid\"?: string;\n type?: \"button\" | \"submit\";\n sx?: SxProps<Theme>;\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n children,\n variant,\n disabled,\n startIcon,\n endIcon,\n size,\n className,\n onClick,\n loading,\n loadingPosition,\n loadingIndicator,\n color,\n href,\n \"data-testid\": dataTestId,\n type,\n sx\n}) => {\n return (\n <MuiButton\n disabled={disabled}\n variant={variant}\n startIcon={startIcon}\n endIcon={endIcon}\n size={size}\n className={className}\n onClick={onClick}\n loading={loading}\n loadingPosition={loadingPosition}\n loadingIndicator={loadingIndicator}\n sx={{ textTransform: \"none\", ...sx }}\n disableRipple={true}\n disableElevation={true}\n color={color}\n data-testid={dataTestId}\n href={href}\n type={type}\n >\n {children}\n </MuiButton>);\n};\n\nexport default Button;"],"names":["MuiButton"],"mappings":";;;;;;;;;;;;;;;;;;AAuBO,MAAM,SAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AACF,MAAM;AACJ,SACE;AAAA,IAACA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,iBAAE,eAAe,UAAW;AAAA,MAChC,eAAe;AAAA,MACf,kBAAkB;AAAA,MAClB;AAAA,MACA,eAAa;AAAA,MACb;AAAA,MACA;AAAA,MAEC;AAAA,IAAA;AAAA,EAAA;AAEP;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
3
|
+
const material = require("@mui/material");
|
|
4
|
+
function ButtonGroup({
|
|
5
|
+
children,
|
|
6
|
+
size = "medium",
|
|
7
|
+
variant = "outlined",
|
|
8
|
+
orientation = "horizontal",
|
|
9
|
+
color = "primary",
|
|
10
|
+
disabled,
|
|
11
|
+
fullWidth,
|
|
12
|
+
sx,
|
|
13
|
+
className,
|
|
14
|
+
"aria-label": ariaLabel
|
|
15
|
+
}) {
|
|
16
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
17
|
+
material.ButtonGroup,
|
|
18
|
+
{
|
|
19
|
+
size,
|
|
20
|
+
variant,
|
|
21
|
+
orientation,
|
|
22
|
+
color,
|
|
23
|
+
disabled,
|
|
24
|
+
fullWidth,
|
|
25
|
+
sx,
|
|
26
|
+
className,
|
|
27
|
+
"aria-label": ariaLabel,
|
|
28
|
+
children
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
exports.ButtonGroup = ButtonGroup;
|
|
33
|
+
//# sourceMappingURL=ButtonGroup-CNunDofQ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ButtonGroup-CNunDofQ.cjs","sources":["../src/components/ButtonGroup/ButtonGroup.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { ButtonGroup as MuiButtonGroup } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface ButtonGroupProps {\n /** Botones agrupados. */\n children?: ReactNode;\n size?: 'small' | 'medium' | 'large';\n variant?: 'text' | 'outlined' | 'contained';\n orientation?: 'horizontal' | 'vertical';\n color?: 'inherit' | 'primary' | 'secondary' | 'error' | 'info' | 'success' | 'warning';\n disabled?: boolean;\n fullWidth?: boolean;\n sx?: SxProps<Theme>;\n className?: string;\n 'aria-label'?: string;\n}\n\n/** Grupo de botones segmentado. Wrapper fino sobre MUI `ButtonGroup`. */\nexport function ButtonGroup({\n children,\n size = 'medium',\n variant = 'outlined',\n orientation = 'horizontal',\n color = 'primary',\n disabled,\n fullWidth,\n sx,\n className,\n 'aria-label': ariaLabel,\n}: ButtonGroupProps) {\n return (\n <MuiButtonGroup\n size={size}\n variant={variant}\n orientation={orientation}\n color={color}\n disabled={disabled}\n fullWidth={fullWidth}\n sx={sx}\n className={className}\n aria-label={ariaLabel}\n >\n {children}\n </MuiButtonGroup>\n );\n}\n\nexport default ButtonGroup;\n"],"names":["jsx","MuiButtonGroup"],"mappings":";;;AAmBO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,cAAc;AAAA,EACd,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAqB;AACnB,SACEA,2BAAAA;AAAAA,IAACC,SAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAY;AAAA,MAEX;AAAA,IAAA;AAAA,EAAA;AAGP;;"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { ButtonGroup as ButtonGroup$1 } from "@mui/material";
|
|
3
|
+
function ButtonGroup({
|
|
4
|
+
children,
|
|
5
|
+
size = "medium",
|
|
6
|
+
variant = "outlined",
|
|
7
|
+
orientation = "horizontal",
|
|
8
|
+
color = "primary",
|
|
9
|
+
disabled,
|
|
10
|
+
fullWidth,
|
|
11
|
+
sx,
|
|
12
|
+
className,
|
|
13
|
+
"aria-label": ariaLabel
|
|
14
|
+
}) {
|
|
15
|
+
return /* @__PURE__ */ jsx(
|
|
16
|
+
ButtonGroup$1,
|
|
17
|
+
{
|
|
18
|
+
size,
|
|
19
|
+
variant,
|
|
20
|
+
orientation,
|
|
21
|
+
color,
|
|
22
|
+
disabled,
|
|
23
|
+
fullWidth,
|
|
24
|
+
sx,
|
|
25
|
+
className,
|
|
26
|
+
"aria-label": ariaLabel,
|
|
27
|
+
children
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
ButtonGroup as B
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=ButtonGroup-CcKUZ-lT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ButtonGroup-CcKUZ-lT.js","sources":["../src/components/ButtonGroup/ButtonGroup.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { ButtonGroup as MuiButtonGroup } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface ButtonGroupProps {\n /** Botones agrupados. */\n children?: ReactNode;\n size?: 'small' | 'medium' | 'large';\n variant?: 'text' | 'outlined' | 'contained';\n orientation?: 'horizontal' | 'vertical';\n color?: 'inherit' | 'primary' | 'secondary' | 'error' | 'info' | 'success' | 'warning';\n disabled?: boolean;\n fullWidth?: boolean;\n sx?: SxProps<Theme>;\n className?: string;\n 'aria-label'?: string;\n}\n\n/** Grupo de botones segmentado. Wrapper fino sobre MUI `ButtonGroup`. */\nexport function ButtonGroup({\n children,\n size = 'medium',\n variant = 'outlined',\n orientation = 'horizontal',\n color = 'primary',\n disabled,\n fullWidth,\n sx,\n className,\n 'aria-label': ariaLabel,\n}: ButtonGroupProps) {\n return (\n <MuiButtonGroup\n size={size}\n variant={variant}\n orientation={orientation}\n color={color}\n disabled={disabled}\n fullWidth={fullWidth}\n sx={sx}\n className={className}\n aria-label={ariaLabel}\n >\n {children}\n </MuiButtonGroup>\n );\n}\n\nexport default ButtonGroup;\n"],"names":["MuiButtonGroup"],"mappings":";;AAmBO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,cAAc;AAAA,EACd,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAqB;AACnB,SACE;AAAA,IAACA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAY;AAAA,MAEX;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
package/Card-DYKGY-NG.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
21
|
+
import { useTheme, Card as Card$1, CardHeader, CardContent } from "@mui/material";
|
|
22
|
+
import { r as resolvePreset } from "./resolvePreset-K6_BfWHD.js";
|
|
23
|
+
const paddingMap = {
|
|
24
|
+
none: 0,
|
|
25
|
+
dense: 1.5,
|
|
26
|
+
normal: 2.5,
|
|
27
|
+
loose: 4
|
|
28
|
+
};
|
|
29
|
+
function buildCardSx({
|
|
30
|
+
variant,
|
|
31
|
+
padding,
|
|
32
|
+
clickable
|
|
33
|
+
}) {
|
|
34
|
+
return (theme) => __spreadProps(__spreadValues({
|
|
35
|
+
borderRadius: 2,
|
|
36
|
+
backgroundColor: "background.paper",
|
|
37
|
+
boxShadow: variant === "elevated" ? theme.shadows[1] : "none",
|
|
38
|
+
border: variant === "outlined" ? `1px solid ${theme.palette.divider}` : "none",
|
|
39
|
+
transition: theme.transitions.create(
|
|
40
|
+
["box-shadow", "transform", "border-color"],
|
|
41
|
+
{ duration: theme.transitions.duration.shorter }
|
|
42
|
+
),
|
|
43
|
+
cursor: clickable ? "pointer" : "default"
|
|
44
|
+
}, clickable && {
|
|
45
|
+
"&:hover": {
|
|
46
|
+
boxShadow: variant === "elevated" ? theme.shadows[3] : variant === "outlined" ? theme.shadows[1] : "none",
|
|
47
|
+
transform: variant !== "plain" ? "translateY(-1px)" : "none"
|
|
48
|
+
},
|
|
49
|
+
"&:active": {
|
|
50
|
+
transform: "translateY(0)"
|
|
51
|
+
}
|
|
52
|
+
}), {
|
|
53
|
+
p: paddingMap[padding]
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function Card({
|
|
57
|
+
children,
|
|
58
|
+
variant,
|
|
59
|
+
padding = "normal",
|
|
60
|
+
clickable = false,
|
|
61
|
+
preset,
|
|
62
|
+
raised,
|
|
63
|
+
title,
|
|
64
|
+
subheader,
|
|
65
|
+
action,
|
|
66
|
+
headerSx,
|
|
67
|
+
contentSx,
|
|
68
|
+
sx,
|
|
69
|
+
onClick,
|
|
70
|
+
onBlur,
|
|
71
|
+
className,
|
|
72
|
+
"data-testid": dataTestId
|
|
73
|
+
}) {
|
|
74
|
+
const theme = useTheme();
|
|
75
|
+
const resolvedVariant = raised ? "elevated" : variant != null ? variant : "elevated";
|
|
76
|
+
const presetSx = resolvePreset("Card", preset, theme);
|
|
77
|
+
const hasHeader = title != null || subheader != null || action != null;
|
|
78
|
+
const useComposition = hasHeader || contentSx != null;
|
|
79
|
+
const rootSx = [
|
|
80
|
+
buildCardSx({
|
|
81
|
+
variant: resolvedVariant,
|
|
82
|
+
padding: useComposition ? "none" : padding,
|
|
83
|
+
clickable: clickable || Boolean(onClick)
|
|
84
|
+
}),
|
|
85
|
+
...presetSx ? [presetSx] : [],
|
|
86
|
+
...Array.isArray(sx) ? sx : sx ? [sx] : []
|
|
87
|
+
];
|
|
88
|
+
return /* @__PURE__ */ jsxs(
|
|
89
|
+
Card$1,
|
|
90
|
+
{
|
|
91
|
+
sx: rootSx,
|
|
92
|
+
className,
|
|
93
|
+
"data-testid": dataTestId,
|
|
94
|
+
onClick,
|
|
95
|
+
onBlur,
|
|
96
|
+
elevation: 0,
|
|
97
|
+
children: [
|
|
98
|
+
hasHeader && /* @__PURE__ */ jsx(
|
|
99
|
+
CardHeader,
|
|
100
|
+
{
|
|
101
|
+
title,
|
|
102
|
+
subheader,
|
|
103
|
+
action,
|
|
104
|
+
sx: headerSx
|
|
105
|
+
}
|
|
106
|
+
),
|
|
107
|
+
useComposition ? /* @__PURE__ */ jsx(CardContent, { sx: contentSx, children }) : children
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
export {
|
|
113
|
+
Card as C,
|
|
114
|
+
buildCardSx as b
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=Card-DYKGY-NG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card-DYKGY-NG.js","sources":["../src/components/Card/Card.sx.ts","../src/components/Card/Card.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material/styles';\n\nexport type CardVariant = 'elevated' | 'outlined' | 'plain';\nexport type CardPadding = 'none' | 'dense' | 'normal' | 'loose';\n\nexport interface BuildCardSxArgs {\n variant: CardVariant;\n padding: CardPadding;\n clickable: boolean;\n}\n\nconst paddingMap: Record<CardPadding, number> = {\n none: 0,\n dense: 1.5,\n normal: 2.5,\n loose: 4,\n};\n\n/**\n * Estilo base del Card. La prop `sx` del consumer se compone encima junto al\n * preset resuelto (en Card.tsx). Este builder solo se ocupa de variant +\n * padding para que siga siendo predecible.\n */\nexport function buildCardSx({\n variant,\n padding,\n clickable,\n}: BuildCardSxArgs): SxProps<Theme> {\n return (theme) => ({\n borderRadius: 2,\n backgroundColor: 'background.paper',\n boxShadow: variant === 'elevated' ? theme.shadows[1] : 'none',\n border:\n variant === 'outlined'\n ? `1px solid ${theme.palette.divider}`\n : 'none',\n transition: theme.transitions.create(\n ['box-shadow', 'transform', 'border-color'],\n { duration: theme.transitions.duration.shorter },\n ),\n cursor: clickable ? 'pointer' : 'default',\n ...(clickable && {\n '&:hover': {\n boxShadow:\n variant === 'elevated'\n ? theme.shadows[3]\n : variant === 'outlined'\n ? theme.shadows[1]\n : 'none',\n transform: variant !== 'plain' ? 'translateY(-1px)' : 'none',\n },\n '&:active': {\n transform: 'translateY(0)',\n },\n }),\n p: paddingMap[padding],\n });\n}\n","import { type ReactNode } from 'react';\nimport { Card as MuiCard, CardHeader, CardContent, useTheme } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { resolvePreset } from '../_shared/resolvePreset';\nimport { buildCardSx, type CardVariant, type CardPadding } from './Card.sx';\n\nexport interface CardProps {\n /** Contenido del Card. */\n children?: ReactNode;\n /**\n * Variante visual.\n * - `elevated` (default): sombra sutil.\n * - `outlined`: borde sin sombra.\n * - `plain`: sin borde ni sombra, útil para layouts con nesting.\n */\n variant?: CardVariant;\n /** Densidad del padding interno. */\n padding?: CardPadding;\n /** Si `true`, muestra feedback de hover/active (cursor, sombra). */\n clickable?: boolean;\n /**\n * Preset registrado en `theme.styles.Card`. `\"default\"` usa el estilo\n * built-in sin preset extra.\n */\n preset?: string;\n /**\n * MUI `raised` legacy — mantenido por backward-compat. Equivale a\n * `variant=\"elevated\"` con sombra mayor. Ignora `variant` si se usa.\n */\n raised?: boolean;\n /**\n * Título de cabecera. Si se provee (o `subheader`/`action`), se renderiza un\n * `CardHeader` antes del contenido. Reemplaza el patrón\n * `<Card><CardHeader/>...</Card>` de MUI.\n */\n title?: ReactNode;\n /** Subtítulo de la cabecera. */\n subheader?: ReactNode;\n /** Acción a la derecha de la cabecera (ej. botón/menú). */\n action?: ReactNode;\n /** sx aplicado al `CardHeader`. */\n headerSx?: SxProps<Theme>;\n /**\n * sx aplicado al `CardContent` que envuelve a `children`. Al proveerlo (o al\n * usar header), el body se envuelve en un `CardContent` y el padding del root\n * pasa a `none` — equivale al patrón `<CardContent sx={...}>` de MUI.\n */\n contentSx?: SxProps<Theme>;\n /** sx del root. Se compone sobre el base + preset. */\n sx?: SxProps<Theme>;\n onClick?: () => void;\n onBlur?: () => void;\n className?: string;\n 'data-testid'?: string;\n}\n\nexport function Card({\n children,\n variant,\n padding = 'normal',\n clickable = false,\n preset,\n raised,\n title,\n subheader,\n action,\n headerSx,\n contentSx,\n sx,\n onClick,\n onBlur,\n className,\n 'data-testid': dataTestId,\n}: CardProps) {\n const theme = useTheme();\n\n const resolvedVariant: CardVariant = raised\n ? 'elevated'\n : (variant ?? 'elevated');\n\n const presetSx = resolvePreset('Card', preset, theme);\n\n const hasHeader =\n title != null || subheader != null || action != null;\n // En modo composición (header o contentSx) el padding lo manejan\n // CardHeader/CardContent, así que el root va sin padding.\n const useComposition = hasHeader || contentSx != null;\n\n const rootSx: SxProps<Theme> = [\n buildCardSx({\n variant: resolvedVariant,\n padding: useComposition ? 'none' : padding,\n clickable: clickable || Boolean(onClick),\n }),\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ];\n\n return (\n <MuiCard\n sx={rootSx}\n className={className}\n data-testid={dataTestId}\n onClick={onClick}\n onBlur={onBlur}\n elevation={0}\n >\n {hasHeader && (\n <CardHeader\n title={title}\n subheader={subheader}\n action={action}\n sx={headerSx}\n />\n )}\n {useComposition ? (\n <CardContent sx={contentSx}>{children}</CardContent>\n ) : (\n children\n )}\n </MuiCard>\n );\n}\n\nexport default Card;\n"],"names":["MuiCard"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAWA,MAAM,aAA0C;AAAA,EAC9C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAOO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,GAAoC;AAClC,SAAO,CAAC,UAAW;AAAA,IACjB,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,WAAW,YAAY,aAAa,MAAM,QAAQ,CAAC,IAAI;AAAA,IACvD,QACE,YAAY,aACR,aAAa,MAAM,QAAQ,OAAO,KAClC;AAAA,IACN,YAAY,MAAM,YAAY;AAAA,MAC5B,CAAC,cAAc,aAAa,cAAc;AAAA,MAC1C,EAAE,UAAU,MAAM,YAAY,SAAS,QAAA;AAAA,IAAQ;AAAA,IAEjD,QAAQ,YAAY,YAAY;AAAA,KAC5B,aAAa;AAAA,IACf,WAAW;AAAA,MACT,WACE,YAAY,aACR,MAAM,QAAQ,CAAC,IACf,YAAY,aACV,MAAM,QAAQ,CAAC,IACf;AAAA,MACR,WAAW,YAAY,UAAU,qBAAqB;AAAA,IAAA;AAAA,IAExD,YAAY;AAAA,MACV,WAAW;AAAA,IAAA;AAAA,EACb,IAzBe;AAAA,IA2BjB,GAAG,WAAW,OAAO;AAAA,EAAA;AAEzB;ACAO,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,GAAc;AACZ,QAAM,QAAQ,SAAA;AAEd,QAAM,kBAA+B,SACjC,aACC,4BAAW;AAEhB,QAAM,WAAW,cAAc,QAAQ,QAAQ,KAAK;AAEpD,QAAM,YACJ,SAAS,QAAQ,aAAa,QAAQ,UAAU;AAGlD,QAAM,iBAAiB,aAAa,aAAa;AAEjD,QAAM,SAAyB;AAAA,IAC7B,YAAY;AAAA,MACV,SAAS;AAAA,MACT,SAAS,iBAAiB,SAAS;AAAA,MACnC,WAAW,aAAa,QAAQ,OAAO;AAAA,IAAA,CACxC;AAAA,IACD,GAAI,WAAW,CAAC,QAAQ,IAAI,CAAA;AAAA,IAC5B,GAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,KAAK,CAAC,EAAE,IAAI,CAAA;AAAA,EAAC;AAG5C,SACE;AAAA,IAACA;AAAAA,IAAA;AAAA,MACC,IAAI;AAAA,MACJ;AAAA,MACA,eAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MAEV,UAAA;AAAA,QAAA,aACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA,IAAI;AAAA,UAAA;AAAA,QAAA;AAAA,QAGP,iBACC,oBAAC,aAAA,EAAY,IAAI,WAAY,UAAS,IAEtC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|