@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.
Files changed (283) hide show
  1. package/dist/components/ActionMenu/ActionMenu.cjs +107 -0
  2. package/dist/components/ActionMenu/ActionMenu.cjs.map +1 -0
  3. package/dist/components/ActionMenu/ActionMenu.d.ts +60 -0
  4. package/dist/components/ActionMenu/ActionMenu.js +107 -0
  5. package/dist/components/ActionMenu/ActionMenu.js.map +1 -0
  6. package/dist/components/ActionMenu/index.d.ts +2 -0
  7. package/dist/components/ActionMenu.d.ts +6 -0
  8. package/dist/components/AppBar/AppBar.cjs +346 -0
  9. package/dist/components/AppBar/AppBar.cjs.map +1 -0
  10. package/dist/components/AppBar/AppBar.d.ts +55 -0
  11. package/dist/components/AppBar/AppBar.js +346 -0
  12. package/dist/components/AppBar/AppBar.js.map +1 -0
  13. package/dist/components/AppBar/AppBar.sx.d.ts +12 -0
  14. package/dist/components/AppBar/AppBarBrand.d.ts +31 -0
  15. package/dist/components/AppBar/AppBarContext.d.ts +18 -0
  16. package/dist/components/AppBar/AppBarMenuToggle.d.ts +39 -0
  17. package/dist/components/AppBar/AppBarUserMenu.d.ts +65 -0
  18. package/dist/components/AppBar/index.d.ts +12 -0
  19. package/dist/components/AppBar.d.ts +6 -0
  20. package/dist/components/Autocomplete/Autocomplete.cjs +259 -54
  21. package/dist/components/Autocomplete/Autocomplete.cjs.map +1 -1
  22. package/dist/components/Autocomplete/Autocomplete.d.ts +64 -9
  23. package/dist/components/Autocomplete/Autocomplete.definitions.d.ts +6 -0
  24. package/dist/components/Autocomplete/Autocomplete.helpers.d.ts +18 -0
  25. package/dist/components/Autocomplete/Autocomplete.js +261 -56
  26. package/dist/components/Autocomplete/Autocomplete.js.map +1 -1
  27. package/dist/components/Autocomplete/Autocomplete.sx.d.ts +7 -0
  28. package/dist/components/Autocomplete/Autocomplete.types.d.ts +1 -0
  29. package/dist/components/Autocomplete/_parts/AutocompleteChips.d.ts +19 -0
  30. package/dist/components/Autocomplete/_parts/AutocompleteLoader.d.ts +9 -0
  31. package/dist/components/Autocomplete/_parts/AutocompleteOption.d.ts +19 -0
  32. package/dist/components/Autocomplete/index.d.ts +2 -1
  33. package/dist/components/Autocomplete.d.ts +4 -0
  34. package/dist/components/Avatar/Avatar.cjs +116 -79
  35. package/dist/components/Avatar/Avatar.cjs.map +1 -1
  36. package/dist/components/Avatar/Avatar.d.ts +16 -2
  37. package/dist/components/Avatar/Avatar.definitions.d.ts +11 -0
  38. package/dist/components/Avatar/Avatar.js +117 -80
  39. package/dist/components/Avatar/Avatar.js.map +1 -1
  40. package/dist/components/Card/Card.cjs +168 -9
  41. package/dist/components/Card/Card.cjs.map +1 -1
  42. package/dist/components/Card/Card.d.ts +78 -8
  43. package/dist/components/Card/Card.js +170 -11
  44. package/dist/components/Card/Card.js.map +1 -1
  45. package/dist/components/Card/Card.sx.d.ts +17 -0
  46. package/dist/components/Card/index.d.ts +4 -1
  47. package/dist/components/Card.d.ts +4 -0
  48. package/dist/components/DatePicker/DatePicker.cjs +201 -3
  49. package/dist/components/DatePicker/DatePicker.cjs.map +1 -1
  50. package/dist/components/DatePicker/DatePicker.d.ts +47 -9
  51. package/dist/components/DatePicker/DatePicker.definitions.d.ts +1 -0
  52. package/dist/components/DatePicker/DatePicker.helpers.d.ts +7 -0
  53. package/dist/components/DatePicker/DatePicker.js +200 -2
  54. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  55. package/dist/components/DatePicker/DatePicker.sx.d.ts +9 -0
  56. package/dist/components/DatePicker/DatePicker.types.d.ts +1 -0
  57. package/dist/components/DatePicker/index.d.ts +2 -1
  58. package/dist/components/DatePicker.d.ts +4 -0
  59. package/dist/components/DateTimePicker/DateTimePicker.cjs +152 -138
  60. package/dist/components/DateTimePicker/DateTimePicker.cjs.map +1 -1
  61. package/dist/components/DateTimePicker/DateTimePicker.d.ts +46 -9
  62. package/dist/components/DateTimePicker/DateTimePicker.definitions.d.ts +1 -0
  63. package/dist/components/DateTimePicker/DateTimePicker.helpers.d.ts +11 -0
  64. package/dist/components/DateTimePicker/DateTimePicker.js +152 -138
  65. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  66. package/dist/components/DateTimePicker/DateTimePicker.sx.d.ts +7 -0
  67. package/dist/components/DateTimePicker/DateTimePicker.types.d.ts +1 -0
  68. package/dist/components/DateTimePicker/index.d.ts +2 -1
  69. package/dist/components/DateTimePicker.d.ts +4 -0
  70. package/dist/components/Drawer/Drawer.cjs +271 -0
  71. package/dist/components/Drawer/Drawer.cjs.map +1 -0
  72. package/dist/components/Drawer/Drawer.d.ts +51 -0
  73. package/dist/components/Drawer/Drawer.js +271 -0
  74. package/dist/components/Drawer/Drawer.js.map +1 -0
  75. package/dist/components/Drawer/Drawer.sx.d.ts +23 -0
  76. package/dist/components/Drawer/DrawerContext.d.ts +18 -0
  77. package/dist/components/Drawer/DrawerItem.d.ts +35 -0
  78. package/dist/components/Drawer/index.d.ts +6 -0
  79. package/dist/components/Drawer.d.ts +6 -0
  80. package/dist/components/Icon/Icon.cjs +44 -3
  81. package/dist/components/Icon/Icon.cjs.map +1 -1
  82. package/dist/components/Icon/Icon.d.ts +34 -1
  83. package/dist/components/Icon/Icon.js +44 -3
  84. package/dist/components/Icon/Icon.js.map +1 -1
  85. package/dist/components/Input/Input.cjs +173 -3
  86. package/dist/components/Input/Input.cjs.map +1 -1
  87. package/dist/components/Input/Input.d.ts +20 -15
  88. package/dist/components/Input/Input.definitions.d.ts +5 -2
  89. package/dist/components/Input/Input.helpers.d.ts +14 -0
  90. package/dist/components/Input/Input.js +172 -2
  91. package/dist/components/Input/Input.js.map +1 -1
  92. package/dist/components/Input/Input.sx.d.ts +8 -0
  93. package/dist/components/Input/Input.types.d.ts +1 -0
  94. package/dist/components/Input/index.d.ts +2 -1
  95. package/dist/components/Input.d.ts +4 -0
  96. package/dist/components/InputGroup/InputGroup.cjs +104 -91
  97. package/dist/components/InputGroup/InputGroup.cjs.map +1 -1
  98. package/dist/components/InputGroup/InputGroup.d.ts +37 -1
  99. package/dist/components/InputGroup/InputGroup.definitions.d.ts +6 -0
  100. package/dist/components/InputGroup/InputGroup.js +106 -93
  101. package/dist/components/InputGroup/InputGroup.js.map +1 -1
  102. package/dist/components/Modal/Modal.cjs +226 -116
  103. package/dist/components/Modal/Modal.cjs.map +1 -1
  104. package/dist/components/Modal/Modal.d.ts +38 -2
  105. package/dist/components/Modal/Modal.js +227 -117
  106. package/dist/components/Modal/Modal.js.map +1 -1
  107. package/dist/components/Modal/ModalFooter.d.ts +9 -1
  108. package/dist/components/Modal/index.d.ts +5 -0
  109. package/dist/components/PageLoader/PageLoader.cjs +61 -0
  110. package/dist/components/PageLoader/PageLoader.cjs.map +1 -0
  111. package/dist/components/PageLoader/PageLoader.d.ts +38 -0
  112. package/dist/components/PageLoader/PageLoader.js +61 -0
  113. package/dist/components/PageLoader/PageLoader.js.map +1 -0
  114. package/dist/components/PageLoader/index.d.ts +2 -0
  115. package/dist/components/PageLoader.d.ts +6 -0
  116. package/dist/components/ScrollTopButton/ScrollTopButton.cjs +79 -0
  117. package/dist/components/ScrollTopButton/ScrollTopButton.cjs.map +1 -0
  118. package/dist/components/ScrollTopButton/ScrollTopButton.d.ts +48 -0
  119. package/dist/components/ScrollTopButton/ScrollTopButton.js +79 -0
  120. package/dist/components/ScrollTopButton/ScrollTopButton.js.map +1 -0
  121. package/dist/components/ScrollTopButton/index.d.ts +4 -0
  122. package/dist/components/ScrollTopButton/scrollToTop.d.ts +29 -0
  123. package/dist/components/ScrollTopButton.d.ts +6 -0
  124. package/dist/components/Select/Select.cjs +446 -4
  125. package/dist/components/Select/Select.cjs.map +1 -1
  126. package/dist/components/Select/Select.d.ts +33 -13
  127. package/dist/components/Select/Select.definitions.d.ts +3 -0
  128. package/dist/components/Select/Select.helpers.d.ts +28 -0
  129. package/dist/components/Select/Select.js +445 -3
  130. package/dist/components/Select/Select.js.map +1 -1
  131. package/dist/components/Select/Select.sx.d.ts +7 -0
  132. package/dist/components/Select/Select.types.d.ts +1 -0
  133. package/dist/components/Select/_parts/SelectMenuItem.d.ts +20 -0
  134. package/dist/components/Select/_parts/SelectSearchHeader.d.ts +15 -0
  135. package/dist/components/Select/_parts/SelectValue.d.ts +22 -0
  136. package/dist/components/Select/index.d.ts +2 -1
  137. package/dist/components/Select.d.ts +4 -0
  138. package/dist/components/Stat/Stat.cjs +1 -1
  139. package/dist/components/Stat/Stat.js +1 -1
  140. package/dist/components/Stepper/Stepper.cjs +4 -1
  141. package/dist/components/Stepper/Stepper.cjs.map +1 -1
  142. package/dist/components/Stepper/Stepper.d.ts +5 -0
  143. package/dist/components/Stepper/Stepper.js +4 -1
  144. package/dist/components/Stepper/Stepper.js.map +1 -1
  145. package/dist/components/_shared/formField.sx.d.ts +33 -0
  146. package/dist/components/_shared/resolvePreset.d.ts +18 -0
  147. package/dist/formField.sx-CQ1mbk9M.cjs +76 -0
  148. package/dist/formField.sx-CQ1mbk9M.cjs.map +1 -0
  149. package/dist/formField.sx-DfVbMe0V.js +77 -0
  150. package/dist/formField.sx-DfVbMe0V.js.map +1 -0
  151. package/dist/hooks/Wizard/Wizard.cjs +7 -0
  152. package/dist/hooks/Wizard/Wizard.cjs.map +1 -0
  153. package/dist/hooks/Wizard/Wizard.js +7 -0
  154. package/dist/hooks/Wizard/Wizard.js.map +1 -0
  155. package/dist/hooks/Wizard/WizardContext.d.ts +67 -0
  156. package/dist/hooks/Wizard/index.d.ts +3 -0
  157. package/dist/hooks/Wizard/useWizard.d.ts +9 -0
  158. package/dist/hooks/Wizard.d.ts +2 -0
  159. package/dist/index.cjs +99 -1
  160. package/dist/index.cjs.map +1 -1
  161. package/dist/index.d.ts +3 -0
  162. package/dist/index.js +31 -2
  163. package/dist/index.js.map +1 -1
  164. package/dist/mui.d.ts +5 -0
  165. package/dist/resolvePreset-B-IB0ehH.js +15 -0
  166. package/dist/resolvePreset-B-IB0ehH.js.map +1 -0
  167. package/dist/resolvePreset-CT3kU-K2.cjs +14 -0
  168. package/dist/resolvePreset-CT3kU-K2.cjs.map +1 -0
  169. package/dist/styles.css +3 -112
  170. package/dist/theme/componentStyles.d.ts +32 -0
  171. package/dist/theme/tokens.d.ts +28 -0
  172. package/dist/useWizard-CWdIxZzX.cjs +94 -0
  173. package/dist/useWizard-CWdIxZzX.cjs.map +1 -0
  174. package/dist/useWizard-CWq--C3o.js +95 -0
  175. package/dist/useWizard-CWq--C3o.js.map +1 -0
  176. package/package.json +1 -1
  177. package/src/components/ActionMenu/ActionMenu.stories.tsx +230 -0
  178. package/src/components/ActionMenu/ActionMenu.tsx +174 -0
  179. package/src/components/ActionMenu/index.ts +2 -0
  180. package/src/components/AppBar/AppBar.stories.tsx +272 -0
  181. package/src/components/AppBar/AppBar.sx.ts +32 -0
  182. package/src/components/AppBar/AppBar.tsx +123 -0
  183. package/src/components/AppBar/AppBarBrand.tsx +120 -0
  184. package/src/components/AppBar/AppBarContext.ts +25 -0
  185. package/src/components/AppBar/AppBarMenuToggle.tsx +90 -0
  186. package/src/components/AppBar/AppBarUserMenu.tsx +217 -0
  187. package/src/components/AppBar/index.ts +25 -0
  188. package/src/components/Autocomplete/Autocomplete.definitions.ts +223 -0
  189. package/src/components/Autocomplete/Autocomplete.helpers.ts +60 -0
  190. package/src/components/Autocomplete/Autocomplete.stories.tsx +363 -2
  191. package/src/components/Autocomplete/Autocomplete.sx.ts +30 -0
  192. package/src/components/Autocomplete/Autocomplete.tsx +312 -90
  193. package/src/components/Autocomplete/Autocomplete.types.ts +13 -0
  194. package/src/components/Autocomplete/_parts/AutocompleteChips.tsx +55 -0
  195. package/src/components/Autocomplete/_parts/AutocompleteLoader.tsx +17 -0
  196. package/src/components/Autocomplete/_parts/AutocompleteOption.tsx +31 -0
  197. package/src/components/Autocomplete/index.ts +12 -1
  198. package/src/components/Avatar/Avatar.definitions.ts +162 -0
  199. package/src/components/Avatar/Avatar.stories.tsx +205 -1
  200. package/src/components/Avatar/Avatar.tsx +166 -103
  201. package/src/components/Card/Card.stories.tsx +205 -16
  202. package/src/components/Card/Card.sx.ts +104 -0
  203. package/src/components/Card/Card.tsx +191 -35
  204. package/src/components/Card/index.ts +9 -1
  205. package/src/components/DatePicker/DatePicker.definitions.ts +24 -1
  206. package/src/components/DatePicker/DatePicker.helpers.ts +24 -0
  207. package/src/components/DatePicker/DatePicker.stories.tsx +29 -2
  208. package/src/components/DatePicker/DatePicker.sx.ts +33 -0
  209. package/src/components/DatePicker/DatePicker.tsx +163 -139
  210. package/src/components/DatePicker/DatePicker.types.ts +10 -0
  211. package/src/components/DatePicker/index.ts +9 -1
  212. package/src/components/DateTimePicker/DateTimePicker.definitions.ts +24 -0
  213. package/src/components/DateTimePicker/DateTimePicker.helpers.ts +38 -0
  214. package/src/components/DateTimePicker/DateTimePicker.stories.tsx +29 -1
  215. package/src/components/DateTimePicker/DateTimePicker.sx.ts +30 -0
  216. package/src/components/DateTimePicker/DateTimePicker.tsx +200 -166
  217. package/src/components/DateTimePicker/DateTimePicker.types.ts +10 -0
  218. package/src/components/DateTimePicker/index.ts +9 -1
  219. package/src/components/Drawer/Drawer.stories.tsx +270 -0
  220. package/src/components/Drawer/Drawer.sx.ts +106 -0
  221. package/src/components/Drawer/Drawer.tsx +214 -0
  222. package/src/components/Drawer/DrawerContext.ts +26 -0
  223. package/src/components/Drawer/DrawerItem.tsx +110 -0
  224. package/src/components/Drawer/index.ts +10 -0
  225. package/src/components/Flyout/Flyout.stories.tsx +26 -18
  226. package/src/components/Icon/Icon.stories.tsx +68 -1
  227. package/src/components/Icon/Icon.tsx +87 -6
  228. package/src/components/Input/Input.definitions.ts +74 -2
  229. package/src/components/Input/Input.helpers.ts +49 -0
  230. package/src/components/Input/Input.stories.tsx +116 -4
  231. package/src/components/Input/Input.sx.ts +42 -0
  232. package/src/components/Input/Input.tsx +117 -162
  233. package/src/components/Input/Input.types.ts +10 -0
  234. package/src/components/Input/index.ts +9 -1
  235. package/src/components/InputGroup/InputGroup.definitions.ts +158 -0
  236. package/src/components/InputGroup/InputGroup.stories.tsx +159 -28
  237. package/src/components/InputGroup/InputGroup.tsx +159 -116
  238. package/src/components/Modal/Modal.stories.tsx +434 -6
  239. package/src/components/Modal/Modal.tsx +303 -121
  240. package/src/components/Modal/ModalFooter.tsx +22 -12
  241. package/src/components/Modal/index.ts +6 -1
  242. package/src/components/PageLoader/PageLoader.stories.tsx +217 -0
  243. package/src/components/PageLoader/PageLoader.tsx +96 -0
  244. package/src/components/PageLoader/index.ts +2 -0
  245. package/src/components/ScrollTopButton/ScrollTopButton.stories.tsx +158 -0
  246. package/src/components/ScrollTopButton/ScrollTopButton.tsx +135 -0
  247. package/src/components/ScrollTopButton/index.ts +8 -0
  248. package/src/components/ScrollTopButton/scrollToTop.ts +37 -0
  249. package/src/components/Select/Select.definitions.ts +114 -0
  250. package/src/components/Select/Select.helpers.ts +71 -0
  251. package/src/components/Select/Select.stories.tsx +126 -8
  252. package/src/components/Select/Select.sx.ts +14 -0
  253. package/src/components/Select/Select.tsx +246 -285
  254. package/src/components/Select/Select.types.ts +15 -0
  255. package/src/components/Select/_parts/SelectMenuItem.tsx +40 -0
  256. package/src/components/Select/_parts/SelectSearchHeader.tsx +51 -0
  257. package/src/components/Select/_parts/SelectValue.tsx +96 -0
  258. package/src/components/Select/index.ts +14 -1
  259. package/src/components/Stepper/Stepper.tsx +17 -1
  260. package/src/components/Tooltip/Tooltip.stories.tsx +15 -3
  261. package/src/components/_shared/formField.sx.ts +118 -0
  262. package/src/components/_shared/resolvePreset.ts +35 -0
  263. package/src/hooks/Wizard/Wizard.stories.tsx +301 -0
  264. package/src/hooks/Wizard/WizardContext.tsx +166 -0
  265. package/src/hooks/Wizard/index.ts +6 -0
  266. package/src/hooks/Wizard/useWizard.ts +13 -0
  267. package/src/index.ts +17 -1
  268. package/src/mui.ts +44 -0
  269. package/src/theme/componentStyles.ts +47 -0
  270. package/src/theme/tokens.ts +43 -0
  271. package/dist/DatePicker-BSNboVhN.js +0 -201
  272. package/dist/DatePicker-BSNboVhN.js.map +0 -1
  273. package/dist/DatePicker-BoqxWAhj.cjs +0 -200
  274. package/dist/DatePicker-BoqxWAhj.cjs.map +0 -1
  275. package/dist/Input-DFHs7cJ_.js +0 -171
  276. package/dist/Input-DFHs7cJ_.js.map +0 -1
  277. package/dist/Input-c8MwNNPg.cjs +0 -170
  278. package/dist/Input-c8MwNNPg.cjs.map +0 -1
  279. package/dist/Select-BO2N56sm.cjs +0 -411
  280. package/dist/Select-BO2N56sm.cjs.map +0 -1
  281. package/dist/Select-BcLkyHSE.js +0 -412
  282. package/dist/Select-BcLkyHSE.js.map +0 -1
  283. package/dist/index.css +0 -3
