@soyfri/shared-library 2.0.0-beta.13 → 2.0.0-beta.15

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 (289) hide show
  1. package/{Autocomplete-C2x-lBvZ.cjs → Autocomplete-4i0dNDKr.cjs} +55 -33
  2. package/Autocomplete-4i0dNDKr.cjs.map +1 -0
  3. package/{Autocomplete-BA-cGASd.js → Autocomplete-i3-V38n1.js} +56 -34
  4. package/Autocomplete-i3-V38n1.js.map +1 -0
  5. package/{Avatar-BJTr-PBd.js → Avatar-CgT7955R.js} +18 -19
  6. package/Avatar-CgT7955R.js.map +1 -0
  7. package/{Avatar-9L7YMxya.cjs → Avatar-CuSrK8Wn.cjs} +18 -19
  8. package/Avatar-CuSrK8Wn.cjs.map +1 -0
  9. package/Button-C17mExpd.cjs.map +1 -1
  10. package/Button-UkkP-bNw.js.map +1 -1
  11. package/Card-B1wtavyl.js +98 -0
  12. package/Card-B1wtavyl.js.map +1 -0
  13. package/Card-DfdU610V.cjs +97 -0
  14. package/Card-DfdU610V.cjs.map +1 -0
  15. package/Checkbox-BCqMFWt4.cjs +187 -0
  16. package/Checkbox-BCqMFWt4.cjs.map +1 -0
  17. package/Checkbox-gB5YKkVo.js +188 -0
  18. package/Checkbox-gB5YKkVo.js.map +1 -0
  19. package/{DatePicker-DLSfkgGA.cjs → DatePicker-CtCFqXDw.cjs} +41 -64
  20. package/DatePicker-CtCFqXDw.cjs.map +1 -0
  21. package/{DatePicker-8f_9bwhS.js → DatePicker-D0Bz9Ryg.js} +37 -60
  22. package/DatePicker-D0Bz9Ryg.js.map +1 -0
  23. package/{DateTimePicker-D4L9GAod.js → DateTimePicker-77w-9TP5.js} +27 -17
  24. package/DateTimePicker-77w-9TP5.js.map +1 -0
  25. package/{DateTimePicker-CWNW09-O.cjs → DateTimePicker-CTnRQCZo.cjs} +31 -21
  26. package/DateTimePicker-CTnRQCZo.cjs.map +1 -0
  27. package/{Input-DI0jfq5X.cjs → Input-jYapjJYM.cjs} +27 -14
  28. package/Input-jYapjJYM.cjs.map +1 -0
  29. package/{Input-Cp911l23.js → Input-rVVhI_wk.js} +24 -11
  30. package/Input-rVVhI_wk.js.map +1 -0
  31. package/{Modal-Bm_HH9cv.cjs → Modal-BN5s-Tfk.cjs} +126 -98
  32. package/Modal-BN5s-Tfk.cjs.map +1 -0
  33. package/{Modal-Bnz6d9m9.js → Modal-BRZMPwDj.js} +134 -106
  34. package/Modal-BRZMPwDj.js.map +1 -0
  35. package/{RadioGroup-CxqDHap1.cjs → RadioGroup-Dd0rHXSX.cjs} +10 -8
  36. package/RadioGroup-Dd0rHXSX.cjs.map +1 -0
  37. package/{RadioGroup-DMi9FvMP.js → RadioGroup-bO-ahP9T.js} +10 -8
  38. package/RadioGroup-bO-ahP9T.js.map +1 -0
  39. package/Select-B6jE3WH_.cjs +253 -0
  40. package/Select-B6jE3WH_.cjs.map +1 -0
  41. package/Select-bSVQokFX.js +254 -0
  42. package/Select-bSVQokFX.js.map +1 -0
  43. package/StatusMessage-B3nXpuRl.cjs +88 -0
  44. package/StatusMessage-B3nXpuRl.cjs.map +1 -0
  45. package/StatusMessage-D0WgSBx7.js +89 -0
  46. package/StatusMessage-D0WgSBx7.js.map +1 -0
  47. package/Step-BArsou1V.js +301 -0
  48. package/Step-BArsou1V.js.map +1 -0
  49. package/Step-Nd7SJbRZ.cjs +300 -0
  50. package/Step-Nd7SJbRZ.cjs.map +1 -0
  51. package/{Switch-BIeobv6i.cjs → Switch-CQFOopYy.cjs} +6 -3
  52. package/Switch-CQFOopYy.cjs.map +1 -0
  53. package/{Switch-DQEOxM2R.js → Switch-D72dpkH2.js} +6 -3
  54. package/Switch-D72dpkH2.js.map +1 -0
  55. package/{Tab-Co31KY2k.cjs → Tab-BbP8jBcK.cjs} +43 -28
  56. package/Tab-BbP8jBcK.cjs.map +1 -0
  57. package/Tab-BxSxKJsP.js +111 -0
  58. package/Tab-BxSxKJsP.js.map +1 -0
  59. package/components/ActionMenu/ActionMenu.cjs +52 -52
  60. package/components/ActionMenu/ActionMenu.cjs.map +1 -1
  61. package/components/ActionMenu/ActionMenu.d.ts +20 -36
  62. package/components/ActionMenu/ActionMenu.js +55 -55
  63. package/components/ActionMenu/ActionMenu.js.map +1 -1
  64. package/components/ActionMenu/index.d.ts +2 -2
  65. package/components/AppBar/AppBar.cjs +2 -219
  66. package/components/AppBar/AppBar.cjs.map +1 -1
  67. package/components/AppBar/AppBar.d.ts +6 -6
  68. package/components/AppBar/AppBar.js +5 -222
  69. package/components/AppBar/AppBar.js.map +1 -1
  70. package/components/AppBar/index.d.ts +0 -6
  71. package/components/Autocomplete/Autocomplete.cjs +1 -1
  72. package/components/Autocomplete/Autocomplete.d.ts +8 -6
  73. package/components/Autocomplete/Autocomplete.helpers.d.ts +8 -4
  74. package/components/Autocomplete/Autocomplete.js +1 -1
  75. package/components/Autocomplete/_parts/AutocompleteOption.d.ts +5 -8
  76. package/components/Autocomplete/index.d.ts +1 -1
  77. package/components/Avatar/Avatar.cjs +1 -1
  78. package/components/Avatar/Avatar.js +1 -1
  79. package/components/Avatar/index.d.ts +1 -0
  80. package/components/Button/Button.d.ts +5 -5
  81. package/components/Button/index.d.ts +1 -0
  82. package/components/Card/Card.cjs +1 -4
  83. package/components/Card/Card.cjs.map +1 -1
  84. package/components/Card/Card.d.ts +3 -50
  85. package/components/Card/Card.js +1 -4
  86. package/components/Card/Card.sx.d.ts +3 -6
  87. package/components/Card/index.d.ts +1 -1
  88. package/components/Checkbox/Checkbox.cjs +6 -0
  89. package/components/Checkbox/Checkbox.cjs.map +1 -0
  90. package/components/Checkbox/Checkbox.d.ts +55 -0
  91. package/components/Checkbox/Checkbox.js +6 -0
  92. package/components/Checkbox/Checkbox.js.map +1 -0
  93. package/components/Checkbox/Checkbox.sx.d.ts +13 -0
  94. package/components/Checkbox/index.d.ts +2 -0
  95. package/components/Checkbox.d.ts +6 -0
  96. package/components/Chip/Chip.cjs +2 -1
  97. package/components/Chip/Chip.cjs.map +1 -1
  98. package/components/Chip/Chip.js +3 -2
  99. package/components/Chip/index.d.ts +2 -1
  100. package/components/Chip.d.ts +4 -0
  101. package/components/DatePicker/DatePicker.cjs +1 -1
  102. package/components/DatePicker/DatePicker.d.ts +1 -13
  103. package/components/DatePicker/DatePicker.js +1 -1
  104. package/components/DatePicker/index.d.ts +1 -1
  105. package/components/DateTimePicker/DateTimePicker.cjs +1 -1
  106. package/components/DateTimePicker/DateTimePicker.d.ts +10 -6
  107. package/components/DateTimePicker/DateTimePicker.definitions.d.ts +2 -0
  108. package/components/DateTimePicker/DateTimePicker.helpers.d.ts +4 -2
  109. package/components/DateTimePicker/DateTimePicker.js +1 -1
  110. package/components/DateTimePicker/index.d.ts +1 -1
  111. package/components/Drawer/Drawer.cjs +10 -6
  112. package/components/Drawer/Drawer.cjs.map +1 -1
  113. package/components/Drawer/Drawer.js +11 -7
  114. package/components/Drawer/Drawer.js.map +1 -1
  115. package/components/Drawer/DrawerItem.d.ts +6 -1
  116. package/components/Gallery/Gallery.cjs +154 -79
  117. package/components/Gallery/Gallery.cjs.map +1 -1
  118. package/components/Gallery/Gallery.d.ts +25 -9
  119. package/components/Gallery/Gallery.js +154 -79
  120. package/components/Gallery/Gallery.js.map +1 -1
  121. package/components/Gallery/GalleryLightbox.d.ts +6 -10
  122. package/components/Gallery/GalleryMain.d.ts +3 -7
  123. package/components/Gallery/GalleryThumbnails.d.ts +7 -11
  124. package/components/Gallery/index.d.ts +2 -1
  125. package/components/Gallery.d.ts +4 -0
  126. package/components/Icon/Icon.cjs +6 -8
  127. package/components/Icon/Icon.cjs.map +1 -1
  128. package/components/Icon/Icon.d.ts +11 -17
  129. package/components/Icon/Icon.js +6 -8
  130. package/components/Icon/Icon.js.map +1 -1
  131. package/components/Icon/index.d.ts +2 -1
  132. package/components/Icon.d.ts +4 -0
  133. package/components/Input/Input.cjs +1 -1
  134. package/components/Input/Input.d.ts +9 -2
  135. package/components/Input/Input.helpers.d.ts +3 -3
  136. package/components/Input/Input.js +1 -1
  137. package/components/Input/index.d.ts +1 -1
  138. package/components/InputGroup/InputGroup.cjs +23 -22
  139. package/components/InputGroup/InputGroup.cjs.map +1 -1
  140. package/components/InputGroup/InputGroup.d.ts +4 -4
  141. package/components/InputGroup/InputGroup.js +22 -21
  142. package/components/InputGroup/InputGroup.js.map +1 -1
  143. package/components/InputGroup/index.d.ts +2 -1
  144. package/components/InputGroup.d.ts +4 -0
  145. package/components/Modal/Modal.cjs +1 -1
  146. package/components/Modal/Modal.d.ts +20 -5
  147. package/components/Modal/Modal.js +6 -6
  148. package/components/Modal/ModalBody.d.ts +6 -1
  149. package/components/Modal/ModalFooter.d.ts +4 -4
  150. package/components/Modal/ModalHeader.d.ts +6 -1
  151. package/components/Modal/index.d.ts +2 -0
  152. package/components/RadioGroup/RadioGroup.cjs +1 -1
  153. package/components/RadioGroup/RadioGroup.d.ts +9 -3
  154. package/components/RadioGroup/RadioGroup.js +1 -1
  155. package/components/RadioGroup/index.d.ts +1 -1
  156. package/components/Select/Select.cjs +1 -1
  157. package/components/Select/Select.d.ts +13 -18
  158. package/components/Select/Select.helpers.d.ts +5 -19
  159. package/components/Select/Select.js +1 -1
  160. package/components/Select/index.d.ts +1 -1
  161. package/components/Stat/Stat.cjs +2 -2
  162. package/components/Stat/Stat.js +3 -3
  163. package/components/Stat/Stat.js.map +1 -1
  164. package/components/Stat/index.d.ts +2 -1
  165. package/components/Stat.d.ts +4 -0
  166. package/components/StatusMessage/StatusMessage.cjs +1 -1
  167. package/components/StatusMessage/StatusMessage.d.ts +20 -36
  168. package/components/StatusMessage/StatusMessage.js +1 -1
  169. package/components/Stepper/Stepper.cjs +6 -2
  170. package/components/Stepper/Stepper.cjs.map +1 -1
  171. package/components/Stepper/Stepper.d.ts +9 -8
  172. package/components/Stepper/Stepper.js +6 -2
  173. package/{hooks/Wizard/WizardContext.d.ts → components/Stepper/StepperContext.d.ts} +28 -22
  174. package/components/Stepper/_hooks/useHorizontalScroll.d.ts +19 -0
  175. package/components/Stepper/_parts/StepperScrollArrow.d.ts +19 -0
  176. package/components/Stepper/index.d.ts +6 -2
  177. package/components/Stepper.d.ts +4 -0
  178. package/components/Switch/Switch.cjs +1 -1
  179. package/components/Switch/Switch.d.ts +7 -2
  180. package/components/Switch/Switch.js +1 -1
  181. package/components/Tabs/Tabs.cjs +3 -2
  182. package/components/Tabs/Tabs.cjs.map +1 -1
  183. package/components/Tabs/Tabs.d.ts +21 -16
  184. package/components/Tabs/Tabs.js +3 -2
  185. package/components/Tabs/index.d.ts +4 -2
  186. package/components/Tabs.d.ts +4 -0
  187. package/components/Timeline/Timeline.cjs +3 -3
  188. package/components/Timeline/Timeline.cjs.map +1 -1
  189. package/components/Timeline/Timeline.d.ts +4 -8
  190. package/components/Timeline/Timeline.js +2 -2
  191. package/components/Timeline/Timeline.js.map +1 -1
  192. package/components/Timeline/index.d.ts +4 -3
  193. package/components/Timeline.d.ts +4 -0
  194. package/components/_shared/mergeSx.d.ts +7 -0
  195. package/{formField.sx-DfVbMe0V.js → formField.sx-8_QRnKxv.js} +2 -11
  196. package/formField.sx-8_QRnKxv.js.map +1 -0
  197. package/{formField.sx-CQ1mbk9M.cjs → formField.sx-BAX7KwMR.cjs} +10 -19
  198. package/formField.sx-BAX7KwMR.cjs.map +1 -0
  199. package/index.cjs +38 -15
  200. package/index.cjs.map +1 -1
  201. package/index.d.ts +3 -0
  202. package/index.js +33 -19
  203. package/index.js.map +1 -1
  204. package/mergeSx-BXoNZjB_.js +10 -0
  205. package/mergeSx-BXoNZjB_.js.map +1 -0
  206. package/mergeSx-Dbccoo_H.cjs +9 -0
  207. package/mergeSx-Dbccoo_H.cjs.map +1 -0
  208. package/mui.d.ts +2 -1
  209. package/package.json +32 -42
  210. package/theme/componentStyles.d.ts +1 -1
  211. package/tokens-BRrcP_p_.js +21 -0
  212. package/tokens-BRrcP_p_.js.map +1 -0
  213. package/tokens-jaWWNk39.cjs +20 -0
  214. package/tokens-jaWWNk39.cjs.map +1 -0
  215. package/utils/index.d.ts +2 -0
  216. package/{components/ScrollTopButton → utils}/scrollToTop.d.ts +6 -7
  217. package/Autocomplete-BA-cGASd.js.map +0 -1
  218. package/Autocomplete-C2x-lBvZ.cjs.map +0 -1
  219. package/Avatar-9L7YMxya.cjs.map +0 -1
  220. package/Avatar-BJTr-PBd.js.map +0 -1
  221. package/Card-DG_crfkK.cjs +0 -185
  222. package/Card-DG_crfkK.cjs.map +0 -1
  223. package/Card-Ug-ttVSh.js +0 -186
  224. package/Card-Ug-ttVSh.js.map +0 -1
  225. package/DatePicker-8f_9bwhS.js.map +0 -1
  226. package/DatePicker-DLSfkgGA.cjs.map +0 -1
  227. package/DateTimePicker-CWNW09-O.cjs.map +0 -1
  228. package/DateTimePicker-D4L9GAod.js.map +0 -1
  229. package/Input-Cp911l23.js.map +0 -1
  230. package/Input-DI0jfq5X.cjs.map +0 -1
  231. package/Modal-Bm_HH9cv.cjs.map +0 -1
  232. package/Modal-Bnz6d9m9.js.map +0 -1
  233. package/RadioGroup-CxqDHap1.cjs.map +0 -1
  234. package/RadioGroup-DMi9FvMP.js.map +0 -1
  235. package/Select-3CBOfM2H.js +0 -447
  236. package/Select-3CBOfM2H.js.map +0 -1
  237. package/Select-Bku4f4f8.cjs +0 -446
  238. package/Select-Bku4f4f8.cjs.map +0 -1
  239. package/StatusMessage-C5B6oGZ_.cjs +0 -78
  240. package/StatusMessage-C5B6oGZ_.cjs.map +0 -1
  241. package/StatusMessage-D1GlfQdz.js +0 -79
  242. package/StatusMessage-D1GlfQdz.js.map +0 -1
  243. package/Step-Dq0N72YB.js +0 -49
  244. package/Step-Dq0N72YB.js.map +0 -1
  245. package/Step-a8U8O-91.cjs +0 -48
  246. package/Step-a8U8O-91.cjs.map +0 -1
  247. package/Switch-BIeobv6i.cjs.map +0 -1
  248. package/Switch-DQEOxM2R.js.map +0 -1
  249. package/Tab-Co31KY2k.cjs.map +0 -1
  250. package/Tab-DiK62gRz.js +0 -96
  251. package/Tab-DiK62gRz.js.map +0 -1
  252. package/components/AppBar/AppBarBrand.d.ts +0 -31
  253. package/components/AppBar/AppBarUserMenu.d.ts +0 -65
  254. package/components/Autocomplete/Autocomplete.types.d.ts +0 -1
  255. package/components/DatePicker/DatePicker.types.d.ts +0 -1
  256. package/components/DateTimePicker/DateTimePicker.types.d.ts +0 -1
  257. package/components/Input/Input.types.d.ts +0 -1
  258. package/components/PageLoader/PageLoader.cjs +0 -61
  259. package/components/PageLoader/PageLoader.cjs.map +0 -1
  260. package/components/PageLoader/PageLoader.d.ts +0 -38
  261. package/components/PageLoader/PageLoader.js +0 -61
  262. package/components/PageLoader/PageLoader.js.map +0 -1
  263. package/components/PageLoader/index.d.ts +0 -2
  264. package/components/PageLoader.d.ts +0 -6
  265. package/components/RadioGroup/RadioGroup.types.d.ts +0 -1
  266. package/components/ScrollTopButton/ScrollTopButton.cjs +0 -79
  267. package/components/ScrollTopButton/ScrollTopButton.cjs.map +0 -1
  268. package/components/ScrollTopButton/ScrollTopButton.d.ts +0 -48
  269. package/components/ScrollTopButton/ScrollTopButton.js +0 -79
  270. package/components/ScrollTopButton/ScrollTopButton.js.map +0 -1
  271. package/components/ScrollTopButton/index.d.ts +0 -4
  272. package/components/ScrollTopButton.d.ts +0 -6
  273. package/components/Select/Select.definitions.d.ts +0 -17
  274. package/components/Select/Select.types.d.ts +0 -1
  275. package/components/Select/_parts/SelectSearchHeader.d.ts +0 -15
  276. package/formField.sx-CQ1mbk9M.cjs.map +0 -1
  277. package/formField.sx-DfVbMe0V.js.map +0 -1
  278. package/hooks/Wizard/Wizard.cjs +0 -7
  279. package/hooks/Wizard/Wizard.cjs.map +0 -1
  280. package/hooks/Wizard/Wizard.js +0 -7
  281. package/hooks/Wizard/Wizard.js.map +0 -1
  282. package/hooks/Wizard/index.d.ts +0 -3
  283. package/hooks/Wizard/useWizard.d.ts +0 -9
  284. package/hooks/Wizard.d.ts +0 -2
  285. package/useWizard-CWdIxZzX.cjs +0 -94
  286. package/useWizard-CWdIxZzX.cjs.map +0 -1
  287. package/useWizard-CWq--C3o.js +0 -95
  288. package/useWizard-CWq--C3o.js.map +0 -1
  289. /package/{styles.css → index.css} +0 -0
