@soyfri/shared-library 1.5.0 → 2.0.0-beta.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/dist/components/ActionMenu/ActionMenu.cjs +107 -0
- package/dist/components/ActionMenu/ActionMenu.cjs.map +1 -0
- package/dist/components/ActionMenu/ActionMenu.d.ts +60 -0
- package/dist/components/ActionMenu/ActionMenu.js +107 -0
- package/dist/components/ActionMenu/ActionMenu.js.map +1 -0
- package/dist/components/ActionMenu/index.d.ts +2 -0
- package/dist/components/ActionMenu.d.ts +6 -0
- package/dist/components/AppBar/AppBar.cjs +346 -0
- package/dist/components/AppBar/AppBar.cjs.map +1 -0
- package/dist/components/AppBar/AppBar.d.ts +55 -0
- package/dist/components/AppBar/AppBar.js +346 -0
- package/dist/components/AppBar/AppBar.js.map +1 -0
- package/dist/components/AppBar/AppBar.sx.d.ts +12 -0
- package/dist/components/AppBar/AppBarBrand.d.ts +31 -0
- package/dist/components/AppBar/AppBarContext.d.ts +18 -0
- package/dist/components/AppBar/AppBarMenuToggle.d.ts +39 -0
- package/dist/components/AppBar/AppBarUserMenu.d.ts +65 -0
- package/dist/components/AppBar/index.d.ts +12 -0
- package/dist/components/AppBar.d.ts +6 -0
- package/dist/components/Autocomplete/Autocomplete.cjs +259 -54
- package/dist/components/Autocomplete/Autocomplete.cjs.map +1 -1
- package/dist/components/Autocomplete/Autocomplete.d.ts +64 -9
- package/dist/components/Autocomplete/Autocomplete.definitions.d.ts +6 -0
- package/dist/components/Autocomplete/Autocomplete.helpers.d.ts +18 -0
- package/dist/components/Autocomplete/Autocomplete.js +261 -56
- package/dist/components/Autocomplete/Autocomplete.js.map +1 -1
- package/dist/components/Autocomplete/Autocomplete.sx.d.ts +7 -0
- package/dist/components/Autocomplete/Autocomplete.types.d.ts +1 -0
- package/dist/components/Autocomplete/_parts/AutocompleteChips.d.ts +19 -0
- package/dist/components/Autocomplete/_parts/AutocompleteLoader.d.ts +9 -0
- package/dist/components/Autocomplete/_parts/AutocompleteOption.d.ts +19 -0
- package/dist/components/Autocomplete/index.d.ts +2 -1
- package/dist/components/Autocomplete.d.ts +4 -0
- package/dist/components/Avatar/Avatar.cjs +116 -79
- package/dist/components/Avatar/Avatar.cjs.map +1 -1
- package/dist/components/Avatar/Avatar.d.ts +16 -2
- package/dist/components/Avatar/Avatar.definitions.d.ts +11 -0
- package/dist/components/Avatar/Avatar.js +117 -80
- package/dist/components/Avatar/Avatar.js.map +1 -1
- package/dist/components/Card/Card.cjs +168 -9
- package/dist/components/Card/Card.cjs.map +1 -1
- package/dist/components/Card/Card.d.ts +78 -8
- package/dist/components/Card/Card.js +170 -11
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Card/Card.sx.d.ts +17 -0
- package/dist/components/Card/index.d.ts +4 -1
- package/dist/components/Card.d.ts +4 -0
- package/dist/components/DatePicker/DatePicker.cjs +201 -3
- package/dist/components/DatePicker/DatePicker.cjs.map +1 -1
- package/dist/components/DatePicker/DatePicker.d.ts +47 -9
- package/dist/components/DatePicker/DatePicker.definitions.d.ts +1 -0
- package/dist/components/DatePicker/DatePicker.helpers.d.ts +7 -0
- package/dist/components/DatePicker/DatePicker.js +200 -2
- package/dist/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.sx.d.ts +9 -0
- package/dist/components/DatePicker/DatePicker.types.d.ts +1 -0
- package/dist/components/DatePicker/index.d.ts +2 -1
- package/dist/components/DatePicker.d.ts +4 -0
- package/dist/components/DateTimePicker/DateTimePicker.cjs +152 -138
- package/dist/components/DateTimePicker/DateTimePicker.cjs.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.d.ts +46 -9
- package/dist/components/DateTimePicker/DateTimePicker.definitions.d.ts +1 -0
- package/dist/components/DateTimePicker/DateTimePicker.helpers.d.ts +11 -0
- package/dist/components/DateTimePicker/DateTimePicker.js +152 -138
- package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.sx.d.ts +7 -0
- package/dist/components/DateTimePicker/DateTimePicker.types.d.ts +1 -0
- package/dist/components/DateTimePicker/index.d.ts +2 -1
- package/dist/components/DateTimePicker.d.ts +4 -0
- package/dist/components/Drawer/Drawer.cjs +271 -0
- package/dist/components/Drawer/Drawer.cjs.map +1 -0
- package/dist/components/Drawer/Drawer.d.ts +51 -0
- package/dist/components/Drawer/Drawer.js +271 -0
- package/dist/components/Drawer/Drawer.js.map +1 -0
- package/dist/components/Drawer/Drawer.sx.d.ts +23 -0
- package/dist/components/Drawer/DrawerContext.d.ts +18 -0
- package/dist/components/Drawer/DrawerItem.d.ts +35 -0
- package/dist/components/Drawer/index.d.ts +6 -0
- package/dist/components/Drawer.d.ts +6 -0
- package/dist/components/Icon/Icon.cjs +44 -3
- package/dist/components/Icon/Icon.cjs.map +1 -1
- package/dist/components/Icon/Icon.d.ts +34 -1
- package/dist/components/Icon/Icon.js +44 -3
- package/dist/components/Icon/Icon.js.map +1 -1
- package/dist/components/Input/Input.cjs +173 -3
- package/dist/components/Input/Input.cjs.map +1 -1
- package/dist/components/Input/Input.d.ts +20 -15
- package/dist/components/Input/Input.definitions.d.ts +5 -2
- package/dist/components/Input/Input.helpers.d.ts +14 -0
- package/dist/components/Input/Input.js +172 -2
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/components/Input/Input.sx.d.ts +8 -0
- package/dist/components/Input/Input.types.d.ts +1 -0
- package/dist/components/Input/index.d.ts +2 -1
- package/dist/components/Input.d.ts +4 -0
- package/dist/components/InputGroup/InputGroup.cjs +104 -91
- package/dist/components/InputGroup/InputGroup.cjs.map +1 -1
- package/dist/components/InputGroup/InputGroup.d.ts +37 -1
- package/dist/components/InputGroup/InputGroup.definitions.d.ts +6 -0
- package/dist/components/InputGroup/InputGroup.js +106 -93
- package/dist/components/InputGroup/InputGroup.js.map +1 -1
- package/dist/components/Modal/Modal.cjs +226 -116
- package/dist/components/Modal/Modal.cjs.map +1 -1
- package/dist/components/Modal/Modal.d.ts +38 -2
- package/dist/components/Modal/Modal.js +227 -117
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Modal/ModalFooter.d.ts +9 -1
- package/dist/components/Modal/index.d.ts +5 -0
- package/dist/components/PageLoader/PageLoader.cjs +61 -0
- package/dist/components/PageLoader/PageLoader.cjs.map +1 -0
- package/dist/components/PageLoader/PageLoader.d.ts +38 -0
- package/dist/components/PageLoader/PageLoader.js +61 -0
- package/dist/components/PageLoader/PageLoader.js.map +1 -0
- package/dist/components/PageLoader/index.d.ts +2 -0
- package/dist/components/PageLoader.d.ts +6 -0
- package/dist/components/ScrollTopButton/ScrollTopButton.cjs +79 -0
- package/dist/components/ScrollTopButton/ScrollTopButton.cjs.map +1 -0
- package/dist/components/ScrollTopButton/ScrollTopButton.d.ts +48 -0
- package/dist/components/ScrollTopButton/ScrollTopButton.js +79 -0
- package/dist/components/ScrollTopButton/ScrollTopButton.js.map +1 -0
- package/dist/components/ScrollTopButton/index.d.ts +4 -0
- package/dist/components/ScrollTopButton/scrollToTop.d.ts +29 -0
- package/dist/components/ScrollTopButton.d.ts +6 -0
- package/dist/components/Select/Select.cjs +446 -4
- package/dist/components/Select/Select.cjs.map +1 -1
- package/dist/components/Select/Select.d.ts +33 -13
- package/dist/components/Select/Select.definitions.d.ts +3 -0
- package/dist/components/Select/Select.helpers.d.ts +28 -0
- package/dist/components/Select/Select.js +445 -3
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Select/Select.sx.d.ts +7 -0
- package/dist/components/Select/Select.types.d.ts +1 -0
- package/dist/components/Select/_parts/SelectMenuItem.d.ts +20 -0
- package/dist/components/Select/_parts/SelectSearchHeader.d.ts +15 -0
- package/dist/components/Select/_parts/SelectValue.d.ts +22 -0
- package/dist/components/Select/index.d.ts +2 -1
- package/dist/components/Select.d.ts +4 -0
- package/dist/components/Stat/Stat.cjs +1 -1
- package/dist/components/Stat/Stat.js +1 -1
- package/dist/components/Stepper/Stepper.cjs +4 -1
- package/dist/components/Stepper/Stepper.cjs.map +1 -1
- package/dist/components/Stepper/Stepper.d.ts +5 -0
- package/dist/components/Stepper/Stepper.js +4 -1
- package/dist/components/Stepper/Stepper.js.map +1 -1
- package/dist/components/_shared/formField.sx.d.ts +33 -0
- package/dist/components/_shared/resolvePreset.d.ts +18 -0
- package/dist/formField.sx-CQ1mbk9M.cjs +76 -0
- package/dist/formField.sx-CQ1mbk9M.cjs.map +1 -0
- package/dist/formField.sx-DfVbMe0V.js +77 -0
- package/dist/formField.sx-DfVbMe0V.js.map +1 -0
- package/dist/hooks/Wizard/Wizard.cjs +7 -0
- package/dist/hooks/Wizard/Wizard.cjs.map +1 -0
- package/dist/hooks/Wizard/Wizard.js +7 -0
- package/dist/hooks/Wizard/Wizard.js.map +1 -0
- package/dist/hooks/Wizard/WizardContext.d.ts +67 -0
- package/dist/hooks/Wizard/index.d.ts +3 -0
- package/dist/hooks/Wizard/useWizard.d.ts +9 -0
- package/dist/hooks/Wizard.d.ts +2 -0
- package/dist/index.cjs +99 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +31 -2
- package/dist/index.js.map +1 -1
- package/dist/mui.d.ts +5 -0
- package/dist/resolvePreset-B-IB0ehH.js +15 -0
- package/dist/resolvePreset-B-IB0ehH.js.map +1 -0
- package/dist/resolvePreset-CT3kU-K2.cjs +14 -0
- package/dist/resolvePreset-CT3kU-K2.cjs.map +1 -0
- package/dist/styles.css +3 -112
- package/dist/theme/componentStyles.d.ts +32 -0
- package/dist/theme/tokens.d.ts +28 -0
- package/dist/useWizard-CWdIxZzX.cjs +94 -0
- package/dist/useWizard-CWdIxZzX.cjs.map +1 -0
- package/dist/useWizard-CWq--C3o.js +95 -0
- package/dist/useWizard-CWq--C3o.js.map +1 -0
- package/package.json +1 -1
- package/src/components/ActionMenu/ActionMenu.stories.tsx +230 -0
- package/src/components/ActionMenu/ActionMenu.tsx +174 -0
- package/src/components/ActionMenu/index.ts +2 -0
- package/src/components/AppBar/AppBar.stories.tsx +272 -0
- package/src/components/AppBar/AppBar.sx.ts +32 -0
- package/src/components/AppBar/AppBar.tsx +123 -0
- package/src/components/AppBar/AppBarBrand.tsx +120 -0
- package/src/components/AppBar/AppBarContext.ts +25 -0
- package/src/components/AppBar/AppBarMenuToggle.tsx +90 -0
- package/src/components/AppBar/AppBarUserMenu.tsx +217 -0
- package/src/components/AppBar/index.ts +25 -0
- package/src/components/Autocomplete/Autocomplete.definitions.ts +223 -0
- package/src/components/Autocomplete/Autocomplete.helpers.ts +60 -0
- package/src/components/Autocomplete/Autocomplete.stories.tsx +363 -2
- package/src/components/Autocomplete/Autocomplete.sx.ts +30 -0
- package/src/components/Autocomplete/Autocomplete.tsx +312 -90
- package/src/components/Autocomplete/Autocomplete.types.ts +13 -0
- package/src/components/Autocomplete/_parts/AutocompleteChips.tsx +55 -0
- package/src/components/Autocomplete/_parts/AutocompleteLoader.tsx +17 -0
- package/src/components/Autocomplete/_parts/AutocompleteOption.tsx +31 -0
- package/src/components/Autocomplete/index.ts +12 -1
- package/src/components/Avatar/Avatar.definitions.ts +162 -0
- package/src/components/Avatar/Avatar.stories.tsx +205 -1
- package/src/components/Avatar/Avatar.tsx +166 -103
- package/src/components/Card/Card.stories.tsx +205 -16
- package/src/components/Card/Card.sx.ts +104 -0
- package/src/components/Card/Card.tsx +191 -35
- package/src/components/Card/index.ts +9 -1
- package/src/components/DatePicker/DatePicker.definitions.ts +24 -1
- package/src/components/DatePicker/DatePicker.helpers.ts +24 -0
- package/src/components/DatePicker/DatePicker.stories.tsx +29 -2
- package/src/components/DatePicker/DatePicker.sx.ts +33 -0
- package/src/components/DatePicker/DatePicker.tsx +163 -139
- package/src/components/DatePicker/DatePicker.types.ts +10 -0
- package/src/components/DatePicker/index.ts +9 -1
- package/src/components/DateTimePicker/DateTimePicker.definitions.ts +24 -0
- package/src/components/DateTimePicker/DateTimePicker.helpers.ts +38 -0
- package/src/components/DateTimePicker/DateTimePicker.stories.tsx +29 -1
- package/src/components/DateTimePicker/DateTimePicker.sx.ts +30 -0
- package/src/components/DateTimePicker/DateTimePicker.tsx +200 -166
- package/src/components/DateTimePicker/DateTimePicker.types.ts +10 -0
- package/src/components/DateTimePicker/index.ts +9 -1
- package/src/components/Drawer/Drawer.stories.tsx +270 -0
- package/src/components/Drawer/Drawer.sx.ts +106 -0
- package/src/components/Drawer/Drawer.tsx +214 -0
- package/src/components/Drawer/DrawerContext.ts +26 -0
- package/src/components/Drawer/DrawerItem.tsx +110 -0
- package/src/components/Drawer/index.ts +10 -0
- package/src/components/Flyout/Flyout.stories.tsx +26 -18
- package/src/components/Icon/Icon.stories.tsx +68 -1
- package/src/components/Icon/Icon.tsx +87 -6
- package/src/components/Input/Input.definitions.ts +74 -2
- package/src/components/Input/Input.helpers.ts +49 -0
- package/src/components/Input/Input.stories.tsx +116 -4
- package/src/components/Input/Input.sx.ts +42 -0
- package/src/components/Input/Input.tsx +117 -162
- package/src/components/Input/Input.types.ts +10 -0
- package/src/components/Input/index.ts +9 -1
- package/src/components/InputGroup/InputGroup.definitions.ts +158 -0
- package/src/components/InputGroup/InputGroup.stories.tsx +159 -28
- package/src/components/InputGroup/InputGroup.tsx +159 -116
- package/src/components/Modal/Modal.stories.tsx +434 -6
- package/src/components/Modal/Modal.tsx +303 -121
- package/src/components/Modal/ModalFooter.tsx +22 -12
- package/src/components/Modal/index.ts +6 -1
- package/src/components/PageLoader/PageLoader.stories.tsx +217 -0
- package/src/components/PageLoader/PageLoader.tsx +96 -0
- package/src/components/PageLoader/index.ts +2 -0
- package/src/components/ScrollTopButton/ScrollTopButton.stories.tsx +158 -0
- package/src/components/ScrollTopButton/ScrollTopButton.tsx +135 -0
- package/src/components/ScrollTopButton/index.ts +8 -0
- package/src/components/ScrollTopButton/scrollToTop.ts +37 -0
- package/src/components/Select/Select.definitions.ts +114 -0
- package/src/components/Select/Select.helpers.ts +71 -0
- package/src/components/Select/Select.stories.tsx +126 -8
- package/src/components/Select/Select.sx.ts +14 -0
- package/src/components/Select/Select.tsx +246 -285
- package/src/components/Select/Select.types.ts +15 -0
- package/src/components/Select/_parts/SelectMenuItem.tsx +40 -0
- package/src/components/Select/_parts/SelectSearchHeader.tsx +51 -0
- package/src/components/Select/_parts/SelectValue.tsx +96 -0
- package/src/components/Select/index.ts +14 -1
- package/src/components/Stepper/Stepper.tsx +17 -1
- package/src/components/Tooltip/Tooltip.stories.tsx +15 -3
- package/src/components/_shared/formField.sx.ts +118 -0
- package/src/components/_shared/resolvePreset.ts +35 -0
- package/src/hooks/Wizard/Wizard.stories.tsx +301 -0
- package/src/hooks/Wizard/WizardContext.tsx +166 -0
- package/src/hooks/Wizard/index.ts +6 -0
- package/src/hooks/Wizard/useWizard.ts +13 -0
- package/src/index.ts +17 -1
- package/src/mui.ts +44 -0
- package/src/theme/componentStyles.ts +47 -0
- package/src/theme/tokens.ts +43 -0
- package/dist/DatePicker-BSNboVhN.js +0 -201
- package/dist/DatePicker-BSNboVhN.js.map +0 -1
- package/dist/DatePicker-BoqxWAhj.cjs +0 -200
- package/dist/DatePicker-BoqxWAhj.cjs.map +0 -1
- package/dist/Input-DFHs7cJ_.js +0 -171
- package/dist/Input-DFHs7cJ_.js.map +0 -1
- package/dist/Input-c8MwNNPg.cjs +0 -170
- package/dist/Input-c8MwNNPg.cjs.map +0 -1
- package/dist/Select-BO2N56sm.cjs +0 -411
- package/dist/Select-BO2N56sm.cjs.map +0 -1
- package/dist/Select-BcLkyHSE.js +0 -412
- package/dist/Select-BcLkyHSE.js.map +0 -1
- package/dist/index.css +0 -3
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { Box, Button, Paper, Stack, Typography, Alert } from '@mui/material';
|
|
4
|
+
|
|
5
|
+
import { WizardProvider } from './WizardContext';
|
|
6
|
+
import { useWizard } from './useWizard';
|
|
7
|
+
import Stepper from '../../components/Stepper/Stepper';
|
|
8
|
+
import Step from '../../components/Stepper/Step';
|
|
9
|
+
|
|
10
|
+
const meta: Meta = {
|
|
11
|
+
title: 'Hooks/useWizard',
|
|
12
|
+
tags: ['autodocs'],
|
|
13
|
+
parameters: {
|
|
14
|
+
docs: {
|
|
15
|
+
description: {
|
|
16
|
+
component:
|
|
17
|
+
'Hook + provider para administrar la navegación de un wizard multi-paso. Reemplaza el `StepperComponent` imperativo de Metronic y es retro-compatible con el `WizardContext` de `@soyfri/fri-web-components` (mismos nombres: `nextStep`, `prevStep`, `goToStep`, `submitStep`).',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export default meta;
|
|
24
|
+
type Story = StoryObj;
|
|
25
|
+
|
|
26
|
+
// ── Sub-componente: controles del wizard ─────────────────────────────────
|
|
27
|
+
|
|
28
|
+
const WizardControls = () => {
|
|
29
|
+
const { currentStep, totalSteps, isFirst, isLast, nextStep, prevStep, submitStep, reset, completed } =
|
|
30
|
+
useWizard();
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<Stack direction="row" spacing={1} justifyContent="flex-end" sx={{ mt: 3 }}>
|
|
34
|
+
<Button variant="text" onClick={reset} disabled={completed}>
|
|
35
|
+
Reiniciar
|
|
36
|
+
</Button>
|
|
37
|
+
<Button
|
|
38
|
+
variant="outlined"
|
|
39
|
+
onClick={prevStep}
|
|
40
|
+
disabled={isFirst || completed}
|
|
41
|
+
>
|
|
42
|
+
Atrás
|
|
43
|
+
</Button>
|
|
44
|
+
{isLast ? (
|
|
45
|
+
<Button
|
|
46
|
+
variant="contained"
|
|
47
|
+
color="primary"
|
|
48
|
+
onClick={submitStep}
|
|
49
|
+
disabled={completed}
|
|
50
|
+
>
|
|
51
|
+
{completed ? 'Enviado' : 'Enviar'}
|
|
52
|
+
</Button>
|
|
53
|
+
) : (
|
|
54
|
+
<Button variant="contained" onClick={nextStep}>
|
|
55
|
+
Siguiente
|
|
56
|
+
</Button>
|
|
57
|
+
)}
|
|
58
|
+
<Typography
|
|
59
|
+
variant="caption"
|
|
60
|
+
color="text.secondary"
|
|
61
|
+
sx={{ alignSelf: 'center', ml: 2 }}
|
|
62
|
+
>
|
|
63
|
+
Paso {currentStep + 1} de {totalSteps}
|
|
64
|
+
</Typography>
|
|
65
|
+
</Stack>
|
|
66
|
+
);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// ── Story 1: wizard básico con Stepper ──────────────────────────────────
|
|
70
|
+
|
|
71
|
+
const BasicWizardBody = () => {
|
|
72
|
+
const { currentStep, completed } = useWizard();
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<Paper sx={{ p: 3, maxWidth: 720, mx: 'auto' }}>
|
|
76
|
+
{completed && (
|
|
77
|
+
<Alert severity="success" sx={{ mb: 2 }}>
|
|
78
|
+
¡Wizard enviado! Usá "Reiniciar" para volver al paso 1.
|
|
79
|
+
</Alert>
|
|
80
|
+
)}
|
|
81
|
+
|
|
82
|
+
<Stepper>
|
|
83
|
+
<Step label="Datos personales">
|
|
84
|
+
<Box sx={{ p: 2 }}>
|
|
85
|
+
<Typography variant="h6">Paso 1 — Datos personales</Typography>
|
|
86
|
+
<Typography color="text.secondary">
|
|
87
|
+
Acá iría el formulario de nombre, email, teléfono, etc.
|
|
88
|
+
</Typography>
|
|
89
|
+
</Box>
|
|
90
|
+
</Step>
|
|
91
|
+
<Step label="Dirección">
|
|
92
|
+
<Box sx={{ p: 2 }}>
|
|
93
|
+
<Typography variant="h6">Paso 2 — Dirección</Typography>
|
|
94
|
+
<Typography color="text.secondary">
|
|
95
|
+
Acá iría el formulario de dirección, ciudad, país.
|
|
96
|
+
</Typography>
|
|
97
|
+
</Box>
|
|
98
|
+
</Step>
|
|
99
|
+
<Step label="Confirmación">
|
|
100
|
+
<Box sx={{ p: 2 }}>
|
|
101
|
+
<Typography variant="h6">Paso 3 — Confirmación</Typography>
|
|
102
|
+
<Typography color="text.secondary">
|
|
103
|
+
Revisá los datos antes de enviar.
|
|
104
|
+
</Typography>
|
|
105
|
+
</Box>
|
|
106
|
+
</Step>
|
|
107
|
+
</Stepper>
|
|
108
|
+
|
|
109
|
+
<WizardControls />
|
|
110
|
+
<Typography
|
|
111
|
+
variant="caption"
|
|
112
|
+
color="text.secondary"
|
|
113
|
+
sx={{ display: 'block', mt: 1, textAlign: 'right' }}
|
|
114
|
+
>
|
|
115
|
+
Paso actual (0-based): {currentStep}
|
|
116
|
+
</Typography>
|
|
117
|
+
</Paper>
|
|
118
|
+
);
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
export const BasicWizard: Story = {
|
|
122
|
+
render: () => (
|
|
123
|
+
<WizardProvider
|
|
124
|
+
totalSteps={3}
|
|
125
|
+
onSubmit={(step) => console.log('Submit desde paso', step)}
|
|
126
|
+
onStepChange={(newStep, prevStep) =>
|
|
127
|
+
console.log(`Cambio: ${prevStep} → ${newStep}`)
|
|
128
|
+
}
|
|
129
|
+
>
|
|
130
|
+
<BasicWizardBody />
|
|
131
|
+
</WizardProvider>
|
|
132
|
+
),
|
|
133
|
+
parameters: {
|
|
134
|
+
docs: {
|
|
135
|
+
description: {
|
|
136
|
+
story:
|
|
137
|
+
'Wizard de 3 pasos. El `Stepper` lee `currentStep` del `WizardContext` automáticamente (sin necesidad de prop explícita). Los controles usan `useWizard()` para llamar `nextStep`, `prevStep`, `submitStep` y `reset`. Verifica la consola para ver los callbacks `onStepChange` y `onSubmit`.',
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
// ── Story 2: integración con validación por paso ────────────────────────
|
|
144
|
+
|
|
145
|
+
const ValidatedWizardBody = () => {
|
|
146
|
+
const { currentStep, isLast, nextStep, prevStep, submitStep, completed } =
|
|
147
|
+
useWizard();
|
|
148
|
+
const [canAdvance, setCanAdvance] = React.useState(false);
|
|
149
|
+
|
|
150
|
+
// Cada vez que cambia el paso, reseteamos el "canAdvance" como si hubiera
|
|
151
|
+
// que validar de nuevo.
|
|
152
|
+
React.useEffect(() => {
|
|
153
|
+
setCanAdvance(false);
|
|
154
|
+
}, [currentStep]);
|
|
155
|
+
|
|
156
|
+
const handleValidate = () => setCanAdvance(true);
|
|
157
|
+
|
|
158
|
+
return (
|
|
159
|
+
<Paper sx={{ p: 3, maxWidth: 720, mx: 'auto' }}>
|
|
160
|
+
{completed && (
|
|
161
|
+
<Alert severity="success" sx={{ mb: 2 }}>
|
|
162
|
+
Wizard completado.
|
|
163
|
+
</Alert>
|
|
164
|
+
)}
|
|
165
|
+
|
|
166
|
+
<Stepper>
|
|
167
|
+
<Step label="Paso A">
|
|
168
|
+
<Box sx={{ p: 2 }}>
|
|
169
|
+
<Typography>Validá este paso para continuar.</Typography>
|
|
170
|
+
</Box>
|
|
171
|
+
</Step>
|
|
172
|
+
<Step label="Paso B">
|
|
173
|
+
<Box sx={{ p: 2 }}>
|
|
174
|
+
<Typography>Validá este paso para continuar.</Typography>
|
|
175
|
+
</Box>
|
|
176
|
+
</Step>
|
|
177
|
+
<Step label="Paso C">
|
|
178
|
+
<Box sx={{ p: 2 }}>
|
|
179
|
+
<Typography>Último paso — envía el wizard.</Typography>
|
|
180
|
+
</Box>
|
|
181
|
+
</Step>
|
|
182
|
+
</Stepper>
|
|
183
|
+
|
|
184
|
+
<Stack direction="row" spacing={1} justifyContent="flex-end" sx={{ mt: 3 }}>
|
|
185
|
+
<Button
|
|
186
|
+
variant="text"
|
|
187
|
+
onClick={handleValidate}
|
|
188
|
+
disabled={canAdvance}
|
|
189
|
+
>
|
|
190
|
+
{canAdvance ? 'Paso válido ✓' : 'Validar paso'}
|
|
191
|
+
</Button>
|
|
192
|
+
<Button variant="outlined" onClick={prevStep} disabled={currentStep === 0}>
|
|
193
|
+
Atrás
|
|
194
|
+
</Button>
|
|
195
|
+
{isLast ? (
|
|
196
|
+
<Button
|
|
197
|
+
variant="contained"
|
|
198
|
+
onClick={submitStep}
|
|
199
|
+
disabled={!canAdvance || completed}
|
|
200
|
+
>
|
|
201
|
+
Enviar
|
|
202
|
+
</Button>
|
|
203
|
+
) : (
|
|
204
|
+
<Button variant="contained" onClick={nextStep} disabled={!canAdvance}>
|
|
205
|
+
Siguiente
|
|
206
|
+
</Button>
|
|
207
|
+
)}
|
|
208
|
+
</Stack>
|
|
209
|
+
</Paper>
|
|
210
|
+
);
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
export const WithPerStepValidation: Story = {
|
|
214
|
+
render: () => (
|
|
215
|
+
<WizardProvider
|
|
216
|
+
totalSteps={3}
|
|
217
|
+
onSubmit={() => console.log('Enviado!')}
|
|
218
|
+
>
|
|
219
|
+
<ValidatedWizardBody />
|
|
220
|
+
</WizardProvider>
|
|
221
|
+
),
|
|
222
|
+
parameters: {
|
|
223
|
+
docs: {
|
|
224
|
+
description: {
|
|
225
|
+
story:
|
|
226
|
+
'Patrón común: el botón "Siguiente" permanece deshabilitado hasta que el consumer valide el paso actual (normalmente con react-hook-form `trigger()`). El hook solo maneja la navegación — la validación es responsabilidad del consumer.',
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
// ── Story 3: navegación directa por click en steps ──────────────────────
|
|
233
|
+
|
|
234
|
+
const JumpableWizardBody = () => {
|
|
235
|
+
const { currentStep, totalSteps, goToStep, nextStep, prevStep } = useWizard();
|
|
236
|
+
|
|
237
|
+
return (
|
|
238
|
+
<Paper sx={{ p: 3, maxWidth: 720, mx: 'auto' }}>
|
|
239
|
+
<Typography variant="subtitle1" sx={{ mb: 2 }}>
|
|
240
|
+
Saltar a un paso específico
|
|
241
|
+
</Typography>
|
|
242
|
+
|
|
243
|
+
<Stack direction="row" spacing={1} sx={{ mb: 3 }}>
|
|
244
|
+
{Array.from({ length: totalSteps }).map((_, i) => (
|
|
245
|
+
<Button
|
|
246
|
+
key={i}
|
|
247
|
+
size="small"
|
|
248
|
+
variant={i === currentStep ? 'contained' : 'outlined'}
|
|
249
|
+
onClick={() => goToStep(i)}
|
|
250
|
+
>
|
|
251
|
+
Paso {i + 1}
|
|
252
|
+
</Button>
|
|
253
|
+
))}
|
|
254
|
+
</Stack>
|
|
255
|
+
|
|
256
|
+
<Stepper>
|
|
257
|
+
<Step label="Uno">
|
|
258
|
+
<Box sx={{ p: 2 }}>Paso 1</Box>
|
|
259
|
+
</Step>
|
|
260
|
+
<Step label="Dos">
|
|
261
|
+
<Box sx={{ p: 2 }}>Paso 2</Box>
|
|
262
|
+
</Step>
|
|
263
|
+
<Step label="Tres">
|
|
264
|
+
<Box sx={{ p: 2 }}>Paso 3</Box>
|
|
265
|
+
</Step>
|
|
266
|
+
<Step label="Cuatro">
|
|
267
|
+
<Box sx={{ p: 2 }}>Paso 4</Box>
|
|
268
|
+
</Step>
|
|
269
|
+
</Stepper>
|
|
270
|
+
|
|
271
|
+
<Stack direction="row" spacing={1} justifyContent="flex-end" sx={{ mt: 3 }}>
|
|
272
|
+
<Button variant="outlined" onClick={prevStep} disabled={currentStep === 0}>
|
|
273
|
+
Atrás
|
|
274
|
+
</Button>
|
|
275
|
+
<Button
|
|
276
|
+
variant="contained"
|
|
277
|
+
onClick={nextStep}
|
|
278
|
+
disabled={currentStep === totalSteps - 1}
|
|
279
|
+
>
|
|
280
|
+
Siguiente
|
|
281
|
+
</Button>
|
|
282
|
+
</Stack>
|
|
283
|
+
</Paper>
|
|
284
|
+
);
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
export const JumpToStep: Story = {
|
|
288
|
+
render: () => (
|
|
289
|
+
<WizardProvider totalSteps={4}>
|
|
290
|
+
<JumpableWizardBody />
|
|
291
|
+
</WizardProvider>
|
|
292
|
+
),
|
|
293
|
+
parameters: {
|
|
294
|
+
docs: {
|
|
295
|
+
description: {
|
|
296
|
+
story:
|
|
297
|
+
'Uso de `goToStep(n)` para saltar a un paso específico. Útil cuando hay un sidebar o tabs que permiten navegación no-lineal (siempre y cuando el consumer valide antes de permitir el salto).',
|
|
298
|
+
},
|
|
299
|
+
},
|
|
300
|
+
},
|
|
301
|
+
};
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import React, {
|
|
2
|
+
createContext,
|
|
3
|
+
useCallback,
|
|
4
|
+
useMemo,
|
|
5
|
+
useState,
|
|
6
|
+
type FC,
|
|
7
|
+
type ReactNode,
|
|
8
|
+
} from 'react';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* API expuesta por `useWizard()`.
|
|
12
|
+
*
|
|
13
|
+
* Nota de retro-compatibilidad: los nombres `submitStep`, `nextStep`,
|
|
14
|
+
* `prevStep`, `goToStep` se mantienen idénticos al `WizardContext` de
|
|
15
|
+
* `@soyfri/fri-web-components` para que consumers migrando no tengan que
|
|
16
|
+
* cambiar sus llamadas. Se agregan campos extra opcionales que antes no
|
|
17
|
+
* existían (`currentStep`, `totalSteps`, `isFirst`, `isLast`, `completed`).
|
|
18
|
+
*/
|
|
19
|
+
export interface WizardContextValue {
|
|
20
|
+
/** Índice del paso actual (0-based). */
|
|
21
|
+
currentStep: number;
|
|
22
|
+
/** Total de pasos del wizard. */
|
|
23
|
+
totalSteps: number;
|
|
24
|
+
/** True si `currentStep === 0`. */
|
|
25
|
+
isFirst: boolean;
|
|
26
|
+
/** True si `currentStep === totalSteps - 1`. */
|
|
27
|
+
isLast: boolean;
|
|
28
|
+
/** True tras ejecutar `submitStep()` desde el último paso. */
|
|
29
|
+
completed: boolean;
|
|
30
|
+
/** Avanza al siguiente paso (no pasa de `totalSteps - 1`). */
|
|
31
|
+
nextStep: () => void;
|
|
32
|
+
/** Retrocede al paso anterior (no baja de 0). */
|
|
33
|
+
prevStep: () => void;
|
|
34
|
+
/** Salta a un paso específico (0-based). No-op si fuera de rango. */
|
|
35
|
+
goToStep: (stepNumber: number) => void;
|
|
36
|
+
/**
|
|
37
|
+
* Envía el wizard. Marca `completed = true` y dispara el callback
|
|
38
|
+
* `onSubmit` del provider. En el último paso suele reemplazar a `nextStep`.
|
|
39
|
+
*/
|
|
40
|
+
submitStep: () => void;
|
|
41
|
+
/** Resetea el wizard al paso inicial y limpia `completed`. */
|
|
42
|
+
reset: () => void;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const defaultValue: WizardContextValue = {
|
|
46
|
+
currentStep: 0,
|
|
47
|
+
totalSteps: 0,
|
|
48
|
+
isFirst: true,
|
|
49
|
+
isLast: true,
|
|
50
|
+
completed: false,
|
|
51
|
+
nextStep: () => {},
|
|
52
|
+
prevStep: () => {},
|
|
53
|
+
goToStep: () => {},
|
|
54
|
+
submitStep: () => {},
|
|
55
|
+
reset: () => {},
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export const WizardContext = createContext<WizardContextValue>(defaultValue);
|
|
59
|
+
|
|
60
|
+
export interface WizardProviderProps {
|
|
61
|
+
/** Número total de pasos del wizard. Requerido. */
|
|
62
|
+
totalSteps: number;
|
|
63
|
+
/** Paso inicial (0-based). Default: 0. */
|
|
64
|
+
initialStep?: number;
|
|
65
|
+
/**
|
|
66
|
+
* Callback disparado cuando se llama `submitStep()`. Recibe el paso actual.
|
|
67
|
+
* El paquete NO ejecuta ninguna petición; queda a cargo del consumer.
|
|
68
|
+
*/
|
|
69
|
+
onSubmit?: (currentStep: number) => void;
|
|
70
|
+
/**
|
|
71
|
+
* Callback disparado en cada cambio de paso (next/prev/goTo).
|
|
72
|
+
* Útil para tracking o validaciones externas.
|
|
73
|
+
*/
|
|
74
|
+
onStepChange?: (newStep: number, prevStep: number) => void;
|
|
75
|
+
children?: ReactNode;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Provider del wizard. Administra el `currentStep` internamente. El consumer
|
|
80
|
+
* no necesita gestionar estado — sólo consumirlo con `useWizard()` desde
|
|
81
|
+
* cualquier descendiente.
|
|
82
|
+
*
|
|
83
|
+
* ```tsx
|
|
84
|
+
* <WizardProvider totalSteps={3} onSubmit={handleFinalSubmit}>
|
|
85
|
+
* <Stepper ... />
|
|
86
|
+
* <StepContent />
|
|
87
|
+
* <WizardControls />
|
|
88
|
+
* </WizardProvider>
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export const WizardProvider: FC<WizardProviderProps> = ({
|
|
92
|
+
totalSteps,
|
|
93
|
+
initialStep = 0,
|
|
94
|
+
onSubmit,
|
|
95
|
+
onStepChange,
|
|
96
|
+
children,
|
|
97
|
+
}) => {
|
|
98
|
+
const [currentStep, setCurrentStep] = useState(initialStep);
|
|
99
|
+
const [completed, setCompleted] = useState(false);
|
|
100
|
+
|
|
101
|
+
const changeStep = useCallback(
|
|
102
|
+
(newStep: number) => {
|
|
103
|
+
setCurrentStep((prev) => {
|
|
104
|
+
if (newStep === prev) return prev;
|
|
105
|
+
if (newStep < 0 || newStep >= totalSteps) return prev;
|
|
106
|
+
onStepChange?.(newStep, prev);
|
|
107
|
+
return newStep;
|
|
108
|
+
});
|
|
109
|
+
},
|
|
110
|
+
[totalSteps, onStepChange],
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
const nextStep = useCallback(() => {
|
|
114
|
+
changeStep(currentStep + 1);
|
|
115
|
+
}, [changeStep, currentStep]);
|
|
116
|
+
|
|
117
|
+
const prevStep = useCallback(() => {
|
|
118
|
+
changeStep(currentStep - 1);
|
|
119
|
+
}, [changeStep, currentStep]);
|
|
120
|
+
|
|
121
|
+
const goToStep = useCallback(
|
|
122
|
+
(stepNumber: number) => {
|
|
123
|
+
changeStep(stepNumber);
|
|
124
|
+
},
|
|
125
|
+
[changeStep],
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
const submitStep = useCallback(() => {
|
|
129
|
+
setCompleted(true);
|
|
130
|
+
onSubmit?.(currentStep);
|
|
131
|
+
}, [currentStep, onSubmit]);
|
|
132
|
+
|
|
133
|
+
const reset = useCallback(() => {
|
|
134
|
+
setCurrentStep(initialStep);
|
|
135
|
+
setCompleted(false);
|
|
136
|
+
}, [initialStep]);
|
|
137
|
+
|
|
138
|
+
const value = useMemo<WizardContextValue>(
|
|
139
|
+
() => ({
|
|
140
|
+
currentStep,
|
|
141
|
+
totalSteps,
|
|
142
|
+
isFirst: currentStep === 0,
|
|
143
|
+
isLast: currentStep === totalSteps - 1,
|
|
144
|
+
completed,
|
|
145
|
+
nextStep,
|
|
146
|
+
prevStep,
|
|
147
|
+
goToStep,
|
|
148
|
+
submitStep,
|
|
149
|
+
reset,
|
|
150
|
+
}),
|
|
151
|
+
[
|
|
152
|
+
currentStep,
|
|
153
|
+
totalSteps,
|
|
154
|
+
completed,
|
|
155
|
+
nextStep,
|
|
156
|
+
prevStep,
|
|
157
|
+
goToStep,
|
|
158
|
+
submitStep,
|
|
159
|
+
reset,
|
|
160
|
+
],
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
return (
|
|
164
|
+
<WizardContext.Provider value={value}>{children}</WizardContext.Provider>
|
|
165
|
+
);
|
|
166
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
2
|
+
import { WizardContext, type WizardContextValue } from './WizardContext';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Hook para consumir el `WizardContext` desde cualquier descendiente de
|
|
6
|
+
* `<WizardProvider>`.
|
|
7
|
+
*
|
|
8
|
+
* Si se llama fuera de un provider, devuelve los valores por defecto (no-op)
|
|
9
|
+
* para mantener compatibilidad con el hook original de fri-web-components.
|
|
10
|
+
*/
|
|
11
|
+
export function useWizard(): WizardContextValue {
|
|
12
|
+
return useContext(WizardContext);
|
|
13
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1 +1,17 @@
|
|
|
1
|
-
import './styles.css';
|
|
1
|
+
import './styles.css';
|
|
2
|
+
|
|
3
|
+
// ── Sistema de presets de estilos (theme.styles) ─────────────────────────
|
|
4
|
+
// Exportar el módulo de tipos ejecuta el `declare module '@mui/material/styles'`
|
|
5
|
+
// para que los consumers tengan `theme.styles` tipado sin imports extra.
|
|
6
|
+
export type {
|
|
7
|
+
LibraryComponentName,
|
|
8
|
+
PresetStyle,
|
|
9
|
+
ComponentPresets,
|
|
10
|
+
LibraryStyles,
|
|
11
|
+
} from './theme/componentStyles';
|
|
12
|
+
export { DEFAULT_PRESET_NAME, resolvePreset } from './components/_shared/resolvePreset';
|
|
13
|
+
import './theme/componentStyles';
|
|
14
|
+
|
|
15
|
+
// ── Pass-through de MUI (punto de entrada único para el consumer) ─────────
|
|
16
|
+
// Regla: el consumer nunca importa de '@mui/material'. Todo viene de acá.
|
|
17
|
+
export * from './mui';
|
package/src/mui.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// -----------------------------------------------------------------------------
|
|
2
|
+
// Pass-through puro de primitivos de MUI.
|
|
3
|
+
//
|
|
4
|
+
// Regla para el consumer: si está en `@soyfri/shared-library`, impórtalo desde
|
|
5
|
+
// acá. NUNCA directamente desde `@mui/material`. Esto nos da un único punto de
|
|
6
|
+
// entrada y facilita un eventual cambio de librería base.
|
|
7
|
+
//
|
|
8
|
+
// Este archivo NO wrappea nada — solo re-exporta. Si se necesita otro
|
|
9
|
+
// primitivo, agregar la línea correspondiente.
|
|
10
|
+
// -----------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
// ── Layout primitives ────────────────────────────────────────────────────
|
|
13
|
+
export {
|
|
14
|
+
Box,
|
|
15
|
+
Stack,
|
|
16
|
+
Grid,
|
|
17
|
+
Container,
|
|
18
|
+
Paper,
|
|
19
|
+
Divider,
|
|
20
|
+
} from '@mui/material';
|
|
21
|
+
|
|
22
|
+
// ── Tipografía ────────────────────────────────────────────────────────────
|
|
23
|
+
export { Typography, Link } from '@mui/material';
|
|
24
|
+
|
|
25
|
+
// ── Feedback / misc ───────────────────────────────────────────────────────
|
|
26
|
+
export {
|
|
27
|
+
CircularProgress,
|
|
28
|
+
LinearProgress,
|
|
29
|
+
Skeleton,
|
|
30
|
+
Alert,
|
|
31
|
+
AlertTitle,
|
|
32
|
+
Snackbar,
|
|
33
|
+
Backdrop,
|
|
34
|
+
Fade,
|
|
35
|
+
Grow,
|
|
36
|
+
Zoom,
|
|
37
|
+
Collapse,
|
|
38
|
+
} from '@mui/material';
|
|
39
|
+
|
|
40
|
+
// ── Hooks y utilidades de tema ───────────────────────────────────────────
|
|
41
|
+
export { useTheme, useMediaQuery, alpha, styled } from '@mui/material';
|
|
42
|
+
|
|
43
|
+
// ── Tipos más usados ──────────────────────────────────────────────────────
|
|
44
|
+
export type { SxProps, Theme } from '@mui/material/styles';
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { SxProps, Theme } from '@mui/material/styles';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Lista de componentes del paquete que soportan presets registrables en el
|
|
5
|
+
* theme. Si en el futuro se agrega otro componente al sistema, se extiende
|
|
6
|
+
* esta union.
|
|
7
|
+
*/
|
|
8
|
+
export type LibraryComponentName =
|
|
9
|
+
| 'Input'
|
|
10
|
+
| 'Select'
|
|
11
|
+
| 'Autocomplete'
|
|
12
|
+
| 'DatePicker'
|
|
13
|
+
| 'DateTimePicker'
|
|
14
|
+
| 'Drawer'
|
|
15
|
+
| 'AppBar'
|
|
16
|
+
| 'Card'
|
|
17
|
+
| 'ScrollTopButton';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Un estilo de preset. Puede ser un objeto sx directo o una función del theme
|
|
21
|
+
* para acceder a palette/typography/etc.
|
|
22
|
+
*/
|
|
23
|
+
export type PresetStyle = SxProps<Theme> | ((theme: Theme) => SxProps<Theme>);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Map de presets disponibles para un componente. Las keys son nombres libres
|
|
27
|
+
* elegidos por el consumidor (p.ej. `reddit`, `compact-filled`). El paquete
|
|
28
|
+
* no registra ninguna entrada: `preset="default"` significa "usar el estilo
|
|
29
|
+
* built-in de fábrica" y no requiere registro.
|
|
30
|
+
*/
|
|
31
|
+
export type ComponentPresets = Record<string, PresetStyle>;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Shape del namespace `theme.styles` — un map de componentes del paquete a
|
|
35
|
+
* sus presets registrados.
|
|
36
|
+
*/
|
|
37
|
+
export type LibraryStyles = Partial<Record<LibraryComponentName, ComponentPresets>>;
|
|
38
|
+
|
|
39
|
+
// ── Module augmentation de MUI ───────────────────────────────────────────
|
|
40
|
+
declare module '@mui/material/styles' {
|
|
41
|
+
interface Theme {
|
|
42
|
+
styles: LibraryStyles;
|
|
43
|
+
}
|
|
44
|
+
interface ThemeOptions {
|
|
45
|
+
styles?: LibraryStyles;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design tokens compartidos por los componentes de formulario
|
|
3
|
+
* (Input, Select, Autocomplete, DatePicker, DateTimePicker).
|
|
4
|
+
*
|
|
5
|
+
* Centralizar estos valores garantiza que:
|
|
6
|
+
* - el espaciado, la tipografía y las animaciones del label sean idénticos
|
|
7
|
+
* en todos los campos;
|
|
8
|
+
* - un cambio visual global (p.ej. cambiar el transform del shrink) se haga
|
|
9
|
+
* en un único archivo.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// ── Spacing ──────────────────────────────────────────────────────────────
|
|
13
|
+
/** Margen superior que deja el aire para el label flotante "outside". */
|
|
14
|
+
export const LABEL_MARGIN_TOP = '14px';
|
|
15
|
+
|
|
16
|
+
/** Padding vertical interno del input (TextField/Select/Picker sections). */
|
|
17
|
+
export const FIELD_INPUT_PADDING_Y = '8.5px';
|
|
18
|
+
|
|
19
|
+
// ── Label animation ──────────────────────────────────────────────────────
|
|
20
|
+
/** Transform que aplica el label cuando sube arriba del input (shrink). */
|
|
21
|
+
export const LABEL_SHRINK_TRANSFORM = 'translate(4px, -22px) scale(0.85)';
|
|
22
|
+
|
|
23
|
+
/** Origen del transform para el shrink. */
|
|
24
|
+
export const LABEL_TRANSFORM_ORIGIN = 'top left';
|
|
25
|
+
|
|
26
|
+
/** Transición del label (color + transform + max-width). */
|
|
27
|
+
export const LABEL_TRANSITION =
|
|
28
|
+
'color 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms, ' +
|
|
29
|
+
'transform 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms, ' +
|
|
30
|
+
'max-width 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms';
|
|
31
|
+
|
|
32
|
+
// ── Label colors (theme-aware) ───────────────────────────────────────────
|
|
33
|
+
/** Color del label en reposo. */
|
|
34
|
+
export const LABEL_COLOR_REST = 'text.secondary';
|
|
35
|
+
|
|
36
|
+
/** Color del label cuando el campo tiene valor (shrink). */
|
|
37
|
+
export const LABEL_COLOR_FILLED = 'text.primary';
|
|
38
|
+
|
|
39
|
+
/** Color del label cuando el campo está focused. */
|
|
40
|
+
export const LABEL_COLOR_FOCUSED = 'primary.main';
|
|
41
|
+
|
|
42
|
+
/** Peso del label cuando sube (filled/focused). */
|
|
43
|
+
export const LABEL_FONT_WEIGHT_FILLED = 500;
|