flysoft-react-ui 0.4.0 → 0.5.2

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 (178) hide show
  1. package/dist/App.d.ts.map +1 -1
  2. package/dist/App.js +20 -4
  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 +410 -31
  6. package/dist/components/form-controls/Button.js +1 -1
  7. package/dist/components/form-controls/Checkbox.d.ts +14 -0
  8. package/dist/components/form-controls/Checkbox.d.ts.map +1 -0
  9. package/dist/components/form-controls/Checkbox.js +77 -0
  10. package/dist/components/form-controls/DateInput.d.ts +20 -4
  11. package/dist/components/form-controls/DateInput.d.ts.map +1 -1
  12. package/dist/components/form-controls/DateInput.js +425 -70
  13. package/dist/components/form-controls/DatePicker.d.ts +4 -3
  14. package/dist/components/form-controls/DatePicker.d.ts.map +1 -1
  15. package/dist/components/form-controls/DatePicker.js +26 -30
  16. package/dist/components/form-controls/Input.d.ts +10 -1
  17. package/dist/components/form-controls/Input.d.ts.map +1 -1
  18. package/dist/components/form-controls/Input.js +16 -10
  19. package/dist/components/form-controls/Pagination.d.ts +1 -0
  20. package/dist/components/form-controls/Pagination.d.ts.map +1 -1
  21. package/dist/components/form-controls/Pagination.js +3 -40
  22. package/dist/components/form-controls/RadioButtonGroup.d.ts +62 -0
  23. package/dist/components/form-controls/RadioButtonGroup.d.ts.map +1 -0
  24. package/dist/components/form-controls/RadioButtonGroup.js +220 -0
  25. package/dist/components/form-controls/SearchSelectInput-OLD.d.ts +68 -0
  26. package/dist/components/form-controls/SearchSelectInput-OLD.d.ts.map +1 -0
  27. package/dist/components/form-controls/SearchSelectInput-OLD.js +962 -0
  28. package/dist/components/form-controls/SearchSelectInput.d.ts +70 -0
  29. package/dist/components/form-controls/SearchSelectInput.d.ts.map +1 -0
  30. package/dist/components/form-controls/SearchSelectInput.js +335 -0
  31. package/dist/components/form-controls/index.d.ts +7 -1
  32. package/dist/components/form-controls/index.d.ts.map +1 -1
  33. package/dist/components/form-controls/index.js +3 -0
  34. package/dist/components/layout/AppLayout.d.ts +3 -2
  35. package/dist/components/layout/AppLayout.d.ts.map +1 -1
  36. package/dist/components/layout/AppLayout.js +104 -31
  37. package/dist/components/layout/Card.d.ts +4 -1
  38. package/dist/components/layout/Card.d.ts.map +1 -1
  39. package/dist/components/layout/Card.js +30 -1
  40. package/dist/components/layout/Collection.js +1 -1
  41. package/dist/components/layout/DataTable.d.ts +29 -0
  42. package/dist/components/layout/DataTable.d.ts.map +1 -0
  43. package/dist/components/layout/DataTable.js +165 -0
  44. package/dist/components/layout/index.d.ts +2 -0
  45. package/dist/components/layout/index.d.ts.map +1 -1
  46. package/dist/components/layout/index.js +1 -0
  47. package/dist/components/utils/Avatar.d.ts +49 -0
  48. package/dist/components/utils/Avatar.d.ts.map +1 -0
  49. package/dist/components/utils/Avatar.js +93 -0
  50. package/dist/components/utils/Badge.d.ts +3 -0
  51. package/dist/components/utils/Badge.d.ts.map +1 -1
  52. package/dist/components/utils/Badge.js +130 -26
  53. package/dist/components/utils/Dialog.d.ts.map +1 -1
  54. package/dist/components/utils/Dialog.js +5 -1
  55. package/dist/components/utils/DropdownMenu.d.ts +25 -0
  56. package/dist/components/utils/DropdownMenu.d.ts.map +1 -0
  57. package/dist/components/utils/DropdownMenu.js +145 -0
  58. package/dist/components/utils/Filter.d.ts +57 -0
  59. package/dist/components/utils/Filter.d.ts.map +1 -0
  60. package/dist/components/utils/Filter.js +580 -0
  61. package/dist/components/utils/FiltersDialog.d.ts +21 -0
  62. package/dist/components/utils/FiltersDialog.d.ts.map +1 -0
  63. package/dist/components/utils/FiltersDialog.js +104 -0
  64. package/dist/components/utils/Loader.js +1 -1
  65. package/dist/components/utils/RoadMap.d.ts +59 -0
  66. package/dist/components/utils/RoadMap.d.ts.map +1 -0
  67. package/dist/components/utils/RoadMap.js +138 -0
  68. package/dist/components/utils/Snackbar.d.ts +13 -0
  69. package/dist/components/utils/Snackbar.d.ts.map +1 -0
  70. package/dist/components/utils/Snackbar.js +121 -0
  71. package/dist/components/utils/SnackbarContainer.d.ts +7 -0
  72. package/dist/components/utils/SnackbarContainer.d.ts.map +1 -0
  73. package/dist/components/utils/SnackbarContainer.js +25 -0
  74. package/dist/components/utils/index.d.ts +12 -0
  75. package/dist/components/utils/index.d.ts.map +1 -1
  76. package/dist/components/utils/index.js +6 -0
  77. package/dist/contexts/AppLayoutContext.d.ts +40 -0
  78. package/dist/contexts/AppLayoutContext.d.ts.map +1 -0
  79. package/dist/contexts/AppLayoutContext.js +98 -0
  80. package/dist/contexts/ListCrudContext.d.ts +29 -0
  81. package/dist/contexts/ListCrudContext.d.ts.map +1 -0
  82. package/dist/contexts/ListCrudContext.js +209 -0
  83. package/dist/contexts/SnackbarContext.d.ts +26 -0
  84. package/dist/contexts/SnackbarContext.d.ts.map +1 -0
  85. package/dist/contexts/SnackbarContext.js +34 -0
  86. package/dist/contexts/index.d.ts +6 -0
  87. package/dist/contexts/index.d.ts.map +1 -1
  88. package/dist/contexts/index.js +6 -0
  89. package/dist/contexts/presets.js +6 -6
  90. package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +3 -1
  91. package/dist/docs/AvatarDocs.d.ts +4 -0
  92. package/dist/docs/AvatarDocs.d.ts.map +1 -0
  93. package/dist/docs/AvatarDocs.js +7 -0
  94. package/dist/docs/BadgeDocs.d.ts.map +1 -1
  95. package/dist/docs/BadgeDocs.js +4 -2
  96. package/dist/docs/CardDocs.d.ts.map +1 -1
  97. package/dist/docs/CardDocs.js +7 -1
  98. package/dist/docs/CheckboxDocs.d.ts +4 -0
  99. package/dist/docs/CheckboxDocs.d.ts.map +1 -0
  100. package/dist/docs/CheckboxDocs.js +7 -0
  101. package/dist/docs/DataTableDocs.d.ts +4 -0
  102. package/dist/docs/DataTableDocs.d.ts.map +1 -0
  103. package/dist/docs/DataTableDocs.js +244 -0
  104. package/dist/docs/DateInputDocs.d.ts +1 -0
  105. package/dist/docs/DateInputDocs.d.ts.map +1 -1
  106. package/dist/docs/DateInputDocs.js +7 -9
  107. package/dist/docs/DatePickerDocs.d.ts +1 -0
  108. package/dist/docs/DatePickerDocs.d.ts.map +1 -1
  109. package/dist/docs/DatePickerDocs.js +6 -8
  110. package/dist/docs/DocAdmin.d.ts +4 -0
  111. package/dist/docs/DocAdmin.d.ts.map +1 -0
  112. package/dist/docs/DocAdmin.js +68 -0
  113. package/dist/docs/DocsMenu.d.ts.map +1 -1
  114. package/dist/docs/DocsMenu.js +1 -1
  115. package/dist/docs/DocsRouter.d.ts.map +1 -1
  116. package/dist/docs/DocsRouter.js +13 -1
  117. package/dist/docs/DropdownMenuDocs.d.ts +4 -0
  118. package/dist/docs/DropdownMenuDocs.d.ts.map +1 -0
  119. package/dist/docs/DropdownMenuDocs.js +66 -0
  120. package/dist/docs/ExampleFormDocs.d.ts +4 -0
  121. package/dist/docs/ExampleFormDocs.d.ts.map +1 -0
  122. package/dist/docs/ExampleFormDocs.js +148 -0
  123. package/dist/docs/FilterDocs.d.ts +4 -0
  124. package/dist/docs/FilterDocs.d.ts.map +1 -0
  125. package/dist/docs/FilterDocs.js +112 -0
  126. package/dist/docs/InputDocs.d.ts.map +1 -1
  127. package/dist/docs/InputDocs.js +11 -1
  128. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +11 -0
  129. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +1 -0
  130. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +25 -0
  131. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts +2 -0
  132. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +1 -0
  133. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +51 -0
  134. package/dist/docs/PaginationDocs.js +6 -6
  135. package/dist/docs/RadioButtonGroupDocs.d.ts +4 -0
  136. package/dist/docs/RadioButtonGroupDocs.d.ts.map +1 -0
  137. package/dist/docs/RadioButtonGroupDocs.js +46 -0
  138. package/dist/docs/RoadMapDocs.d.ts +4 -0
  139. package/dist/docs/RoadMapDocs.d.ts.map +1 -0
  140. package/dist/docs/RoadMapDocs.js +171 -0
  141. package/dist/docs/SearchSelectInputDocs.d.ts +4 -0
  142. package/dist/docs/SearchSelectInputDocs.d.ts.map +1 -0
  143. package/dist/docs/SearchSelectInputDocs.js +168 -0
  144. package/dist/docs/SnackbarDocs.d.ts +4 -0
  145. package/dist/docs/SnackbarDocs.d.ts.map +1 -0
  146. package/dist/docs/SnackbarDocs.js +50 -0
  147. package/dist/docs/TabsGroupDocs.d.ts.map +1 -1
  148. package/dist/docs/TabsGroupDocs.js +12 -1
  149. package/dist/docs/docMockServices/empresaService.d.ts +38 -0
  150. package/dist/docs/docMockServices/empresaService.d.ts.map +1 -0
  151. package/dist/docs/docMockServices/empresaService.js +116 -0
  152. package/dist/docs/docMockServices/index.d.ts +9 -0
  153. package/dist/docs/docMockServices/index.d.ts.map +1 -0
  154. package/dist/docs/docMockServices/index.js +8 -0
  155. package/dist/docs/docMockServices/initialData.d.ts +6 -0
  156. package/dist/docs/docMockServices/initialData.d.ts.map +1 -0
  157. package/dist/docs/docMockServices/initialData.js +132 -0
  158. package/dist/docs/docMockServices/interfaces.d.ts +26 -0
  159. package/dist/docs/docMockServices/interfaces.d.ts.map +1 -0
  160. package/dist/docs/docMockServices/interfaces.js +1 -0
  161. package/dist/docs/docMockServices/personaEmpresaService.d.ts +43 -0
  162. package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +1 -0
  163. package/dist/docs/docMockServices/personaEmpresaService.js +113 -0
  164. package/dist/docs/docMockServices/personaService.d.ts +39 -0
  165. package/dist/docs/docMockServices/personaService.d.ts.map +1 -0
  166. package/dist/docs/docMockServices/personaService.js +180 -0
  167. package/dist/hooks/index.d.ts +2 -0
  168. package/dist/hooks/index.d.ts.map +1 -1
  169. package/dist/hooks/index.js +1 -0
  170. package/dist/hooks/useAsyncRequest.d.ts +17 -0
  171. package/dist/hooks/useAsyncRequest.d.ts.map +1 -0
  172. package/dist/hooks/useAsyncRequest.js +70 -0
  173. package/dist/index.css +1 -1
  174. package/dist/index.d.ts +22 -0
  175. package/dist/index.d.ts.map +1 -1
  176. package/dist/index.js +11 -0
  177. package/dist/index.js.map +1 -1
  178. 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,29 @@
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
+ refetch: (params?: Record<string, any>) => Promise<void>;
13
+ createItem: (item: T) => Promise<T | undefined>;
14
+ deleteItem: (item: T) => Promise<void>;
15
+ }
16
+ export declare const ListCrudContext: import("react").Context<ListCrudContextType<any> | undefined>;
17
+ interface ListCrudProviderProps<T> {
18
+ children: ReactNode;
19
+ getPromise: (params?: Record<string, any>) => Promise<Array<T> | PaginationInterface<T> | undefined>;
20
+ postPromise?: (item: T) => Promise<T | undefined>;
21
+ deletePromise?: (item: T) => Promise<void>;
22
+ urlParams?: Array<string>;
23
+ limit?: number;
24
+ pageParam?: string;
25
+ }
26
+ export declare function ListCrudProvider<T>({ children, getPromise, postPromise, deletePromise, limit, pageParam, urlParams, }: ListCrudProviderProps<T>): import("react/jsx-runtime").JSX.Element;
27
+ export declare function useListCrud<T>(): ListCrudContextType<T>;
28
+ export {};
29
+ //# 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,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAChD,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAQD,eAAO,MAAM,eAAe,+DAA+B,CAAC;AAE5D,UAAU,qBAAqB,CAAC,CAAC;IAC/B,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,EAAE,CACV,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;IAC5D,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAClD,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,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,aAAa,EACb,KAAU,EACV,SAAoB,EACpB,SAAc,GACf,EAAE,qBAAqB,CAAC,CAAC,CAAC,2CAwP1B;AAID,wBAAgB,WAAW,CAAC,CAAC,KAAK,mBAAmB,CAAC,CAAC,CAAC,CAMvD"}
@@ -0,0 +1,209 @@
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, 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 getPromiseRef = useRef(getPromise);
18
+ const [searchParams, setSearchParams] = useSearchParams();
19
+ const lastFetchParamsRef = useRef("");
20
+ // Hooks para manejar las peticiones asíncronas
21
+ // fetchDataAsync sin mensaje para cargas automáticas
22
+ const fetchDataAsync = useAsyncRequest();
23
+ // fetchDataAsyncManual con mensaje para refetch manual
24
+ const fetchDataAsyncManual = useAsyncRequest({
25
+ successMessage: "Datos cargados correctamente",
26
+ });
27
+ const createItemAsync = useAsyncRequest();
28
+ const deleteItemAsync = useAsyncRequest();
29
+ // El isLoading del contexto combina ambos hooks de fetchData
30
+ const isLoading = fetchDataAsync.isLoading || fetchDataAsyncManual.isLoading;
31
+ // Actualizar la referencia cuando cambie getPromise
32
+ useEffect(() => {
33
+ getPromiseRef.current = getPromise;
34
+ }, [getPromise]);
35
+ // Función para obtener los parámetros de la URL
36
+ const getUrlParams = useCallback(() => {
37
+ const params = { limit };
38
+ // Agregar pageParam si existe en la URL
39
+ const pageValue = searchParams.get(pageParam);
40
+ if (pageValue) {
41
+ const parsedPage = parseInt(pageValue, 10);
42
+ if (!isNaN(parsedPage)) {
43
+ params[pageParam] = parsedPage;
44
+ }
45
+ }
46
+ // Agregar urlParams si existen en la URL
47
+ urlParams.forEach((paramName) => {
48
+ const paramValue = searchParams.get(paramName);
49
+ if (paramValue !== null) {
50
+ params[paramName] = paramValue;
51
+ }
52
+ });
53
+ return params;
54
+ }, [searchParams, pageParam, urlParams, limit]);
55
+ // Función para obtener los datos
56
+ const fetchData = useCallback(async (params, showSuccessMessage = false) => {
57
+ const asyncRequest = showSuccessMessage
58
+ ? fetchDataAsyncManual
59
+ : fetchDataAsync;
60
+ // Obtener los parámetros que se van a usar
61
+ const requestParams = params || getUrlParams();
62
+ // Crear una clave única para estos parámetros
63
+ const paramsKey = JSON.stringify({
64
+ ...requestParams,
65
+ showSuccessMessage,
66
+ });
67
+ // Evitar ejecuciones duplicadas con los mismos parámetros
68
+ if (!showSuccessMessage && lastFetchParamsRef.current === paramsKey) {
69
+ console.log("Skipping duplicate fetchData call");
70
+ return;
71
+ }
72
+ lastFetchParamsRef.current = paramsKey;
73
+ console.log("fetchData called", {
74
+ showSuccessMessage,
75
+ isLoading: asyncRequest.isLoading,
76
+ params: requestParams,
77
+ });
78
+ const result = await asyncRequest.execute(async () => {
79
+ console.log("Executing promise with params:", requestParams);
80
+ const promiseResult = await getPromiseRef.current(requestParams);
81
+ console.log("Promise result:", promiseResult);
82
+ return promiseResult;
83
+ });
84
+ console.log("fetchData result:", result);
85
+ // Solo procesar el resultado si no es undefined (undefined significa error)
86
+ if (result !== undefined) {
87
+ if (result && typeof result === "object" && "list" in result) {
88
+ // Es un PaginationInterface
89
+ const { list, page, pages, total } = result;
90
+ setList(list);
91
+ setPage(page);
92
+ setPages(pages);
93
+ setTotal(total);
94
+ }
95
+ else if (Array.isArray(result)) {
96
+ // Es un array simple
97
+ setList(result);
98
+ setPage(1);
99
+ setTotal(result.length);
100
+ setPages(Math.ceil(result.length / limit));
101
+ }
102
+ else {
103
+ // Resultado null
104
+ setList(undefined);
105
+ setPage(1);
106
+ setPages(1);
107
+ setTotal(0);
108
+ }
109
+ }
110
+ else {
111
+ console.log("Result is undefined, not processing");
112
+ }
113
+ }, [getUrlParams, limit, fetchDataAsync, fetchDataAsyncManual]);
114
+ // Ref para almacenar los valores anteriores de urlParams
115
+ const prevUrlParamsValuesRef = useRef({});
116
+ // Memoizar los valores actuales de los urlParams
117
+ const urlParamsValues = useMemo(() => {
118
+ const values = {};
119
+ urlParams.forEach((paramName) => {
120
+ values[paramName] = searchParams.get(paramName);
121
+ });
122
+ return values;
123
+ }, [searchParams, urlParams]);
124
+ // Memoizar los parámetros de URL para evitar re-renders innecesarios
125
+ const urlParamsKey = useMemo(() => urlParams.join(","), [urlParams]);
126
+ // Memoizar los parámetros actuales para exponerlos
127
+ const currentParams = useMemo(() => getUrlParams(),
128
+ // eslint-disable-next-line react-hooks/exhaustive-deps
129
+ [searchParams, pageParam, urlParamsKey, limit, urlParams]);
130
+ // Función para recargar los datos
131
+ const refetch = useCallback(async (params) => {
132
+ await fetchData(params, true); // Mostrar mensaje de éxito en refetch manual
133
+ }, [fetchData]);
134
+ // Función para crear un item
135
+ const createItem = useCallback(async (item) => {
136
+ if (!postPromise) {
137
+ throw new Error("postPromise is not defined. Please provide postPromise to ListCrudProvider.");
138
+ }
139
+ return await createItemAsync.execute(async () => {
140
+ return await postPromise(item);
141
+ });
142
+ }, [postPromise, createItemAsync]);
143
+ // Función para eliminar un item
144
+ const deleteItem = useCallback(async (item) => {
145
+ if (!deletePromise) {
146
+ throw new Error("deletePromise is not defined. Please provide deletePromise to ListCrudProvider.");
147
+ }
148
+ await deleteItemAsync.execute(async () => {
149
+ await deletePromise(item);
150
+ });
151
+ }, [deletePromise, deleteItemAsync]);
152
+ // useEffect para resetear pageParam a 1 cuando cambien los urlParams
153
+ useEffect(() => {
154
+ // Verificar si hay algún urlParam definido
155
+ if (urlParams.length === 0) {
156
+ prevUrlParamsValuesRef.current = {};
157
+ return;
158
+ }
159
+ // Comparar valores actuales con los anteriores
160
+ const prevValues = prevUrlParamsValuesRef.current;
161
+ const hasChanged = urlParams.some((paramName) => prevValues[paramName] !== urlParamsValues[paramName]);
162
+ // Si los urlParams cambiaron, resetear pageParam a 1
163
+ if (hasChanged) {
164
+ const currentPage = searchParams.get(pageParam);
165
+ if (currentPage && currentPage !== "1") {
166
+ const newSearchParams = new URLSearchParams(searchParams);
167
+ newSearchParams.set(pageParam, "1");
168
+ setSearchParams(newSearchParams, { replace: true });
169
+ // No hacer fetchData aquí, se hará cuando cambien los searchParams
170
+ return;
171
+ }
172
+ }
173
+ // Actualizar los valores anteriores
174
+ prevUrlParamsValuesRef.current = { ...urlParamsValues };
175
+ // eslint-disable-next-line react-hooks/exhaustive-deps
176
+ }, [JSON.stringify(urlParamsValues), pageParam, urlParamsKey]);
177
+ // useEffect consolidado para escuchar cambios que requieren recargar datos
178
+ useEffect(() => {
179
+ // Usar un pequeño delay para agrupar múltiples cambios rápidos en el mismo tick
180
+ const timeoutId = setTimeout(() => {
181
+ fetchData();
182
+ }, 0);
183
+ return () => clearTimeout(timeoutId);
184
+ // eslint-disable-next-line react-hooks/exhaustive-deps
185
+ }, [getPromise, searchParams, pageParam, urlParamsKey]);
186
+ const value = {
187
+ list,
188
+ page,
189
+ pages,
190
+ total,
191
+ limit,
192
+ isLoading,
193
+ params: currentParams,
194
+ refetch,
195
+ createItem,
196
+ deleteItem,
197
+ pagination: (_jsx(Pagination, { page: page, pages: pages, total: total, fieldName: pageParam, isLoading: isLoading })),
198
+ };
199
+ return (_jsx(ListCrudContext.Provider, { value: value, children: children }));
200
+ }
201
+ // Hook to use ListCrud context
202
+ // eslint-disable-next-line react-refresh/only-export-components
203
+ export function useListCrud() {
204
+ const context = useContext(ListCrudContext);
205
+ if (context === undefined) {
206
+ throw new Error("useListCrud must be used within a ListCrudProvider");
207
+ }
208
+ return context;
209
+ }
@@ -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",
@@ -16,7 +16,9 @@ export const AuthDocsContent = () => {
16
16
  return (_jsxs("div", { className: "space-y-4", children: [_jsx(InterfacesDocumentation, {}), _jsx(Card, { children: _jsx("div", { className: "flex items-center justify-center py-8", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("i", { className: "fa fa-spinner fa-spin text-[var(--color-primary)] text-xl" }), _jsx("span", { className: "text-[var(--color-text-secondary)]", children: "Iniciando sesi\u00F3n..." })] }) }) })] }));