@@ -1,191 +1,225 @@
1
1
  import React, { useMemo } from 'react';
2
+ import type { SxProps, Theme } from '@mui/material';
3
+ import { useTheme } from '@mui/material/styles';
2
4
  import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
3
5
  import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
4
- import { DateTimePicker as MuiDateTimePicker } from '@mui/x-date-pickers/DateTimePicker';
6
+ import {
7
+ DateTimePicker as MuiDateTimePicker,
8
+ type DateTimePickerProps as MuiDateTimePickerProps,
9
+ } from '@mui/x-date-pickers/DateTimePicker';
5
10
  import { DateValidationError } from '@mui/x-date-pickers/models';
6
11
  import { Dayjs } from 'dayjs';
7
- import { styled } from '@mui/system';
8
- import { Box, TextField, TextFieldProps } from '@mui/material';
12
+ import { Controller, type Control, type RegisterOptions } from 'react-hook-form';
9
13
 
10
- // Define las props para el DateTimePicker
11
- export interface DateTimePickerProps {
12
- label: string;
13
- selectedDateTime: Dayjs | null;
14
- onDateTimeChange: (dateTime: Dayjs | null) => void;
14
+ import { buildDateTimePickerSx } from './DateTimePicker.sx';
15
+ import {
16
+ buildLocaleText,
17
+ getDateTimeValidationMessage,
18
+ } from './DateTimePicker.helpers';
19
+ import { resolvePreset } from '../_shared/resolvePreset';
20
+
21
+ // ── Tipos de dominio ─────────────────────────────────────────────────────
22
+ export type LabelPosition = 'outside' | 'floating';
23
+ export type DateTimePickerSize = 'small' | 'medium';
24
+
25
+ // ── Props base ───────────────────────────────────────────────────────────
26
+ export interface BaseDateTimePickerProps
27
+ extends Omit<MuiDateTimePickerProps, 'value' | 'onChange' | 'slotProps' | 'format'> {
28
+ label?: string;
15
29
  minDateTime?: Dayjs;
16
30
  maxDateTime?: Dayjs;
17
31
  disabled?: boolean;
18
32
  readOnly?: boolean;
33
+ /** Formato de la fecha/hora. Default: 'DD/MM/YYYY HH:mm'. */
19
34
  inputFormat?: string;
20
- slotProps?: any;
35
+ /** Border radius del input. Default: 10. */
36
+ borderRadius?: number | string;
37
+ /** "outside" (default) o "floating". */
38
+ labelPosition?: LabelPosition;
39
+ /** Tamaño del TextField. Default: 'small'. */
40
+ size?: DateTimePickerSize;
41
+ helperText?: string;
42
+ error?: boolean;
43
+ sx?: SxProps<Theme>;
44
+ className?: string;
45
+ /**
46
+ * Nombre del preset de estilo registrado en `theme.styles.DateTimePicker`.
47
+ * - `"default"` (o ausente) = estilo built-in del paquete.
48
+ * - Cualquier otro string = mergea el preset encima del estilo built-in.
49
+ */
50
+ preset?: string;
51
+ /** Locale del adaptador dayjs. */
52
+ adapterLocale?: string;
53
+ /** Textos de los botones del popover. */
21
54
  clearButtonText?: string;
22
55
  cancelButtonText?: string;
23
56
  acceptButtonText?: string;
24
57
  minutesStep?: number;
25
58
  minTime?: Dayjs;
26
59
  customClass?: string;
27
- viewRenderers?: any
28
- timeSteps?: any
60
+ viewRenderers?: any;
61
+ timeSteps?: any;
62
+ /** Si es true usa formato 12h, false = 24h. Default: false. */
29
63
  ampm?: boolean;
64
+ textFieldProps?: Record<string, any>;
65
+ /** Passthrough completo a slotProps del MuiDateTimePicker. */
66
+ slotProps?: MuiDateTimePickerProps['slotProps'];
30
67
  }
31
68
 
32
- // 1. Crear un componente estilizado para el TextField
33
- // Este componente tendrá los mismos estilos de altura, padding y label que tu Input.tsx
34
- const StyledTextField = styled(TextField)(({ theme }) => ({
35
- '& .MuiInputBase-root': {
36
- maxHeight: '34px',
37
- padding: '8px 10px',
38
- borderRadius: '10px',
39
- display: 'flex',
40
- alignItems: 'center',
41
- fontSize: '14px',
42
- },
43
- '& .MuiInputBase-input': {
44
- padding: '0 !important',
45
- height: '18px',
46
- display: 'flex',
47
- alignItems: 'center',
48
- marginTop: '-4px'
49
- },
50
- '& .MuiInputLabel-root': {
51
- top: '50%',
52
- transform: 'translate(14px, -50%)',
53
- '&.MuiInputLabel-shrink': {
54
- transform: 'translate(1px, -200%) scale(0.75)',
55
- fontSize: '16px !important',
56
- '> legend': {
57
- display: 'none',
58
- }
59
- },
60
- },
61
- '& .MuiOutlinedInput-notchedOutline': {
62
- border: '0.7px solid',
63
- borderColor: '#e0e0e0',
64
- },
65
- }));
66
-
67
- /**
68
- * Custom Material UI DateTimePicker component.
69
- * Allows selecting a date and time, and updates a Dayjs state.
70
- */
71
- export const DateTimePicker: React.FC<DateTimePickerProps> = ({
72
- label,
73
- selectedDateTime,
74
- onDateTimeChange,
75
- minDateTime,
76
- maxDateTime,
77
- disabled,
78
- readOnly,
79
- customClass= '',
80
- inputFormat,
81
- slotProps,
82
- clearButtonText,
83
- cancelButtonText,
84
- acceptButtonText,
85
- minutesStep,
86
- minTime,
87
- viewRenderers,
88
- timeSteps,
89
- ampm,
90
- ...rest
91
- }) => {
92
- const [error, setError] = React.useState<DateValidationError | null>(null);
93
-
94
- const errorMessage = useMemo(() => {
95
- switch (error) {
96
- case 'minDate':
97
- case 'maxDate':
98
- case 'invalidDate': {
99
- return 'Formato de fecha/hora inválido';
100
- }
101
- case 'disableFuture': {
102
- return 'No se permiten fechas/horas futuras';
103
- }
104
- case 'disablePast': {
105
- return 'No se permiten fechas/horas pasadas';
106
- }
107
- default: {
108
- return '';
109
- }
110
- }
111
- }, [error]);
112
-
113
- const customLocaleText = useMemo(() => {
114
- const text: Record<string, string> = {};
115
- if (clearButtonText) text.clearButtonLabel = clearButtonText;
116
- if (cancelButtonText) text.cancelButtonLabel = cancelButtonText;
117
- if (acceptButtonText) text.okButtonLabel = acceptButtonText;
118
- return text;
119
- }, [clearButtonText, cancelButtonText, acceptButtonText]);
120
-
121
- return (
122
- <LocalizationProvider dateAdapter={AdapterDayjs}>
123
- <Box
124
- sx={{
125
- width: '100%',
126
- display: 'grid',
127
- marginBottom: '10px',
128
- marginTop: '10px'
129
- }}
69
+ // ── Variantes discriminadas (RHF vs controlado) ──────────────────────────
70
+ export interface RHFDateTimePickerProps extends BaseDateTimePickerProps {
71
+ name: string;
72
+ control: Control<any>;
73
+ validation?: RegisterOptions;
74
+ selectedDateTime?: never;
75
+ onDateTimeChange?: never;
76
+ }
77
+
78
+ export interface ControlledDateTimePickerProps extends BaseDateTimePickerProps {
79
+ name?: string;
80
+ control?: never;
81
+ validation?: never;
82
+ selectedDateTime: Dayjs | null;
83
+ onDateTimeChange: (dateTime: Dayjs | null) => void;
84
+ }
85
+
86
+ // ── API pública final ────────────────────────────────────────────────────
87
+ export type DateTimePickerProps =
88
+ | RHFDateTimePickerProps
89
+ | ControlledDateTimePickerProps;
90
+
91
+ export const DateTimePicker: React.FC<DateTimePickerProps> = (props) => {
92
+ const {
93
+ label,
94
+ minDateTime,
95
+ maxDateTime,
96
+ disabled,
97
+ readOnly,
98
+ inputFormat,
99
+ borderRadius = 10,
100
+ labelPosition = 'outside',
101
+ size = 'small',
102
+ helperText,
103
+ error: errorProp,
104
+ sx,
105
+ className,
106
+ preset,
107
+ adapterLocale,
108
+ clearButtonText,
109
+ cancelButtonText,
110
+ acceptButtonText,
111
+ minutesStep,
112
+ minTime,
113
+ customClass,
114
+ viewRenderers,
115
+ timeSteps,
116
+ ampm = false,
117
+ textFieldProps,
118
+ slotProps: slotPropsProp,
119
+ ...rest
120
+ } = props as ControlledDateTimePickerProps & {
121
+ control?: Control<any>;
122
+ validation?: RegisterOptions;
123
+ };
130
124
 
125
+ const [validationError, setValidationError] = React.useState<DateValidationError | null>(null);
126
+
127
+ const validationErrorMessage = useMemo(
128
+ () => getDateTimeValidationMessage(validationError),
129
+ [validationError],
130
+ );
131
+
132
+ const customLocaleText = useMemo(
133
+ () => buildLocaleText(clearButtonText, cancelButtonText, acceptButtonText),
134
+ [clearButtonText, cancelButtonText, acceptButtonText],
135
+ );
136
+
137
+ const theme = useTheme();
138
+ const presetSx = resolvePreset('DateTimePicker', preset, theme);
139
+
140
+ const mergedSx = [
141
+ buildDateTimePickerSx(borderRadius, labelPosition),
142
+ ...(presetSx ? [presetSx] : []),
143
+ ...(Array.isArray(sx) ? sx : [sx]),
144
+ ];
145
+
146
+ const renderPicker = (
147
+ value: Dayjs | null,
148
+ onChange: (date: Dayjs | null) => void,
149
+ onBlur?: () => void,
150
+ inputRef?: React.Ref<any>,
151
+ rhfError?: boolean,
152
+ rhfHelperText?: string,
153
+ ) => {
154
+ const finalError = rhfError || !!validationErrorMessage || !!errorProp;
155
+ const finalHelperText = rhfHelperText || validationErrorMessage || helperText;
156
+
157
+ return (
158
+ <LocalizationProvider
159
+ dateAdapter={AdapterDayjs}
160
+ {...(adapterLocale ? { adapterLocale } : {})}
131
161
  >
132
- <MuiDateTimePicker
133
- className={customClass}
134
- label={label}
135
- value={selectedDateTime}
136
- onChange={onDateTimeChange}
137
- minDateTime={minDateTime}
138
- maxDateTime={maxDateTime}
139
- minutesStep={minutesStep}
140
- disabled={disabled}
141
- readOnly={readOnly}
142
- minTime={minTime}
143
- format={inputFormat ? inputFormat: 'DD/MM/YYYY HH:mm'}
144
- viewRenderers={viewRenderers}
145
- timeSteps={timeSteps}
146
- sx={{
147
- '& .MuiPickersInputBase-root, .MuiPickersOutlinedInput-root': {
148
- maxHeight: '28px',
149
- borderRadius: '10px',
150
- },
151
- '& .MuiInputLabel-root': {
152
- // El label se alinea con el padding del input base.
153
- top: '50%',
154
- transform: 'translate(14px, -50%)',
155
-
156
- // Estilo para el label "encogido" cuando el input está lleno o en foco
157
- '&.MuiInputLabel-shrink': {
158
- transform: 'translate(1px, -200%) scale(0.75)', // Ajustar la posición para que se vea por encima del input
159
- fontSize: '16px !important',
160
- '> legend': {
161
- display: 'none', // Ocultar el legend del outline
162
- }
163
- },
164
- },
165
- '& .MuiPickersInputBase-root > fieldset > legend':{
166
- display: 'none', // Ocultar el legend del outline
167
- },
168
- }}
169
- slotProps={{
170
- ...slotProps,
171
- // 2. Usar 'slotProps' para pasar el componente estilizado al TextField
172
- textField: {
173
- ...slotProps?.textField,
174
- helperText: errorMessage || slotProps?.textField?.helperText,
175
- error: !!errorMessage || slotProps?.textField?.error,
176
- InputProps: {
177
- ...slotProps?.textField?.InputProps,
178
- inputComponent: StyledTextField,
179
- },
180
- },
181
- }}
182
- localeText={{ ...customLocaleText }}
183
- ampm={false}
184
- {...rest}
162
+ <MuiDateTimePicker
163
+ className={customClass || className}
164
+ label={label}
165
+ value={value}
166
+ onChange={onChange}
167
+ onError={setValidationError}
168
+ minDateTime={minDateTime}
169
+ maxDateTime={maxDateTime}
170
+ minutesStep={minutesStep}
171
+ disabled={disabled}
172
+ readOnly={readOnly}
173
+ minTime={minTime}
174
+ format={inputFormat ?? 'DD/MM/YYYY HH:mm'}
175
+ viewRenderers={viewRenderers}
176
+ timeSteps={timeSteps}
177
+ ampm={ampm}
178
+ sx={mergedSx}
179
+ slotProps={{
180
+ ...slotPropsProp,
181
+ textField: {
182
+ fullWidth: true,
183
+ size,
184
+ variant: 'outlined',
185
+ onBlur,
186
+ inputRef,
187
+ error: !!finalError,
188
+ helperText: finalHelperText,
189
+ ...(slotPropsProp?.textField as Record<string, any> | undefined),
190
+ ...textFieldProps,
191
+ } as any,
192
+ }}
193
+ localeText={customLocaleText}
194
+ {...(rest as any)}
195
+ />
196
+ </LocalizationProvider>
197
+ );
198
+ };
199
+
200
+ if ('control' in props && props.control) {
201
+ const { name, control, validation } = props as RHFDateTimePickerProps;
202
+ return (
203
+ <Controller
204
+ name={name}
205
+ control={control}
206
+ rules={validation}
207
+ render={({ field, fieldState: { error: fieldError } }) =>
208
+ renderPicker(
209
+ field.value ?? null,
210
+ field.onChange,
211
+ field.onBlur,
212
+ field.ref,
213
+ !!fieldError,
214
+ fieldError?.message,
215
+ )
216
+ }
185
217
  />
186
- </Box>
187
- </LocalizationProvider>
188
- );
218
+ );
219
+ }
220
+
221
+ const { selectedDateTime, onDateTimeChange } = props as ControlledDateTimePickerProps;
222
+ return renderPicker(selectedDateTime, onDateTimeChange);
189
223
  };
190
224
 
191
- export default DateTimePicker;
225
+ export default DateTimePicker;
@@ -0,0 +1,10 @@
1
+ // Re-export barrel para compatibilidad con imports antiguos.
2
+ // Los tipos ahora viven dentro de DateTimePicker.tsx.
3
+ export type {
4
+ LabelPosition,
5
+ DateTimePickerSize,
6
+ BaseDateTimePickerProps,
7
+ RHFDateTimePickerProps,
8
+ ControlledDateTimePickerProps,
9
+ DateTimePickerProps,
10
+ } from './DateTimePicker';
@@ -1 +1,9 @@
1
- export { default as DateTimePicker } from './DateTimePicker';
1
+ export { DateTimePicker, default } from './DateTimePicker';
2
+ export type {
3
+ DateTimePickerProps,
4
+ BaseDateTimePickerProps,
5
+ RHFDateTimePickerProps,
6
+ ControlledDateTimePickerProps,
7
+ LabelPosition,
8
+ DateTimePickerSize,
9
+ } from './DateTimePicker.types';