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

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 (212) hide show
  1. package/build.js +38 -75
  2. package/dist/README.md +243 -0
  3. package/dist/components/Drawer/Drawer.cjs +14 -17
  4. package/dist/components/Drawer/Drawer.cjs.map +1 -1
  5. package/dist/components/Drawer/Drawer.d.ts +8 -1
  6. package/dist/components/Drawer/Drawer.js +14 -17
  7. package/dist/components/Drawer/Drawer.js.map +1 -1
  8. package/dist/components/Input/Input.definitions.d.ts +1 -0
  9. package/dist/components/RadioGroup/RadioGroup.cjs +202 -0
  10. package/dist/components/RadioGroup/RadioGroup.cjs.map +1 -0
  11. package/dist/components/RadioGroup/RadioGroup.d.ts +53 -0
  12. package/dist/components/RadioGroup/RadioGroup.definitions.d.ts +6 -0
  13. package/dist/components/RadioGroup/RadioGroup.js +202 -0
  14. package/dist/components/RadioGroup/RadioGroup.js.map +1 -0
  15. package/dist/components/RadioGroup/RadioGroup.sx.d.ts +20 -0
  16. package/dist/components/RadioGroup/RadioGroup.types.d.ts +1 -0
  17. package/dist/components/RadioGroup/index.d.ts +2 -0
  18. package/dist/components/RadioGroup.d.ts +6 -0
  19. package/dist/components/Stepper/Stepper.cjs +136 -23
  20. package/dist/components/Stepper/Stepper.cjs.map +1 -1
  21. package/dist/components/Stepper/Stepper.js +137 -24
  22. package/dist/components/Stepper/Stepper.js.map +1 -1
  23. package/dist/components/Switch/Switch.cjs +181 -0
  24. package/dist/components/Switch/Switch.cjs.map +1 -0
  25. package/dist/components/Switch/Switch.d.ts +43 -0
  26. package/dist/components/Switch/Switch.definitions.d.ts +7 -0
  27. package/dist/components/Switch/Switch.js +181 -0
  28. package/dist/components/Switch/Switch.js.map +1 -0
  29. package/dist/components/Switch/Switch.sx.d.ts +22 -0
  30. package/dist/components/Switch/Switch.types.d.ts +1 -0
  31. package/dist/components/Switch/index.d.ts +2 -0
  32. package/dist/components/Switch.d.ts +6 -0
  33. package/dist/index.cjs +24 -0
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.js +7 -1
  36. package/dist/mui.d.ts +1 -0
  37. package/dist/package.json +207 -0
  38. package/dist/theme/componentStyles.d.ts +1 -1
  39. package/package.json +1 -1
  40. package/src/components/Drawer/Drawer.stories.tsx +168 -0
  41. package/src/components/Drawer/Drawer.tsx +26 -18
  42. package/src/components/Input/Input.definitions.ts +24 -0
  43. package/src/components/Input/Input.stories.tsx +29 -0
  44. package/src/components/RadioGroup/RadioGroup.definitions.ts +177 -0
  45. package/src/components/RadioGroup/RadioGroup.stories.tsx +231 -0
  46. package/src/components/RadioGroup/RadioGroup.sx.ts +75 -0
  47. package/src/components/RadioGroup/RadioGroup.tsx +196 -0
  48. package/src/components/RadioGroup/RadioGroup.types.ts +10 -0
  49. package/src/components/RadioGroup/index.ts +9 -0
  50. package/src/components/Stepper/Stepper.stories.tsx +72 -0
  51. package/src/components/Stepper/Stepper.tsx +139 -4
  52. package/src/components/Switch/Switch.definitions.ts +134 -0
  53. package/src/components/Switch/Switch.stories.tsx +213 -0
  54. package/src/components/Switch/Switch.sx.ts +81 -0
  55. package/src/components/Switch/Switch.tsx +172 -0
  56. package/src/components/Switch/Switch.types.ts +10 -0
  57. package/src/components/Switch/index.ts +9 -0
  58. package/src/mui.ts +10 -0
  59. package/src/theme/componentStyles.ts +3 -1
  60. package/storybook-static/addon-visual-tests-assets/visual-test-illustration.mp4 +0 -0
  61. package/storybook-static/assets/AccountCircle-BDZFsbTw.js +1 -0
  62. package/storybook-static/assets/ActionMenu-EynP8yU1.js +19 -0
  63. package/storybook-static/assets/ActionMenu.stories-DqSqRGix.js +185 -0
  64. package/storybook-static/assets/Alert-3zvTPc0p.js +1 -0
  65. package/storybook-static/assets/AppBar.stories-DcX3M5th.js +172 -0
  66. package/storybook-static/assets/Autocomplete.stories-CXJm8FOT.js +788 -0
  67. package/storybook-static/assets/Avatar-NbFfkZws.js +1 -0
  68. package/storybook-static/assets/Avatar.stories-CwOYCzqU.js +390 -0
  69. package/storybook-static/assets/Box-BnhEcfFm.js +1 -0
  70. package/storybook-static/assets/Button-D9h7OggD.js +1 -0
  71. package/storybook-static/assets/Button-DBpqmVB_.js +1 -0
  72. package/storybook-static/assets/Button.stories-F20dmnjq.js +320 -0
  73. package/storybook-static/assets/ButtonBase-qyaMEhe4.js +74 -0
  74. package/storybook-static/assets/Card.stories-B3NpAhO0.js +154 -0
  75. package/storybook-static/assets/CheckCircleOutline-CEj5mDsl.js +1 -0
  76. package/storybook-static/assets/Chip-C3vKPpzR.js +1 -0
  77. package/storybook-static/assets/Chip.stories-sxcfHVo9.js +333 -0
  78. package/storybook-static/assets/CircularProgress-DC7ZNWwl.js +28 -0
  79. package/storybook-static/assets/Clear-4kYcKvT3.js +1 -0
  80. package/storybook-static/assets/ClipBoard-DvLBdNHe.js +1 -0
  81. package/storybook-static/assets/ClipBoard.stories-BGUo47r6.js +108 -0
  82. package/storybook-static/assets/Close-CgHeRgmh.js +1 -0
  83. package/storybook-static/assets/Close-Cy8nELYU.js +1 -0
  84. package/storybook-static/assets/Color-AVL7NMMY-BJKvwERm.js +1 -0
  85. package/storybook-static/assets/ContentCopy-BfLTDb10.js +1 -0
  86. package/storybook-static/assets/DatePicker-Clkpr-Ku.js +1 -0
  87. package/storybook-static/assets/DatePicker.stories-EaUCMkh3.js +444 -0
  88. package/storybook-static/assets/DateRangePicker.stories-BMlkj-8K.js +390 -0
  89. package/storybook-static/assets/DateTimePicker.stories-B6gdzKq5.js +555 -0
  90. package/storybook-static/assets/DefaultPropsProvider-BGoQxtDa.js +16 -0
  91. package/storybook-static/assets/Delete-D2SMMmIA.js +1 -0
  92. package/storybook-static/assets/DialogContent-BeCDKgax.js +1 -0
  93. package/storybook-static/assets/Divider-BbCj9wT4.js +1 -0
  94. package/storybook-static/assets/DocsRenderer-PQXLIZUC-BebLK5Y_.js +1243 -0
  95. package/storybook-static/assets/Drawer-DcFwy73r.js +1 -0
  96. package/storybook-static/assets/Drawer.stories-C5AZkJBk.js +173 -0
  97. package/storybook-static/assets/EmptyTable-B-RKtgVs.png +0 -0
  98. package/storybook-static/assets/ErrorOutline-D9gM7ART.js +1 -0
  99. package/storybook-static/assets/Fade-Ll96CvH8.js +1 -0
  100. package/storybook-static/assets/Flyout.stories-Cf7z6MNw.js +163 -0
  101. package/storybook-static/assets/Gallery.stories-DdpWVTF6.js +127 -0
  102. package/storybook-static/assets/Grow-8y4FglGK.js +1 -0
  103. package/storybook-static/assets/Home-BRvJEp2L.js +1 -0
  104. package/storybook-static/assets/Icon.stories-D0mUiW_t.js +78 -0
  105. package/storybook-static/assets/IconButton-9OYSTH58.js +1 -0
  106. package/storybook-static/assets/Input-CjX0t4h-.js +1 -0
  107. package/storybook-static/assets/Input.stories-BRxekliy.js +650 -0
  108. package/storybook-static/assets/InputGroup.stories-DH6gUfmn.js +306 -0
  109. package/storybook-static/assets/KeyboardArrowRight-WO_attK2.js +1 -0
  110. package/storybook-static/assets/KeyboardArrowUp-DsyVef-i.js +1 -0
  111. package/storybook-static/assets/ListItem-D3O0103N.js +1 -0
  112. package/storybook-static/assets/ListItemIcon-hca6xN79.js +1 -0
  113. package/storybook-static/assets/ListItemText-BFLAwLdl.js +1 -0
  114. package/storybook-static/assets/Logout-gj-P3AfU.js +1 -0
  115. package/storybook-static/assets/Menu-ClzfjLc3.js +1 -0
  116. package/storybook-static/assets/MenuButton.stories-B-W_QVDt.js +162 -0
  117. package/storybook-static/assets/MenuItem-iU6tAqJI.js +1 -0
  118. package/storybook-static/assets/Modal-3okp9H2i.js +1 -0
  119. package/storybook-static/assets/Modal.stories-DIWzm4qR.js +468 -0
  120. package/storybook-static/assets/MoreVert-BoIVG4gh.js +1 -0
  121. package/storybook-static/assets/Notifications-DY_A-Sho.js +1 -0
  122. package/storybook-static/assets/PageLoader.stories-DmtO1mlm.js +158 -0
  123. package/storybook-static/assets/Paper-SwQBhqI7.js +1 -0
  124. package/storybook-static/assets/Person-CkQl-mpq.js +1 -0
  125. package/storybook-static/assets/PickersModalDialog-Tjnr_cu5.js +10 -0
  126. package/storybook-static/assets/PickersToolbarButton-Tt185-si.js +1 -0
  127. package/storybook-static/assets/Popper-CnCTYXxy.js +1 -0
  128. package/storybook-static/assets/Portal-Cj8XF9Lf.js +1 -0
  129. package/storybook-static/assets/ScrollTopButton.stories-BflQCwNP.js +90 -0
  130. package/storybook-static/assets/Select-CjcuMAY0.js +4 -0
  131. package/storybook-static/assets/Select-DJh2biEb.js +3 -0
  132. package/storybook-static/assets/Select.stories-DU1Gb3I2.js +1103 -0
  133. package/storybook-static/assets/Settings-BLKc1CnO.js +1 -0
  134. package/storybook-static/assets/Snackbar-BtVeKTw6.js +1 -0
  135. package/storybook-static/assets/Stack-D01OUIXi.js +1 -0
  136. package/storybook-static/assets/Stat.stories-Bn9-iuPT.js +60 -0
  137. package/storybook-static/assets/StatusMessage.stories-hnfX8FeU.js +73 -0
  138. package/storybook-static/assets/Stepper-BtKB5ykn.js +2 -0
  139. package/storybook-static/assets/Stepper.stories-CTEZbgPc.js +165 -0
  140. package/storybook-static/assets/Table.stories-CTn2Ktmn.js +1260 -0
  141. package/storybook-static/assets/TableContainer-CzLNaEU-.js +1 -0
  142. package/storybook-static/assets/TableRow-CS88-1HF.js +2 -0
  143. package/storybook-static/assets/Tabs-DLpDOu_n.js +1 -0
  144. package/storybook-static/assets/Tabs.stories-BFVuFy_5.js +159 -0
  145. package/storybook-static/assets/TextField-22T-xHBm.js +1 -0
  146. package/storybook-static/assets/Timeline.stories-DJU_U2Hv.js +97 -0
  147. package/storybook-static/assets/Tooltip-DbnHUxNj.js +1 -0
  148. package/storybook-static/assets/Tooltip.stories-B7tA3dnV.js +66 -0
  149. package/storybook-static/assets/Typography-BgntX2Ep.js +1 -0
  150. package/storybook-static/assets/Wizard.stories-CVrJLK_D.js +23 -0
  151. package/storybook-static/assets/createSimplePaletteValueFilter-bm0fmN_7.js +1 -0
  152. package/storybook-static/assets/createSvgIcon-D_Gca4vA.js +1 -0
  153. package/storybook-static/assets/debounce-Be36O1Ab.js +1 -0
  154. package/storybook-static/assets/emotion-react.browser.esm--g-C9cX9.js +8 -0
  155. package/storybook-static/assets/extendSxProp-CEpa30hT.js +1 -0
  156. package/storybook-static/assets/formField.sx-DMCmZIAa.js +1 -0
  157. package/storybook-static/assets/getReactElementRef-BQ3ANZdy.js +1 -0
  158. package/storybook-static/assets/iframe-BAJnc_4n.js +1079 -0
  159. package/storybook-static/assets/index-B1tlhOpe.js +240 -0
  160. package/storybook-static/assets/index-BF3FAXTk.js +9 -0
  161. package/storybook-static/assets/index-CIeucmOB.js +2 -0
  162. package/storybook-static/assets/index-CY7j4a7o.js +1 -0
  163. package/storybook-static/assets/index-CxkKctw5.js +1 -0
  164. package/storybook-static/assets/isFocusVisible-B8k4qzLc.js +1 -0
  165. package/storybook-static/assets/isMuiElement-CTZSFcY5.js +1 -0
  166. package/storybook-static/assets/jsx-runtime-D_zvdyIk.js +9 -0
  167. package/storybook-static/assets/listItemTextClasses-CC_rwJam.js +1 -0
  168. package/storybook-static/assets/mergeSlotProps-B0UBKBMe.js +1 -0
  169. package/storybook-static/assets/ownerDocument-DW-IO8s5.js +1 -0
  170. package/storybook-static/assets/ownerWindow-HkKU3E4x.js +1 -0
  171. package/storybook-static/assets/preload-helper-PPVm8Dsz.js +1 -0
  172. package/storybook-static/assets/react-18-BUJ64QCV.js +25 -0
  173. package/storybook-static/assets/resolvePreset-CN2aOJJr.js +1 -0
  174. package/storybook-static/assets/useControlled-DsVh1a5j.js +1 -0
  175. package/storybook-static/assets/useForkRef-0ANIrxcF.js +1 -0
  176. package/storybook-static/assets/useId-b4fZxjOL.js +1 -0
  177. package/storybook-static/assets/useMobilePicker-DK-c8xbD.js +1 -0
  178. package/storybook-static/assets/usePreviousProps-WR0rG4aR.js +1 -0
  179. package/storybook-static/assets/useSlot-b6pXgp5_.js +1 -0
  180. package/storybook-static/assets/useSlotProps-C0uMfuBt.js +1 -0
  181. package/storybook-static/assets/useTheme-BmOJK7ra.js +1 -0
  182. package/storybook-static/assets/useThemeProps-DYtxXiUU.js +1 -0
  183. package/storybook-static/assets/useThemeProps-U4yXiZ_5.js +1 -0
  184. package/storybook-static/assets/useTimeout-DNjRaOWc.js +1 -0
  185. package/storybook-static/assets/visuallyHidden-Dan1xhjv.js +1 -0
  186. package/storybook-static/favicon-wrapper.svg +46 -0
  187. package/storybook-static/favicon.svg +1 -0
  188. package/storybook-static/iframe.html +686 -0
  189. package/storybook-static/index.html +160 -0
  190. package/storybook-static/index.json +1 -0
  191. package/storybook-static/nunito-sans-bold-italic.woff2 +0 -0
  192. package/storybook-static/nunito-sans-bold.woff2 +0 -0
  193. package/storybook-static/nunito-sans-italic.woff2 +0 -0
  194. package/storybook-static/nunito-sans-regular.woff2 +0 -0
  195. package/storybook-static/project.json +1 -0
  196. package/storybook-static/sb-addons/chromatic-com-storybook-2/manager-bundle.js +356 -0
  197. package/storybook-static/sb-addons/chromatic-com-storybook-2/manager-bundle.js.LEGAL.txt +40 -0
  198. package/storybook-static/sb-addons/docs-4/manager-bundle.js +151 -0
  199. package/storybook-static/sb-addons/onboarding-1/manager-bundle.js +127 -0
  200. package/storybook-static/sb-addons/storybook-core-server-presets-0/common-manager-bundle.js +971 -0
  201. package/storybook-static/sb-addons/vitest-3/manager-bundle.js +3 -0
  202. package/storybook-static/sb-common-assets/favicon-wrapper.svg +46 -0
  203. package/storybook-static/sb-common-assets/favicon.svg +1 -0
  204. package/storybook-static/sb-common-assets/nunito-sans-bold-italic.woff2 +0 -0
  205. package/storybook-static/sb-common-assets/nunito-sans-bold.woff2 +0 -0
  206. package/storybook-static/sb-common-assets/nunito-sans-italic.woff2 +0 -0
  207. package/storybook-static/sb-common-assets/nunito-sans-regular.woff2 +0 -0
  208. package/storybook-static/sb-manager/globals-module-info.js +797 -0
  209. package/storybook-static/sb-manager/globals-runtime.js +69679 -0
  210. package/storybook-static/sb-manager/globals.js +34 -0
  211. package/storybook-static/sb-manager/runtime.js +13195 -0
  212. package/storybook-static/vite-inject-mocker-entry.js +18 -0