17
17
  }
18
18
  if (isAuthenticated && user) {
19
- return (_jsxs("div", { className: "space-y-4", children: [_jsx(InterfacesDocumentation, {}), _jsx(Card, { title: "Sesi\u00F3n Activa", subtitle: "Informaci\u00F3n del usuario autenticado", headerActions: _jsx(Badge, { variant: "success", icon: "fa-check-circle", iconPosition: "left", children: "Autenticado" }), children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [_jsx(DataField, { label: "ID de Usuario", value: user.id }), _jsx(DataField, { label: "Nombre", value: user.name || "No disponible" })] }), user.aditionalData && (_jsxs("div", { className: "mt-4 pt-4 border-t border-[var(--color-border-default)]", children: [_jsx("h4", { className: "text-sm font-semibold text-[var(--color-text-primary)] mb-3", children: "Datos Adicionales" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [user.aditionalData.role && (_jsx(DataField, { label: "Rol", value: _jsx(Badge, { variant: "primary", icon: "fa-user-shield", children: user.aditionalData.role }) })), user.aditionalData.email && (_jsx(DataField, { label: "Email", value: user.aditionalData.email })), user.aditionalData.createdAt && (_jsx(DataField, { label: "Fecha de Creaci\u00F3n", value: new Date(user.aditionalData.createdAt).toLocaleString() })), user.aditionalData.permissions && (_jsx(DataField, { label: "Permisos", value: _jsx("div", { className: "flex flex-wrap gap-2", children: user.aditionalData.permissions.map((permission, index) => (_jsx(Badge, { variant: "info", size: "sm", icon: "fa-key", children: permission }, index))) }) }))] })] })), user.token && (_jsxs("div", { className: "mt-4 pt-4 border-t border-[var(--color-border-default)]", children: [_jsx("h4", { className: "text-sm font-semibold text-[var(--color-text-primary)] mb-3", children: "Informaci\u00F3n del Token" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [_jsx(DataField, { label: "Tipo de Token", value: _jsx(Badge, { variant: "secondary", icon: "fa-tag", children: user.token.tokenType || "Bearer" }) }), user.token.expires && (_jsx(DataField, { label: "Expira", value: new Date(user.token.expires).toLocaleString() })), user.token.accessToken && (_jsx(DataField, { label: "Access Token", value: _jsxs("code", { className: "text-xs bg-[var(--color-bg-secondary)] px-2 py-1 rounded break-all", children: [user.token.accessToken.substring(0, 30), "..."] }) }))] })] })), _jsx("div", { className: "mt-6 pt-4 border-t border-[var(--color-border-default)]", children: _jsx(Button, { variant: "outline", icon: "fa-sign-out-alt", iconPosition: "left", onClick: handleLogout, className: "w-full md:w-auto", children: "Cerrar Sesi\u00F3n" }) })] }) })] }));
19
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(InterfacesDocumentation, {}), _jsx(Card, { title: "Sesi\u00F3n Activa", subtitle: "Informaci\u00F3n del usuario autenticado", headerActions: () => [
20
+ _jsx(Badge, { variant: "success", icon: "fa-check-circle", iconPosition: "left", children: "Autenticado" }),
21
+ ], children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [_jsx(DataField, { label: "ID de Usuario", value: user.id }), _jsx(DataField, { label: "Nombre", value: user.name || "No disponible" })] }), user.aditionalData && (_jsxs("div", { className: "mt-4 pt-4 border-t border-[var(--color-border-default)]", children: [_jsx("h4", { className: "text-sm font-semibold text-[var(--color-text-primary)] mb-3", children: "Datos Adicionales" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [user.aditionalData.role && (_jsx(DataField, { label: "Rol", value: _jsx(Badge, { variant: "primary", icon: "fa-user-shield", children: user.aditionalData.role }) })), user.aditionalData.email && (_jsx(DataField, { label: "Email", value: user.aditionalData.email })), user.aditionalData.createdAt && (_jsx(DataField, { label: "Fecha de Creaci\u00F3n", value: new Date(user.aditionalData.createdAt).toLocaleString() })), user.aditionalData.permissions && (_jsx(DataField, { label: "Permisos", value: _jsx("div", { className: "flex flex-wrap gap-2", children: user.aditionalData.permissions.map((permission, index) => (_jsx(Badge, { variant: "info", size: "sm", icon: "fa-key", children: permission }, index))) }) }))] })] })), user.token && (_jsxs("div", { className: "mt-4 pt-4 border-t border-[var(--color-border-default)]", children: [_jsx("h4", { className: "text-sm font-semibold text-[var(--color-text-primary)] mb-3", children: "Informaci\u00F3n del Token" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [_jsx(DataField, { label: "Tipo de Token", value: _jsx(Badge, { variant: "secondary", icon: "fa-tag", children: user.token.tokenType || "Bearer" }) }), user.token.expires && (_jsx(DataField, { label: "Expira", value: new Date(user.token.expires).toLocaleString() })), user.token.accessToken && (_jsx(DataField, { label: "Access Token", value: _jsxs("code", { className: "text-xs bg-[var(--color-bg-secondary)] px-2 py-1 rounded break-all", children: [user.token.accessToken.substring(0, 30), "..."] }) }))] })] })), _jsx("div", { className: "mt-6 pt-4 border-t border-[var(--color-border-default)]", children: _jsx(Button, { variant: "outline", icon: "fa-sign-out-alt", iconPosition: "left", onClick: handleLogout, className: "w-full md:w-auto", children: "Cerrar Sesi\u00F3n" }) })] }) })] }));
20
22
  }
