@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
@@ -1,44 +1,200 @@
1
- import { CardActions, Card as MuiCard } from "@mui/material";
2
- import type { CardProps } from "@mui/material/Card";
3
- import { CardContent as MuiCardContent } from "@mui/material";
1
+ import React, { type ReactNode } from 'react';
2
+ import { Box, Card as MuiCard, Typography, useTheme } from '@mui/material';
3
+ import type { SxProps, Theme } from '@mui/material/styles';
4
4
 
5
+ import { resolvePreset } from '../_shared/resolvePreset';
6
+ import {
7
+ buildCardSx,
8
+ buildCardHeaderSx,
9
+ buildCardBodySx,
10
+ buildCardFooterSx,
11
+ type CardVariant,
12
+ type CardPadding,
13
+ } from './Card.sx';
5
14
 
6
- type PickCardProps = Pick<CardProps, 'children' | 'raised' | 'sx' | 'className' | 'sx'>;
7
-
8
- export interface MyCardProps extends PickCardProps {
9
- children?: React.ReactNode;
10
- raised?: boolean;
11
- className?: string
12
- onClick?: () => void;
13
- onBlur?: () => void;
14
- "data-testid"?: string;
15
- sx?: object;
15
+ export interface CardProps {
16
+ /** Contenido principal. */
17
+ children?: ReactNode;
18
+ /**
19
+ * Título del Card. Si se provee, renderiza un header con separador. Puede
20
+ * ser string o cualquier ReactNode para permitir iconos / chips.
21
+ */
22
+ title?: ReactNode;
23
+ /** Texto secundario debajo del título. */
24
+ subtitle?: ReactNode;
25
+ /**
26
+ * Acciones del header (botones, ActionMenu, etc). Se renderizan alineadas
27
+ * a la derecha.
28
+ */
29
+ actions?: ReactNode;
30
+ /**
31
+ * Header totalmente custom. Si se provee, ignora `title`/`subtitle`/`actions`
32
+ * y toma control del slot entero.
33
+ */
34
+ header?: ReactNode;
35
+ /** Footer custom (botones, mensajes, etc). */
36
+ footer?: ReactNode;
37
+ /**
38
+ * Variante visual.
39
+ * - `elevated` (default): sombra sutil.
40
+ * - `outlined`: borde sin sombra.
41
+ * - `plain`: sin borde ni sombra, útil para layouts con nesting.
42
+ */
43
+ variant?: CardVariant;
44
+ /**
45
+ * Densidad del padding interno. Solo aplica al body cuando hay header/footer;
46
+ * cuando no hay slots, aplica al root.
47
+ */
48
+ padding?: CardPadding;
49
+ /** Si `true`, muestra feedback de hover/active (cursor, sombra). */
50
+ clickable?: boolean;
51
+ /**
52
+ * Preset registrado en `theme.styles.Card`. `"default"` usa el estilo
53
+ * built-in sin preset extra.
54
+ */
55
+ preset?: string;
56
+ /**
57
+ * MUI `raised` legacy — mantenido por backward-compat. Equivale a
58
+ * `variant="elevated"` con sombra mayor. Ignora `variant` si se usa.
59
+ */
60
+ raised?: boolean;
61
+ /** sx del root. Se compone sobre el base + preset. */
62
+ sx?: SxProps<Theme>;
63
+ /** sx custom del slot body. */
64
+ bodySx?: SxProps<Theme>;
65
+ /** sx custom del slot header. */
66
+ headerSx?: SxProps<Theme>;
67
+ /** sx custom del slot footer. */
68
+ footerSx?: SxProps<Theme>;
69
+ onClick?: () => void;
70
+ onBlur?: () => void;
71
+ className?: string;
72
+ 'data-testid'?: string;
16
73
  }
17
74
 
18
- export const Card: React.FC<MyCardProps> = ({
19
- children,
20
- raised,
21
- sx,
22
- className,
23
- onClick,
24
- onBlur,
25
- "data-testid": dataTestId
26
- }) => {
27
- return (
28
- <MuiCard
29
- raised={raised}
30
- sx={sx}
31
- className={className}
32
- data-testid={dataTestId}
33
- onClick={onClick}
34
- onBlur={onBlur}
75
+ /**
76
+ * Card semántico con slots `title` / `subtitle` / `actions` / `footer`.
77
+ * Reemplaza el patrón `<div class="card"><div class="card-header">...</div>...`
78
+ * de Metronic/Bootstrap con composición declarativa.
79
+ *
80
+ * Backward-compat: si solo se pasa `children`, se comporta como el Card
81
+ * original (MUI Card + body padding).
82
+ *
83
+ * ```tsx
84
+ * <Card
85
+ * title="Datos del cliente"
86
+ * subtitle="Última actualización: hace 2h"
87
+ * actions={<ActionMenu items={menuItems} />}
88
+ * footer={<Button>Guardar</Button>}
89
+ * >
90
+ * <CustomerForm />
91
+ * </Card>
92
+ * ```
93
+ */
94
+ export function Card({
95
+ children,
96
+ title,
97
+ subtitle,
98
+ actions,
99
+ header,
100
+ footer,
101
+ variant,
102
+ padding = 'normal',
103
+ clickable = false,
104
+ preset,
105
+ raised,
106
+ sx,
107
+ bodySx,
108
+ headerSx,
109
+ footerSx,
110
+ onClick,
111
+ onBlur,
112
+ className,
113
+ 'data-testid': dataTestId,
114
+ }: CardProps) {
115
+ const theme = useTheme();
116
+
117
+ // Back-compat: `raised` legacy => elevated. Si no vienen ni `raised` ni
118
+ // `variant`, default a 'elevated'.
119
+ const resolvedVariant: CardVariant = raised
120
+ ? 'elevated'
121
+ : (variant ?? 'elevated');
122
+
123
+ const hasHeader = Boolean(header || title || subtitle || actions);
124
+ const hasFooter = Boolean(footer);
125
+ const isCompound = hasHeader || hasFooter;
35
126
 
36
- >
127
+ // Cuando hay slots, el root no lleva padding (lo llevan los slots).
128
+ const rootPadding: CardPadding = isCompound ? 'none' : padding;
37
129
 
38
- {children}
130
+ const presetSx = resolvePreset('Card', preset, theme);
39
131
 
40
- </MuiCard>
132
+ const rootSx: SxProps<Theme> = [
133
+ buildCardSx({
134
+ variant: resolvedVariant,
135
+ padding: rootPadding,
136
+ clickable: clickable || Boolean(onClick),
137
+ }),
138
+ ...(presetSx ? [presetSx] : []),
139
+ ...(Array.isArray(sx) ? sx : sx ? [sx] : []),
140
+ ];
141
+
142
+ const renderHeader = () => {
143
+ if (header) return <Box sx={[buildCardHeaderSx(), ...(Array.isArray(headerSx) ? headerSx : headerSx ? [headerSx] : [])]}>{header}</Box>;
144
+ if (!title && !subtitle && !actions) return null;
145
+ return (
146
+ <Box sx={[buildCardHeaderSx(), ...(Array.isArray(headerSx) ? headerSx : headerSx ? [headerSx] : [])]}>
147
+ <Box className="card-header-text">
148
+ {title && (
149
+ <Typography
150
+ variant="subtitle1"
151
+ component="div"
152
+ sx={{ fontWeight: 600, lineHeight: 1.3 }}
153
+ noWrap
154
+ >
155
+ {title}
156
+ </Typography>
157
+ )}
158
+ {subtitle && (
159
+ <Typography
160
+ variant="caption"
161
+ color="text.secondary"
162
+ component="div"
163
+ noWrap
164
+ >
165
+ {subtitle}
166
+ </Typography>
167
+ )}
168
+ </Box>
169
+ {actions && <Box className="card-header-actions">{actions}</Box>}
170
+ </Box>
41
171
  );
42
- };
172
+ };
173
+
174
+ return (
175
+ <MuiCard
176
+ sx={rootSx}
177
+ className={className}
178
+ data-testid={dataTestId}
179
+ onClick={onClick}
180
+ onBlur={onBlur}
181
+ elevation={0} // sombra la maneja buildCardSx
182
+ >
183
+ {renderHeader()}
184
+ {isCompound ? (
185
+ <Box sx={[buildCardBodySx(padding), ...(Array.isArray(bodySx) ? bodySx : bodySx ? [bodySx] : [])]}>
186
+ {children}
187
+ </Box>
188
+ ) : (
189
+ children
190
+ )}
191
+ {hasFooter && (
192
+ <Box sx={[buildCardFooterSx(), ...(Array.isArray(footerSx) ? footerSx : footerSx ? [footerSx] : [])]}>
193
+ {footer}
194
+ </Box>
195
+ )}
196
+ </MuiCard>
197
+ );
198
+ }
43
199
 
44
- export default Card;
200
+ export default Card;
@@ -1 +1,9 @@
1
- export { default as Card } from './Card';
1
+ export { Card, default } from './Card';
2
+ export type { CardProps } from './Card';
3
+ export type { CardVariant, CardPadding } from './Card.sx';
4
+ export {
5
+ buildCardSx,
6
+ buildCardHeaderSx,
7
+ buildCardBodySx,
8
+ buildCardFooterSx,
9
+ } from './Card.sx';
@@ -202,4 +202,27 @@ export const DatePickerReadOnlyDefinition = `
202
202
  </Box>
203
203
  );
204
204
  };
205
- `;
205
+ `;
206
+ export const DatePickerEmptyWithMaskDefinition = `
207
+ import React, { useState } from 'react';
208
+ import { DatePicker } from '@soyfri/shared-library/DatePicker';
209
+ import { Dayjs } from 'dayjs';
210
+ import { Box, Typography } from '@mui/material';
211
+
212
+ export const DatePickerEmptyWithMaskExample = () => {
213
+ const [selectedDate, setSelectedDate] = useState<Dayjs | null>(null);
214
+ return (
215
+ <Box sx={{ width: 300 }}>
216
+ <DatePicker
217
+ label="Fecha"
218
+ selectedDate={selectedDate}
219
+ onDateChange={setSelectedDate}
220
+ format="DD/MM/YY"
221
+ />
222
+ <Typography sx={{ mt: 2 }} variant="caption" color="text.secondary">
223
+ Al estar vacío, el campo muestra la máscara del formato (DD/MM/AA).
224
+ </Typography>
225
+ </Box>
226
+ );
227
+ };
228
+ `;
@@ -0,0 +1,24 @@
1
+ import type { DateValidationError } from '@mui/x-date-pickers/models';
2
+
3
+ /**
4
+ * Traduce el código de error del DatePicker de MUI X a un mensaje en español.
5
+ * Se usa internamente para poblar `helperText` cuando hay error de validación
6
+ * y el consumer no pasó un mensaje propio.
7
+ */
8
+ export const getDateValidationMessage = (
9
+ error: DateValidationError | null,
10
+ ): string => {
11
+ switch (error) {
12
+ case 'minDate':
13
+ case 'maxDate':
14
+ return 'Fecha fuera del rango permitido';
15
+ case 'invalidDate':
16
+ return 'Formato de fecha inválido';
17
+ case 'disableFuture':
18
+ return 'No se permiten fechas futuras';
19
+ case 'disablePast':
20
+ return 'No se permiten fechas pasadas';
21
+ default:
22
+ return '';
23
+ }
24
+ };
@@ -4,7 +4,6 @@ import React, { useState, useMemo } from 'react';
4
4
  import {
5
5
  Box,
6
6
  Typography,
7
- TextField,
8
7
  } from '@mui/material';
9
8
 
10
9
  // Importar las definiciones de las historias
@@ -16,7 +15,7 @@ import {
16
15
  DatePickerSmallSizeDefinition,
17
16
  DatePickerDisabledDefinition,
18
17
  DatePickerReadOnlyDefinition,
19
-
18
+ DatePickerEmptyWithMaskDefinition,
20
19
  } from './DatePicker.definitions'; // Mantener el nombre del archivo de definiciones como está
21
20
  import DatePicker from './DatePicker';
22
21
  import dayjs, { Dayjs } from 'dayjs';
@@ -81,6 +80,34 @@ const meta: Meta<typeof DatePicker> = { // Renombrado a DatePicker
81
80
  }
82
81
  };
83
82
 
83
+ export const DatePickerEmptyWithMask: Story = {
84
+ render: () => {
85
+ const [selectedDate, setSelectedDate] = useState<Dayjs | null>(null);
86
+ return (
87
+ <Box sx={{ width: 300 }}>
88
+ <DatePicker
89
+ label="Fecha"
90
+ selectedDate={selectedDate}
91
+ onDateChange={setSelectedDate}
92
+ format="DD/MM/YY"
93
+ />
94
+ <Typography sx={{ mt: 2 }} variant="caption" color="text.secondary">
95
+ Al estar vacío, el campo muestra la máscara del formato (DD/MM/AA).
96
+ </Typography>
97
+ </Box>
98
+ );
99
+ },
100
+ parameters: {
101
+ docs: {
102
+ description: {
103
+ story:
104
+ "DatePicker vacío. Al no haber valor seleccionado, cada sección del campo muestra su placeholder según el `format` (por ejemplo `DD/MM/AA`), funcionando como máscara visual."
105
+ },
106
+ source: { code: DatePickerEmptyWithMaskDefinition.trim() }
107
+ }
108
+ }
109
+ };
110
+
84
111
  export const DatePickerWithMinMax: Story = {
85
112
  render: () => {
86
113
  const [selectedDate, setSelectedDate] = useState<Dayjs | null>(dayjs('2023-06-15'));
@@ -0,0 +1,33 @@
1
+ import type { SxProps, Theme } from '@mui/material';
2
+
3
+ import { buildFormFieldSx } from '../_shared/formField.sx';
4
+ import { FIELD_INPUT_PADDING_Y } from '../../theme/tokens';
5
+ import type { LabelPosition } from './DatePicker';
6
+
7
+ /**
8
+ * Builder de sx para el DatePicker. Reutiliza `buildFormFieldSx` con
9
+ * `includePickersApi: true` para cubrir tanto la API clásica (MuiInputBase /
10
+ * MuiOutlinedInput) como la nueva (MuiPickersInputBase / MuiPickersOutlinedInput)
11
+ * del DatePicker de MUI X v8.
12
+ */
13
+ export const buildDatePickerSx = (
14
+ borderRadius: number | string,
15
+ labelPosition: LabelPosition,
16
+ ): SxProps<Theme> =>
17
+ buildFormFieldSx({
18
+ borderRadius,
19
+ labelPosition,
20
+ includePickersApi: true,
21
+ extraOutsideSx: {
22
+ '& .MuiInputBase-input': {
23
+ paddingTop: FIELD_INPUT_PADDING_Y,
24
+ paddingBottom: FIELD_INPUT_PADDING_Y,
25
+ },
26
+
27
+ // Secciones editables del PickersTextField (DD/MM/YYYY en API nueva).
28
+ '& .MuiPickersInputBase-sectionsContainer': {
29
+ paddingTop: FIELD_INPUT_PADDING_Y,
30
+ paddingBottom: FIELD_INPUT_PADDING_Y,
31
+ },
32
+ },
33
+ });