flysoft-react-ui 0.5.0 → 0.5.3

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 (206) hide show
  1. package/dist/App.d.ts.map +1 -1
  2. package/dist/App.js +19 -7
  3. package/dist/components/form-controls/AutocompleteInput.d.ts +11 -3
  4. package/dist/components/form-controls/AutocompleteInput.d.ts.map +1 -1
  5. package/dist/components/form-controls/AutocompleteInput.js +411 -31
  6. package/dist/components/form-controls/Button.d.ts +3 -0
  7. package/dist/components/form-controls/Button.d.ts.map +1 -1
  8. package/dist/components/form-controls/Button.js +160 -19
  9. package/dist/components/form-controls/Checkbox.d.ts +14 -0
  10. package/dist/components/form-controls/Checkbox.d.ts.map +1 -0
  11. package/dist/components/form-controls/Checkbox.js +79 -0
  12. package/dist/components/form-controls/DateInput.d.ts +24 -4
  13. package/dist/components/form-controls/DateInput.d.ts.map +1 -1
  14. package/dist/components/form-controls/DateInput.js +492 -70
  15. package/dist/components/form-controls/DatePicker.d.ts +4 -3
  16. package/dist/components/form-controls/DatePicker.d.ts.map +1 -1
  17. package/dist/components/form-controls/DatePicker.js +26 -30
  18. package/dist/components/form-controls/Input.d.ts +10 -1
  19. package/dist/components/form-controls/Input.d.ts.map +1 -1
  20. package/dist/components/form-controls/Input.js +17 -10
  21. package/dist/components/form-controls/LinkButton.d.ts +15 -0
  22. package/dist/components/form-controls/LinkButton.d.ts.map +1 -0
  23. package/dist/components/form-controls/LinkButton.js +248 -0
  24. package/dist/components/form-controls/Pagination.d.ts +1 -0
  25. package/dist/components/form-controls/Pagination.d.ts.map +1 -1
  26. package/dist/components/form-controls/Pagination.js +3 -40
  27. package/dist/components/form-controls/RadioButtonGroup.d.ts +62 -0
  28. package/dist/components/form-controls/RadioButtonGroup.d.ts.map +1 -0
  29. package/dist/components/form-controls/RadioButtonGroup.js +220 -0
  30. package/dist/components/form-controls/SearchSelectInput-OLD.d.ts +68 -0
  31. package/dist/components/form-controls/SearchSelectInput-OLD.d.ts.map +1 -0
  32. package/dist/components/form-controls/SearchSelectInput-OLD.js +963 -0
  33. package/dist/components/form-controls/SearchSelectInput.d.ts +70 -0
  34. package/dist/components/form-controls/SearchSelectInput.d.ts.map +1 -0
  35. package/dist/components/form-controls/SearchSelectInput.js +336 -0
  36. package/dist/components/form-controls/index.d.ts +9 -1
  37. package/dist/components/form-controls/index.d.ts.map +1 -1
  38. package/dist/components/form-controls/index.js +4 -0
  39. package/dist/components/layout/Accordion.d.ts +13 -0
  40. package/dist/components/layout/Accordion.d.ts.map +1 -0
  41. package/dist/components/layout/Accordion.js +67 -0
  42. package/dist/components/layout/AppLayout.d.ts +3 -2
  43. package/dist/components/layout/AppLayout.d.ts.map +1 -1
  44. package/dist/components/layout/AppLayout.js +104 -31
  45. package/dist/components/layout/Card.d.ts +8 -3
  46. package/dist/components/layout/Card.d.ts.map +1 -1
  47. package/dist/components/layout/Card.js +18 -19
  48. package/dist/components/layout/Collection.js +1 -1
  49. package/dist/components/layout/DataTable.d.ts +3 -1
  50. package/dist/components/layout/DataTable.d.ts.map +1 -1
  51. package/dist/components/layout/DataTable.js +34 -29
  52. package/dist/components/layout/index.d.ts +2 -0
  53. package/dist/components/layout/index.d.ts.map +1 -1
  54. package/dist/components/layout/index.js +1 -0
  55. package/dist/components/utils/Avatar.d.ts +49 -0
  56. package/dist/components/utils/Avatar.d.ts.map +1 -0
  57. package/dist/components/utils/Avatar.js +93 -0
  58. package/dist/components/utils/Badge.d.ts +3 -0
  59. package/dist/components/utils/Badge.d.ts.map +1 -1
  60. package/dist/components/utils/Badge.js +131 -26
  61. package/dist/components/utils/Dialog.d.ts.map +1 -1
  62. package/dist/components/utils/Dialog.js +6 -1
  63. package/dist/components/utils/Filter.d.ts +57 -0
  64. package/dist/components/utils/Filter.d.ts.map +1 -0
  65. package/dist/components/utils/Filter.js +581 -0
  66. package/dist/components/utils/FiltersDialog.d.ts +21 -0
  67. package/dist/components/utils/FiltersDialog.d.ts.map +1 -0
  68. package/dist/components/utils/FiltersDialog.js +104 -0
  69. package/dist/components/utils/Loader.js +2 -2
  70. package/dist/components/utils/RoadMap.d.ts +59 -0
  71. package/dist/components/utils/RoadMap.d.ts.map +1 -0
  72. package/dist/components/utils/RoadMap.js +139 -0
  73. package/dist/components/utils/Snackbar.d.ts +13 -0
  74. package/dist/components/utils/Snackbar.d.ts.map +1 -0
  75. package/dist/components/utils/Snackbar.js +122 -0
  76. package/dist/components/utils/SnackbarContainer.d.ts +7 -0
  77. package/dist/components/utils/SnackbarContainer.d.ts.map +1 -0
  78. package/dist/components/utils/SnackbarContainer.js +25 -0
  79. package/dist/components/utils/iconUtils.d.ts +16 -0
  80. package/dist/components/utils/iconUtils.d.ts.map +1 -0
  81. package/dist/components/utils/iconUtils.js +40 -0
  82. package/dist/components/utils/index.d.ts +12 -0
  83. package/dist/components/utils/index.d.ts.map +1 -1
  84. package/dist/components/utils/index.js +6 -0
  85. package/dist/contexts/AppLayoutContext.d.ts +40 -0
  86. package/dist/contexts/AppLayoutContext.d.ts.map +1 -0
  87. package/dist/contexts/AppLayoutContext.js +98 -0
  88. package/dist/contexts/ListCrudContext.d.ts +50 -0
  89. package/dist/contexts/ListCrudContext.d.ts.map +1 -0
  90. package/dist/contexts/ListCrudContext.js +253 -0
  91. package/dist/contexts/SnackbarContext.d.ts +26 -0
  92. package/dist/contexts/SnackbarContext.d.ts.map +1 -0
  93. package/dist/contexts/SnackbarContext.js +34 -0
  94. package/dist/contexts/index.d.ts +6 -0
  95. package/dist/contexts/index.d.ts.map +1 -1
  96. package/dist/contexts/index.js +6 -0
  97. package/dist/contexts/presets.js +6 -6
  98. package/dist/docs/AccordionDocs.d.ts +4 -0
  99. package/dist/docs/AccordionDocs.d.ts.map +1 -0
  100. package/dist/docs/AccordionDocs.js +21 -0
  101. package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +3 -5
  102. package/dist/docs/AutocompleteInputDocs.js +1 -1
  103. package/dist/docs/AvatarDocs.d.ts +4 -0
  104. package/dist/docs/AvatarDocs.d.ts.map +1 -0
  105. package/dist/docs/AvatarDocs.js +7 -0
  106. package/dist/docs/BadgeDocs.d.ts.map +1 -1
  107. package/dist/docs/BadgeDocs.js +4 -2
  108. package/dist/docs/ButtonDocs.d.ts.map +1 -1
  109. package/dist/docs/ButtonDocs.js +1 -1
  110. package/dist/docs/CardDocs.d.ts.map +1 -1
  111. package/dist/docs/CardDocs.js +17 -8
  112. package/dist/docs/CheckboxDocs.d.ts +4 -0
  113. package/dist/docs/CheckboxDocs.d.ts.map +1 -0
  114. package/dist/docs/CheckboxDocs.js +7 -0
  115. package/dist/docs/DataTableDocs.d.ts.map +1 -1
  116. package/dist/docs/DataTableDocs.js +9 -5
  117. package/dist/docs/DateInputDocs.d.ts +1 -0
  118. package/dist/docs/DateInputDocs.d.ts.map +1 -1
  119. package/dist/docs/DateInputDocs.js +7 -9
  120. package/dist/docs/DatePickerDocs.d.ts +1 -0
  121. package/dist/docs/DatePickerDocs.d.ts.map +1 -1
  122. package/dist/docs/DatePickerDocs.js +6 -8
  123. package/dist/docs/DialogDocs.js +1 -1
  124. package/dist/docs/DocAdmin.d.ts +4 -0
  125. package/dist/docs/DocAdmin.d.ts.map +1 -0
  126. package/dist/docs/DocAdmin.js +68 -0
  127. package/dist/docs/DocsMenu.d.ts.map +1 -1
  128. package/dist/docs/DocsMenu.js +3 -3
  129. package/dist/docs/DocsRouter.d.ts.map +1 -1
  130. package/dist/docs/DocsRouter.js +13 -1
  131. package/dist/docs/DropdownMenuDocs.js +1 -1
  132. package/dist/docs/ExampleFormDocs.d.ts +4 -0
  133. package/dist/docs/ExampleFormDocs.d.ts.map +1 -0
  134. package/dist/docs/ExampleFormDocs.js +148 -0
  135. package/dist/docs/FilterDocs.d.ts +4 -0
  136. package/dist/docs/FilterDocs.d.ts.map +1 -0
  137. package/dist/docs/FilterDocs.js +112 -0
  138. package/dist/docs/InputDocs.d.ts.map +1 -1
  139. package/dist/docs/InputDocs.js +11 -1
  140. package/dist/docs/LinkButtonDocs.d.ts +4 -0
  141. package/dist/docs/LinkButtonDocs.d.ts.map +1 -0
  142. package/dist/docs/LinkButtonDocs.js +7 -0
  143. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +2 -0
  144. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +1 -0
  145. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +29 -0
  146. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts +2 -0
  147. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +1 -0
  148. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +7 -0
  149. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts +2 -0
  150. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +1 -0
  151. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +57 -0
  152. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts +9 -0
  153. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +1 -0
  154. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +30 -0
  155. package/dist/docs/PaginationDocs.js +6 -6
  156. package/dist/docs/RadioButtonGroupDocs.d.ts +4 -0
  157. package/dist/docs/RadioButtonGroupDocs.d.ts.map +1 -0
  158. package/dist/docs/RadioButtonGroupDocs.js +46 -0
  159. package/dist/docs/RoadMapDocs.d.ts +4 -0
  160. package/dist/docs/RoadMapDocs.d.ts.map +1 -0
  161. package/dist/docs/RoadMapDocs.js +171 -0
  162. package/dist/docs/SearchSelectInputDocs.d.ts +4 -0
  163. package/dist/docs/SearchSelectInputDocs.d.ts.map +1 -0
  164. package/dist/docs/SearchSelectInputDocs.js +168 -0
  165. package/dist/docs/SnackbarDocs.d.ts +4 -0
  166. package/dist/docs/SnackbarDocs.d.ts.map +1 -0
  167. package/dist/docs/SnackbarDocs.js +50 -0
  168. package/dist/docs/TabsGroupDocs.d.ts.map +1 -1
  169. package/dist/docs/TabsGroupDocs.js +12 -1
  170. package/dist/docs/docMockServices/empresaService.d.ts +38 -0
  171. package/dist/docs/docMockServices/empresaService.d.ts.map +1 -0
  172. package/dist/docs/docMockServices/empresaService.js +117 -0
  173. package/dist/docs/docMockServices/index.d.ts +9 -0
  174. package/dist/docs/docMockServices/index.d.ts.map +1 -0
  175. package/dist/docs/docMockServices/index.js +8 -0
  176. package/dist/docs/docMockServices/initialData.d.ts +6 -0
  177. package/dist/docs/docMockServices/initialData.d.ts.map +1 -0
  178. package/dist/docs/docMockServices/initialData.js +132 -0
  179. package/dist/docs/docMockServices/interfaces.d.ts +26 -0
  180. package/dist/docs/docMockServices/interfaces.d.ts.map +1 -0
  181. package/dist/docs/docMockServices/interfaces.js +1 -0
  182. package/dist/docs/docMockServices/personaEmpresaService.d.ts +43 -0
  183. package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +1 -0
  184. package/dist/docs/docMockServices/personaEmpresaService.js +113 -0
  185. package/dist/docs/docMockServices/personaService.d.ts +39 -0
  186. package/dist/docs/docMockServices/personaService.d.ts.map +1 -0
  187. package/dist/docs/docMockServices/personaService.js +181 -0
  188. package/dist/hooks/index.d.ts +2 -0
  189. package/dist/hooks/index.d.ts.map +1 -1
  190. package/dist/hooks/index.js +1 -0
  191. package/dist/hooks/useAsyncRequest.d.ts +17 -0
  192. package/dist/hooks/useAsyncRequest.d.ts.map +1 -0
  193. package/dist/hooks/useAsyncRequest.js +70 -0
  194. package/dist/index.css +1 -1
  195. package/dist/index.d.ts +23 -1
  196. package/dist/index.d.ts.map +1 -1
  197. package/dist/index.js +11 -0
  198. package/dist/index.js.map +1 -1
  199. package/dist/templates/forms/ContactForm.js +2 -2
  200. package/dist/templates/forms/LoginForm.js +1 -1
  201. package/dist/templates/forms/RegistrationForm.js +1 -1
  202. package/dist/templates/layouts/SidebarLayout.d.ts.map +1 -1
  203. package/dist/templates/layouts/SidebarLayout.js +3 -2
  204. package/dist/templates/patterns/FormPattern.d.ts.map +1 -1
  205. package/dist/templates/patterns/FormPattern.js +4 -3
  206. package/package.json +5 -2