@@ -35,7 +35,7 @@ const React = require("react");
35
35
  const material = require("@mui/material");
36
36
  const styles = require("@mui/material/styles");
37
37
  const reactHookForm = require("react-hook-form");
38
- const formField_sx = require("./formField.sx-CQ1mbk9M.cjs");
38
+ const formField_sx = require("./formField.sx-BAX7KwMR.cjs");
39
39
  const resolvePreset = require("./resolvePreset-CxTI6_Ln.cjs");
40
40
  const ClearIcon = require("@mui/icons-material/Clear");
41
41
  const buildAutocompleteSx = (borderRadius, labelPosition) => formField_sx.buildFormFieldSx({
@@ -62,16 +62,26 @@ const resolveMultipleValue = (options, value) => {
62
62
  if (!Array.isArray(value)) return [];
63
63
  return options.filter((o) => value.includes(o.value));
64
64
  };
65
+ const areOptionsShallowEqual = (a, b) => {
66
+ const keysA = Object.keys(a);
67
+ const keysB = Object.keys(b);
68
+ if (keysA.length !== keysB.length) return false;
69
+ return keysA.every((k) => a[k] === b[k]);
70
+ };
65
71
  const areResolvedValuesEqual = (prev, next, multiple) => {
66
72
  if (multiple) {
67
73
  if (!Array.isArray(prev) || !Array.isArray(next)) return false;
68
74
  if (prev.length !== next.length) return false;
69
75
  return prev.every((o, i) => {
70
- var _a;
71
- return o.value === ((_a = next[i]) == null ? void 0 : _a.value);
76
+ const n2 = next[i];
77
+ return !!n2 && areOptionsShallowEqual(o, n2);
72
78
  });
73
79
  }
74
- return (prev == null ? void 0 : prev.value) === (next == null ? void 0 : next.value);
80
+ const p = prev;
81
+ const n = next;
82
+ if (p === n) return true;
83
+ if (!p || !n) return false;
84
+ return areOptionsShallowEqual(p, n);
75
85
  };
76
86
  const isResolvedValueEmpty = (resolvedValue, multiple) => {
77
87
  if (multiple) {
@@ -84,8 +94,7 @@ const AutocompleteOption = ({
84
94
  option,
85
95
  customRender
86
96
  }) => {
87
- const _a = liProps, { key: _ignored } = _a, liRest = __objRest(_a, ["key"]);
88
- return /* @__PURE__ */ jsxRuntime.jsx("li", __spreadProps(__spreadValues({}, liRest), { children: customRender ? customRender(option) : option.label }), option.value);
97
+ return /* @__PURE__ */ jsxRuntime.jsx("li", __spreadProps(__spreadValues({}, liProps), { children: customRender ? customRender(option) : option.label }));
89
98
  };
90
99
  const AutocompleteChips = ({
91
100
  value,
@@ -98,16 +107,16 @@ const AutocompleteChips = ({
98
107
  const hidden = value.length - maxChipsToShow;
99
108
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
100
109
  displayed.map((option, index) => {
101
- const tagProps = getTagProps({ index });
102
- return /* @__PURE__ */ React.createElement(
110
+ const _a = getTagProps({ index }), { key: _ignored } = _a, tagProps = __objRest(_a, ["key"]);
111
+ return /* @__PURE__ */ jsxRuntime.jsx(
103
112
  material.Chip,
104
113
  __spreadProps(__spreadValues({}, tagProps), {
105
- key: option.value,
106
114
  size,
107
115
  label: renderChipLabel ? renderChipLabel(option) : option.label,
108
116
  avatar: option.img ? /* @__PURE__ */ jsxRuntime.jsx(material.Avatar, { src: option.img }) : void 0,
109
117
  deleteIcon: /* @__PURE__ */ jsxRuntime.jsx(ClearIcon, {})
110
- })
118
+ }),
119
+ option.value
111
120
  );
112
121
  }),
113
122
  hidden > 0 && /* @__PURE__ */ jsxRuntime.jsx(material.Chip, { size, label: `+${hidden} más` })
@@ -139,7 +148,6 @@ function Autocomplete(props) {
139
148
  noOptionsText = "No hay opciones",
140
149
  loadingText,
141
150
  sx,
142
- className,
143
151
  preset,
144
152
  textFieldProps,
145
153
  onInputChange,
@@ -193,7 +201,6 @@ function Autocomplete(props) {
193
201
  disabled,
194
202
  readOnly,
195
203
  loading,
196
- className,
197
204
  sx: mergedSx,
198
205
  freeSolo,
199
206
  open,
@@ -206,27 +213,34 @@ function Autocomplete(props) {
206
213
  var _a;
207
214
  return typeof opt === "string" ? opt : (_a = opt == null ? void 0 : opt.label) != null ? _a : "";
208
215
  },
209
- isOptionEqualToValue: (a, b) => (a == null ? void 0 : a.value) === (b == null ? void 0 : b.value),
210
- getOptionDisabled: (opt) => !!(opt == null ? void 0 : opt.disabled),
216
+ isOptionEqualToValue: (a, b) => {
217
+ if (typeof a === "string" || typeof b === "string") return a === b;
218
+ return (a == null ? void 0 : a.value) === (b == null ? void 0 : b.value);
219
+ },
220
+ getOptionDisabled: (opt) => typeof opt === "string" ? false : !!(opt == null ? void 0 : opt.disabled),
211
221
  onChange: handleChange,
212
222
  onFocus: () => setIsFocused(true),
213
223
  onBlur: () => {
214
224
  setIsFocused(false);
215
225
  onBlur == null ? void 0 : onBlur();
216
226
  },
217
- renderOption: (liProps, option) => /* @__PURE__ */ jsxRuntime.jsx(
218
- AutocompleteOption,
219
- {
220
- liProps,
221
- option,
222
- customRender: renderOptionItem
223
- }
224
- ),
225
- renderTags: multiple ? (value, getTagProps) => /* @__PURE__ */ jsxRuntime.jsx(
227
+ renderOption: (liProps, option) => {
228
+ const _a = liProps, { key } = _a, liRest = __objRest(_a, ["key"]);
229
+ return /* @__PURE__ */ jsxRuntime.jsx(
230
+ AutocompleteOption,
231
+ {
232
+ liProps: liRest,
233
+ option,
234
+ customRender: renderOptionItem
235
+ },
236
+ key
237
+ );
238
+ },
239
+ renderValue: multiple ? (value, getItemProps) => /* @__PURE__ */ jsxRuntime.jsx(
226
240
  AutocompleteChips,
227
241
  {
228
242
  value,
229
- getTagProps,
243
+ getTagProps: getItemProps,
230
244
  size,
231
245
  maxChipsToShow,
232
246
  renderChipLabel
@@ -259,18 +273,23 @@ function Autocomplete(props) {
259
273
  }
260
274
  );
261
275
  };
262
- const handleControlledChange = (_event, newValue) => {
276
+ const extractValue = (opt) => {
263
277
  var _a;
278
+ return typeof opt === "string" ? opt : (_a = opt == null ? void 0 : opt.value) != null ? _a : null;
279
+ };
280
+ const handleControlledChange = (_event, newValue) => {
264
281
  const onChange = props.onChange;
265
282
  if (multiple) {
266
- const values = (newValue != null ? newValue : []).map((opt) => opt.value);
283
+ const values = (newValue != null ? newValue : []).map(
284
+ (opt) => extractValue(opt)
285
+ );
267
286
  onChange(values);
268
287
  } else {
269
- onChange((_a = newValue == null ? void 0 : newValue.value) != null ? _a : null);
288
+ onChange(extractValue(newValue));
270
289
  }
271
290
  };
272
291
  if ("control" in props && props.control) {
273
- const { name, control, validation } = props;
292
+ const { name, control, validation, onValueChange } = props;
274
293
  return /* @__PURE__ */ jsxRuntime.jsx(
275
294
  reactHookForm.Controller,
276
295
  {
@@ -282,13 +301,16 @@ function Autocomplete(props) {
282
301
  multiple ? resolveMultipleValue(resolvePool, field.value) : resolveSingleValue(resolvePool, field.value)
283
302
  );
284
303
  const handleChange = (_event, newValue) => {
285
- var _a;
286
304
  if (multiple) {
287
- field.onChange(
288
- (newValue != null ? newValue : []).map((opt) => opt.value)
305
+ const next = (newValue != null ? newValue : []).map(
306
+ (opt) => extractValue(opt)
289
307
  );
308
+ field.onChange(next);
309
+ onValueChange == null ? void 0 : onValueChange(next);
290
310
  } else {
291
- field.onChange((_a = newValue == null ? void 0 : newValue.value) != null ? _a : null);
311
+ const next = extractValue(newValue);
312
+ field.onChange(next);
313
+ onValueChange == null ? void 0 : onValueChange(next);
292
314
  }
293
315
  };
294
316
  return renderAutocomplete(
@@ -312,4 +334,4 @@ function Autocomplete(props) {
312
334
  const AutocompleteSelect = Autocomplete;
313
335
  exports.Autocomplete = Autocomplete;
314
336
  exports.AutocompleteSelect = AutocompleteSelect;
315
- //# sourceMappingURL=Autocomplete-C2x-lBvZ.cjs.map
337
+ //# sourceMappingURL=Autocomplete-4i0dNDKr.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Autocomplete-4i0dNDKr.cjs","sources":["../src/components/Autocomplete/Autocomplete.sx.ts","../src/components/Autocomplete/Autocomplete.helpers.ts","../src/components/Autocomplete/_parts/AutocompleteOption.tsx","../src/components/Autocomplete/_parts/AutocompleteChips.tsx","../src/components/Autocomplete/_parts/AutocompleteLoader.tsx","../src/components/Autocomplete/Autocomplete.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { buildFormFieldSx } from '../_shared/formField.sx';\nimport type { LabelPosition } from './Autocomplete';\n\n/**\n * Builder del sx del Autocomplete. Reutiliza `buildFormFieldSx` y añade\n * los paddings propios del Autocomplete (chips + input interno).\n */\nexport const buildAutocompleteSx = (\n borderRadius: number | string,\n labelPosition: LabelPosition,\n): SxProps<Theme> =>\n buildFormFieldSx({\n borderRadius,\n labelPosition,\n extraOutsideSx: {\n // El input interno del Autocomplete.\n '& .MuiAutocomplete-input': {\n paddingTop: '4px',\n paddingBottom: '4px',\n },\n\n // Contenedor del input (donde viven los chips en modo multiple).\n '& .MuiAutocomplete-inputRoot': {\n paddingTop: '4px',\n paddingBottom: '4px',\n },\n },\n });\n","import type { SxProps, Theme } from '@mui/material/styles';\nimport type { SelectOption } from './Autocomplete';\n\n/** Resuelve un value único a su SelectOption dentro del pool. */\nexport const resolveSingleValue = (\n options: SelectOption[],\n value: SelectOption['value'] | null | undefined,\n): SelectOption | null => options.find((o) => o.value === value) ?? null;\n\n/** Resuelve un array de values a sus SelectOption dentro del pool. */\nexport const resolveMultipleValue = (\n options: SelectOption[],\n value: SelectOption['value'][] | null | undefined,\n): SelectOption[] => {\n if (!Array.isArray(value)) return [];\n return options.filter((o) => value.includes(o.value));\n};\n\n/** Merge de sx base + extra del consumer, respetando el contrato de MUI. */\nexport const mergeSx = (\n base: SxProps<Theme>,\n extra?: SxProps<Theme>,\n): SxProps<Theme> => {\n if (!extra) return base;\n return [base, ...(Array.isArray(extra) ? extra : [extra])] as SxProps<Theme>;\n};\n\n/**\n * Compara dos SelectOption por todas sus props (shallow). Se usa para detectar\n * cambios de metadata (p.ej. `label`, `img`) cuando `value` no cambió, para\n * que la estabilización no tape datos frescos del server.\n */\nconst areOptionsShallowEqual = (a: SelectOption, b: SelectOption): boolean => {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n return keysA.every((k) => a[k] === b[k]);\n};\n\n/**\n * Compara dos valores resueltos (single o multiple) estructuralmente para\n * decidir si se puede reusar la referencia previa. Se usa para estabilizar la\n * referencia que se pasa a MUI Autocomplete (MUI compara value por referencia\n * con `!==`, y una nueva referencia — aunque el contenido sea igual — dispara\n * `resetInputValue` y borra el texto mientras el usuario tipea).\n *\n * Comparamos todas las props del SelectOption, no solo `value`, para que un\n * refresh de metadata (label/img/etc.) invalide la referencia estabilizada\n * y la UI muestre los datos actualizados.\n */\nexport const areResolvedValuesEqual = (\n prev: SelectOption | SelectOption[] | null,\n next: SelectOption | SelectOption[] | null,\n multiple: boolean,\n): boolean => {\n if (multiple) {\n if (!Array.isArray(prev) || !Array.isArray(next)) return false;\n if (prev.length !== next.length) return false;\n return prev.every((o, i) => {\n const n = next[i];\n return !!n && areOptionsShallowEqual(o, n);\n });\n }\n const p = prev as SelectOption | null;\n const n = next as SelectOption | null;\n if (p === n) return true;\n if (!p || !n) return false;\n return areOptionsShallowEqual(p, n);\n};\n\n/** Determina si un valor resuelto está vacío (para placeholder/shrink). */\nexport const isResolvedValueEmpty = (\n resolvedValue: unknown,\n multiple: boolean,\n): boolean => {\n if (multiple) {\n return !Array.isArray(resolvedValue) || resolvedValue.length === 0;\n }\n return !resolvedValue;\n};\n","import React from 'react';\nimport type { SelectOption, RenderOptionItem } from '../Autocomplete';\n\ninterface AutocompleteOptionProps {\n liProps: React.HTMLAttributes<HTMLLIElement>;\n option: SelectOption;\n customRender?: RenderOptionItem;\n}\n\n/**\n * Render por defecto de un `<li>` del dropdown del Autocomplete.\n * MUI lo invoca desde `renderOption={(props, option) => ...}` en el padre.\n *\n * La `key` la maneja el padre (`renderOption` en Autocomplete.tsx). Este\n * componente solo recibe los props restantes del `<li>` para spread.\n */\nexport const AutocompleteOption: React.FC<AutocompleteOptionProps> = ({\n liProps,\n option,\n customRender,\n}) => {\n return (\n <li {...liProps}>\n {customRender ? customRender(option) : option.label}\n </li>\n );\n};\n\nexport default AutocompleteOption;\n","import React from 'react';\nimport { Avatar, Chip } from '@mui/material';\nimport ClearIcon from '@mui/icons-material/Clear';\n\nimport type {\n SelectOption,\n RenderChipLabel,\n AutocompleteSize,\n} from '../Autocomplete';\n\ninterface AutocompleteChipsProps {\n value: SelectOption[];\n getTagProps: (args: { index: number }) => Record<string, any>;\n size: AutocompleteSize;\n maxChipsToShow: number;\n renderChipLabel?: RenderChipLabel;\n}\n\n/**\n * Render de los chips del Autocomplete en modo multiple.\n * Trunca después de `maxChipsToShow` con un chip \"+N más\".\n * El `getTagProps({ index })` viene de MUI y contiene el handler de delete,\n * la key, etc. — se spreadea tal cual al Chip.\n */\nexport const AutocompleteChips: React.FC<AutocompleteChipsProps> = ({\n value,\n getTagProps,\n size,\n maxChipsToShow,\n renderChipLabel,\n}) => {\n const displayed = value.slice(0, maxChipsToShow);\n const hidden = value.length - maxChipsToShow;\n\n return (\n <>\n {displayed.map((option, index) => {\n const { key: _ignored, ...tagProps } = getTagProps({ index });\n return (\n <Chip\n key={option.value}\n {...tagProps}\n size={size}\n label={renderChipLabel ? renderChipLabel(option) : option.label}\n avatar={option.img ? <Avatar src={option.img} /> : undefined}\n deleteIcon={<ClearIcon />}\n />\n );\n })}\n {hidden > 0 && <Chip size={size} label={`+${hidden} más`} />}\n </>\n );\n};\n\nexport default AutocompleteChips;\n","import React from 'react';\nimport { Box, CircularProgress, Typography } from '@mui/material';\n\n/**\n * Loader por defecto para el `loadingText` del Autocomplete.\n * El consumer puede sobrescribirlo pasando `loadingText` al componente padre.\n */\nexport const AutocompleteLoader: React.FC<{ text?: string }> = ({\n text = 'Cargando...',\n}) => (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <CircularProgress size={16} />\n <Typography variant=\"body2\">{text}</Typography>\n </Box>\n);\n\nexport default AutocompleteLoader;\n","import React, {\n useMemo,\n useRef,\n useState,\n type ReactNode,\n type SyntheticEvent,\n} from 'react';\nimport {\n Autocomplete as MuiAutocomplete,\n TextField,\n type TextFieldProps,\n} from '@mui/material';\nimport { useTheme, type SxProps, type Theme } from '@mui/material/styles';\nimport { Controller, type Control, type RegisterOptions } from 'react-hook-form';\n\nimport { buildAutocompleteSx } from './Autocomplete.sx';\nimport {\n areResolvedValuesEqual,\n isResolvedValueEmpty,\n resolveMultipleValue,\n resolveSingleValue,\n} from './Autocomplete.helpers';\nimport { resolvePreset } from '../_shared/resolvePreset';\nimport { AutocompleteOption } from './_parts/AutocompleteOption';\nimport { AutocompleteChips } from './_parts/AutocompleteChips';\nimport { AutocompleteLoader } from './_parts/AutocompleteLoader';\n\n// ── Tipos de dominio ─────────────────────────────────────────────────────\nexport interface SelectOption {\n value: string | number;\n label: string;\n img?: string;\n disabled?: boolean;\n group?: string;\n [key: string]: any; //campos extras que puede tener la opcion\n}\n\nexport type LabelPosition = 'outside' | 'floating';\nexport type AutocompleteSize = 'small' | 'medium';\n\n// ── Render slots ─────────────────────────────────────────────────────────\nexport type RenderOptionItem = (item: SelectOption) => ReactNode;\nexport type RenderChipLabel = (item: SelectOption) => ReactNode;\n\n// ── Props base ───────────────────────────────────────────────────────────\nexport type BaseAutocompleteProps<\n _TValue extends SelectOption['value'] = SelectOption['value'],\n> = {\n label?: string;\n options: SelectOption[];\n placeholder?: string;\n multiple?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n loading?: boolean;\n error?: boolean;\n helperText?: string;\n maxChipsToShow?: number;\n renderOptionItem?: RenderOptionItem;\n renderChipLabel?: RenderChipLabel;\n /** Border radius del input. Default: 10. */\n borderRadius?: number | string;\n /** \"outside\" (default) = label arriba del input; \"floating\" = comportamiento nativo MUI. */\n labelPosition?: LabelPosition;\n /** Tamaño del TextField. Default: 'small'. */\n size?: AutocompleteSize;\n /** Texto cuando no hay coincidencias. */\n noOptionsText?: ReactNode;\n /** Texto cuando está cargando. */\n loadingText?: ReactNode;\n sx?: SxProps<Theme>;\n /**\n * Nombre del preset de estilo registrado en `theme.styles.Autocomplete`.\n * - `\"default\"` (o ausente) = estilo built-in del paquete.\n * - Cualquier otro string = mergea el preset encima del estilo built-in.\n */\n preset?: string;\n /** Props para el TextField subyacente. */\n textFieldProps?: Partial<TextFieldProps>;\n\n // ── Búsqueda asíncrona / remota ──────────────────────────────────────\n /** Se dispara cada vez que el usuario escribe. Útil para llamadas a servicios\n * (debounce recomendado en el consumer). */\n onInputChange?: (\n event: SyntheticEvent,\n value: string,\n reason: 'input' | 'reset' | 'clear' | 'blur' | 'selectOption' | 'removeOption',\n ) => void;\n /** Valor controlado del texto de búsqueda. */\n inputValue?: string;\n /** Filtro custom. Para búsqueda remota pasar `(x) => x` y confiar sólo en el servicio. */\n filterOptions?: (options: SelectOption[], state: any) => SelectOption[];\n /** Permite valores arbitrarios (no solo de la lista). */\n freeSolo?: boolean;\n open?: boolean;\n onOpen?: (event: SyntheticEvent) => void;\n onClose?: (event: SyntheticEvent, reason: string) => void;\n};\n\n// ── Variantes discriminadas (RHF vs controlado) ──────────────────────────\nexport interface ControlledAutocompleteProps<\n TValue extends SelectOption['value'] = SelectOption['value'],\n> extends BaseAutocompleteProps<TValue> {\n value: TValue | TValue[] | null;\n onChange: (val: TValue | TValue[] | null) => void;\n name?: string;\n control?: never;\n validation?: never;\n}\n\nexport interface RHFAutocompleteProps<\n TValue extends SelectOption['value'] = SelectOption['value'],\n> extends BaseAutocompleteProps<TValue> {\n name: string;\n // `any` plano (no `Control<any>`): RHF tipa `Control<T>` con generics en\n // posiciones tanto contravariantes como covariantes (ej. `_subjects.state`).\n // Cuando el componente o su uso involucra generics adicionales, TS se\n // confunde narroweando el discriminated union y `Control<any>` no logra\n // absorber `Control<MyForm>` en la comparación estructural profunda. El\n // `any` plano elimina ese ruido. RHF adentro sigue teniendo sus tipos\n // fuertes — solo degradamos la superficie del prop del componente.\n control: any;\n validation?: RegisterOptions;\n /**\n * Side-effect que corre después de que RHF actualiza el form state.\n * Útil para cascadas entre campos. NO reemplaza al handler de RHF.\n */\n onValueChange?: (val: TValue | TValue[] | null) => void;\n value?: never;\n onChange?: never;\n}\n\n// ── API pública final ────────────────────────────────────────────────────\nexport type AutocompleteProps<\n TValue extends SelectOption['value'] = SelectOption['value'],\n> = ControlledAutocompleteProps<TValue> | RHFAutocompleteProps<TValue>;\n\nexport function Autocomplete<\n TValue extends SelectOption['value'] = SelectOption['value'],\n>(props: AutocompleteProps<TValue>) {\n const {\n label,\n options,\n placeholder,\n multiple = false,\n disabled = false,\n readOnly = false,\n loading = false,\n error: errorProp = false,\n helperText,\n maxChipsToShow = 3,\n renderOptionItem,\n renderChipLabel,\n borderRadius = 10,\n labelPosition = 'outside',\n size = 'small',\n noOptionsText = 'No hay opciones',\n loadingText,\n sx,\n preset,\n textFieldProps,\n onInputChange,\n inputValue,\n filterOptions,\n freeSolo,\n open,\n onOpen,\n onClose,\n } = props as BaseAutocompleteProps<TValue>;\n\n // Focus tracking para mostrar placeholder solo cuando el label sube.\n const [isFocused, setIsFocused] = useState(false);\n\n // Cache interno de opciones vistas (indexado por value). Crítico para async\n // multiple: cuando `options` cambian por un nuevo search, los items ya\n // seleccionados no desaparecen de los chips porque los recordamos acá.\n const seenOptionsRef = useRef<Map<SelectOption['value'], SelectOption>>(\n new Map(),\n );\n for (const opt of options) {\n seenOptionsRef.current.set(opt.value, opt);\n }\n\n // Pool de opciones para resolver values (merge de options + vistas).\n const resolvePool = useMemo<SelectOption[]>(() => {\n const merged = new Map(seenOptionsRef.current);\n for (const opt of options) merged.set(opt.value, opt);\n return Array.from(merged.values());\n }, [options]);\n\n // Estabiliza la referencia del resolvedValue que pasamos a MUI Autocomplete.\n // MUI compara value con `!==`: una referencia nueva con mismo contenido\n // dispara resetInputValue() y borra el texto que el usuario está escribiendo.\n const prevResolvedRef = useRef<SelectOption[] | SelectOption | null>(\n multiple ? [] : null,\n );\n\n const stabilizeResolved = (\n newVal: SelectOption[] | SelectOption | null,\n ): SelectOption[] | SelectOption | null => {\n if (areResolvedValuesEqual(prevResolvedRef.current, newVal, multiple)) {\n return prevResolvedRef.current;\n }\n prevResolvedRef.current = newVal;\n return newVal;\n };\n\n const theme = useTheme();\n const presetSx = resolvePreset('Autocomplete', preset, theme);\n\n const mergedSx = [\n buildAutocompleteSx(borderRadius, labelPosition),\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ];\n\n const renderAutocomplete = (\n resolvedValue: any,\n handleChange: (event: any, newValue: any) => void,\n onBlur?: () => void,\n inputRef?: React.Ref<any>,\n rhfError?: boolean,\n rhfHelperText?: string,\n ) => {\n const finalError = !!rhfError || !!errorProp;\n const finalHelperText = rhfHelperText || helperText;\n\n const isEmpty = isResolvedValueEmpty(resolvedValue, multiple);\n const showPlaceholder = isEmpty && isFocused && !!placeholder;\n\n return (\n <MuiAutocomplete\n multiple={multiple}\n options={options}\n value={resolvedValue}\n disabled={disabled}\n readOnly={readOnly}\n loading={loading}\n sx={mergedSx}\n freeSolo={freeSolo as any}\n open={open}\n onOpen={onOpen}\n onClose={onClose}\n inputValue={inputValue}\n onInputChange={onInputChange}\n filterOptions={filterOptions as any}\n getOptionLabel={(opt) =>\n typeof opt === 'string' ? opt : (opt?.label ?? '')\n }\n isOptionEqualToValue={(a, b) => {\n if (typeof a === 'string' || typeof b === 'string') return a === b;\n return a?.value === b?.value;\n }}\n getOptionDisabled={(opt) =>\n typeof opt === 'string' ? false : !!opt?.disabled\n }\n onChange={handleChange}\n onFocus={() => setIsFocused(true)}\n onBlur={() => {\n setIsFocused(false);\n onBlur?.();\n }}\n renderOption={(liProps, option) => {\n // MUI inyecta la `key` dentro de `liProps`. React necesita la key\n // en el elemento más externo que devuelve `renderOption` (acá el\n // wrapper), no en el `<li>` interno. La extraemos acá y se la\n // pasamos al wrapper; el resto de `liProps` viaja al `<li>`.\n const { key, ...liRest } = liProps as React.HTMLAttributes<HTMLLIElement> & {\n key?: React.Key;\n };\n return (\n <AutocompleteOption\n key={key}\n liProps={liRest}\n option={option}\n customRender={renderOptionItem}\n />\n );\n }}\n renderValue={\n multiple\n ? (value, getItemProps) => (\n <AutocompleteChips\n value={value as SelectOption[]}\n getTagProps={getItemProps}\n size={size}\n maxChipsToShow={maxChipsToShow}\n renderChipLabel={renderChipLabel}\n />\n )\n : undefined\n }\n noOptionsText={noOptionsText}\n loadingText={loadingText ?? <AutocompleteLoader />}\n renderInput={(params) => (\n // @ts-ignore — Ref<any> type mismatch between @types/react versions in monorepo\n <TextField\n {...params}\n label={label}\n size={size}\n variant=\"outlined\"\n placeholder={showPlaceholder ? placeholder : undefined}\n error={finalError}\n helperText={finalHelperText}\n inputRef={inputRef}\n {...textFieldProps}\n InputLabelProps={{\n ...(params.InputLabelProps as Record<string, any>),\n ...(textFieldProps?.InputLabelProps as Record<string, any> | undefined),\n shrink:\n labelPosition === 'outside'\n ? !isEmpty || isFocused\n : (params.InputLabelProps as any)?.shrink,\n }}\n />\n )}\n />\n );\n };\n\n //obtiene el primitivo primero\n const extractValue = (opt: any) =>\n typeof opt === 'string' ? opt : (opt?.value ?? null);\n\n const handleControlledChange = (_event: any, newValue: any) => {\n const onChange = (props as ControlledAutocompleteProps<TValue>).onChange;\n if (multiple) {\n const values = (newValue ?? []).map(\n (opt: SelectOption | string) => extractValue(opt) as TValue,\n );\n onChange(values);\n } else {\n onChange(extractValue(newValue) as TValue | null);\n }\n };\n\n // --- RHF mode ---\n if ('control' in props && props.control) {\n const { name, control, validation, onValueChange } =\n props as RHFAutocompleteProps<TValue>;\n return (\n <Controller\n name={name}\n control={control}\n rules={validation}\n render={({ field, fieldState: { error: fieldError } }) => {\n const resolvedValue = stabilizeResolved(\n multiple\n ? resolveMultipleValue(resolvePool, field.value)\n : resolveSingleValue(resolvePool, field.value),\n );\n\n const handleChange = (_event: any, newValue: any) => {\n if (multiple) {\n const next = (newValue ?? []).map(\n (opt: SelectOption | string) => extractValue(opt),\n ) as TValue[];\n field.onChange(next);\n onValueChange?.(next);\n } else {\n const next = extractValue(newValue) as TValue | null;\n field.onChange(next);\n onValueChange?.(next);\n }\n };\n\n return renderAutocomplete(\n resolvedValue,\n handleChange,\n field.onBlur,\n field.ref,\n !!fieldError,\n fieldError?.message,\n );\n }}\n />\n );\n }\n\n // --- Controlled mode ---\n const controlledValue = (props as ControlledAutocompleteProps<TValue>).value;\n const resolvedValue = stabilizeResolved(\n multiple\n ? resolveMultipleValue(resolvePool, controlledValue as SelectOption['value'][])\n : resolveSingleValue(resolvePool, controlledValue as SelectOption['value']),\n );\n\n return renderAutocomplete(resolvedValue, handleControlledChange);\n}\n\n/** Alias de `Autocomplete`. Ambos nombres son equivalentes. */\nexport const AutocompleteSelect = Autocomplete;\n\nexport default Autocomplete;\n"],"names":["buildFormFieldSx","n","jsx","jsxs","Fragment","Chip","Avatar","Box","CircularProgress","Typography","useState","useRef","useMemo","useTheme","resolvePreset","resolvedValue","MuiAutocomplete","TextField","Controller"],"mappings":"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"}
@@ -30,11 +30,11 @@ var __objRest = (source, exclude) => {
30
30
  return target;
31
31
  };
32
32
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
33
- import { createElement, useState, useRef, useMemo } from "react";
33
+ import { useState, useRef, useMemo } from "react";
34
34
  import { Chip, Avatar, Box, CircularProgress, Typography, Autocomplete as Autocomplete$1, TextField } from "@mui/material";
35
35
  import { useTheme } from "@mui/material/styles";
36
36
  import { Controller } from "react-hook-form";
37
- import { b as buildFormFieldSx } from "./formField.sx-DfVbMe0V.js";
37
+ import { b as buildFormFieldSx } from "./formField.sx-8_QRnKxv.js";
38
38
  import { r as resolvePreset } from "./resolvePreset-K6_BfWHD.js";
39
39
  import ClearIcon from "@mui/icons-material/Clear";
40
40
  const buildAutocompleteSx = (borderRadius, labelPosition) => buildFormFieldSx({
@@ -61,16 +61,26 @@ const resolveMultipleValue = (options, value) => {
61
61
  if (!Array.isArray(value)) return [];
62
62
  return options.filter((o) => value.includes(o.value));
63
63
  };
64
+ const areOptionsShallowEqual = (a, b) => {
65
+ const keysA = Object.keys(a);
66
+ const keysB = Object.keys(b);
67
+ if (keysA.length !== keysB.length) return false;
68
+ return keysA.every((k) => a[k] === b[k]);
69
+ };
64
70
  const areResolvedValuesEqual = (prev, next, multiple) => {
65
71
  if (multiple) {
66
72
  if (!Array.isArray(prev) || !Array.isArray(next)) return false;
67
73
  if (prev.length !== next.length) return false;
68
74
  return prev.every((o, i) => {
69
- var _a;
70
- return o.value === ((_a = next[i]) == null ? void 0 : _a.value);
75
+ const n2 = next[i];
76
+ return !!n2 && areOptionsShallowEqual(o, n2);
71
77
  });
72
78
  }
73
- return (prev == null ? void 0 : prev.value) === (next == null ? void 0 : next.value);
79
+ const p = prev;
80
+ const n = next;
81
+ if (p === n) return true;
82
+ if (!p || !n) return false;
83
+ return areOptionsShallowEqual(p, n);
74
84
  };
75
85
  const isResolvedValueEmpty = (resolvedValue, multiple) => {
76
86
  if (multiple) {
@@ -83,8 +93,7 @@ const AutocompleteOption = ({
83
93
  option,
84
94
  customRender
85
95
  }) => {
86
- const _a = liProps, { key: _ignored } = _a, liRest = __objRest(_a, ["key"]);
87
- return /* @__PURE__ */ jsx("li", __spreadProps(__spreadValues({}, liRest), { children: customRender ? customRender(option) : option.label }), option.value);
96
+ return /* @__PURE__ */ jsx("li", __spreadProps(__spreadValues({}, liProps), { children: customRender ? customRender(option) : option.label }));
88
97
  };
89
98
  const AutocompleteChips = ({
90
99
  value,
@@ -97,16 +106,16 @@ const AutocompleteChips = ({
97
106
  const hidden = value.length - maxChipsToShow;
98
107
  return /* @__PURE__ */ jsxs(Fragment, { children: [
99
108
  displayed.map((option, index) => {
100
- const tagProps = getTagProps({ index });
101
- return /* @__PURE__ */ createElement(
109
+ const _a = getTagProps({ index }), { key: _ignored } = _a, tagProps = __objRest(_a, ["key"]);
110
+ return /* @__PURE__ */ jsx(
102
111
  Chip,
103
112
  __spreadProps(__spreadValues({}, tagProps), {
104
- key: option.value,
105
113
  size,
106
114
  label: renderChipLabel ? renderChipLabel(option) : option.label,
107
115
  avatar: option.img ? /* @__PURE__ */ jsx(Avatar, { src: option.img }) : void 0,
108
116
  deleteIcon: /* @__PURE__ */ jsx(ClearIcon, {})
109
- })
117
+ }),
118
+ option.value
110
119
  );
111
120
  }),
112
121
  hidden > 0 && /* @__PURE__ */ jsx(Chip, { size, label: `+${hidden} más` })
@@ -138,7 +147,6 @@ function Autocomplete(props) {
138
147
  noOptionsText = "No hay opciones",
139
148
  loadingText,
140
149
  sx,
141
- className,
142
150
  preset,
143
151
  textFieldProps,
144
152
  onInputChange,
@@ -192,7 +200,6 @@ function Autocomplete(props) {
192
200
  disabled,
193
201
  readOnly,
194
202
  loading,
195
- className,
196
203
  sx: mergedSx,
197
204
  freeSolo,
198
205
  open,
@@ -205,27 +212,34 @@ function Autocomplete(props) {
205
212
  var _a;
206
213
  return typeof opt === "string" ? opt : (_a = opt == null ? void 0 : opt.label) != null ? _a : "";
207
214
  },
208
- isOptionEqualToValue: (a, b) => (a == null ? void 0 : a.value) === (b == null ? void 0 : b.value),
209
- getOptionDisabled: (opt) => !!(opt == null ? void 0 : opt.disabled),
215
+ isOptionEqualToValue: (a, b) => {
216
+ if (typeof a === "string" || typeof b === "string") return a === b;
217
+ return (a == null ? void 0 : a.value) === (b == null ? void 0 : b.value);
218
+ },
219
+ getOptionDisabled: (opt) => typeof opt === "string" ? false : !!(opt == null ? void 0 : opt.disabled),
210
220
  onChange: handleChange,
211
221
  onFocus: () => setIsFocused(true),
212
222
  onBlur: () => {
213
223
  setIsFocused(false);
214
224
  onBlur == null ? void 0 : onBlur();
215
225
  },
216
- renderOption: (liProps, option) => /* @__PURE__ */ jsx(
217
- AutocompleteOption,
218
- {
219
- liProps,
220
- option,
221
- customRender: renderOptionItem
222
- }
223
- ),
224
- renderTags: multiple ? (value, getTagProps) => /* @__PURE__ */ jsx(
226
+ renderOption: (liProps, option) => {
227
+ const _a = liProps, { key } = _a, liRest = __objRest(_a, ["key"]);
228
+ return /* @__PURE__ */ jsx(
229
+ AutocompleteOption,
230
+ {
231
+ liProps: liRest,
232
+ option,
233
+ customRender: renderOptionItem
234
+ },
235
+ key
236
+ );
237
+ },
238
+ renderValue: multiple ? (value, getItemProps) => /* @__PURE__ */ jsx(
225
239
  AutocompleteChips,
226
240
  {
227
241
  value,
228
- getTagProps,
242
+ getTagProps: getItemProps,
229
243
  size,
230
244
  maxChipsToShow,
231
245
  renderChipLabel
@@ -258,18 +272,23 @@ function Autocomplete(props) {
258
272
  }
259
273
  );
260
274
  };
261
- const handleControlledChange = (_event, newValue) => {
275
+ const extractValue = (opt) => {
262
276
  var _a;
277
+ return typeof opt === "string" ? opt : (_a = opt == null ? void 0 : opt.value) != null ? _a : null;
278
+ };
279
+ const handleControlledChange = (_event, newValue) => {
263
280
  const onChange = props.onChange;
264
281
  if (multiple) {
265
- const values = (newValue != null ? newValue : []).map((opt) => opt.value);
282
+ const values = (newValue != null ? newValue : []).map(
283
+ (opt) => extractValue(opt)
284
+ );
266
285
  onChange(values);
267
286
  } else {
268
- onChange((_a = newValue == null ? void 0 : newValue.value) != null ? _a : null);
287
+ onChange(extractValue(newValue));
269
288
  }
270
289
  };
271
290
  if ("control" in props && props.control) {
272
- const { name, control, validation } = props;
291
+ const { name, control, validation, onValueChange } = props;
273
292
  return /* @__PURE__ */ jsx(
274
293
  Controller,
275
294
  {
@@ -281,13 +300,16 @@ function Autocomplete(props) {
281
300
  multiple ? resolveMultipleValue(resolvePool, field.value) : resolveSingleValue(resolvePool, field.value)
282
301
  );
283
302
  const handleChange = (_event, newValue) => {
284
- var _a;
285
303
  if (multiple) {
286
- field.onChange(
287
- (newValue != null ? newValue : []).map((opt) => opt.value)
304
+ const next = (newValue != null ? newValue : []).map(
305
+ (opt) => extractValue(opt)
288
306
  );
307
+ field.onChange(next);
308
+ onValueChange == null ? void 0 : onValueChange(next);
289
309
  } else {
290
- field.onChange((_a = newValue == null ? void 0 : newValue.value) != null ? _a : null);
310
+ const next = extractValue(newValue);
311
+ field.onChange(next);
312
+ onValueChange == null ? void 0 : onValueChange(next);
291
313
  }
292
314
  };
293
315
  return renderAutocomplete(
@@ -313,4 +335,4 @@ export {
313
335
  Autocomplete as A,
314
336
  AutocompleteSelect as a
315
337
  };
316
- //# sourceMappingURL=Autocomplete-BA-cGASd.js.map
338
+ //# sourceMappingURL=Autocomplete-i3-V38n1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Autocomplete-i3-V38n1.js","sources":["../src/components/Autocomplete/Autocomplete.sx.ts","../src/components/Autocomplete/Autocomplete.helpers.ts","../src/components/Autocomplete/_parts/AutocompleteOption.tsx","../src/components/Autocomplete/_parts/AutocompleteChips.tsx","../src/components/Autocomplete/_parts/AutocompleteLoader.tsx","../src/components/Autocomplete/Autocomplete.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { buildFormFieldSx } from '../_shared/formField.sx';\nimport type { LabelPosition } from './Autocomplete';\n\n/**\n * Builder del sx del Autocomplete. Reutiliza `buildFormFieldSx` y añade\n * los paddings propios del Autocomplete (chips + input interno).\n */\nexport const buildAutocompleteSx = (\n borderRadius: number | string,\n labelPosition: LabelPosition,\n): SxProps<Theme> =>\n buildFormFieldSx({\n borderRadius,\n labelPosition,\n extraOutsideSx: {\n // El input interno del Autocomplete.\n '& .MuiAutocomplete-input': {\n paddingTop: '4px',\n paddingBottom: '4px',\n },\n\n // Contenedor del input (donde viven los chips en modo multiple).\n '& .MuiAutocomplete-inputRoot': {\n paddingTop: '4px',\n paddingBottom: '4px',\n },\n },\n });\n","import type { SxProps, Theme } from '@mui/material/styles';\nimport type { SelectOption } from './Autocomplete';\n\n/** Resuelve un value único a su SelectOption dentro del pool. */\nexport const resolveSingleValue = (\n options: SelectOption[],\n value: SelectOption['value'] | null | undefined,\n): SelectOption | null => options.find((o) => o.value === value) ?? null;\n\n/** Resuelve un array de values a sus SelectOption dentro del pool. */\nexport const resolveMultipleValue = (\n options: SelectOption[],\n value: SelectOption['value'][] | null | undefined,\n): SelectOption[] => {\n if (!Array.isArray(value)) return [];\n return options.filter((o) => value.includes(o.value));\n};\n\n/** Merge de sx base + extra del consumer, respetando el contrato de MUI. */\nexport const mergeSx = (\n base: SxProps<Theme>,\n extra?: SxProps<Theme>,\n): SxProps<Theme> => {\n if (!extra) return base;\n return [base, ...(Array.isArray(extra) ? extra : [extra])] as SxProps<Theme>;\n};\n\n/**\n * Compara dos SelectOption por todas sus props (shallow). Se usa para detectar\n * cambios de metadata (p.ej. `label`, `img`) cuando `value` no cambió, para\n * que la estabilización no tape datos frescos del server.\n */\nconst areOptionsShallowEqual = (a: SelectOption, b: SelectOption): boolean => {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n return keysA.every((k) => a[k] === b[k]);\n};\n\n/**\n * Compara dos valores resueltos (single o multiple) estructuralmente para\n * decidir si se puede reusar la referencia previa. Se usa para estabilizar la\n * referencia que se pasa a MUI Autocomplete (MUI compara value por referencia\n * con `!==`, y una nueva referencia — aunque el contenido sea igual — dispara\n * `resetInputValue` y borra el texto mientras el usuario tipea).\n *\n * Comparamos todas las props del SelectOption, no solo `value`, para que un\n * refresh de metadata (label/img/etc.) invalide la referencia estabilizada\n * y la UI muestre los datos actualizados.\n */\nexport const areResolvedValuesEqual = (\n prev: SelectOption | SelectOption[] | null,\n next: SelectOption | SelectOption[] | null,\n multiple: boolean,\n): boolean => {\n if (multiple) {\n if (!Array.isArray(prev) || !Array.isArray(next)) return false;\n if (prev.length !== next.length) return false;\n return prev.every((o, i) => {\n const n = next[i];\n return !!n && areOptionsShallowEqual(o, n);\n });\n }\n const p = prev as SelectOption | null;\n const n = next as SelectOption | null;\n if (p === n) return true;\n if (!p || !n) return false;\n return areOptionsShallowEqual(p, n);\n};\n\n/** Determina si un valor resuelto está vacío (para placeholder/shrink). */\nexport const isResolvedValueEmpty = (\n resolvedValue: unknown,\n multiple: boolean,\n): boolean => {\n if (multiple) {\n return !Array.isArray(resolvedValue) || resolvedValue.length === 0;\n }\n return !resolvedValue;\n};\n","import React from 'react';\nimport type { SelectOption, RenderOptionItem } from '../Autocomplete';\n\ninterface AutocompleteOptionProps {\n liProps: React.HTMLAttributes<HTMLLIElement>;\n option: SelectOption;\n customRender?: RenderOptionItem;\n}\n\n/**\n * Render por defecto de un `<li>` del dropdown del Autocomplete.\n * MUI lo invoca desde `renderOption={(props, option) => ...}` en el padre.\n *\n * La `key` la maneja el padre (`renderOption` en Autocomplete.tsx). Este\n * componente solo recibe los props restantes del `<li>` para spread.\n */\nexport const AutocompleteOption: React.FC<AutocompleteOptionProps> = ({\n liProps,\n option,\n customRender,\n}) => {\n return (\n <li {...liProps}>\n {customRender ? customRender(option) : option.label}\n </li>\n );\n};\n\nexport default AutocompleteOption;\n","import React from 'react';\nimport { Avatar, Chip } from '@mui/material';\nimport ClearIcon from '@mui/icons-material/Clear';\n\nimport type {\n SelectOption,\n RenderChipLabel,\n AutocompleteSize,\n} from '../Autocomplete';\n\ninterface AutocompleteChipsProps {\n value: SelectOption[];\n getTagProps: (args: { index: number }) => Record<string, any>;\n size: AutocompleteSize;\n maxChipsToShow: number;\n renderChipLabel?: RenderChipLabel;\n}\n\n/**\n * Render de los chips del Autocomplete en modo multiple.\n * Trunca después de `maxChipsToShow` con un chip \"+N más\".\n * El `getTagProps({ index })` viene de MUI y contiene el handler de delete,\n * la key, etc. — se spreadea tal cual al Chip.\n */\nexport const AutocompleteChips: React.FC<AutocompleteChipsProps> = ({\n value,\n getTagProps,\n size,\n maxChipsToShow,\n renderChipLabel,\n}) => {\n const displayed = value.slice(0, maxChipsToShow);\n const hidden = value.length - maxChipsToShow;\n\n return (\n <>\n {displayed.map((option, index) => {\n const { key: _ignored, ...tagProps } = getTagProps({ index });\n return (\n <Chip\n key={option.value}\n {...tagProps}\n size={size}\n label={renderChipLabel ? renderChipLabel(option) : option.label}\n avatar={option.img ? <Avatar src={option.img} /> : undefined}\n deleteIcon={<ClearIcon />}\n />\n );\n })}\n {hidden > 0 && <Chip size={size} label={`+${hidden} más`} />}\n </>\n );\n};\n\nexport default AutocompleteChips;\n","import React from 'react';\nimport { Box, CircularProgress, Typography } from '@mui/material';\n\n/**\n * Loader por defecto para el `loadingText` del Autocomplete.\n * El consumer puede sobrescribirlo pasando `loadingText` al componente padre.\n */\nexport const AutocompleteLoader: React.FC<{ text?: string }> = ({\n text = 'Cargando...',\n}) => (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <CircularProgress size={16} />\n <Typography variant=\"body2\">{text}</Typography>\n </Box>\n);\n\nexport default AutocompleteLoader;\n","import React, {\n useMemo,\n useRef,\n useState,\n type ReactNode,\n type SyntheticEvent,\n} from 'react';\nimport {\n Autocomplete as MuiAutocomplete,\n TextField,\n type TextFieldProps,\n} from '@mui/material';\nimport { useTheme, type SxProps, type Theme } from '@mui/material/styles';\nimport { Controller, type Control, type RegisterOptions } from 'react-hook-form';\n\nimport { buildAutocompleteSx } from './Autocomplete.sx';\nimport {\n areResolvedValuesEqual,\n isResolvedValueEmpty,\n resolveMultipleValue,\n resolveSingleValue,\n} from './Autocomplete.helpers';\nimport { resolvePreset } from '../_shared/resolvePreset';\nimport { AutocompleteOption } from './_parts/AutocompleteOption';\nimport { AutocompleteChips } from './_parts/AutocompleteChips';\nimport { AutocompleteLoader } from './_parts/AutocompleteLoader';\n\n// ── Tipos de dominio ─────────────────────────────────────────────────────\nexport interface SelectOption {\n value: string | number;\n label: string;\n img?: string;\n disabled?: boolean;\n group?: string;\n [key: string]: any; //campos extras que puede tener la opcion\n}\n\nexport type LabelPosition = 'outside' | 'floating';\nexport type AutocompleteSize = 'small' | 'medium';\n\n// ── Render slots ─────────────────────────────────────────────────────────\nexport type RenderOptionItem = (item: SelectOption) => ReactNode;\nexport type RenderChipLabel = (item: SelectOption) => ReactNode;\n\n// ── Props base ───────────────────────────────────────────────────────────\nexport type BaseAutocompleteProps<\n _TValue extends SelectOption['value'] = SelectOption['value'],\n> = {\n label?: string;\n options: SelectOption[];\n placeholder?: string;\n multiple?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n loading?: boolean;\n error?: boolean;\n helperText?: string;\n maxChipsToShow?: number;\n renderOptionItem?: RenderOptionItem;\n renderChipLabel?: RenderChipLabel;\n /** Border radius del input. Default: 10. */\n borderRadius?: number | string;\n /** \"outside\" (default) = label arriba del input; \"floating\" = comportamiento nativo MUI. */\n labelPosition?: LabelPosition;\n /** Tamaño del TextField. Default: 'small'. */\n size?: AutocompleteSize;\n /** Texto cuando no hay coincidencias. */\n noOptionsText?: ReactNode;\n /** Texto cuando está cargando. */\n loadingText?: ReactNode;\n sx?: SxProps<Theme>;\n /**\n * Nombre del preset de estilo registrado en `theme.styles.Autocomplete`.\n * - `\"default\"` (o ausente) = estilo built-in del paquete.\n * - Cualquier otro string = mergea el preset encima del estilo built-in.\n */\n preset?: string;\n /** Props para el TextField subyacente. */\n textFieldProps?: Partial<TextFieldProps>;\n\n // ── Búsqueda asíncrona / remota ──────────────────────────────────────\n /** Se dispara cada vez que el usuario escribe. Útil para llamadas a servicios\n * (debounce recomendado en el consumer). */\n onInputChange?: (\n event: SyntheticEvent,\n value: string,\n reason: 'input' | 'reset' | 'clear' | 'blur' | 'selectOption' | 'removeOption',\n ) => void;\n /** Valor controlado del texto de búsqueda. */\n inputValue?: string;\n /** Filtro custom. Para búsqueda remota pasar `(x) => x` y confiar sólo en el servicio. */\n filterOptions?: (options: SelectOption[], state: any) => SelectOption[];\n /** Permite valores arbitrarios (no solo de la lista). */\n freeSolo?: boolean;\n open?: boolean;\n onOpen?: (event: SyntheticEvent) => void;\n onClose?: (event: SyntheticEvent, reason: string) => void;\n};\n\n// ── Variantes discriminadas (RHF vs controlado) ──────────────────────────\nexport interface ControlledAutocompleteProps<\n TValue extends SelectOption['value'] = SelectOption['value'],\n> extends BaseAutocompleteProps<TValue> {\n value: TValue | TValue[] | null;\n onChange: (val: TValue | TValue[] | null) => void;\n name?: string;\n control?: never;\n validation?: never;\n}\n\nexport interface RHFAutocompleteProps<\n TValue extends SelectOption['value'] = SelectOption['value'],\n> extends BaseAutocompleteProps<TValue> {\n name: string;\n // `any` plano (no `Control<any>`): RHF tipa `Control<T>` con generics en\n // posiciones tanto contravariantes como covariantes (ej. `_subjects.state`).\n // Cuando el componente o su uso involucra generics adicionales, TS se\n // confunde narroweando el discriminated union y `Control<any>` no logra\n // absorber `Control<MyForm>` en la comparación estructural profunda. El\n // `any` plano elimina ese ruido. RHF adentro sigue teniendo sus tipos\n // fuertes — solo degradamos la superficie del prop del componente.\n control: any;\n validation?: RegisterOptions;\n /**\n * Side-effect que corre después de que RHF actualiza el form state.\n * Útil para cascadas entre campos. NO reemplaza al handler de RHF.\n */\n onValueChange?: (val: TValue | TValue[] | null) => void;\n value?: never;\n onChange?: never;\n}\n\n// ── API pública final ────────────────────────────────────────────────────\nexport type AutocompleteProps<\n TValue extends SelectOption['value'] = SelectOption['value'],\n> = ControlledAutocompleteProps<TValue> | RHFAutocompleteProps<TValue>;\n\nexport function Autocomplete<\n TValue extends SelectOption['value'] = SelectOption['value'],\n>(props: AutocompleteProps<TValue>) {\n const {\n label,\n options,\n placeholder,\n multiple = false,\n disabled = false,\n readOnly = false,\n loading = false,\n error: errorProp = false,\n helperText,\n maxChipsToShow = 3,\n renderOptionItem,\n renderChipLabel,\n borderRadius = 10,\n labelPosition = 'outside',\n size = 'small',\n noOptionsText = 'No hay opciones',\n loadingText,\n sx,\n preset,\n textFieldProps,\n onInputChange,\n inputValue,\n filterOptions,\n freeSolo,\n open,\n onOpen,\n onClose,\n } = props as BaseAutocompleteProps<TValue>;\n\n // Focus tracking para mostrar placeholder solo cuando el label sube.\n const [isFocused, setIsFocused] = useState(false);\n\n // Cache interno de opciones vistas (indexado por value). Crítico para async\n // multiple: cuando `options` cambian por un nuevo search, los items ya\n // seleccionados no desaparecen de los chips porque los recordamos acá.\n const seenOptionsRef = useRef<Map<SelectOption['value'], SelectOption>>(\n new Map(),\n );\n for (const opt of options) {\n seenOptionsRef.current.set(opt.value, opt);\n }\n\n // Pool de opciones para resolver values (merge de options + vistas).\n const resolvePool = useMemo<SelectOption[]>(() => {\n const merged = new Map(seenOptionsRef.current);\n for (const opt of options) merged.set(opt.value, opt);\n return Array.from(merged.values());\n }, [options]);\n\n // Estabiliza la referencia del resolvedValue que pasamos a MUI Autocomplete.\n // MUI compara value con `!==`: una referencia nueva con mismo contenido\n // dispara resetInputValue() y borra el texto que el usuario está escribiendo.\n const prevResolvedRef = useRef<SelectOption[] | SelectOption | null>(\n multiple ? [] : null,\n );\n\n const stabilizeResolved = (\n newVal: SelectOption[] | SelectOption | null,\n ): SelectOption[] | SelectOption | null => {\n if (areResolvedValuesEqual(prevResolvedRef.current, newVal, multiple)) {\n return prevResolvedRef.current;\n }\n prevResolvedRef.current = newVal;\n return newVal;\n };\n\n const theme = useTheme();\n const presetSx = resolvePreset('Autocomplete', preset, theme);\n\n const mergedSx = [\n buildAutocompleteSx(borderRadius, labelPosition),\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ];\n\n const renderAutocomplete = (\n resolvedValue: any,\n handleChange: (event: any, newValue: any) => void,\n onBlur?: () => void,\n inputRef?: React.Ref<any>,\n rhfError?: boolean,\n rhfHelperText?: string,\n ) => {\n const finalError = !!rhfError || !!errorProp;\n const finalHelperText = rhfHelperText || helperText;\n\n const isEmpty = isResolvedValueEmpty(resolvedValue, multiple);\n const showPlaceholder = isEmpty && isFocused && !!placeholder;\n\n return (\n <MuiAutocomplete\n multiple={multiple}\n options={options}\n value={resolvedValue}\n disabled={disabled}\n readOnly={readOnly}\n loading={loading}\n sx={mergedSx}\n freeSolo={freeSolo as any}\n open={open}\n onOpen={onOpen}\n onClose={onClose}\n inputValue={inputValue}\n onInputChange={onInputChange}\n filterOptions={filterOptions as any}\n getOptionLabel={(opt) =>\n typeof opt === 'string' ? opt : (opt?.label ?? '')\n }\n isOptionEqualToValue={(a, b) => {\n if (typeof a === 'string' || typeof b === 'string') return a === b;\n return a?.value === b?.value;\n }}\n getOptionDisabled={(opt) =>\n typeof opt === 'string' ? false : !!opt?.disabled\n }\n onChange={handleChange}\n onFocus={() => setIsFocused(true)}\n onBlur={() => {\n setIsFocused(false);\n onBlur?.();\n }}\n renderOption={(liProps, option) => {\n // MUI inyecta la `key` dentro de `liProps`. React necesita la key\n // en el elemento más externo que devuelve `renderOption` (acá el\n // wrapper), no en el `<li>` interno. La extraemos acá y se la\n // pasamos al wrapper; el resto de `liProps` viaja al `<li>`.\n const { key, ...liRest } = liProps as React.HTMLAttributes<HTMLLIElement> & {\n key?: React.Key;\n };\n return (\n <AutocompleteOption\n key={key}\n liProps={liRest}\n option={option}\n customRender={renderOptionItem}\n />\n );\n }}\n renderValue={\n multiple\n ? (value, getItemProps) => (\n <AutocompleteChips\n value={value as SelectOption[]}\n getTagProps={getItemProps}\n size={size}\n maxChipsToShow={maxChipsToShow}\n renderChipLabel={renderChipLabel}\n />\n )\n : undefined\n }\n noOptionsText={noOptionsText}\n loadingText={loadingText ?? <AutocompleteLoader />}\n renderInput={(params) => (\n // @ts-ignore — Ref<any> type mismatch between @types/react versions in monorepo\n <TextField\n {...params}\n label={label}\n size={size}\n variant=\"outlined\"\n placeholder={showPlaceholder ? placeholder : undefined}\n error={finalError}\n helperText={finalHelperText}\n inputRef={inputRef}\n {...textFieldProps}\n InputLabelProps={{\n ...(params.InputLabelProps as Record<string, any>),\n ...(textFieldProps?.InputLabelProps as Record<string, any> | undefined),\n shrink:\n labelPosition === 'outside'\n ? !isEmpty || isFocused\n : (params.InputLabelProps as any)?.shrink,\n }}\n />\n )}\n />\n );\n };\n\n //obtiene el primitivo primero\n const extractValue = (opt: any) =>\n typeof opt === 'string' ? opt : (opt?.value ?? null);\n\n const handleControlledChange = (_event: any, newValue: any) => {\n const onChange = (props as ControlledAutocompleteProps<TValue>).onChange;\n if (multiple) {\n const values = (newValue ?? []).map(\n (opt: SelectOption | string) => extractValue(opt) as TValue,\n );\n onChange(values);\n } else {\n onChange(extractValue(newValue) as TValue | null);\n }\n };\n\n // --- RHF mode ---\n if ('control' in props && props.control) {\n const { name, control, validation, onValueChange } =\n props as RHFAutocompleteProps<TValue>;\n return (\n <Controller\n name={name}\n control={control}\n rules={validation}\n render={({ field, fieldState: { error: fieldError } }) => {\n const resolvedValue = stabilizeResolved(\n multiple\n ? resolveMultipleValue(resolvePool, field.value)\n : resolveSingleValue(resolvePool, field.value),\n );\n\n const handleChange = (_event: any, newValue: any) => {\n if (multiple) {\n const next = (newValue ?? []).map(\n (opt: SelectOption | string) => extractValue(opt),\n ) as TValue[];\n field.onChange(next);\n onValueChange?.(next);\n } else {\n const next = extractValue(newValue) as TValue | null;\n field.onChange(next);\n onValueChange?.(next);\n }\n };\n\n return renderAutocomplete(\n resolvedValue,\n handleChange,\n field.onBlur,\n field.ref,\n !!fieldError,\n fieldError?.message,\n );\n }}\n />\n );\n }\n\n // --- Controlled mode ---\n const controlledValue = (props as ControlledAutocompleteProps<TValue>).value;\n const resolvedValue = stabilizeResolved(\n multiple\n ? resolveMultipleValue(resolvePool, controlledValue as SelectOption['value'][])\n : resolveSingleValue(resolvePool, controlledValue as SelectOption['value']),\n );\n\n return renderAutocomplete(resolvedValue, handleControlledChange);\n}\n\n/** Alias de `Autocomplete`. Ambos nombres son equivalentes. */\nexport const AutocompleteSelect = Autocomplete;\n\nexport default Autocomplete;\n"],"names":["n","resolvedValue","MuiAutocomplete"],"mappings":"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"}
@@ -57,11 +57,12 @@ const Avatar = ({
57
57
  overlap
58
58
  }) => {
59
59
  var _a;
60
- const [errorIndex, setErrorIndex] = useState(/* @__PURE__ */ new Set());
61
- const handleImageError = (index) => {
62
- setErrorIndex((prev) => {
60
+ const [failedUrls, setFailedUrls] = useState(/* @__PURE__ */ new Set());
61
+ const handleImageError = (url) => {
62
+ setFailedUrls((prev) => {
63
+ if (prev.has(url)) return prev;
63
64
  const next = new Set(prev);
64
- next.add(index);
65
+ next.add(url);
65
66
  return next;
66
67
  });
67
68
  };
@@ -80,12 +81,13 @@ const Avatar = ({
80
81
  boxSizing: "content-box"
81
82
  };
82
83
  const renderSingleAvatar = (item, i) => {
83
- var _a2, _b;
84
- const hasImage = !!item.imageUrl && !errorIndex.has(i);
84
+ var _a2, _b, _c, _d, _e;
85
+ const hasImage = !!item.imageUrl && !failedUrls.has(item.imageUrl);
85
86
  const showBadgeFallback = !!item.badge;
87
+ const itemKey = (_c = item.imageUrl) != null ? _c : `${(_a2 = item.text) != null ? _a2 : ""}-${(_b = item.badge) != null ? _b : ""}-${i}`;
86
88
  const itemSx = __spreadProps(__spreadValues({
87
- bgcolor: (_a2 = item.backgroundColor) != null ? _a2 : "action.selected",
88
- color: (_b = item.color) != null ? _b : "text.secondary"
89
+ bgcolor: (_d = item.backgroundColor) != null ? _d : "action.selected",
90
+ color: (_e = item.color) != null ? _e : "text.secondary"
89
91
  }, i > 0 && { marginLeft: `-${effectiveOverlap}px` }), {
90
92
  zIndex: visibleItems.length - i
91
93
  });
@@ -93,18 +95,17 @@ const Avatar = ({
93
95
  const avatarEl = /* @__PURE__ */ jsx(
94
96
  Avatar$1,
95
97
  {
96
- "data-testid": "avatar",
97
98
  alt: item.text || "User avatar",
98
99
  src: hasImage ? item.imageUrl : void 0,
99
100
  imgProps: {
100
- "data-testid": "image",
101
- onError: () => handleImageError(i)
101
+ onError: () => {
102
+ if (item.imageUrl) handleImageError(item.imageUrl);
103
+ }
102
104
  },
103
105
  sx: finalSx,
104
- children: !hasImage && showBadgeFallback ? /* @__PURE__ */ jsx("span", { "data-testid": "badge", "aria-label": item.text, children: item.badge }) : !hasImage ? /* @__PURE__ */ jsx(
106
+ children: !hasImage && showBadgeFallback ? /* @__PURE__ */ jsx("span", { "aria-label": item.text, children: item.badge }) : !hasImage ? /* @__PURE__ */ jsx(
105
107
  AccountCircleIcon,
106
108
  {
107
- "data-testid": "icon",
108
109
  "aria-label": item.text,
109
110
  sx: { width: "100%", height: "100%" }
110
111
  }
@@ -112,14 +113,13 @@ const Avatar = ({
112
113
  }
113
114
  );
114
115
  if (showTooltip && item.text) {
115
- return /* @__PURE__ */ jsx(Tooltip, { title: item.text, children: avatarEl }, i);
116
+ return /* @__PURE__ */ jsx(Tooltip, { title: item.text, children: avatarEl }, itemKey);
116
117
  }
117
- return /* @__PURE__ */ jsx(React__default.Fragment, { children: avatarEl }, i);
118
+ return /* @__PURE__ */ jsx(React__default.Fragment, { children: avatarEl }, itemKey);
118
119
  };
119
120
  return /* @__PURE__ */ jsxs(
120
121
  Box,
121
122
  {
122
- "data-testid": "avatar-container",
123
123
  className,
124
124
  sx: mergeSx(
125
125
  {
@@ -135,7 +135,6 @@ const Avatar = ({
135
135
  showText && ((_a = items[0]) == null ? void 0 : _a.text) && /* @__PURE__ */ jsxs(
136
136
  Typography,
137
137
  {
138
- "data-testid": "text",
139
138
  variant: "caption",
140
139
  sx: {
141
140
  ml: 1,
@@ -144,7 +143,7 @@ const Avatar = ({
144
143
  color: "text.primary"
145
144
  },
146
145
  children: [
147
- type && items.length === 1 && /* @__PURE__ */ jsxs(Box, { component: "span", "data-testid": "type", sx: { mr: 0.5 }, children: [
146
+ type && items.length === 1 && /* @__PURE__ */ jsxs(Box, { component: "span", sx: { mr: 0.5 }, children: [
148
147
  type,
149
148
  ":"
150
149
  ] }),
@@ -160,4 +159,4 @@ const Avatar = ({
160
159
  export {
161
160
  Avatar as A
162
161
  };
163
- //# sourceMappingURL=Avatar-BJTr-PBd.js.map
162
+ //# sourceMappingURL=Avatar-CgT7955R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Avatar-CgT7955R.js","sources":["../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Avatar as MuiAvatar,\n Box,\n Tooltip,\n Typography,\n type SxProps,\n type Theme,\n} from '@mui/material';\nimport AccountCircleIcon from '@mui/icons-material/AccountCircle';\n\nexport interface AvatarItem {\n text?: string;\n imageUrl?: string;\n badge?: string;\n color?: string;\n backgroundColor?: string;\n}\n\nexport type AvatarSize = 'sm' | 'md' | 'lg' | 'xl' | number;\n\nexport interface AvatarProps {\n type?: string;\n items: AvatarItem[];\n displayedAvatars?: number;\n size?: AvatarSize;\n showText?: boolean;\n showTooltip?: boolean;\n /**\n * sx aplicado al contenedor raíz.\n */\n sx?: SxProps<Theme>;\n /**\n * sx aplicado a cada MuiAvatar individual (se mergea sobre los defaults).\n */\n avatarSx?: SxProps<Theme>;\n className?: string;\n /**\n * Overlap (px) entre avatares cuando hay varios. Default depende del tamaño.\n */\n overlap?: number;\n}\n\n// Escala alineada con la escala de MUI (sm=32, md=40, lg=56, xl=96) con borde\n// proporcional para el efecto stacked.\nconst sizeMap: Record<\n Exclude<AvatarSize, number>,\n { px: number; border: number; font: number; overlap: number }\n> = {\n sm: { px: 32, border: 2, font: 14, overlap: 8 },\n md: { px: 40, border: 2, font: 16, overlap: 10 },\n lg: { px: 56, border: 3, font: 22, overlap: 14 },\n xl: { px: 96, border: 4, font: 36, overlap: 20 },\n};\n\nconst resolveSize = (size: AvatarSize) => {\n if (typeof size === 'number') {\n return {\n px: size,\n border: Math.max(2, Math.round(size * 0.05)),\n font: Math.round(size * 0.4),\n overlap: Math.round(size * 0.25),\n };\n }\n return sizeMap[size];\n};\n\nconst mergeSx = (base: SxProps<Theme>, extra?: SxProps<Theme>): SxProps<Theme> => {\n if (!extra) return base;\n const baseArr = Array.isArray(base) ? base : [base];\n const extraArr = Array.isArray(extra) ? extra : [extra];\n return [...baseArr, ...extraArr] as SxProps<Theme>;\n};\n\nexport const Avatar: React.FC<AvatarProps> = ({\n items,\n type,\n displayedAvatars = 4,\n size = 'sm',\n showText = true,\n showTooltip = false,\n sx,\n avatarSx,\n className,\n overlap,\n}) => {\n // Indexamos por URL (no por posición) para que cambios en `items` — reorder,\n // filtrado, paginación — no hagan que un avatar válido \"herede\" el estado de\n // imagen rota de un item anterior que estaba en la misma posición.\n const [failedUrls, setFailedUrls] = useState<Set<string>>(new Set());\n\n const handleImageError = (url: string) => {\n setFailedUrls((prev) => {\n if (prev.has(url)) return prev;\n const next = new Set(prev);\n next.add(url);\n return next;\n });\n };\n\n if (!items || items.length === 0) {\n return null;\n }\n\n const s = resolveSize(size);\n const effectiveOverlap = overlap ?? s.overlap;\n const visibleItems = items.slice(0, displayedAvatars);\n\n const baseAvatarSx: SxProps<Theme> = {\n width: s.px,\n height: s.px,\n fontSize: s.font,\n fontWeight: 700,\n border: (theme) => `${s.border}px solid ${theme.palette.background.paper}`,\n boxSizing: 'content-box',\n };\n\n const renderSingleAvatar = (item: AvatarItem, i: number) => {\n const hasImage = !!item.imageUrl && !failedUrls.has(item.imageUrl);\n const showBadgeFallback = !!item.badge;\n const itemKey = item.imageUrl ?? `${item.text ?? ''}-${item.badge ?? ''}-${i}`;\n\n // Defaults tirando al theme; item.color / item.backgroundColor tienen prioridad.\n const itemSx: SxProps<Theme> = {\n bgcolor: item.backgroundColor ?? 'action.selected',\n color: item.color ?? 'text.secondary',\n // Stacking manual: margen negativo al segundo avatar en adelante.\n ...(i > 0 && { marginLeft: `-${effectiveOverlap}px` }),\n zIndex: visibleItems.length - i,\n };\n\n const finalSx = mergeSx(mergeSx(baseAvatarSx, itemSx), avatarSx);\n\n const avatarEl = (\n <MuiAvatar\n alt={item.text || 'User avatar'}\n src={hasImage ? item.imageUrl : undefined}\n imgProps={{\n onError: () => {\n if (item.imageUrl) handleImageError(item.imageUrl);\n },\n }}\n sx={finalSx}\n >\n {!hasImage && showBadgeFallback ? (\n <span aria-label={item.text}>{item.badge}</span>\n ) : !hasImage ? (\n <AccountCircleIcon\n aria-label={item.text}\n sx={{ width: '100%', height: '100%' }}\n />\n ) : null}\n </MuiAvatar>\n );\n\n if (showTooltip && item.text) {\n return (\n <Tooltip key={itemKey} title={item.text}>\n {avatarEl}\n </Tooltip>\n );\n }\n return <React.Fragment key={itemKey}>{avatarEl}</React.Fragment>;\n };\n\n return (\n <Box\n className={className}\n sx={mergeSx(\n {\n display: 'flex',\n alignItems: 'center',\n lineHeight: 1,\n width: 'fit-content',\n },\n sx,\n )}\n >\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n {visibleItems.map((item, i) => renderSingleAvatar(item, i))}\n </Box>\n\n {showText && items[0]?.text && (\n <Typography\n variant=\"caption\"\n sx={{\n ml: 1,\n fontSize: '0.75rem',\n fontWeight: 400,\n color: 'text.primary',\n }}\n >\n {type && items.length === 1 && (\n <Box component=\"span\" sx={{ mr: 0.5 }}>\n {type}:\n </Box>\n )}\n {items[0].text}\n {items.length > 1 && ` +${items.length - 1}`}\n </Typography>\n )}\n </Box>\n );\n};\n\nexport default Avatar;\n"],"names":["_a","MuiAvatar","React"],"mappings":"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"}