@soyfri/shared-library 2.0.0-beta.9 → 3.0.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-C_lW1VER.js +337 -0
- package/Autocomplete-C_lW1VER.js.map +1 -0
- package/Autocomplete-CejWztBY.cjs +336 -0
- package/Autocomplete-CejWztBY.cjs.map +1 -0
- package/Avatar-Dw5rzayR.cjs +166 -0
- package/Avatar-Dw5rzayR.cjs.map +1 -0
- package/Avatar-H8akSege.js +167 -0
- 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/{components/DateRangePicker/DateRangePicker.js → Chip-OPYQ1uQ_.js} +33 -35
- package/Chip-OPYQ1uQ_.js.map +1 -0
- package/{components/DateRangePicker/DateRangePicker.cjs → Chip-qoJLDiva.cjs} +33 -36
- package/Chip-qoJLDiva.cjs.map +1 -0
- package/DatePicker-_IGWc3I5.js +178 -0
- package/DatePicker-_IGWc3I5.js.map +1 -0
- package/DatePicker-t7uDTZMl.cjs +177 -0
- package/DatePicker-t7uDTZMl.cjs.map +1 -0
- package/DateTimePicker-BxQyjTCY.cjs +229 -0
- package/DateTimePicker-BxQyjTCY.cjs.map +1 -0
- package/DateTimePicker-CrmWav_j.js +230 -0
- 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-CScC87J5.cjs +185 -0
- package/Input-CScC87J5.cjs.map +1 -0
- package/Input-DP_fKl38.js +186 -0
- package/Input-DP_fKl38.js.map +1 -0
- package/Modal-C_QY7ZzY.js +352 -0
- package/Modal-C_QY7ZzY.js.map +1 -0
- package/Modal-D_6ZdSzw.cjs +351 -0
- package/Modal-D_6ZdSzw.cjs.map +1 -0
- package/README.md +188 -172
- package/RadioGroup-Dd0rHXSX.cjs +202 -0
- package/RadioGroup-Dd0rHXSX.cjs.map +1 -0
- package/RadioGroup-bO-ahP9T.js +203 -0
- package/RadioGroup-bO-ahP9T.js.map +1 -0
- package/Select-BY5Y0qZ1.js +376 -0
- package/Select-BY5Y0qZ1.js.map +1 -0
- package/Select-CURrHSyl.cjs +375 -0
- 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/Stat-BUcFCGrz.cjs +83 -0
- package/Stat-BUcFCGrz.cjs.map +1 -0
- package/Stat-C06A_izS.js +84 -0
- package/Stat-C06A_izS.js.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-CQFOopYy.cjs +182 -0
- package/Switch-CQFOopYy.cjs.map +1 -0
- package/Switch-D72dpkH2.js +183 -0
- 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/Table-C2LbW0B1.js +531 -0
- package/Table-C2LbW0B1.js.map +1 -0
- package/Table-C4OM6rrC.cjs +530 -0
- package/Table-C4OM6rrC.cjs.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 +3 -220
- package/components/AppBar/AppBar.cjs.map +1 -1
- package/components/AppBar/AppBar.d.ts +6 -6
- package/components/AppBar/AppBar.js +6 -223
- package/components/AppBar/AppBar.js.map +1 -1
- package/components/AppBar/index.d.ts +0 -6
- package/components/Autocomplete/Autocomplete.cjs +4 -311
- package/components/Autocomplete/Autocomplete.cjs.map +1 -1
- package/components/Autocomplete/Autocomplete.d.ts +8 -6
- package/components/Autocomplete/Autocomplete.helpers.d.ts +8 -4
- package/components/Autocomplete/Autocomplete.js +4 -311
- package/components/Autocomplete/Autocomplete.js.map +1 -1
- package/components/Autocomplete/_parts/AutocompleteOption.d.ts +5 -8
- package/components/Autocomplete/index.d.ts +1 -1
- package/components/Avatar/Avatar.cjs +2 -160
- package/components/Avatar/Avatar.cjs.map +1 -1
- package/components/Avatar/Avatar.d.ts +16 -1
- package/components/Avatar/Avatar.js +2 -160
- package/components/Avatar/Avatar.js.map +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 +4 -184
- package/components/Card/Card.cjs.map +1 -1
- package/components/Card/Card.d.ts +21 -50
- package/components/Card/Card.js +4 -184
- package/components/Card/Card.js.map +1 -1
- 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 +4 -72
- package/components/Chip/Chip.cjs.map +1 -1
- package/components/Chip/Chip.js +3 -71
- package/components/Chip/Chip.js.map +1 -1
- package/components/Chip/index.d.ts +2 -1
- package/components/Chip.d.ts +4 -0
- package/components/Column/Column.cjs +1 -1
- package/components/Column/Column.cjs.map +1 -1
- package/components/Column/Column.d.ts +1 -1
- package/components/Column/Column.js +1 -1
- package/components/Column/Column.js.map +1 -1
- package/components/Column/index.d.ts +1 -0
- package/components/DatePicker/DatePicker.cjs +3 -200
- package/components/DatePicker/DatePicker.cjs.map +1 -1
- package/components/DatePicker/DatePicker.d.ts +1 -13
- package/components/DatePicker/DatePicker.js +3 -200
- package/components/DatePicker/DatePicker.js.map +1 -1
- package/components/DatePicker/index.d.ts +1 -1
- package/components/DateTimePicker/DateTimePicker.cjs +3 -219
- package/components/DateTimePicker/DateTimePicker.cjs.map +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 +3 -219
- package/components/DateTimePicker/DateTimePicker.js.map +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 +11 -7
- package/components/Drawer/Drawer.cjs.map +1 -1
- package/components/Drawer/Drawer.js +12 -8
- 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 +3 -172
- package/components/Input/Input.cjs.map +1 -1
- package/components/Input/Input.d.ts +9 -2
- package/components/Input/Input.helpers.d.ts +3 -3
- package/components/Input/Input.js +3 -172
- package/components/Input/Input.js.map +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 +7 -317
- package/components/Modal/Modal.cjs.map +1 -1
- package/components/Modal/Modal.d.ts +27 -5
- package/components/Modal/Modal.js +6 -316
- package/components/Modal/Modal.js.map +1 -1
- 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 -1
- package/components/Modal.d.ts +4 -0
- package/components/RadioGroup/RadioGroup.cjs +3 -199
- package/components/RadioGroup/RadioGroup.cjs.map +1 -1
- package/components/RadioGroup/RadioGroup.d.ts +9 -3
- package/components/RadioGroup/RadioGroup.js +3 -199
- package/components/RadioGroup/RadioGroup.js.map +1 -1
- package/components/RadioGroup/index.d.ts +1 -1
- package/components/Select/Select.cjs +4 -445
- package/components/Select/Select.cjs.map +1 -1
- package/components/Select/Select.d.ts +37 -18
- package/components/Select/Select.helpers.d.ts +5 -19
- package/components/Select/Select.js +4 -445
- package/components/Select/Select.js.map +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 +4 -83
- package/components/Stat/Stat.cjs.map +1 -1
- package/components/Stat/Stat.js +3 -82
- 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 +4 -77
- package/components/StatusMessage/StatusMessage.cjs.map +1 -1
- package/components/StatusMessage/StatusMessage.d.ts +20 -36
- package/components/StatusMessage/StatusMessage.js +3 -76
- package/components/StatusMessage/StatusMessage.js.map +1 -1
- package/components/StatusMessage/index.d.ts +2 -1
- package/components/StatusMessage.d.ts +4 -0
- package/components/Stepper/Stepper.cjs +8 -90
- package/components/Stepper/Stepper.cjs.map +1 -1
- package/components/Stepper/Stepper.d.ts +9 -20
- package/components/Stepper/Stepper.js +7 -89
- package/components/Stepper/Stepper.js.map +1 -1
- package/{hooks/Wizard/WizardContext.d.ts → components/Stepper/StepperContext.d.ts} +29 -23
- 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 +3 -178
- package/components/Switch/Switch.cjs.map +1 -1
- package/components/Switch/Switch.d.ts +7 -2
- package/components/Switch/Switch.js +3 -178
- package/components/Switch/Switch.js.map +1 -1
- package/components/Table/Table.cjs +2 -528
- package/components/Table/Table.cjs.map +1 -1
- package/components/Table/Table.d.ts +1 -1
- package/components/Table/Table.js +2 -528
- package/components/Table/Table.js.map +1 -1
- package/components/Tabs/Tab.d.ts +13 -2
- package/components/Tabs/Tabs.cjs +5 -94
- package/components/Tabs/Tabs.cjs.map +1 -1
- package/components/Tabs/Tabs.d.ts +33 -16
- package/components/Tabs/Tabs.js +4 -93
- package/components/Tabs/Tabs.js.map +1 -1
- 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 +78 -10
- package/index.cjs.map +1 -1
- package/index.d.ts +42 -0
- package/index.js +70 -5
- 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 +85 -76
- package/{resolvePreset-CT3kU-K2.cjs → resolvePreset-CxTI6_Ln.cjs} +3 -3
- package/{resolvePreset-CT3kU-K2.cjs.map → resolvePreset-CxTI6_Ln.cjs.map} +1 -1
- package/{resolvePreset-B-IB0ehH.js → resolvePreset-K6_BfWHD.js} +3 -3
- package/{resolvePreset-B-IB0ehH.js.map → resolvePreset-K6_BfWHD.js.map} +1 -1
- 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/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.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.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
package/README.md
CHANGED
|
@@ -1,243 +1,259 @@
|
|
|
1
1
|
# @soyfri/shared-library
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Librería de componentes React de FRI, construida sobre **Material UI v7** + TypeScript. Provee componentes UI consistentes y tipados para los frontends del ecosistema (`soporte`, `afiliaciones`, …).
|
|
4
4
|
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
- [Características](#características)
|
|
8
|
-
- [Instalación](#instalación)
|
|
9
|
-
- [Uso](#uso)
|
|
10
|
-
- [Componentes Disponibles](#componentes-disponibles)
|
|
11
|
-
- [Desarrollo](#desarrollo)
|
|
12
|
-
- [Scripts Disponibles](#scripts-disponibles)
|
|
13
|
-
- [Storybook](#storybook)
|
|
14
|
-
- [Testing](#testing)
|
|
15
|
-
- [Tecnologías](#tecnologías)
|
|
16
|
-
- [Estructura del Proyecto](#estructura-del-proyecto)
|
|
17
|
-
|
|
18
|
-
## ✨ Características
|
|
19
|
-
|
|
20
|
-
- 🎨 **Componentes tipados**: Todos los componentes están construidos con TypeScript para mayor seguridad de tipos
|
|
21
|
-
- 📚 **Documentación con Storybook**: Cada componente incluye historias interactivas y documentación
|
|
22
|
-
- 🎯 **Material-UI**: Basado en Material-UI para un diseño consistente y accesible
|
|
23
|
-
- 🌈 **Tailwind CSS**: Integración con Tailwind para estilos utilitarios
|
|
24
|
-
- 🧪 **Testing**: Configurado con Vitest y Playwright para testing de componentes
|
|
25
|
-
- 📦 **Build optimizado**: Configuración con Rollup para generar builds ESM y CommonJS
|
|
26
|
-
|
|
27
|
-
## 📦 Instalación
|
|
5
|
+
## Instalación
|
|
28
6
|
|
|
29
7
|
```bash
|
|
30
8
|
npm install @soyfri/shared-library
|
|
31
9
|
```
|
|
32
10
|
|
|
33
|
-
|
|
11
|
+
### Peer dependencies
|
|
34
12
|
|
|
35
|
-
|
|
36
|
-
import { Button, Table, Select } from '@soyfri/shared-library';
|
|
37
|
-
import '@soyfri/shared-library/dist/styles.css';
|
|
13
|
+
El consumidor debe tener instaladas (la librería no las empaqueta):
|
|
38
14
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
Mi Botón
|
|
44
|
-
</Button>
|
|
45
|
-
</div>
|
|
46
|
-
);
|
|
47
|
-
}
|
|
15
|
+
```
|
|
16
|
+
react >=18 react-dom >=18 react-hook-form ^7
|
|
17
|
+
@mui/material ^7 @mui/icons-material ^7 @mui/x-date-pickers ^8 @mui/lab ^7
|
|
18
|
+
@emotion/react ^11 @emotion/styled ^11 dayjs ^1
|
|
48
19
|
```
|
|
49
20
|
|
|
50
|
-
##
|
|
21
|
+
## Setup
|
|
51
22
|
|
|
52
|
-
|
|
53
|
-
|
|
23
|
+
1. Envuelve la app en el `ThemeProvider` de MUI (los componentes leen el theme del contexto).
|
|
24
|
+
2. Importa los estilos una vez. El barrel los importa solo; si **solo** usas subpaths, impórtalos manualmente:
|
|
54
25
|
|
|
55
|
-
|
|
56
|
-
-
|
|
57
|
-
|
|
58
|
-
- Soporte para iconos de inicio y fin
|
|
59
|
-
- Estados de carga
|
|
60
|
-
- Completamente tipado
|
|
26
|
+
```tsx
|
|
27
|
+
import '@soyfri/shared-library/styles.css'
|
|
28
|
+
```
|
|
61
29
|
|
|
62
|
-
|
|
63
|
-
Componente de tabla flexible con paginación interna y externa, ordenamiento y renderizado personalizado de columnas.
|
|
30
|
+
## Dos formas de importar
|
|
64
31
|
|
|
65
|
-
|
|
66
|
-
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
- Soporte para componentes complejos en celdas
|
|
70
|
-
- Completamente tipado con generics
|
|
32
|
+
```tsx
|
|
33
|
+
// 1) Subpath por componente (recomendado — tree-shaking, lo que usan los proyectos)
|
|
34
|
+
import { Button } from '@soyfri/shared-library/components/Button'
|
|
35
|
+
import { Table } from '@soyfri/shared-library/components/Table'
|
|
71
36
|
|
|
72
|
-
|
|
73
|
-
|
|
37
|
+
// 2) Barrel raíz (importa styles.css automáticamente)
|
|
38
|
+
import { Button, Table, Select } from '@soyfri/shared-library'
|
|
39
|
+
```
|
|
74
40
|
|
|
75
|
-
|
|
76
|
-
- Selección simple y múltiple
|
|
77
|
-
- Filtrado de opciones
|
|
78
|
-
- Agrupación de opciones
|
|
79
|
-
- Renderizado personalizado con avatars
|
|
80
|
-
- Placeholder configurable
|
|
41
|
+
> Cada componente se publica como subpath `@soyfri/shared-library/components/<Nombre>`.
|
|
81
42
|
|
|
82
|
-
|
|
83
|
-
Componente para mostrar avatares de usuarios con soporte para imágenes y texto.
|
|
43
|
+
---
|
|
84
44
|
|
|
85
|
-
|
|
86
|
-
Wrapper para iconos de Material-UI con propiedades consistentes.
|
|
45
|
+
## Componentes
|
|
87
46
|
|
|
88
|
-
|
|
89
|
-
Componente para mostrar estadísticas con diferentes plantillas de visualización.
|
|
47
|
+
Uso mínimo de cada componente. Todos aceptan `sx` y son tipados.
|
|
90
48
|
|
|
91
|
-
|
|
92
|
-
- Plantilla simple
|
|
93
|
-
- Plantilla con chip
|
|
94
|
-
- Plantilla con lista de chips
|
|
95
|
-
- Colores personalizables
|
|
49
|
+
### Formularios e inputs
|
|
96
50
|
|
|
97
|
-
|
|
98
|
-
|
|
51
|
+
**Button** — `variant` (`text`/`outlined`/`contained`), `color`, `size`, `loading`, `startIcon`/`endIcon`.
|
|
52
|
+
```tsx
|
|
53
|
+
<Button variant="contained" color="primary" onClick={fn}>Guardar</Button>
|
|
54
|
+
```
|
|
99
55
|
|
|
100
|
-
|
|
56
|
+
**Input** — campo de texto. Modo controlado (`value`/`onChange`) o RHF (`name`/`control`).
|
|
57
|
+
```tsx
|
|
58
|
+
<Input label="Nombre" value={v} onChange={setV} />
|
|
59
|
+
<Input label="Correo" type="email" name="email" control={control} />
|
|
60
|
+
```
|
|
101
61
|
|
|
102
|
-
|
|
62
|
+
**InputGroup** — agrupa inputs/botones adyacentes con bordes unificados.
|
|
63
|
+
```tsx
|
|
64
|
+
<InputGroup><Input label="Buscar" value={q} onChange={setQ} /><Button>Ir</Button></InputGroup>
|
|
65
|
+
```
|
|
103
66
|
|
|
104
|
-
|
|
105
|
-
|
|
67
|
+
**Select** + **Option** — single, múltiple y filtrable. Modo controlado o RHF.
|
|
68
|
+
```tsx
|
|
69
|
+
<Select label="País" value={v} onChange={setV} options={[{value:'gt',label:'Guatemala'}]} />
|
|
70
|
+
<Select label="Tags" multiple value={vals} onChange={setVals} options={opts} filterable />
|
|
71
|
+
```
|
|
106
72
|
|
|
107
|
-
|
|
73
|
+
**Autocomplete** — búsqueda con `options` (`{value,label,img?}`), `multiple`.
|
|
74
|
+
```tsx
|
|
75
|
+
<Autocomplete label="Usuario" options={opts} value={v} onChange={setV} />
|
|
76
|
+
```
|
|
108
77
|
|
|
109
|
-
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
|
|
78
|
+
**Checkbox** / **Switch** — `label`, controlado (`checked`/`onChange`) o RHF (`name`/`control`).
|
|
79
|
+
```tsx
|
|
80
|
+
<Checkbox label="Acepto" checked={ok} onChange={setOk} />
|
|
81
|
+
<Switch label="Activo" checked={on} onChange={setOn} />
|
|
113
82
|
```
|
|
114
83
|
|
|
115
|
-
|
|
116
|
-
```
|
|
117
|
-
|
|
84
|
+
**RadioGroup** — `options` (`{value,label}`), `row`.
|
|
85
|
+
```tsx
|
|
86
|
+
<RadioGroup label="Tipo" options={[{value:'a',label:'A'},{value:'b',label:'B'}]} value={v} onChange={setV} />
|
|
118
87
|
```
|
|
119
88
|
|
|
120
|
-
|
|
121
|
-
```
|
|
122
|
-
|
|
89
|
+
**DatePicker** / **DateTimePicker** — valor `Dayjs`, `minDate`/`maxDate`.
|
|
90
|
+
```tsx
|
|
91
|
+
<DatePicker label="Fecha" value={date} onChange={setDate} />
|
|
123
92
|
```
|
|
124
93
|
|
|
125
|
-
|
|
94
|
+
### Datos y visualización
|
|
126
95
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
- `npm run build-storybook` - Construye Storybook para producción
|
|
135
|
-
- `npm run dist` - Ejecuta el script de distribución personalizado
|
|
96
|
+
**Table** + **Column** — paginación interna o externa, render por columna.
|
|
97
|
+
```tsx
|
|
98
|
+
<Table data={rows}>
|
|
99
|
+
<Column name="Nombre" field="name">{({name}) => <b>{name}</b>}</Column>
|
|
100
|
+
<Column name="Estado" field="status">{({status}) => <Chip label={status} />}</Column>
|
|
101
|
+
</Table>
|
|
102
|
+
```
|
|
136
103
|
|
|
137
|
-
|
|
104
|
+
**Avatar** — uno (`src`/`alt`/`fallback`) o grupo apilado (`items`).
|
|
105
|
+
```tsx
|
|
106
|
+
<Avatar src={url} alt="Ada" fallback="AL" />
|
|
107
|
+
<Avatar items={[{imageUrl:u1,text:'Ada'},{imageUrl:u2,text:'Bob'}]} displayedAvatars={3} />
|
|
108
|
+
```
|
|
138
109
|
|
|
139
|
-
|
|
110
|
+
**Chip** — `label`, `color`, `variant`, `onDelete`.
|
|
111
|
+
```tsx
|
|
112
|
+
<Chip label="Activo" color="success" size="small" />
|
|
113
|
+
```
|
|
140
114
|
|
|
141
|
-
|
|
115
|
+
**Stat** — KPI con plantillas `simple`/`chip`/`chipList`.
|
|
116
|
+
```tsx
|
|
117
|
+
<Stat simple statDisplay={() => <>Q 1,200</>} />
|
|
118
|
+
```
|
|
142
119
|
|
|
143
|
-
|
|
144
|
-
|
|
120
|
+
**Icon** — SVG por `path`/`url` o `children`, con `badge`, `spin`.
|
|
121
|
+
```tsx
|
|
122
|
+
<Icon url="/icons/user.svg" size="md" />
|
|
145
123
|
```
|
|
146
124
|
|
|
147
|
-
|
|
125
|
+
**Gallery** — galería con lightbox; `items` (`{url,type,title}`).
|
|
126
|
+
```tsx
|
|
127
|
+
<Gallery items={[{url:img,type:'image',title:'Doc'}]} />
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Timeline** + **TimelineItem** — línea temporal.
|
|
131
|
+
```tsx
|
|
132
|
+
<Timeline><TimelineItem>Creado</TimelineItem><TimelineItem>Aprobado</TimelineItem></Timeline>
|
|
133
|
+
```
|
|
148
134
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
135
|
+
**Stepper** + **Step** — pasos `horizontal`/`vertical`, `currentStep`.
|
|
136
|
+
```tsx
|
|
137
|
+
<Stepper currentStep={1}><Step label="Datos" /><Step label="Pago" /></Stepper>
|
|
138
|
+
```
|
|
153
139
|
|
|
154
|
-
###
|
|
140
|
+
### Feedback
|
|
155
141
|
|
|
156
|
-
|
|
157
|
-
|
|
142
|
+
**Alert** — `severity` (`success`/`info`/`warning`/`error`), `variant`.
|
|
143
|
+
```tsx
|
|
144
|
+
<Alert severity="error">No se pudo guardar</Alert>
|
|
158
145
|
```
|
|
159
146
|
|
|
160
|
-
|
|
147
|
+
**Spinner** — `size`, `color`.
|
|
148
|
+
```tsx
|
|
149
|
+
<Spinner size={16} />
|
|
150
|
+
```
|
|
161
151
|
|
|
162
|
-
|
|
152
|
+
**StatusMessage** — mensaje de estado como `alert` o `modal`.
|
|
153
|
+
```tsx
|
|
154
|
+
<StatusMessage open messageType="success" title="Listo" description="Guardado" close={fn} />
|
|
155
|
+
```
|
|
163
156
|
|
|
164
|
-
|
|
157
|
+
**Tooltip** — `text` envolviendo un hijo.
|
|
158
|
+
```tsx
|
|
159
|
+
<Tooltip text="Editar"><Button>✎</Button></Tooltip>
|
|
160
|
+
```
|
|
165
161
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
162
|
+
**Modal** (+ `ModalHeader`/`ModalBody`/`ModalFooter`) — `open`/`onClose`, `actions`, `staticBackdrop`, `maxWidth`.
|
|
163
|
+
```tsx
|
|
164
|
+
<Modal open={open} onClose={close} title="Confirmar" actions={[{text:'OK',onClick:save}]} staticBackdrop />
|
|
165
|
+
```
|
|
169
166
|
|
|
170
|
-
|
|
167
|
+
### Navegación
|
|
171
168
|
|
|
172
|
-
|
|
169
|
+
**Tabs** + **Tab** — paneles por contenido, o modo `nav` (enlaces controlados por ruta).
|
|
170
|
+
```tsx
|
|
171
|
+
<Tabs onChangeValue={setV}>
|
|
172
|
+
<Tab value={0} label="General">…</Tab>
|
|
173
|
+
<Tab value={1} label="Historial">…</Tab>
|
|
174
|
+
</Tabs>
|
|
175
|
+
// Modo nav (router): value controlado, sin paneles
|
|
176
|
+
<Tabs nav value={current}>
|
|
177
|
+
<Tab value="info" label="Info" component={Link} to="info" />
|
|
178
|
+
</Tabs>
|
|
179
|
+
```
|
|
173
180
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
181
|
+
**Breadcrumbs** — migas; los hijos son `Link`/`Typography`.
|
|
182
|
+
```tsx
|
|
183
|
+
<Breadcrumbs><Link href="/">Inicio</Link><Typography>Detalle</Typography></Breadcrumbs>
|
|
184
|
+
```
|
|
178
185
|
|
|
179
|
-
|
|
186
|
+
**Drawer** + **DrawerItem** — panel lateral colapsable.
|
|
187
|
+
```tsx
|
|
188
|
+
<Drawer open variant="permanent"><DrawerItem>Inicio</DrawerItem></Drawer>
|
|
189
|
+
```
|
|
180
190
|
|
|
181
|
-
|
|
182
|
-
- **Rollup**: Bundler para la construcción de la librería
|
|
183
|
-
- **Vitest**: Framework de testing
|
|
184
|
-
- **Playwright**: Testing de browser
|
|
185
|
-
- **Prettier**: Formateo de código
|
|
191
|
+
**AppBar** — barra superior (incluye `AppBarMenuToggle`, `useAppBarContext`).
|
|
186
192
|
|
|
187
|
-
|
|
193
|
+
**MenuButton** — botón que abre un menú de `options`.
|
|
194
|
+
```tsx
|
|
195
|
+
<MenuButton buttonText="Acciones" options={[{label:'Editar',onClick:fn}]} />
|
|
196
|
+
```
|
|
188
197
|
|
|
198
|
+
**ActionMenu** + **ActionMenuItem** — menú contextual (compound; `trigger` opcional, default ⋮).
|
|
199
|
+
```tsx
|
|
200
|
+
<ActionMenu><ActionMenuItem onClick={edit}>Editar</ActionMenuItem><ActionMenuItem onClick={del}>Eliminar</ActionMenuItem></ActionMenu>
|
|
189
201
|
```
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
│ │ ├── Icon/
|
|
198
|
-
│ │ ├── Select/
|
|
199
|
-
│ │ ├── Stat/
|
|
200
|
-
│ │ └── Table/
|
|
201
|
-
│ ├── index.ts # Punto de entrada principal
|
|
202
|
-
│ └── styles.css # Estilos globales
|
|
203
|
-
├── dist/ # Archivos construidos
|
|
204
|
-
├── package.json
|
|
205
|
-
├── tsconfig.json
|
|
206
|
-
├── tailwind.config.js
|
|
207
|
-
├── rollup.config.cjs
|
|
208
|
-
└── vitest.config.ts
|
|
202
|
+
|
|
203
|
+
### Layout y contenedores
|
|
204
|
+
|
|
205
|
+
**Card** — `variant`, `padding`; o composición con `title`/`subheader`/`action` y `contentSx`.
|
|
206
|
+
```tsx
|
|
207
|
+
<Card title="Resumen" action={<Button>Editar</Button>}>…</Card>
|
|
208
|
+
<Card contentSx={{ p: 0 }}><Table data={rows}>…</Table></Card> // tabla flush
|
|
209
209
|
```
|
|
210
210
|
|
|
211
|
-
|
|
211
|
+
**Divider** — separador `horizontal`/`vertical`.
|
|
212
|
+
```tsx
|
|
213
|
+
<Divider sx={{ my: 2 }} />
|
|
214
|
+
```
|
|
212
215
|
|
|
213
|
-
|
|
216
|
+
**ButtonGroup** — agrupa botones.
|
|
217
|
+
```tsx
|
|
218
|
+
<ButtonGroup><Button>Día</Button><Button>Mes</Button></ButtonGroup>
|
|
219
|
+
```
|
|
214
220
|
|
|
221
|
+
**Flyout** — panel flotante `open`/`onClose`, `anchor`.
|
|
222
|
+
```tsx
|
|
223
|
+
<Flyout open={open} onClose={close} anchor="right">…</Flyout>
|
|
215
224
|
```
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
225
|
+
|
|
226
|
+
### Hooks
|
|
227
|
+
|
|
228
|
+
**useClipboard** — copiar al portapapeles con feedback.
|
|
229
|
+
```tsx
|
|
230
|
+
import { useClipboard } from '@soyfri/shared-library/hooks/ClipBoard'
|
|
231
|
+
const { copy, CopyMessage } = useClipboard({ message: 'Copiado', severity: 'success' })
|
|
222
232
|
```
|
|
223
233
|
|
|
224
|
-
|
|
234
|
+
---
|
|
225
235
|
|
|
226
|
-
|
|
236
|
+
## Certificados HTTPS de desarrollo
|
|
227
237
|
|
|
228
|
-
|
|
229
|
-
2. Crea una rama para tu feature (`git checkout -b feature/nueva-funcionalidad`)
|
|
230
|
-
3. Commit tus cambios (`git commit -am 'Agrega nueva funcionalidad'`)
|
|
231
|
-
4. Push a la rama (`git push origin feature/nueva-funcionalidad`)
|
|
232
|
-
5. Crea un Pull Request
|
|
238
|
+
El paquete incluye los certs del dev server de cada proyecto bajo el subpath `./local/*` (los consume el `vite.config` de cada frontend):
|
|
233
239
|
|
|
234
|
-
|
|
240
|
+
```
|
|
241
|
+
@soyfri/shared-library/local/support/supportweb.dev.soyfri.com.pem
|
|
242
|
+
```
|
|
235
243
|
|
|
236
|
-
|
|
244
|
+
## Desarrollo
|
|
237
245
|
|
|
238
|
-
|
|
246
|
+
```bash
|
|
247
|
+
npm install
|
|
248
|
+
npm run dev # build en watch (tsup)
|
|
249
|
+
npm run storybook # Storybook en :6006 (documentación interactiva, 260+ stories)
|
|
250
|
+
npm run build # build de producción (vite + postbuild genera subpaths en dist/)
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## Tecnologías
|
|
254
|
+
|
|
255
|
+
React 18/19 · Material UI v7 · TypeScript 5 · Tailwind CSS 4 · Storybook 9 · Vite/Rollup · Vitest + Playwright.
|
|
239
256
|
|
|
240
|
-
|
|
257
|
+
## Licencia
|
|
241
258
|
|
|
242
|
-
|
|
243
|
-
|
|
259
|
+
ISC
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defProps = Object.defineProperties;
|
|
4
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
5
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __spreadValues = (a, b) => {
|
|
10
|
+
for (var prop in b || (b = {}))
|
|
11
|
+
if (__hasOwnProp.call(b, prop))
|
|
12
|
+
__defNormalProp(a, prop, b[prop]);
|
|
13
|
+
if (__getOwnPropSymbols)
|
|
14
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
15
|
+
if (__propIsEnum.call(b, prop))
|
|
16
|
+
__defNormalProp(a, prop, b[prop]);
|
|
17
|
+
}
|
|
18
|
+
return a;
|
|
19
|
+
};
|
|
20
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
21
|
+
var __objRest = (source, exclude) => {
|
|
22
|
+
var target = {};
|
|
23
|
+
for (var prop in source)
|
|
24
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
25
|
+
target[prop] = source[prop];
|
|
26
|
+
if (source != null && __getOwnPropSymbols)
|
|
27
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
28
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
29
|
+
target[prop] = source[prop];
|
|
30
|
+
}
|
|
31
|
+
return target;
|
|
32
|
+
};
|
|
33
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
34
|
+
const styles = require("@mui/material/styles");
|
|
35
|
+
const material = require("@mui/material");
|
|
36
|
+
const reactHookForm = require("react-hook-form");
|
|
37
|
+
const resolvePreset = require("./resolvePreset-CxTI6_Ln.cjs");
|
|
38
|
+
const toRadius = (borderRadius) => typeof borderRadius === "number" ? `${borderRadius}px` : borderRadius;
|
|
39
|
+
const FOCUS_TRANSITION = "border-color 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms, box-shadow 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms";
|
|
40
|
+
const buildRadioGroupSx = ({
|
|
41
|
+
bordered,
|
|
42
|
+
borderRadius,
|
|
43
|
+
error
|
|
44
|
+
}) => {
|
|
45
|
+
const radius = toRadius(borderRadius);
|
|
46
|
+
if (!bordered) {
|
|
47
|
+
return {
|
|
48
|
+
"& .MuiFormHelperText-root": { marginLeft: 0 }
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return (theme) => ({
|
|
52
|
+
"& .MuiRadioGroup-root": __spreadProps(__spreadValues({
|
|
53
|
+
paddingTop: 1.25,
|
|
54
|
+
paddingBottom: 1.25,
|
|
55
|
+
paddingX: 1.5,
|
|
56
|
+
border: `1px solid ${error ? theme.palette.error.main : theme.palette.divider}`,
|
|
57
|
+
borderRadius: radius,
|
|
58
|
+
transition: FOCUS_TRANSITION
|
|
59
|
+
}, error && {
|
|
60
|
+
boxShadow: `0 0 0 1px ${theme.palette.error.main}`
|
|
61
|
+
}), {
|
|
62
|
+
// Focus del usuario sobre cualquier radio interno.
|
|
63
|
+
"&:focus-within": {
|
|
64
|
+
borderColor: error ? theme.palette.error.main : theme.palette.primary.main,
|
|
65
|
+
boxShadow: `0 0 0 1px ${error ? theme.palette.error.main : theme.palette.primary.main}`
|
|
66
|
+
}
|
|
67
|
+
}),
|
|
68
|
+
"& .MuiFormHelperText-root": {
|
|
69
|
+
marginLeft: 0
|
|
70
|
+
},
|
|
71
|
+
"& .MuiFormLabel-root": {
|
|
72
|
+
marginBottom: 0.5
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
const RadioGroup = (props) => {
|
|
77
|
+
const _a = props, {
|
|
78
|
+
options,
|
|
79
|
+
label,
|
|
80
|
+
row = true,
|
|
81
|
+
size = "small",
|
|
82
|
+
disabled = false,
|
|
83
|
+
error = false,
|
|
84
|
+
helperText,
|
|
85
|
+
bordered = true,
|
|
86
|
+
borderRadius = 10,
|
|
87
|
+
defaultValue,
|
|
88
|
+
preset,
|
|
89
|
+
sx
|
|
90
|
+
} = _a, rest = __objRest(_a, [
|
|
91
|
+
"options",
|
|
92
|
+
"label",
|
|
93
|
+
"row",
|
|
94
|
+
"size",
|
|
95
|
+
"disabled",
|
|
96
|
+
"error",
|
|
97
|
+
"helperText",
|
|
98
|
+
"bordered",
|
|
99
|
+
"borderRadius",
|
|
100
|
+
"defaultValue",
|
|
101
|
+
"preset",
|
|
102
|
+
"sx"
|
|
103
|
+
]);
|
|
104
|
+
const theme = styles.useTheme();
|
|
105
|
+
const presetSx = resolvePreset.resolvePreset("RadioGroup", preset, theme);
|
|
106
|
+
const buildSx = (effectiveError) => [
|
|
107
|
+
buildRadioGroupSx({ bordered, borderRadius, error: effectiveError }),
|
|
108
|
+
...presetSx ? [presetSx] : [],
|
|
109
|
+
...Array.isArray(sx) ? sx : sx ? [sx] : []
|
|
110
|
+
];
|
|
111
|
+
const renderOptions = (fieldName) => options.map((opt) => {
|
|
112
|
+
var _a2;
|
|
113
|
+
const inputId = (_a2 = opt.id) != null ? _a2 : `${fieldName != null ? fieldName : "radio"}-${opt.value}`;
|
|
114
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
115
|
+
material.FormControlLabel,
|
|
116
|
+
{
|
|
117
|
+
value: opt.value,
|
|
118
|
+
control: /* @__PURE__ */ jsxRuntime.jsx(
|
|
119
|
+
material.Radio,
|
|
120
|
+
{
|
|
121
|
+
id: inputId,
|
|
122
|
+
size,
|
|
123
|
+
disabled: disabled || opt.disabled
|
|
124
|
+
}
|
|
125
|
+
),
|
|
126
|
+
label: opt.label,
|
|
127
|
+
disabled: disabled || opt.disabled
|
|
128
|
+
},
|
|
129
|
+
inputId
|
|
130
|
+
);
|
|
131
|
+
});
|
|
132
|
+
if ("control" in props && props.control) {
|
|
133
|
+
const { name: name2, control, validation, onValueChange } = props;
|
|
134
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
135
|
+
reactHookForm.Controller,
|
|
136
|
+
{
|
|
137
|
+
name: name2,
|
|
138
|
+
control,
|
|
139
|
+
rules: validation,
|
|
140
|
+
defaultValue,
|
|
141
|
+
render: ({ field, fieldState: { error: fieldError } }) => {
|
|
142
|
+
var _a2, _b;
|
|
143
|
+
const finalError = !!fieldError || error;
|
|
144
|
+
const finalHelperText = (_a2 = fieldError == null ? void 0 : fieldError.message) != null ? _a2 : helperText;
|
|
145
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
146
|
+
material.FormControl,
|
|
147
|
+
{
|
|
148
|
+
error: finalError,
|
|
149
|
+
disabled,
|
|
150
|
+
sx: buildSx(finalError),
|
|
151
|
+
fullWidth: true,
|
|
152
|
+
children: [
|
|
153
|
+
label && /* @__PURE__ */ jsxRuntime.jsx(material.FormLabel, { children: label }),
|
|
154
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
155
|
+
material.RadioGroup,
|
|
156
|
+
__spreadProps(__spreadValues({}, rest), {
|
|
157
|
+
row,
|
|
158
|
+
name: field.name,
|
|
159
|
+
value: (_b = field.value) != null ? _b : "",
|
|
160
|
+
onBlur: field.onBlur,
|
|
161
|
+
onChange: (_e, value2) => {
|
|
162
|
+
field.onChange(value2);
|
|
163
|
+
onValueChange == null ? void 0 : onValueChange(value2);
|
|
164
|
+
},
|
|
165
|
+
children: renderOptions(field.name)
|
|
166
|
+
})
|
|
167
|
+
),
|
|
168
|
+
finalHelperText && /* @__PURE__ */ jsxRuntime.jsx(material.FormHelperText, { children: finalHelperText })
|
|
169
|
+
]
|
|
170
|
+
}
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
const { value, onChange, name } = props;
|
|
177
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
178
|
+
material.FormControl,
|
|
179
|
+
{
|
|
180
|
+
error,
|
|
181
|
+
disabled,
|
|
182
|
+
sx: buildSx(error),
|
|
183
|
+
fullWidth: true,
|
|
184
|
+
children: [
|
|
185
|
+
label && /* @__PURE__ */ jsxRuntime.jsx(material.FormLabel, { children: label }),
|
|
186
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
187
|
+
material.RadioGroup,
|
|
188
|
+
__spreadProps(__spreadValues({}, rest), {
|
|
189
|
+
row,
|
|
190
|
+
name,
|
|
191
|
+
value: value != null ? value : "",
|
|
192
|
+
onChange: (_e, next) => onChange(next),
|
|
193
|
+
children: renderOptions(name)
|
|
194
|
+
})
|
|
195
|
+
),
|
|
196
|
+
helperText && /* @__PURE__ */ jsxRuntime.jsx(material.FormHelperText, { children: helperText })
|
|
197
|
+
]
|
|
198
|
+
}
|
|
199
|
+
);
|
|
200
|
+
};
|
|
201
|
+
exports.RadioGroup = RadioGroup;
|
|
202
|
+
//# sourceMappingURL=RadioGroup-Dd0rHXSX.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RadioGroup-Dd0rHXSX.cjs","sources":["../src/components/RadioGroup/RadioGroup.sx.ts","../src/components/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface BuildRadioGroupSxOptions {\n bordered: boolean;\n borderRadius: number | string;\n error: boolean;\n}\n\nconst toRadius = (borderRadius: number | string) =>\n typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius;\n\n/**\n * Transición compartida (matchea el InputGroup).\n */\nconst FOCUS_TRANSITION =\n 'border-color 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms, ' +\n 'box-shadow 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms';\n\n/**\n * Builder de sx para RadioGroup. Reproduce el estilo del antiguo\n * `FormRadioGroup` legacy: contenedor con borde + padding vertical.\n *\n * Cuando `bordered=true`, el contenedor gana:\n * - `:focus-within` → borde + shadow primario (mismo patrón que `InputGroup`).\n * - `error=true` → borde + shadow de error (palette.error.main).\n *\n * El shadow es de 1px, así que no hay shift de layout — sólo se intensifica\n * visualmente el borde sin empujar nada alrededor.\n *\n * Si `bordered=false`, devuelve un sx mínimo (sólo helper text reset).\n */\nexport const buildRadioGroupSx = ({\n bordered,\n borderRadius,\n error,\n}: BuildRadioGroupSxOptions): SxProps<Theme> => {\n const radius = toRadius(borderRadius);\n\n if (!bordered) {\n return {\n '& .MuiFormHelperText-root': { marginLeft: 0 },\n };\n }\n\n return (theme) => ({\n '& .MuiRadioGroup-root': {\n paddingTop: 1.25,\n paddingBottom: 1.25,\n paddingX: 1.5,\n border: `1px solid ${\n error ? theme.palette.error.main : theme.palette.divider\n }`,\n borderRadius: radius,\n transition: FOCUS_TRANSITION,\n ...(error && {\n boxShadow: `0 0 0 1px ${theme.palette.error.main}`,\n }),\n // Focus del usuario sobre cualquier radio interno.\n '&:focus-within': {\n borderColor: error\n ? theme.palette.error.main\n : theme.palette.primary.main,\n boxShadow: `0 0 0 1px ${\n error ? theme.palette.error.main : theme.palette.primary.main\n }`,\n },\n },\n '& .MuiFormHelperText-root': {\n marginLeft: 0,\n },\n '& .MuiFormLabel-root': {\n marginBottom: 0.5,\n },\n });\n};\n","import type { FC } from 'react';\nimport { useTheme } from '@mui/material/styles';\nimport {\n FormControl,\n FormControlLabel,\n FormHelperText,\n FormLabel,\n Radio,\n RadioGroup as MuiRadioGroup,\n type RadioGroupProps as MuiRadioGroupProps,\n type SxProps,\n type Theme,\n} from '@mui/material';\nimport { Controller, type Control, type RegisterOptions } from 'react-hook-form';\n\nimport { buildRadioGroupSx } from './RadioGroup.sx';\nimport { resolvePreset } from '../_shared/resolvePreset';\n\n// ── Tipos de dominio ─────────────────────────────────────────────────────\nexport interface RadioOption {\n /** Valor que se emite cuando se selecciona la opción. */\n value: string;\n /** Texto mostrado al lado del radio. */\n label: string;\n /** Deshabilitar opción individualmente. */\n disabled?: boolean;\n /** ID custom del input (default: prefijo + value). */\n id?: string;\n}\n\nexport type RadioGroupSize = 'small' | 'medium';\n\n// ── Props base (todo lo común entre RHF y controlado) ────────────────────\nexport interface BaseRadioGroupProps\n extends Omit<MuiRadioGroupProps, 'value' | 'onChange' | 'defaultValue'> {\n options: RadioOption[];\n /** Label superior del grupo. */\n label?: string;\n /** Distribución horizontal (default: true — replica el comportamiento legacy). */\n row?: boolean;\n size?: RadioGroupSize;\n disabled?: boolean;\n error?: boolean;\n helperText?: string;\n /** Renderiza un contenedor con borde estilo \"form field\". Default: true. */\n bordered?: boolean;\n /** Border radius del contenedor (cuando bordered). Default: 10. */\n borderRadius?: number | string;\n defaultValue?: string;\n /**\n * Nombre del preset de estilo registrado en `theme.styles.RadioGroup`.\n * - `\"default\"` (o ausente) = estilo built-in del paquete.\n * - Cualquier otro string = mergea el preset encima del estilo built-in.\n */\n preset?: string;\n sx?: SxProps<Theme>;\n}\n\n// ── Variantes discriminadas (RHF vs controlado) ──────────────────────────\nexport interface RHFRadioGroupProps extends BaseRadioGroupProps {\n name: string;\n // `any` plano (no `Control<any>`): RHF tipa `Control<T>` con generics en\n // posiciones tanto contravariantes como covariantes (ej. `_subjects.state`).\n // Cuando el componente o su uso involucra generics adicionales, TS se\n // confunde narroweando el discriminated union y `Control<any>` no logra\n // absorber `Control<MyForm>` en la comparación estructural profunda. El\n // `any` plano elimina ese ruido. RHF adentro sigue teniendo sus tipos\n // fuertes — solo degradamos la superficie del prop del componente.\n control: any;\n validation?: RegisterOptions;\n /**\n * Side-effect que corre después de que RHF actualiza el form state.\n * Útil para cascadas entre campos. NO reemplaza al handler de RHF.\n */\n onValueChange?: (value: string) => void;\n value?: never;\n onChange?: never;\n}\n\nexport interface ControlledRadioGroupProps extends BaseRadioGroupProps {\n name?: string;\n control?: never;\n validation?: never;\n value: string;\n onChange: (value: string) => void;\n}\n\n// ── API pública final ────────────────────────────────────────────────────\nexport type RadioGroupProps = RHFRadioGroupProps | ControlledRadioGroupProps;\n\nexport const RadioGroup: FC<RadioGroupProps> = (props) => {\n const {\n options,\n label,\n row = true,\n size = 'small',\n disabled = false,\n error = false,\n helperText,\n bordered = true,\n borderRadius = 10,\n defaultValue,\n preset,\n sx,\n ...rest\n } = props as ControlledRadioGroupProps & {\n control?: Control<any>;\n validation?: RegisterOptions;\n };\n\n const theme = useTheme();\n const presetSx = resolvePreset('RadioGroup', preset, theme);\n\n // Construye el sx con el estado de error efectivo; se llama por rama\n // (RHF usa el error del Controller, controlado usa el prop `error`).\n const buildSx = (effectiveError: boolean) => [\n buildRadioGroupSx({ bordered, borderRadius, error: effectiveError }),\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ];\n\n const renderOptions = (fieldName?: string) =>\n options.map((opt) => {\n const inputId = opt.id ?? `${fieldName ?? 'radio'}-${opt.value}`;\n return (\n <FormControlLabel\n key={inputId}\n value={opt.value}\n control={\n <Radio\n id={inputId}\n size={size}\n disabled={disabled || opt.disabled}\n />\n }\n label={opt.label}\n disabled={disabled || opt.disabled}\n />\n );\n });\n\n // ── RHF mode ──────────────────────────────────────────────────────────\n if ('control' in props && props.control) {\n const { name, control, validation, onValueChange } = props as RHFRadioGroupProps;\n return (\n <Controller\n name={name}\n control={control}\n rules={validation}\n defaultValue={defaultValue}\n render={({ field, fieldState: { error: fieldError } }) => {\n const finalError = !!fieldError || error;\n const finalHelperText = fieldError?.message ?? helperText;\n return (\n <FormControl\n error={finalError}\n disabled={disabled}\n sx={buildSx(finalError)}\n fullWidth\n >\n {label && <FormLabel>{label}</FormLabel>}\n <MuiRadioGroup\n {...rest}\n row={row}\n name={field.name}\n value={field.value ?? ''}\n onBlur={field.onBlur}\n onChange={(_e, value) => {\n field.onChange(value);\n onValueChange?.(value);\n }}\n >\n {renderOptions(field.name)}\n </MuiRadioGroup>\n {finalHelperText && <FormHelperText>{finalHelperText}</FormHelperText>}\n </FormControl>\n );\n }}\n />\n );\n }\n\n // ── Controlled mode ───────────────────────────────────────────────────\n const { value, onChange, name } = props as ControlledRadioGroupProps;\n return (\n <FormControl\n error={error}\n disabled={disabled}\n sx={buildSx(error)}\n fullWidth\n >\n {label && <FormLabel>{label}</FormLabel>}\n <MuiRadioGroup\n {...rest}\n row={row}\n name={name}\n value={value ?? ''}\n onChange={(_e, next) => onChange(next)}\n >\n {renderOptions(name)}\n </MuiRadioGroup>\n {helperText && <FormHelperText>{helperText}</FormHelperText>}\n </FormControl>\n );\n};\n\nexport default RadioGroup;\n"],"names":["useTheme","resolvePreset","_a","jsx","FormControlLabel","Radio","name","Controller","jsxs","FormControl","FormLabel","MuiRadioGroup","value","FormHelperText"],"mappings":"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"}
|