package/dist/App.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AAUA,OAAO,aAAa,CAAC;AAwCrB,iBAAS,GAAG,4CAoBX;AAED,eAAe,GAAG,CAAC"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AAGA,OAAO,aAAa,CAAC;AAuDrB,iBAAS,GAAG,4CAsBX;AAED,eAAe,GAAG,CAAC"}
package/dist/App.js CHANGED
@@ -1,18 +1,30 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { AppLayout, Badge, Button, Card, Collection, DataField, } from "./components";
2
+ import { Badge, Button, Card, Collection, DataField } from "./components";
3
3
  import { Routes, Route, Link } from "react-router-dom";
4
- import { ThemeProvider } from "./index";
4
+ import { AppLayoutProvider } from "./index";
5
5
  import "./index.css";
6
6
  import { DocsMenu } from "./docs/DocsMenu";
7
7
  import DocsRouter from "./docs/DocsRouter";
8
8
  import { AuthDocs } from "./docs/AuthDocs.tsx/AuthDocs";
9
+ import packageJson from "../package.json";
9
10
  function HomeContent() {
10
- return (_jsxs(_Fragment, { children: [_jsx(Card, { title: "Empleados", className: "bg-gray-50", children: _jsx(Card, { className: "w-1/2", title: "FALCONE WALTER ALDO", subtitle: "3558-03 - Titular", footer: _jsx(Button, { children: "Ver" }), headerActions: () => [
11
- _jsx(Badge, { variant: "secondary", children: "OSOCNA" }),
12
- _jsx(Badge, { variant: "secondary", children: "B\u00C1SICO" }),
13
- ], children: _jsxs(Collection, { direction: "row", gap: "1rem", wrap: true, children: [_jsx(DataField, { label: "Cuil", value: "20179902711" }), _jsx(DataField, { label: "Doc", value: "17990271" }), _jsx(DataField, { label: "F Nac", value: "23/06/1966" }), _jsx(DataField, { label: "F Alta", value: "01/03/2012" })] }) }) }), _jsx("div", { children: _jsx(AuthDocs, {}) })] }));
11
+ return (_jsxs(_Fragment, { children: [_jsx(Card, { title: "Empleados", className: "bg-gray-50", children: _jsx(Card, { className: "w-1/2", title: "FALCONE WALTER ALDO", subtitle: "3558-03 - Titular", footer: _jsx(Button, { children: "Ver" }), headerActions: _jsxs(_Fragment, { children: [_jsx(Badge, { variant: "secondary", children: "OSOCNA" }), _jsx(Badge, { variant: "secondary", children: "B\u00C1SICO" })] }), children: _jsxs(Collection, { direction: "row", gap: "1rem", wrap: true, children: [_jsx(DataField, { label: "Cuil", value: "20179902711" }), _jsx(DataField, { label: "Doc", value: "17990271" }), _jsx(DataField, { label: "F Nac", value: "23/06/1966" }), _jsx(DataField, { label: "F Alta", value: "01/03/2012" })] }) }) }), _jsx("div", { children: _jsx(AuthDocs, {}) })] }));
12
+ }
13
+ function LeftDrawerHeader() {
14
+ return (_jsx("div", { className: "h-[64px] flex flex-col justify-center px-4 bg-gray-300", children: _jsx("h2", { children: _jsx(Link, { to: "/", children: "Flysoft React UI" }) }) }));
15
+ }
16
+ function LeftDrawerFooter() {
17
+ return (_jsx("div", { className: "px-4 bg-gray-300", children: _jsxs("span", { children: ["v ", packageJson.version] }) }));
14
18
  }
