flysoft-react-ui 0.3.2 → 0.4.0

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 (48) hide show
  1. package/dist/components/form-controls/DatePicker.d.ts.map +1 -1
  2. package/dist/components/form-controls/DatePicker.js +1 -1
  3. package/dist/components/form-controls/Pagination.d.ts +16 -0
  4. package/dist/components/form-controls/Pagination.d.ts.map +1 -0
  5. package/dist/components/form-controls/Pagination.js +60 -0
  6. package/dist/components/form-controls/index.d.ts +2 -0
  7. package/dist/components/form-controls/index.d.ts.map +1 -1
  8. package/dist/components/form-controls/index.js +1 -0
  9. package/dist/components/layout/TabPanel.d.ts +7 -0
  10. package/dist/components/layout/TabPanel.d.ts.map +1 -0
  11. package/dist/components/layout/TabPanel.js +11 -0
  12. package/dist/components/layout/TabsGroup.d.ts +20 -0
  13. package/dist/components/layout/TabsGroup.d.ts.map +1 -0
  14. package/dist/components/layout/TabsGroup.js +52 -0
  15. package/dist/components/layout/index.d.ts +4 -0
  16. package/dist/components/layout/index.d.ts.map +1 -1
  17. package/dist/components/layout/index.js +2 -0
  18. package/dist/components/utils/Dialog.d.ts +11 -0
  19. package/dist/components/utils/Dialog.d.ts.map +1 -0
  20. package/dist/components/utils/Dialog.js +39 -0
  21. package/dist/components/utils/Loader.d.ts +11 -0
  22. package/dist/components/utils/Loader.d.ts.map +1 -0
  23. package/dist/components/utils/Loader.js +44 -0
  24. package/dist/components/utils/index.d.ts +4 -0
  25. package/dist/components/utils/index.d.ts.map +1 -1
  26. package/dist/components/utils/index.js +2 -0
  27. package/dist/docs/DialogDocs.d.ts +4 -0
  28. package/dist/docs/DialogDocs.d.ts.map +1 -0
  29. package/dist/docs/DialogDocs.js +12 -0
  30. package/dist/docs/DocsMenu.d.ts.map +1 -1
  31. package/dist/docs/DocsMenu.js +1 -1
  32. package/dist/docs/DocsRouter.d.ts.map +1 -1
  33. package/dist/docs/DocsRouter.js +5 -1
  34. package/dist/docs/LoaderDocs.d.ts +4 -0
  35. package/dist/docs/LoaderDocs.d.ts.map +1 -0
  36. package/dist/docs/LoaderDocs.js +33 -0
  37. package/dist/docs/PaginationDocs.d.ts +4 -0
  38. package/dist/docs/PaginationDocs.d.ts.map +1 -0
  39. package/dist/docs/PaginationDocs.js +38 -0
  40. package/dist/docs/TabsGroupDocs.d.ts +4 -0
  41. package/dist/docs/TabsGroupDocs.d.ts.map +1 -0
  42. package/dist/docs/TabsGroupDocs.js +27 -0
  43. package/dist/index.css +1 -1
  44. package/dist/index.d.ts +10 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +5 -0
  47. package/dist/index.js.map +1 -1
  48. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.d.ts","sourceRoot":"","sources":["../../../src/components/form-controls/DatePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAChC,eAAe,CAAC,EAAE,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4BD,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAuOhD,CAAC"}
