@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,20 +1,35 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
- import React, { useState } from 'react';
2
+ import { useState } from 'react';
3
3
  import { Box, Typography } from '@mui/material';
4
- import InputGroup from './InputGroup'; // Asegúrate de tener este componente
5
-
6
4
  import dayjs, { Dayjs } from 'dayjs';
7
- import Select, { SelectOption } from '@soyfri/shared-library/components/Select/Select';
8
- import { Input } from '@soyfri/shared-library/components/Input';
9
- import { Button } from "@soyfri/shared-library/components/Button";
10
- import { DatePicker } from '@soyfri/shared-library/components/DatePicker';
5
+
6
+ import InputGroup from './InputGroup';
7
+ import { Input } from '../Input';
8
+ import Select, { SelectOption } from '../Select/Select';
9
+ import { Button } from '../Button';
10
+ import { DatePicker } from '../DatePicker';
11
+
12
+ import {
13
+ BasicInputGroupDefinition,
14
+ CombinedInputGroupDefinition,
15
+ DatePickerInputGroupDefinition,
16
+ VerticalInputGroupDefinition,
17
+ CustomStylingInputGroupDefinition,
18
+ DisabledInputGroupDefinition,
19
+ } from './InputGroup.definitions';
11
20
 
12
21
  const meta: Meta<typeof InputGroup> = {
13
- title: 'InputGroup',
22
+ title: 'Components/InputGroup',
14
23
  component: InputGroup,
15
24
  tags: ['autodocs'],
16
25
  parameters: {
17
26
  layout: 'centered',
27
+ docs: {
28
+ description: {
29
+ component:
30
+ 'Agrupa visualmente varios campos (Input / Select / DatePicker / Button, etc.) bajo un único borde, con separadores internos por cada slot. Respeta el espacio reservado para los labels `outside` de Input/Select, y mantiene el contenido centrado verticalmente sin importar si cada hijo tiene label o no.',
31
+ },
32
+ },
18
33
  },
19
34
  decorators: [
20
35
  (Story) => (
@@ -23,6 +38,29 @@ const meta: Meta<typeof InputGroup> = {
23
38
  </Box>
24
39
  ),
25
40
  ],
41
+ argTypes: {
42
+ borderRadius: {
43
+ control: 'number',
44
+ description: 'Radio del borde del grupo. Default: 10.',
45
+ },
46
+ orientation: {
47
+ control: 'radio',
48
+ options: ['horizontal', 'vertical'],
49
+ description: 'Orientación del grupo.',
50
+ },
51
+ disabled: {
52
+ control: 'boolean',
53
+ description: 'Desactiva visualmente el grupo (los hijos manejan su propio `disabled` lógico).',
54
+ },
55
+ sx: {
56
+ control: false,
57
+ description: 'sx del contenedor raíz. Se mergea sobre los defaults.',
58
+ },
59
+ slotSx: {
60
+ control: false,
61
+ description: 'sx aplicado a cada slot que envuelve un hijo.',
62
+ },
63
+ },
26
64
  };
27
65
 
28
66
  export default meta;
@@ -50,9 +88,7 @@ export const BasicInputGroup: Story = {
50
88
  value={text}
51
89
  onChange={(val) => setText(val as string)}
52
90
  />
53
- <Button variant="outlined">
54
- Buscar
55
- </Button>
91
+ <Button variant="outlined">Buscar</Button>
56
92
  </InputGroup>
57
93
  </Box>
58
94
  );
@@ -60,10 +96,11 @@ export const BasicInputGroup: Story = {
60
96
  parameters: {
61
97
  docs: {
62
98
  description: {
63
- story: 'Un grupo de entrada simple que combina un campo de texto y un botón.'
64
- }
65
- }
66
- }
99
+ story: 'Un grupo de entrada simple que combina un campo de texto y un botón.',
100
+ },
101
+ source: { code: BasicInputGroupDefinition.trim() },
102
+ },
103
+ },
67
104
  };
68
105
 