15
19
  function App() {
16
- return (_jsx(ThemeProvider, { initialTheme: "light", forceInitialTheme: false, children: _jsx(AppLayout, { navBarDrawer: _jsx("div", { children: _jsx("h2", { children: _jsx(Link, { to: "/", children: "Flysoft React UI" }) }) }), leftDrawer: _jsx(DocsMenu, {}), children: _jsxs(Routes, { children: [_jsx(Route, { path: "/", element: _jsx(HomeContent, {}) }), _jsx(Route, { path: "/docs/*", element: _jsx(DocsRouter, {}) })] }) }) }));
20
+ return (_jsx(AppLayoutProvider, { initialTheme: "light", forceInitialTheme: false, initialNavbar: {
21
+ navBarLeftNode: _jsx(_Fragment, {}),
22
+ fullWidthNavbar: false,
23
+ className: "bg-gray-300 pl-0 lg:pl-8",
24
+ }, initialLeftDrawer: {
25
+ headerNode: _jsx(LeftDrawerHeader, {}),
26
+ contentNode: _jsx(DocsMenu, {}),
27
+ footerNode: _jsx(LeftDrawerFooter, {}),
28
+ }, children: _jsxs(Routes, { children: [_jsx(Route, { path: "/", element: _jsx(HomeContent, {}) }), _jsx(Route, { path: "/docs/*", element: _jsx(DocsRouter, {}) })] }) }));
17
29
  }
