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.
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +19 -7
- package/dist/components/form-controls/AutocompleteInput.d.ts +11 -3
- package/dist/components/form-controls/AutocompleteInput.d.ts.map +1 -1
- package/dist/components/form-controls/AutocompleteInput.js +411 -31
- package/dist/components/form-controls/Button.d.ts +3 -0
- package/dist/components/form-controls/Button.d.ts.map +1 -1
- package/dist/components/form-controls/Button.js +160 -19
- package/dist/components/form-controls/Checkbox.d.ts +14 -0
- package/dist/components/form-controls/Checkbox.d.ts.map +1 -0
- package/dist/components/form-controls/Checkbox.js +79 -0
- package/dist/components/form-controls/DateInput.d.ts +24 -4
- package/dist/components/form-controls/DateInput.d.ts.map +1 -1
- package/dist/components/form-controls/DateInput.js +492 -70
- package/dist/components/form-controls/DatePicker.d.ts +4 -3
- package/dist/components/form-controls/DatePicker.d.ts.map +1 -1
- package/dist/components/form-controls/DatePicker.js +26 -30
- package/dist/components/form-controls/Input.d.ts +10 -1
- package/dist/components/form-controls/Input.d.ts.map +1 -1
- package/dist/components/form-controls/Input.js +17 -10
- package/dist/components/form-controls/LinkButton.d.ts +15 -0
- package/dist/components/form-controls/LinkButton.d.ts.map +1 -0
- package/dist/components/form-controls/LinkButton.js +248 -0
- package/dist/components/form-controls/Pagination.d.ts +1 -0
- package/dist/components/form-controls/Pagination.d.ts.map +1 -1
- package/dist/components/form-controls/Pagination.js +3 -40
- package/dist/components/form-controls/RadioButtonGroup.d.ts +62 -0
- package/dist/components/form-controls/RadioButtonGroup.d.ts.map +1 -0
- package/dist/components/form-controls/RadioButtonGroup.js +220 -0
- package/dist/components/form-controls/SearchSelectInput-OLD.d.ts +68 -0
- package/dist/components/form-controls/SearchSelectInput-OLD.d.ts.map +1 -0
- package/dist/components/form-controls/SearchSelectInput-OLD.js +963 -0
- package/dist/components/form-controls/SearchSelectInput.d.ts +70 -0
- package/dist/components/form-controls/SearchSelectInput.d.ts.map +1 -0
- package/dist/components/form-controls/SearchSelectInput.js +336 -0
- package/dist/components/form-controls/index.d.ts +9 -1
- package/dist/components/form-controls/index.d.ts.map +1 -1
- package/dist/components/form-controls/index.js +4 -0
- package/dist/components/layout/Accordion.d.ts +13 -0
- package/dist/components/layout/Accordion.d.ts.map +1 -0
- package/dist/components/layout/Accordion.js +67 -0
- package/dist/components/layout/AppLayout.d.ts +3 -2
- package/dist/components/layout/AppLayout.d.ts.map +1 -1
- package/dist/components/layout/AppLayout.js +104 -31
- package/dist/components/layout/Card.d.ts +8 -3
- package/dist/components/layout/Card.d.ts.map +1 -1
- package/dist/components/layout/Card.js +18 -19
- package/dist/components/layout/Collection.js +1 -1
- package/dist/components/layout/DataTable.d.ts +3 -1
- package/dist/components/layout/DataTable.d.ts.map +1 -1
- package/dist/components/layout/DataTable.js +34 -29
- package/dist/components/layout/index.d.ts +2 -0
- package/dist/components/layout/index.d.ts.map +1 -1
- package/dist/components/layout/index.js +1 -0
- package/dist/components/utils/Avatar.d.ts +49 -0
- package/dist/components/utils/Avatar.d.ts.map +1 -0
- package/dist/components/utils/Avatar.js +93 -0
- package/dist/components/utils/Badge.d.ts +3 -0
- package/dist/components/utils/Badge.d.ts.map +1 -1
- package/dist/components/utils/Badge.js +131 -26
- package/dist/components/utils/Dialog.d.ts.map +1 -1
- package/dist/components/utils/Dialog.js +6 -1
- package/dist/components/utils/Filter.d.ts +57 -0
- package/dist/components/utils/Filter.d.ts.map +1 -0
- package/dist/components/utils/Filter.js +581 -0
- package/dist/components/utils/FiltersDialog.d.ts +21 -0
- package/dist/components/utils/FiltersDialog.d.ts.map +1 -0
- package/dist/components/utils/FiltersDialog.js +104 -0
- package/dist/components/utils/Loader.js +2 -2
- package/dist/components/utils/RoadMap.d.ts +59 -0
- package/dist/components/utils/RoadMap.d.ts.map +1 -0
- package/dist/components/utils/RoadMap.js +139 -0
- package/dist/components/utils/Snackbar.d.ts +13 -0
- package/dist/components/utils/Snackbar.d.ts.map +1 -0
- package/dist/components/utils/Snackbar.js +122 -0
- package/dist/components/utils/SnackbarContainer.d.ts +7 -0
- package/dist/components/utils/SnackbarContainer.d.ts.map +1 -0
- package/dist/components/utils/SnackbarContainer.js +25 -0
- package/dist/components/utils/iconUtils.d.ts +16 -0
- package/dist/components/utils/iconUtils.d.ts.map +1 -0
- package/dist/components/utils/iconUtils.js +40 -0
- package/dist/components/utils/index.d.ts +12 -0
- package/dist/components/utils/index.d.ts.map +1 -1
- package/dist/components/utils/index.js +6 -0
- package/dist/contexts/AppLayoutContext.d.ts +40 -0
- package/dist/contexts/AppLayoutContext.d.ts.map +1 -0
- package/dist/contexts/AppLayoutContext.js +98 -0
- package/dist/contexts/ListCrudContext.d.ts +50 -0
- package/dist/contexts/ListCrudContext.d.ts.map +1 -0
- package/dist/contexts/ListCrudContext.js +253 -0
- package/dist/contexts/SnackbarContext.d.ts +26 -0
- package/dist/contexts/SnackbarContext.d.ts.map +1 -0
- package/dist/contexts/SnackbarContext.js +34 -0
- package/dist/contexts/index.d.ts +6 -0
- package/dist/contexts/index.d.ts.map +1 -1
- package/dist/contexts/index.js +6 -0
- package/dist/contexts/presets.js +6 -6
- package/dist/docs/AccordionDocs.d.ts +4 -0
- package/dist/docs/AccordionDocs.d.ts.map +1 -0
- package/dist/docs/AccordionDocs.js +21 -0
- package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +3 -5
- package/dist/docs/AutocompleteInputDocs.js +1 -1
- package/dist/docs/AvatarDocs.d.ts +4 -0
- package/dist/docs/AvatarDocs.d.ts.map +1 -0
- package/dist/docs/AvatarDocs.js +7 -0
- package/dist/docs/BadgeDocs.d.ts.map +1 -1
- package/dist/docs/BadgeDocs.js +4 -2
- package/dist/docs/ButtonDocs.d.ts.map +1 -1
- package/dist/docs/ButtonDocs.js +1 -1
- package/dist/docs/CardDocs.d.ts.map +1 -1
- package/dist/docs/CardDocs.js +17 -8
- package/dist/docs/CheckboxDocs.d.ts +4 -0
- package/dist/docs/CheckboxDocs.d.ts.map +1 -0
- package/dist/docs/CheckboxDocs.js +7 -0
- package/dist/docs/DataTableDocs.d.ts.map +1 -1
- package/dist/docs/DataTableDocs.js +9 -5
- package/dist/docs/DateInputDocs.d.ts +1 -0
- package/dist/docs/DateInputDocs.d.ts.map +1 -1
- package/dist/docs/DateInputDocs.js +7 -9
- package/dist/docs/DatePickerDocs.d.ts +1 -0
- package/dist/docs/DatePickerDocs.d.ts.map +1 -1
- package/dist/docs/DatePickerDocs.js +6 -8
- package/dist/docs/DialogDocs.js +1 -1
- package/dist/docs/DocAdmin.d.ts +4 -0
- package/dist/docs/DocAdmin.d.ts.map +1 -0
- package/dist/docs/DocAdmin.js +68 -0
- package/dist/docs/DocsMenu.d.ts.map +1 -1
- package/dist/docs/DocsMenu.js +3 -3
- package/dist/docs/DocsRouter.d.ts.map +1 -1
- package/dist/docs/DocsRouter.js +13 -1
- package/dist/docs/DropdownMenuDocs.js +1 -1
- package/dist/docs/ExampleFormDocs.d.ts +4 -0
- package/dist/docs/ExampleFormDocs.d.ts.map +1 -0
- package/dist/docs/ExampleFormDocs.js +148 -0
- package/dist/docs/FilterDocs.d.ts +4 -0
- package/dist/docs/FilterDocs.d.ts.map +1 -0
- package/dist/docs/FilterDocs.js +112 -0
- package/dist/docs/InputDocs.d.ts.map +1 -1
- package/dist/docs/InputDocs.js +11 -1
- package/dist/docs/LinkButtonDocs.d.ts +4 -0
- package/dist/docs/LinkButtonDocs.d.ts.map +1 -0
- package/dist/docs/LinkButtonDocs.js +7 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +29 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +7 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +57 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts +9 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +30 -0
- package/dist/docs/PaginationDocs.js +6 -6
- package/dist/docs/RadioButtonGroupDocs.d.ts +4 -0
- package/dist/docs/RadioButtonGroupDocs.d.ts.map +1 -0
- package/dist/docs/RadioButtonGroupDocs.js +46 -0
- package/dist/docs/RoadMapDocs.d.ts +4 -0
- package/dist/docs/RoadMapDocs.d.ts.map +1 -0
- package/dist/docs/RoadMapDocs.js +171 -0
- package/dist/docs/SearchSelectInputDocs.d.ts +4 -0
- package/dist/docs/SearchSelectInputDocs.d.ts.map +1 -0
- package/dist/docs/SearchSelectInputDocs.js +168 -0
- package/dist/docs/SnackbarDocs.d.ts +4 -0
- package/dist/docs/SnackbarDocs.d.ts.map +1 -0
- package/dist/docs/SnackbarDocs.js +50 -0
- package/dist/docs/TabsGroupDocs.d.ts.map +1 -1
- package/dist/docs/TabsGroupDocs.js +12 -1
- package/dist/docs/docMockServices/empresaService.d.ts +38 -0
- package/dist/docs/docMockServices/empresaService.d.ts.map +1 -0
- package/dist/docs/docMockServices/empresaService.js +117 -0
- package/dist/docs/docMockServices/index.d.ts +9 -0
- package/dist/docs/docMockServices/index.d.ts.map +1 -0
- package/dist/docs/docMockServices/index.js +8 -0
- package/dist/docs/docMockServices/initialData.d.ts +6 -0
- package/dist/docs/docMockServices/initialData.d.ts.map +1 -0
- package/dist/docs/docMockServices/initialData.js +132 -0
- package/dist/docs/docMockServices/interfaces.d.ts +26 -0
- package/dist/docs/docMockServices/interfaces.d.ts.map +1 -0
- package/dist/docs/docMockServices/interfaces.js +1 -0
- package/dist/docs/docMockServices/personaEmpresaService.d.ts +43 -0
- package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +1 -0
- package/dist/docs/docMockServices/personaEmpresaService.js +113 -0
- package/dist/docs/docMockServices/personaService.d.ts +39 -0
- package/dist/docs/docMockServices/personaService.d.ts.map +1 -0
- package/dist/docs/docMockServices/personaService.js +181 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useAsyncRequest.d.ts +17 -0
- package/dist/hooks/useAsyncRequest.d.ts.map +1 -0
- package/dist/hooks/useAsyncRequest.js +70 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +23 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/templates/forms/ContactForm.js +2 -2
- package/dist/templates/forms/LoginForm.js +1 -1
- package/dist/templates/forms/RegistrationForm.js +1 -1
- package/dist/templates/layouts/SidebarLayout.d.ts.map +1 -1
- package/dist/templates/layouts/SidebarLayout.js +3 -2
- package/dist/templates/patterns/FormPattern.d.ts.map +1 -1
- package/dist/templates/patterns/FormPattern.js +4 -3
- 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
|
+
};
|
package/dist/contexts/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/contexts/index.js
CHANGED
|
@@ -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";
|
package/dist/contexts/presets.js
CHANGED
|
@@ -191,9 +191,9 @@ export const blueTheme = {
|
|
|
191
191
|
textDisabled: "#94a3b8",
|
|
192
192
|
},
|
|
193
193
|
shadows: {
|
|
194
|
-
sm: "0 1px 2px 0 rgb(
|
|
195
|
-
md: "0 4px 6px -1px rgb(
|
|
196
|
-
lg: "0 10px 15px -3px rgb(
|
|
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(
|
|
267
|
-
md: "0 4px 6px -1px rgb(
|
|
268
|
-
lg: "0 10px 15px -3px rgb(
|
|
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 @@
|
|
|
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;
|