1
+ {"version":3,"file":"DatePicker.d.ts","sourceRoot":"","sources":["../../../src/components/form-controls/DatePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAChC,eAAe,CAAC,EAAE,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4BD,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA2OhD,CAAC"}
@@ -120,7 +120,7 @@ export const DatePicker = ({ value, onChange, initialViewDate, startWeekOn = "su
120
120
  month: "long",
121
121
  });
122
122
  return (_jsxs("div", { className: `inline-flex flex-col rounded-lg border border-[var(--color-border-default)]
123
- bg-[var(--color-bg-default)] p-3 shadow-sm font-[var(--font-default)] text-sm ${className}`, children: [_jsxs("div", { className: "flex items-center justify-between mb-2", children: [_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Button, { size: "sm", variant: "ghost", icon: "fa-angle-double-left", onClick: handlePrevYear, "aria-label": "A\u00F1o anterior" }), _jsx(Button, { size: "sm", variant: "ghost", icon: "fa-angle-left", onClick: handlePrevMonth, "aria-label": "Mes anterior" })] }), _jsx("div", { className: "text-center", children: _jsxs("div", { className: "text-[var(--color-text-primary)] font-medium capitalize", children: [monthName, " ", view.year] }) }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Button, { size: "sm", variant: "ghost", icon: "fa-angle-right", onClick: handleNextMonth, "aria-label": "Mes siguiente" }), _jsx(Button, { size: "sm", variant: "ghost", icon: "fa-angle-double-right", onClick: handleNextYear, "aria-label": "A\u00F1o siguiente" })] })] }), _jsx("div", { className: "grid grid-cols-7 gap-1 mb-1", children: weekdayLabels.map((label) => (_jsx("div", { className: "text-xs text-center text-[var(--color-text-secondary)]", children: label }, label))) }), _jsx("div", { className: "grid grid-rows-6 gap-1", children: weeks.map((week, rowIndex) => (_jsx("div", { className: "grid grid-cols-7 gap-1", children: week.map((dayInfo, index) => {
123
+ bg-[var(--color-bg-default)] p-3 shadow-sm font-[var(--font-default)] text-sm ${className}`, children: [_jsxs("div", { className: "flex items-center justify-between mb-2", children: [_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Button, { type: "button", size: "sm", variant: "ghost", icon: "fa-angle-double-left", onClick: handlePrevYear, "aria-label": "A\u00F1o anterior" }), _jsx(Button, { type: "button", size: "sm", variant: "ghost", icon: "fa-angle-left", onClick: handlePrevMonth, "aria-label": "Mes anterior" })] }), _jsx("div", { className: "text-center", children: _jsxs("div", { className: "text-[var(--color-text-primary)] font-medium capitalize", children: [monthName, " ", view.year] }) }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Button, { type: "button", size: "sm", variant: "ghost", icon: "fa-angle-right", onClick: handleNextMonth, "aria-label": "Mes siguiente" }), _jsx(Button, { type: "button", size: "sm", variant: "ghost", icon: "fa-angle-double-right", onClick: handleNextYear, "aria-label": "A\u00F1o siguiente" })] })] }), _jsx("div", { className: "grid grid-cols-7 gap-1 mb-1", children: weekdayLabels.map((label) => (_jsx("div", { className: "text-xs text-center text-[var(--color-text-secondary)]", children: label }, label))) }), _jsx("div", { className: "grid grid-rows-6 gap-1", children: weeks.map((week, rowIndex) => (_jsx("div", { className: "grid grid-cols-7 gap-1", children: week.map((dayInfo, index) => {
124
124
  const { day, month, year } = dayInfo;
125
125
  const isCurrentMonth = month === view.month && year === view.year;
126
126
  const date = new Date(year, month, day);
@@ -0,0 +1,16 @@
1
+ import React from "react";
2
+ export interface PaginationInterface<T> {
3
+ list: Array<T>;
4
+ limit: number;
5
+ page: number;
6
+ pages: number;
7
+ total: number;
8
+ }
9
+ export interface PaginationProps {
10
+ fieldName?: string;
11
+ page?: number;
12
+ pages?: number;
13
+ total?: number;
14
+ }
15
+ export declare const Pagination: React.FC<PaginationProps>;
16
+ //# sourceMappingURL=Pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pagination.d.ts","sourceRoot":"","sources":["../../../src/components/form-controls/Pagination.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAsHhD,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { useSearchParams } from "react-router-dom";
4
+ import { Button } from "./Button";
5
+ export const Pagination = ({ fieldName = "pagina", page = 1, pages = 1, total = 0, }) => {
6
+ const [searchParams, setSearchParams] = useSearchParams();
7
+ const navigateToPage = (newPage) => {
8
+ if (newPage < 1 || newPage > pages || newPage === page) {
9
+ return;
10
+ }
11
+ const newSearchParams = new URLSearchParams(searchParams);
12
+ newSearchParams.set(fieldName, newPage.toString());
13
+ setSearchParams(newSearchParams, { replace: true });
14
+ };
15
+ const goToFirstPage = () => navigateToPage(1);
16
+ const goToPreviousPage = () => navigateToPage(page - 1);
17
+ const goToNextPage = () => navigateToPage(page + 1);
18
+ const goToLastPage = () => navigateToPage(pages);
19
+ const isFirstPage = page <= 1;
20
+ const isLastPage = page >= pages;
21
+ const hasPages = pages > 1;
22
+ return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { children: _jsx(Button, { variant: "ghost", size: "sm", icon: "fa-angle-double-left", onClick: goToFirstPage, disabled: isFirstPage || !hasPages, "aria-label": "Primera p\u00E1gina" }) }), _jsx("div", { children: _jsx(Button, { variant: "ghost", size: "sm", icon: "fa-angle-left", onClick: goToPreviousPage, disabled: isFirstPage || !hasPages, "aria-label": "P\u00E1gina anterior" }) }), _jsxs("div", { className: "text-xs", children: [_jsxs("span", { className: "block", children: ["P\u00E1gina ", page, " de ", pages] }), _jsxs("span", { className: "block", children: [total, " elemento", total !== 1 ? "s" : ""] })] }), _jsx("div", { children: _jsx(Button, { variant: "ghost", size: "sm", icon: "fa-angle-right", onClick: goToNextPage, disabled: isLastPage || !hasPages, "aria-label": "P\u00E1gina siguiente" }) }), _jsx("div", { children: _jsx(Button, { variant: "ghost", size: "sm", icon: "fa-angle-double-right", onClick: goToLastPage, disabled: isLastPage || !hasPages, "aria-label": "\u00DAltima p\u00E1gina" }) })] })
23
+ // <div className="flex flex-col items-center gap-0 font-[var(--font-default)]">
24
+ // {/* Botones de navegación */}
25
+ // <div className="flex items-center gap-2">
26
+ //
27
+ // {/* Texto de página */}
28
+ // <span
29
+ // className="text-xs px-3 leading-none"
30
+ // style={{ color: "var(--color-text-primary)" }}
31
+ // >
32
+ // Página {page} de {pages}
33
+ // </span>
34
+ // <Button
35
+ // variant="ghost"
36
+ // size="sm"
37
+ // icon="fa-angle-right"
38
+ // onClick={goToNextPage}
39
+ // disabled={isLastPage || !hasPages}
40
+ // aria-label="Página siguiente"
41
+ // />
42
+ // <Button
43
+ // variant="ghost"
44
+ // size="sm"
45
+ // icon="fa-angle-double-right"
46
+ // onClick={goToLastPage}
47
+ // disabled={isLastPage || !hasPages}
48
+ // aria-label="Última página"
49
+ // />
50
+ // </div>
51
+ // {/* Texto de elementos */}
52
+ // <span
53
+ // className="text-xs leading-none"
54
+ // style={{ color: "var(--color-text-secondary)" }}
55
+ // >
56
+ // {total} elemento{total !== 1 ? "s" : ""}
57
+ // </span>
58
+ // </div>
59
+ );
60
+ };
@@ -3,9 +3,11 @@ export { Input } from "./Input";
3
3
  export { AutocompleteInput } from "./AutocompleteInput";
4
4
  export { DatePicker } from "./DatePicker";
5
5
  export { DateInput } from "./DateInput";
6
+ export { Pagination } from "./Pagination";
6
7
  export type { ButtonProps } from "./Button";
7
8
  export type { InputProps } from "./Input";
8
9
  export type { AutocompleteInputProps, AutocompleteOption, } from "./AutocompleteInput";
9
10
  export type { DatePickerProps } from "./DatePicker";
10
11
  export type { DateInputProps, DateInputFormat } from "./DateInput";
12
+ export type { PaginationProps, PaginationInterface, } from "./Pagination";
11
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/form-controls/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,YAAY,EACV,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/form-controls/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,YAAY,EACV,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,YAAY,EACV,eAAe,EACf,mBAAmB,GACpB,MAAM,cAAc,CAAC"}
@@ -3,3 +3,4 @@ export { Input } from "./Input";
3
3
  export { AutocompleteInput } from "./AutocompleteInput";
4
4
  export { DatePicker } from "./DatePicker";
5
5
  export { DateInput } from "./DateInput";
6
+ export { Pagination } from "./Pagination";
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ export interface TabPanelProps {
3
+ children?: React.ReactNode;
4
+ tabId: string | number;
5
+ }
6
+ export declare const TabPanel: React.FC<TabPanelProps>;
7
+ //# sourceMappingURL=TabPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabPanel.d.ts","sourceRoot":"","sources":["../../../src/components/layout/TabPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAgB5C,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { useTabsContext } from "./TabsGroup";
4
+ export const TabPanel = ({ children, tabId }) => {
5
+ const { activeTab } = useTabsContext();
6
+ const isActive = activeTab.toString() === tabId.toString();
7
+ if (!isActive) {
8
+ return null;
9
+ }
10
+ return (_jsx("div", { role: "tabpanel", className: "w-full font-[var(--font-default)]", children: children }));
11
+ };
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ export interface Tab {
3
+ id: string | number;
4
+ label: string;
5
+ }
6
+ export interface TabsGroupProps {
7
+ children?: React.ReactNode;
8
+ tabs: Tab[];
9
+ paramName?: string;
10
+ headerNode?: React.ReactNode;
11
+ onChangeTab?: (selectedTab: string) => void;
12
+ }
13
+ interface TabsContextType {
14
+ activeTab: string | number;
15
+ setActiveTab: (tab: string | number) => void;
16
+ }
17
+ export declare const useTabsContext: () => TabsContextType;
18
+ export declare const TabsGroup: React.FC<TabsGroupProps>;
19
+ export {};
20
+ //# sourceMappingURL=TabsGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabsGroup.d.ts","sourceRoot":"","sources":["../../../src/components/layout/TabsGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkE,MAAM,OAAO,CAAC;AAGvF,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,UAAU,eAAe;IACvB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;CAC9C;AAID,eAAO,MAAM,cAAc,uBAM1B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA8F9C,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useState, useEffect, useMemo, createContext, useContext } from "react";
3
+ import { useSearchParams } from "react-router-dom";
4
+ const TabsContext = createContext(undefined);
5
+ export const useTabsContext = () => {
6
+ const context = useContext(TabsContext);
7
+ if (!context) {
8
+ throw new Error("TabPanel must be used within TabsGroup");
9
+ }
10
+ return context;
11
+ };
12
+ export const TabsGroup = ({ children, tabs, paramName, headerNode, onChangeTab, }) => {
13
+ const [searchParams, setSearchParams] = useSearchParams();
14
+ const defaultTab = tabs[0]?.id?.toString() || "";
15
+ // Obtener el tab activo desde URL params si paramName está definido, sino desde estado local
16
+ const urlTab = paramName ? searchParams.get(paramName) : null;
17
+ const initialTab = urlTab || defaultTab;
18
+ const [activeTab, setActiveTabState] = useState(initialTab);
19
+ // Sincronizar con URL params cuando cambian
20
+ useEffect(() => {
21
+ if (paramName && urlTab) {
22
+ setActiveTabState(urlTab);
23
+ }
24
+ }, [paramName, urlTab]);
25
+ const setActiveTab = (tab) => {
26
+ setActiveTabState(tab);
27
+ // Actualizar URL params si paramName está definido
28
+ if (paramName) {
29
+ const newSearchParams = new URLSearchParams(searchParams);
30
+ newSearchParams.set(paramName, tab.toString());
31
+ setSearchParams(newSearchParams, { replace: true });
32
+ }
33
+ // Llamar al callback si está definido
34
+ if (onChangeTab) {
35
+ onChangeTab(tab.toString());
36
+ }
37
+ };
38
+ const contextValue = useMemo(() => ({ activeTab, setActiveTab }), [activeTab]);
39
+ const handleTabClick = (tabId) => {
40
+ setActiveTab(tabId);
41
+ };
42
+ return (_jsx(TabsContext.Provider, { value: contextValue, children: _jsxs("div", { className: "w-full font-[var(--font-default)]", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-[var(--color-border-default)]", children: [_jsx("div", { className: "flex items-center gap-1", children: tabs.map((tab) => {
43
+ const isActive = activeTab.toString() === tab.id.toString();
44
+ return (_jsx("button", { onClick: () => handleTabClick(tab.id), className: `
45
+ px-4 py-2 text-sm font-medium transition-colors cursor-pointer
46
+ border-b-2 -mb-[1px]
47
+ ${isActive
48
+ ? "text-[var(--color-primary)] border-[var(--color-primary)]"
49
+ : "text-[var(--color-text-secondary)] border-transparent hover:text-[var(--color-text-primary)] hover:border-[var(--color-border-default)]"}
50
+ `, "aria-selected": isActive, role: "tab", children: tab.label }, tab.id));
51
+ }) }), headerNode && (_jsx("div", { className: "flex items-center", children: headerNode }))] }), _jsx("div", { className: "mt-4", children: children })] }) }));
52
+ };
@@ -6,4 +6,8 @@ export { Collection } from "./Collection";
6
6
  export type { CollectionProps } from "./Collection";
7
7
  export { DataField } from "./DataField";
8
8
  export type { DataFieldProps } from "./DataField";
9
+ export { TabsGroup } from "./TabsGroup";
10
+ export type { TabsGroupProps, Tab } from "./TabsGroup";
11
+ export { TabPanel } from "./TabPanel";
12
+ export type { TabPanelProps } from "./TabPanel";
9
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/layout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/layout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -2,3 +2,5 @@ export { Card } from "./Card";
2
2
  export { AppLayout } from "./AppLayout";
3
3
  export { Collection } from "./Collection";
4
4
  export { DataField } from "./DataField";
5
+ export { TabsGroup } from "./TabsGroup";
6
+ export { TabPanel } from "./TabPanel";
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ export interface DialogProps {
3
+ isOpen: boolean;
4
+ title: React.ReactNode;
5
+ dialogBody: React.ReactNode;
6
+ dialogActions: React.ReactNode;
7
+ onClose?: () => void;
8
+ closeOnOverlayClick?: boolean;
9
+ }
10
+ export declare const Dialog: React.FC<DialogProps>;
11
+ //# sourceMappingURL=Dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../../src/components/utils/Dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAEzC,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAiGxC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useEffect } from "react";
3
+ export const Dialog = ({ isOpen, title, dialogBody, dialogActions, onClose, closeOnOverlayClick = false, }) => {
4
+ // Prevenir scroll del body cuando el dialog está abierto
5
+ useEffect(() => {
6
+ if (isOpen) {
7
+ document.body.style.overflow = "hidden";
8
+ }
9
+ else {
10
+ document.body.style.overflow = "";
11
+ }
12
+ return () => {
13
+ document.body.style.overflow = "";
14
+ };
15
+ }, [isOpen]);
16
+ // Manejar tecla Escape para cerrar
17
+ useEffect(() => {
18
+ const handleEscape = (e) => {
19
+ if (e.key === "Escape" && isOpen && onClose) {
20
+ onClose();
21
+ }
22
+ };
23
+ if (isOpen) {
24
+ document.addEventListener("keydown", handleEscape);
25
+ }
26
+ return () => {
27
+ document.removeEventListener("keydown", handleEscape);
28
+ };
29
+ }, [isOpen, onClose]);
30
+ if (!isOpen) {
31
+ return null;
32
+ }
33
+ const handleOverlayClick = () => {
34
+ if (closeOnOverlayClick && onClose) {
35
+ onClose();
36
+ }
37
+ };
38
+ return (_jsxs("div", { className: "fixed inset-0 z-[2000] flex items-center justify-center p-4", role: "dialog", "aria-modal": "true", "aria-labelledby": "dialog-title", children: [_jsx("div", { className: "absolute inset-0 bg-black/50 backdrop-blur-sm", onClick: handleOverlayClick }), _jsxs("div", { className: "relative w-auto max-w-lg min-w-[400px] bg-[var(--color-bg-default)] rounded-lg shadow-[var(--shadow-xl)] border border-[var(--color-border-default)] font-[var(--font-default)] max-h-[90vh] flex flex-col", onClick: (e) => e.stopPropagation(), children: [_jsxs("div", { className: "flex items-center justify-between px-6 py-4 border-b border-[var(--color-border-default)]", children: [_jsx("h2", { id: "dialog-title", className: "text-lg font-semibold text-[var(--color-text-primary)]", children: title }), onClose && (_jsx("button", { onClick: onClose, className: "ml-4 p-1 rounded-md text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)] hover:bg-[var(--color-bg-hover)] transition-colors cursor-pointer", "aria-label": "Cerrar dialog", children: _jsx("i", { className: "fa fa-times" }) }))] }), _jsx("div", { className: "px-6 py-4 overflow-y-auto flex-1 text-[var(--color-text-primary)] min-w-0", children: dialogBody }), _jsx("div", { className: "px-6 py-4 border-t border-[var(--color-border-default)] flex items-center justify-end gap-2 flex-shrink-0 flex-wrap", children: dialogActions })] })] }));
39
+ };
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ export interface LoaderProps {
3
+ isLoading?: boolean;
4
+ text?: string;
5
+ children?: React.ReactNode;
6
+ keepContentWhileLoading?: boolean;
7
+ contentLoadingNode?: React.ReactNode;
8
+ overlayClassName?: string;
9
+ }
10
+ export declare const Loader: React.FC<LoaderProps>;
11
+ //# sourceMappingURL=Loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Loader.d.ts","sourceRoot":"","sources":["../../../src/components/utils/Loader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,kBAAkB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAuHxC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { useTheme } from "../../contexts/ThemeContext";
4
+ export const Loader = ({ isLoading = false, text, children, keepContentWhileLoading, contentLoadingNode, overlayClassName, }) => {
5
+ const { theme } = useTheme();
6
+ const displayText = text || "Cargando...";
7
+ // Clases por defecto del overlay (negro semitransparente con blur)
8
+ const defaultOverlayClasses = "bg-black/50 backdrop-blur-sm";
9
+ // Combinar clases por defecto con las personalizadas
10
+ const overlayClasses = overlayClassName
11
+ ? overlayClassName
12
+ : defaultOverlayClasses;
13
+ // Barra de progreso infinita
14
+ const ProgressBar = () => {
15
+ // Variable CSS para el gradiente del color primario
16
+ const gradientColor = `no-repeat linear-gradient(${theme.colors.primary} 0 0)`;
17
+ const bgSecondary = theme.colors.bgSecondary || theme.colors.gray100;
18
+ return (_jsxs("div", { className: "flex flex-col items-center gap-0.5 w-full", role: "status", "aria-live": "polite", children: [_jsx("div", { className: "h-1 w-full rounded", style: {
19
+ "--c": gradientColor,
20
+ background: `var(--c), var(--c), ${bgSecondary}`,
21
+ backgroundSize: "60% 100%",
22
+ animation: "l16 3s infinite",
23
+ } }), displayText && (_jsx("span", { className: "text-xs text-[var(--color-text-secondary)] font-[var(--font-default)]", children: displayText }))] }));
24
+ };
25
+ // Si no está cargando, mostrar solo children (si existen)
26
+ if (!isLoading) {
27
+ return _jsx(_Fragment, { children: children });
28
+ }
29
+ // Variante 1: Con contentLoadingNode
30
+ if (contentLoadingNode) {
31
+ return (_jsxs("div", { className: "relative", children: [_jsx("div", { className: keepContentWhileLoading ? "opacity-50 pointer-events-none" : "", children: contentLoadingNode }), _jsx("div", { className: "absolute inset-0 flex items-center justify-center z-10 pointer-events-none px-4", children: _jsx("div", { className: "bg-[var(--color-bg-default)] rounded-lg p-6 shadow-lg border border-[var(--color-border-default)] pointer-events-auto w-full", children: _jsx(ProgressBar, {}) }) })] }));
32
+ }
33
+ // Variante 2: Con children pero sin contentLoadingNode
34
+ if (children) {
35
+ // Si keepContentWhileLoading es true, mostrar children con overlay
36
+ if (keepContentWhileLoading) {
37
+ return (_jsxs("div", { className: "relative", children: [_jsx("div", { className: "pointer-events-none select-none", children: children }), _jsx("div", { className: `absolute inset-0 flex items-center justify-center z-10 pointer-events-auto px-4 ${overlayClasses}`, children: _jsx("div", { className: "bg-[var(--color-bg-default)] rounded-lg p-6 shadow-lg border border-[var(--color-border-default)] w-full", children: _jsx(ProgressBar, {}) }) })] }));
38
+ }
39
+ // Si no tiene keepContentWhileLoading, ocultar children y mostrar solo loader básico
40
+ return (_jsx("div", { className: "flex items-center justify-center p-6 w-full", children: _jsx("div", { className: "w-full max-w-2xl", children: _jsx(ProgressBar, {}) }) }));
41
+ }
42
+ // Variante 3: Sin contentLoadingNode ni children - solo loader
43
+ return (_jsx("div", { className: "flex items-center justify-center p-6 w-full", children: _jsx("div", { className: "w-full max-w-2xl", children: _jsx(ProgressBar, {}) }) }));
44
+ };
@@ -1,3 +1,7 @@
1
1
  export { Badge } from "./Badge";
2
2
  export type { BadgeProps } from "./Badge";
3
+ export { Dialog } from "./Dialog";
4
+ export type { DialogProps } from "./Dialog";
5
+ export { Loader } from "./Loader";
6
+ export type { LoaderProps } from "./Loader";
3
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
@@ -1 +1,3 @@
1
1
  export { Badge } from "./Badge";
2
+ export { Dialog } from "./Dialog";
3
+ export { Loader } from "./Loader";
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const DialogDocs: React.FC;
3
+ export default DialogDocs;
4
+ //# sourceMappingURL=DialogDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DialogDocs.d.ts","sourceRoot":"","sources":["../../src/docs/DialogDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EAgYvB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React, { useState } from "react";
3
+ import { Card, Dialog, Button, Input, Badge } from "../index";
4
+ const DialogDocs = () => {
5
+ const [isOpenBasic, setIsOpenBasic] = useState(false);
6
+ const [isOpenForm, setIsOpenForm] = useState(false);
7
+ const [isOpenConfirm, setIsOpenConfirm] = useState(false);
8
+ const [isOpenNoOverlay, setIsOpenNoOverlay] = useState(false);
9
+ const [isOpenCustom, setIsOpenCustom] = useState(false);
10
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "Dialog - 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: "Uso b\u00E1sico" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["El componente Dialog muestra un modal centrado con overlay. Se controla mediante la prop ", _jsx("code", { children: "isOpen" }), " y se cierra con", " ", _jsx("code", { children: "onClose" }), "."] }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-window-maximize", onClick: () => setIsOpenBasic(true), children: "Abrir Dialog B\u00E1sico" }), _jsx(Dialog, { isOpen: isOpenBasic, title: "Dialog B\u00E1sico", dialogBody: _jsxs("div", { className: "space-y-3", children: [_jsxs("p", { style: { color: "var(--flysoft-text-secondary)" }, children: ["Este es un ejemplo de dialog b\u00E1sico. Puedes incluir cualquier contenido en el ", _jsx("code", { children: "dialogBody" }), "."] }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "El dialog se puede cerrar haciendo clic en el overlay, en el bot\u00F3n de cerrar (X), o presionando la tecla Escape." })] }), dialogActions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setIsOpenBasic(false), children: "Cancelar" }), _jsx(Button, { variant: "primary", onClick: () => setIsOpenBasic(false), children: "Aceptar" })] }), onClose: () => setIsOpenBasic(false) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Dialog con formulario" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Ejemplo de dialog que contiene un formulario completo con campos de entrada." }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-edit", onClick: () => setIsOpenForm(true), children: "Abrir Dialog con Formulario" }), _jsx(Dialog, { isOpen: isOpenForm, title: "Editar Usuario", dialogBody: _jsxs("div", { className: "space-y-4", children: [_jsx(Input, { label: "Nombre", placeholder: "Ingresa el nombre", icon: "fa-user" }), _jsx(Input, { label: "Email", type: "email", placeholder: "usuario@ejemplo.com", icon: "fa-envelope" }), _jsx(Input, { label: "Tel\u00E9fono", type: "tel", placeholder: "+34 600 000 000", icon: "fa-phone" })] }), dialogActions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", icon: "fa-times", onClick: () => setIsOpenForm(false), children: "Cancelar" }), _jsx(Button, { variant: "primary", icon: "fa-save", onClick: () => setIsOpenForm(false), children: "Guardar Cambios" })] }), onClose: () => setIsOpenForm(false) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Dialog de confirmaci\u00F3n" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Ejemplo de dialog usado para confirmar una acci\u00F3n importante." }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-trash", onClick: () => setIsOpenConfirm(true), children: "Eliminar Item" }), _jsx(Dialog, { isOpen: isOpenConfirm, title: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("i", { className: "fa fa-exclamation-triangle text-[var(--color-danger)]" }), _jsx("span", { children: "Confirmar Eliminaci\u00F3n" })] }), dialogBody: _jsxs("div", { className: "space-y-3", children: [_jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "\u00BFEst\u00E1s seguro de que deseas eliminar este elemento? Esta acci\u00F3n no se puede deshacer." }), _jsx("div", { className: "flex gap-2", children: _jsx(Badge, { variant: "danger", icon: "fa-exclamation-circle", children: "Acci\u00F3n irreversible" }) })] }), dialogActions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", icon: "fa-times", onClick: () => setIsOpenConfirm(false), children: "Cancelar" }), _jsx(Button, { variant: "primary", icon: "fa-trash", onClick: () => setIsOpenConfirm(false), children: "Eliminar" })] }), onClose: () => setIsOpenConfirm(false) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Dialog sin cerrar al hacer clic en overlay" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Usando ", _jsxs("code", { children: ["closeOnOverlayClick=", false] }), " el dialog solo se puede cerrar mediante el bot\u00F3n de cerrar, los botones de acci\u00F3n, o la tecla Escape."] }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-lock", onClick: () => setIsOpenNoOverlay(true), children: "Abrir Dialog (sin cerrar en overlay)" }), _jsx(Dialog, { isOpen: isOpenNoOverlay, title: "Dialog Protegido", dialogBody: _jsxs("div", { className: "space-y-3", children: [_jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este dialog no se cierra al hacer clic en el overlay. Debes usar el bot\u00F3n de cerrar o los botones de acci\u00F3n." }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "\u00DAtil para formularios importantes donde no quieres que el usuario cierre accidentalmente el dialog." })] }), dialogActions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setIsOpenNoOverlay(false), children: "Cancelar" }), _jsx(Button, { variant: "primary", onClick: () => setIsOpenNoOverlay(false), children: "Continuar" })] }), onClose: () => setIsOpenNoOverlay(false), closeOnOverlayClick: false })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Dialog con t\u00EDtulo personalizado" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["El prop ", _jsx("code", { children: "title" }), " acepta un ReactNode, permitiendo incluir iconos, badges u otros componentes."] }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-star", onClick: () => setIsOpenCustom(true), children: "Abrir Dialog Personalizado" }), _jsx(Dialog, { isOpen: isOpenCustom, title: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("i", { className: "fa fa-info-circle text-[var(--color-primary)]" }), _jsx("span", { children: "Informaci\u00F3n Importante" }), _jsx(Badge, { variant: "info", size: "sm", children: "Nuevo" })] }), dialogBody: _jsxs("div", { className: "space-y-3", children: [_jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este dialog muestra c\u00F3mo puedes personalizar el t\u00EDtulo usando ReactNode, incluyendo iconos y badges." }), _jsx("div", { className: "p-3 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: _jsxs("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: [_jsx("i", { className: "fa fa-lightbulb mr-2" }), "Puedes usar cualquier componente React en el t\u00EDtulo, body y acciones."] }) })] }), dialogActions: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "outline", icon: "fa-bookmark", onClick: () => setIsOpenCustom(false), children: "Guardar para despu\u00E9s" }), _jsx(Button, { variant: "primary", icon: "fa-check", onClick: () => setIsOpenCustom(false), children: "Entendido" })] }), onClose: () => setIsOpenCustom(false) })] })] }), _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: "Overlay con blur:" }), " El overlay tiene un efecto de desenfoque (backdrop-blur) para mejor enfoque visual"] }), _jsxs("li", { children: [_jsx("strong", { children: "Cierre m\u00FAltiple:" }), " Se puede cerrar haciendo clic en el overlay, en el bot\u00F3n X, en los botones de acci\u00F3n, o presionando Escape"] }), _jsxs("li", { children: [_jsx("strong", { children: "Prevenci\u00F3n de scroll:" }), " Cuando el dialog est\u00E1 abierto, se previene el scroll del body"] }), _jsxs("li", { children: [_jsx("strong", { children: "Responsive:" }), " El dialog se adapta a diferentes tama\u00F1os de pantalla con padding adecuado"] }), _jsxs("li", { children: [_jsx("strong", { children: "Accesibilidad:" }), " Incluye atributos ARIA para mejor accesibilidad"] }), _jsxs("li", { children: [_jsx("strong", { children: "Contenido flexible:" }), " El body tiene scroll autom\u00E1tico si el contenido es muy largo"] })] }) }) })] })] }) }) }));
11
+ };
12
+ export default DialogDocs;
@@ -1 +1 @@
1
- {"version":3,"file":"DocsMenu.d.ts","sourceRoot":"","sources":["../../src/docs/DocsMenu.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,+CAqCpB,CAAC"}
1
+ {"version":3,"file":"DocsMenu.d.ts","sourceRoot":"","sources":["../../src/docs/DocsMenu.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,+CAiDpB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { Link } from "react-router-dom";
3
3
  export const DocsMenu = () => {
4
- return (_jsx(_Fragment, { children: _jsxs("ul", { children: [_jsx("li", { children: _jsx(Link, { to: "/docs/button", children: "Button" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/badge", children: "Badge" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/card", children: "Card" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/input", children: "Input" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/autocomplete-input", children: "AutocompleteInput" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/datepicker", children: "DatePicker" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/dateinput", children: "DateInput" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/theme", children: "ThemeSwitcher" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/datafield", children: "DataField" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/auth", children: "AuthContext" }) })] }) }));
4
+ return (_jsx(_Fragment, { children: _jsxs("ul", { children: [_jsx("li", { children: _jsx(Link, { to: "/docs/button", children: "Button" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/badge", children: "Badge" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/card", children: "Card" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/input", children: "Input" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/autocomplete-input", children: "AutocompleteInput" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/datepicker", children: "DatePicker" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/dateinput", children: "DateInput" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/theme", children: "ThemeSwitcher" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/datafield", children: "DataField" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/tabsgroup", children: "TabsGroup" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/dialog", children: "Dialog" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/pagination", children: "Pagination" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/loader", children: "Loader" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/auth", children: "AuthContext" }) })] }) }));
5
5
  };
@@ -1 +1 @@
1
- {"version":3,"file":"DocsRouter.d.ts","sourceRoot":"","sources":["../../src/docs/DocsRouter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAa1B,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAgB9B,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"DocsRouter.d.ts","sourceRoot":"","sources":["../../src/docs/DocsRouter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAiB1B,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAoB9B,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -10,8 +10,12 @@ import DataFieldDocs from "./DataFieldDocs";
10
10
  import AutocompleteInputDocs from "./AutocompleteInputDocs";
11
11
  import DatePickerDocs from "./DatePickerDocs";
12
12
  import DateInputDocs from "./DateInputDocs";
13
+ import TabsGroupDocs from "./TabsGroupDocs";
14
+ import DialogDocs from "./DialogDocs";
15
+ import PaginationDocs from "./PaginationDocs";
16
+ import LoaderDocs from "./LoaderDocs";
13
17
  import { AuthDocs } from "./AuthDocs.tsx/AuthDocs";
14
18
  export const DocsRouter = () => {
15
- return (_jsxs(Routes, { children: [_jsx(Route, { path: "", element: _jsx(Navigate, { to: "button", replace: true }) }), _jsx(Route, { path: "button", element: _jsx(ButtonDocs, {}) }), _jsx(Route, { path: "badge", element: _jsx(BadgeDocs, {}) }), _jsx(Route, { path: "card", element: _jsx(CardDocs, {}) }), _jsx(Route, { path: "input", element: _jsx(InputDocs, {}) }), _jsx(Route, { path: "autocomplete-input", element: _jsx(AutocompleteInputDocs, {}) }), _jsx(Route, { path: "datepicker", element: _jsx(DatePickerDocs, {}) }), _jsx(Route, { path: "dateinput", element: _jsx(DateInputDocs, {}) }), _jsx(Route, { path: "theme", element: _jsx(ThemeSwitcherDocs, {}) }), _jsx(Route, { path: "datafield", element: _jsx(DataFieldDocs, {}) }), _jsx(Route, { path: "auth", element: _jsx(AuthDocs, {}) })] }));
19
+ return (_jsxs(Routes, { children: [_jsx(Route, { path: "", element: _jsx(Navigate, { to: "button", replace: true }) }), _jsx(Route, { path: "button", element: _jsx(ButtonDocs, {}) }), _jsx(Route, { path: "badge", element: _jsx(BadgeDocs, {}) }), _jsx(Route, { path: "card", element: _jsx(CardDocs, {}) }), _jsx(Route, { path: "input", element: _jsx(InputDocs, {}) }), _jsx(Route, { path: "autocomplete-input", element: _jsx(AutocompleteInputDocs, {}) }), _jsx(Route, { path: "datepicker", element: _jsx(DatePickerDocs, {}) }), _jsx(Route, { path: "dateinput", element: _jsx(DateInputDocs, {}) }), _jsx(Route, { path: "theme", element: _jsx(ThemeSwitcherDocs, {}) }), _jsx(Route, { path: "datafield", element: _jsx(DataFieldDocs, {}) }), _jsx(Route, { path: "tabsgroup", element: _jsx(TabsGroupDocs, {}) }), _jsx(Route, { path: "dialog", element: _jsx(DialogDocs, {}) }), _jsx(Route, { path: "pagination", element: _jsx(PaginationDocs, {}) }), _jsx(Route, { path: "loader", element: _jsx(LoaderDocs, {}) }), _jsx(Route, { path: "auth", element: _jsx(AuthDocs, {}) })] }));
16
20
  };
17
21
  export default DocsRouter;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const LoaderDocs: React.FC;
3
+ export default LoaderDocs;
4
+ //# sourceMappingURL=LoaderDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoaderDocs.d.ts","sourceRoot":"","sources":["../../src/docs/LoaderDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EAigBvB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useState } from "react";
3
+ import { Card, Loader, Button, Input } from "../index";
4
+ const LoaderDocs = () => {
5
+ const [isLoading1, setIsLoading1] = useState(false);
6
+ const [isLoading2, setIsLoading2] = useState(false);
7
+ const [isLoading3, setIsLoading3] = useState(false);
8
+ const [isLoading4, setIsLoading4] = useState(false);
9
+ const [isLoading5, setIsLoading5] = useState(false);
10
+ const [isLoading6, setIsLoading6] = useState(false);
11
+ // Componente Skeleton para el ejemplo
12
+ const SkeletonCard = () => (_jsx(Card, { title: "Cargando contenido...", children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "h-4 bg-[var(--color-bg-secondary)] rounded animate-pulse w-3/4" }), _jsx("div", { className: "h-4 bg-[var(--color-bg-secondary)] rounded animate-pulse w-full" }), _jsx("div", { className: "h-4 bg-[var(--color-bg-secondary)] rounded animate-pulse w-5/6" })] }), _jsxs("div", { className: "grid grid-cols-3 gap-4", children: [_jsx("div", { className: "h-20 bg-[var(--color-bg-secondary)] rounded animate-pulse" }), _jsx("div", { className: "h-20 bg-[var(--color-bg-secondary)] rounded animate-pulse" }), _jsx("div", { className: "h-20 bg-[var(--color-bg-secondary)] rounded animate-pulse" })] }), _jsx("div", { className: "h-10 bg-[var(--color-bg-secondary)] rounded animate-pulse w-1/3" })] }) }));
13
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "Loader - 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: "Loader b\u00E1sico, sin children" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Cuando no hay children ni contentLoadingNode, el Loader muestra \u00FAnicamente la barra de progreso y el texto. Ideal para pantallas de carga completas." }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-spinner", onClick: () => {
14
+ setIsLoading1(true);
15
+ setTimeout(() => setIsLoading1(false), 3000);
16
+ }, children: "Mostrar Loader B\u00E1sico" }), _jsx(Loader, { isLoading: isLoading1 })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Loader b\u00E1sico con texto personalizado" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Puedes personalizar el texto que se muestra debajo de la barra de progreso usando la prop ", _jsx("code", { children: "text" }), "."] }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-file-upload", onClick: () => {
17
+ setIsLoading2(true);
18
+ setTimeout(() => setIsLoading2(false), 3000);
19
+ }, children: "Mostrar Loader con Texto Personalizado" }), _jsx(Loader, { isLoading: isLoading2, text: "Subiendo archivo... Por favor espera." })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Loader con children pero sin contentLoadingNode ni keepContentWhileLoading" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Cuando hay children pero no contentLoadingNode, el Loader muestra los children con un overlay semitransparente y la barra de progreso centrada. Los eventos del mouse y teclado se deshabilitan en los children." }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-layer-group", onClick: () => {
20
+ setIsLoading3(true);
21
+ setTimeout(() => setIsLoading3(false), 3000);
22
+ }, children: "Mostrar Loader con Overlay" }), _jsx(Loader, { isLoading: isLoading3, children: _jsx(Card, { title: "Contenido con Loader", children: _jsxs("div", { className: "space-y-4", children: [_jsx(Input, { label: "Nombre", placeholder: "Ingresa tu nombre", icon: "fa-user" }), _jsx(Input, { label: "Email", type: "email", placeholder: "usuario@ejemplo.com", icon: "fa-envelope" }), _jsx(Button, { variant: "primary", icon: "fa-save", children: "Guardar" })] }) }) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Loader con children y keepContentWhileLoading" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Usando ", _jsx("code", { children: "keepContentWhileLoading" }), " los children mantienen su opacidad normal pero siguen deshabilitados para interacci\u00F3n."] }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-eye", onClick: () => {
23
+ setIsLoading4(true);
24
+ setTimeout(() => setIsLoading4(false), 3000);
25
+ }, children: "Mostrar Loader (mantener contenido visible)" }), _jsx(Loader, { isLoading: isLoading4, keepContentWhileLoading: true, children: _jsx(Card, { title: "Contenido Visible Durante Carga", children: _jsxs("div", { className: "space-y-4", children: [_jsx(Input, { label: "B\u00FAsqueda", placeholder: "Buscar productos...", icon: "fa-search" }), _jsxs("div", { className: "grid grid-cols-3 gap-4", children: [_jsx("div", { className: "p-4 bg-[var(--color-bg-secondary)] rounded", children: _jsx("p", { className: "text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Producto 1" }) }), _jsx("div", { className: "p-4 bg-[var(--color-bg-secondary)] rounded", children: _jsx("p", { className: "text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Producto 2" }) }), _jsx("div", { className: "p-4 bg-[var(--color-bg-secondary)] rounded", children: _jsx("p", { className: "text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Producto 3" }) })] })] }) }) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Loader con children y contentLoadingNode (skeleton)" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Cuando se proporciona ", _jsx("code", { children: "contentLoadingNode" }), ", los children se ocultan y se muestra el nodo personalizado con el loader centrado encima. En este ejemplo usamos un skeleton para mostrar el contenido que se est\u00E1 cargando."] }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-image", onClick: () => {
26
+ setIsLoading5(true);
27
+ setTimeout(() => setIsLoading5(false), 3000);
28
+ }, children: "Mostrar Loader con Skeleton" }), _jsx(Loader, { isLoading: isLoading5, contentLoadingNode: _jsx(SkeletonCard, {}), children: _jsx(Card, { title: "Contenido Real (oculto durante carga)", children: _jsxs("div", { className: "space-y-4", children: [_jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este es el contenido real que se mostrar\u00E1 cuando termine la carga." }), _jsxs("div", { className: "grid grid-cols-3 gap-4", children: [_jsx("div", { className: "p-4 bg-[var(--color-bg-secondary)] rounded", children: _jsx("p", { className: "text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Item 1" }) }), _jsx("div", { className: "p-4 bg-[var(--color-bg-secondary)] rounded", children: _jsx("p", { className: "text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Item 2" }) }), _jsx("div", { className: "p-4 bg-[var(--color-bg-secondary)] rounded", children: _jsx("p", { className: "text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Item 3" }) })] })] }) }) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Loader con children y keepContentWhileLoading pero cambiando el color del overlay" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Puedes personalizar el overlay usando la prop", " ", _jsx("code", { children: "overlayClassName" }), " con clases de Tailwind. \u00DAtil para adaptar el loader a diferentes fondos de interfaz, cambiar el border radius, padding, color, etc. En este ejemplo usamos un overlay blanco semitransparente con border radius personalizado."] }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-palette", onClick: () => {
29
+ setIsLoading6(true);
30
+ setTimeout(() => setIsLoading6(false), 3000);
31
+ }, children: "Mostrar Loader (Overlay Blanco)" }), _jsx("div", { className: "p-4 bg-[var(--color-bg-secondary)] rounded", children: _jsx(Loader, { isLoading: isLoading6, keepContentWhileLoading: true, overlayClassName: "bg-white/50 backdrop-blur-sm rounded-lg", children: _jsx(Card, { title: "Contenido con Overlay Personalizado", children: _jsxs("div", { className: "space-y-4", children: [_jsx(Input, { label: "Campo 1", placeholder: "Ejemplo...", icon: "fa-edit" }), _jsx(Input, { label: "Campo 2", placeholder: "Ejemplo...", icon: "fa-edit" }), _jsx(Button, { variant: "primary", icon: "fa-save", children: "Guardar" })] }) }) }) })] })] }), _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: "Barra de progreso infinita:" }), " Animaci\u00F3n continua usando el color primario del tema"] }), _jsxs("li", { children: [_jsx("strong", { children: "Tres variantes de uso:" }), " Solo loader, con overlay sobre children, o con nodo personalizado"] }), _jsxs("li", { children: [_jsx("strong", { children: "Deshabilitaci\u00F3n de eventos:" }), " Cuando est\u00E1 cargando, deshabilita todos los eventos del mouse y teclado en los children"] }), _jsxs("li", { children: [_jsx("strong", { children: "Overlay semitransparente:" }), " Similar al Dialog, con efecto blur para mejor enfoque visual"] }), _jsxs("li", { children: [_jsx("strong", { children: "Texto personalizable:" }), " Puedes cambiar el texto que se muestra debajo de la barra de progreso"] }), _jsxs("li", { children: [_jsx("strong", { children: "Integraci\u00F3n con tema:" }), " Usa el color primario del tema actual autom\u00E1ticamente"] }), _jsxs("li", { children: [_jsx("strong", { children: "Contenido condicional:" }), " Con keepContentWhileLoading puedes mantener el contenido visible pero deshabilitado"] }), _jsxs("li", { children: [_jsx("strong", { children: "Overlay personalizable:" }), " Puedes personalizar completamente el overlay usando overlayClassName con clases de Tailwind para cambiar color, border radius, padding, etc."] })] }) }) })] }), _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: "text-left p-3 font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Prop" }), _jsx("th", { className: "text-left p-3 font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Tipo" }), _jsx("th", { className: "text-left p-3 font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Default" }), _jsx("th", { className: "text-left p-3 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: "p-3", children: _jsx("code", { className: "text-sm text-[var(--color-primary)]", children: "isLoading" }) }), _jsx("td", { className: "p-3 text-sm", children: "boolean" }), _jsx("td", { className: "p-3 text-sm", children: "false" }), _jsx("td", { className: "p-3 text-sm", children: "Controla si el loader est\u00E1 visible" })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "p-3", children: _jsx("code", { className: "text-sm text-[var(--color-primary)]", children: "text" }) }), _jsx("td", { className: "p-3 text-sm", children: "string" }), _jsx("td", { className: "p-3 text-sm", children: "\"Cargando...\"" }), _jsx("td", { className: "p-3 text-sm", children: "Texto que se muestra debajo de la barra de progreso" })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "p-3", children: _jsx("code", { className: "text-sm text-[var(--color-primary)]", children: "children" }) }), _jsx("td", { className: "p-3 text-sm", children: "ReactNode" }), _jsx("td", { className: "p-3 text-sm", children: "-" }), _jsx("td", { className: "p-3 text-sm", children: "Contenido que se mostrar\u00E1 con overlay cuando isLoading es true" })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "p-3", children: _jsx("code", { className: "text-sm text-[var(--color-primary)]", children: "keepContentWhileLoading" }) }), _jsx("td", { className: "p-3 text-sm", children: "boolean" }), _jsx("td", { className: "p-3 text-sm", children: "false" }), _jsx("td", { className: "p-3 text-sm", children: "Si es true, mantiene el contenido visible (sin reducir opacidad) pero deshabilitado" })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "p-3", children: _jsx("code", { className: "text-sm text-[var(--color-primary)]", children: "contentLoadingNode" }) }), _jsx("td", { className: "p-3 text-sm", children: "ReactNode" }), _jsx("td", { className: "p-3 text-sm", children: "-" }), _jsx("td", { className: "p-3 text-sm", children: "Nodo personalizado que se muestra en lugar de children cuando isLoading es true" })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "p-3", children: _jsx("code", { className: "text-sm text-[var(--color-primary)]", children: "overlayClassName" }) }), _jsx("td", { className: "p-3 text-sm", children: "string" }), _jsx("td", { className: "p-3 text-sm", children: "\"bg-black/50 backdrop-blur-sm\"" }), _jsx("td", { className: "p-3 text-sm", children: "Clases de Tailwind para personalizar el overlay (ej: \"bg-white/50 backdrop-blur-sm rounded-lg\" para overlay blanco con border radius)" })] })] })] }) })] })] }) }) }));
32
+ };
33
+ export default LoaderDocs;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const PaginationDocs: React.FC;
3
+ export default PaginationDocs;
4
+ //# sourceMappingURL=PaginationDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaginationDocs.d.ts","sourceRoot":"","sources":["../../src/docs/PaginationDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,QAAA,MAAM,cAAc,EAAE,KAAK,CAAC,EA+O3B,CAAC;AAEF,eAAe,cAAc,CAAC"}