18
30
  export default App;
@@ -6,13 +6,14 @@ export interface AutocompleteOption {
6
6
  description?: string | number;
7
7
  icon?: string;
8
8
  }
9
- export interface AutocompleteInputProps<T = AutocompleteOption, K = string> extends Omit<InputProps, "onChange" | "value"> {
9
+ export interface AutocompleteInputProps<T = AutocompleteOption, K = string> extends Omit<InputProps, "onChange" | "value" | "ref"> {
10
10
  options: T[];
11
11
  value?: string;
12
12
  /**
13
13
  * Valor de texto del input (controlado)
14
+ * Puede ser un ChangeEventHandler (de register) o una función que recibe string (API personalizada)
14
15
  */
15
- onChange?: (value: string) => void;
16
+ onChange?: React.ChangeEventHandler<HTMLInputElement> | ((value: string) => void);
16
17
  /**
17
18
  * Callback al seleccionar una opción. Devuelve el item completo (T) y el valor mapeado (K)
18
19
  */
@@ -34,6 +35,13 @@ export interface AutocompleteInputProps<T = AutocompleteOption, K = string> exte
34
35
  * Renderizado personalizado de cada opción. Si se define, se ignora el render por defecto.
35
36
  */
36
37
  renderOption?: (item: T) => React.ReactNode;
38
+ /**
39
+ * Si es true, el input será de solo lectura. No se podrá modificar ni desplegar las opciones.
40
+ * Por defecto es false.
41
+ */
42
+ readOnly?: boolean;
37
43
  }
38
- export declare const AutocompleteInput: <T = AutocompleteOption, K = string>({ options, value, onChange, onSelectOption, noResultsText, className, getOptionLabel, getOptionValue, getOptionDescription, renderOption, ...inputProps }: AutocompleteInputProps<T, K>) => import("react/jsx-runtime").JSX.Element;
44
+ export declare const AutocompleteInput: <T = AutocompleteOption, K = string>(props: AutocompleteInputProps<T, K> & {
45
+ ref?: React.ForwardedRef<HTMLInputElement>;
46
+ }) => React.ReactElement;
39
47
  //# sourceMappingURL=AutocompleteInput.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteInput.d.ts","sourceRoot":"","sources":["../../../src/components/form-controls/AutocompleteInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB,CAAC,CAAC,GAAG,kBAAkB,EAAE,CAAC,GAAG,MAAM,CACxE,SAAQ,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC;IAC9C,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IACrC;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;IAChC;;OAEG;IACH,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAChE;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC;CAC7C;AAED,eAAO,MAAM,iBAAiB,GAAI,CAAC,GAAG,kBAAkB,EAAE,CAAC,GAAG,MAAM,EAAE,2JAYnE,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,4CAoM9B,CAAC"}
1
+ {"version":3,"file":"AutocompleteInput.d.ts","sourceRoot":"","sources":["../../../src/components/form-controls/AutocompleteInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAI1C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB,CAAC,CAAC,GAAG,kBAAkB,EAAE,CAAC,GAAG,MAAM,CACxE,SAAQ,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,GAAG,KAAK,CAAC;IACtD,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EACL,KAAK,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,GAC1C,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC;IAC9B;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IACrC;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;IAChC;;OAEG;IACH,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAChE;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC;IAC5C;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAkqBD,eAAO,MAAM,iBAAiB,EAA6B,CACzD,CAAC,GAAG,kBAAkB,EACtB,CAAC,GAAG,MAAM,EAEV,KAAK,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;IACpC,GAAG,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;CAC5C,KACE,KAAK,CAAC,YAAY,CAAC"}
@@ -1,12 +1,29 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import React from "react";
3
+ import { createPortal } from "react-dom";
3
4
  import { Input } from "./Input";
4
- export const AutocompleteInput = ({ options, value, onChange, onSelectOption, noResultsText = "Sin resultados", className = "", getOptionLabel, getOptionValue, getOptionDescription, renderOption, ...inputProps }) => {
5
+ import { normalizeIconClass } from "../utils/iconUtils";
6
+ const AutocompleteInputInner = React.forwardRef(({ options, value, onChange, onSelectOption, noResultsText = "Sin resultados", className = "", getOptionLabel, getOptionValue, getOptionDescription, renderOption, readOnly = false, ...inputProps }, ref) => {
5
7
  const [internalValue, setInternalValue] = React.useState(value || "");
8
+ const [displayValue, setDisplayValue] = React.useState("");
6
9
  const [isOpen, setIsOpen] = React.useState(false);
7
10
  const [highlightedIndex, setHighlightedIndex] = React.useState(-1);
11
+ const [dropdownPosition, setDropdownPosition] = React.useState(null);
8
12
  const containerRef = React.useRef(null);
9
- const inputValue = value !== undefined ? value : internalValue;
13
+ const dropdownRef = React.useRef(null);
14
+ const inputRef = React.useRef(null);
15
+ const justClearedRef = React.useRef(false);
16
+ // Detectar si estamos en modo register: si viene 'name' de register, estamos en modo register
17
+ // register siempre pasa 'name', 'onChange', 'onBlur', y 'ref'
18
+ const isRegisterMode = React.useMemo(() => {
19
+ // Si viene 'name' en inputProps, es porque viene de register
20
+ return "name" in inputProps && inputProps.name !== undefined;
21
+ }, [inputProps]);
22
+ const inputValue = isRegisterMode
23
+ ? displayValue
24
+ : value !== undefined
25
+ ? value
26
+ : internalValue;
10
27
  const labelGetter = React.useCallback((item) => {
11
28
  if (getOptionLabel)
12
29
  return getOptionLabel(item);
@@ -35,26 +52,191 @@ export const AutocompleteInput = ({ options, value, onChange, onSelectOption, no
35
52
  return label.includes(search) || optionValue.includes(search);
36
53
  });
37
54
  }, [inputValue, options, labelGetter, valueGetter]);
55
+ // Función helper para sincronizar displayValue con el valor del formulario
56
+ const syncDisplayValue = React.useCallback(() => {
57
+ if (isRegisterMode && inputRef.current) {
58
+ const formValue = inputRef.current.value;
59
+ // Si el valor del formulario coincide con algún getOptionValue, mostrar su label
60
+ const matchingOption = options.find((option) => String(valueGetter(option)) === String(formValue));
61
+ if (matchingOption) {
62
+ const label = labelGetter(matchingOption);
63
+ setDisplayValue(label);
64
+ return true; // Indica que se encontró y sincronizó un valor
65
+ }
66
+ else if (formValue) {
67
+ // Si hay un valor pero no coincide, mostrarlo tal cual
68
+ setDisplayValue(formValue);
69
+ return true;
70
+ }
71
+ else {
72
+ setDisplayValue("");
73
+ return false; // No hay valor aún
74
+ }
75
+ }
76
+ return false;
77
+ }, [isRegisterMode, options, valueGetter, labelGetter]);
78
+ // Sincronizar displayValue con el valor del formulario en modo register
79
+ // Usar un intervalo que se ejecute hasta que encuentre el valor o hasta un máximo de intentos
80
+ React.useEffect(() => {
81
+ if (isRegisterMode) {
82
+ let attempts = 0;
83
+ const maxAttempts = 50; // Intentar durante ~5 segundos (50 * 100ms)
84
+ // Función que intenta sincronizar y retorna true si encontró un valor
85
+ const trySync = () => {
86
+ if (inputRef.current) {
87
+ const formValue = inputRef.current.value;
88
+ if (formValue) {
89
+ // Hay un valor, intentar sincronizar
90
+ const matchingOption = options.find((option) => String(valueGetter(option)) === String(formValue));
91
+ if (matchingOption) {
92
+ const label = labelGetter(matchingOption);
93
+ setDisplayValue(label);
94
+ return true; // Valor encontrado y sincronizado
95
+ }
96
+ else {
97
+ setDisplayValue(formValue);
98
+ return true; // Valor encontrado pero no coincide con opciones
99
+ }
100
+ }
101
+ }
102
+ return false; // No hay valor aún
103
+ };
104
+ // Intentar inmediatamente
105
+ if (trySync()) {
106
+ return; // Ya encontramos el valor
107
+ }
108
+ // Si no encontramos el valor, usar un intervalo para seguir intentando
109
+ const intervalId = window.setInterval(() => {
110
+ attempts++;
111
+ if (trySync() || attempts >= maxAttempts) {
112
+ clearInterval(intervalId);
113
+ }
114
+ }, 100); // Intentar cada 100ms
115
+ // También usar timeouts como fallback
116
+ const timeouts = [];
117
+ [0, 50, 100, 200, 500, 1000].forEach((delay) => {
118
+ const timeoutId = window.setTimeout(() => {
119
+ trySync();
120
+ }, delay);
121
+ timeouts.push(timeoutId);
122
+ });
123
+ return () => {
124
+ clearInterval(intervalId);
125
+ timeouts.forEach(clearTimeout);
126
+ };
127
+ }
128
+ }, [isRegisterMode, options, valueGetter, labelGetter]);
129
+ // También escuchar cambios en el input nativo para sincronizar cuando cambie
130
+ React.useEffect(() => {
131
+ if (isRegisterMode && inputRef.current) {
132
+ const input = inputRef.current;
133
+ // Función para sincronizar cuando el input cambia
134
+ const handleInputSync = () => {
135
+ syncDisplayValue();
136
+ };
137
+ // Escuchar eventos de input y change
138
+ input.addEventListener("input", handleInputSync);
139
+ input.addEventListener("change", handleInputSync);
140
+ // También usar MutationObserver para detectar cambios en el atributo value
141
+ const observer = new MutationObserver(() => {
142
+ syncDisplayValue();
143
+ });
144
+ observer.observe(input, {
145
+ attributes: true,
146
+ attributeFilter: ["value"],
147
+ });
148
+ return () => {
149
+ input.removeEventListener("input", handleInputSync);
150
+ input.removeEventListener("change", handleInputSync);
151
+ observer.disconnect();
152
+ };
153
+ }
154
+ }, [isRegisterMode, syncDisplayValue]);
38
155
  const handleChange = (event) => {
156
+ if (readOnly)
157
+ return;
39
158
  const newValue = event.target.value;
40
- if (value === undefined) {
41
- setInternalValue(newValue);
159
+ if (isRegisterMode) {
160
+ // En modo register, actualizar el displayValue para mostrar lo que el usuario escribe
161
+ setDisplayValue(newValue);
162
+ }
163
+ else {
164
+ // Modo API personalizada
165
+ if (value === undefined) {
166
+ setInternalValue(newValue);
167
+ }
168
+ if (onChange) {
169
+ onChange(newValue);
170
+ }
42
171
  }
43
- onChange?.(newValue);
44
172
  setIsOpen(true);
45
173
  setHighlightedIndex(-1);
46
174
  };
47
175
  const handleSelect = (option) => {
176
+ if (readOnly)
177
+ return;
48
178
  const label = labelGetter(option);
49
179
  const selectedValue = valueGetter(option);
50
- if (value === undefined) {
51
- setInternalValue(label);
180
+ const valueString = String(selectedValue ?? "");
181
+ if (isRegisterMode) {
182
+ // En modo register:
183
+ // 1. Actualizar el input nativo con el valor (para que react-hook-form lo capture)
184
+ // 2. Actualizar displayValue con el label (para mostrarlo visualmente)
185
+ if (inputRef.current) {
186
+ const nativeInput = inputRef.current;
187
+ // Actualizar el valor del input directamente usando el setter nativo
188
+ // Esto evita que React sobrescriba el valor inmediatamente
189
+ const nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value")?.set;
190
+ if (nativeInputValueSetter) {
191
+ nativeInputValueSetter.call(nativeInput, valueString);
192
+ }
193
+ else {
194
+ // Fallback si el setter no está disponible
195
+ nativeInput.value = valueString;
196
+ }
197
+ // IMPORTANTE: Llamar al onChange de register DESPUÉS de actualizar el input
198
+ // El evento debe tener el input nativo como target con el valor ya actualizado
199
+ if (onChange) {
200
+ // Crear un evento que tenga el input nativo como target
201
+ // react-hook-form leerá el valor desde event.target.value
202
+ const changeEvent = {
203
+ target: nativeInput,
204
+ currentTarget: nativeInput,
205
+ };
206
+ onChange(changeEvent);
207
+ }
208
+ // También disparar eventos nativos para asegurar que todo esté sincronizado
209
+ // Estos eventos son importantes para la validación y el estado del formulario
210
+ const inputEvent = new Event("input", {
211
+ bubbles: true,
212
+ cancelable: true,
213
+ });
214
+ nativeInput.dispatchEvent(inputEvent);
215
+ const changeEventNative = new Event("change", {
216
+ bubbles: true,
217
+ cancelable: true,
218
+ });
219
+ nativeInput.dispatchEvent(changeEventNative);
220
+ }
221
+ // Actualizar el displayValue para mostrar el label
222
+ setDisplayValue(label);
223
+ }
224
+ else {
225
+ // Modo API personalizada - comportamiento original
226
+ if (value === undefined) {
227
+ setInternalValue(label);
228
+ }
229
+ // Pasar el valor devuelto por getOptionValue, no el label
230
+ if (onChange) {
231
+ onChange(valueString);
232
+ }
52
233
  }
53
- onChange?.(label);
54
234
  onSelectOption?.(option, selectedValue);
55
235
  setIsOpen(false);
56
236
  };
57
237
  const handleKeyDown = (event) => {
238
+ if (readOnly)
239
+ return;
58
240
  if (!isOpen && (event.key === "ArrowDown" || event.key === "ArrowUp")) {
59
241
  setIsOpen(true);
60
242
  return;
@@ -70,44 +252,242 @@ export const AutocompleteInput = ({ options, value, onChange, onSelectOption, no
70
252
  setHighlightedIndex((prev) => prev > 0 ? prev - 1 : filteredOptions.length - 1);
71
253
  }
72
254
  else if (event.key === "Enter") {
73
- if (highlightedIndex >= 0 && highlightedIndex < filteredOptions.length) {
255
+ // Si hay una opción resaltada, seleccionarla
256
+ if (highlightedIndex >= 0 &&
257
+ highlightedIndex < filteredOptions.length) {
74
258
  event.preventDefault();
75
259
  handleSelect(filteredOptions[highlightedIndex]);
76
260
  }
261
+ else if (isOpen && filteredOptions.length > 0) {
262
+ // Si no hay opción resaltada pero hay opciones disponibles, seleccionar la primera
263
+ event.preventDefault();
264
+ handleSelect(filteredOptions[0]);
265
+ }
77
266
  }
78
267
  else if (event.key === "Escape") {
79
268
  setIsOpen(false);
80
269
  }
81
270
  };
82
271
  React.useEffect(() => {
272
+ if (!isOpen)
273
+ return;
83
274
  const handleClickOutside = (event) => {
84
- if (containerRef.current &&
85
- !containerRef.current.contains(event.target)) {
275
+ const target = event.target;
276
+ const isClickInsideContainer = containerRef.current?.contains(target);
277
+ const isClickInsideDropdown = dropdownRef.current?.contains(target);
278
+ if (!isClickInsideContainer && !isClickInsideDropdown) {
86
279
  setIsOpen(false);
87
280
  }
88
281
  };
89
- document.addEventListener("mousedown", handleClickOutside);
282
+ // Pequeño delay para asegurar que el portal esté montado
283
+ const timer = setTimeout(() => {
284
+ document.addEventListener("mousedown", handleClickOutside);
285
+ }, 0);
90
286
  return () => {
287
+ clearTimeout(timer);
91
288
  document.removeEventListener("mousedown", handleClickOutside);
92
289
  };
93
- }, []);
290
+ }, [isOpen]);
291
+ React.useEffect(() => {
292
+ if (!isRegisterMode) {
293
+ // Solo para modo API personalizada
294
+ if (value !== undefined) {
295
+ // Si el value es el resultado de getOptionValue, buscar la opción correspondiente
296
+ // y mostrar su label. Si no se encuentra, mostrar el value tal cual.
297
+ const matchingOption = options.find((option) => String(valueGetter(option)) === String(value));
298
+ if (matchingOption) {
299
+ setInternalValue(labelGetter(matchingOption));
300
+ }
301
+ else {
302
+ setInternalValue(value);
303
+ }
304
+ }
305
+ else {
306
+ // Resetear el estado interno cuando value es undefined (por ejemplo, después de un reset)
307
+ setInternalValue("");
308
+ }
309
+ }
310
+ }, [value, options, valueGetter, labelGetter, isRegisterMode]);
311
+ const showDropdown = !readOnly && isOpen && (filteredOptions.length > 0 || noResultsText);
312
+ // Verificar que estamos en el navegador
313
+ // Inicializar isMounted de forma síncrona si es posible
314
+ const [isMounted, setIsMounted] = React.useState(() => {
315
+ return typeof document !== "undefined" && !!document.body;
316
+ });
94
317
  React.useEffect(() => {
95
- if (value !== undefined) {
96
- setInternalValue(value);
97
- }
98
- }, [value]);
99
- const showDropdown = isOpen && (filteredOptions.length > 0 || noResultsText);
100
- return (_jsxs("div", { ref: containerRef, className: "relative w-full", children: [_jsx(Input, { ...inputProps, value: inputValue, onChange: handleChange, onFocus: () => setIsOpen(true), onKeyDown: handleKeyDown, className: className, autoComplete: "off" }), showDropdown && (_jsx("div", { className: "absolute z-20 mt-1 w-full rounded-md border border-[var(--color-border-default)] \r\n bg-[var(--color-bg-default)] shadow-[var(--shadow-lg)] max-h-60 overflow-auto", children: filteredOptions.length > 0 ? (_jsx("ul", { className: "py-1", children: filteredOptions.map((option, index) => {
101
- const label = labelGetter(option);
102
- const description = descriptionGetter(option);
103
- const anyOption = option;
104
- return (_jsx("li", { className: `px-3 py-2 cursor-pointer flex items-start gap-2 text-sm
318
+ if (!isMounted && typeof document !== "undefined" && document.body) {
319
+ setIsMounted(true);
320
+ }
321
+ }, [isMounted]);
322
+ // Actualizar posición del dropdown cuando se abre
323
+ React.useEffect(() => {
324
+ if (showDropdown && containerRef.current && isMounted) {
325
+ const updatePosition = () => {
326
+ const rect = containerRef.current?.getBoundingClientRect();
327
+ if (rect) {
328
+ setDropdownPosition({
329
+ top: rect.bottom + window.scrollY + 4,
330
+ left: rect.left + window.scrollX,
331
+ width: rect.width,
332
+ });
333
+ }
334
+ };
335
+ updatePosition();
336
+ window.addEventListener("scroll", updatePosition, true);
337
+ window.addEventListener("resize", updatePosition);
338
+ return () => {
339
+ window.removeEventListener("scroll", updatePosition, true);
340
+ window.removeEventListener("resize", updatePosition);
341
+ };
342
+ }
343
+ else {
344
+ setDropdownPosition(null);
345
+ }
346
+ }, [showDropdown, isMounted]);
347
+ // Detectar si hay un valor seleccionado
348
+ // Un valor está seleccionado si el value coincide con el getOptionValue de alguna opción
349
+ const hasSelectedValue = React.useMemo(() => {
350
+ if (isRegisterMode && inputRef.current) {
351
+ const formValue = inputRef.current.value;
352
+ if (!formValue)
353
+ return false;
354
+ return options.some((option) => String(valueGetter(option)) === String(formValue));
355
+ }
356
+ if (value === undefined || value === null || value === "")
357
+ return false;
358
+ // Verificar si el value coincide con el getOptionValue de alguna opción
359
+ return options.some((option) => String(valueGetter(option)) === String(value));
360
+ }, [value, options, valueGetter, isRegisterMode]);
361
+ // Función para limpiar el valor
362
+ const handleClear = React.useCallback((event) => {
363
+ if (readOnly)
364
+ return;
365
+ event.preventDefault();
366
+ event.stopPropagation();
367
+ // Marcar que acabamos de limpiar para prevenir que onFocus abra el diálogo
368
+ justClearedRef.current = true;
369
+ if (isRegisterMode) {
370
+ // En modo register, limpiar el input nativo y disparar eventos
371
+ if (inputRef.current) {
372
+ const nativeInput = inputRef.current;
373
+ const setter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value")?.set;
374
+ setter?.call(nativeInput, "");
375
+ // Disparar eventos para que react-hook-form lo capture
376
+ const inputEvent = new Event("input", { bubbles: true });
377
+ nativeInput.dispatchEvent(inputEvent);
378
+ const changeEvent = new Event("change", { bubbles: true });
379
+ nativeInput.dispatchEvent(changeEvent);
380
+ }
381
+ // Limpiar el displayValue
382
+ setDisplayValue("");
383
+ // Llamar al onChange de register
384
+ if (onChange && inputRef.current) {
385
+ const changeEvent = {
386
+ target: inputRef.current,
387
+ currentTarget: inputRef.current,
388
+ };
389
+ onChange(changeEvent);
390
+ }
391
+ }
392
+ else {
393
+ // Modo API personalizada
394
+ if (value === undefined) {
395
+ setInternalValue("");
396
+ }
397
+ if (onChange) {
398
+ onChange("");
399
+ }
400
+ }
401
+ setIsOpen(false);
402
+ // Resetear el flag después de un pequeño delay para permitir que otros eventos se procesen
403
+ setTimeout(() => {
404
+ justClearedRef.current = false;
405
+ }, 100);
406
+ }, [value, onChange, isRegisterMode, readOnly]);
407
+ // Determinar qué ícono mostrar: si hay valor seleccionado, mostrar "X", sino usar el ícono original
408
+ // Si está en readOnly, no mostrar el ícono de limpiar ni permitir clicks
409
+ const displayIcon = readOnly
410
+ ? inputProps.icon
411
+ : hasSelectedValue
412
+ ? "fa-times"
413
+ : inputProps.icon;
414
+ const displayIconPosition = readOnly
415
+ ? inputProps.iconPosition || "left"
416
+ : hasSelectedValue
417
+ ? "right"
418
+ : inputProps.iconPosition || "left";
419
+ const displayOnIconClick = readOnly
420
+ ? undefined
421
+ : hasSelectedValue
422
+ ? handleClear
423
+ : inputProps.onIconClick;
424
+ // Combinar refs: el ref del componente y el ref interno
425
+ const combinedRef = React.useCallback((node) => {
426
+ inputRef.current = node;
427
+ if (typeof ref === "function") {
428
+ ref(node);
429
+ }
430
+ else if (ref) {
431
+ ref.current = node;
432
+ }
433
+ // Cuando el ref se establece en modo register, sincronizar el displayValue
434
+ // Esto es importante para valores por defecto que vienen del formulario
435
+ if (isRegisterMode && node) {
436
+ // Intentar múltiples veces con diferentes delays
437
+ // react-hook-form puede establecer el valor en diferentes momentos
438
+ [0, 10, 50, 100, 200, 500].forEach((delay) => {
439
+ setTimeout(() => {
440
+ if (node && inputRef.current === node) {
441
+ const formValue = node.value;
442
+ if (formValue) {
443
+ const matchingOption = options.find((option) => String(valueGetter(option)) === String(formValue));
444
+ if (matchingOption) {
445
+ setDisplayValue(labelGetter(matchingOption));
446
+ }
447
+ else {
448
+ setDisplayValue(formValue);
449
+ }
450
+ }
451
+ }
452
+ }, delay);
453
+ });
454
+ }
455
+ }, [ref, isRegisterMode, options, valueGetter, labelGetter]);
456
+ return (_jsxs("div", { ref: containerRef, className: "relative w-full", children: [_jsx(Input, { ...inputProps, ref: combinedRef, value: inputValue, onChange: handleChange, onFocus: () => {
457
+ if (!readOnly && !justClearedRef.current) {
458
+ setIsOpen(true);
459
+ }
460
+ }, onKeyDown: handleKeyDown, className: className, icon: displayIcon, iconPosition: displayIconPosition, onIconClick: displayOnIconClick, readOnly: readOnly }), (() => {
461
+ // Verificar de forma segura que document.body existe y es válido
462
+ const bodyElement = typeof document !== "undefined" &&
463
+ document.body &&
464
+ document.body instanceof HTMLElement
465
+ ? document.body
466
+ : null;
467
+ return (showDropdown &&
468
+ dropdownPosition &&
469
+ isMounted &&
470
+ bodyElement &&
471
+ createPortal(_jsx("div", { ref: dropdownRef, className: "fixed z-[2001] min-w-full w-max rounded-md border border-[var(--color-border-default)] \r\n bg-[var(--color-bg-default)] shadow-[var(--shadow-lg)] max-h-60 overflow-auto", style: {
472
+ top: `${dropdownPosition.top}px`,
473
+ left: `${dropdownPosition.left}px`,
474
+ minWidth: `${dropdownPosition.width}px`,
475
+ }, children: filteredOptions.length > 0 ? (_jsx("ul", { className: "py-1", children: filteredOptions.map((option, index) => {
476
+ const label = labelGetter(option);
477
+ const description = descriptionGetter(option);
478
+ const anyOption = option;
479
+ return (_jsx("li", { className: `px-3 py-2 cursor-pointer flex items-start gap-2 text-sm
105
480
  ${index === highlightedIndex
106
- ? "bg-[var(--color-primary-soft)] text-[var(--color-primary)]"
107
- : "text-[var(--color-text-primary)] hover:bg-[var(--color-bg-secondary)]"}`, onMouseDown: (event) => {
108
- event.preventDefault();
109
- handleSelect(option);
110
- }, onMouseEnter: () => setHighlightedIndex(index), children: renderOption ? (renderOption(option)) : (_jsxs(_Fragment, { children: [anyOption.icon && (_jsx("i", { className: `fa ${anyOption.icon} mt-0.5 text-[var(--color-text-muted)]` })), _jsxs("div", { className: "flex flex-col", children: [_jsx("span", { className: "font-[var(--font-default)]", children: label }), description !== undefined &&
111
- description !== null && (_jsx("span", { className: "text-xs text-[var(--color-text-secondary)]", children: description }))] })] })) }, String(valueGetter(option) ?? label ?? index)));
112
- }) })) : (_jsx("div", { className: "px-3 py-2 text-sm text-[var(--color-text-secondary)]", children: noResultsText })) }))] }));
113
- };
481
+ ? "bg-[var(--color-primary-soft)] text-[var(--color-primary)]"
482
+ : "text-[var(--color-text-primary)] hover:bg-[var(--color-bg-secondary)]"}`, onMouseDown: (event) => {
483
+ event.preventDefault();
484
+ handleSelect(option);
485
+ }, onMouseEnter: () => setHighlightedIndex(index), children: renderOption ? (renderOption(option)) : (_jsxs(_Fragment, { children: [anyOption.icon && (_jsx("i", { className: `${normalizeIconClass(anyOption.icon)} mt-0.5 text-[var(--color-text-muted)] flex-shrink-0` })), _jsxs("div", { className: "flex flex-col min-w-0", children: [_jsx("span", { className: "font-[var(--font-default)] whitespace-nowrap", children: label }), description !== undefined &&
486
+ description !== null && (_jsx("span", { className: "text-xs text-[var(--color-text-secondary)] break-words", children: description }))] })] })) }, String(valueGetter(option) ?? label ?? index)));
487
+ }) })) : (_jsx("div", { className: "px-3 py-2 text-sm text-[var(--color-text-secondary)]", children: noResultsText })) }), bodyElement));
488
+ })()] }));
489
+ });
490
+ // Asignar displayName antes del cast genérico
491
+ AutocompleteInputInner.displayName = "AutocompleteInput";
492
+ // Exportar con el cast genérico
493
+ export const AutocompleteInput = AutocompleteInputInner;
@@ -2,6 +2,9 @@ import React from "react";
2
2
  export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
3
3
  variant?: "primary" | "outline" | "ghost";
4
4
  size?: "sm" | "md" | "lg";
5
+ color?: "primary" | "secondary" | "success" | "warning" | "danger" | "info";
6
+ bg?: string;
7
+ textColor?: string;
5
8
  icon?: string;
6
9
  iconPosition?: "left" | "right";
7
10
  loading?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/components/form-controls/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,WACf,SAAQ,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;IACrD,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAC1C,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AASD,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAiHxC,CAAC"}
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/components/form-controls/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAkC1B,MAAM,WAAW,WACf,SAAQ,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;IACrD,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAC1C,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC5E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AASD,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAwPxC,CAAC"}