@soyfri/shared-library 1.5.0 → 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/build.js +75 -38
  2. package/dist/components/ActionMenu/ActionMenu.cjs +107 -0
  3. package/dist/components/ActionMenu/ActionMenu.cjs.map +1 -0
  4. package/dist/components/ActionMenu/ActionMenu.d.ts +60 -0
  5. package/dist/components/ActionMenu/ActionMenu.js +107 -0
  6. package/dist/components/ActionMenu/ActionMenu.js.map +1 -0
  7. package/dist/components/ActionMenu/index.d.ts +2 -0
  8. package/dist/components/ActionMenu.d.ts +6 -0
  9. package/dist/components/AppBar/AppBar.cjs +346 -0
  10. package/dist/components/AppBar/AppBar.cjs.map +1 -0
  11. package/dist/components/AppBar/AppBar.d.ts +55 -0
  12. package/dist/components/AppBar/AppBar.js +346 -0
  13. package/dist/components/AppBar/AppBar.js.map +1 -0
  14. package/dist/components/AppBar/AppBar.sx.d.ts +12 -0
  15. package/dist/components/AppBar/AppBarBrand.d.ts +31 -0
  16. package/dist/components/AppBar/AppBarContext.d.ts +18 -0
  17. package/dist/components/AppBar/AppBarMenuToggle.d.ts +39 -0
  18. package/dist/components/AppBar/AppBarUserMenu.d.ts +65 -0
  19. package/dist/components/AppBar/index.d.ts +12 -0
  20. package/dist/components/AppBar.d.ts +6 -0
  21. package/dist/components/Autocomplete/Autocomplete.cjs +259 -54
  22. package/dist/components/Autocomplete/Autocomplete.cjs.map +1 -1
  23. package/dist/components/Autocomplete/Autocomplete.d.ts +64 -9
  24. package/dist/components/Autocomplete/Autocomplete.definitions.d.ts +6 -0
  25. package/dist/components/Autocomplete/Autocomplete.helpers.d.ts +18 -0
  26. package/dist/components/Autocomplete/Autocomplete.js +261 -56
  27. package/dist/components/Autocomplete/Autocomplete.js.map +1 -1
  28. package/dist/components/Autocomplete/Autocomplete.sx.d.ts +7 -0
  29. package/dist/components/Autocomplete/Autocomplete.types.d.ts +1 -0
  30. package/dist/components/Autocomplete/_parts/AutocompleteChips.d.ts +19 -0
  31. package/dist/components/Autocomplete/_parts/AutocompleteLoader.d.ts +9 -0
  32. package/dist/components/Autocomplete/_parts/AutocompleteOption.d.ts +19 -0
  33. package/dist/components/Autocomplete/index.d.ts +2 -1
  34. package/dist/components/Autocomplete.d.ts +4 -0
  35. package/dist/components/Avatar/Avatar.cjs +116 -79
  36. package/dist/components/Avatar/Avatar.cjs.map +1 -1
  37. package/dist/components/Avatar/Avatar.d.ts +16 -2
  38. package/dist/components/Avatar/Avatar.definitions.d.ts +11 -0
  39. package/dist/components/Avatar/Avatar.js +117 -80
  40. package/dist/components/Avatar/Avatar.js.map +1 -1
  41. package/dist/components/Card/Card.cjs +168 -9
  42. package/dist/components/Card/Card.cjs.map +1 -1
  43. package/dist/components/Card/Card.d.ts +78 -8
  44. package/dist/components/Card/Card.js +170 -11
  45. package/dist/components/Card/Card.js.map +1 -1
  46. package/dist/components/Card/Card.sx.d.ts +17 -0
  47. package/dist/components/Card/index.d.ts +4 -1
  48. package/dist/components/Card.d.ts +4 -0
  49. package/dist/components/DatePicker/DatePicker.cjs +201 -3
  50. package/dist/components/DatePicker/DatePicker.cjs.map +1 -1
  51. package/dist/components/DatePicker/DatePicker.d.ts +47 -9
  52. package/dist/components/DatePicker/DatePicker.definitions.d.ts +1 -0
  53. package/dist/components/DatePicker/DatePicker.helpers.d.ts +7 -0
  54. package/dist/components/DatePicker/DatePicker.js +200 -2
  55. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  56. package/dist/components/DatePicker/DatePicker.sx.d.ts +9 -0
  57. package/dist/components/DatePicker/DatePicker.types.d.ts +1 -0
  58. package/dist/components/DatePicker/index.d.ts +2 -1
  59. package/dist/components/DatePicker.d.ts +4 -0
  60. package/dist/components/DateTimePicker/DateTimePicker.cjs +152 -138
  61. package/dist/components/DateTimePicker/DateTimePicker.cjs.map +1 -1
  62. package/dist/components/DateTimePicker/DateTimePicker.d.ts +46 -9
  63. package/dist/components/DateTimePicker/DateTimePicker.definitions.d.ts +1 -0
  64. package/dist/components/DateTimePicker/DateTimePicker.helpers.d.ts +11 -0
  65. package/dist/components/DateTimePicker/DateTimePicker.js +152 -138
  66. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  67. package/dist/components/DateTimePicker/DateTimePicker.sx.d.ts +7 -0
  68. package/dist/components/DateTimePicker/DateTimePicker.types.d.ts +1 -0
  69. package/dist/components/DateTimePicker/index.d.ts +2 -1
  70. package/dist/components/DateTimePicker.d.ts +4 -0
  71. package/dist/components/Drawer/Drawer.cjs +271 -0
  72. package/dist/components/Drawer/Drawer.cjs.map +1 -0
  73. package/dist/components/Drawer/Drawer.d.ts +51 -0
  74. package/dist/components/Drawer/Drawer.js +271 -0
  75. package/dist/components/Drawer/Drawer.js.map +1 -0
  76. package/dist/components/Drawer/Drawer.sx.d.ts +23 -0
  77. package/dist/components/Drawer/DrawerContext.d.ts +18 -0
  78. package/dist/components/Drawer/DrawerItem.d.ts +35 -0
  79. package/dist/components/Drawer/index.d.ts +6 -0
  80. package/dist/components/Drawer.d.ts +6 -0
  81. package/dist/components/Icon/Icon.cjs +44 -3
  82. package/dist/components/Icon/Icon.cjs.map +1 -1
  83. package/dist/components/Icon/Icon.d.ts +34 -1
  84. package/dist/components/Icon/Icon.js +44 -3
  85. package/dist/components/Icon/Icon.js.map +1 -1
  86. package/dist/components/Input/Input.cjs +173 -3
  87. package/dist/components/Input/Input.cjs.map +1 -1
  88. package/dist/components/Input/Input.d.ts +20 -15
  89. package/dist/components/Input/Input.definitions.d.ts +5 -2
  90. package/dist/components/Input/Input.helpers.d.ts +14 -0
  91. package/dist/components/Input/Input.js +172 -2
  92. package/dist/components/Input/Input.js.map +1 -1
  93. package/dist/components/Input/Input.sx.d.ts +8 -0
  94. package/dist/components/Input/Input.types.d.ts +1 -0
  95. package/dist/components/Input/index.d.ts +2 -1
  96. package/dist/components/Input.d.ts +4 -0
  97. package/dist/components/InputGroup/InputGroup.cjs +104 -91
  98. package/dist/components/InputGroup/InputGroup.cjs.map +1 -1
  99. package/dist/components/InputGroup/InputGroup.d.ts +37 -1
  100. package/dist/components/InputGroup/InputGroup.definitions.d.ts +6 -0
  101. package/dist/components/InputGroup/InputGroup.js +106 -93
  102. package/dist/components/InputGroup/InputGroup.js.map +1 -1
  103. package/dist/components/Modal/Modal.cjs +226 -116
  104. package/dist/components/Modal/Modal.cjs.map +1 -1
  105. package/dist/components/Modal/Modal.d.ts +38 -2
  106. package/dist/components/Modal/Modal.js +227 -117
  107. package/dist/components/Modal/Modal.js.map +1 -1
  108. package/dist/components/Modal/ModalFooter.d.ts +9 -1
  109. package/dist/components/Modal/index.d.ts +5 -0
  110. package/dist/components/PageLoader/PageLoader.cjs +61 -0
  111. package/dist/components/PageLoader/PageLoader.cjs.map +1 -0
  112. package/dist/components/PageLoader/PageLoader.d.ts +38 -0
  113. package/dist/components/PageLoader/PageLoader.js +61 -0
  114. package/dist/components/PageLoader/PageLoader.js.map +1 -0
  115. package/dist/components/PageLoader/index.d.ts +2 -0
  116. package/dist/components/PageLoader.d.ts +6 -0
  117. package/dist/components/ScrollTopButton/ScrollTopButton.cjs +79 -0
  118. package/dist/components/ScrollTopButton/ScrollTopButton.cjs.map +1 -0
  119. package/dist/components/ScrollTopButton/ScrollTopButton.d.ts +48 -0
  120. package/dist/components/ScrollTopButton/ScrollTopButton.js +79 -0
  121. package/dist/components/ScrollTopButton/ScrollTopButton.js.map +1 -0
  122. package/dist/components/ScrollTopButton/index.d.ts +4 -0
  123. package/dist/components/ScrollTopButton/scrollToTop.d.ts +29 -0
  124. package/dist/components/ScrollTopButton.d.ts +6 -0
  125. package/dist/components/Select/Select.cjs +446 -4
  126. package/dist/components/Select/Select.cjs.map +1 -1
  127. package/dist/components/Select/Select.d.ts +33 -13
  128. package/dist/components/Select/Select.definitions.d.ts +3 -0
  129. package/dist/components/Select/Select.helpers.d.ts +28 -0
  130. package/dist/components/Select/Select.js +445 -3
  131. package/dist/components/Select/Select.js.map +1 -1
  132. package/dist/components/Select/Select.sx.d.ts +7 -0
  133. package/dist/components/Select/Select.types.d.ts +1 -0
  134. package/dist/components/Select/_parts/SelectMenuItem.d.ts +20 -0
  135. package/dist/components/Select/_parts/SelectSearchHeader.d.ts +15 -0
  136. package/dist/components/Select/_parts/SelectValue.d.ts +22 -0
  137. package/dist/components/Select/index.d.ts +2 -1
  138. package/dist/components/Select.d.ts +4 -0
  139. package/dist/components/Stat/Stat.cjs +1 -1
  140. package/dist/components/Stat/Stat.js +1 -1
  141. package/dist/components/Stepper/Stepper.cjs +4 -1
  142. package/dist/components/Stepper/Stepper.cjs.map +1 -1
  143. package/dist/components/Stepper/Stepper.d.ts +5 -0
  144. package/dist/components/Stepper/Stepper.js +4 -1
  145. package/dist/components/Stepper/Stepper.js.map +1 -1
  146. package/dist/components/_shared/formField.sx.d.ts +33 -0
  147. package/dist/components/_shared/resolvePreset.d.ts +18 -0
  148. package/dist/formField.sx-CQ1mbk9M.cjs +76 -0
  149. package/dist/formField.sx-CQ1mbk9M.cjs.map +1 -0
  150. package/dist/formField.sx-DfVbMe0V.js +77 -0
  151. package/dist/formField.sx-DfVbMe0V.js.map +1 -0
  152. package/dist/hooks/Wizard/Wizard.cjs +7 -0
  153. package/dist/hooks/Wizard/Wizard.cjs.map +1 -0
  154. package/dist/hooks/Wizard/Wizard.js +7 -0
  155. package/dist/hooks/Wizard/Wizard.js.map +1 -0
  156. package/dist/hooks/Wizard/WizardContext.d.ts +67 -0
  157. package/dist/hooks/Wizard/index.d.ts +3 -0
  158. package/dist/hooks/Wizard/useWizard.d.ts +9 -0
  159. package/dist/hooks/Wizard.d.ts +2 -0
  160. package/dist/index.cjs +99 -1
  161. package/dist/index.cjs.map +1 -1
  162. package/dist/index.d.ts +3 -0
  163. package/dist/index.js +31 -2
  164. package/dist/index.js.map +1 -1
  165. package/dist/mui.d.ts +5 -0
  166. package/dist/resolvePreset-B-IB0ehH.js +15 -0
  167. package/dist/resolvePreset-B-IB0ehH.js.map +1 -0
  168. package/dist/resolvePreset-CT3kU-K2.cjs +14 -0
  169. package/dist/resolvePreset-CT3kU-K2.cjs.map +1 -0
  170. package/dist/styles.css +3 -112
  171. package/dist/theme/componentStyles.d.ts +32 -0
  172. package/dist/theme/tokens.d.ts +28 -0
  173. package/dist/useWizard-CWdIxZzX.cjs +94 -0
  174. package/dist/useWizard-CWdIxZzX.cjs.map +1 -0
  175. package/dist/useWizard-CWq--C3o.js +95 -0
  176. package/dist/useWizard-CWq--C3o.js.map +1 -0
  177. package/package.json +1 -1
  178. package/src/components/ActionMenu/ActionMenu.stories.tsx +230 -0
  179. package/src/components/ActionMenu/ActionMenu.tsx +174 -0
  180. package/src/components/ActionMenu/index.ts +2 -0
  181. package/src/components/AppBar/AppBar.stories.tsx +272 -0
  182. package/src/components/AppBar/AppBar.sx.ts +32 -0
  183. package/src/components/AppBar/AppBar.tsx +123 -0
  184. package/src/components/AppBar/AppBarBrand.tsx +120 -0
  185. package/src/components/AppBar/AppBarContext.ts +25 -0
  186. package/src/components/AppBar/AppBarMenuToggle.tsx +90 -0
  187. package/src/components/AppBar/AppBarUserMenu.tsx +217 -0
  188. package/src/components/AppBar/index.ts +25 -0
  189. package/src/components/Autocomplete/Autocomplete.definitions.ts +223 -0
  190. package/src/components/Autocomplete/Autocomplete.helpers.ts +60 -0
  191. package/src/components/Autocomplete/Autocomplete.stories.tsx +363 -2
  192. package/src/components/Autocomplete/Autocomplete.sx.ts +30 -0
  193. package/src/components/Autocomplete/Autocomplete.tsx +312 -90
  194. package/src/components/Autocomplete/Autocomplete.types.ts +13 -0
  195. package/src/components/Autocomplete/_parts/AutocompleteChips.tsx +55 -0
  196. package/src/components/Autocomplete/_parts/AutocompleteLoader.tsx +17 -0
  197. package/src/components/Autocomplete/_parts/AutocompleteOption.tsx +31 -0
  198. package/src/components/Autocomplete/index.ts +12 -1
  199. package/src/components/Avatar/Avatar.definitions.ts +162 -0
  200. package/src/components/Avatar/Avatar.stories.tsx +205 -1
  201. package/src/components/Avatar/Avatar.tsx +166 -103
  202. package/src/components/Card/Card.stories.tsx +205 -16
  203. package/src/components/Card/Card.sx.ts +104 -0
  204. package/src/components/Card/Card.tsx +191 -35
  205. package/src/components/Card/index.ts +9 -1
  206. package/src/components/DatePicker/DatePicker.definitions.ts +24 -1
  207. package/src/components/DatePicker/DatePicker.helpers.ts +24 -0
  208. package/src/components/DatePicker/DatePicker.stories.tsx +29 -2
  209. package/src/components/DatePicker/DatePicker.sx.ts +33 -0
  210. package/src/components/DatePicker/DatePicker.tsx +163 -139
  211. package/src/components/DatePicker/DatePicker.types.ts +10 -0
  212. package/src/components/DatePicker/index.ts +9 -1
  213. package/src/components/DateTimePicker/DateTimePicker.definitions.ts +24 -0
  214. package/src/components/DateTimePicker/DateTimePicker.helpers.ts +38 -0
  215. package/src/components/DateTimePicker/DateTimePicker.stories.tsx +29 -1
  216. package/src/components/DateTimePicker/DateTimePicker.sx.ts +30 -0
  217. package/src/components/DateTimePicker/DateTimePicker.tsx +200 -166
  218. package/src/components/DateTimePicker/DateTimePicker.types.ts +10 -0
  219. package/src/components/DateTimePicker/index.ts +9 -1
  220. package/src/components/Drawer/Drawer.stories.tsx +270 -0
  221. package/src/components/Drawer/Drawer.sx.ts +106 -0
  222. package/src/components/Drawer/Drawer.tsx +214 -0
  223. package/src/components/Drawer/DrawerContext.ts +26 -0
  224. package/src/components/Drawer/DrawerItem.tsx +110 -0
  225. package/src/components/Drawer/index.ts +10 -0
  226. package/src/components/Flyout/Flyout.stories.tsx +26 -18
  227. package/src/components/Icon/Icon.stories.tsx +68 -1
  228. package/src/components/Icon/Icon.tsx +87 -6
  229. package/src/components/Input/Input.definitions.ts +74 -2
  230. package/src/components/Input/Input.helpers.ts +49 -0
  231. package/src/components/Input/Input.stories.tsx +116 -4
  232. package/src/components/Input/Input.sx.ts +42 -0
  233. package/src/components/Input/Input.tsx +117 -162
  234. package/src/components/Input/Input.types.ts +10 -0
  235. package/src/components/Input/index.ts +9 -1
  236. package/src/components/InputGroup/InputGroup.definitions.ts +158 -0
  237. package/src/components/InputGroup/InputGroup.stories.tsx +159 -28
  238. package/src/components/InputGroup/InputGroup.tsx +159 -116
  239. package/src/components/Modal/Modal.stories.tsx +434 -6
  240. package/src/components/Modal/Modal.tsx +303 -121
  241. package/src/components/Modal/ModalFooter.tsx +22 -12
  242. package/src/components/Modal/index.ts +6 -1
  243. package/src/components/PageLoader/PageLoader.stories.tsx +217 -0
  244. package/src/components/PageLoader/PageLoader.tsx +96 -0
  245. package/src/components/PageLoader/index.ts +2 -0
  246. package/src/components/ScrollTopButton/ScrollTopButton.stories.tsx +158 -0
  247. package/src/components/ScrollTopButton/ScrollTopButton.tsx +135 -0
  248. package/src/components/ScrollTopButton/index.ts +8 -0
  249. package/src/components/ScrollTopButton/scrollToTop.ts +37 -0
  250. package/src/components/Select/Select.definitions.ts +114 -0
  251. package/src/components/Select/Select.helpers.ts +71 -0
  252. package/src/components/Select/Select.stories.tsx +126 -8
  253. package/src/components/Select/Select.sx.ts +14 -0
  254. package/src/components/Select/Select.tsx +246 -285
  255. package/src/components/Select/Select.types.ts +15 -0
  256. package/src/components/Select/_parts/SelectMenuItem.tsx +40 -0
  257. package/src/components/Select/_parts/SelectSearchHeader.tsx +51 -0
  258. package/src/components/Select/_parts/SelectValue.tsx +96 -0
  259. package/src/components/Select/index.ts +14 -1
  260. package/src/components/Stepper/Stepper.tsx +17 -1
  261. package/src/components/Tooltip/Tooltip.stories.tsx +15 -3
  262. package/src/components/_shared/formField.sx.ts +118 -0
  263. package/src/components/_shared/resolvePreset.ts +35 -0
  264. package/src/hooks/Wizard/Wizard.stories.tsx +301 -0
  265. package/src/hooks/Wizard/WizardContext.tsx +166 -0
  266. package/src/hooks/Wizard/index.ts +6 -0
  267. package/src/hooks/Wizard/useWizard.ts +13 -0
  268. package/src/index.ts +17 -1
  269. package/src/mui.ts +44 -0
  270. package/src/theme/componentStyles.ts +47 -0
  271. package/src/theme/tokens.ts +43 -0
  272. package/dist/DatePicker-BSNboVhN.js +0 -201
  273. package/dist/DatePicker-BSNboVhN.js.map +0 -1
  274. package/dist/DatePicker-BoqxWAhj.cjs +0 -200
  275. package/dist/DatePicker-BoqxWAhj.cjs.map +0 -1
  276. package/dist/Input-DFHs7cJ_.js +0 -171
  277. package/dist/Input-DFHs7cJ_.js.map +0 -1
  278. package/dist/Input-c8MwNNPg.cjs +0 -170
  279. package/dist/Input-c8MwNNPg.cjs.map +0 -1
  280. package/dist/Select-BO2N56sm.cjs +0 -411
  281. package/dist/Select-BO2N56sm.cjs.map +0 -1
  282. package/dist/Select-BcLkyHSE.js +0 -412
  283. package/dist/Select-BcLkyHSE.js.map +0 -1
  284. 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,6 @@
1
+ export { useWizard } from './useWizard';
2
+ export {
3
+ WizardProvider,
4
+ WizardContext,
5
+ } from './WizardContext';
6
+ export type { WizardContextValue, WizardProviderProps } from './WizardContext';
@@ -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;