@soyfri/shared-library 2.0.0-beta.13 → 2.0.0-beta.16
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/{Autocomplete-C2x-lBvZ.cjs → Autocomplete-4i0dNDKr.cjs} +55 -33
- package/Autocomplete-4i0dNDKr.cjs.map +1 -0
- package/{Autocomplete-BA-cGASd.js → Autocomplete-i3-V38n1.js} +56 -34
- package/Autocomplete-i3-V38n1.js.map +1 -0
- package/{Avatar-BJTr-PBd.js → Avatar-CgT7955R.js} +18 -19
- package/Avatar-CgT7955R.js.map +1 -0
- package/{Avatar-9L7YMxya.cjs → Avatar-CuSrK8Wn.cjs} +18 -19
- package/Avatar-CuSrK8Wn.cjs.map +1 -0
- package/Button-C17mExpd.cjs.map +1 -1
- package/Button-UkkP-bNw.js.map +1 -1
- package/Card-B1wtavyl.js +98 -0
- package/Card-B1wtavyl.js.map +1 -0
- package/Card-DfdU610V.cjs +97 -0
- package/Card-DfdU610V.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-DLSfkgGA.cjs → DatePicker-CtCFqXDw.cjs} +41 -64
- package/DatePicker-CtCFqXDw.cjs.map +1 -0
- package/{DatePicker-8f_9bwhS.js → DatePicker-D0Bz9Ryg.js} +37 -60
- package/DatePicker-D0Bz9Ryg.js.map +1 -0
- package/{DateTimePicker-D4L9GAod.js → DateTimePicker-77w-9TP5.js} +27 -17
- package/DateTimePicker-77w-9TP5.js.map +1 -0
- package/{DateTimePicker-CWNW09-O.cjs → DateTimePicker-CTnRQCZo.cjs} +31 -21
- package/DateTimePicker-CTnRQCZo.cjs.map +1 -0
- package/{Input-DI0jfq5X.cjs → Input-jYapjJYM.cjs} +27 -14
- package/Input-jYapjJYM.cjs.map +1 -0
- package/{Input-Cp911l23.js → Input-rVVhI_wk.js} +24 -11
- package/Input-rVVhI_wk.js.map +1 -0
- package/{Modal-Bm_HH9cv.cjs → Modal-BN5s-Tfk.cjs} +126 -98
- package/Modal-BN5s-Tfk.cjs.map +1 -0
- package/{Modal-Bnz6d9m9.js → Modal-BRZMPwDj.js} +134 -106
- package/Modal-BRZMPwDj.js.map +1 -0
- 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-B6jE3WH_.cjs +253 -0
- package/Select-B6jE3WH_.cjs.map +1 -0
- package/Select-bSVQokFX.js +254 -0
- package/Select-bSVQokFX.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-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-Co31KY2k.cjs → Tab-BbP8jBcK.cjs} +43 -28
- package/Tab-BbP8jBcK.cjs.map +1 -0
- package/Tab-BxSxKJsP.js +111 -0
- package/Tab-BxSxKJsP.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/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.js +1 -1
- package/components/Avatar/index.d.ts +1 -0
- package/components/Button/Button.d.ts +5 -5
- package/components/Button/index.d.ts +1 -0
- package/components/Card/Card.cjs +1 -4
- package/components/Card/Card.cjs.map +1 -1
- package/components/Card/Card.d.ts +3 -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/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 +9 -2
- package/components/Input/Input.helpers.d.ts +3 -3
- 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 +1 -1
- package/components/Modal/Modal.d.ts +20 -5
- package/components/Modal/Modal.js +6 -6
- 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 +2 -0
- 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 +13 -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/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/Tabs.cjs +3 -2
- package/components/Tabs/Tabs.cjs.map +1 -1
- package/components/Tabs/Tabs.d.ts +21 -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 -3
- package/components/Timeline/Timeline.cjs.map +1 -1
- package/components/Timeline/Timeline.d.ts +4 -8
- package/components/Timeline/Timeline.js +2 -2
- package/components/Timeline/Timeline.js.map +1 -1
- package/components/Timeline/index.d.ts +4 -3
- 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 +38 -15
- package/index.cjs.map +1 -1
- package/index.d.ts +3 -0
- package/index.js +33 -19
- package/index.js.map +1 -1
- 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 +28 -42
- 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/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 +0 -447
- package/Select-3CBOfM2H.js.map +0 -1
- package/Select-Bku4f4f8.cjs +0 -446
- 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.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/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
|
@@ -2,7 +2,7 @@ import { default as React } from 'react';
|
|
|
2
2
|
import { SxProps, Theme } from '@mui/material';
|
|
3
3
|
import { DateTimePickerProps as MuiDateTimePickerProps } from '@mui/x-date-pickers/DateTimePicker';
|
|
4
4
|
import { Dayjs } from 'dayjs';
|
|
5
|
-
import {
|
|
5
|
+
import { RegisterOptions } from 'react-hook-form';
|
|
6
6
|
export type LabelPosition = 'outside' | 'floating';
|
|
7
7
|
export type DateTimePickerSize = 'small' | 'medium';
|
|
8
8
|
export interface BaseDateTimePickerProps extends Omit<MuiDateTimePickerProps, 'value' | 'onChange' | 'slotProps' | 'format'> {
|
|
@@ -37,19 +37,23 @@ export interface BaseDateTimePickerProps extends Omit<MuiDateTimePickerProps, 'v
|
|
|
37
37
|
acceptButtonText?: string;
|
|
38
38
|
minutesStep?: number;
|
|
39
39
|
minTime?: Dayjs;
|
|
40
|
-
|
|
41
|
-
viewRenderers?: any;
|
|
42
|
-
timeSteps?: any;
|
|
43
|
-
/** Si es true usa formato 12h, false = 24h. Default: false. */
|
|
40
|
+
/** Si es true usa formato 12h (AM/PM), false = 24h. Default: false. */
|
|
44
41
|
ampm?: boolean;
|
|
42
|
+
viewRenderers?: MuiDateTimePickerProps['viewRenderers'];
|
|
43
|
+
timeSteps?: MuiDateTimePickerProps['timeSteps'];
|
|
45
44
|
textFieldProps?: Record<string, any>;
|
|
46
45
|
/** Passthrough completo a slotProps del MuiDateTimePicker. */
|
|
47
46
|
slotProps?: MuiDateTimePickerProps['slotProps'];
|
|
48
47
|
}
|
|
49
48
|
export interface RHFDateTimePickerProps extends BaseDateTimePickerProps {
|
|
50
49
|
name: string;
|
|
51
|
-
control:
|
|
50
|
+
control: any;
|
|
52
51
|
validation?: RegisterOptions;
|
|
52
|
+
/**
|
|
53
|
+
* Side-effect que corre después de que RHF actualiza el form state.
|
|
54
|
+
* Útil para cascadas entre campos. NO reemplaza al handler de RHF.
|
|
55
|
+
*/
|
|
56
|
+
onValueChange?: (dateTime: Dayjs | null) => void;
|
|
53
57
|
selectedDateTime?: never;
|
|
54
58
|
onDateTimeChange?: never;
|
|
55
59
|
}
|
|
@@ -7,4 +7,6 @@ export declare const DateTimePickerSmallSizeDefinition = "\nimport React, { useS
|
|
|
7
7
|
export declare const DateTimePickerWithButtonsDefinition = "\nimport React, { useState } => from 'react';\nimport { DateTimePicker } from './DateTimePicker'; // Ajusta la ruta si es necesario\nimport dayjs from 'dayjs';\nimport { Box, Typography } from '@mui/material';\n\nexport const DateTimePickerWithButtonsExample = () => {\n const [selectedDateTime, setSelectedDateTime] = useState(dayjs());\n return (\n <Box sx={{ width: 300 }}>\n <DateTimePicker\n label=\"Fecha y Hora (Con Botones por Defecto)\"\n selectedDateTime={selectedDateTime}\n onDateTimeChange={setSelectedDateTime}\n slotProps={{\n actionBar: {\n actions: ['clear', 'cancel', 'accept'],\n },\n }}\n />\n <Typography sx={{ mt: 2 }}>\n Seleccionado: ${selectedDateTime ? selectedDateTime.format('YYYY-MM-DD HH:mm') : 'Ninguna'}\n </Typography>\n </Box>\n );\n};\n";
|
|
8
8
|
export declare const DateTimePickerWithCustomButtonTextDefinition = "\nimport React, { useState } from 'react';\nimport { DateTimePicker } from './DateTimePicker'; // Ajusta la ruta si es necesario\nimport dayjs from 'dayjs';\nimport { Box, Typography } from '@mui/material';\n\nexport const DateTimePickerWithCustomButtonTextExample = () => {\n const [selectedDateTime, setSelectedDateTime] = useState(dayjs());\n return (\n <Box sx={{ width: 300 }}>\n <DateTimePicker\n label=\"Fecha y Hora (Botones Personalizados)\"\n selectedDateTime={selectedDateTime}\n onDateTimeChange={setSelectedDateTime}\n clearButtonText=\"Limpiar Todo\"\n cancelButtonText=\"Descartar\"\n acceptButtonText=\"Confirmar Selecci\u00F3n\"\n slotProps={{\n actionBar: {\n actions: ['clear', 'cancel', 'accept'],\n },\n }}\n />\n <Typography sx={{ mt: 2 }}>\n Seleccionado: ${selectedDateTime ? selectedDateTime.format('YYYY-MM-DD HH:mm') : 'Ninguna'}\n </Typography>\n </Box>\n );\n};\n";
|
|
9
9
|
export declare const DateTimePickerEmptyWithMaskDefinition = "\nimport React, { useState } from 'react';\nimport { DateTimePicker } from './DateTimePicker'; // Ajusta la ruta si es necesario\nimport { Dayjs } from 'dayjs';\nimport { Box, Typography } from '@mui/material';\n\nexport const DateTimePickerEmptyWithMaskExample = () => {\n const [selectedDateTime, setSelectedDateTime] = useState<Dayjs | null>(null);\n return (\n <Box sx={{ width: 300 }}>\n <DateTimePicker\n label=\"Fecha y Hora\"\n selectedDateTime={selectedDateTime}\n onDateTimeChange={setSelectedDateTime}\n inputFormat=\"DD/MM/YY HH:mm\"\n />\n <Typography sx={{ mt: 2 }} variant=\"caption\" color=\"text.secondary\">\n Al estar vac\u00EDo, el campo muestra la m\u00E1scara del formato (DD/MM/AA HH:MM).\n </Typography>\n </Box>\n );\n};\n";
|
|
10
|
+
export declare const DateTimePickerWithAllMinutesDefinition = "\nimport React, { useState } from 'react';\nimport { DateTimePicker } from './DateTimePicker'; // Ajusta la ruta si es necesario\nimport dayjs from 'dayjs';\nimport { renderMultiSectionDigitalClockTimeView } from '@mui/x-date-pickers/timeViewRenderers';\nimport { Box, Typography } from '@mui/material';\n\nexport const DateTimePickerWithAllMinutesExample = () => {\n const [selectedDateTime, setSelectedDateTime] = useState(dayjs('2023-06-15T10:00'));\n return (\n <Box sx={{ width: 300 }}>\n <DateTimePicker\n label=\"Fecha y Hora (Todos los minutos)\"\n selectedDateTime={selectedDateTime}\n onDateTimeChange={setSelectedDateTime}\n viewRenderers={{\n hours: renderMultiSectionDigitalClockTimeView,\n minutes: renderMultiSectionDigitalClockTimeView,\n }}\n minutesStep={1}\n timeSteps={{ minutes: 1 }}\n />\n <Typography sx={{ mt: 2 }}>\n Seleccionado: ${selectedDateTime ? selectedDateTime.format('YYYY-MM-DD HH:mm') : 'Ninguna'}\n </Typography>\n </Box>\n );\n};\n";
|
|
11
|
+
export declare const DateTimePicker24hDefinition = "\nimport React, { useState } from 'react';\nimport { DateTimePicker } from './DateTimePicker'; // Ajusta la ruta si es necesario\nimport dayjs from 'dayjs';\nimport { renderMultiSectionDigitalClockTimeView } from '@mui/x-date-pickers/timeViewRenderers';\nimport { Box, Typography } from '@mui/material';\n\nexport const DateTimePicker24hExample = () => {\n const [selectedDateTime, setSelectedDateTime] = useState(dayjs('2023-06-15T10:00'));\n return (\n <Box sx={{ width: 300 }}>\n <DateTimePicker\n label=\"Fecha y Hora (Formato 24h)\"\n selectedDateTime={selectedDateTime}\n onDateTimeChange={setSelectedDateTime}\n viewRenderers={{\n hours: renderMultiSectionDigitalClockTimeView,\n minutes: renderMultiSectionDigitalClockTimeView,\n }}\n minutesStep={1}\n timeSteps={{ minutes: 1 }}\n ampm={false}\n />\n <Typography sx={{ mt: 2 }}>\n Seleccionado: ${selectedDateTime ? selectedDateTime.format('YYYY-MM-DD HH:mm') : 'Ninguna'}\n </Typography>\n </Box>\n );\n};\n";
|
|
10
12
|
export declare const DateTimePickerWithCustomInputFormatDefinition = "\nimport React, { useState } from 'react';\nimport { DateTimePicker } from './DateTimePicker'; // Ajusta la ruta si es necesario\nimport dayjs from 'dayjs';\nimport { Box, Typography } from '@mui/material';\n\nexport const DateTimePickerWithCustomInputFormatExample = () => {\n const [selectedDateTime, setSelectedDateTime] = useState(dayjs());\n return (\n <Box sx={{ width: 300 }}>\n <DateTimePicker\n label=\"Fecha y Hora (Formato dd/MM/YYYY)\"\n selectedDateTime={selectedDateTime}\n onDateTimeChange={setSelectedDateTime}\n inputFormat=\"DD/MM/YYYY HH:mm\" // Formato de fecha personalizado\n />\n <Typography sx={{ mt: 2 }}>\n Seleccionado: ${selectedDateTime ? selectedDateTime.format('YYYY-MM-DD HH:mm') : 'Ninguna'}\n </Typography>\n </Box>\n );\n};\n";
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DateTimeValidationError } from '@mui/x-date-pickers/models';
|
|
2
2
|
/**
|
|
3
3
|
* Traduce el error del DateTimePicker a un mensaje en español. Se usa
|
|
4
4
|
* internamente para poblar `helperText` cuando hay error de validación.
|
|
5
|
+
* Cubre tanto errores de fecha (`minDate`, `maxDate`, etc.) como de hora
|
|
6
|
+
* (`minTime`, `maxTime`, `minutesStep`, etc.).
|
|
5
7
|
*/
|
|
6
|
-
export declare const getDateTimeValidationMessage: (error:
|
|
8
|
+
export declare const getDateTimeValidationMessage: (error: DateTimeValidationError | null) => string;
|
|
7
9
|
/**
|
|
8
10
|
* Construye el `localeText` que MUI acepta para overridear los labels de los
|
|
9
11
|
* botones del popover (Cancel / OK / Clear).
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { DateTimePicker, default } from './DateTimePicker';
|
|
2
|
-
export type { DateTimePickerProps, BaseDateTimePickerProps, RHFDateTimePickerProps, ControlledDateTimePickerProps, LabelPosition, DateTimePickerSize, } from './DateTimePicker
|
|
2
|
+
export type { DateTimePickerProps, BaseDateTimePickerProps, RHFDateTimePickerProps, ControlledDateTimePickerProps, LabelPosition, DateTimePickerSize, } from './DateTimePicker';
|
|
@@ -61,7 +61,7 @@ function buildDrawerItemSx({
|
|
|
61
61
|
{ duration: 150 }
|
|
62
62
|
),
|
|
63
63
|
"&:hover": {
|
|
64
|
-
backgroundColor: danger ? theme.palette.error.
|
|
64
|
+
backgroundColor: danger ? styles.alpha(theme.palette.error.main, 0.08) : theme.palette.action.hover
|
|
65
65
|
},
|
|
66
66
|
"& .drawer-item__icon": {
|
|
67
67
|
display: "flex",
|
|
@@ -130,8 +130,10 @@ function Drawer({
|
|
|
130
130
|
onClose,
|
|
131
131
|
className,
|
|
132
132
|
sx: rootSx,
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
slotProps: {
|
|
134
|
+
paper: {
|
|
135
|
+
sx: paperSx
|
|
136
|
+
}
|
|
135
137
|
},
|
|
136
138
|
children: [
|
|
137
139
|
(logo || shouldShowToggle) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -209,6 +211,7 @@ function Drawer({
|
|
|
209
211
|
function DrawerItem({
|
|
210
212
|
icon,
|
|
211
213
|
label,
|
|
214
|
+
tooltipText,
|
|
212
215
|
onClick,
|
|
213
216
|
active = false,
|
|
214
217
|
danger = false,
|
|
@@ -241,7 +244,7 @@ function DrawerItem({
|
|
|
241
244
|
className,
|
|
242
245
|
sx: mergedSx,
|
|
243
246
|
children: [
|
|
244
|
-
icon
|
|
247
|
+
icon && /* @__PURE__ */ jsxRuntime.jsx(material.Box, { className: "drawer-item__icon", component: "span", children: icon }),
|
|
245
248
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
246
249
|
material.Typography,
|
|
247
250
|
{
|
|
@@ -256,8 +259,9 @@ function DrawerItem({
|
|
|
256
259
|
]
|
|
257
260
|
}
|
|
258
261
|
);
|
|
259
|
-
|
|
260
|
-
|
|
262
|
+
const resolvedTooltip = tooltipText != null ? tooltipText : typeof label === "string" ? label : void 0;
|
|
263
|
+
if (collapsed && resolvedTooltip) {
|
|
264
|
+
return /* @__PURE__ */ jsxRuntime.jsx(material.Tooltip, { title: resolvedTooltip, placement: "right", arrow: true, children: content });
|
|
261
265
|
}
|
|
262
266
|
return content;
|
|
263
267
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Drawer.cjs","sources":["../../../src/components/Drawer/DrawerContext.ts","../../../src/components/Drawer/Drawer.sx.ts","../../../src/components/Drawer/Drawer.tsx","../../../src/components/Drawer/DrawerItem.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\n/**\n * Context interno del Drawer. Permite que los sub-componentes (DrawerItem,\n * DrawerSection, etc.) reaccionen al estado `collapsed` sin necesidad de\n * recibirlo por props explícitas.\n */\nexport interface DrawerContextValue {\n /** Si el drawer está en modo mini (solo iconos). */\n collapsed: boolean;\n /** Ancho actual del drawer (útil para sub-componentes que necesiten layout). */\n width: number;\n}\n\nexport const DrawerContext = createContext<DrawerContextValue | null>(null);\n\n/**\n * Hook para leer el estado del drawer desde cualquier sub-componente. Si se\n * llama fuera de un `<Drawer>`, devuelve valores por defecto (collapsed=false)\n * para que los items renderizados sueltos no exploten.\n */\nexport function useDrawerContext(): DrawerContextValue {\n const ctx = useContext(DrawerContext);\n if (ctx) return ctx;\n return { collapsed: false, width: 260 };\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface BuildDrawerSxArgs {\n /** Ancho actual del drawer (expanded o collapsed). */\n width: number;\n /** Duración de la transición de ancho en ms. */\n transitionDuration?: number;\n}\n\n/**\n * sx aplicado al root del MuiDrawer. Controla el ancho animado y el paper\n * interno. Los estilos visuales del paper (background, border) se dejan en\n * manos del theme / preset.\n */\nexport function buildDrawerSx({\n width,\n transitionDuration = 200,\n}: BuildDrawerSxArgs): SxProps<Theme> {\n return {\n width,\n flexShrink: 0,\n whiteSpace: 'nowrap',\n boxSizing: 'border-box',\n transition: (theme) =>\n theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: transitionDuration,\n }),\n '& .MuiDrawer-paper': {\n width,\n boxSizing: 'border-box',\n overflowX: 'hidden',\n transition: (theme) =>\n theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: transitionDuration,\n }),\n },\n };\n}\n\nexport interface BuildDrawerItemSxArgs {\n collapsed: boolean;\n active?: boolean;\n danger?: boolean;\n}\n\n/**\n * sx para un item del drawer. Centra el icono cuando está colapsado y\n * tiñe el fondo cuando el item está activo.\n */\nexport function buildDrawerItemSx({\n collapsed,\n active,\n danger,\n}: BuildDrawerItemSxArgs): SxProps<Theme> {\n return (theme) => ({\n minHeight: 44,\n px: collapsed ? 1 : 2,\n py: 1,\n mx: 1,\n my: 0.25,\n borderRadius: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: collapsed ? 'center' : 'flex-start',\n gap: collapsed ? 0 : 1.5,\n cursor: 'pointer',\n color: danger\n ? theme.palette.error.main\n : active\n ? theme.palette.primary.main\n : theme.palette.text.primary,\n backgroundColor: active\n ? theme.palette.action.selected\n : 'transparent',\n transition: theme.transitions.create(\n ['background-color', 'color', 'padding'],\n { duration: 150 },\n ),\n '&:hover': {\n backgroundColor: danger\n ? theme.palette.error.light + '22'\n : theme.palette.action.hover,\n },\n '& .drawer-item__icon': {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n minWidth: 24,\n },\n '& .drawer-item__label': {\n flex: 1,\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n opacity: collapsed ? 0 : 1,\n width: collapsed ? 0 : 'auto',\n transition: theme.transitions.create(['opacity', 'width'], {\n duration: collapsed ? 100 : 200,\n }),\n },\n });\n}\n","import React, { useMemo, type ReactNode } from 'react';\nimport {\n Drawer as MuiDrawer,\n IconButton,\n Box,\n type DrawerProps as MuiDrawerProps,\n} from '@mui/material';\nimport {\n useTheme,\n type SxProps,\n type Theme,\n} from '@mui/material/styles';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\n\nimport { DrawerContext } from './DrawerContext';\nimport { buildDrawerSx } from './Drawer.sx';\nimport { resolvePreset } from '../_shared/resolvePreset';\n\n// ── Tipos públicos ──────────────────────────────────────────────────────\nexport type DrawerVariant = 'permanent' | 'persistent' | 'temporary';\nexport type DrawerAnchor = 'left' | 'right' | 'top' | 'bottom';\n\nexport interface DrawerProps {\n /** Contenido del drawer (típicamente `<DrawerItem>`s). */\n children?: ReactNode;\n /**\n * Variante del drawer:\n * - `permanent` (default): siempre visible en desktop, soporta collapsed (mini).\n * - `persistent`: se oculta/muestra, empuja el contenido principal.\n * - `temporary`: flotante con backdrop (típico móvil).\n */\n variant?: DrawerVariant;\n /** Lado del viewport. Default: `'left'`. */\n anchor?: DrawerAnchor;\n /**\n * Estado mini (solo iconos). Solo se aplica con `variant=\"permanent\"` o\n * `\"persistent\"`. Si no se provee, el drawer está siempre expandido.\n */\n collapsed?: boolean;\n /** Callback del botón de toggle (chevron). */\n onToggleCollapse?: () => void;\n /** Estado abierto/cerrado (aplica a `temporary` y `persistent`). */\n open?: boolean;\n /** Callback de cierre (backdrop o ESC en temporary). */\n onClose?: MuiDrawerProps['onClose'];\n /** Ancho en estado expandido. Default: 260. */\n expandedWidth?: number;\n /** Ancho en estado colapsado (solo iconos). Default: 72. */\n collapsedWidth?: number;\n /** Muestra el botón chevron para toggle collapsed. Default: true si `onToggleCollapse` está definido. */\n showCollapseButton?: boolean;\n /** Contenido del header (por encima de los items). Típicamente logo/brand. */\n header?: ReactNode;\n /**\n * Logo/brand que se muestra junto al botón de toggle.\n * - Expandido: logo a la izquierda, toggle a la derecha en la misma fila.\n * - Colapsado: logo arriba centrado, toggle debajo centrado (stack vertical).\n * Siempre visible (a diferencia de `header`, que se oculta al colapsar).\n */\n logo?: ReactNode;\n /** Contenido del footer (por debajo de los items). Típicamente user profile. */\n footer?: ReactNode;\n /**\n * Nombre del preset de estilo registrado en `theme.styles.Drawer`.\n * - `\"default\"` (o ausente) = estilo built-in del paquete.\n */\n preset?: string;\n /** sx aplicado al Drawer (root). Se mergea después del preset. */\n sx?: SxProps<Theme>;\n /** sx aplicado al Paper interno. */\n paperSx?: SxProps<Theme>;\n className?: string;\n}\n\nexport function Drawer({\n children,\n variant = 'permanent',\n anchor = 'left',\n collapsed = false,\n onToggleCollapse,\n open,\n onClose,\n expandedWidth = 260,\n collapsedWidth = 72,\n showCollapseButton,\n header,\n logo,\n footer,\n preset,\n sx,\n paperSx,\n className,\n}: DrawerProps) {\n const theme = useTheme();\n const presetSx = resolvePreset('Drawer', preset, theme);\n\n // El mini-variant solo tiene sentido en permanent / persistent.\n const supportsCollapsed = variant !== 'temporary';\n const effectiveWidth =\n supportsCollapsed && collapsed ? collapsedWidth : expandedWidth;\n\n const contextValue = useMemo(\n () => ({\n collapsed: supportsCollapsed && collapsed,\n width: effectiveWidth,\n }),\n [supportsCollapsed, collapsed, effectiveWidth],\n );\n\n const rootSx: SxProps<Theme> = [\n buildDrawerSx({ width: effectiveWidth }),\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ];\n\n const shouldShowToggle =\n showCollapseButton ?? (supportsCollapsed && !!onToggleCollapse);\n\n const openProp =\n variant === 'permanent'\n ? true\n : open !== undefined\n ? open\n : false;\n\n return (\n <DrawerContext.Provider value={contextValue}>\n <MuiDrawer\n variant={variant}\n anchor={anchor}\n open={openProp}\n onClose={onClose}\n className={className}\n sx={rootSx}\n PaperProps={{\n sx: paperSx,\n }}\n >\n {(logo || shouldShowToggle) && (\n <Box\n sx={{\n display: 'flex',\n flexDirection: contextValue.collapsed ? 'column' : 'row',\n alignItems: 'center',\n justifyContent: contextValue.collapsed\n ? 'center'\n : logo\n ? 'space-between'\n : 'flex-end',\n gap: contextValue.collapsed ? 0.5 : 0,\n px: contextValue.collapsed ? 1 : 2,\n py: 1,\n minHeight: 64,\n flexShrink: 0,\n }}\n >\n {logo && (\n <Box sx={{ display: 'flex', alignItems: 'center', minWidth: 0 }}>\n {logo}\n </Box>\n )}\n {shouldShowToggle && (\n <IconButton\n size=\"small\"\n onClick={onToggleCollapse}\n aria-label={collapsed ? 'Expandir menú' : 'Colapsar menú'}\n >\n {collapsed ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </IconButton>\n )}\n </Box>\n )}\n\n {header && !contextValue.collapsed && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n px: 2,\n py: 1.5,\n minHeight: 56,\n flexShrink: 0,\n }}\n >\n <Box sx={{ flex: 1, minWidth: 0 }}>{header}</Box>\n </Box>\n )}\n\n <Box\n component=\"nav\"\n sx={{\n flex: 1,\n overflowY: 'auto',\n overflowX: 'hidden',\n py: 1,\n }}\n >\n {children}\n </Box>\n\n {footer && (\n <Box\n sx={{\n flexShrink: 0,\n borderTop: (t) => `1px solid ${t.palette.divider}`,\n p: contextValue.collapsed ? 1 : 1.5,\n display: 'flex',\n justifyContent: contextValue.collapsed\n ? 'center'\n : 'flex-start',\n }}\n >\n {footer}\n </Box>\n )}\n </MuiDrawer>\n </DrawerContext.Provider>\n );\n}\n\nexport default Drawer;\n","import React, { type ReactNode, type MouseEvent } from 'react';\nimport { Box, Tooltip, Typography } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { useDrawerContext } from './DrawerContext';\nimport { buildDrawerItemSx } from './Drawer.sx';\n\nexport interface DrawerItemProps {\n /** Icono del item. Se muestra siempre (expanded y collapsed). */\n icon?: ReactNode;\n /** Texto del item. Se oculta cuando el drawer está colapsado (muestra tooltip). */\n label: ReactNode;\n /** Handler de click. */\n onClick?: (event: MouseEvent<HTMLDivElement>) => void;\n /** Marca el item como activo (destaca color y fondo). */\n active?: boolean;\n /** Marca el item como \"destructivo\" (p.ej. cerrar sesión): color error. */\n danger?: boolean;\n /** Deshabilita click + bajo opacidad. */\n disabled?: boolean;\n /** Contenido adicional a la derecha del label (badge, count, chevron). */\n endAdornment?: ReactNode;\n /** sx override del consumer, se mergea al final. */\n sx?: SxProps<Theme>;\n className?: string;\n}\n\n/**\n * Item de un Drawer de shared-library. Lee el estado `collapsed` del\n * DrawerContext para adaptar layout y mostrar tooltip en modo mini.\n *\n * Uso típico:\n * ```tsx\n * <Drawer collapsed={collapsed} onToggleCollapse={toggle}>\n * <DrawerItem icon={<HomeIcon />} label=\"Inicio\" active />\n * <DrawerItem icon={<UserIcon />} label=\"Perfil\" />\n * </Drawer>\n * ```\n */\nexport function DrawerItem({\n icon,\n label,\n onClick,\n active = false,\n danger = false,\n disabled = false,\n endAdornment,\n sx,\n className,\n}: DrawerItemProps) {\n const { collapsed } = useDrawerContext();\n\n const baseSx = buildDrawerItemSx({ collapsed, active, danger });\n\n const mergedSx: SxProps<Theme> = [\n baseSx,\n disabled && { pointerEvents: 'none', opacity: 0.5 },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ].filter(Boolean) as SxProps<Theme>;\n\n const content = (\n <Box\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n onClick={disabled ? undefined : onClick}\n onKeyDown={(event) => {\n if (disabled) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onClick?.(event as unknown as MouseEvent<HTMLDivElement>);\n }\n }}\n className={className}\n sx={mergedSx}\n >\n {icon !== undefined && (\n <Box className=\"drawer-item__icon\" component=\"span\">\n {icon}\n </Box>\n )}\n <Typography\n component=\"span\"\n variant=\"body2\"\n className=\"drawer-item__label\"\n sx={{ fontWeight: active ? 600 : 400 }}\n >\n {label}\n </Typography>\n {!collapsed && endAdornment && (\n <Box component=\"span\" sx={{ flexShrink: 0, ml: 'auto' }}>\n {endAdornment}\n </Box>\n )}\n </Box>\n );\n\n // Cuando está colapsado, envolvemos en tooltip para revelar el label al hover.\n if (collapsed && typeof label === 'string') {\n return (\n <Tooltip title={label} placement=\"right\" arrow>\n {content}\n </Tooltip>\n );\n }\n\n return content;\n}\n\nexport default DrawerItem;\n"],"names":["createContext","useContext","useTheme","resolvePreset","useMemo","jsx","jsxs","MuiDrawer","Box","IconButton","Typography","Tooltip"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Drawer.cjs","sources":["../../../src/components/Drawer/DrawerContext.ts","../../../src/components/Drawer/Drawer.sx.ts","../../../src/components/Drawer/Drawer.tsx","../../../src/components/Drawer/DrawerItem.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\n/**\n * Context interno del Drawer. Permite que los sub-componentes (DrawerItem,\n * DrawerSection, etc.) reaccionen al estado `collapsed` sin necesidad de\n * recibirlo por props explícitas.\n */\nexport interface DrawerContextValue {\n /** Si el drawer está en modo mini (solo iconos). */\n collapsed: boolean;\n /** Ancho actual del drawer (útil para sub-componentes que necesiten layout). */\n width: number;\n}\n\nexport const DrawerContext = createContext<DrawerContextValue | null>(null);\n\n/**\n * Hook para leer el estado del drawer desde cualquier sub-componente. Si se\n * llama fuera de un `<Drawer>`, devuelve valores por defecto (collapsed=false)\n * para que los items renderizados sueltos no exploten.\n */\nexport function useDrawerContext(): DrawerContextValue {\n const ctx = useContext(DrawerContext);\n if (ctx) return ctx;\n return { collapsed: false, width: 260 };\n}\n","import { alpha, type SxProps, type Theme } from '@mui/material/styles';\n\nexport interface BuildDrawerSxArgs {\n /** Ancho actual del drawer (expanded o collapsed). */\n width: number;\n /** Duración de la transición de ancho en ms. */\n transitionDuration?: number;\n}\n\n/**\n * sx aplicado al root del MuiDrawer. Controla el ancho animado y el paper\n * interno. Los estilos visuales del paper (background, border) se dejan en\n * manos del theme / preset.\n */\nexport function buildDrawerSx({\n width,\n transitionDuration = 200,\n}: BuildDrawerSxArgs): SxProps<Theme> {\n return {\n width,\n flexShrink: 0,\n whiteSpace: 'nowrap',\n boxSizing: 'border-box',\n transition: (theme) =>\n theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: transitionDuration,\n }),\n '& .MuiDrawer-paper': {\n width,\n boxSizing: 'border-box',\n overflowX: 'hidden',\n transition: (theme) =>\n theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: transitionDuration,\n }),\n },\n };\n}\n\nexport interface BuildDrawerItemSxArgs {\n collapsed: boolean;\n active?: boolean;\n danger?: boolean;\n}\n\n/**\n * sx para un item del drawer. Centra el icono cuando está colapsado y\n * tiñe el fondo cuando el item está activo.\n */\nexport function buildDrawerItemSx({\n collapsed,\n active,\n danger,\n}: BuildDrawerItemSxArgs): SxProps<Theme> {\n return (theme) => ({\n minHeight: 44,\n px: collapsed ? 1 : 2,\n py: 1,\n mx: 1,\n my: 0.25,\n borderRadius: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: collapsed ? 'center' : 'flex-start',\n gap: collapsed ? 0 : 1.5,\n cursor: 'pointer',\n color: danger\n ? theme.palette.error.main\n : active\n ? theme.palette.primary.main\n : theme.palette.text.primary,\n backgroundColor: active\n ? theme.palette.action.selected\n : 'transparent',\n transition: theme.transitions.create(\n ['background-color', 'color', 'padding'],\n { duration: 150 },\n ),\n '&:hover': {\n backgroundColor: danger\n ? alpha(theme.palette.error.main, 0.08)\n : theme.palette.action.hover,\n },\n '& .drawer-item__icon': {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n minWidth: 24,\n },\n '& .drawer-item__label': {\n flex: 1,\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n opacity: collapsed ? 0 : 1,\n width: collapsed ? 0 : 'auto',\n transition: theme.transitions.create(['opacity', 'width'], {\n duration: collapsed ? 100 : 200,\n }),\n },\n });\n}\n","import { useMemo, type ReactNode } from 'react';\nimport {\n Drawer as MuiDrawer,\n IconButton,\n Box,\n type DrawerProps as MuiDrawerProps,\n} from '@mui/material';\nimport {\n useTheme,\n type SxProps,\n type Theme,\n} from '@mui/material/styles';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\n\nimport { DrawerContext } from './DrawerContext';\nimport { buildDrawerSx } from './Drawer.sx';\nimport { resolvePreset } from '../_shared/resolvePreset';\n\n// ── Tipos públicos ──────────────────────────────────────────────────────\nexport type DrawerVariant = 'permanent' | 'persistent' | 'temporary';\nexport type DrawerAnchor = 'left' | 'right' | 'top' | 'bottom';\n\nexport interface DrawerProps {\n /** Contenido del drawer (típicamente `<DrawerItem>`s). */\n children?: ReactNode;\n /**\n * Variante del drawer:\n * - `permanent` (default): siempre visible en desktop, soporta collapsed (mini).\n * - `persistent`: se oculta/muestra, empuja el contenido principal.\n * - `temporary`: flotante con backdrop (típico móvil).\n */\n variant?: DrawerVariant;\n /** Lado del viewport. Default: `'left'`. */\n anchor?: DrawerAnchor;\n /**\n * Estado mini (solo iconos). Solo se aplica con `variant=\"permanent\"` o\n * `\"persistent\"`. Si no se provee, el drawer está siempre expandido.\n */\n collapsed?: boolean;\n /** Callback del botón de toggle (chevron). */\n onToggleCollapse?: () => void;\n /** Estado abierto/cerrado (aplica a `temporary` y `persistent`). */\n open?: boolean;\n /** Callback de cierre (backdrop o ESC en temporary). */\n onClose?: MuiDrawerProps['onClose'];\n /** Ancho en estado expandido. Default: 260. */\n expandedWidth?: number;\n /** Ancho en estado colapsado (solo iconos). Default: 72. */\n collapsedWidth?: number;\n /** Muestra el botón chevron para toggle collapsed. Default: true si `onToggleCollapse` está definido. */\n showCollapseButton?: boolean;\n /** Contenido del header (por encima de los items). Típicamente logo/brand. */\n header?: ReactNode;\n /**\n * Logo/brand que se muestra junto al botón de toggle.\n * - Expandido: logo a la izquierda, toggle a la derecha en la misma fila.\n * - Colapsado: logo arriba centrado, toggle debajo centrado (stack vertical).\n * Siempre visible (a diferencia de `header`, que se oculta al colapsar).\n */\n logo?: ReactNode;\n /** Contenido del footer (por debajo de los items). Típicamente user profile. */\n footer?: ReactNode;\n /**\n * Nombre del preset de estilo registrado en `theme.styles.Drawer`.\n * - `\"default\"` (o ausente) = estilo built-in del paquete.\n */\n preset?: string;\n /** sx aplicado al Drawer (root). Se mergea después del preset. */\n sx?: SxProps<Theme>;\n /** sx aplicado al Paper interno. */\n paperSx?: SxProps<Theme>;\n className?: string;\n}\n\nexport function Drawer({\n children,\n variant = 'permanent',\n anchor = 'left',\n collapsed = false,\n onToggleCollapse,\n open,\n onClose,\n expandedWidth = 260,\n collapsedWidth = 72,\n showCollapseButton,\n header,\n logo,\n footer,\n preset,\n sx,\n paperSx,\n className,\n}: DrawerProps) {\n const theme = useTheme();\n const presetSx = resolvePreset('Drawer', preset, theme);\n\n // El mini-variant solo tiene sentido en permanent / persistent.\n const supportsCollapsed = variant !== 'temporary';\n const effectiveWidth =\n supportsCollapsed && collapsed ? collapsedWidth : expandedWidth;\n\n const contextValue = useMemo(\n () => ({\n collapsed: supportsCollapsed && collapsed,\n width: effectiveWidth,\n }),\n [supportsCollapsed, collapsed, effectiveWidth],\n );\n\n const rootSx: SxProps<Theme> = [\n buildDrawerSx({ width: effectiveWidth }),\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ];\n\n const shouldShowToggle =\n showCollapseButton ?? (supportsCollapsed && !!onToggleCollapse);\n\n const openProp =\n variant === 'permanent'\n ? true\n : open !== undefined\n ? open\n : false;\n\n return (\n <DrawerContext.Provider value={contextValue}>\n <MuiDrawer\n variant={variant}\n anchor={anchor}\n open={openProp}\n onClose={onClose}\n className={className}\n sx={rootSx}\n slotProps={{\n paper: {\n sx: paperSx,\n },\n }}\n >\n {(logo || shouldShowToggle) && (\n <Box\n sx={{\n display: 'flex',\n flexDirection: contextValue.collapsed ? 'column' : 'row',\n alignItems: 'center',\n justifyContent: contextValue.collapsed\n ? 'center'\n : logo\n ? 'space-between'\n : 'flex-end',\n gap: contextValue.collapsed ? 0.5 : 0,\n px: contextValue.collapsed ? 1 : 2,\n py: 1,\n minHeight: 64,\n flexShrink: 0,\n }}\n >\n {logo && (\n <Box sx={{ display: 'flex', alignItems: 'center', minWidth: 0 }}>\n {logo}\n </Box>\n )}\n {shouldShowToggle && (\n <IconButton\n size=\"small\"\n onClick={onToggleCollapse}\n aria-label={collapsed ? 'Expandir menú' : 'Colapsar menú'}\n >\n {collapsed ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </IconButton>\n )}\n </Box>\n )}\n\n {header && !contextValue.collapsed && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n px: 2,\n py: 1.5,\n minHeight: 56,\n flexShrink: 0,\n }}\n >\n <Box sx={{ flex: 1, minWidth: 0 }}>{header}</Box>\n </Box>\n )}\n\n <Box\n component=\"nav\"\n sx={{\n flex: 1,\n overflowY: 'auto',\n overflowX: 'hidden',\n py: 1,\n }}\n >\n {children}\n </Box>\n\n {footer && (\n <Box\n sx={{\n flexShrink: 0,\n borderTop: (t) => `1px solid ${t.palette.divider}`,\n p: contextValue.collapsed ? 1 : 1.5,\n display: 'flex',\n justifyContent: contextValue.collapsed\n ? 'center'\n : 'flex-start',\n }}\n >\n {footer}\n </Box>\n )}\n </MuiDrawer>\n </DrawerContext.Provider>\n );\n}\n\nexport default Drawer;\n","import React, { type ReactNode, type MouseEvent } from 'react';\nimport { Box, Tooltip, Typography } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { useDrawerContext } from './DrawerContext';\nimport { buildDrawerItemSx } from './Drawer.sx';\n\nexport interface DrawerItemProps {\n /** Icono del item. Se muestra siempre (expanded y collapsed). */\n icon?: ReactNode;\n /** Texto del item. Se oculta cuando el drawer está colapsado (muestra tooltip). */\n label: ReactNode;\n /**\n * Texto del tooltip en modo collapsed. Si no se provee y `label` es string,\n * se usa `label`. Necesario cuando `label` es un ReactNode complejo.\n */\n tooltipText?: string;\n /** Handler de click. */\n onClick?: (event: MouseEvent<HTMLDivElement>) => void;\n /** Marca el item como activo (destaca color y fondo). */\n active?: boolean;\n /** Marca el item como \"destructivo\" (p.ej. cerrar sesión): color error. */\n danger?: boolean;\n /** Deshabilita click + bajo opacidad. */\n disabled?: boolean;\n /** Contenido adicional a la derecha del label (badge, count, chevron). */\n endAdornment?: ReactNode;\n /** sx override del consumer, se mergea al final. */\n sx?: SxProps<Theme>;\n className?: string;\n}\n\n/**\n * Item de un Drawer de shared-library. Lee el estado `collapsed` del\n * DrawerContext para adaptar layout y mostrar tooltip en modo mini.\n *\n * Uso típico:\n * ```tsx\n * <Drawer collapsed={collapsed} onToggleCollapse={toggle}>\n * <DrawerItem icon={<HomeIcon />} label=\"Inicio\" active />\n * <DrawerItem icon={<UserIcon />} label=\"Perfil\" />\n * </Drawer>\n * ```\n */\nexport function DrawerItem({\n icon,\n label,\n tooltipText,\n onClick,\n active = false,\n danger = false,\n disabled = false,\n endAdornment,\n sx,\n className,\n}: DrawerItemProps) {\n const { collapsed } = useDrawerContext();\n\n const baseSx = buildDrawerItemSx({ collapsed, active, danger });\n\n const mergedSx: SxProps<Theme> = [\n baseSx,\n disabled && { pointerEvents: 'none', opacity: 0.5 },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ].filter(Boolean) as SxProps<Theme>;\n\n const content = (\n <Box\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n onClick={disabled ? undefined : onClick}\n onKeyDown={(event) => {\n if (disabled) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onClick?.(event as unknown as MouseEvent<HTMLDivElement>);\n }\n }}\n className={className}\n sx={mergedSx}\n >\n {icon && (\n <Box className=\"drawer-item__icon\" component=\"span\">\n {icon}\n </Box>\n )}\n <Typography\n component=\"span\"\n variant=\"body2\"\n className=\"drawer-item__label\"\n sx={{ fontWeight: active ? 600 : 400 }}\n >\n {label}\n </Typography>\n {!collapsed && endAdornment && (\n <Box component=\"span\" sx={{ flexShrink: 0, ml: 'auto' }}>\n {endAdornment}\n </Box>\n )}\n </Box>\n );\n\n // Cuando está colapsado, envolvemos en tooltip para revelar el label al hover.\n // Prioriza `tooltipText` explícito; si no, cae al `label` si es string.\n const resolvedTooltip =\n tooltipText ?? (typeof label === 'string' ? label : undefined);\n\n if (collapsed && resolvedTooltip) {\n return (\n <Tooltip title={resolvedTooltip} placement=\"right\" arrow>\n {content}\n </Tooltip>\n );\n }\n\n return content;\n}\n\nexport default DrawerItem;\n"],"names":["createContext","useContext","alpha","useTheme","resolvePreset","useMemo","jsx","jsxs","MuiDrawer","Box","IconButton","Typography","Tooltip"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { createContext, useContext, useMemo } from "react";
|
|
3
3
|
import { Drawer as Drawer$1, Box, IconButton, Tooltip, Typography } from "@mui/material";
|
|
4
|
-
import { useTheme } from "@mui/material/styles";
|
|
4
|
+
import { alpha, useTheme } from "@mui/material/styles";
|
|
5
5
|
import ChevronLeftIcon from "@mui/icons-material/ChevronLeft";
|
|
6
6
|
import ChevronRightIcon from "@mui/icons-material/ChevronRight";
|
|
7
7
|
import { r as resolvePreset } from "../../resolvePreset-K6_BfWHD.js";
|
|
@@ -59,7 +59,7 @@ function buildDrawerItemSx({
|
|
|
59
59
|
{ duration: 150 }
|
|
60
60
|
),
|
|
61
61
|
"&:hover": {
|
|
62
|
-
backgroundColor: danger ? theme.palette.error.
|
|
62
|
+
backgroundColor: danger ? alpha(theme.palette.error.main, 0.08) : theme.palette.action.hover
|
|
63
63
|
},
|
|
64
64
|
"& .drawer-item__icon": {
|
|
65
65
|
display: "flex",
|
|
@@ -128,8 +128,10 @@ function Drawer({
|
|
|
128
128
|
onClose,
|
|
129
129
|
className,
|
|
130
130
|
sx: rootSx,
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
slotProps: {
|
|
132
|
+
paper: {
|
|
133
|
+
sx: paperSx
|
|
134
|
+
}
|
|
133
135
|
},
|
|
134
136
|
children: [
|
|
135
137
|
(logo || shouldShowToggle) && /* @__PURE__ */ jsxs(
|
|
@@ -207,6 +209,7 @@ function Drawer({
|
|
|
207
209
|
function DrawerItem({
|
|
208
210
|
icon,
|
|
209
211
|
label,
|
|
212
|
+
tooltipText,
|
|
210
213
|
onClick,
|
|
211
214
|
active = false,
|
|
212
215
|
danger = false,
|
|
@@ -239,7 +242,7 @@ function DrawerItem({
|
|
|
239
242
|
className,
|
|
240
243
|
sx: mergedSx,
|
|
241
244
|
children: [
|
|
242
|
-
icon
|
|
245
|
+
icon && /* @__PURE__ */ jsx(Box, { className: "drawer-item__icon", component: "span", children: icon }),
|
|
243
246
|
/* @__PURE__ */ jsx(
|
|
244
247
|
Typography,
|
|
245
248
|
{
|
|
@@ -254,8 +257,9 @@ function DrawerItem({
|
|
|
254
257
|
]
|
|
255
258
|
}
|
|
256
259
|
);
|
|
257
|
-
|
|
258
|
-
|
|
260
|
+
const resolvedTooltip = tooltipText != null ? tooltipText : typeof label === "string" ? label : void 0;
|
|
261
|
+
if (collapsed && resolvedTooltip) {
|
|
262
|
+
return /* @__PURE__ */ jsx(Tooltip, { title: resolvedTooltip, placement: "right", arrow: true, children: content });
|
|
259
263
|
}
|
|
260
264
|
return content;
|
|
261
265
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Drawer.js","sources":["../../../src/components/Drawer/DrawerContext.ts","../../../src/components/Drawer/Drawer.sx.ts","../../../src/components/Drawer/Drawer.tsx","../../../src/components/Drawer/DrawerItem.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\n/**\n * Context interno del Drawer. Permite que los sub-componentes (DrawerItem,\n * DrawerSection, etc.) reaccionen al estado `collapsed` sin necesidad de\n * recibirlo por props explícitas.\n */\nexport interface DrawerContextValue {\n /** Si el drawer está en modo mini (solo iconos). */\n collapsed: boolean;\n /** Ancho actual del drawer (útil para sub-componentes que necesiten layout). */\n width: number;\n}\n\nexport const DrawerContext = createContext<DrawerContextValue | null>(null);\n\n/**\n * Hook para leer el estado del drawer desde cualquier sub-componente. Si se\n * llama fuera de un `<Drawer>`, devuelve valores por defecto (collapsed=false)\n * para que los items renderizados sueltos no exploten.\n */\nexport function useDrawerContext(): DrawerContextValue {\n const ctx = useContext(DrawerContext);\n if (ctx) return ctx;\n return { collapsed: false, width: 260 };\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface BuildDrawerSxArgs {\n /** Ancho actual del drawer (expanded o collapsed). */\n width: number;\n /** Duración de la transición de ancho en ms. */\n transitionDuration?: number;\n}\n\n/**\n * sx aplicado al root del MuiDrawer. Controla el ancho animado y el paper\n * interno. Los estilos visuales del paper (background, border) se dejan en\n * manos del theme / preset.\n */\nexport function buildDrawerSx({\n width,\n transitionDuration = 200,\n}: BuildDrawerSxArgs): SxProps<Theme> {\n return {\n width,\n flexShrink: 0,\n whiteSpace: 'nowrap',\n boxSizing: 'border-box',\n transition: (theme) =>\n theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: transitionDuration,\n }),\n '& .MuiDrawer-paper': {\n width,\n boxSizing: 'border-box',\n overflowX: 'hidden',\n transition: (theme) =>\n theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: transitionDuration,\n }),\n },\n };\n}\n\nexport interface BuildDrawerItemSxArgs {\n collapsed: boolean;\n active?: boolean;\n danger?: boolean;\n}\n\n/**\n * sx para un item del drawer. Centra el icono cuando está colapsado y\n * tiñe el fondo cuando el item está activo.\n */\nexport function buildDrawerItemSx({\n collapsed,\n active,\n danger,\n}: BuildDrawerItemSxArgs): SxProps<Theme> {\n return (theme) => ({\n minHeight: 44,\n px: collapsed ? 1 : 2,\n py: 1,\n mx: 1,\n my: 0.25,\n borderRadius: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: collapsed ? 'center' : 'flex-start',\n gap: collapsed ? 0 : 1.5,\n cursor: 'pointer',\n color: danger\n ? theme.palette.error.main\n : active\n ? theme.palette.primary.main\n : theme.palette.text.primary,\n backgroundColor: active\n ? theme.palette.action.selected\n : 'transparent',\n transition: theme.transitions.create(\n ['background-color', 'color', 'padding'],\n { duration: 150 },\n ),\n '&:hover': {\n backgroundColor: danger\n ? theme.palette.error.light + '22'\n : theme.palette.action.hover,\n },\n '& .drawer-item__icon': {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n minWidth: 24,\n },\n '& .drawer-item__label': {\n flex: 1,\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n opacity: collapsed ? 0 : 1,\n width: collapsed ? 0 : 'auto',\n transition: theme.transitions.create(['opacity', 'width'], {\n duration: collapsed ? 100 : 200,\n }),\n },\n });\n}\n","import React, { useMemo, type ReactNode } from 'react';\nimport {\n Drawer as MuiDrawer,\n IconButton,\n Box,\n type DrawerProps as MuiDrawerProps,\n} from '@mui/material';\nimport {\n useTheme,\n type SxProps,\n type Theme,\n} from '@mui/material/styles';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\n\nimport { DrawerContext } from './DrawerContext';\nimport { buildDrawerSx } from './Drawer.sx';\nimport { resolvePreset } from '../_shared/resolvePreset';\n\n// ── Tipos públicos ──────────────────────────────────────────────────────\nexport type DrawerVariant = 'permanent' | 'persistent' | 'temporary';\nexport type DrawerAnchor = 'left' | 'right' | 'top' | 'bottom';\n\nexport interface DrawerProps {\n /** Contenido del drawer (típicamente `<DrawerItem>`s). */\n children?: ReactNode;\n /**\n * Variante del drawer:\n * - `permanent` (default): siempre visible en desktop, soporta collapsed (mini).\n * - `persistent`: se oculta/muestra, empuja el contenido principal.\n * - `temporary`: flotante con backdrop (típico móvil).\n */\n variant?: DrawerVariant;\n /** Lado del viewport. Default: `'left'`. */\n anchor?: DrawerAnchor;\n /**\n * Estado mini (solo iconos). Solo se aplica con `variant=\"permanent\"` o\n * `\"persistent\"`. Si no se provee, el drawer está siempre expandido.\n */\n collapsed?: boolean;\n /** Callback del botón de toggle (chevron). */\n onToggleCollapse?: () => void;\n /** Estado abierto/cerrado (aplica a `temporary` y `persistent`). */\n open?: boolean;\n /** Callback de cierre (backdrop o ESC en temporary). */\n onClose?: MuiDrawerProps['onClose'];\n /** Ancho en estado expandido. Default: 260. */\n expandedWidth?: number;\n /** Ancho en estado colapsado (solo iconos). Default: 72. */\n collapsedWidth?: number;\n /** Muestra el botón chevron para toggle collapsed. Default: true si `onToggleCollapse` está definido. */\n showCollapseButton?: boolean;\n /** Contenido del header (por encima de los items). Típicamente logo/brand. */\n header?: ReactNode;\n /**\n * Logo/brand que se muestra junto al botón de toggle.\n * - Expandido: logo a la izquierda, toggle a la derecha en la misma fila.\n * - Colapsado: logo arriba centrado, toggle debajo centrado (stack vertical).\n * Siempre visible (a diferencia de `header`, que se oculta al colapsar).\n */\n logo?: ReactNode;\n /** Contenido del footer (por debajo de los items). Típicamente user profile. */\n footer?: ReactNode;\n /**\n * Nombre del preset de estilo registrado en `theme.styles.Drawer`.\n * - `\"default\"` (o ausente) = estilo built-in del paquete.\n */\n preset?: string;\n /** sx aplicado al Drawer (root). Se mergea después del preset. */\n sx?: SxProps<Theme>;\n /** sx aplicado al Paper interno. */\n paperSx?: SxProps<Theme>;\n className?: string;\n}\n\nexport function Drawer({\n children,\n variant = 'permanent',\n anchor = 'left',\n collapsed = false,\n onToggleCollapse,\n open,\n onClose,\n expandedWidth = 260,\n collapsedWidth = 72,\n showCollapseButton,\n header,\n logo,\n footer,\n preset,\n sx,\n paperSx,\n className,\n}: DrawerProps) {\n const theme = useTheme();\n const presetSx = resolvePreset('Drawer', preset, theme);\n\n // El mini-variant solo tiene sentido en permanent / persistent.\n const supportsCollapsed = variant !== 'temporary';\n const effectiveWidth =\n supportsCollapsed && collapsed ? collapsedWidth : expandedWidth;\n\n const contextValue = useMemo(\n () => ({\n collapsed: supportsCollapsed && collapsed,\n width: effectiveWidth,\n }),\n [supportsCollapsed, collapsed, effectiveWidth],\n );\n\n const rootSx: SxProps<Theme> = [\n buildDrawerSx({ width: effectiveWidth }),\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ];\n\n const shouldShowToggle =\n showCollapseButton ?? (supportsCollapsed && !!onToggleCollapse);\n\n const openProp =\n variant === 'permanent'\n ? true\n : open !== undefined\n ? open\n : false;\n\n return (\n <DrawerContext.Provider value={contextValue}>\n <MuiDrawer\n variant={variant}\n anchor={anchor}\n open={openProp}\n onClose={onClose}\n className={className}\n sx={rootSx}\n PaperProps={{\n sx: paperSx,\n }}\n >\n {(logo || shouldShowToggle) && (\n <Box\n sx={{\n display: 'flex',\n flexDirection: contextValue.collapsed ? 'column' : 'row',\n alignItems: 'center',\n justifyContent: contextValue.collapsed\n ? 'center'\n : logo\n ? 'space-between'\n : 'flex-end',\n gap: contextValue.collapsed ? 0.5 : 0,\n px: contextValue.collapsed ? 1 : 2,\n py: 1,\n minHeight: 64,\n flexShrink: 0,\n }}\n >\n {logo && (\n <Box sx={{ display: 'flex', alignItems: 'center', minWidth: 0 }}>\n {logo}\n </Box>\n )}\n {shouldShowToggle && (\n <IconButton\n size=\"small\"\n onClick={onToggleCollapse}\n aria-label={collapsed ? 'Expandir menú' : 'Colapsar menú'}\n >\n {collapsed ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </IconButton>\n )}\n </Box>\n )}\n\n {header && !contextValue.collapsed && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n px: 2,\n py: 1.5,\n minHeight: 56,\n flexShrink: 0,\n }}\n >\n <Box sx={{ flex: 1, minWidth: 0 }}>{header}</Box>\n </Box>\n )}\n\n <Box\n component=\"nav\"\n sx={{\n flex: 1,\n overflowY: 'auto',\n overflowX: 'hidden',\n py: 1,\n }}\n >\n {children}\n </Box>\n\n {footer && (\n <Box\n sx={{\n flexShrink: 0,\n borderTop: (t) => `1px solid ${t.palette.divider}`,\n p: contextValue.collapsed ? 1 : 1.5,\n display: 'flex',\n justifyContent: contextValue.collapsed\n ? 'center'\n : 'flex-start',\n }}\n >\n {footer}\n </Box>\n )}\n </MuiDrawer>\n </DrawerContext.Provider>\n );\n}\n\nexport default Drawer;\n","import React, { type ReactNode, type MouseEvent } from 'react';\nimport { Box, Tooltip, Typography } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { useDrawerContext } from './DrawerContext';\nimport { buildDrawerItemSx } from './Drawer.sx';\n\nexport interface DrawerItemProps {\n /** Icono del item. Se muestra siempre (expanded y collapsed). */\n icon?: ReactNode;\n /** Texto del item. Se oculta cuando el drawer está colapsado (muestra tooltip). */\n label: ReactNode;\n /** Handler de click. */\n onClick?: (event: MouseEvent<HTMLDivElement>) => void;\n /** Marca el item como activo (destaca color y fondo). */\n active?: boolean;\n /** Marca el item como \"destructivo\" (p.ej. cerrar sesión): color error. */\n danger?: boolean;\n /** Deshabilita click + bajo opacidad. */\n disabled?: boolean;\n /** Contenido adicional a la derecha del label (badge, count, chevron). */\n endAdornment?: ReactNode;\n /** sx override del consumer, se mergea al final. */\n sx?: SxProps<Theme>;\n className?: string;\n}\n\n/**\n * Item de un Drawer de shared-library. Lee el estado `collapsed` del\n * DrawerContext para adaptar layout y mostrar tooltip en modo mini.\n *\n * Uso típico:\n * ```tsx\n * <Drawer collapsed={collapsed} onToggleCollapse={toggle}>\n * <DrawerItem icon={<HomeIcon />} label=\"Inicio\" active />\n * <DrawerItem icon={<UserIcon />} label=\"Perfil\" />\n * </Drawer>\n * ```\n */\nexport function DrawerItem({\n icon,\n label,\n onClick,\n active = false,\n danger = false,\n disabled = false,\n endAdornment,\n sx,\n className,\n}: DrawerItemProps) {\n const { collapsed } = useDrawerContext();\n\n const baseSx = buildDrawerItemSx({ collapsed, active, danger });\n\n const mergedSx: SxProps<Theme> = [\n baseSx,\n disabled && { pointerEvents: 'none', opacity: 0.5 },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ].filter(Boolean) as SxProps<Theme>;\n\n const content = (\n <Box\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n onClick={disabled ? undefined : onClick}\n onKeyDown={(event) => {\n if (disabled) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onClick?.(event as unknown as MouseEvent<HTMLDivElement>);\n }\n }}\n className={className}\n sx={mergedSx}\n >\n {icon !== undefined && (\n <Box className=\"drawer-item__icon\" component=\"span\">\n {icon}\n </Box>\n )}\n <Typography\n component=\"span\"\n variant=\"body2\"\n className=\"drawer-item__label\"\n sx={{ fontWeight: active ? 600 : 400 }}\n >\n {label}\n </Typography>\n {!collapsed && endAdornment && (\n <Box component=\"span\" sx={{ flexShrink: 0, ml: 'auto' }}>\n {endAdornment}\n </Box>\n )}\n </Box>\n );\n\n // Cuando está colapsado, envolvemos en tooltip para revelar el label al hover.\n if (collapsed && typeof label === 'string') {\n return (\n <Tooltip title={label} placement=\"right\" arrow>\n {content}\n </Tooltip>\n );\n }\n\n return content;\n}\n\nexport default DrawerItem;\n"],"names":["MuiDrawer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Drawer.js","sources":["../../../src/components/Drawer/DrawerContext.ts","../../../src/components/Drawer/Drawer.sx.ts","../../../src/components/Drawer/Drawer.tsx","../../../src/components/Drawer/DrawerItem.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\n/**\n * Context interno del Drawer. Permite que los sub-componentes (DrawerItem,\n * DrawerSection, etc.) reaccionen al estado `collapsed` sin necesidad de\n * recibirlo por props explícitas.\n */\nexport interface DrawerContextValue {\n /** Si el drawer está en modo mini (solo iconos). */\n collapsed: boolean;\n /** Ancho actual del drawer (útil para sub-componentes que necesiten layout). */\n width: number;\n}\n\nexport const DrawerContext = createContext<DrawerContextValue | null>(null);\n\n/**\n * Hook para leer el estado del drawer desde cualquier sub-componente. Si se\n * llama fuera de un `<Drawer>`, devuelve valores por defecto (collapsed=false)\n * para que los items renderizados sueltos no exploten.\n */\nexport function useDrawerContext(): DrawerContextValue {\n const ctx = useContext(DrawerContext);\n if (ctx) return ctx;\n return { collapsed: false, width: 260 };\n}\n","import { alpha, type SxProps, type Theme } from '@mui/material/styles';\n\nexport interface BuildDrawerSxArgs {\n /** Ancho actual del drawer (expanded o collapsed). */\n width: number;\n /** Duración de la transición de ancho en ms. */\n transitionDuration?: number;\n}\n\n/**\n * sx aplicado al root del MuiDrawer. Controla el ancho animado y el paper\n * interno. Los estilos visuales del paper (background, border) se dejan en\n * manos del theme / preset.\n */\nexport function buildDrawerSx({\n width,\n transitionDuration = 200,\n}: BuildDrawerSxArgs): SxProps<Theme> {\n return {\n width,\n flexShrink: 0,\n whiteSpace: 'nowrap',\n boxSizing: 'border-box',\n transition: (theme) =>\n theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: transitionDuration,\n }),\n '& .MuiDrawer-paper': {\n width,\n boxSizing: 'border-box',\n overflowX: 'hidden',\n transition: (theme) =>\n theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: transitionDuration,\n }),\n },\n };\n}\n\nexport interface BuildDrawerItemSxArgs {\n collapsed: boolean;\n active?: boolean;\n danger?: boolean;\n}\n\n/**\n * sx para un item del drawer. Centra el icono cuando está colapsado y\n * tiñe el fondo cuando el item está activo.\n */\nexport function buildDrawerItemSx({\n collapsed,\n active,\n danger,\n}: BuildDrawerItemSxArgs): SxProps<Theme> {\n return (theme) => ({\n minHeight: 44,\n px: collapsed ? 1 : 2,\n py: 1,\n mx: 1,\n my: 0.25,\n borderRadius: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: collapsed ? 'center' : 'flex-start',\n gap: collapsed ? 0 : 1.5,\n cursor: 'pointer',\n color: danger\n ? theme.palette.error.main\n : active\n ? theme.palette.primary.main\n : theme.palette.text.primary,\n backgroundColor: active\n ? theme.palette.action.selected\n : 'transparent',\n transition: theme.transitions.create(\n ['background-color', 'color', 'padding'],\n { duration: 150 },\n ),\n '&:hover': {\n backgroundColor: danger\n ? alpha(theme.palette.error.main, 0.08)\n : theme.palette.action.hover,\n },\n '& .drawer-item__icon': {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n minWidth: 24,\n },\n '& .drawer-item__label': {\n flex: 1,\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n opacity: collapsed ? 0 : 1,\n width: collapsed ? 0 : 'auto',\n transition: theme.transitions.create(['opacity', 'width'], {\n duration: collapsed ? 100 : 200,\n }),\n },\n });\n}\n","import { useMemo, type ReactNode } from 'react';\nimport {\n Drawer as MuiDrawer,\n IconButton,\n Box,\n type DrawerProps as MuiDrawerProps,\n} from '@mui/material';\nimport {\n useTheme,\n type SxProps,\n type Theme,\n} from '@mui/material/styles';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\n\nimport { DrawerContext } from './DrawerContext';\nimport { buildDrawerSx } from './Drawer.sx';\nimport { resolvePreset } from '../_shared/resolvePreset';\n\n// ── Tipos públicos ──────────────────────────────────────────────────────\nexport type DrawerVariant = 'permanent' | 'persistent' | 'temporary';\nexport type DrawerAnchor = 'left' | 'right' | 'top' | 'bottom';\n\nexport interface DrawerProps {\n /** Contenido del drawer (típicamente `<DrawerItem>`s). */\n children?: ReactNode;\n /**\n * Variante del drawer:\n * - `permanent` (default): siempre visible en desktop, soporta collapsed (mini).\n * - `persistent`: se oculta/muestra, empuja el contenido principal.\n * - `temporary`: flotante con backdrop (típico móvil).\n */\n variant?: DrawerVariant;\n /** Lado del viewport. Default: `'left'`. */\n anchor?: DrawerAnchor;\n /**\n * Estado mini (solo iconos). Solo se aplica con `variant=\"permanent\"` o\n * `\"persistent\"`. Si no se provee, el drawer está siempre expandido.\n */\n collapsed?: boolean;\n /** Callback del botón de toggle (chevron). */\n onToggleCollapse?: () => void;\n /** Estado abierto/cerrado (aplica a `temporary` y `persistent`). */\n open?: boolean;\n /** Callback de cierre (backdrop o ESC en temporary). */\n onClose?: MuiDrawerProps['onClose'];\n /** Ancho en estado expandido. Default: 260. */\n expandedWidth?: number;\n /** Ancho en estado colapsado (solo iconos). Default: 72. */\n collapsedWidth?: number;\n /** Muestra el botón chevron para toggle collapsed. Default: true si `onToggleCollapse` está definido. */\n showCollapseButton?: boolean;\n /** Contenido del header (por encima de los items). Típicamente logo/brand. */\n header?: ReactNode;\n /**\n * Logo/brand que se muestra junto al botón de toggle.\n * - Expandido: logo a la izquierda, toggle a la derecha en la misma fila.\n * - Colapsado: logo arriba centrado, toggle debajo centrado (stack vertical).\n * Siempre visible (a diferencia de `header`, que se oculta al colapsar).\n */\n logo?: ReactNode;\n /** Contenido del footer (por debajo de los items). Típicamente user profile. */\n footer?: ReactNode;\n /**\n * Nombre del preset de estilo registrado en `theme.styles.Drawer`.\n * - `\"default\"` (o ausente) = estilo built-in del paquete.\n */\n preset?: string;\n /** sx aplicado al Drawer (root). Se mergea después del preset. */\n sx?: SxProps<Theme>;\n /** sx aplicado al Paper interno. */\n paperSx?: SxProps<Theme>;\n className?: string;\n}\n\nexport function Drawer({\n children,\n variant = 'permanent',\n anchor = 'left',\n collapsed = false,\n onToggleCollapse,\n open,\n onClose,\n expandedWidth = 260,\n collapsedWidth = 72,\n showCollapseButton,\n header,\n logo,\n footer,\n preset,\n sx,\n paperSx,\n className,\n}: DrawerProps) {\n const theme = useTheme();\n const presetSx = resolvePreset('Drawer', preset, theme);\n\n // El mini-variant solo tiene sentido en permanent / persistent.\n const supportsCollapsed = variant !== 'temporary';\n const effectiveWidth =\n supportsCollapsed && collapsed ? collapsedWidth : expandedWidth;\n\n const contextValue = useMemo(\n () => ({\n collapsed: supportsCollapsed && collapsed,\n width: effectiveWidth,\n }),\n [supportsCollapsed, collapsed, effectiveWidth],\n );\n\n const rootSx: SxProps<Theme> = [\n buildDrawerSx({ width: effectiveWidth }),\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ];\n\n const shouldShowToggle =\n showCollapseButton ?? (supportsCollapsed && !!onToggleCollapse);\n\n const openProp =\n variant === 'permanent'\n ? true\n : open !== undefined\n ? open\n : false;\n\n return (\n <DrawerContext.Provider value={contextValue}>\n <MuiDrawer\n variant={variant}\n anchor={anchor}\n open={openProp}\n onClose={onClose}\n className={className}\n sx={rootSx}\n slotProps={{\n paper: {\n sx: paperSx,\n },\n }}\n >\n {(logo || shouldShowToggle) && (\n <Box\n sx={{\n display: 'flex',\n flexDirection: contextValue.collapsed ? 'column' : 'row',\n alignItems: 'center',\n justifyContent: contextValue.collapsed\n ? 'center'\n : logo\n ? 'space-between'\n : 'flex-end',\n gap: contextValue.collapsed ? 0.5 : 0,\n px: contextValue.collapsed ? 1 : 2,\n py: 1,\n minHeight: 64,\n flexShrink: 0,\n }}\n >\n {logo && (\n <Box sx={{ display: 'flex', alignItems: 'center', minWidth: 0 }}>\n {logo}\n </Box>\n )}\n {shouldShowToggle && (\n <IconButton\n size=\"small\"\n onClick={onToggleCollapse}\n aria-label={collapsed ? 'Expandir menú' : 'Colapsar menú'}\n >\n {collapsed ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </IconButton>\n )}\n </Box>\n )}\n\n {header && !contextValue.collapsed && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n px: 2,\n py: 1.5,\n minHeight: 56,\n flexShrink: 0,\n }}\n >\n <Box sx={{ flex: 1, minWidth: 0 }}>{header}</Box>\n </Box>\n )}\n\n <Box\n component=\"nav\"\n sx={{\n flex: 1,\n overflowY: 'auto',\n overflowX: 'hidden',\n py: 1,\n }}\n >\n {children}\n </Box>\n\n {footer && (\n <Box\n sx={{\n flexShrink: 0,\n borderTop: (t) => `1px solid ${t.palette.divider}`,\n p: contextValue.collapsed ? 1 : 1.5,\n display: 'flex',\n justifyContent: contextValue.collapsed\n ? 'center'\n : 'flex-start',\n }}\n >\n {footer}\n </Box>\n )}\n </MuiDrawer>\n </DrawerContext.Provider>\n );\n}\n\nexport default Drawer;\n","import React, { type ReactNode, type MouseEvent } from 'react';\nimport { Box, Tooltip, Typography } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { useDrawerContext } from './DrawerContext';\nimport { buildDrawerItemSx } from './Drawer.sx';\n\nexport interface DrawerItemProps {\n /** Icono del item. Se muestra siempre (expanded y collapsed). */\n icon?: ReactNode;\n /** Texto del item. Se oculta cuando el drawer está colapsado (muestra tooltip). */\n label: ReactNode;\n /**\n * Texto del tooltip en modo collapsed. Si no se provee y `label` es string,\n * se usa `label`. Necesario cuando `label` es un ReactNode complejo.\n */\n tooltipText?: string;\n /** Handler de click. */\n onClick?: (event: MouseEvent<HTMLDivElement>) => void;\n /** Marca el item como activo (destaca color y fondo). */\n active?: boolean;\n /** Marca el item como \"destructivo\" (p.ej. cerrar sesión): color error. */\n danger?: boolean;\n /** Deshabilita click + bajo opacidad. */\n disabled?: boolean;\n /** Contenido adicional a la derecha del label (badge, count, chevron). */\n endAdornment?: ReactNode;\n /** sx override del consumer, se mergea al final. */\n sx?: SxProps<Theme>;\n className?: string;\n}\n\n/**\n * Item de un Drawer de shared-library. Lee el estado `collapsed` del\n * DrawerContext para adaptar layout y mostrar tooltip en modo mini.\n *\n * Uso típico:\n * ```tsx\n * <Drawer collapsed={collapsed} onToggleCollapse={toggle}>\n * <DrawerItem icon={<HomeIcon />} label=\"Inicio\" active />\n * <DrawerItem icon={<UserIcon />} label=\"Perfil\" />\n * </Drawer>\n * ```\n */\nexport function DrawerItem({\n icon,\n label,\n tooltipText,\n onClick,\n active = false,\n danger = false,\n disabled = false,\n endAdornment,\n sx,\n className,\n}: DrawerItemProps) {\n const { collapsed } = useDrawerContext();\n\n const baseSx = buildDrawerItemSx({ collapsed, active, danger });\n\n const mergedSx: SxProps<Theme> = [\n baseSx,\n disabled && { pointerEvents: 'none', opacity: 0.5 },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ].filter(Boolean) as SxProps<Theme>;\n\n const content = (\n <Box\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n onClick={disabled ? undefined : onClick}\n onKeyDown={(event) => {\n if (disabled) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onClick?.(event as unknown as MouseEvent<HTMLDivElement>);\n }\n }}\n className={className}\n sx={mergedSx}\n >\n {icon && (\n <Box className=\"drawer-item__icon\" component=\"span\">\n {icon}\n </Box>\n )}\n <Typography\n component=\"span\"\n variant=\"body2\"\n className=\"drawer-item__label\"\n sx={{ fontWeight: active ? 600 : 400 }}\n >\n {label}\n </Typography>\n {!collapsed && endAdornment && (\n <Box component=\"span\" sx={{ flexShrink: 0, ml: 'auto' }}>\n {endAdornment}\n </Box>\n )}\n </Box>\n );\n\n // Cuando está colapsado, envolvemos en tooltip para revelar el label al hover.\n // Prioriza `tooltipText` explícito; si no, cae al `label` si es string.\n const resolvedTooltip =\n tooltipText ?? (typeof label === 'string' ? label : undefined);\n\n if (collapsed && resolvedTooltip) {\n return (\n <Tooltip title={resolvedTooltip} placement=\"right\" arrow>\n {content}\n </Tooltip>\n );\n }\n\n return content;\n}\n\nexport default DrawerItem;\n"],"names":["MuiDrawer"],"mappings":"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"}
|
|
@@ -5,6 +5,11 @@ export interface DrawerItemProps {
|
|
|
5
5
|
icon?: ReactNode;
|
|
6
6
|
/** Texto del item. Se oculta cuando el drawer está colapsado (muestra tooltip). */
|
|
7
7
|
label: ReactNode;
|
|
8
|
+
/**
|
|
9
|
+
* Texto del tooltip en modo collapsed. Si no se provee y `label` es string,
|
|
10
|
+
* se usa `label`. Necesario cuando `label` es un ReactNode complejo.
|
|
11
|
+
*/
|
|
12
|
+
tooltipText?: string;
|
|
8
13
|
/** Handler de click. */
|
|
9
14
|
onClick?: (event: MouseEvent<HTMLDivElement>) => void;
|
|
10
15
|
/** Marca el item como activo (destaca color y fondo). */
|
|
@@ -31,5 +36,5 @@ export interface DrawerItemProps {
|
|
|
31
36
|
* </Drawer>
|
|
32
37
|
* ```
|
|
33
38
|
*/
|
|
34
|
-
export declare function DrawerItem({ icon, label, onClick, active, danger, disabled, endAdornment, sx, className, }: DrawerItemProps): import("react/jsx-runtime").JSX.Element;
|
|
39
|
+
export declare function DrawerItem({ icon, label, tooltipText, onClick, active, danger, disabled, endAdornment, sx, className, }: DrawerItemProps): import("react/jsx-runtime").JSX.Element;
|
|
35
40
|
export default DrawerItem;
|