69
106
  export const CombinedInputGroup: Story = {
@@ -88,9 +125,7 @@ export const CombinedInputGroup: Story = {
88
125
  value={text}
89
126
  onChange={(val) => setText(val as string)}
90
127
  />
91
- <Button variant="contained">
92
- Aplicar
93
- </Button>
128
+ <Button variant="contained">Aplicar</Button>
94
129
  </InputGroup>
95
130
  </Box>
96
131
  );
@@ -98,10 +133,12 @@ export const CombinedInputGroup: Story = {
98
133
  parameters: {
99
134
  docs: {
100
135
  description: {
101
- story: 'Un ejemplo más complejo que agrupa un `Select`, un `Input` y un `Button` en una sola fila.'
102
- }
103
- }
104
- }
136
+ story:
137
+ 'Select + Input + Button compartiendo un borde. Los labels de Select e Input flotan por encima del borde del grupo con la misma animación que fuera del grupo.',
138
+ },
139
+ source: { code: CombinedInputGroupDefinition.trim() },
140
+ },
141
+ },
105
142
  };
106
143
 
107
144
  export const DatePickerInputGroup: Story = {
@@ -119,8 +156,73 @@ export const DatePickerInputGroup: Story = {
119
156
  selectedDate={selectedDate}
120
157
  onDateChange={(date) => setSelectedDate(date)}
121
158
  />
122
- <Button variant="contained">
123
- Ver calendario
159
+ <Button variant="contained">Ver calendario</Button>
160
+ </InputGroup>
161
+ </Box>
162
+ );
163
+ },
164
+ parameters: {
165
+ docs: {
166
+ description: {
167
+ story: 'Un grupo de entrada que combina un `DatePicker` con un botón de acción.',
168
+ },
169
+ source: { code: DatePickerInputGroupDefinition.trim() },
170
+ },
171
+ },
172
+ };
173
+
174
+ export const VerticalInputGroup: Story = {
175
+ render: () => {
176
+ const [nombre, setNombre] = useState('');
177
+ const [email, setEmail] = useState('');
178
+
179
+ return (
180
+ <Box sx={{ width: 320 }}>
181
+ <InputGroup orientation="vertical">
182
+ <Input
183
+ label="Nombre"
184
+ value={nombre}
185
+ onChange={(val) => setNombre(val as string)}
186
+ />
187
+ <Input
188
+ label="Email"
189
+ value={email}
190
+ onChange={(val) => setEmail(val as string)}
191
+ />
192
+ </InputGroup>
193
+ </Box>
194
+ );
195
+ },
196
+ parameters: {
197
+ docs: {
198
+ description: {
199
+ story: 'Grupo en orientación vertical: los separadores pasan a ser horizontales entre slots.',
200
+ },
201
+ source: { code: VerticalInputGroupDefinition.trim() },
202
+ },
203
+ },
204
+ };
205
+
206
+ export const CustomStyling: Story = {
207
+ render: () => {
208
+ const [q, setQ] = useState('');
209
+
210
+ return (
211
+ <Box sx={{ width: 500 }}>
212
+ <InputGroup
213
+ borderRadius={999}
214
+ sx={{
215
+ bgcolor: 'action.hover',
216
+ borderColor: 'primary.main',
217
+ }}
218
+ >
219
+ <Input
220
+ label="Búsqueda avanzada"
221
+ value={q}
222
+ onChange={(val) => setQ(val as string)}
223
+ />
224
+ <Button variant="contained" color="primary">
225
+ Buscar
124
226
  </Button>
125
227
  </InputGroup>
126
228
  </Box>
@@ -129,8 +231,37 @@ export const DatePickerInputGroup: Story = {
129
231
  parameters: {
130
232
  docs: {
131
233
  description: {
132
- story: 'Un grupo de entrada que combina un `DatePicker` con un botón de acción.'
133
- }
134
- }
135
- }
234
+ story:
235
+ 'Demo del passthrough de `sx` y `borderRadius`. El consumidor puede pintar fondo, cambiar el color del borde o dejar el grupo completamente pill-shaped (`borderRadius={999}`) sin tocar el componente.',
236
+ },
237
+ source: { code: CustomStylingInputGroupDefinition.trim() },
238
+ },
239
+ },
240
+ };
241
+
242
+ export const DisabledGroup: Story = {
243
+ render: () => (
244
+ <Box sx={{ width: 400 }}>
245
+ <InputGroup disabled>
246
+ <Input
247
+ label="Búsqueda"
248
+ value=""
249
+ onChange={() => {}}
250
+ disabled
251
+ />
252
+ <Button variant="outlined" disabled>
253
+ Buscar
254
+ </Button>
255
+ </InputGroup>
256
+ </Box>
257
+ ),
258
+ parameters: {
259
+ docs: {
260
+ description: {
261
+ story:
262
+ '`disabled` aplica opacidad y bloquea interacciones en el grupo. Cada hijo debe manejar su propio `disabled` lógico (validación, formularios, etc.).',
263
+ },
264
+ source: { code: DisabledInputGroupDefinition.trim() },
265
+ },
266
+ },
136
267
  };
