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
@@ -0,0 +1,98 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { createContext, useContext, useState, useCallback, } from "react";
3
+ import { ThemeProvider, useTheme } from "./ThemeContext";
4
+ import { AppLayout } from "../components/layout/AppLayout";
5
+ import { SnackbarProvider } from "./SnackbarContext";
6
+ import { SnackbarContainer } from "../components/utils/SnackbarContainer";
7
+ const AppLayoutContext = createContext(undefined);
8
+ // Internal component that uses ThemeContext and provides AppLayoutContext
9
+ const AppLayoutProviderInner = ({ children, initialNavbar, initialLeftDrawer, initialClassName }) => {
10
+ // Get theme context
11
+ const themeContext = useTheme();
12
+ // Layout state - ensure default height is set
13
+ const [navbar, setNavbar] = useState(() => {
14
+ const defaultNavbar = { fullWidthNavbar: true, height: "64px" };
15
+ if (initialNavbar) {
16
+ return { ...defaultNavbar, ...initialNavbar };
17
+ }
18
+ return defaultNavbar;
19
+ });
20
+ const [leftDrawer, setLeftDrawer] = useState(initialLeftDrawer || {});
21
+ const [className, setClassName] = useState(initialClassName || "");
22
+ // Memoize setters to avoid unnecessary re-renders
23
+ const handleSetNavbar = useCallback((newNavbar) => {
24
+ setNavbar(newNavbar);
25
+ }, []);
26
+ const handleSetLeftDrawer = useCallback((newLeftDrawer) => {
27
+ setLeftDrawer(newLeftDrawer);
28
+ }, []);
29
+ const handleSetClassName = useCallback((newClassName) => {
30
+ setClassName(newClassName);
31
+ }, []);
32
+ // Setters para actualizar solo los nodos del navbar
33
+ const handleSetNavBarLeftNode = useCallback((node) => {
34
+ setNavbar((prev) => {
35
+ if (!prev) {
36
+ // Si no hay navbar previo, crear uno nuevo con valores por defecto
37
+ return {
38
+ fullWidthNavbar: true,
39
+ height: "64px",
40
+ navBarLeftNode: node,
41
+ };
42
+ }
43
+ return {
44
+ ...prev,
45
+ navBarLeftNode: node,
46
+ };
47
+ });
48
+ }, []);
49
+ const handleSetNavbarRightNode = useCallback((node) => {
50
+ setNavbar((prev) => {
51
+ if (!prev) {
52
+ // Si no hay navbar previo, crear uno nuevo con valores por defecto
53
+ return {
54
+ fullWidthNavbar: true,
55
+ height: "64px",
56
+ navBarRightNode: node,
57
+ };
58
+ }
59
+ return {
60
+ ...prev,
61
+ navBarRightNode: node,
62
+ };
63
+ });
64
+ }, []);
65
+ const value = {
66
+ // Theme context values
67
+ ...themeContext,
68
+ // Layout state
69
+ navbar,
70
+ leftDrawer,
71
+ className,
72
+ // Layout setters
73
+ setNavbar: handleSetNavbar,
74
+ setLeftDrawer: handleSetLeftDrawer,
75
+ setClassName: handleSetClassName,
76
+ setNavBarLeftNode: handleSetNavBarLeftNode,
77
+ setNavbarRightNode: handleSetNavbarRightNode,
78
+ };
79
+ return (_jsx(AppLayoutContext.Provider, { value: value, children: _jsx(AppLayout, { navbar: navbar, leftDrawer: leftDrawer, className: className, children: children }) }));
80
+ };
81
+ export const AppLayoutProvider = ({ children, initialTheme = "light", storageKey = "flysoft-theme", forceInitialTheme = false, initialNavbar, initialLeftDrawer, className = "", }) => {
82
+ return (_jsx(ThemeProvider, { initialTheme: initialTheme, storageKey: storageKey, forceInitialTheme: forceInitialTheme, children: _jsxs(SnackbarProvider, { children: [_jsx(AppLayoutProviderInner, { initialNavbar: initialNavbar, initialLeftDrawer: initialLeftDrawer, initialClassName: className, children: children }), _jsx(SnackbarContainer, { position: "bottom-right" })] }) }));
83
+ };
84
+ // Hook to use AppLayout context
85
+ // eslint-disable-next-line react-refresh/only-export-components
86
+ export const useAppLayout = () => {
87
+ const context = useContext(AppLayoutContext);
88
+ if (context === undefined) {
89
+ throw new Error("useAppLayout must be used within an AppLayoutProvider");
90
+ }
91
+ return context;
92
+ };
93
+ // Hook to check if AppLayout context is available
94
+ // eslint-disable-next-line react-refresh/only-export-components
95
+ export const useAppLayoutContext = () => {
96
+ const context = useContext(AppLayoutContext);
97
+ return context !== undefined;
98
+ };
@@ -0,0 +1,50 @@
1
+ import { type ReactNode } from "react";
2
+ import { type PaginationInterface } from "../components/form-controls/Pagination";
3
+ export interface ListCrudContextType<T> {
4
+ list: Array<T> | undefined;
5
+ page: number;
6
+ pages: number;
7
+ total: number;
8
+ limit: number;
9
+ isLoading: boolean;
10
+ pagination: ReactNode;
11
+ params: Record<string, any>;
12
+ fetchItems: {
13
+ execute: (params?: Record<string, any>) => Promise<void>;
14
+ isLoading: boolean;
15
+ };
16
+ createItem: {
17
+ execute: (item: T) => Promise<T | undefined | null>;
18
+ isLoading: boolean;
19
+ };
20
+ updateItem: {
21
+ execute: (item: T) => Promise<T | undefined | null>;
22
+ isLoading: boolean;
23
+ };
24
+ deleteItem: {
25
+ execute: (item: T) => Promise<void>;
26
+ isLoading: boolean;
27
+ };
28
+ }
29
+ export declare const ListCrudContext: import("react").Context<ListCrudContextType<any> | undefined>;
30
+ export interface PromiseWithOptions<TResult, TParams extends any[] = []> {
31
+ execute: (...params: TParams) => Promise<TResult>;
32
+ successMessage?: string;
33
+ errorMessage?: string;
34
+ }
35
+ interface ListCrudProviderProps<T> {
36
+ children: ReactNode;
37
+ getPromise: ((params?: Record<string, any>) => Promise<Array<T> | PaginationInterface<T> | undefined>) | PromiseWithOptions<Array<T> | PaginationInterface<T> | undefined, [
38
+ params?: Record<string, any>
39
+ ]>;
40
+ postPromise?: ((item: T) => Promise<T | undefined | null>) | PromiseWithOptions<T | undefined | null, [item: T]>;
41
+ putPromise?: ((item: T) => Promise<T | undefined | null>) | PromiseWithOptions<T | undefined | null, [item: T]>;
42
+ deletePromise?: ((item: T) => Promise<void>) | PromiseWithOptions<void, [item: T]>;
43
+ urlParams?: Array<string>;
44
+ limit?: number;
45
+ pageParam?: string;
46
+ }
47
+ export declare function ListCrudProvider<T>({ children, getPromise, postPromise, putPromise, deletePromise, limit, pageParam, urlParams, }: ListCrudProviderProps<T>): import("react/jsx-runtime").JSX.Element;
48
+ export declare function useListCrud<T>(): ListCrudContextType<T>;
49
+ export {};
50
+ //# sourceMappingURL=ListCrudContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListCrudContext.d.ts","sourceRoot":"","sources":["../../src/contexts/ListCrudContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,wCAAwC,CAAC;AAGhD,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,SAAS,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,UAAU,EAAE;QACV,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACzD,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,UAAU,EAAE;QACV,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;QACpD,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,UAAU,EAAE;QACV,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;QACpD,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,UAAU,EAAE;QACV,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AAQD,eAAO,MAAM,eAAe,+DAA+B,CAAC;AAE5D,MAAM,WAAW,kBAAkB,CAAC,OAAO,EAAE,OAAO,SAAS,GAAG,EAAE,GAAG,EAAE;IACrE,OAAO,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,qBAAqB,CAAC,CAAC;IAC/B,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,EACN,CAAC,CACC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACzB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAC5D,kBAAkB,CAChB,KAAK,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,SAAS,EAC7C;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;KAAC,CAC/B,CAAC;IACN,WAAW,CAAC,EACR,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,GAC5C,kBAAkB,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,UAAU,CAAC,EACP,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,GAC5C,kBAAkB,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,aAAa,CAAC,EACV,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAC5B,kBAAkB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,EAClC,QAAQ,EACR,UAAU,EACV,WAAW,EACX,UAAU,EACV,aAAa,EACb,KAAU,EACV,SAAoB,EACpB,SAAc,GACf,EAAE,qBAAqB,CAAC,CAAC,CAAC,2CAqT1B;AAID,wBAAgB,WAAW,CAAC,CAAC,KAAK,mBAAmB,CAAC,CAAC,CAAC,CAMvD"}
@@ -0,0 +1,253 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useEffect, useMemo, useRef, useState, useCallback, } from "react";
3
+ import { useSearchParams } from "react-router-dom";
4
+ import { Pagination, } from "../components/form-controls/Pagination";
5
+ import { useAsyncRequest } from "../hooks/useAsyncRequest";
6
+ const createListCrudContext = () => {
7
+ return createContext(undefined);
8
+ };
9
+ // Crear el contexto con un tipo genérico por defecto
10
+ // Los usuarios pueden crear su propio contexto con su tipo específico
11
+ export const ListCrudContext = createListCrudContext();
12
+ export function ListCrudProvider({ children, getPromise, postPromise, putPromise, deletePromise, limit = 15, pageParam = "pagina", urlParams = [], }) {
13
+ const [list, setList] = useState(undefined);
14
+ const [page, setPage] = useState(1);
15
+ const [pages, setPages] = useState(1);
16
+ const [total, setTotal] = useState(0);
17
+ const [searchParams, setSearchParams] = useSearchParams();
18
+ const lastFetchParamsRef = useRef("");
19
+ // Extraer funciones execute y opciones de las promises
20
+ const getPromiseExecute = typeof getPromise === "function" ? getPromise : getPromise.execute;
21
+ const getPromiseSuccessMessage = typeof getPromise === "function" ? undefined : getPromise.successMessage;
22
+ const getPromiseErrorMessage = typeof getPromise === "function" ? undefined : getPromise.errorMessage;
23
+ const postPromiseExecute = postPromise
24
+ ? typeof postPromise === "function"
25
+ ? postPromise
26
+ : postPromise.execute
27
+ : undefined;
28
+ const postPromiseSuccessMessage = postPromise && typeof postPromise === "object"
29
+ ? postPromise.successMessage
30
+ : undefined;
31
+ const postPromiseErrorMessage = postPromise && typeof postPromise === "object"
32
+ ? postPromise.errorMessage
33
+ : undefined;
34
+ const putPromiseExecute = putPromise
35
+ ? typeof putPromise === "function"
36
+ ? putPromise
37
+ : putPromise.execute
38
+ : undefined;
39
+ const putPromiseSuccessMessage = putPromise && typeof putPromise === "object"
40
+ ? putPromise.successMessage
41
+ : undefined;
42
+ const putPromiseErrorMessage = putPromise && typeof putPromise === "object"
43
+ ? putPromise.errorMessage
44
+ : undefined;
45
+ const deletePromiseExecute = deletePromise
46
+ ? typeof deletePromise === "function"
47
+ ? deletePromise
48
+ : deletePromise.execute
49
+ : undefined;
50
+ const deletePromiseSuccessMessage = deletePromise && typeof deletePromise === "object"
51
+ ? deletePromise.successMessage
52
+ : undefined;
53
+ const deletePromiseErrorMessage = deletePromise && typeof deletePromise === "object"
54
+ ? deletePromise.errorMessage
55
+ : undefined;
56
+ const getPromiseRef = useRef(getPromiseExecute);
57
+ // Hooks para manejar las peticiones asíncronas con mensajes opcionales
58
+ const fetchDataAsync = useAsyncRequest({
59
+ successMessage: getPromiseSuccessMessage,
60
+ errorMessage: getPromiseErrorMessage,
61
+ });
62
+ const createItemAsync = useAsyncRequest({
63
+ successMessage: postPromiseSuccessMessage,
64
+ errorMessage: postPromiseErrorMessage,
65
+ });
66
+ const updateItemAsync = useAsyncRequest({
67
+ successMessage: putPromiseSuccessMessage,
68
+ errorMessage: putPromiseErrorMessage,
69
+ });
70
+ const deleteItemAsync = useAsyncRequest({
71
+ successMessage: deletePromiseSuccessMessage,
72
+ errorMessage: deletePromiseErrorMessage,
73
+ });
74
+ // El isLoading del contexto usa el hook de fetchData
75
+ const isLoading = fetchDataAsync.isLoading;
76
+ // Actualizar la referencia cuando cambie getPromise
77
+ useEffect(() => {
78
+ getPromiseRef.current = getPromiseExecute;
79
+ }, [getPromiseExecute]);
80
+ // Función para obtener los parámetros de la URL
81
+ const getUrlParams = useCallback(() => {
82
+ const params = { limit };
83
+ // Agregar pageParam si existe en la URL
84
+ const pageValue = searchParams.get(pageParam);
85
+ if (pageValue) {
86
+ const parsedPage = parseInt(pageValue, 10);
87
+ if (!isNaN(parsedPage)) {
88
+ params[pageParam] = parsedPage;
89
+ }
90
+ }
91
+ // Agregar urlParams si existen en la URL
92
+ urlParams.forEach((paramName) => {
93
+ const paramValue = searchParams.get(paramName);
94
+ if (paramValue !== null) {
95
+ params[paramName] = paramValue;
96
+ }
97
+ });
98
+ return params;
99
+ }, [searchParams, pageParam, urlParams, limit]);
100
+ // Función para obtener los datos
101
+ const fetchData = useCallback(async (params) => {
102
+ // Obtener los parámetros que se van a usar
103
+ const requestParams = params || getUrlParams();
104
+ // Crear una clave única para estos parámetros
105
+ const paramsKey = JSON.stringify(requestParams);
106
+ lastFetchParamsRef.current = paramsKey;
107
+ const result = await fetchDataAsync.execute(async () => {
108
+ return await getPromiseRef.current(requestParams);
109
+ });
110
+ // Solo procesar el resultado si no es undefined (undefined significa error)
111
+ if (result !== undefined) {
112
+ if (result && typeof result === "object" && "list" in result) {
113
+ // Es un PaginationInterface
114
+ const { list, page, pages, total } = result;
115
+ setList(list);
116
+ setPage(page);
117
+ setPages(pages);
118
+ setTotal(total);
119
+ }
120
+ else if (Array.isArray(result)) {
121
+ // Es un array simple
122
+ setList(result);
123
+ setPage(1);
124
+ setTotal(result.length);
125
+ setPages(Math.ceil(result.length / limit));
126
+ }
127
+ else {
128
+ // Resultado null
129
+ setList(undefined);
130
+ setPage(1);
131
+ setPages(1);
132
+ setTotal(0);
133
+ }
134
+ }
135
+ }, [getUrlParams, limit, fetchDataAsync]);
136
+ // Ref para almacenar los valores anteriores de urlParams
137
+ const prevUrlParamsValuesRef = useRef({});
138
+ // Memoizar los valores actuales de los urlParams
139
+ const urlParamsValues = useMemo(() => {
140
+ const values = {};
141
+ urlParams.forEach((paramName) => {
142
+ values[paramName] = searchParams.get(paramName);
143
+ });
144
+ return values;
145
+ }, [searchParams, urlParams]);
146
+ // Memoizar los parámetros de URL para evitar re-renders innecesarios
147
+ const urlParamsKey = useMemo(() => urlParams.join(","), [urlParams]);
148
+ // Memoizar los parámetros actuales para exponerlos
149
+ const currentParams = useMemo(() => getUrlParams(),
150
+ // eslint-disable-next-line react-hooks/exhaustive-deps
151
+ [searchParams, pageParam, urlParamsKey, limit, urlParams]);
152
+ // Función para recargar los datos
153
+ const fetchItemsExecute = useCallback(async (params) => {
154
+ await fetchData(params);
155
+ }, [fetchData]);
156
+ // Función para crear un item
157
+ const createItemExecute = useCallback(async (item) => {
158
+ if (!postPromiseExecute) {
159
+ throw new Error("postPromise is not defined. Please provide postPromise to ListCrudProvider.");
160
+ }
161
+ return await createItemAsync.execute(async () => {
162
+ return await postPromiseExecute(item);
163
+ });
164
+ }, [postPromiseExecute, createItemAsync]);
165
+ // Función para actualizar un item
166
+ const updateItemExecute = useCallback(async (item) => {
167
+ if (!putPromiseExecute) {
168
+ throw new Error("putPromise is not defined. Please provide putPromise to ListCrudProvider.");
169
+ }
170
+ return await updateItemAsync.execute(async () => {
171
+ return await putPromiseExecute(item);
172
+ });
173
+ }, [putPromiseExecute, updateItemAsync]);
174
+ // Función para eliminar un item
175
+ const deleteItemExecute = useCallback(async (item) => {
176
+ if (!deletePromiseExecute) {
177
+ throw new Error("deletePromise is not defined. Please provide deletePromise to ListCrudProvider.");
178
+ }
179
+ await deleteItemAsync.execute(async () => {
180
+ await deletePromiseExecute(item);
181
+ });
182
+ }, [deletePromiseExecute, deleteItemAsync]);
183
+ // useEffect para resetear pageParam a 1 cuando cambien los urlParams
184
+ useEffect(() => {
185
+ // Verificar si hay algún urlParam definido
186
+ if (urlParams.length === 0) {
187
+ prevUrlParamsValuesRef.current = {};
188
+ return;
189
+ }
190
+ // Comparar valores actuales con los anteriores
191
+ const prevValues = prevUrlParamsValuesRef.current;
192
+ const hasChanged = urlParams.some((paramName) => prevValues[paramName] !== urlParamsValues[paramName]);
193
+ // Si los urlParams cambiaron, resetear pageParam a 1
194
+ if (hasChanged) {
195
+ const currentPage = searchParams.get(pageParam);
196
+ if (currentPage && currentPage !== "1") {
197
+ const newSearchParams = new URLSearchParams(searchParams);
198
+ newSearchParams.set(pageParam, "1");
199
+ setSearchParams(newSearchParams, { replace: true });
200
+ // No hacer fetchData aquí, se hará cuando cambien los searchParams
201
+ return;
202
+ }
203
+ }
204
+ // Actualizar los valores anteriores
205
+ prevUrlParamsValuesRef.current = { ...urlParamsValues };
206
+ // eslint-disable-next-line react-hooks/exhaustive-deps
207
+ }, [JSON.stringify(urlParamsValues), pageParam, urlParamsKey]);
208
+ // useEffect consolidado para escuchar cambios que requieren recargar datos
209
+ useEffect(() => {
210
+ // Usar un pequeño delay para agrupar múltiples cambios rápidos en el mismo tick
211
+ const timeoutId = setTimeout(() => {
212
+ fetchData();
213
+ }, 0);
214
+ return () => clearTimeout(timeoutId);
215
+ // eslint-disable-next-line react-hooks/exhaustive-deps
216
+ }, [getPromiseExecute, searchParams, pageParam, urlParamsKey]);
217
+ const value = {
218
+ list,
219
+ page,
220
+ pages,
221
+ total,
222
+ limit,
223
+ isLoading,
224
+ params: currentParams,
225
+ fetchItems: {
226
+ execute: fetchItemsExecute,
227
+ isLoading: fetchDataAsync.isLoading,
228
+ },
229
+ createItem: {
230
+ execute: createItemExecute,
231
+ isLoading: createItemAsync.isLoading,
232
+ },
233
+ updateItem: {
234
+ execute: updateItemExecute,
235
+ isLoading: updateItemAsync.isLoading,
236
+ },
237
+ deleteItem: {
238
+ execute: deleteItemExecute,
239
+ isLoading: deleteItemAsync.isLoading,
240
+ },
241
+ pagination: (_jsx(Pagination, { page: page, pages: pages, total: total, fieldName: pageParam, isLoading: isLoading })),
242
+ };
243
+ return (_jsx(ListCrudContext.Provider, { value: value, children: children }));
244
+ }
245
+ // Hook to use ListCrud context
246
+ // eslint-disable-next-line react-refresh/only-export-components
247
+ export function useListCrud() {
248
+ const context = useContext(ListCrudContext);
249
+ if (context === undefined) {
250
+ throw new Error("useListCrud must be used within a ListCrudProvider");
251
+ }
252
+ return context;
253
+ }
@@ -0,0 +1,26 @@
1
+ import React, { type ReactNode } from "react";
2
+ export type SnackbarVariant = "primary" | "secondary" | "success" | "warning" | "danger" | "info";
3
+ export interface SnackbarMessage {
4
+ id: string;
5
+ message: string;
6
+ variant: SnackbarVariant;
7
+ duration?: number;
8
+ icon?: string;
9
+ iconLabel?: string;
10
+ }
11
+ export interface SnackbarContextType {
12
+ showSnackbar: (message: string, variant?: SnackbarVariant, options?: {
13
+ duration?: number;
14
+ icon?: string;
15
+ iconLabel?: string;
16
+ }) => void;
17
+ removeSnackbar: (id: string) => void;
18
+ snackbars: SnackbarMessage[];
19
+ }
20
+ interface SnackbarProviderProps {
21
+ children: ReactNode;
22
+ }
23
+ export declare const SnackbarProvider: React.FC<SnackbarProviderProps>;
24
+ export declare const useSnackbar: () => SnackbarContextType;
25
+ export {};
26
+ //# sourceMappingURL=SnackbarContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SnackbarContext.d.ts","sourceRoot":"","sources":["../../src/contexts/SnackbarContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAKZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAElG,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE;QACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,KAAK,IAAI,CAAC;IACX,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B;AAID,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA0C5D,CAAC;AAEF,eAAO,MAAM,WAAW,QAAO,mBAM9B,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React, { createContext, useContext, useState, useCallback, } from "react";
3
+ const SnackbarContext = createContext(undefined);
4
+ export const SnackbarProvider = ({ children, }) => {
5
+ const [snackbars, setSnackbars] = useState([]);
6
+ const showSnackbar = useCallback((message, variant = "info", options) => {
7
+ const id = `snackbar-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
8
+ const newSnackbar = {
9
+ id,
10
+ message,
11
+ variant,
12
+ duration: options?.duration ?? 3000,
13
+ icon: options?.icon,
14
+ iconLabel: options?.iconLabel,
15
+ };
16
+ setSnackbars((prev) => [...prev, newSnackbar]);
17
+ }, []);
18
+ const removeSnackbar = useCallback((id) => {
19
+ setSnackbars((prev) => prev.filter((snackbar) => snackbar.id !== id));
20
+ }, []);
21
+ const value = {
22
+ showSnackbar,
23
+ removeSnackbar,
24
+ snackbars,
25
+ };
26
+ return (_jsx(SnackbarContext.Provider, { value: value, children: children }));
27
+ };
28
+ export const useSnackbar = () => {
29
+ const context = useContext(SnackbarContext);
30
+ if (context === undefined) {
31
+ throw new Error("useSnackbar must be used within a SnackbarProvider");
32
+ }
33
+ return context;
34
+ };
@@ -4,4 +4,10 @@ export type { Theme, ThemeContextType, ThemeOverride } from "./types";
4
4
  export { lightTheme, darkTheme, blueTheme, greenTheme, defaultTheme, themes, } from "./presets";
5
5
  export { AuthProvider, AuthContext } from "./AuthContext";
6
6
  export type { AuthContextType, AuthContextUserInterface, AuthTokenInterface, } from "./AuthContext";
7
+ export { ListCrudProvider, ListCrudContext, useListCrud } from "./ListCrudContext";
8
+ export type { ListCrudContextType } from "./ListCrudContext";
9
+ export { AppLayoutProvider, useAppLayout, useAppLayoutContext } from "./AppLayoutContext";
10
+ export type { AppLayoutContextType, NavbarInterface, LeftDrawerInterface, } from "./AppLayoutContext";
11
+ export { SnackbarProvider, useSnackbar } from "./SnackbarContext";
12
+ export type { SnackbarContextType, SnackbarMessage, SnackbarVariant, } from "./SnackbarContext";
7
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contexts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAGnC,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGtE,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,MAAM,GACP,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EACV,eAAe,EACf,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contexts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAGnC,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGtE,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,MAAM,GACP,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EACV,eAAe,EACf,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACnF,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
@@ -5,3 +5,9 @@ export { useThemeOverride, useTemporaryOverride, } from "../hooks/useThemeOverri
5
5
  export { lightTheme, darkTheme, blueTheme, greenTheme, defaultTheme, themes, } from "./presets";
6
6
  // Auth system exports
7
7
  export { AuthProvider, AuthContext } from "./AuthContext";
8
+ // ListCrud system exports
9
+ export { ListCrudProvider, ListCrudContext, useListCrud } from "./ListCrudContext";
10
+ // AppLayout system exports
11
+ export { AppLayoutProvider, useAppLayout, useAppLayoutContext } from "./AppLayoutContext";
12
+ // Snackbar system exports
13
+ export { SnackbarProvider, useSnackbar } from "./SnackbarContext";
@@ -191,9 +191,9 @@ export const blueTheme = {
191
191
  textDisabled: "#94a3b8",
192
192
  },
193
193
  shadows: {
194
- sm: "0 1px 2px 0 rgb(30 64 175 / 0.05)",
195
- md: "0 4px 6px -1px rgb(30 64 175 / 0.1), 0 2px 4px -2px rgb(30 64 175 / 0.1)",
196
- lg: "0 10px 15px -3px rgb(30 64 175 / 0.1), 0 4px 6px -4px rgb(30 64 175 / 0.1)",
194
+ sm: "0 1px 2px 0 rgb(0 0 0 / 0.05)",
195
+ md: "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)",
196
+ lg: "0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)",
197
197
  },
198
198
  radius: {
199
199
  sm: "0.375rem",
@@ -263,9 +263,9 @@ export const greenTheme = {
263
263
  textDisabled: "#9ca3af",
264
264
  },
265
265
  shadows: {
266
- sm: "0 1px 2px 0 rgb(5 150 105 / 0.05)",
267
- md: "0 4px 6px -1px rgb(5 150 105 / 0.1), 0 2px 4px -2px rgb(5 150 105 / 0.1)",
268
- lg: "0 10px 15px -3px rgb(5 150 105 / 0.1), 0 4px 6px -4px rgb(5 150 105 / 0.1)",
266
+ sm: "0 1px 2px 0 rgb(0 0 0 / 0.05)",
267
+ md: "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)",
268
+ lg: "0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)",
269
269
  },
270
270
  radius: {
271
271
  sm: "0.375rem",
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const AccordionDocs: React.FC;
3
+ export default AccordionDocs;
4
+ //# sourceMappingURL=AccordionDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccordionDocs.d.ts","sourceRoot":"","sources":["../../src/docs/AccordionDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,QAAA,MAAM,aAAa,EAAE,KAAK,CAAC,EAwuB1B,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useState } from "react";
3
+ import { Accordion, Card, Badge, Input } from "../index";
4
+ const AccordionDocs = () => {
5
+ const [openAccordions, setOpenAccordions] = useState(new Set());
6
+ const handleToggle = (id, isOpen) => {
7
+ const newSet = new Set(openAccordions);
8
+ if (isOpen) {
9
+ newSet.add(id);
10
+ }
11
+ else {
12
+ newSet.delete(id);
13
+ }
14
+ setOpenAccordions(newSet);
15
+ };
16
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "Accordion - Variantes y Ejemplos", children: _jsxs("div", { className: "space-y-10", children: [_jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Variantes" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "El componente Accordion soporta tres variantes visuales: default, elevated (con sombra) y outlined (con borde destacado)." }), _jsxs("div", { className: "space-y-3", children: [_jsx(Accordion, { variant: "default", title: "Default", children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Accordion con variante por defecto." }) }), _jsx(Accordion, { variant: "elevated", title: "Elevated", children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Accordion con sombra elevada." }) }), _jsx(Accordion, { variant: "outlined", title: "Outlined", children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Accordion con borde destacado." }) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Uso b\u00E1sico" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "El componente Accordion permite mostrar contenido colapsable con una animaci\u00F3n suave de expandir/contraer. Haz clic en el header para abrir o cerrar el contenido." }), _jsxs("div", { className: "space-y-3", children: [_jsx(Accordion, { title: "Informaci\u00F3n General", children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este es un accordion b\u00E1sico sin icono ni elementos adicionales. El contenido se muestra cuando el accordion est\u00E1 abierto y se oculta con una animaci\u00F3n suave cuando est\u00E1 cerrado." }) }), _jsx(Accordion, { title: "Detalles del Producto", defaultOpen: true, children: _jsxs("div", { className: "space-y-2", children: [_jsxs("p", { style: { color: "var(--flysoft-text-secondary)" }, children: ["Este accordion est\u00E1 abierto por defecto usando la propiedad", " ", _jsx("code", { className: "px-1 py-0.5 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded text-xs", children: "defaultOpen" }), "."] }), _jsxs("ul", { className: "list-disc list-inside space-y-1 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: [_jsx("li", { children: "Caracter\u00EDstica 1: Descripci\u00F3n detallada" }), _jsx("li", { children: "Caracter\u00EDstica 2: M\u00E1s informaci\u00F3n" }), _jsx("li", { children: "Caracter\u00EDstica 3: Detalles adicionales" })] })] }) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Con icono" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Puedes agregar un icono FontAwesome 5 del lado izquierdo del t\u00EDtulo usando la propiedad ", _jsx("code", { children: "icon" }), "."] }), _jsxs("div", { className: "space-y-3", children: [_jsx(Accordion, { title: "Configuraci\u00F3n", icon: "fa-cog", children: _jsxs("div", { className: "space-y-2", children: [_jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este accordion tiene un icono de configuraci\u00F3n en el lado izquierdo." }), _jsx(Input, { label: "Nombre", placeholder: "Ingresa un nombre" }), _jsx(Input, { label: "Email", type: "email", placeholder: "correo@ejemplo.com" })] }) }), _jsx(Accordion, { title: "Informaci\u00F3n de Usuario", icon: "fa-user", children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Accordion con icono de usuario. Los iconos ayudan a identificar visualmente el tipo de contenido." }) }), _jsx(Accordion, { title: "Notificaciones", icon: "fa-bell", children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Accordion con icono de notificaciones. Puedes usar cualquier icono de FontAwesome 5." }) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Con rightNode" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["La propiedad ", _jsx("code", { children: "rightNode" }), " permite agregar contenido personalizado del lado derecho, antes del chevron. \u00DAtil para badges, botones peque\u00F1os, contadores, etc."] }), _jsxs("div", { className: "space-y-3", children: [_jsx(Accordion, { title: "Mensajes", icon: "fa-envelope", rightNode: _jsx(Badge, { variant: "info", children: "3" }), children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este accordion muestra un badge con el n\u00FAmero de mensajes no le\u00EDdos en el lado derecho." }) }), _jsx(Accordion, { title: "Tareas Pendientes", icon: "fa-tasks", rightNode: _jsx(Badge, { variant: "warning", children: "5" }), children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Accordion con badge de tareas pendientes. El rightNode puede contener cualquier ReactNode." }) }), _jsx(Accordion, { title: "Configuraci\u00F3n Avanzada", icon: "fa-sliders-h", rightNode: _jsxs("div", { className: "flex items-center gap-2 px-2 py-1 text-sm text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)] cursor-pointer rounded transition-colors", onClick: (e) => {
17
+ e.stopPropagation();
18
+ console.log("Editar configuración");
19
+ }, children: [_jsx("i", { className: "fal fa-edit" }), _jsx("span", { children: "Editar" })] }), children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este accordion incluye un elemento de acci\u00F3n en el rightNode, permitiendo acciones r\u00E1pidas sin abrir el accordion. Nota: No uses componentes Button dentro de rightNode ya que causar\u00EDa un error de anidaci\u00F3n de botones." }) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Con callback onToggle" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["La propiedad ", _jsx("code", { children: "onToggle" }), " permite ejecutar una funci\u00F3n cuando el accordion se abre o cierra. \u00DAtil para sincronizar estado externo o realizar acciones al cambiar el estado."] }), _jsxs("div", { className: "space-y-3", children: [openAccordions.size > 0 && (_jsx("div", { className: "p-3 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: _jsxs("p", { className: "text-sm", children: [_jsx("span", { className: "font-semibold", children: "Accordions abiertos:" }), " ", _jsx("span", { style: { color: "var(--flysoft-text-secondary)" }, children: Array.from(openAccordions).join(", ") || "Ninguno" })] }) })), _jsx(Accordion, { title: "Secci\u00F3n 1", icon: "fa-folder", onToggle: (isOpen) => handleToggle("seccion1", isOpen), children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este accordion notifica cuando se abre o cierra mediante el callback onToggle." }) }), _jsx(Accordion, { title: "Secci\u00F3n 2", icon: "fa-folder", onToggle: (isOpen) => handleToggle("seccion2", isOpen), children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Otro accordion que tambi\u00E9n notifica su estado mediante onToggle." }) }), _jsx(Accordion, { title: "Secci\u00F3n 3", icon: "fa-folder", onToggle: (isOpen) => handleToggle("seccion3", isOpen), children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Un tercer accordion para demostrar el seguimiento de m\u00FAltiples accordions." }) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Ejemplo completo con m\u00FAltiples accordions" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Ejemplo pr\u00E1ctico usando m\u00FAltiples accordions para organizar informaci\u00F3n en secciones colapsables." }), _jsxs("div", { className: "space-y-3", children: [_jsx(Accordion, { title: "Informaci\u00F3n Personal", icon: "fa-user-circle", rightNode: _jsx(Badge, { variant: "success", children: "Completo" }), children: _jsxs("div", { className: "space-y-3", children: [_jsx(Input, { label: "Nombre", placeholder: "Juan", icon: "fa-user" }), _jsx(Input, { label: "Apellido", placeholder: "P\u00E9rez", icon: "fa-user" }), _jsx(Input, { label: "Fecha de Nacimiento", type: "date", icon: "fa-calendar" })] }) }), _jsx(Accordion, { title: "Informaci\u00F3n de Contacto", icon: "fa-address-book", rightNode: _jsx(Badge, { variant: "warning", children: "Pendiente" }), children: _jsxs("div", { className: "space-y-3", children: [_jsx(Input, { label: "Email", type: "email", placeholder: "juan@ejemplo.com", icon: "fa-envelope" }), _jsx(Input, { label: "Tel\u00E9fono", type: "tel", placeholder: "+34 600 000 000", icon: "fa-phone" })] }) }), _jsx(Accordion, { title: "Configuraci\u00F3n de Seguridad", icon: "fa-shield-alt", rightNode: _jsx(Badge, { variant: "info", children: "Recomendado" }), children: _jsxs("div", { className: "space-y-3", children: [_jsx(Input, { label: "Contrase\u00F1a Actual", type: "password", placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", icon: "fa-lock" }), _jsx(Input, { label: "Nueva Contrase\u00F1a", type: "password", placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", icon: "fa-key" })] }) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Background Personalizado" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "El componente detecta autom\u00E1ticamente las clases de background (bg-*) desde la prop className y las aplica al background del accordion. Las dem\u00E1s clases se aplican normalmente al contenedor." }), _jsxs("div", { className: "space-y-3", children: [_jsx(Accordion, { title: "Accordion con bg-blue-50", className: "bg-blue-50", children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Accordion con background personalizado usando clases de Tailwind." }) }), _jsx(Accordion, { title: "Accordion con bg-gradient", className: "bg-gradient-to-br from-purple-100 to-pink-100", children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Accordion con gradiente personalizado." }) }), _jsx(Accordion, { title: "Accordion con bg y otras clases", className: "bg-green-50", children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Puedes combinar clases de background con otras clases de Tailwind." }) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Title como ReactNode" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "El t\u00EDtulo puede ser un ReactNode, permitiendo incluir contenido personalizado como badges, iconos adicionales, o cualquier otro componente." }), _jsxs("div", { className: "space-y-3", children: [_jsx(Accordion, { title: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { children: "Proyecto Importante" }), _jsx(Badge, { variant: "danger", size: "sm", children: "Urgente" })] }), icon: "fa-project-diagram", children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este accordion tiene un t\u00EDtulo personalizado con un badge integrado." }) }), _jsx(Accordion, { title: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("i", { className: "fal fa-star text-yellow-500" }), _jsx("span", { children: "Favoritos" })] }), children: _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "T\u00EDtulo personalizado con un icono de estrella integrado." }) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Caracter\u00EDsticas" }), _jsx("div", { className: "space-y-3", children: _jsx("div", { className: "p-3 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: _jsxs("ul", { className: "list-disc list-inside space-y-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: [_jsxs("li", { children: [_jsx("strong", { children: "Animaci\u00F3n suave:" }), " El contenido se expande y contrae con una animaci\u00F3n CSS de 300ms."] }), _jsxs("li", { children: [_jsx("strong", { children: "Icono opcional:" }), " Soporta iconos FontAwesome 5 del lado izquierdo del t\u00EDtulo."] }), _jsxs("li", { children: [_jsx("strong", { children: "RightNode:" }), " Permite agregar contenido personalizado (badges, botones, etc.) del lado derecho antes del chevron."] }), _jsxs("li", { children: [_jsx("strong", { children: "Estado controlado:" }), " Soporta estado controlado mediante ", _jsx("code", { children: "defaultOpen" }), " y", " ", _jsx("code", { children: "onToggle" }), "."] }), _jsxs("li", { children: [_jsx("strong", { children: "Title flexible:" }), " El t\u00EDtulo puede ser un string o un ReactNode, permitiendo contenido personalizado."] }), _jsxs("li", { children: [_jsx("strong", { children: "Accesibilidad:" }), " Incluye atributos ARIA para mejor accesibilidad."] }), _jsxs("li", { children: [_jsx("strong", { children: "Chevron din\u00E1mico:" }), " El chevron cambia autom\u00E1ticamente entre arriba (abierto) y abajo (cerrado)."] }), _jsxs("li", { children: [_jsx("strong", { children: "Variantes:" }), " Soporta tres variantes: default, elevated (con sombra) y outlined (con borde destacado)."] }), _jsxs("li", { children: [_jsx("strong", { children: "Background personalizado:" }), " El componente detecta autom\u00E1ticamente las clases de background (bg-*) y las aplica correctamente."] })] }) }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Props" }), _jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full border-collapse", children: [_jsx("thead", { children: _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("th", { className: "px-4 py-2 text-left text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Prop" }), _jsx("th", { className: "px-4 py-2 text-left text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Tipo" }), _jsx("th", { className: "px-4 py-2 text-left text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Requerido" }), _jsx("th", { className: "px-4 py-2 text-left text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Descripci\u00F3n" })] }) }), _jsxs("tbody", { children: [_jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "title" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "string | ReactNode" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "S\u00ED" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "T\u00EDtulo del accordion. Puede ser un string o un ReactNode." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "children" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "ReactNode" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "S\u00ED" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Contenido que se muestra cuando el accordion est\u00E1 abierto." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "icon" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "string" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Clase de icono FontAwesome 5 (ej: \"fa-user\", \"fa-cog\") que se muestra del lado izquierdo del t\u00EDtulo." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "rightNode" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "ReactNode" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Contenido personalizado que se muestra del lado derecho, antes del chevron. \u00DAtil para badges, botones, contadores, etc." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "defaultOpen" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "boolean" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Si es true, el accordion estar\u00E1 abierto por defecto. Por defecto es false." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "onToggle" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "(isOpen: boolean) => void" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Callback que se ejecuta cuando el accordion se abre o cierra. Recibe un boolean indicando si est\u00E1 abierto (true) o cerrado (false)." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "variant" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "\"default\" | \"elevated\" | \"outlined\"" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Variante visual del accordion. Por defecto es \"default\"." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "className" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "string" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Clases CSS adicionales. Las clases de background (bg-*) se aplican autom\u00E1ticamente al background del accordion." })] })] })] }) })] })] }) }) }));
20
+ };
21
+ export default AccordionDocs;