21
23
  return (_jsxs("div", { className: "space-y-4", children: [_jsx(InterfacesDocumentation, {}), _jsx(Card, { title: "Autenticaci\u00F3n", subtitle: "Inicia sesi\u00F3n para ver el AuthContext en acci\u00F3n", children: _jsxs("div", { className: "space-y-4", children: [_jsx("div", { className: "bg-[var(--color-info-light)] border border-[var(--color-info)] rounded-lg p-4", children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("i", { className: "fa fa-info-circle text-[var(--color-info)] mt-1" }), _jsx("div", { className: "flex-1", children: _jsxs("p", { className: "text-sm text-[var(--color-text-primary)]", children: ["Esta es una demostraci\u00F3n del", " ", _jsx("code", { className: "text-xs bg-white/50 px-1 rounded", children: "AuthContext" }), " ", "usando un servicio mock. Haz clic en el bot\u00F3n para simular un inicio de sesi\u00F3n."] }) })] }) }), _jsx("div", { className: "flex justify-center pt-4", children: _jsx(Button, { variant: "primary", size: "lg", icon: "fa-sign-in-alt", iconPosition: "left", onClick: handleLogin, children: "Iniciar Sesi\u00F3n" }) })] }) })] }));
22
24
  };
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const AvatarDocs: React.FC;
3
+ export default AvatarDocs;
4
+ //# sourceMappingURL=AvatarDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarDocs.d.ts","sourceRoot":"","sources":["../../src/docs/AvatarDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EAwQvB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { Avatar, Card } from "../index";
4
+ const AvatarDocs = () => {
5
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "Avatar - Iniciales e Im\u00E1genes", children: _jsxs("div", { className: "space-y-8", children: [_jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Uso B\u00E1sico con Iniciales" }), _jsxs("div", { className: "flex flex-wrap gap-4 items-center", children: [_jsx(Avatar, { text: "John Doe" }), _jsx(Avatar, { text: "Jane Smith" }), _jsx(Avatar, { text: "Mar\u00EDa Garc\u00EDa" }), _jsx(Avatar, { text: "Pedro" }), _jsx(Avatar, { text: "Ana Mar\u00EDa L\u00F3pez" })] }), _jsx("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: "El componente muestra las iniciales del texto. Si hay una sola palabra, muestra la primera letra. Si hay m\u00FAltiples palabras, muestra la primera letra de la primera palabra y la primera letra de la \u00FAltima palabra." })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Tama\u00F1os" }), _jsxs("div", { className: "flex flex-wrap gap-4 items-center", children: [_jsxs("div", { className: "flex flex-col items-center gap-2", children: [_jsx(Avatar, { text: "Small", size: "sm" }), _jsx("span", { className: "text-xs", style: { color: "var(--flysoft-text-secondary)" }, children: "sm" })] }), _jsxs("div", { className: "flex flex-col items-center gap-2", children: [_jsx(Avatar, { text: "Medium", size: "md" }), _jsx("span", { className: "text-xs", style: { color: "var(--flysoft-text-secondary)" }, children: "md (default)" })] }), _jsxs("div", { className: "flex flex-col items-center gap-2", children: [_jsx(Avatar, { text: "Large", size: "lg" }), _jsx("span", { className: "text-xs", style: { color: "var(--flysoft-text-secondary)" }, children: "lg" })] })] }), _jsxs("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: ["Usa la propiedad ", _jsx("code", { children: "size" }), " para cambiar el tama\u00F1o del avatar. Los tama\u00F1os disponibles son: ", _jsx("code", { children: "sm" }), ", ", _jsx("code", { children: "md" }), " (por defecto), y ", _jsx("code", { children: "lg" }), "."] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Con Im\u00E1genes" }), _jsxs("div", { className: "flex flex-wrap gap-4 items-center", children: [_jsx(Avatar, { text: "Usuario con Imagen", image: "https://i.pravatar.cc/150?img=1" }), _jsx(Avatar, { text: "Otra Imagen", image: "https://i.pravatar.cc/150?img=12" }), _jsx(Avatar, { text: "Tercera Imagen", image: "https://i.pravatar.cc/150?img=33" })] }), _jsxs("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: ["Cuando se proporciona una imagen mediante la propiedad ", _jsx("code", { children: "image" }), ", el avatar muestra la imagen en lugar de las iniciales. Si la imagen falla al cargar, autom\u00E1ticamente se mostrar\u00E1n las iniciales como fallback."] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Colores Personalizados" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h4", { className: "text-md font-medium mb-2", style: { color: "var(--flysoft-text-primary)" }, children: "Colores Hexadecimales" }), _jsxs("div", { className: "flex flex-wrap gap-4 items-center", children: [_jsx(Avatar, { text: "Azul", bgColor: "#3b82f6", textColor: "#ffffff" }), _jsx(Avatar, { text: "Verde", bgColor: "#10b981", textColor: "#ffffff" }), _jsx(Avatar, { text: "Rojo", bgColor: "#ef4444", textColor: "#ffffff" }), _jsx(Avatar, { text: "Amarillo", bgColor: "#f59e0b", textColor: "#000000" }), _jsx(Avatar, { text: "P\u00FArpura", bgColor: "#8b5cf6", textColor: "#ffffff" }), _jsx(Avatar, { text: "Rosa", bgColor: "#ec4899", textColor: "#ffffff" })] })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-md font-medium mb-2", style: { color: "var(--flysoft-text-primary)" }, children: "Colores RGB" }), _jsxs("div", { className: "flex flex-wrap gap-4 items-center", children: [_jsx(Avatar, { text: "RGB", bgColor: "rgb(59, 130, 246)", textColor: "rgb(255, 255, 255)" }), _jsx(Avatar, { text: "RGBA", bgColor: "rgba(16, 185, 129, 0.9)", textColor: "rgb(255, 255, 255)" })] })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-md font-medium mb-2", style: { color: "var(--flysoft-text-primary)" }, children: "Nombres de Colores" }), _jsxs("div", { className: "flex flex-wrap gap-4 items-center", children: [_jsx(Avatar, { text: "Gray-800", bgColor: "gray-800", textColor: "white" }), _jsx(Avatar, { text: "Gray-700", bgColor: "gray-700", textColor: "white" }), _jsx(Avatar, { text: "Gray-500", bgColor: "gray-500", textColor: "white" })] })] }), _jsxs("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: ["Usa las propiedades ", _jsx("code", { children: "bgColor" }), " y ", _jsx("code", { children: "textColor" }), " para personalizar los colores. Puedes usar valores hexadecimales (ej:", " ", _jsx("code", { children: "#3b82f6" }), "), RGB (ej: ", _jsx("code", { children: "rgb(59, 130, 246)" }), "), o nombres de colores comunes (ej: ", _jsx("code", { children: "white" }), ", ", _jsx("code", { children: "black" }), ",", _jsx("code", { children: "gray-600" }), "). Por defecto, el fondo es ", _jsx("code", { children: "gray-600" }), " y el texto es ", _jsx("code", { children: "white" }), "."] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Ejemplos Pr\u00E1cticos" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h4", { className: "text-md font-medium mb-2", style: { color: "var(--flysoft-text-primary)" }, children: "Lista de Usuarios" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Avatar, { text: "Juan P\u00E9rez", bgColor: "#3b82f6" }), _jsx("span", { style: { color: "var(--flysoft-text-primary)" }, children: "Juan P\u00E9rez" })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Avatar, { text: "Mar\u00EDa Gonz\u00E1lez", bgColor: "#10b981" }), _jsx("span", { style: { color: "var(--flysoft-text-primary)" }, children: "Mar\u00EDa Gonz\u00E1lez" })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Avatar, { text: "Carlos Rodr\u00EDguez", image: "https://i.pravatar.cc/150?img=5" }), _jsx("span", { style: { color: "var(--flysoft-text-primary)" }, children: "Carlos Rodr\u00EDguez" })] })] })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-md font-medium mb-2", style: { color: "var(--flysoft-text-primary)" }, children: "Diferentes Tama\u00F1os con Colores" }), _jsxs("div", { className: "flex flex-wrap gap-4 items-center", children: [_jsx(Avatar, { text: "SM", size: "sm", bgColor: "#8b5cf6" }), _jsx(Avatar, { text: "MD", size: "md", bgColor: "#ec4899" }), _jsx(Avatar, { text: "LG", size: "lg", bgColor: "#f59e0b" })] })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Atributo Title" }), _jsxs("div", { className: "flex flex-wrap gap-4 items-center", children: [_jsx(Avatar, { text: "Pasa el mouse aqu\u00ED" }), _jsx(Avatar, { text: "John Doe", bgColor: "#3b82f6" }), _jsx(Avatar, { text: "Usuario con Imagen", image: "https://i.pravatar.cc/150?img=8" })] }), _jsxs("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: ["El componente siempre incluye un atributo ", _jsx("code", { children: "title" }), " con el texto completo. Pasa el mouse sobre cualquier avatar para ver el tooltip."] })] })] }) }) }));
6
+ };
7
+ export default AvatarDocs;
@@ -1 +1 @@
1
- {"version":3,"file":"BadgeDocs.d.ts","sourceRoot":"","sources":["../../src/docs/BadgeDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAiFtB,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"BadgeDocs.d.ts","sourceRoot":"","sources":["../../src/docs/BadgeDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAsWtB,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -1,7 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React from "react";
2
+ import React, { useState } from "react";
3
3
  import { Badge, Card } from "../index";
4
4
  const BadgeDocs = () => {
5
- return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "Badge - Variantes y Estados", children: _jsxs("div", { className: "space-y-8", children: [_jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Variantes" }), _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4", children: [_jsx(Badge, { variant: "primary", children: "Primario" }), _jsx(Badge, { variant: "secondary", children: "Secundario" }), _jsx(Badge, { variant: "success", icon: "fa-check-circle", children: "\u00C9xito" }), _jsx(Badge, { variant: "warning", icon: "fa-exclamation-triangle", children: "Advertencia" }), _jsx(Badge, { variant: "danger", icon: "fa-times-circle", children: "Error" }), _jsx(Badge, { variant: "info", icon: "fa-info-circle", children: "Informaci\u00F3n" })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Tama\u00F1os" }), _jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [_jsx(Badge, { size: "sm", icon: "fa-circle", iconLabel: "Indicador peque\u00F1o", children: "Peque\u00F1o" }), _jsx(Badge, { size: "md", icon: "fa-circle", children: "Mediano" }), _jsx(Badge, { size: "lg", icon: "fa-circle", children: "Grande" })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "\u00CDconos y dise\u00F1o" }), _jsxs("div", { className: "flex flex-wrap gap-3 items-center", children: [_jsx(Badge, { icon: "fa-bell", rounded: true, children: "Notificaci\u00F3n" }), _jsx(Badge, { icon: "fa-arrow-right", iconPosition: "right", children: "Acci\u00F3n" }), _jsx(Badge, { icon: "fa-shield-alt", iconLabel: "Estado protegido", children: "Accesible" })] }), _jsxs("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: ["Usa ", _jsx("code", { children: "icon" }), " con clases FontAwesome 5 (ej.", " ", _jsx("code", { children: "fa-check" }), ") y combina ", _jsx("code", { children: "rounded" }), " para badges tipo pills."] })] })] }) }) }));
5
+ const [clickCount, setClickCount] = useState(0);
6
+ const [iconClickCount, setIconClickCount] = useState(0);
7
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "Badge - Variantes y Estados", children: _jsxs("div", { className: "space-y-8", children: [_jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Variantes" }), _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4", children: [_jsx(Badge, { variant: "primary", icon: "fa-star", iconPosition: "right", children: "Primario" }), _jsx(Badge, { variant: "secondary", children: "Secundario" }), _jsx(Badge, { variant: "success", icon: "fa-check-circle", children: "\u00C9xito" }), _jsx(Badge, { variant: "warning", icon: "fa-exclamation-triangle", children: "Advertencia" }), _jsx(Badge, { variant: "danger", icon: "fa-times-circle", children: "Error" }), _jsx(Badge, { variant: "info", icon: "fa-info-circle", children: "Informaci\u00F3n" })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Tama\u00F1os" }), _jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [_jsx(Badge, { size: "sm", icon: "fa-circle", iconLabel: "Indicador peque\u00F1o", children: "Peque\u00F1o" }), _jsx(Badge, { size: "md", icon: "fa-circle", children: "Mediano" }), _jsx(Badge, { size: "lg", icon: "fa-circle", children: "Grande" })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "\u00CDconos y dise\u00F1o" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h4", { className: "text-md font-medium mb-2", style: { color: "var(--flysoft-text-primary)" }, children: "Iconos a la izquierda (por defecto)" }), _jsxs("div", { className: "flex flex-wrap gap-3 items-center", children: [_jsx(Badge, { icon: "fa-bell", rounded: true, children: "Notificaci\u00F3n" }), _jsx(Badge, { variant: "primary", icon: "fa-star", children: "Primario" }), _jsx(Badge, { variant: "success", icon: "fa-check-circle", children: "\u00C9xito" }), _jsx(Badge, { icon: "fa-shield-alt", iconLabel: "Estado protegido", children: "Accesible" })] })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-md font-medium mb-2", style: { color: "var(--flysoft-text-primary)" }, children: "Iconos a la derecha (iconPosition=\"right\")" }), _jsxs("div", { className: "flex flex-wrap gap-3 items-center", children: [_jsx(Badge, { variant: "primary", icon: "fa-star", iconPosition: "right", children: "Primario" }), _jsx(Badge, { variant: "secondary", icon: "fa-circle", iconPosition: "right", children: "Secundario" }), _jsx(Badge, { variant: "success", icon: "fa-check", iconPosition: "right", children: "\u00C9xito" }), _jsx(Badge, { variant: "warning", icon: "fa-exclamation", iconPosition: "right", children: "Advertencia" }), _jsx(Badge, { variant: "danger", icon: "fa-times", iconPosition: "right", children: "Error" }), _jsx(Badge, { variant: "info", icon: "fa-info", iconPosition: "right", children: "Informaci\u00F3n" }), _jsx(Badge, { icon: "fa-arrow-right", iconPosition: "right", rounded: true, children: "Acci\u00F3n" })] })] })] }), _jsxs("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: ["Usa ", _jsx("code", { children: "icon" }), " con clases FontAwesome 5 (ej.", " ", _jsx("code", { children: "fa-check" }), "). El prop ", _jsx("code", { children: "iconPosition" }), " puede ser ", _jsx("code", { children: "\"left\"" }), " (por defecto) o ", _jsx("code", { children: "\"right\"" }), " para posicionar el icono. Combina ", _jsx("code", { children: "rounded" }), " para badges tipo pills."] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Interactividad con onClick" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h4", { className: "text-md font-medium mb-2", style: { color: "var(--flysoft-text-primary)" }, children: "Badge sin iconos (todo el badge es clickeable)" }), _jsxs("div", { className: "flex flex-wrap gap-3 items-center", children: [_jsxs(Badge, { variant: "primary", onClick: () => setClickCount((prev) => prev + 1), children: ["Click aqu\u00ED (", clickCount, ")"] }), _jsx(Badge, { variant: "success", onClick: () => alert("Badge clickeado!"), children: "Alerta" }), _jsx(Badge, { variant: "info", rounded: true, onClick: () => console.log("Badge info clickeado"), children: "Ver en consola" })] }), _jsxs("p", { className: "text-sm mt-2", style: { color: "var(--flysoft-text-secondary)" }, children: ["Cuando no hay iconos, el ", _jsx("code", { children: "onClick" }), " afecta a todo el badge y muestra cursor pointer."] })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-md font-medium mb-2", style: { color: "var(--flysoft-text-primary)" }, children: "Badge con iconos (solo los iconos son clickeables)" }), _jsxs("div", { className: "flex flex-wrap gap-3 items-center", children: [_jsxs(Badge, { variant: "warning", icon: "fa-times-circle", onClick: () => setIconClickCount((prev) => prev + 1), children: ["Cerrar (", iconClickCount, ")"] }), _jsx(Badge, { variant: "danger", icon: "fa-trash", iconPosition: "right", onClick: () => alert("Eliminar item"), children: "Eliminar" }), _jsx(Badge, { variant: "info", icon: "fa-edit", rounded: true, onClick: () => console.log("Editar clickeado"), children: "Editar" }), _jsx(Badge, { variant: "success", icon: "fa-check", iconPosition: "right", onClick: () => alert("Aceptar"), children: "Aceptar" })] }), _jsxs("p", { className: "text-sm mt-2", style: { color: "var(--flysoft-text-secondary)" }, children: ["Cuando hay iconos, el ", _jsx("code", { children: "onClick" }), " solo afecta a los iconos (tienen cursor pointer). El texto del badge no es clickeable."] })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Background personalizado" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h4", { className: "text-md font-medium mb-2", style: { color: "var(--flysoft-text-primary)" }, children: "Colores personalizados (hex, rgb, nombres)" }), _jsxs("div", { className: "flex flex-wrap gap-3 items-center", children: [_jsx(Badge, { bg: "#ff6b6b", textColor: "white", children: "Rojo personalizado" }), _jsx(Badge, { bg: "#4ecdc4", textColor: "white", children: "Turquesa" }), _jsx(Badge, { bg: "#ffe66d", textColor: "#1f2937", children: "Amarillo claro" }), _jsx(Badge, { bg: "rgb(138, 43, 226)", textColor: "white", children: "Violeta RGB" }), _jsx(Badge, { bg: "#95e1d3", textColor: "#1f2937", children: "Verde menta" }), _jsx(Badge, { bg: "#f38181", textColor: "white", children: "Coral" })] })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-md font-medium mb-2", style: { color: "var(--flysoft-text-primary)" }, children: "Con iconos y rounded" }), _jsxs("div", { className: "flex flex-wrap gap-3 items-center", children: [_jsx(Badge, { bg: "#6c5ce7", textColor: "white", icon: "fa-star", rounded: true, children: "Premium" }), _jsx(Badge, { bg: "#00b894", textColor: "white", icon: "fa-check-circle", iconPosition: "right", children: "Verificado" }), _jsx(Badge, { bg: "#e17055", textColor: "white", icon: "fa-fire", rounded: true, children: "Popular" }), _jsx(Badge, { bg: "#0984e3", textColor: "white", icon: "fa-bolt", iconPosition: "right", rounded: true, children: "R\u00E1pido" })] })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-md font-medium mb-2", style: { color: "var(--flysoft-text-primary)" }, children: "Con onClick y background personalizado" }), _jsxs("div", { className: "flex flex-wrap gap-3 items-center", children: [_jsx(Badge, { bg: "#a29bfe", textColor: "white", onClick: () => alert("Badge personalizado clickeado!"), children: "Click aqu\u00ED" }), _jsx(Badge, { bg: "#fd79a8", textColor: "white", icon: "fa-heart", onClick: () => alert("Me gusta!"), rounded: true, children: "Me gusta" }), _jsx(Badge, { bg: "#55efc4", textColor: "#1f2937", icon: "fa-share", iconPosition: "right", onClick: () => console.log("Compartir"), children: "Compartir" })] })] }), _jsxs("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: ["Usa ", _jsx("code", { children: "bg" }), " para definir un color de fondo personalizado (hex, rgb, nombres de colores CSS como \"white\", \"black\", o valores Tailwind como \"gray-800\") y ", _jsx("code", { children: "textColor" }), " para personalizar el color del texto. Si no especificas", " ", _jsx("code", { children: "textColor" }), ", se usa gris oscuro por defecto."] })] })] })] }) }) }));
6
8
  };
7
9
  export default BadgeDocs;
@@ -1 +1 @@
1
- {"version":3,"file":"CardDocs.d.ts","sourceRoot":"","sources":["../../src/docs/CardDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,QAAA,MAAM,QAAQ,EAAE,KAAK,CAAC,EA+IrB,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"CardDocs.d.ts","sourceRoot":"","sources":["../../src/docs/CardDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,QAAA,MAAM,QAAQ,EAAE,KAAK,CAAC,EA2drB,CAAC;AAEF,eAAe,QAAQ,CAAC"}