@@ -1,136 +1,179 @@
1
- import React, { Children, cloneElement, isValidElement } from 'react';
2
- import { Box } from '@mui/material';
3
- import { DatePicker as MuiDatePicker } from '@mui/x-date-pickers/DatePicker';
4
- import { Select as MuiSelect } from '@mui/material';
5
- import { TextField as MuiTextField } from '@mui/material';
6
- import { Input } from '../Input';
7
- import { Select } from '../Select';
8
- import { DatePicker } from '../DatePicker';
1
+ import React, { Children, isValidElement } from 'react';
2
+ import { Box, type SxProps, type Theme } from '@mui/material';
9
3
 
10
- interface CommonProps {
11
- sx?: object;
12
- [key: string]: any;
13
- }
14
-
15
- interface InputGroupProps {
4
+ export interface InputGroupProps {
16
5
  children: React.ReactNode;
6
+ /**
7
+ * sx aplicado al contenedor raíz del grupo. Se mergea sobre los defaults.
8
+ */
9
+ sx?: SxProps<Theme>;
10
+ /**
11
+ * sx aplicado a cada slot individual. Útil para controlar flex/gap entre
12
+ * los hijos del grupo.
13
+ */
14
+ slotSx?: SxProps<Theme>;
15
+ /**
16
+ * Radio del borde del grupo. Default: 10.
17
+ */
18
+ borderRadius?: number | string;
19
+ /**
20
+ * Desactiva visualmente el grupo (no cascada lógica — los hijos deben
21
+ * manejar su propio `disabled`).
22
+ */
23
+ disabled?: boolean;
24
+ /**
25
+ * Orientación del grupo. Default: 'horizontal'.
26
+ */
27
+ orientation?: 'horizontal' | 'vertical';
28
+ className?: string;
17
29
  }
18
30
 
19
- const InputGroup: React.FC<InputGroupProps> = ({ children }) => {
20
- const childrenArray = Children.toArray(children);
31
+ const mergeSx = (base: SxProps<Theme>, extra?: SxProps<Theme>): SxProps<Theme> => {
32
+ if (!extra) return base;
33
+ const baseArr = Array.isArray(base) ? base : [base];
34
+ const extraArr = Array.isArray(extra) ? extra : [extra];
35
+ return [...baseArr, ...extraArr] as SxProps<Theme>;
36
+ };
37
+
38
+ /**
39
+ * Agrupa visualmente varios componentes de entrada (Input / Select / DatePicker /
40
+ * Button, etc.) compartiendo un solo borde y con separadores internos.
41
+ *
42
+ * El grupo respeta el espacio que Input/Select reservan para su label `outside`
43
+ * (marginTop=14px) moviendo ese reservado al contenedor externo y cancelándolo
44
+ * en los hijos. Los labels siguen flotando por encima del borde del grupo con
45
+ * la misma animación que fuera del grupo.
46
+ *
47
+ * No inspecciona el tipo de cada hijo; aplica los overrides a través de
48
+ * descendant selectors por CSS para funcionar con cualquier wrapper / memoizado.
49
+ */
50
+ const InputGroup: React.FC<InputGroupProps> = ({
51
+ children,
52
+ sx,
53
+ slotSx,
54
+ borderRadius = 10,
55
+ disabled,
56
+ orientation = 'horizontal',
57
+ className,
58
+ }) => {
59
+ const radius = typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius;
60
+ const slots = Children.toArray(children).filter(isValidElement);
61
+ const isHorizontal = orientation === 'horizontal';
21
62
 
22
- const childrenWithDividers = childrenArray.map((child, index) => {
23
- if (isValidElement(child)) {
24
- const childProps = child.props as CommonProps;
25
- const childType = child.type as any;
63
+ const baseSx: SxProps<Theme> = {
64
+ // Respeta el label "outside" de Input/Select: los hijos pierden su marginTop
65
+ // (ver más abajo) y el grupo reserva el mismo espacio arriba para que los
66
+ // labels floten por encima del borde del grupo.
67
+ marginTop: '14px',
26
68
 
27
- const isInputComponent = (
28
- childType === MuiTextField ||
29
- childType === Input ||
30
- childType === MuiSelect ||
31
- childType === Select ||
32
- childType === MuiDatePicker ||
33
- childType === DatePicker
34
- );
69
+ display: 'flex',
70
+ flexDirection: isHorizontal ? 'row' : 'column',
71
+ alignItems: 'stretch',
72
+ width: '100%',
73
+ border: (theme) => `1px solid ${theme.palette.divider}`,
74
+ borderRadius: radius,
75
+ backgroundColor: 'background.paper',
76
+ transition: 'border-color 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms, box-shadow 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms',
77
+ '&:focus-within': {
78
+ borderColor: 'primary.main',
79
+ boxShadow: (theme) => `0 0 0 1px ${theme.palette.primary.main}`,
80
+ },
81
+ opacity: disabled ? 0.6 : 1,
82
+ pointerEvents: disabled ? 'none' : 'auto',
35
83
 
36
- const clonedChild = isInputComponent ? (
37
- cloneElement(child, {
38
- ...childProps,
39
- // Añade la clase directamente al componente clonado
40
- className: 'InputGroupChild',
41
- sx: {
42
- ...childProps.sx,
43
- // Usa el selector correcto para anular el borde del NotchedOutline
44
- '& .MuiOutlinedInput-notchedOutline': {
45
- border: 'none !important',
46
- },
47
- // Asegura que el botón del DatePicker no tenga borde divisor
48
- '& .MuiInputBase-root .MuiButtonBase-root': {
49
- borderRight: 'none',
50
- },
51
- // Oculta el legend de MuiOutlinedInput para que el borde no tenga "muescas"
52
- '& .MuiOutlinedInput-notchedOutline > legend': {
53
- display: 'none',
54
- },
84
+ // Cancelar el marginTop que Input/Select reservan en labelPosition="outside".
85
+ // El grupo ya lo reservó en su nivel externo.
86
+ '& .MuiFormControl-root, & > .InputGroup__slot > .MuiTextField-root, & > .InputGroup__slot > .MuiFormControl-root': {
87
+ marginTop: 0,
88
+ },
55
89
 
56
- ' .InputGroupChild > MuiOutlinedInput-notchedOutline': {
57
- border: 'none !important',
90
+ // Quitar el borde del notched outline interno: el borde visible es el del
91
+ // grupo, los separadores son los borderRight/borderBottom de cada slot.
92
+ '& .MuiOutlinedInput-notchedOutline': {
93
+ border: 'none',
94
+ },
58
95
 
59
- },
60
- '.MuiOutlinedInput-notchedOutline, > .MuiOutlinedInput-notchedOutline': {
61
- border: 'none !important',
62
- }
96
+ // Forzar que todos los campos pinten sus esquinas cuadradas (las esquinas
97
+ // redondeadas se aplican solo al primer/último slot más abajo).
98
+ '& .MuiInputBase-root, & .MuiChip-root': {
99
+ borderRadius: 0,
100
+ },
63
101
 
102
+ // Botones integrados: sin radius propio, altura completa, sin sombra.
103
+ '& .MuiButton-root': {
104
+ borderRadius: 0,
105
+ height: '100%',
106
+ boxShadow: 'none',
107
+ border: 'none',
108
+ },
109
+
110
+ // Slots: cada hijo vive en un slot neutro que lo centra verticalmente.
111
+ '& > .InputGroup__slot': {
112
+ flex: 1,
113
+ display: 'flex',
114
+ alignItems: 'center',
115
+ minWidth: 0,
116
+ // Separador entre slots (horizontal: borderRight / vertical: borderBottom),
117
+ // usando el color de divider del theme.
118
+ ...(isHorizontal
119
+ ? { borderRight: (theme: Theme) => `1px solid ${theme.palette.divider}` }
120
+ : { borderBottom: (theme: Theme) => `1px solid ${theme.palette.divider}` }),
121
+ '&:last-of-type': {
122
+ borderRight: 'none',
123
+ borderBottom: 'none',
124
+ },
125
+ },
126
+
127
+ // Esquinas redondeadas: primer slot (izquierda o arriba).
128
+ '& > .InputGroup__slot:first-of-type .MuiInputBase-root, & > .InputGroup__slot:first-of-type .MuiButton-root, & > .InputGroup__slot:first-of-type .MuiChip-root':
129
+ isHorizontal
130
+ ? {
131
+ borderTopLeftRadius: radius,
132
+ borderBottomLeftRadius: radius,
133
+ }
134
+ : {
135
+ borderTopLeftRadius: radius,
136
+ borderTopRightRadius: radius,
64
137
  },
65
- } as CommonProps)
66
- ) : (
67
- child
68
- );
69
138
 
70
- return (
71
- <Box
72
- key={index}
73
- sx={{
74
- flexGrow: 1,
75
- display: 'flex',
76
- alignItems: 'center',
77
- minWidth: 0,
78
- borderRight: index < childrenArray.length - 1 ? '1px solid #ccc' : 'none',
79
- }}
80
- >
81
- {clonedChild}
82
- </Box>
83
- );
84
- }
85
- return child;
86
- });
139
+ // Esquinas redondeadas: último slot (derecha o abajo).
140
+ '& > .InputGroup__slot:last-of-type .MuiInputBase-root, & > .InputGroup__slot:last-of-type .MuiButton-root, & > .InputGroup__slot:last-of-type .MuiChip-root':
141
+ isHorizontal
142
+ ? {
143
+ borderTopRightRadius: radius,
144
+ borderBottomRightRadius: radius,
145
+ }
146
+ : {
147
+ borderBottomLeftRadius: radius,
148
+ borderBottomRightRadius: radius,
149
+ },
150
+ };
87
151
 
88
- return (
89
- <Box
90
- sx={{
91
- width: '100%',
92
- display: 'grid',
93
- marginBottom: '10px',
94
- marginTop: '10px'
95
- }}
152
+ const baseSlotSx: SxProps<Theme> = {
153
+ flex: 1,
154
+ display: 'flex',
155
+ alignItems: 'center',
156
+ minWidth: 0,
157
+ };
96
158
 
97
- >
159
+ return (
98
160
  <Box
99
- className='InputGroupChild'
100
- sx={{
101
- display: 'flex',
102
- justifyContent: 'space-between',
103
- height: '32px',
104
- border: '1px solid #ccc',
105
- borderRadius: '10px',
106
- padding: '8px 0px',
107
- marginTop: '-5px',
108
- marginBottom: '20px',
109
- '& .MuiInputBase-root, & .MuiButtonBase-root, & .MuiChip-root': {
110
- borderRadius: 0,
111
- },
112
- '& > div:first-of-type .MuiInputBase-root, & > div:first-of-type .MuiButtonBase-root, & > div:first-of-type .MuiChip-root': {
113
- borderTopLeftRadius: '10px',
114
- borderBottomLeftRadius: '10px',
115
- },
116
- '& > div:last-of-type .MuiInputBase-root, & > div:last-of-type .MuiButtonBase-root, & > div:last-of-type .MuiChip-root': {
117
- borderTopRightRadius: '10px',
118
- borderBottomRightRadius: '10px',
119
- border: 'none !important'
120
- },
121
- // Estilo para los componentes que tienen `InputGroupChild` en la clase
122
- '& .InputGroupChild': {
123
- width: '100%',
124
- },
125
- '& > div:first-of-type .MuiInputBase-root > .MuiOutlinedInput-notchedOutline': {
126
- border: 'none !important',
127
- },
128
- }}
161
+ data-testid="input-group"
162
+ className={className}
163
+ aria-disabled={disabled ? 'true' : undefined}
164
+ sx={mergeSx(baseSx, sx)}
129
165
  >
130
- {childrenWithDividers}
166
+ {slots.map((child, i) => (
167
+ <Box
168
+ key={i}
169
+ className="InputGroup__slot"
170
+ sx={mergeSx(baseSlotSx, slotSx)}
171
+ >
172
+ {child}
173
+ </Box>
174
+ ))}
131
175
  </Box>
132
- </Box>
133
176
  );
134
177
  };
135
178
 
136
- export default InputGroup;
179
+ export default InputGroup;