@@ -0,0 +1,788 @@
1
+ import{j as r}from"./jsx-runtime-D_zvdyIk.js";import{r as l}from"./iframe-BAJnc_4n.js";import{b as mo,C as go,u as fo}from"./formField.sx-DMCmZIAa.js";import{r as ho}from"./resolvePreset-CN2aOJJr.js";import{L as bo,C as xo}from"./Clear-4kYcKvT3.js";import{C as Dt}from"./Chip-C3vKPpzR.js";import{A as Zt}from"./Avatar-NbFfkZws.js";import{B as E}from"./Box-BnhEcfFm.js";import{C as vo}from"./CircularProgress-DC7ZNWwl.js";import{T as J}from"./Typography-BgntX2Ep.js";import{u as yo}from"./useTheme-BmOJK7ra.js";import{a as Ao,g as So,u as Co,s as Q,c as jt,b as eo,d as Oo,m as Me}from"./DefaultPropsProvider-BGoQxtDa.js";import{A as Io,f as De,i as Ie,o as Wt,a as kt}from"./Select-DJh2biEb.js";import{C as Po}from"./Close-Cy8nELYU.js";import{u as Et}from"./useSlot-b6pXgp5_.js";import{u as wo}from"./useId-b4fZxjOL.js";import{u as $t}from"./useControlled-DsVh1a5j.js";import{u as To}from"./usePreviousProps-WR0rG4aR.js";import{u as lt}from"./useTimeout-DNjRaOWc.js";import{s as Ro}from"./Portal-Cj8XF9Lf.js";import{P as to}from"./Paper-SwQBhqI7.js";import{P as oo}from"./Popper-CnCTYXxy.js";import{I as no}from"./IconButton-9OYSTH58.js";import{T as Bo}from"./TextField-22T-xHBm.js";import{S as Ft}from"./Stack-D01OUIXi.js";import{B as Lo}from"./Button-DBpqmVB_.js";import"./preload-helper-PPVm8Dsz.js";import"./createSvgIcon-D_Gca4vA.js";import"./createSimplePaletteValueFilter-bm0fmN_7.js";import"./useForkRef-0ANIrxcF.js";import"./ButtonBase-qyaMEhe4.js";import"./emotion-react.browser.esm--g-C9cX9.js";import"./isFocusVisible-B8k4qzLc.js";import"./extendSxProp-CEpa30hT.js";import"./Menu-ClzfjLc3.js";import"./useSlotProps-C0uMfuBt.js";import"./ownerDocument-DW-IO8s5.js";import"./ownerWindow-HkKU3E4x.js";import"./debounce-Be36O1Ab.js";import"./Grow-8y4FglGK.js";import"./getReactElementRef-BQ3ANZdy.js";import"./index-CY7j4a7o.js";import"./index-BF3FAXTk.js";import"./mergeSlotProps-B0UBKBMe.js";import"./Modal-3okp9H2i.js";import"./Fade-Ll96CvH8.js";import"./isMuiElement-CTZSFcY5.js";import"./useThemeProps-DYtxXiUU.js";function Ht({array1:e,array2:n,parser:a=i=>i}){return e&&n&&e.length===n.length&&e.every((i,d)=>a(i)===a(n[d]))}function _t(e){return e.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}function Vo(e={}){const{ignoreAccents:n=!0,ignoreCase:a=!0,limit:i,matchFrom:d="any",stringify:I,trim:y=!1}=e;return(S,{inputValue:B,getOptionLabel:x})=>{let C=y?B.trim():B;a&&(C=C.toLowerCase()),n&&(C=_t(C));const Y=C?S.filter(Pe=>{let $=(I||x)(Pe);return a&&($=$.toLowerCase()),n&&($=_t($)),d==="start"?$.startsWith(C):$.includes(C)}):S;return typeof i=="number"?Y.slice(0,i):Y}}const jo=Vo(),Gt=5,ko=e=>e.current!==null&&e.current.parentElement?.contains(document.activeElement),Eo=[];function Kt(e,n,a,i){if(n||e==null||i)return"";const d=a(e);return typeof d=="string"?d:""}function $o(e){const{unstable_isActiveElementInListbox:n=ko,unstable_classNamePrefix:a="Mui",autoComplete:i=!1,autoHighlight:d=!1,autoSelect:I=!1,blurOnSelect:y=!1,clearOnBlur:S=!e.freeSolo,clearOnEscape:B=!1,componentName:x="useAutocomplete",defaultValue:C=e.multiple?Eo:null,disableClearable:Y=!1,disableCloseOnSelect:Pe=!1,disabled:$,disabledItemsFocusable:fe=!1,disableListWrap:he=!1,filterOptions:Qe=jo,filterSelectedOptions:we=!1,freeSolo:U=!1,getOptionDisabled:q,getOptionKey:Xe,getOptionLabel:Te=o=>o.label??o,groupBy:Z,handleHomeEndKeys:Fe=!e.freeSolo,id:Ye,includeInputInList:be=!1,inputValue:Re,isOptionEqualToValue:ee=(o,t)=>o===t,multiple:g=!1,onChange:Be,onClose:Le,onHighlightChange:xe,onInputChange:N,onOpen:ie,open:Ne,openOnFocus:Ze=!1,options:qe,readOnly:W=!1,renderValue:j,selectOnFocus:ze=!e.freeSolo,value:ve}=e,D=wo(Ye);let f=Te;f=o=>{const t=Te(o);return typeof t!="string"?String(t):t};const M=l.useRef(!1),z=l.useRef(!0),v=l.useRef(null),T=l.useRef(null),[te,Ue]=l.useState(null),[k,X]=l.useState(-1),ye=d?0:-1,h=l.useRef(ye),ce=l.useRef(Kt(C??ve,g,f)).current,[u,We]=$t({controlled:ve,default:C,name:x}),[A,Ae]=$t({controlled:Re,default:ce,name:x,state:"inputValue"}),[Ve,et]=l.useState(!1),je=l.useCallback((o,t,s)=>{if(!(g?u.length<t.length:t!==null)&&!S)return;const p=Kt(t,g,f,j);A!==p&&(Ae(p),N&&N(o,p,s))},[f,A,g,N,Ae,S,u,j]),[oe,Se]=$t({controlled:Ne,default:!1,name:x,state:"open"}),[Nt,ke]=l.useState(!0),tt=!g&&u!=null&&A===f(u),F=oe&&!W,O=F?Qe(qe.filter(o=>!(we&&(g?u:[u]).some(t=>t!==null&&ee(o,t)))),{inputValue:tt&&Nt?"":A,getOptionLabel:f}):[],H=To({filteredOptions:O,value:u,inputValue:A});l.useEffect(()=>{const o=u!==H.value;Ve&&!o||U&&!o||je(null,u,"reset")},[u,je,Ve,H.value,U]);const ot=oe&&O.length>0&&!W,_=lt(o=>{if(o===-1)v.current.focus();else{const t=j?"data-item-index":"data-tag-index";te.querySelector(`[${t}="${o}"]`).focus()}});l.useEffect(()=>{g&&k>u.length-1&&(X(-1),_(-1))},[u,g,k,_]);function Ot(o,t){if(!T.current||o<0||o>=O.length)return-1;let s=o;for(;;){const c=T.current.querySelector(`[data-option-index="${s}"]`),p=fe?!1:!c||c.disabled||c.getAttribute("aria-disabled")==="true";if(c&&c.hasAttribute("tabindex")&&!p)return s;if(t==="next"?s=(s+1)%O.length:s=(s-1+O.length)%O.length,s===o)return-1}}const ne=lt(({event:o,index:t,reason:s})=>{if(h.current=t,t===-1?v.current.removeAttribute("aria-activedescendant"):v.current.setAttribute("aria-activedescendant",`${D}-option-${t}`),xe&&["mouse","keyboard","touch"].includes(s)&&xe(o,t===-1?null:O[t],s),!T.current)return;const c=T.current.querySelector(`[role="option"].${a}-focused`);c&&(c.classList.remove(`${a}-focused`),c.classList.remove(`${a}-focusVisible`));let p=T.current;if(T.current.getAttribute("role")!=="listbox"&&(p=T.current.parentElement.querySelector('[role="listbox"]')),!p)return;if(t===-1){p.scrollTop=0;return}const V=T.current.querySelector(`[data-option-index="${t}"]`);if(V&&(V.classList.add(`${a}-focused`),s==="keyboard"&&V.classList.add(`${a}-focusVisible`),p.scrollHeight>p.clientHeight&&s!=="mouse"&&s!=="touch")){const P=V,K=p.clientHeight+p.scrollTop,st=P.offsetTop+P.offsetHeight;st>K?p.scrollTop=st-p.clientHeight:P.offsetTop-P.offsetHeight*(Z?1.3:0)<p.scrollTop&&(p.scrollTop=P.offsetTop-P.offsetHeight*(Z?1.3:0))}}),G=lt(({event:o,diff:t,direction:s="next",reason:c})=>{if(!F)return;const V=Ot((()=>{const P=O.length-1;if(t==="reset")return ye;if(t==="start")return 0;if(t==="end")return P;const K=h.current+t;return K<0?K===-1&&be?-1:he&&h.current!==-1||Math.abs(t)>1?0:P:K>P?K===P+1&&be?-1:he||Math.abs(t)>1?P:0:K})(),s);if(ne({index:V,reason:c,event:o}),i&&t!=="reset")if(V===-1)v.current.value=A;else{const P=f(O[V]);v.current.value=P,P.toLowerCase().indexOf(A.toLowerCase())===0&&A.length>0&&v.current.setSelectionRange(A.length,P.length)}}),nt=!Ht({array1:H.filteredOptions,array2:O,parser:f}),It=()=>{const o=(t,s)=>{const c=t?f(t):"",p=s?f(s):"";return c===p};if(h.current!==-1&&!Ht({array1:H.filteredOptions,array2:O,parser:f})&&H.inputValue===A&&(g?u.length===H.value.length&&H.value.every((t,s)=>f(u[s])===f(t)):o(H.value,u))){const t=H.filteredOptions[h.current];if(t)return O.findIndex(s=>f(s)===f(t))}return-1},He=l.useCallback(()=>{if(!F)return;const o=It();if(o!==-1){h.current=o;return}const t=g?u[0]:u;if(O.length===0||t==null){G({diff:"reset"});return}if(T.current){if(t!=null){const s=O[h.current];if(g&&s&&u.findIndex(p=>ee(s,p))!==-1)return;const c=O.findIndex(p=>ee(p,t));c===-1?G({diff:"reset"}):ne({index:c});return}if(h.current>=O.length-1){ne({index:O.length-1});return}ne({index:h.current})}},[O.length,g?!1:u,we,G,ne,F,A,g]),ue=lt(o=>{Ro(T,o),o&&He()});l.useEffect(()=>{nt&&He()},[He,nt]);const ae=o=>{oe||(Se(!0),ke(!0),ie&&ie(o))},Ce=(o,t)=>{oe&&(Se(!1),Le&&Le(o,t))},re=(o,t,s,c)=>{if(g){if(u.length===t.length&&u.every((p,V)=>p===t[V]))return}else if(u===t)return;Be&&Be(o,t,s,c),We(t)},se=l.useRef(!1),pe=(o,t,s="selectOption",c="options")=>{let p=s,V=t;if(g){V=Array.isArray(u)?u.slice():[];const P=V.findIndex(K=>ee(t,K));P===-1?V.push(t):c!=="freeSolo"&&(V.splice(P,1),p="removeOption")}je(o,V,p),re(o,V,p,{option:t}),!Pe&&(!o||!o.ctrlKey&&!o.metaKey)&&Ce(o,p),(y===!0||y==="touch"&&se.current||y==="mouse"&&!se.current)&&v.current.blur()};function Pt(o,t){if(o===-1)return-1;let s=o;for(;;){if(t==="next"&&s===u.length||t==="previous"&&s===-1)return-1;const c=j?"data-item-index":"data-tag-index",p=te.querySelector(`[${c}="${s}"]`);if(!p||!p.hasAttribute("tabindex")||p.disabled||p.getAttribute("aria-disabled")==="true")s+=t==="next"?1:-1;else return s}}const Oe=(o,t)=>{if(!g)return;A===""&&Ce(o,"toggleInput");let s=k;k===-1?A===""&&t==="previous"&&(s=u.length-1):(s+=t==="next"?1:-1,s<0&&(s=0),s===u.length&&(s=-1)),s=Pt(s,t),X(s),_(s)},at=o=>{M.current=!0,Ae(""),N&&N(o,"","clear"),re(o,g?[]:null,"clear")},wt=o=>t=>{if(o.onKeyDown&&o.onKeyDown(t),!t.defaultMuiPrevented&&(k!==-1&&!["ArrowLeft","ArrowRight"].includes(t.key)&&(X(-1),_(-1)),t.which!==229))switch(t.key){case"Home":F&&Fe&&(t.preventDefault(),G({diff:"start",direction:"next",reason:"keyboard",event:t}));break;case"End":F&&Fe&&(t.preventDefault(),G({diff:"end",direction:"previous",reason:"keyboard",event:t}));break;case"PageUp":t.preventDefault(),G({diff:-Gt,direction:"previous",reason:"keyboard",event:t}),ae(t);break;case"PageDown":t.preventDefault(),G({diff:Gt,direction:"next",reason:"keyboard",event:t}),ae(t);break;case"ArrowDown":t.preventDefault(),G({diff:1,direction:"next",reason:"keyboard",event:t}),ae(t);break;case"ArrowUp":t.preventDefault(),G({diff:-1,direction:"previous",reason:"keyboard",event:t}),ae(t);break;case"ArrowLeft":!g&&j?_(0):Oe(t,"previous");break;case"ArrowRight":!g&&j?_(-1):Oe(t,"next");break;case"Enter":if(h.current!==-1&&F){const s=O[h.current],c=q?q(s):!1;if(t.preventDefault(),c)return;pe(t,s,"selectOption"),i&&v.current.setSelectionRange(v.current.value.length,v.current.value.length)}else U&&A!==""&&tt===!1&&(g&&t.preventDefault(),pe(t,A,"createOption","freeSolo"));break;case"Escape":F?(t.preventDefault(),t.stopPropagation(),Ce(t,"escape")):B&&(A!==""||g&&u.length>0||j)&&(t.preventDefault(),t.stopPropagation(),at(t));break;case"Backspace":if(g&&!W&&A===""&&u.length>0){const s=k===-1?u.length-1:k,c=u.slice();c.splice(s,1),re(t,c,"removeOption",{option:u[s]})}!g&&j&&!W&&(We(null),_(-1));break;case"Delete":if(g&&!W&&A===""&&u.length>0&&k!==-1){const s=k,c=u.slice();c.splice(s,1),re(t,c,"removeOption",{option:u[s]})}!g&&j&&!W&&(We(null),_(-1));break}},Ee=o=>{et(!0),Ze&&!M.current&&ae(o)},$e=o=>{if(n(T)){v.current.focus();return}et(!1),z.current=!0,M.current=!1,I&&h.current!==-1&&F?pe(o,O[h.current],"blur"):I&&U&&A!==""?pe(o,A,"blur","freeSolo"):S&&je(o,u,"blur"),Ce(o,"blur")},_e=o=>{const t=o.target.value;A!==t&&(Ae(t),ke(!1),N&&N(o,t,"input")),t===""?!Y&&!g&&re(o,null,"clear"):ae(o)},Tt=o=>{const t=Number(o.currentTarget.getAttribute("data-option-index"));h.current!==t&&ne({event:o,index:t,reason:"mouse"})},Rt=o=>{ne({event:o,index:Number(o.currentTarget.getAttribute("data-option-index")),reason:"touch"}),se.current=!0},Bt=o=>{const t=Number(o.currentTarget.getAttribute("data-option-index"));pe(o,O[t],"selectOption"),se.current=!1},Lt=o=>t=>{const s=u.slice();s.splice(o,1),re(t,s,"removeOption",{option:u[o]})},Ge=o=>{re(o,null,"removeOption",{option:u})},R=o=>{oe?Ce(o,"toggleInput"):ae(o)},L=o=>{o.currentTarget.contains(o.target)&&o.target.getAttribute("id")!==D&&o.preventDefault()},de=o=>{o.currentTarget.contains(o.target)&&(v.current.focus(),ze&&z.current&&v.current.selectionEnd-v.current.selectionStart===0&&v.current.select(),z.current=!1)},Vt=o=>{!$&&(A===""||!oe)&&R(o)};let Ke=U&&A.length>0;Ke=Ke||(g?u.length>0:u!==null);let rt=O;return Z&&(rt=O.reduce((o,t,s)=>{const c=Z(t);return o.length>0&&o[o.length-1].group===c?o[o.length-1].options.push(t):o.push({key:s,index:s,group:c,options:[t]}),o},[])),$&&Ve&&$e(),{getRootProps:(o={})=>({...o,onKeyDown:wt(o),onMouseDown:L,onClick:de}),getInputLabelProps:()=>({id:`${D}-label`,htmlFor:D}),getInputProps:()=>({id:D,value:A,onBlur:$e,onFocus:Ee,onChange:_e,onMouseDown:Vt,"aria-activedescendant":F?"":null,"aria-autocomplete":i?"both":"list","aria-controls":ot?`${D}-listbox`:void 0,"aria-expanded":ot,autoComplete:"off",ref:v,autoCapitalize:"none",spellCheck:"false",role:"combobox",disabled:$}),getClearProps:()=>({tabIndex:-1,type:"button",onClick:at}),getItemProps:({index:o=0}={})=>({...g&&{key:o},...j?{"data-item-index":o}:{"data-tag-index":o},tabIndex:-1,...!W&&{onDelete:g?Lt(o):Ge}}),getPopupIndicatorProps:()=>({tabIndex:-1,type:"button",onClick:R}),getTagProps:({index:o})=>({key:o,"data-tag-index":o,tabIndex:-1,...!W&&{onDelete:Lt(o)}}),getListboxProps:()=>({role:"listbox",id:`${D}-listbox`,"aria-labelledby":`${D}-label`,ref:ue,onMouseDown:o=>{o.preventDefault()}}),getOptionProps:({index:o,option:t})=>{const s=(g?u:[u]).some(p=>p!=null&&ee(t,p)),c=q?q(t):!1;return{key:Xe?.(t)??f(t),tabIndex:-1,role:"option",id:`${D}-option-${o}`,onMouseMove:Tt,onClick:Bt,onTouchStart:Rt,"data-option-index":o,"aria-disabled":c,"aria-selected":s}},id:D,inputValue:A,value:u,dirty:Ke,expanded:F&&te,popupOpen:F,focused:Ve||k!==-1,anchorEl:te,setAnchorEl:Ue,focusedItem:k,focusedTag:k,groupedOptions:rt}}function Do(e){return So("MuiAutocomplete",e)}const m=Ao("MuiAutocomplete",["root","expanded","fullWidth","focused","focusVisible","tag","tagSizeSmall","tagSizeMedium","hasPopupIcon","hasClearIcon","inputRoot","input","inputFocused","endAdornment","clearIndicator","popupIndicator","popupIndicatorOpen","popper","popperDisablePortal","paper","listbox","loading","noOptions","option","groupLabel","groupUl"]);var Jt,Qt;const Mo=e=>{const{classes:n,disablePortal:a,expanded:i,focused:d,fullWidth:I,hasClearIcon:y,hasPopupIcon:S,inputFocused:B,popupOpen:x,size:C}=e,Y={root:["root",i&&"expanded",d&&"focused",I&&"fullWidth",y&&"hasClearIcon",S&&"hasPopupIcon"],inputRoot:["inputRoot"],input:["input",B&&"inputFocused"],tag:["tag",`tagSize${eo(C)}`],endAdornment:["endAdornment"],clearIndicator:["clearIndicator"],popupIndicator:["popupIndicator",x&&"popupIndicatorOpen"],popper:["popper",a&&"popperDisablePortal"],paper:["paper"],listbox:["listbox"],loading:["loading"],noOptions:["noOptions"],option:["option"],groupLabel:["groupLabel"],groupUl:["groupUl"]};return Oo(Y,Do,n)},Fo=Q("div",{name:"MuiAutocomplete",slot:"Root",overridesResolver:(e,n)=>{const{ownerState:a}=e,{fullWidth:i,hasClearIcon:d,hasPopupIcon:I,inputFocused:y,size:S}=a;return[{[`& .${m.tag}`]:n.tag},{[`& .${m.tag}`]:n[`tagSize${eo(S)}`]},{[`& .${m.inputRoot}`]:n.inputRoot},{[`& .${m.input}`]:n.input},{[`& .${m.input}`]:y&&n.inputFocused},n.root,i&&n.fullWidth,I&&n.hasPopupIcon,d&&n.hasClearIcon]}})({[`&.${m.focused} .${m.clearIndicator}`]:{visibility:"visible"},"@media (pointer: fine)":{[`&:hover .${m.clearIndicator}`]:{visibility:"visible"}},[`& .${m.tag}`]:{margin:3,maxWidth:"calc(100% - 6px)"},[`& .${m.inputRoot}`]:{[`.${m.hasPopupIcon}&, .${m.hasClearIcon}&`]:{paddingRight:30},[`.${m.hasPopupIcon}.${m.hasClearIcon}&`]:{paddingRight:56},[`& .${m.input}`]:{width:0,minWidth:30}},[`& .${kt.root}`]:{paddingBottom:1,"& .MuiInput-input":{padding:"4px 4px 4px 0px"}},[`& .${kt.root}.${Ie.sizeSmall}`]:{[`& .${kt.input}`]:{padding:"2px 4px 3px 0"}},[`& .${Wt.root}`]:{padding:9,[`.${m.hasPopupIcon}&, .${m.hasClearIcon}&`]:{paddingRight:39},[`.${m.hasPopupIcon}.${m.hasClearIcon}&`]:{paddingRight:65},[`& .${m.input}`]:{padding:"7.5px 4px 7.5px 5px"},[`& .${m.endAdornment}`]:{right:9}},[`& .${Wt.root}.${Ie.sizeSmall}`]:{paddingTop:6,paddingBottom:6,paddingLeft:6,[`& .${m.input}`]:{padding:"2.5px 4px 2.5px 8px"}},[`& .${De.root}`]:{paddingTop:19,paddingLeft:8,[`.${m.hasPopupIcon}&, .${m.hasClearIcon}&`]:{paddingRight:39},[`.${m.hasPopupIcon}.${m.hasClearIcon}&`]:{paddingRight:65},[`& .${De.input}`]:{padding:"7px 4px"},[`& .${m.endAdornment}`]:{right:9}},[`& .${De.root}.${Ie.sizeSmall}`]:{paddingBottom:1,[`& .${De.input}`]:{padding:"2.5px 4px"}},[`& .${Ie.hiddenLabel}`]:{paddingTop:8},[`& .${De.root}.${Ie.hiddenLabel}`]:{paddingTop:0,paddingBottom:0,[`& .${m.input}`]:{paddingTop:16,paddingBottom:17}},[`& .${De.root}.${Ie.hiddenLabel}.${Ie.sizeSmall}`]:{[`& .${m.input}`]:{paddingTop:8,paddingBottom:9}},[`& .${m.input}`]:{flexGrow:1,textOverflow:"ellipsis",opacity:0},variants:[{props:{fullWidth:!0},style:{width:"100%"}},{props:{size:"small"},style:{[`& .${m.tag}`]:{margin:2,maxWidth:"calc(100% - 4px)"}}},{props:{inputFocused:!0},style:{[`& .${m.input}`]:{opacity:1}}},{props:{multiple:!0},style:{[`& .${m.inputRoot}`]:{flexWrap:"wrap"}}}]}),No=Q("div",{name:"MuiAutocomplete",slot:"EndAdornment"})({position:"absolute",right:0,top:"50%",transform:"translate(0, -50%)"}),qo=Q(no,{name:"MuiAutocomplete",slot:"ClearIndicator"})({marginRight:-2,padding:4,visibility:"hidden"}),zo=Q(no,{name:"MuiAutocomplete",slot:"PopupIndicator",overridesResolver:(e,n)=>{const{ownerState:a}=e;return[n.popupIndicator,a.popupOpen&&n.popupIndicatorOpen]}})({padding:2,marginRight:-2,variants:[{props:{popupOpen:!0},style:{transform:"rotate(180deg)"}}]}),Uo=Q(oo,{name:"MuiAutocomplete",slot:"Popper",overridesResolver:(e,n)=>{const{ownerState:a}=e;return[{[`& .${m.option}`]:n.option},n.popper,a.disablePortal&&n.popperDisablePortal]}})(Me(({theme:e})=>({zIndex:(e.vars||e).zIndex.modal,variants:[{props:{disablePortal:!0},style:{position:"absolute"}}]}))),Wo=Q(to,{name:"MuiAutocomplete",slot:"Paper"})(Me(({theme:e})=>({...e.typography.body1,overflow:"auto"}))),Ho=Q("div",{name:"MuiAutocomplete",slot:"Loading"})(Me(({theme:e})=>({color:(e.vars||e).palette.text.secondary,padding:"14px 16px"}))),_o=Q("div",{name:"MuiAutocomplete",slot:"NoOptions"})(Me(({theme:e})=>({color:(e.vars||e).palette.text.secondary,padding:"14px 16px"}))),Go=Q("ul",{name:"MuiAutocomplete",slot:"Listbox"})(Me(({theme:e})=>({listStyle:"none",margin:0,padding:"8px 0",maxHeight:"40vh",overflow:"auto",position:"relative",[`& .${m.option}`]:{minHeight:48,display:"flex",overflow:"hidden",justifyContent:"flex-start",alignItems:"center",cursor:"pointer",paddingTop:6,boxSizing:"border-box",outline:"0",WebkitTapHighlightColor:"transparent",paddingBottom:6,paddingLeft:16,paddingRight:16,[e.breakpoints.up("sm")]:{minHeight:"auto"},[`&.${m.focused}`]:{backgroundColor:(e.vars||e).palette.action.hover,"@media (hover: none)":{backgroundColor:"transparent"}},'&[aria-disabled="true"]':{opacity:(e.vars||e).palette.action.disabledOpacity,pointerEvents:"none"},[`&.${m.focusVisible}`]:{backgroundColor:(e.vars||e).palette.action.focus},'&[aria-selected="true"]':{backgroundColor:e.alpha((e.vars||e).palette.primary.main,(e.vars||e).palette.action.selectedOpacity),[`&.${m.focused}`]:{backgroundColor:e.alpha((e.vars||e).palette.primary.main,`${(e.vars||e).palette.action.selectedOpacity} + ${(e.vars||e).palette.action.hoverOpacity}`),"@media (hover: none)":{backgroundColor:(e.vars||e).palette.action.selected}},[`&.${m.focusVisible}`]:{backgroundColor:e.alpha((e.vars||e).palette.primary.main,`${(e.vars||e).palette.action.selectedOpacity} + ${(e.vars||e).palette.action.focusOpacity}`)}}}}))),Ko=Q(bo,{name:"MuiAutocomplete",slot:"GroupLabel"})(Me(({theme:e})=>({backgroundColor:(e.vars||e).palette.background.paper,top:-8}))),Jo=Q("ul",{name:"MuiAutocomplete",slot:"GroupUl"})({padding:0,[`& .${m.option}`]:{paddingLeft:24}}),Qo=l.forwardRef(function(n,a){const i=Co({props:n,name:"MuiAutocomplete"}),{autoComplete:d=!1,autoHighlight:I=!1,autoSelect:y=!1,blurOnSelect:S=!1,ChipProps:B,className:x,clearIcon:C=Jt||(Jt=r.jsx(Po,{fontSize:"small"})),clearOnBlur:Y=!i.freeSolo,clearOnEscape:Pe=!1,clearText:$="Clear",closeText:fe="Close",componentsProps:he,defaultValue:Qe=i.multiple?[]:null,disableClearable:we=!1,disableCloseOnSelect:U=!1,disabled:q=!1,disabledItemsFocusable:Xe=!1,disableListWrap:Te=!1,disablePortal:Z=!1,filterOptions:Fe,filterSelectedOptions:Ye=!1,forcePopupIcon:be="auto",freeSolo:Re=!1,fullWidth:ee=!1,getLimitTagsText:g=b=>`+${b}`,getOptionDisabled:Be,getOptionKey:Le,getOptionLabel:xe,isOptionEqualToValue:N,groupBy:ie,handleHomeEndKeys:Ne=!i.freeSolo,id:Ze,includeInputInList:qe=!1,inputValue:W,limitTags:j=-1,ListboxComponent:ze,ListboxProps:ve,loading:D=!1,loadingText:f="Loading…",multiple:M=!1,noOptionsText:z="No options",onChange:v,onClose:T,onHighlightChange:te,onInputChange:Ue,onOpen:k,open:X,openOnFocus:ye=!1,openText:h="Open",options:ce,PaperComponent:u,PopperComponent:We,popupIcon:A=Qt||(Qt=r.jsx(Io,{})),readOnly:Ae=!1,renderGroup:Ve,renderInput:et,renderOption:je,renderTags:oe,renderValue:Se,selectOnFocus:Nt=!i.freeSolo,size:ke="medium",slots:tt={},slotProps:F={},value:O,...H}=i,{getRootProps:ot,getInputProps:_,getInputLabelProps:Ot,getPopupIndicatorProps:ne,getClearProps:G,getItemProps:nt,getListboxProps:It,getOptionProps:He,value:ue,dirty:ae,expanded:Ce,id:re,popupOpen:se,focused:pe,focusedItem:Pt,anchorEl:Oe,setAnchorEl:at,inputValue:wt,groupedOptions:Ee}=$o({...i,componentName:"Autocomplete"}),$e=!we&&!q&&ae&&!Ae,_e=(!Re||be===!0)&&be!==!1,{onMouseDown:Tt}=_(),{ref:Rt,...Bt}=It(),Ge=xe||(b=>b.label??b),R={...i,disablePortal:Z,expanded:Ce,focused:pe,fullWidth:ee,getOptionLabel:Ge,hasClearIcon:$e,hasPopupIcon:_e,inputFocused:Pt===-1,popupOpen:se,size:ke},L=Mo(R),de={slots:{paper:u,popper:We,...tt},slotProps:{chip:B,listbox:ve,...he,...F}},[Vt,Ke]=Et("listbox",{elementType:Go,externalForwardedProps:de,ownerState:R,className:L.listbox,additionalProps:Bt,ref:Rt}),[rt,o]=Et("paper",{elementType:to,externalForwardedProps:de,ownerState:R,className:L.paper}),[t,s]=Et("popper",{elementType:oo,externalForwardedProps:de,ownerState:R,className:L.popper,additionalProps:{disablePortal:Z,style:{width:Oe?Oe.clientWidth:null},role:"presentation",anchorEl:Oe,open:se}});let c;const p=b=>({className:L.tag,disabled:q,...nt(b)});if(M?ue.length>0&&(oe?c=oe(ue,p,R):Se?c=Se(ue,p,R):c=ue.map((b,me)=>{const{key:ge,...Je}=p({index:me});return r.jsx(Dt,{label:Ge(b),size:ke,...Je,...de.slotProps.chip},ge)})):Se&&ue!=null&&(c=Se(ue,p,R)),j>-1&&Array.isArray(c)){const b=c.length-j;!pe&&b>0&&(c=c.splice(0,j),c.push(r.jsx("span",{className:L.tag,children:g(b)},c.length)))}const P=Ve||(b=>r.jsxs("li",{children:[r.jsx(Ko,{className:L.groupLabel,ownerState:R,component:"div",children:b.group}),r.jsx(Jo,{className:L.groupUl,ownerState:R,children:b.children})]},b.key)),st=je||((b,me)=>{const{key:ge,...Je}=b;return r.jsx("li",{...Je,children:Ge(me)},ge)}),qt=(b,me)=>{const ge=He({option:b,index:me});return st({...ge,className:L.option},b,{selected:ge["aria-selected"],index:me,inputValue:wt},R)},zt=de.slotProps.clearIndicator,Ut=de.slotProps.popupIndicator;return r.jsxs(l.Fragment,{children:[r.jsx(Fo,{ref:a,className:jt(L.root,x),ownerState:R,...ot(H),children:et({id:re,disabled:q,fullWidth:!0,size:ke==="small"?"small":void 0,InputLabelProps:Ot(),InputProps:{ref:at,className:L.inputRoot,startAdornment:c,onMouseDown:b=>{b.target===b.currentTarget&&Tt(b)},...($e||_e)&&{endAdornment:r.jsxs(No,{className:L.endAdornment,ownerState:R,children:[$e?r.jsx(qo,{...G(),"aria-label":$,title:$,ownerState:R,...zt,className:jt(L.clearIndicator,zt?.className),children:C}):null,_e?r.jsx(zo,{...ne(),disabled:q,"aria-label":se?fe:h,title:se?fe:h,ownerState:R,...Ut,className:jt(L.popupIndicator,Ut?.className),children:A}):null]})}},inputProps:{className:L.input,disabled:q,readOnly:Ae,..._()}})}),Oe?r.jsx(Uo,{as:t,...s,children:r.jsxs(Wo,{as:rt,...o,children:[D&&Ee.length===0?r.jsx(Ho,{className:L.loading,ownerState:R,children:f}):null,Ee.length===0&&!Re&&!D?r.jsx(_o,{className:L.noOptions,ownerState:R,role:"presentation",onMouseDown:b=>{b.preventDefault()},children:z}):null,Ee.length>0?r.jsx(Vt,{as:ze,...Ke,children:Ee.map((b,me)=>ie?P({key:b.key,group:b.group,children:b.options.map((ge,Je)=>qt(ge,b.index+Je))}):qt(b,me))}):null]})}):null]})}),Xo=(e,n)=>mo({borderRadius:e,labelPosition:n,extraOutsideSx:{"& .MuiAutocomplete-input":{paddingTop:"4px",paddingBottom:"4px"},"& .MuiAutocomplete-inputRoot":{paddingTop:"4px",paddingBottom:"4px"}}}),Xt=(e,n)=>e.find(a=>a.value===n)??null,Yt=(e,n)=>Array.isArray(n)?e.filter(a=>n.includes(a.value)):[],Yo=(e,n,a)=>a?!Array.isArray(e)||!Array.isArray(n)||e.length!==n.length?!1:e.every((i,d)=>i.value===n[d]?.value):e?.value===n?.value,Zo=(e,n)=>n?!Array.isArray(e)||e.length===0:!e,ao=({liProps:e,option:n,customRender:a})=>{const{key:i,...d}=e;return r.jsx("li",{...d,children:a?a(n):n.label},n.value)};ao.__docgenInfo={description:"Render por defecto de un <li> del dropdown del Autocomplete.\nSe expone como componente para testear y extender fácilmente, pero MUI\nlo llama desde `renderOption={(props, option) => ...}` en el padre.\n\nEl `key` lo manejamos nosotros (no spreadeamos junto al resto) porque MUI\nlo inyecta como parte de `propsLi` y React exige que sea prop directo.",methods:[],displayName:"AutocompleteOption",props:{liProps:{required:!0,tsType:{name:"intersection",raw:"React.HTMLAttributes<HTMLLIElement> & { key?: React.Key }",elements:[{name:"ReactHTMLAttributes",raw:"React.HTMLAttributes<HTMLLIElement>",elements:[{name:"HTMLLIElement"}]},{name:"signature",type:"object",raw:"{ key?: React.Key }",signature:{properties:[{key:"key",value:{name:"ReactKey",raw:"React.Key",required:!1}}]}}]},description:""},option:{required:!0,tsType:{name:"SelectOption"},description:""},customRender:{required:!1,tsType:{name:"signature",type:"function",raw:"(item: SelectOption) => ReactNode",signature:{arguments:[{type:{name:"SelectOption"},name:"item"}],return:{name:"ReactNode"}}},description:""}}};const ro=({value:e,getTagProps:n,size:a,maxChipsToShow:i,renderChipLabel:d})=>{const I=e.slice(0,i),y=e.length-i;return r.jsxs(r.Fragment,{children:[I.map((S,B)=>{const x=n({index:B});return l.createElement(Dt,{...x,key:S.value,size:a,label:d?d(S):S.label,avatar:S.img?r.jsx(Zt,{src:S.img}):void 0,deleteIcon:r.jsx(xo,{})})}),y>0&&r.jsx(Dt,{size:a,label:`+${y} más`})]})};ro.__docgenInfo={description:'Render de los chips del Autocomplete en modo multiple.\nTrunca después de `maxChipsToShow` con un chip "+N más".\nEl `getTagProps({ index })` viene de MUI y contiene el handler de delete,\nla key, etc. — se spreadea tal cual al Chip.',methods:[],displayName:"AutocompleteChips",props:{value:{required:!0,tsType:{name:"Array",elements:[{name:"SelectOption"}],raw:"SelectOption[]"},description:""},getTagProps:{required:!0,tsType:{name:"signature",type:"function",raw:"(args: { index: number }) => Record<string, any>",signature:{arguments:[{type:{name:"signature",type:"object",raw:"{ index: number }",signature:{properties:[{key:"index",value:{name:"number",required:!0}}]}},name:"args"}],return:{name:"Record",elements:[{name:"string"},{name:"any"}],raw:"Record<string, any>"}}},description:""},size:{required:!0,tsType:{name:"union",raw:"'small' | 'medium'",elements:[{name:"literal",value:"'small'"},{name:"literal",value:"'medium'"}]},description:""},maxChipsToShow:{required:!0,tsType:{name:"number"},description:""},renderChipLabel:{required:!1,tsType:{name:"signature",type:"function",raw:"(item: SelectOption) => ReactNode",signature:{arguments:[{type:{name:"SelectOption"},name:"item"}],return:{name:"ReactNode"}}},description:""}}};const so=({text:e="Cargando..."})=>r.jsxs(E,{sx:{display:"flex",alignItems:"center",gap:1},children:[r.jsx(vo,{size:16}),r.jsx(J,{variant:"body2",children:e})]});so.__docgenInfo={description:"Loader por defecto para el `loadingText` del Autocomplete.\nEl consumer puede sobrescribirlo pasando `loadingText` al componente padre.",methods:[],displayName:"AutocompleteLoader",props:{text:{required:!1,tsType:{name:"string"},description:"",defaultValue:{value:"'Cargando...'",computed:!1}}}};function w(e){const{label:n,options:a,placeholder:i,multiple:d=!1,disabled:I=!1,readOnly:y=!1,loading:S=!1,error:B=!1,helperText:x,maxChipsToShow:C=3,renderOptionItem:Y,renderChipLabel:Pe,borderRadius:$=10,labelPosition:fe="outside",size:he="small",noOptionsText:Qe="No hay opciones",loadingText:we,sx:U,className:q,preset:Xe,textFieldProps:Te,onInputChange:Z,inputValue:Fe,filterOptions:Ye,freeSolo:be,open:Re,onOpen:ee,onClose:g}=e,[Be,Le]=l.useState(!1),xe=l.useRef(new Map);for(const f of a)xe.current.set(f.value,f);const N=l.useMemo(()=>{const f=new Map(xe.current);for(const M of a)f.set(M.value,M);return Array.from(f.values())},[a]),ie=l.useRef(d?[]:null),Ne=f=>Yo(ie.current,f,d)?ie.current:(ie.current=f,f),Ze=yo(),qe=ho("Autocomplete",Xe,Ze),W=[Xo($,fe),...qe?[qe]:[],...Array.isArray(U)?U:U?[U]:[]],j=(f,M,z,v,T,te)=>{const Ue=!!T||!!B,k=te||x,X=Zo(f,d),ye=X&&Be&&!!i;return r.jsx(Qo,{multiple:d,options:a,value:f,disabled:I,readOnly:y,loading:S,className:q,sx:W,freeSolo:be,open:Re,onOpen:ee,onClose:g,inputValue:Fe,onInputChange:Z,filterOptions:Ye,getOptionLabel:h=>typeof h=="string"?h:h?.label??"",isOptionEqualToValue:(h,ce)=>h?.value===ce?.value,getOptionDisabled:h=>!!h?.disabled,onChange:M,onFocus:()=>Le(!0),onBlur:()=>{Le(!1),z?.()},renderOption:(h,ce)=>r.jsx(ao,{liProps:h,option:ce,customRender:Y}),renderTags:d?(h,ce)=>r.jsx(ro,{value:h,getTagProps:ce,size:he,maxChipsToShow:C,renderChipLabel:Pe}):void 0,noOptionsText:Qe,loadingText:we??r.jsx(so,{}),renderInput:h=>r.jsx(Bo,{...h,label:n,size:he,variant:"outlined",placeholder:ye?i:void 0,error:Ue,helperText:k,inputRef:v,...Te,InputLabelProps:{...h.InputLabelProps,...Te?.InputLabelProps,shrink:fe==="outside"?!X||Be:h.InputLabelProps?.shrink}})})},ze=(f,M)=>{const z=e.onChange;if(d){const v=(M??[]).map(T=>T.value);z(v)}else z(M?.value??null)};if("control"in e&&e.control){const{name:f,control:M,validation:z}=e;return r.jsx(go,{name:f,control:M,rules:z,render:({field:v,fieldState:{error:T}})=>{const te=Ne(d?Yt(N,v.value):Xt(N,v.value));return j(te,(k,X)=>{d?v.onChange((X??[]).map(ye=>ye.value)):v.onChange(X?.value??null)},v.onBlur,v.ref,!!T,T?.message)}})}const ve=e.value,D=Ne(d?Yt(N,ve):Xt(N,ve));return j(D,ze)}w.__docgenInfo={description:"",methods:[],displayName:"Autocomplete"};const en=`
2
+ import React, { useState } from 'react';
3
+ import Autocomplete from './Autocomplete';
4
+ import { Box, Typography } from '@mui/material';
5
+
6
+ const options = [
7
+ { value: '10', label: '10' },
8
+ { value: '25', label: '25' },
9
+ ];
10
+
11
+ export const SimpleExample = () => {
12
+ const [value, setValue] = useState(options[1]);
13
+
14
+ return (
15
+ <Box sx={{ width: 250 }}>
16
+ <Autocomplete
17
+ label="Registros por página"
18
+ options={options}
19
+ value={value}
20
+ onChange={(val) => {
21
+ setValue(val as string);
22
+ }}
23
+ />
24
+ <Typography sx={{ mt: 2 }}>
25
+ Valor: {value}
26
+ </Typography>
27
+ </Box>
28
+ );
29
+ };
30
+ `,tn=`
31
+ import React, { useState } from 'react';
32
+ import Autocomplete from './Autocomplete';
33
+ import { Box, Typography } from '@mui/material';
34
+
35
+ export const WithPlaceholderExample = () => {
36
+ const [value, setValue] = useState(null);
37
+
38
+ return (
39
+ <Box sx={{ width: 300 }}>
40
+ <Autocomplete
41
+ label="Seleccione una opción"
42
+ options={[]}
43
+ value={value}
44
+ onChange={(val) => {
45
+ setValue(val as string);
46
+ }}
47
+ placeholder="Ninguna opción seleccionada"
48
+ />
49
+ <Typography sx={{ mt: 2 }}>
50
+ {value || 'Ninguno'}
51
+ </Typography>
52
+ </Box>
53
+ );
54
+ };
55
+ `,on=`
56
+ import React, { useState } from 'react';
57
+ import Autocomplete from './Autocomplete';
58
+ import { Box } from '@mui/material';
59
+
60
+ const options = [
61
+ { value: 'pending', label: 'Pendiente' },
62
+ { value: 'approved', label: 'Aprobado' },
63
+ ];
64
+
65
+ export const MultipleExample = () => {
66
+ const [value, setValue] = useState([]);
67
+
68
+ return (
69
+ <Box sx={{ width: 400 }}>
70
+ <Autocomplete
71
+ multiple
72
+ options={options}
73
+ value={value}
74
+ onChange={(val) => {
75
+ setValue(val as string[]);
76
+ }}
77
+ />
78
+ </Box>
79
+ );
80
+ };
81
+ `,nn=`
82
+ import React, { useState } from 'react';
83
+ import Autocomplete from './Autocomplete';
84
+
85
+ export const MultipleWithLimitExample = () => {
86
+ const [value, setValue] = useState([]);
87
+
88
+ return (
89
+ <Autocomplete
90
+ multiple
91
+ maxChipsToShow={2}
92
+ options={[]}
93
+ value={value}
94
+ onChange={(val) => {
95
+ setValue(val as string[]);
96
+ }}
97
+ />
98
+ );
99
+ };
100
+ `,an=`
101
+ import React, { useState } from 'react';
102
+ import Autocomplete from './Autocomplete';
103
+ import { Avatar, Box } from '@mui/material';
104
+
105
+ const users = [
106
+ { value: 'admin', label: 'Administrador', img: '...' },
107
+ ];
108
+
109
+ export const CustomRenderExample = () => {
110
+ const [value, setValue] = useState([]);
111
+
112
+ return (
113
+ <Autocomplete
114
+ multiple
115
+ options={users}
116
+ value={value}
117
+ onChange={(val) => {
118
+ setValue(val as string[]);
119
+ }}
120
+ renderOptionItem={(item) => (
121
+ <Box sx={{ display: 'flex', gap: 1 }}>
122
+ <Avatar src={item.img} />
123
+ {item.label}
124
+ </Box>
125
+ )}
126
+ />
127
+ );
128
+ };
129
+ `,rn=`
130
+ import React, { useState } from 'react';
131
+ import Autocomplete from './Autocomplete';
132
+ import { Typography } from '@mui/material';
133
+
134
+ export const CustomChipExample = () => {
135
+ const [value, setValue] = useState([]);
136
+
137
+ return (
138
+ <Autocomplete
139
+ multiple
140
+ options={[]}
141
+ value={value}
142
+ onChange={(val) => {
143
+ setValue(val as string[]);
144
+ }}
145
+ renderChipLabel={(item) => (
146
+ <Typography variant="caption">
147
+ {item.label.charAt(0)}
148
+ </Typography>
149
+ )}
150
+ />
151
+ );
152
+ };
153
+ `,sn=`
154
+ import React, { useState } from 'react';
155
+ import Autocomplete from './Autocomplete';
156
+
157
+ export const LoadingExample = () => {
158
+ const [value, setValue] = useState(null);
159
+
160
+ return (
161
+ <Autocomplete
162
+ loading
163
+ options={[]}
164
+ value={value}
165
+ onChange={(val) => {
166
+ setValue(val as string);
167
+ }}
168
+ />
169
+ );
170
+ };
171
+ `,lo=`
172
+ import React, { useState } from 'react';
173
+ import Autocomplete from './Autocomplete';
174
+
175
+ export const EmptyExample = () => {
176
+ const [value, setValue] = useState(null);
177
+
178
+ return (
179
+ <Autocomplete
180
+ options={[]}
181
+ value={value}
182
+ onChange={(val) => {
183
+ setValue(val as string);
184
+ }}
185
+ placeholder="No hay opciones"
186
+ />
187
+ );
188
+ };
189
+ `,ln=`
190
+ import React, { useState } from 'react';
191
+ import Autocomplete from './Autocomplete';
192
+ import { Box } from '@mui/material';
193
+
194
+ const options = [
195
+ { value: '10', label: '10' },
196
+ { value: '25', label: '25' },
197
+ ];
198
+
199
+ export const WithErrorExample = () => {
200
+ const [value, setValue] = useState<string | null>(null);
201
+ return (
202
+ <Box sx={{ width: 300 }}>
203
+ <Autocomplete
204
+ label="Cantidad"
205
+ options={options}
206
+ value={value}
207
+ onChange={(val) => setValue(val as string | null)}
208
+ error={!value}
209
+ helperText={!value ? 'Debes seleccionar una cantidad' : ' '}
210
+ />
211
+ </Box>
212
+ );
213
+ };
214
+ `,cn=`
215
+ import React, { useState } from 'react';
216
+ import Autocomplete from './Autocomplete';
217
+ import { Box, Stack } from '@mui/material';
218
+
219
+ const options = [
220
+ { value: 'a', label: 'Opción A' },
221
+ { value: 'b', label: 'Opción B' },
222
+ ];
223
+
224
+ export const LabelPositionExample = () => {
225
+ const [a, setA] = useState<string | null>(null);
226
+ const [b, setB] = useState<string | null>(null);
227
+ return (
228
+ <Stack spacing={3} sx={{ width: 320 }}>
229
+ <Autocomplete
230
+ label="Outside (default)"
231
+ labelPosition="outside"
232
+ options={options}
233
+ value={a}
234
+ onChange={(val) => setA(val as string | null)}
235
+ />
236
+ <Autocomplete
237
+ label="Floating"
238
+ labelPosition="floating"
239
+ options={options}
240
+ value={b}
241
+ onChange={(val) => setB(val as string | null)}
242
+ />
243
+ </Stack>
244
+ );
245
+ };
246
+ `,un=`
247
+ import React, { useState } from 'react';
248
+ import Autocomplete from './Autocomplete';
249
+ import { Box, Stack } from '@mui/material';
250
+
251
+ const options = [
252
+ { value: '10', label: '10' },
253
+ { value: '25', label: '25' },
254
+ ];
255
+
256
+ export const CustomBorderRadiusExample = () => {
257
+ const [a, setA] = useState<string | null>(null);
258
+ const [b, setB] = useState<string | null>(null);
259
+ const [c, setC] = useState<string | null>(null);
260
+ return (
261
+ <Stack spacing={2} sx={{ width: 300 }}>
262
+ <Autocomplete label="0" borderRadius={0} options={options} value={a} onChange={(v) => setA(v as string | null)} />
263
+ <Autocomplete label="10 (default)" borderRadius={10} options={options} value={b} onChange={(v) => setB(v as string | null)} />
264
+ <Autocomplete label="24 (pill)" borderRadius={24} options={options} value={c} onChange={(v) => setC(v as string | null)} />
265
+ </Stack>
266
+ );
267
+ };
268
+ `,pn=`
269
+ import React, { useState } from 'react';
270
+ import Autocomplete from './Autocomplete';
271
+ import { Box } from '@mui/material';
272
+
273
+ const options = [
274
+ { value: 'mx', label: 'México' },
275
+ { value: 'co', label: 'Colombia' },
276
+ { value: 'ar', label: 'Argentina' },
277
+ ];
278
+
279
+ export const EmptyWithPlaceholderExample = () => {
280
+ const [value, setValue] = useState<string | null>(null);
281
+ return (
282
+ <Box sx={{ width: 300 }}>
283
+ <Autocomplete
284
+ label="País"
285
+ placeholder="Buscar país..."
286
+ options={options}
287
+ value={value}
288
+ onChange={(val) => setValue(val as string | null)}
289
+ />
290
+ </Box>
291
+ );
292
+ };
293
+ `,dn=`
294
+ import React from 'react';
295
+ import { useForm } from 'react-hook-form';
296
+ import Autocomplete from './Autocomplete';
297
+ import { Box, Button, Stack } from '@mui/material';
298
+
299
+ const options = [
300
+ { value: 'mx', label: 'México' },
301
+ { value: 'co', label: 'Colombia' },
302
+ { value: 'ar', label: 'Argentina' },
303
+ ];
304
+
305
+ type FormValues = { country: string | null };
306
+
307
+ export const RHFExample = () => {
308
+ const { control, handleSubmit, watch } = useForm<FormValues>({
309
+ defaultValues: { country: null },
310
+ });
311
+
312
+ return (
313
+ <Box component="form" onSubmit={handleSubmit((data) => console.log(data))}>
314
+ <Stack spacing={2} sx={{ width: 320 }}>
315
+ <Autocomplete
316
+ name="country"
317
+ control={control}
318
+ validation={{ required: 'Campo requerido' }}
319
+ label="País"
320
+ placeholder="Seleccione..."
321
+ options={options}
322
+ />
323
+ <Button type="submit" variant="contained">Guardar</Button>
324
+ <Box>Valor actual: {JSON.stringify(watch('country'))}</Box>
325
+ </Stack>
326
+ </Box>
327
+ );
328
+ };
329
+ `,io=["import React, { useState, useEffect, useMemo } from ","'react'",";","import Autocomplete from ","'./Autocomplete'",";","import { Box } from ","'@mui/material'",";","import debounce from ","'lodash/debounce'",";","","// Supón que tienes un servicio:","// await fetch(`/api/users?q=${query}`).then(r => r.json())","async function fetchUsers(query: string) {"," const res = await fetch(`/api/users?q=${encodeURIComponent(query)}`);"," const data = await res.json();"," return data.map((u: any) => ({ value: u.id, label: u.name }));","}","","export const AsyncServiceExample = () => {"," const [value, setValue] = useState<string | null>(null);",' const [input, setInput] = useState("");'," const [options, setOptions] = useState<any[]>([]);"," const [loading, setLoading] = useState(false);",""," const search = useMemo("," () =>"," debounce(async (q: string) => {"," if (!q) { setOptions([]); return; }"," setLoading(true);"," try {"," setOptions(await fetchUsers(q));"," } finally {"," setLoading(false);"," }"," }, 300),"," [],"," );",""," useEffect(() => { search(input); }, [input, search]);",""," return ("," <Box sx={{ width: 320 }}>"," <Autocomplete",' label="Usuario"',' placeholder="Buscar usuario..."'," options={options}"," value={value}"," onChange={(v) => setValue(v as string | null)}"," inputValue={input}"," onInputChange={(_, v) => setInput(v)}"," loading={loading}"," // Desactiva el filtro cliente: el servicio ya filtra."," filterOptions={(x) => x}"," />"," </Box>"," );","};"].join(`
330
+ `),le=[{value:"10",label:"10"},{value:"25",label:"25"},{value:"50",label:"50"},{value:"100",label:"100"}],co=[{value:"admin",label:"Administrador",img:"https://placehold.co/40x40?text=A"},{value:"user",label:"Usuario",img:"https://placehold.co/40x40?text=U"},{value:"moderator",label:"Moderador",img:"https://placehold.co/40x40?text=M"}],Mt=Array.from({length:50},(e,n)=>({value:`option-${n}`,label:`Opción ${n+1}`})),ia={title:"Components/Autocomplete",component:w,tags:["autodocs"],parameters:{layout:"padded",docs:{description:{component:"Autocomplete personalizado basado en MUI con soporte para selección múltiple, chips, render custom y async."}}},argTypes:{label:{control:"text",description:"Etiqueta para el campo de selección."},options:{control:"object",description:"Array de objetos `SelectOption` para las opciones del menú."},value:{control:"object",description:"Valor(es) seleccionado(s) del select."},onChange:{action:"changed",description:"Función de callback que se llama cuando el valor del select cambia."},multiple:{control:"boolean",description:"Si es verdadero, permite la selección de múltiples opciones."},placeholder:{control:"text",description:"Texto que se muestra cuando no hay nada seleccionado."},maxChipsToShow:{control:"number",description:"Número máximo de chips a mostrar en selección múltiple antes de agrupar.",if:{arg:"multiple",eq:!0}},renderChipLabel:{control:!1,description:"Función para personalizar el contenido del label de cada chip seleccionado (para múltiple) o del valor mostrado (para individual)."}}},it={render:()=>{const[e,n]=l.useState("25");return r.jsxs(E,{sx:{width:250},children:[r.jsx(w,{label:"Registros por página",options:le,value:e,onChange:a=>{n(a)}}),r.jsxs(J,{sx:{mt:2},children:["Valor: ",e]})]})},parameters:{docs:{description:{story:"Autocomplete simple con opciones básicas y valor por defecto."},source:{code:en.trim()}}}},ct={render:()=>{const[e,n]=l.useState("");return r.jsxs(E,{sx:{width:300},children:[r.jsx(w,{label:"Seleccione una opción",options:le,value:e,onChange:a=>{n(a)},placeholder:"Ninguna opción seleccionada"}),r.jsx(J,{sx:{mt:2},children:e||"Ninguno"})]})},parameters:{docs:{description:{story:"Autocomplete sin valor inicial que muestra un placeholder cuando no hay selección."},source:{code:tn.trim()}}}},ut={render:()=>{const[e,n]=l.useState([]);return r.jsxs(E,{sx:{width:400},children:[r.jsx(w,{label:"Seleccionar valores",multiple:!0,options:le,value:e,onChange:a=>{n(a)}}),r.jsxs(J,{sx:{mt:2},children:["Valor seleccionado: ",JSON.stringify(e)]})]})},parameters:{docs:{description:{story:"Autocomplete en modo múltiple que permite seleccionar varias opciones y las muestra como chips."},source:{code:on.trim()}}}},pt={render:()=>{const[e,n]=l.useState(Mt.slice(0,5).map(a=>a.value));return r.jsx(E,{sx:{width:400},children:r.jsx(w,{label:"Muchas selecciones",multiple:!0,maxChipsToShow:2,options:Mt,value:e,onChange:a=>{n(a)}})})},parameters:{docs:{description:{story:"Autocomplete múltiple con límite de chips visibles, agrupando el resto en un contador."},source:{code:nn.trim()}}}},dt={render:()=>{const[e,n]=l.useState([]);return r.jsx(E,{sx:{width:300},children:r.jsx(w,{label:"Usuarios",multiple:!0,options:co,value:e,onChange:a=>{n(a)},renderOptionItem:a=>r.jsxs(E,{sx:{display:"flex",gap:1,alignItems:"center"},children:[r.jsx(Zt,{src:a.img,sx:{width:24,height:24}}),a.label]})})})},parameters:{docs:{description:{story:"Autocomplete con renderizado personalizado de opciones, incluyendo avatar e información adicional."},source:{code:an.trim()}}}},mt={render:()=>{const[e,n]=l.useState([]);return r.jsx(E,{sx:{width:400},children:r.jsx(w,{label:"Usuarios seleccionados",multiple:!0,options:co,value:e,onChange:a=>{n(a)},maxChipsToShow:2,renderChipLabel:a=>r.jsx(J,{variant:"caption",fontWeight:"bold",children:a.label.charAt(0)})})})},parameters:{docs:{description:{story:"Autocomplete múltiple con renderizado personalizado de chips, mostrando solo la inicial del label."},source:{code:rn.trim()}}}},gt={render:()=>{const[e,n]=l.useState("");return r.jsx(E,{sx:{width:300},children:r.jsx(w,{label:"Cargando...",options:[],loading:!0,value:e,onChange:a=>{n(a)}})})},parameters:{docs:{description:{story:"Autocomplete en estado de carga, útil para integraciones con APIs o búsquedas asíncronas."},source:{code:sn.trim()}}}},ft={render:()=>{const[e,n]=l.useState("");return r.jsx(E,{sx:{width:300},children:r.jsx(w,{label:"Sin opciones",options:[],value:e,onChange:a=>{n(a)},placeholder:"No hay opciones"})})},parameters:{docs:{description:{story:"Autocomplete sin opciones disponibles, mostrando mensaje vacío al usuario."},source:{code:lo.trim()}}}},ht={render:()=>{const[e,n]=l.useState("");return r.jsx(E,{sx:{width:300},children:r.jsx(w,{label:"Muchas opciones",options:Mt,value:e,onChange:a=>{n(a)}})})},parameters:{docs:{description:{story:"Autocomplete sin opciones disponibles, mostrando mensaje vacío al usuario."},source:{code:lo.trim()}}}},bt={render:()=>{const[e,n]=l.useState(null);return r.jsx(E,{sx:{width:300},children:r.jsx(w,{label:"Cantidad",options:le,value:e,onChange:a=>n(a),error:!e,helperText:e?" ":"Debes seleccionar una cantidad"})})},parameters:{docs:{description:{story:"Autocomplete en estado de error con `helperText`. Muestra la validación visual (borde + label + texto en rojo)."},source:{code:ln.trim()}}}},xt={render:()=>{const[e,n]=l.useState(null),[a,i]=l.useState(null);return r.jsxs(Ft,{spacing:3,sx:{width:320},children:[r.jsx(w,{label:"Outside (default)",labelPosition:"outside",options:le,value:e,onChange:d=>n(d)}),r.jsx(w,{label:"Floating",labelPosition:"floating",options:le,value:a,onChange:d=>i(d)})]})},parameters:{docs:{description:{story:"Comparación entre `labelPosition='outside'` (label arriba del input, consistente con Input/Select/DatePicker) y `labelPosition='floating'` (comportamiento nativo MUI dentro del notch)."},source:{code:cn.trim()}}}},vt={render:()=>{const[e,n]=l.useState(null),[a,i]=l.useState(null),[d,I]=l.useState(null);return r.jsxs(Ft,{spacing:2,sx:{width:300},children:[r.jsx(w,{label:"0",borderRadius:0,options:le,value:e,onChange:y=>n(y)}),r.jsx(w,{label:"10 (default)",borderRadius:10,options:le,value:a,onChange:y=>i(y)}),r.jsx(w,{label:"24 (pill)",borderRadius:24,options:le,value:d,onChange:y=>I(y)})]})},parameters:{docs:{description:{story:"La prop `borderRadius` permite personalizar el radio del borde sin usar `sx` (acepta number en px o string)."},source:{code:un.trim()}}}},yt={render:()=>{const[e,n]=l.useState(null),a=[{value:"mx",label:"México"},{value:"co",label:"Colombia"},{value:"ar",label:"Argentina"}];return r.jsxs(E,{sx:{width:300},children:[r.jsx(w,{label:"País",placeholder:"Buscar país...",options:a,value:e,onChange:i=>n(i)}),r.jsx(J,{sx:{mt:2},variant:"caption",color:"text.secondary",children:"Al estar vacío y sin foco, solo se ve el label como placeholder. Al enfocar, el label sube y aparece el placeholder real."})]})},parameters:{docs:{description:{story:"Autocomplete vacío con placeholder. El placeholder solo se muestra cuando el campo está enfocado (mismo patrón que Select/Input)."},source:{code:pn.trim()}}}},At={render:()=>{const{control:e,handleSubmit:n,watch:a}=fo({defaultValues:{country:null}}),i=[{value:"mx",label:"México"},{value:"co",label:"Colombia"},{value:"ar",label:"Argentina"}],[d,I]=l.useState(null);return r.jsx(E,{component:"form",onSubmit:n(y=>I(y)),children:r.jsxs(Ft,{spacing:2,sx:{width:320},children:[r.jsx(w,{name:"country",control:e,validation:{required:"Campo requerido"},label:"País",placeholder:"Seleccione...",options:i}),r.jsx(Lo,{type:"submit",variant:"contained",children:"Guardar"}),r.jsxs(J,{variant:"caption",color:"text.secondary",children:["Valor actual (watch): ",JSON.stringify(a("country"))]}),d&&r.jsxs(J,{variant:"caption",color:"success.main",children:["Submit: ",JSON.stringify(d)]})]})})},parameters:{docs:{description:{story:"Integración con React Hook Form usando `name`/`control`/`validation`. El error de validación se renderiza automáticamente como helperText."},source:{code:dn.trim()}}}},mn=[{value:1,label:"Andrea García"},{value:2,label:"Andrés Pérez"},{value:3,label:"Beatriz López"},{value:4,label:"Carlos Ruiz"},{value:5,label:"Camila Torres"},{value:6,label:"Diego Fernández"},{value:7,label:"Elena Morales"},{value:8,label:"Fabián Núñez"}],uo=e=>new Promise(n=>{setTimeout(()=>{if(!e)return n([]);const a=e.toLowerCase();n(mn.filter(i=>i.label.toLowerCase().includes(a)))},400)});function po(e,n){let a;return(...i)=>{clearTimeout(a),a=setTimeout(()=>e(...i),n)}}const St={render:()=>{const[e,n]=l.useState(null),[a,i]=l.useState(""),[d,I]=l.useState([]),[y,S]=l.useState(!1),B=l.useMemo(()=>po(async x=>{if(!x){I([]);return}S(!0);try{const C=await uo(x);I(C)}finally{S(!1)}},300),[]);return l.useEffect(()=>{B(a)},[a,B]),r.jsxs(E,{sx:{width:320},children:[r.jsx(w,{label:"Usuario",placeholder:"Buscar usuario...",options:d,value:e,onChange:x=>n(x),inputValue:a,onInputChange:(x,C)=>i(C),loading:y,filterOptions:x=>x}),r.jsx(J,{sx:{mt:2},variant:"caption",color:"text.secondary",children:"Escribe para buscar. El servicio se consulta con debounce (300ms). filterOptions={(x) => x} desactiva el filtro cliente."})]})},parameters:{docs:{description:{story:"Búsqueda asíncrona contra un servicio. El consumer maneja el estado de `options`/`loading` y reacciona a `onInputChange` para llamar al servicio. Usar `filterOptions={(x) => x}` para desactivar el filtro cliente."},source:{code:io.trim()}}}},Ct={render:()=>{const[e,n]=l.useState([]),[a,i]=l.useState(""),[d,I]=l.useState([]),[y,S]=l.useState(!1),B=l.useMemo(()=>po(async x=>{if(!x){I([]);return}S(!0);try{const C=await uo(x);I(C)}finally{S(!1)}},300),[]);return l.useEffect(()=>{B(a)},[a,B]),r.jsxs(E,{sx:{width:420},children:[r.jsx(w,{multiple:!0,maxChipsToShow:4,label:"Usuarios",placeholder:"Buscar y seleccionar varios...",options:d,value:e,onChange:x=>n(x),inputValue:a,onInputChange:(x,C)=>i(C),loading:y,filterOptions:x=>x}),r.jsx(J,{sx:{mt:2},variant:"caption",color:"text.secondary",children:"Selecciona varios usuarios buscando con diferentes queries. Los chips persisten aunque el search cambie las `options` (cache interno)."}),r.jsxs(J,{sx:{mt:1},variant:"caption",display:"block",children:["Seleccionados: ",JSON.stringify(e)]})]})},parameters:{docs:{description:{story:"Búsqueda asíncrona **con selección múltiple**. El componente mantiene un cache interno de opciones ya vistas, así los chips de los items seleccionados NO desaparecen cuando el usuario busca otros términos. Flujo: buscar 'an' → seleccionar Andrea → buscar 'be' → seleccionar Beatriz → los dos chips siguen visibles."},source:{code:io.trim()}}}};it.parameters={...it.parameters,docs:{...it.parameters?.docs,source:{originalSource:`{
331
+ render: () => {
332
+ const [value, setValue] = useState<string>("25");
333
+ return <Box sx={{
334
+ width: 250
335
+ }}>
336
+ <Autocomplete label="Registros por página" options={basicOptions} value={value} onChange={val => {
337
+ setValue(val as string);
338
+ }} />
339
+ <Typography sx={{
340
+ mt: 2
341
+ }}>Valor: {value}</Typography>
342
+ </Box>;
343
+ },
344
+ parameters: {
345
+ docs: {
346
+ description: {
347
+ story: "Autocomplete simple con opciones básicas y valor por defecto."
348
+ },
349
+ source: {
350
+ code: SimpleAutocompleteDefinition.trim()
351
+ }
352
+ }
353
+ }
354
+ }`,...it.parameters?.docs?.source}}};ct.parameters={...ct.parameters,docs:{...ct.parameters?.docs,source:{originalSource:`{
355
+ render: () => {
356
+ const [value, setValue] = useState<string>("");
357
+ return <Box sx={{
358
+ width: 300
359
+ }}>
360
+ <Autocomplete label="Seleccione una opción" options={basicOptions} value={value} onChange={val => {
361
+ setValue(val as string);
362
+ }} placeholder="Ninguna opción seleccionada" />
363
+ <Typography sx={{
364
+ mt: 2
365
+ }}>{value || "Ninguno"}</Typography>
366
+ </Box>;
367
+ },
368
+ parameters: {
369
+ docs: {
370
+ description: {
371
+ story: "Autocomplete sin valor inicial que muestra un placeholder cuando no hay selección."
372
+ },
373
+ source: {
374
+ code: WithPlaceholderAutocompleteDefinition.trim()
375
+ }
376
+ }
377
+ }
378
+ }`,...ct.parameters?.docs?.source}}};ut.parameters={...ut.parameters,docs:{...ut.parameters?.docs,source:{originalSource:`{
379
+ render: () => {
380
+ const [value, setValue] = useState<string[]>([]);
381
+ return <Box sx={{
382
+ width: 400
383
+ }}>
384
+ <Autocomplete label="Seleccionar valores" multiple options={basicOptions} value={value} onChange={val => {
385
+ setValue(val as string[]);
386
+ }} />
387
+ <Typography sx={{
388
+ mt: 2
389
+ }}>
390
+ Valor seleccionado: {JSON.stringify(value)}
391
+ </Typography>
392
+ </Box>;
393
+ },
394
+ parameters: {
395
+ docs: {
396
+ description: {
397
+ story: "Autocomplete en modo múltiple que permite seleccionar varias opciones y las muestra como chips."
398
+ },
399
+ source: {
400
+ code: MultipleAutocompleteDefinition.trim()
401
+ }
402
+ }
403
+ }
404
+ }`,...ut.parameters?.docs?.source}}};pt.parameters={...pt.parameters,docs:{...pt.parameters?.docs,source:{originalSource:`{
405
+ render: () => {
406
+ const [value, setValue] = useState<string[]>(manyOptions.slice(0, 5).map(opt => opt.value));
407
+ return <Box sx={{
408
+ width: 400
409
+ }}>
410
+ <Autocomplete label="Muchas selecciones" multiple maxChipsToShow={2} options={manyOptions} value={value} onChange={val => {
411
+ setValue(val as string[]);
412
+ }} />
413
+ </Box>;
414
+ },
415
+ parameters: {
416
+ docs: {
417
+ description: {
418
+ story: "Autocomplete múltiple con límite de chips visibles, agrupando el resto en un contador."
419
+ },
420
+ source: {
421
+ code: MultipleWithLimitAutocompleteDefinition.trim()
422
+ }
423
+ }
424
+ }
425
+ }`,...pt.parameters?.docs?.source}}};dt.parameters={...dt.parameters,docs:{...dt.parameters?.docs,source:{originalSource:`{
426
+ render: () => {
427
+ const [value, setValue] = useState<string[]>([]);
428
+ return <Box sx={{
429
+ width: 300
430
+ }}>
431
+ <Autocomplete label="Usuarios" multiple options={userOptions} value={value} onChange={val => {
432
+ setValue(val as string[]);
433
+ }} renderOptionItem={item => <Box sx={{
434
+ display: "flex",
435
+ gap: 1,
436
+ alignItems: "center"
437
+ }}>
438
+ <Avatar src={item.img} sx={{
439
+ width: 24,
440
+ height: 24
441
+ }} />
442
+ {item.label}
443
+ </Box>} />
444
+ </Box>;
445
+ },
446
+ parameters: {
447
+ docs: {
448
+ description: {
449
+ story: "Autocomplete con renderizado personalizado de opciones, incluyendo avatar e información adicional."
450
+ },
451
+ source: {
452
+ code: CustomRenderOptionAutocompleteDefinition.trim()
453
+ }
454
+ }
455
+ }
456
+ }`,...dt.parameters?.docs?.source}}};mt.parameters={...mt.parameters,docs:{...mt.parameters?.docs,source:{originalSource:`{
457
+ render: () => {
458
+ const [value, setValue] = useState<string[]>([]);
459
+ return <Box sx={{
460
+ width: 400
461
+ }}>
462
+ <Autocomplete label="Usuarios seleccionados" multiple options={userOptions} value={value} onChange={val => {
463
+ setValue(val as string[]);
464
+ }} maxChipsToShow={2} renderChipLabel={item => <Typography variant="caption" fontWeight="bold">
465
+ {item.label.charAt(0)}
466
+ </Typography>} />
467
+ </Box>;
468
+ },
469
+ parameters: {
470
+ docs: {
471
+ description: {
472
+ story: "Autocomplete múltiple con renderizado personalizado de chips, mostrando solo la inicial del label."
473
+ },
474
+ source: {
475
+ code: CustomChipRenderAutocompleteDefinition.trim()
476
+ }
477
+ }
478
+ }
479
+ }`,...mt.parameters?.docs?.source}}};gt.parameters={...gt.parameters,docs:{...gt.parameters?.docs,source:{originalSource:`{
480
+ render: () => {
481
+ const [value, setValue] = useState<string>("");
482
+ return <Box sx={{
483
+ width: 300
484
+ }}>
485
+ <Autocomplete label="Cargando..." options={[]} loading value={value} onChange={val => {
486
+ setValue(val as string);
487
+ }} />
488
+ </Box>;
489
+ },
490
+ parameters: {
491
+ docs: {
492
+ description: {
493
+ story: "Autocomplete en estado de carga, útil para integraciones con APIs o búsquedas asíncronas."
494
+ },
495
+ source: {
496
+ code: LoadingAutocompleteDefinition.trim()
497
+ }
498
+ }
499
+ }
500
+ }`,...gt.parameters?.docs?.source}}};ft.parameters={...ft.parameters,docs:{...ft.parameters?.docs,source:{originalSource:`{
501
+ render: () => {
502
+ const [value, setValue] = useState<string>("");
503
+ return <Box sx={{
504
+ width: 300
505
+ }}>
506
+ <Autocomplete label="Sin opciones" options={[]} value={value} onChange={val => {
507
+ setValue(val as string);
508
+ }} placeholder="No hay opciones" />
509
+ </Box>;
510
+ },
511
+ parameters: {
512
+ docs: {
513
+ description: {
514
+ story: "Autocomplete sin opciones disponibles, mostrando mensaje vacío al usuario."
515
+ },
516
+ source: {
517
+ code: EmptyOptionsAutocompleteDefinition.trim()
518
+ }
519
+ }
520
+ }
521
+ }`,...ft.parameters?.docs?.source}}};ht.parameters={...ht.parameters,docs:{...ht.parameters?.docs,source:{originalSource:`{
522
+ render: () => {
523
+ const [value, setValue] = useState<string>("");
524
+ return <Box sx={{
525
+ width: 300
526
+ }}>
527
+ <Autocomplete label="Muchas opciones" options={manyOptions} value={value} onChange={val => {
528
+ setValue(val as string);
529
+ }} />
530
+ </Box>;
531
+ },
532
+ parameters: {
533
+ docs: {
534
+ description: {
535
+ story: "Autocomplete sin opciones disponibles, mostrando mensaje vacío al usuario."
536
+ },
537
+ source: {
538
+ code: EmptyOptionsAutocompleteDefinition.trim()
539
+ }
540
+ }
541
+ }
542
+ }`,...ht.parameters?.docs?.source}}};bt.parameters={...bt.parameters,docs:{...bt.parameters?.docs,source:{originalSource:`{
543
+ render: () => {
544
+ const [value, setValue] = useState<string | null>(null);
545
+ return <Box sx={{
546
+ width: 300
547
+ }}>
548
+ <Autocomplete label="Cantidad" options={basicOptions} value={value} onChange={val => setValue(val as string | null)} error={!value} helperText={!value ? "Debes seleccionar una cantidad" : " "} />
549
+ </Box>;
550
+ },
551
+ parameters: {
552
+ docs: {
553
+ description: {
554
+ story: "Autocomplete en estado de error con \`helperText\`. Muestra la validación visual (borde + label + texto en rojo)."
555
+ },
556
+ source: {
557
+ code: WithErrorAutocompleteDefinition.trim()
558
+ }
559
+ }
560
+ }
561
+ }`,...bt.parameters?.docs?.source}}};xt.parameters={...xt.parameters,docs:{...xt.parameters?.docs,source:{originalSource:`{
562
+ render: () => {
563
+ const [a, setA] = useState<string | null>(null);
564
+ const [b, setB] = useState<string | null>(null);
565
+ return <Stack spacing={3} sx={{
566
+ width: 320
567
+ }}>
568
+ <Autocomplete label="Outside (default)" labelPosition="outside" options={basicOptions} value={a} onChange={val => setA(val as string | null)} />
569
+ <Autocomplete label="Floating" labelPosition="floating" options={basicOptions} value={b} onChange={val => setB(val as string | null)} />
570
+ </Stack>;
571
+ },
572
+ parameters: {
573
+ docs: {
574
+ description: {
575
+ story: "Comparación entre \`labelPosition='outside'\` (label arriba del input, consistente con Input/Select/DatePicker) y \`labelPosition='floating'\` (comportamiento nativo MUI dentro del notch)."
576
+ },
577
+ source: {
578
+ code: LabelPositionAutocompleteDefinition.trim()
579
+ }
580
+ }
581
+ }
582
+ }`,...xt.parameters?.docs?.source}}};vt.parameters={...vt.parameters,docs:{...vt.parameters?.docs,source:{originalSource:`{
583
+ render: () => {
584
+ const [a, setA] = useState<string | null>(null);
585
+ const [b, setB] = useState<string | null>(null);
586
+ const [c, setC] = useState<string | null>(null);
587
+ return <Stack spacing={2} sx={{
588
+ width: 300
589
+ }}>
590
+ <Autocomplete label="0" borderRadius={0} options={basicOptions} value={a} onChange={v => setA(v as string | null)} />
591
+ <Autocomplete label="10 (default)" borderRadius={10} options={basicOptions} value={b} onChange={v => setB(v as string | null)} />
592
+ <Autocomplete label="24 (pill)" borderRadius={24} options={basicOptions} value={c} onChange={v => setC(v as string | null)} />
593
+ </Stack>;
594
+ },
595
+ parameters: {
596
+ docs: {
597
+ description: {
598
+ story: "La prop \`borderRadius\` permite personalizar el radio del borde sin usar \`sx\` (acepta number en px o string)."
599
+ },
600
+ source: {
601
+ code: CustomBorderRadiusAutocompleteDefinition.trim()
602
+ }
603
+ }
604
+ }
605
+ }`,...vt.parameters?.docs?.source}}};yt.parameters={...yt.parameters,docs:{...yt.parameters?.docs,source:{originalSource:`{
606
+ render: () => {
607
+ const [value, setValue] = useState<string | null>(null);
608
+ const countries: SelectOption[] = [{
609
+ value: "mx",
610
+ label: "México"
611
+ }, {
612
+ value: "co",
613
+ label: "Colombia"
614
+ }, {
615
+ value: "ar",
616
+ label: "Argentina"
617
+ }];
618
+ return <Box sx={{
619
+ width: 300
620
+ }}>
621
+ <Autocomplete label="País" placeholder="Buscar país..." options={countries} value={value} onChange={val => setValue(val as string | null)} />
622
+ <Typography sx={{
623
+ mt: 2
624
+ }} variant="caption" color="text.secondary">
625
+ Al estar vacío y sin foco, solo se ve el label como placeholder. Al
626
+ enfocar, el label sube y aparece el placeholder real.
627
+ </Typography>
628
+ </Box>;
629
+ },
630
+ parameters: {
631
+ docs: {
632
+ description: {
633
+ story: "Autocomplete vacío con placeholder. El placeholder solo se muestra cuando el campo está enfocado (mismo patrón que Select/Input)."
634
+ },
635
+ source: {
636
+ code: EmptyWithPlaceholderAutocompleteDefinition.trim()
637
+ }
638
+ }
639
+ }
640
+ }`,...yt.parameters?.docs?.source}}};At.parameters={...At.parameters,docs:{...At.parameters?.docs,source:{originalSource:`{
641
+ render: () => {
642
+ type FormValues = {
643
+ country: string | null;
644
+ };
645
+ const {
646
+ control,
647
+ handleSubmit,
648
+ watch
649
+ } = useForm<FormValues>({
650
+ defaultValues: {
651
+ country: null
652
+ }
653
+ });
654
+ const countries: SelectOption[] = [{
655
+ value: "mx",
656
+ label: "México"
657
+ }, {
658
+ value: "co",
659
+ label: "Colombia"
660
+ }, {
661
+ value: "ar",
662
+ label: "Argentina"
663
+ }];
664
+ const [submitted, setSubmitted] = useState<FormValues | null>(null);
665
+ return <Box component="form" onSubmit={handleSubmit(data => setSubmitted(data))}>
666
+ <Stack spacing={2} sx={{
667
+ width: 320
668
+ }}>
669
+ <Autocomplete name="country" control={control} validation={{
670
+ required: "Campo requerido"
671
+ }} label="País" placeholder="Seleccione..." options={countries} />
672
+ <Button type="submit" variant="contained">
673
+ Guardar
674
+ </Button>
675
+ <Typography variant="caption" color="text.secondary">
676
+ Valor actual (watch): {JSON.stringify(watch("country"))}
677
+ </Typography>
678
+ {submitted && <Typography variant="caption" color="success.main">
679
+ Submit: {JSON.stringify(submitted)}
680
+ </Typography>}
681
+ </Stack>
682
+ </Box>;
683
+ },
684
+ parameters: {
685
+ docs: {
686
+ description: {
687
+ story: "Integración con React Hook Form usando \`name\`/\`control\`/\`validation\`. El error de validación se renderiza automáticamente como helperText."
688
+ },
689
+ source: {
690
+ code: RHFAutocompleteDefinition.trim()
691
+ }
692
+ }
693
+ }
694
+ }`,...At.parameters?.docs?.source}}};St.parameters={...St.parameters,docs:{...St.parameters?.docs,source:{originalSource:`{
695
+ render: () => {
696
+ const [value, setValue] = useState<number | null>(null);
697
+ const [input, setInput] = useState("");
698
+ const [options, setOptions] = useState<SelectOption[]>([]);
699
+ const [loading, setLoading] = useState(false);
700
+ const search = useMemo(() => debounce(async (q: string) => {
701
+ if (!q) {
702
+ setOptions([]);
703
+ return;
704
+ }
705
+ setLoading(true);
706
+ try {
707
+ const res = await fakeFetchUsers(q);
708
+ setOptions(res);
709
+ } finally {
710
+ setLoading(false);
711
+ }
712
+ }, 300), []);
713
+ useEffect(() => {
714
+ search(input);
715
+ }, [input, search]);
716
+ return <Box sx={{
717
+ width: 320
718
+ }}>
719
+ <Autocomplete<number> label="Usuario" placeholder="Buscar usuario..." options={options} value={value} onChange={v => setValue(v as number | null)} inputValue={input} onInputChange={(_, v) => setInput(v)} loading={loading}
720
+ // Desactiva filtro cliente: confiamos en el servicio.
721
+ filterOptions={x => x} />
722
+ <Typography sx={{
723
+ mt: 2
724
+ }} variant="caption" color="text.secondary">
725
+ {"Escribe para buscar. El servicio se consulta con debounce (300ms). filterOptions={(x) => x} desactiva el filtro cliente."}
726
+ </Typography>
727
+ </Box>;
728
+ },
729
+ parameters: {
730
+ docs: {
731
+ description: {
732
+ story: "Búsqueda asíncrona contra un servicio. El consumer maneja el estado de \`options\`/\`loading\` y reacciona a \`onInputChange\` para llamar al servicio. Usar \`filterOptions={(x) => x}\` para desactivar el filtro cliente."
733
+ },
734
+ source: {
735
+ code: AsyncServiceAutocompleteDefinition.trim()
736
+ }
737
+ }
738
+ }
739
+ }`,...St.parameters?.docs?.source}}};Ct.parameters={...Ct.parameters,docs:{...Ct.parameters?.docs,source:{originalSource:`{
740
+ render: () => {
741
+ const [value, setValue] = useState<number[]>([]);
742
+ const [input, setInput] = useState("");
743
+ const [options, setOptions] = useState<SelectOption[]>([]);
744
+ const [loading, setLoading] = useState(false);
745
+ const search = useMemo(() => debounce(async (q: string) => {
746
+ if (!q) {
747
+ setOptions([]);
748
+ return;
749
+ }
750
+ setLoading(true);
751
+ try {
752
+ const res = await fakeFetchUsers(q);
753
+ setOptions(res);
754
+ } finally {
755
+ setLoading(false);
756
+ }
757
+ }, 300), []);
758
+ useEffect(() => {
759
+ search(input);
760
+ }, [input, search]);
761
+ return <Box sx={{
762
+ width: 420
763
+ }}>
764
+ <Autocomplete<number> multiple maxChipsToShow={4} label="Usuarios" placeholder="Buscar y seleccionar varios..." options={options} value={value} onChange={v => setValue(v as number[])} inputValue={input} onInputChange={(_, v) => setInput(v)} loading={loading} filterOptions={x => x} />
765
+ <Typography sx={{
766
+ mt: 2
767
+ }} variant="caption" color="text.secondary">
768
+ Selecciona varios usuarios buscando con diferentes queries. Los chips
769
+ persisten aunque el search cambie las \`options\` (cache interno).
770
+ </Typography>
771
+ <Typography sx={{
772
+ mt: 1
773
+ }} variant="caption" display="block">
774
+ Seleccionados: {JSON.stringify(value)}
775
+ </Typography>
776
+ </Box>;
777
+ },
778
+ parameters: {
779
+ docs: {
780
+ description: {
781
+ story: "Búsqueda asíncrona **con selección múltiple**. El componente mantiene un cache interno de opciones ya vistas, así los chips de los items seleccionados NO desaparecen cuando el usuario busca otros términos. Flujo: buscar 'an' → seleccionar Andrea → buscar 'be' → seleccionar Beatriz → los dos chips siguen visibles."
782
+ },
783
+ source: {
784
+ code: AsyncServiceAutocompleteDefinition.trim()
785
+ }
786
+ }
787
+ }
788
+ }`,...Ct.parameters?.docs?.source}}};const ca=["Simple","WithPlaceholder","Multiple","MultipleWithLimit","CustomRenderOption","CustomChipRender","Loading","EmptyOptions","ManyOptions","WithError","LabelPosition","CustomBorderRadius","EmptyWithPlaceholder","WithReactHookForm","AsyncService","AsyncServiceMultiple"];export{St as AsyncService,Ct as AsyncServiceMultiple,vt as CustomBorderRadius,mt as CustomChipRender,dt as CustomRenderOption,ft as EmptyOptions,yt as EmptyWithPlaceholder,xt as LabelPosition,gt as Loading,ht as ManyOptions,ut as Multiple,pt as MultipleWithLimit,it as Simple,bt as WithError,ct as WithPlaceholder,At as WithReactHookForm,ca as __namedExportsOrder,ia as default};