flysoft-react-ui 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/components/form-controls/AutocompleteInput.d.ts +39 -0
  2. package/dist/components/form-controls/AutocompleteInput.d.ts.map +1 -0
  3. package/dist/components/form-controls/AutocompleteInput.js +113 -0
  4. package/dist/components/form-controls/DateInput.d.ts +12 -0
  5. package/dist/components/form-controls/DateInput.d.ts.map +1 -0
  6. package/dist/components/form-controls/DateInput.js +156 -0
  7. package/dist/components/form-controls/DatePicker.d.ts +14 -0
  8. package/dist/components/form-controls/DatePicker.d.ts.map +1 -0
  9. package/dist/components/form-controls/DatePicker.js +148 -0
  10. package/dist/components/form-controls/index.d.ts +6 -0
  11. package/dist/components/form-controls/index.d.ts.map +1 -1
  12. package/dist/components/form-controls/index.js +3 -0
  13. package/dist/components/layout/AppLayout.d.ts.map +1 -1
  14. package/dist/components/layout/AppLayout.js +39 -5
  15. package/dist/contexts/AuthContext.d.ts.map +1 -1
  16. package/dist/contexts/AuthContext.js +108 -14
  17. package/dist/docs/AuthDocs.tsx/AuthDocs.d.ts +11 -0
  18. package/dist/docs/AuthDocs.tsx/AuthDocs.d.ts.map +1 -1
  19. package/dist/docs/AuthDocs.tsx/AuthDocs.js +14 -33
  20. package/dist/docs/AuthDocs.tsx/AuthDocsContent.d.ts.map +1 -1
  21. package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +11 -3
  22. package/dist/docs/AuthDocs.tsx/mockAuthService.d.ts +24 -0
  23. package/dist/docs/AuthDocs.tsx/mockAuthService.d.ts.map +1 -0
  24. package/dist/docs/AuthDocs.tsx/mockAuthService.js +78 -0
  25. package/dist/docs/AutocompleteInputDocs.d.ts +4 -0
  26. package/dist/docs/AutocompleteInputDocs.d.ts.map +1 -0
  27. package/dist/docs/AutocompleteInputDocs.js +75 -0
  28. package/dist/docs/DateInputDocs.d.ts +4 -0
  29. package/dist/docs/DateInputDocs.d.ts.map +1 -0
  30. package/dist/docs/DateInputDocs.js +21 -0
  31. package/dist/docs/DatePickerDocs.d.ts +4 -0
  32. package/dist/docs/DatePickerDocs.d.ts.map +1 -0
  33. package/dist/docs/DatePickerDocs.js +18 -0
  34. package/dist/docs/DocsMenu.d.ts.map +1 -1
  35. package/dist/docs/DocsMenu.js +1 -1
  36. package/dist/docs/DocsRouter.d.ts.map +1 -1
  37. package/dist/docs/DocsRouter.js +5 -1
  38. package/dist/hooks/useElementScroll.d.ts.map +1 -1
  39. package/dist/hooks/useElementScroll.js +37 -15
  40. package/dist/index.css +1 -1
  41. package/dist/index.d.ts +6 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +3 -0
  44. package/dist/index.js.map +1 -1
  45. package/package.json +1 -1
@@ -19,36 +19,111 @@ const storeAuth = (auth) => {
19
19
  const removeStoredAuth = () => {
20
20
  localStorage.removeItem("auth");
21
21
  };
22
+ /**
23
+ * Verifica si un token ha expirado basándose en el string expires en formato ISO 8601
24
+ * @param expires - String de fecha en formato ISO 8601
25
+ * @returns true si el token ha expirado o si el formato es inválido, false si está vigente
26
+ */
27
+ const isTokenExpired = (expires) => {
28
+ if (!expires) {
29
+ return true; // Si no hay fecha de expiración, consideramos que está expirado
30
+ }
31
+ try {
32
+ // Validar formato ISO 8601 básico (debe poder ser parseado por Date)
33
+ const expirationDate = new Date(expires);
34
+ // Verificar que la fecha sea válida
35
+ if (isNaN(expirationDate.getTime())) {
36
+ console.warn("Formato de fecha de expiración inválido:", expires);
37
+ return true;
38
+ }
39
+ // Comparar con la fecha actual (agregamos un margen de 1 minuto para evitar problemas de precisión)
40
+ const now = new Date();
41
+ const oneMinuteInMs = 60 * 1000;
42
+ return expirationDate.getTime() <= now.getTime() + oneMinuteInMs;
43
+ }
44
+ catch (error) {
45
+ console.error("Error al verificar expiración del token:", error);
46
+ return true; // En caso de error, considerar como expirado por seguridad
47
+ }
48
+ };
49
+ /**
50
+ * Valida que un usuario tenga un token vigente
51
+ * @param user - Objeto de usuario a validar
52
+ * @returns true si el usuario tiene un token válido y vigente, false en caso contrario
53
+ */
54
+ const isUserTokenValid = (user) => {
55
+ if (!user || !user.id) {
56
+ return false;
57
+ }
58
+ if (!user.token) {
59
+ return false;
60
+ }
61
+ return !isTokenExpired(user.token.expires);
62
+ };
22
63
  export const AuthProvider = ({ children, getToken, getUserData, removeToken, }) => {
23
64
  const [user, setUser] = useState(null);
24
65
  const [isAuthenticated, setIsAuthenticated] = useState(false);
25
66
  const [isLoading, setIsLoading] = useState(false);
26
67
  useEffect(() => {
27
68
  const auth = initAuth();
28
- if (auth.id) {
69
+ // Verificar que el usuario tenga un token válido y vigente
70
+ if (isUserTokenValid(auth)) {
29
71
  setUser(auth);
30
72
  setIsAuthenticated(true);
31
73
  }
32
74
  else {
75
+ // Si el token está expirado o es inválido, limpiar el almacenamiento
76
+ if (auth.id && isTokenExpired(auth.token?.expires)) {
77
+ removeStoredAuth();
78
+ }
79
+ setUser(null);
33
80
  setIsAuthenticated(false);
34
81
  }
35
82
  }, []);
36
83
  const login = async (username, password) => {
37
84
  setIsLoading(true);
38
- const token = await getToken(username, password);
39
- if (token.accessToken) {
40
- const { id, name, aditionalData } = await getUserData(token.accessToken);
41
- const userData = {
42
- id,
43
- name,
44
- aditionalData,
45
- token,
46
- };
47
- setUser(userData);
48
- storeAuth(userData);
49
- setIsAuthenticated(true);
85
+ try {
86
+ const token = await getToken(username, password);
87
+ if (token.accessToken) {
88
+ // Verificar que el token recibido no esté expirado antes de continuar
89
+ if (isTokenExpired(token.expires)) {
90
+ console.warn("El token recibido ya está expirado");
91
+ setUser(null);
92
+ setIsAuthenticated(false);
93
+ setIsLoading(false);
94
+ return;
95
+ }
96
+ const { id, name, aditionalData } = await getUserData(token.accessToken);
97
+ const userData = {
98
+ id,
99
+ name,
100
+ aditionalData,
101
+ token,
102
+ };
103
+ // Validar nuevamente antes de establecer el estado
104
+ if (isUserTokenValid(userData)) {
105
+ setUser(userData);
106
+ storeAuth(userData);
107
+ setIsAuthenticated(true);
108
+ }
109
+ else {
110
+ setUser(null);
111
+ setIsAuthenticated(false);
112
+ }
113
+ }
114
+ else {
115
+ setUser(null);
116
+ setIsAuthenticated(false);
117
+ }
118
+ }
119
+ catch (error) {
120
+ console.error("Error durante el login:", error);
121
+ setUser(null);
122
+ setIsAuthenticated(false);
123
+ }
124
+ finally {
125
+ setIsLoading(false);
50
126
  }
51
- setIsLoading(false);
52
127
  };
53
128
  const logout = async () => {
54
129
  removeStoredAuth();
@@ -58,5 +133,24 @@ export const AuthProvider = ({ children, getToken, getUserData, removeToken, })
58
133
  }
59
134
  setIsAuthenticated(false);
60
135
  };
136
+ // Validar el token periódicamente o cuando cambia el usuario
137
+ // Esto asegura que si el token expira durante la sesión, se actualice el estado
138
+ useEffect(() => {
139
+ if (user && user.token?.expires) {
140
+ const checkTokenExpiration = () => {
141
+ if (isTokenExpired(user.token?.expires)) {
142
+ // Token expirado, cerrar sesión
143
+ removeStoredAuth();
144
+ setUser(null);
145
+ setIsAuthenticated(false);
146
+ }
147
+ };
148
+ // Verificar inmediatamente
149
+ checkTokenExpiration();
150
+ // Verificar cada minuto para detectar expiraciones
151
+ const interval = setInterval(checkTokenExpiration, 60000);
152
+ return () => clearInterval(interval);
153
+ }
154
+ }, [user]);
61
155
  return (_jsx(AuthContext.Provider, { value: { user, isAuthenticated, isLoading, login, logout }, children: children }));
62
156
  };
@@ -1,2 +1,13 @@
1
+ /**
2
+ * Componente de Documentación del AuthContext
3
+ *
4
+ * Este componente muestra cómo usar el AuthContext con un servicio mock
5
+ * para propósitos de documentación y desarrollo.
6
+ *
7
+ * El servicio mock simula las tres operaciones principales:
8
+ * - getToken: Obtiene un token de acceso
9
+ * - getUserData: Obtiene los datos del usuario autenticado
10
+ * - removeToken: Revoca/invalida un token (opcional)
11
+ */
1
12
  export declare const AuthDocs: () => import("react/jsx-runtime").JSX.Element;
2
13
  //# sourceMappingURL=AuthDocs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthDocs.d.ts","sourceRoot":"","sources":["../../../src/docs/AuthDocs.tsx/AuthDocs.tsx"],"names":[],"mappings":"AAkDA,eAAO,MAAM,QAAQ,+CAMpB,CAAC"}
1
+ {"version":3,"file":"AuthDocs.d.ts","sourceRoot":"","sources":["../../../src/docs/AuthDocs.tsx/AuthDocs.tsx"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,+CAUpB,CAAC"}
@@ -1,37 +1,18 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { AuthProvider, } from "../../contexts/AuthContext";
3
- import { apiClient } from "../../services/apiClient";
2
+ import { AuthProvider } from "../../contexts/AuthContext";
4
3
  import { AuthDocsContent } from "./AuthDocsContent";
5
- const getToken = async (username, password) => {
6
- const { access_token, expires, token_type, refresh_token, } = await apiClient.post({
7
- url: "https://devmanager.osocna.com.ar/backend/api/users/login",
8
- body: {
9
- username,
10
- password,
11
- },
12
- });
13
- return {
14
- accessToken: access_token,
15
- tokenType: token_type,
16
- expires,
17
- refreshToken: refresh_token,
18
- };
19
- };
20
- const getUserData = async (token) => {
21
- const { id, name } = await apiClient.get({
22
- url: "https://devmanager.osocna.com.ar/backend/api/users/userdata",
23
- headers: {
24
- Authorization: `Bearer ${token}`,
25
- },
26
- });
27
- return {
28
- id,
29
- name,
30
- aditionalData: {
31
- role: "admin",
32
- },
33
- };
34
- };
4
+ import { mockGetToken, mockGetUserData, mockRemoveToken, } from "./mockAuthService";
5
+ /**
6
+ * Componente de Documentación del AuthContext
7
+ *
8
+ * Este componente muestra cómo usar el AuthContext con un servicio mock
9
+ * para propósitos de documentación y desarrollo.
10
+ *
11
+ * El servicio mock simula las tres operaciones principales:
12
+ * - getToken: Obtiene un token de acceso
13
+ * - getUserData: Obtiene los datos del usuario autenticado
14
+ * - removeToken: Revoca/invalida un token (opcional)
15
+ */
35
16
  export const AuthDocs = () => {
36
- return (_jsx(AuthProvider, { getToken: getToken, getUserData: getUserData, children: _jsx(AuthDocsContent, {}) }));
17
+ return (_jsx(AuthProvider, { getToken: mockGetToken, getUserData: mockGetUserData, removeToken: mockRemoveToken, children: _jsx(AuthDocsContent, {}) }));
37
18
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AuthDocsContent.d.ts","sourceRoot":"","sources":["../../../src/docs/AuthDocs.tsx/AuthDocsContent.tsx"],"names":[],"mappings":"AAIA,eAAO,MAAM,eAAe,+CA2B3B,CAAC"}
1
+ {"version":3,"file":"AuthDocsContent.d.ts","sourceRoot":"","sources":["../../../src/docs/AuthDocs.tsx/AuthDocsContent.tsx"],"names":[],"mappings":"AAIA,eAAO,MAAM,eAAe,+CAmW3B,CAAC"}
@@ -1,14 +1,22 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useContext } from "react";
3
3
  import { AuthContext } from "../../contexts/AuthContext";
4
- import { Button } from "../../components";
4
+ import { Button, Card, DataField, Badge } from "../../components";
5
5
  export const AuthDocsContent = () => {
6
6
  const { login, isAuthenticated, isLoading, user, logout } = useContext(AuthContext);
7
7
  const handleLogin = async () => {
8
- await login("wursten.alexis@gmail.com", "Oscn1138");
8
+ await login("usuario@ejemplo.com", "password123");
9
9
  };
10
10
  const handleLogout = () => {
11
11
  logout();
12
12
  };
13
- return isAuthenticated ? (_jsxs("div", { children: [_jsx("h1", { children: "Bienvenido" }), JSON.stringify(user), _jsx("div", { children: _jsx(Button, { onClick: handleLogout, children: "Logout" }) })] })) : isLoading ? (_jsx("div", { children: "Cargando..." })) : (_jsx("div", { children: _jsx(Button, { onClick: handleLogin, children: "Login" }) }));
13
+ // Sección de documentación de interfaces (siempre visible)
14
+ const InterfacesDocumentation = () => (_jsx("div", { className: "space-y-4 mb-6", children: _jsx(Card, { title: "Interfaces de TypeScript", subtitle: "Estructuras de datos utilizadas por el AuthContext", children: _jsxs("div", { className: "space-y-6", children: [_jsxs("div", { children: [_jsxs("div", { className: "flex items-center gap-2 mb-3", children: [_jsx(Badge, { variant: "primary", icon: "fa-code", size: "sm", children: "Interface" }), _jsx("code", { className: "text-sm font-mono text-[var(--color-primary)] font-semibold", children: "AuthTokenInterface" })] }), _jsx("p", { className: "text-sm text-[var(--color-text-secondary)] mb-3", children: "Define la estructura de los datos del token de autenticaci\u00F3n devueltos por el servicio de autenticaci\u00F3n." }), _jsx("div", { className: "bg-[var(--color-bg-secondary)] rounded-lg p-4 border border-[var(--color-border-default)]", children: _jsxs("div", { className: "space-y-2", children: [_jsx(DataField, { label: "accessToken", value: _jsx("span", { className: "text-xs font-mono", children: "string | undefined" }) }), _jsx("p", { className: "text-xs text-[var(--color-text-secondary)] ml-2", children: "Token de acceso utilizado para autenticar las solicitudes HTTP." }), _jsxs("div", { className: "pt-2 border-t border-[var(--color-border-default)]", children: [_jsx(DataField, { label: "tokenType", value: _jsx("span", { className: "text-xs font-mono", children: "string | undefined" }) }), _jsx("p", { className: "text-xs text-[var(--color-text-secondary)] ml-2", children: "Tipo de token (generalmente \"Bearer\")." })] }), _jsxs("div", { className: "pt-2 border-t border-[var(--color-border-default)]", children: [_jsx(DataField, { label: "expires", value: _jsx("span", { className: "text-xs font-mono", children: "string | undefined" }) }), _jsx("p", { className: "text-xs text-[var(--color-text-secondary)] ml-2", children: "Fecha de expiraci\u00F3n del token en formato ISO 8601." })] }), _jsxs("div", { className: "pt-2 border-t border-[var(--color-border-default)]", children: [_jsx(DataField, { label: "refreshToken", value: _jsx("span", { className: "text-xs font-mono", children: "string | undefined" }) }), _jsx("p", { className: "text-xs text-[var(--color-text-secondary)] ml-2", children: "Token de actualizaci\u00F3n utilizado para obtener un nuevo token de acceso cuando el actual expira." })] })] }) })] }), _jsxs("div", { className: "pt-4 border-t border-[var(--color-border-default)]", children: [_jsxs("div", { className: "flex items-center gap-2 mb-3", children: [_jsx(Badge, { variant: "primary", icon: "fa-code", size: "sm", children: "Interface" }), _jsx("code", { className: "text-sm font-mono text-[var(--color-primary)] font-semibold", children: "AuthContextUserInterface" })] }), _jsx("p", { className: "text-sm text-[var(--color-text-secondary)] mb-3", children: "Define la estructura de los datos del usuario autenticado que se almacenan en el contexto." }), _jsx("div", { className: "bg-[var(--color-bg-secondary)] rounded-lg p-4 border border-[var(--color-border-default)]", children: _jsxs("div", { className: "space-y-2", children: [_jsx(DataField, { label: "id", value: _jsx("span", { className: "text-xs font-mono", children: "number | undefined" }) }), _jsx("p", { className: "text-xs text-[var(--color-text-secondary)] ml-2", children: "Identificador \u00FAnico del usuario." }), _jsxs("div", { className: "pt-2 border-t border-[var(--color-border-default)]", children: [_jsx(DataField, { label: "name", value: _jsx("span", { className: "text-xs font-mono", children: "string | undefined" }) }), _jsx("p", { className: "text-xs text-[var(--color-text-secondary)] ml-2", children: "Nombre del usuario." })] }), _jsxs("div", { className: "pt-2 border-t border-[var(--color-border-default)]", children: [_jsx(DataField, { label: "aditionalData", value: _jsx("span", { className: "text-xs font-mono", children: "any | undefined" }) }), _jsx("p", { className: "text-xs text-[var(--color-text-secondary)] ml-2", children: "Objeto que puede contener datos adicionales del usuario (roles, permisos, email, etc.). Es flexible y puede adaptarse a las necesidades espec\u00EDficas de cada aplicaci\u00F3n." })] }), _jsxs("div", { className: "pt-2 border-t border-[var(--color-border-default)]", children: [_jsx(DataField, { label: "token", value: _jsx("span", { className: "text-xs font-mono", children: "AuthTokenInterface | undefined" }) }), _jsxs("p", { className: "text-xs text-[var(--color-text-secondary)] ml-2", children: ["Objeto de token que contiene el", " ", _jsx("code", { className: "text-xs bg-white/50 px-1 rounded", children: "AuthTokenInterface" }), " ", "con la informaci\u00F3n de autenticaci\u00F3n."] })] })] }) })] })] }) }) }));
15
+ if (isLoading) {
16
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(InterfacesDocumentation, {}), _jsx(Card, { children: _jsx("div", { className: "flex items-center justify-center py-8", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("i", { className: "fa fa-spinner fa-spin text-[var(--color-primary)] text-xl" }), _jsx("span", { className: "text-[var(--color-text-secondary)]", children: "Iniciando sesi\u00F3n..." })] }) }) })] }));
17
+ }
18
+ if (isAuthenticated && user) {
19
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(InterfacesDocumentation, {}), _jsx(Card, { title: "Sesi\u00F3n Activa", subtitle: "Informaci\u00F3n del usuario autenticado", headerActions: _jsx(Badge, { variant: "success", icon: "fa-check-circle", iconPosition: "left", children: "Autenticado" }), children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [_jsx(DataField, { label: "ID de Usuario", value: user.id }), _jsx(DataField, { label: "Nombre", value: user.name || "No disponible" })] }), user.aditionalData && (_jsxs("div", { className: "mt-4 pt-4 border-t border-[var(--color-border-default)]", children: [_jsx("h4", { className: "text-sm font-semibold text-[var(--color-text-primary)] mb-3", children: "Datos Adicionales" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [user.aditionalData.role && (_jsx(DataField, { label: "Rol", value: _jsx(Badge, { variant: "primary", icon: "fa-user-shield", children: user.aditionalData.role }) })), user.aditionalData.email && (_jsx(DataField, { label: "Email", value: user.aditionalData.email })), user.aditionalData.createdAt && (_jsx(DataField, { label: "Fecha de Creaci\u00F3n", value: new Date(user.aditionalData.createdAt).toLocaleString() })), user.aditionalData.permissions && (_jsx(DataField, { label: "Permisos", value: _jsx("div", { className: "flex flex-wrap gap-2", children: user.aditionalData.permissions.map((permission, index) => (_jsx(Badge, { variant: "info", size: "sm", icon: "fa-key", children: permission }, index))) }) }))] })] })), user.token && (_jsxs("div", { className: "mt-4 pt-4 border-t border-[var(--color-border-default)]", children: [_jsx("h4", { className: "text-sm font-semibold text-[var(--color-text-primary)] mb-3", children: "Informaci\u00F3n del Token" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [_jsx(DataField, { label: "Tipo de Token", value: _jsx(Badge, { variant: "secondary", icon: "fa-tag", children: user.token.tokenType || "Bearer" }) }), user.token.expires && (_jsx(DataField, { label: "Expira", value: new Date(user.token.expires).toLocaleString() })), user.token.accessToken && (_jsx(DataField, { label: "Access Token", value: _jsxs("code", { className: "text-xs bg-[var(--color-bg-secondary)] px-2 py-1 rounded break-all", children: [user.token.accessToken.substring(0, 30), "..."] }) }))] })] })), _jsx("div", { className: "mt-6 pt-4 border-t border-[var(--color-border-default)]", children: _jsx(Button, { variant: "outline", icon: "fa-sign-out-alt", iconPosition: "left", onClick: handleLogout, className: "w-full md:w-auto", children: "Cerrar Sesi\u00F3n" }) })] }) })] }));
20
+ }
21
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(InterfacesDocumentation, {}), _jsx(Card, { title: "Autenticaci\u00F3n", subtitle: "Inicia sesi\u00F3n para ver el AuthContext en acci\u00F3n", children: _jsxs("div", { className: "space-y-4", children: [_jsx("div", { className: "bg-[var(--color-info-light)] border border-[var(--color-info)] rounded-lg p-4", children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("i", { className: "fa fa-info-circle text-[var(--color-info)] mt-1" }), _jsx("div", { className: "flex-1", children: _jsxs("p", { className: "text-sm text-[var(--color-text-primary)]", children: ["Esta es una demostraci\u00F3n del", " ", _jsx("code", { className: "text-xs bg-white/50 px-1 rounded", children: "AuthContext" }), " ", "usando un servicio mock. Haz clic en el bot\u00F3n para simular un inicio de sesi\u00F3n."] }) })] }) }), _jsx("div", { className: "flex justify-center pt-4", children: _jsx(Button, { variant: "primary", size: "lg", icon: "fa-sign-in-alt", iconPosition: "left", onClick: handleLogin, children: "Iniciar Sesi\u00F3n" }) })] }) })] }));
14
22
  };
@@ -0,0 +1,24 @@
1
+ import type { AuthTokenInterface, AuthContextUserInterface } from "../../contexts/AuthContext";
2
+ /**
3
+ * Mock de getToken - Obtiene un token de acceso
4
+ *
5
+ * @param username - Nombre de usuario o email
6
+ * @param password - Contraseña del usuario
7
+ * @returns Promise con los datos del token
8
+ */
9
+ export declare const mockGetToken: (username: string, password: string) => Promise<AuthTokenInterface>;
10
+ /**
11
+ * Mock de getUserData - Obtiene los datos del usuario autenticado
12
+ *
13
+ * @param token - Token de acceso
14
+ * @returns Promise con los datos del usuario
15
+ */
16
+ export declare const mockGetUserData: (token: string) => Promise<AuthContextUserInterface>;
17
+ /**
18
+ * Mock de removeToken - Revoca/invalida un token
19
+ *
20
+ * @param token - Token a revocar
21
+ * @returns Promise que se resuelve cuando el token es revocado
22
+ */
23
+ export declare const mockRemoveToken: (token: string) => Promise<void>;
24
+ //# sourceMappingURL=mockAuthService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockAuthService.d.ts","sourceRoot":"","sources":["../../../src/docs/AuthDocs.tsx/mockAuthService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,4BAA4B,CAAC;AAgBpC;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,MAAM,EAChB,UAAU,MAAM,KACf,OAAO,CAAC,kBAAkB,CAqB5B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,MAAM,KACZ,OAAO,CAAC,wBAAwB,CAoBlC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAWjE,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Servicio Mock para Autenticación
3
+ *
4
+ * Este servicio simula las llamadas a la API de autenticación
5
+ * para propósitos de documentación y desarrollo.
6
+ */
7
+ /**
8
+ * Simula un delay de red para hacer más realista el mock
9
+ */
10
+ const simulateNetworkDelay = (ms = 800) => {
11
+ return new Promise((resolve) => setTimeout(resolve, ms));
12
+ };
13
+ /**
14
+ * Mock de getToken - Obtiene un token de acceso
15
+ *
16
+ * @param username - Nombre de usuario o email
17
+ * @param password - Contraseña del usuario
18
+ * @returns Promise con los datos del token
19
+ */
20
+ export const mockGetToken = async (username, password) => {
21
+ await simulateNetworkDelay();
22
+ // Validación básica de credenciales
23
+ if (!username || !password) {
24
+ throw new Error("Username y password son requeridos");
25
+ }
26
+ // Simular token JWT
27
+ const tokenData = {
28
+ accessToken: `mock_access_token_${Date.now()}_${Math.random()
29
+ .toString(36)
30
+ .substring(7)}`,
31
+ tokenType: "Bearer",
32
+ expires: new Date(Date.now() + 3600000).toISOString(), // 1 hora
33
+ refreshToken: `mock_refresh_token_${Date.now()}_${Math.random()
34
+ .toString(36)
35
+ .substring(7)}`,
36
+ };
37
+ return tokenData;
38
+ };
39
+ /**
40
+ * Mock de getUserData - Obtiene los datos del usuario autenticado
41
+ *
42
+ * @param token - Token de acceso
43
+ * @returns Promise con los datos del usuario
44
+ */
45
+ export const mockGetUserData = async (token) => {
46
+ await simulateNetworkDelay();
47
+ if (!token) {
48
+ throw new Error("Token es requerido");
49
+ }
50
+ // Simular datos de usuario
51
+ const userData = {
52
+ id: 123,
53
+ name: "Usuario de Prueba",
54
+ aditionalData: {
55
+ role: "admin",
56
+ email: "usuario@ejemplo.com",
57
+ createdAt: new Date().toISOString(),
58
+ permissions: ["read", "write", "delete"],
59
+ },
60
+ };
61
+ return userData;
62
+ };
63
+ /**
64
+ * Mock de removeToken - Revoca/invalida un token
65
+ *
66
+ * @param token - Token a revocar
67
+ * @returns Promise que se resuelve cuando el token es revocado
68
+ */
69
+ export const mockRemoveToken = async (token) => {
70
+ await simulateNetworkDelay();
71
+ if (!token) {
72
+ throw new Error("Token es requerido");
73
+ }
74
+ // Simular revocación del token
75
+ // En una implementación real, aquí se haría una llamada al servidor
76
+ // para invalidar el token
77
+ console.log(`Token revocado: ${token.substring(0, 20)}...`);
78
+ };
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const AutocompleteInputDocs: React.FC;
3
+ export default AutocompleteInputDocs;
4
+ //# sourceMappingURL=AutocompleteInputDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutocompleteInputDocs.d.ts","sourceRoot":"","sources":["../../src/docs/AutocompleteInputDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AA4E1B,QAAA,MAAM,qBAAqB,EAAE,KAAK,CAAC,EA4SlC,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { Card, AutocompleteInput, Button, Input } from "../index";
4
+ const sampleOptions = [
5
+ {
6
+ label: "España",
7
+ value: "es",
8
+ icon: "fa-flag",
9
+ description: "Madrid",
10
+ },
11
+ {
12
+ label: "Estados Unidos",
13
+ value: "us",
14
+ icon: "fa-flag",
15
+ description: "Washington D.C.",
16
+ },
17
+ {
18
+ label: "México",
19
+ value: "mx",
20
+ icon: "fa-flag",
21
+ description: "Ciudad de México",
22
+ },
23
+ {
24
+ label: "Argentina",
25
+ value: "ar",
26
+ icon: "fa-flag",
27
+ description: "Buenos Aires",
28
+ },
29
+ ];
30
+ const users = [
31
+ {
32
+ id: 1,
33
+ firstName: "Juan",
34
+ lastName: "Pérez",
35
+ email: "juan.perez@empresa.com",
36
+ role: "Desarrollador",
37
+ department: "Tecnología",
38
+ },
39
+ {
40
+ id: 2,
41
+ firstName: "María",
42
+ lastName: "García",
43
+ email: "maria.garcia@empresa.com",
44
+ role: "Diseñadora",
45
+ department: "Diseño",
46
+ },
47
+ {
48
+ id: 3,
49
+ firstName: "Carlos",
50
+ lastName: "Rodríguez",
51
+ email: "carlos.rodriguez@empresa.com",
52
+ role: "Gerente",
53
+ department: "Ventas",
54
+ },
55
+ {
56
+ id: 4,
57
+ firstName: "Ana",
58
+ lastName: "Martínez",
59
+ email: "ana.martinez@empresa.com",
60
+ role: "Analista",
61
+ department: "Marketing",
62
+ },
63
+ ];
64
+ const AutocompleteInputDocs = () => {
65
+ const [selectedCountry, setSelectedCountry] = React.useState();
66
+ const [value, setValue] = React.useState("");
67
+ const [selectedUser, setSelectedUser] = React.useState();
68
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "AutocompleteInput - B\u00FAsqueda y selecci\u00F3n de opciones", 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("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(AutocompleteInput, { label: "Pa\u00EDs", placeholder: "Escribe para buscar...", icon: "fa-globe", options: sampleOptions, onSelectOption: (option) => setSelectedCountry(option) }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "escribe para filtrar la lista de opciones y selecciona con el mouse o con Enter" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: "Selecci\u00F3n actual" }), _jsx(Card, { variant: "outlined", children: _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: selectedCountry
69
+ ? `${selectedCountry.label} (${selectedCountry.value.toUpperCase()})`
70
+ : "Ningún país seleccionado" }) })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Controlado vs no controlado" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(AutocompleteInput, { label: "Autocomplete no controlado", placeholder: "Escribe para buscar...", icon: "fa-search", options: sampleOptions }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "sin prop value: el componente maneja internamente el valor del input" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx(AutocompleteInput, { label: "Autocomplete controlado", placeholder: "Escribe para buscar...", icon: "fa-search", options: sampleOptions, value: value, onChange: setValue }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "con value y onChange: el valor del input se controla desde el estado externo" }), _jsx(Input, { label: "Valor actual", value: value, readOnly: true, icon: "fa-code" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Personalizaci\u00F3n y estados" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(AutocompleteInput, { label: "Sin resultados", placeholder: "Escribe algo que no exista", icon: "fa-question-circle", options: sampleOptions, noResultsText: "No encontramos coincidencias" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "el mensaje se muestra cuando no hay coincidencias al filtrar" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx(AutocompleteInput, { label: "Deshabilitado", placeholder: "No editable", icon: "fa-ban", options: sampleOptions, disabled: true }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "respeta el estado disabled heredado del componente Input" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Uso gen\u00E9rico con renderOption personalizado" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(AutocompleteInput, { label: "Buscar usuario", placeholder: "Escribe nombre o email...", icon: "fa-users", options: users, getOptionLabel: (user) => `${user.firstName} ${user.lastName}`, getOptionValue: (user) => user.id, getOptionDescription: (user) => user.email, onSelectOption: (user, userId) => {
71
+ setSelectedUser(user);
72
+ console.log("Usuario seleccionado:", user, "ID:", userId);
73
+ }, renderOption: (user) => (_jsxs("div", { className: "flex items-start gap-3 w-full", children: [_jsx("div", { className: "flex-shrink-0 w-10 h-10 rounded-full bg-[var(--color-primary-soft)] flex items-center justify-center", children: _jsx("i", { className: "fa fa-user text-[var(--color-primary)]" }) }), _jsxs("div", { className: "flex flex-col flex-1 min-w-0", children: [_jsxs("span", { className: "font-medium text-[var(--color-text-primary)]", children: [user.firstName, " ", user.lastName] }), _jsx("span", { className: "text-xs text-[var(--color-text-secondary)] truncate", children: user.email }), _jsxs("div", { className: "flex items-center gap-2 mt-1", children: [_jsx("span", { className: "text-xs px-2 py-0.5 rounded bg-[var(--color-bg-secondary)] text-[var(--color-text-secondary)]", children: user.role }), _jsxs("span", { className: "text-xs text-[var(--color-text-muted)]", children: ["\u2022 ", user.department] })] })] })] })) }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "usando getOptionLabel, getOptionValue y renderOption para personalizar completamente el renderizado de opciones sin propiedades label/value/description" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: "Usuario seleccionado" }), _jsx(Card, { variant: "outlined", children: selectedUser ? (_jsxs("div", { className: "space-y-2", children: [_jsxs("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: [selectedUser.firstName, " ", selectedUser.lastName] }), _jsx("p", { className: "text-xs", style: { color: "var(--flysoft-text-secondary)" }, children: selectedUser.email }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-xs px-2 py-0.5 rounded bg-[var(--color-bg-secondary)]", style: { color: "var(--flysoft-text-secondary)" }, children: selectedUser.role }), _jsx("span", { className: "text-xs", style: { color: "var(--flysoft-text-muted)" }, children: selectedUser.department })] }), _jsxs("p", { className: "text-xs mt-2", style: { color: "var(--flysoft-text-muted)" }, children: ["ID: ", selectedUser.id] })] })) : (_jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Ning\u00FAn usuario seleccionado" })) })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Ejemplo de formulario" }), _jsx(Card, { title: "Formulario de b\u00FAsqueda con AutocompleteInput", subtitle: "Combinaci\u00F3n de AutocompleteInput, Input y Button", footer: _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(Button, { variant: "outline", icon: "fa-times", children: "Limpiar" }), _jsx(Button, { variant: "primary", icon: "fa-search", children: "Buscar" })] }), children: _jsxs("div", { className: "space-y-4", children: [_jsx(AutocompleteInput, { label: "Pa\u00EDs de residencia", placeholder: "Selecciona un pa\u00EDs", icon: "fa-flag", options: sampleOptions }), _jsx(Input, { label: "Ciudad", placeholder: "Introduce tu ciudad", icon: "fa-city" })] }) })] })] }) }) }));
74
+ };
75
+ export default AutocompleteInputDocs;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const DateInputDocs: React.FC;
3
+ export default DateInputDocs;
4
+ //# sourceMappingURL=DateInputDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateInputDocs.d.ts","sourceRoot":"","sources":["../../src/docs/DateInputDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,QAAA,MAAM,aAAa,EAAE,KAAK,CAAC,EA0P1B,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { Card, DateInput, Button, Input, DatePicker } from "../index";
4
+ const DateInputDocs = () => {
5
+ const [date1, setDate1] = React.useState(new Date());
6
+ const [date2, setDate2] = React.useState(null);
7
+ const [format, setFormat] = React.useState("dd/mm/yyyy");
8
+ const formatDate = (date) => {
9
+ if (!date)
10
+ return "Sin fecha seleccionada";
11
+ return date.toLocaleDateString("es-ES", {
12
+ day: "2-digit",
13
+ month: "long",
14
+ year: "numeric",
15
+ });
16
+ };
17
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "DateInput - Input de fecha con calendario", 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 (dd/mm/yyyy)" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6 items-start", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(DateInput, { label: "Fecha de nacimiento", value: date1, onChange: setDate1, format: "dd/mm/yyyy", icon: "fa-calendar-alt" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "puedes escribir la fecha manualmente (dd/mm/yyyy) o elegirla desde el calendario" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: "Fecha seleccionada" }), _jsx(Card, { variant: "outlined", children: _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: formatDate(date1) }) })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Soporte de formatos (dd/mm/yyyy y mm/dd/yyyy)" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Button, { size: "sm", variant: format === "dd/mm/yyyy" ? "primary" : "outline", onClick: () => setFormat("dd/mm/yyyy"), children: "dd/mm/yyyy" }), _jsx(Button, { size: "sm", variant: format === "mm/dd/yyyy" ? "primary" : "outline", onClick: () => setFormat("mm/dd/yyyy"), children: "mm/dd/yyyy" })] }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6 items-start", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(DateInput, { label: "Fecha con formato din\u00E1mico", value: date2, onChange: setDate2, format: format, icon: "fa-calendar-day" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "cambia el formato y escribe la fecha usando el mismo patr\u00F3n" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: "Fecha seleccionada" }), _jsx(Card, { variant: "outlined", children: _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: formatDate(date2) }) })] })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Integraci\u00F3n con DatePicker" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6 items-start", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(DateInput, { label: "Fecha de reserva", value: date1, onChange: setDate1, format: "dd/mm/yyyy", datePickerProps: {
18
+ startWeekOn: "monday",
19
+ } }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "puedes pasar props al DatePicker interno mediante la prop datePickerProps" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: "DatePicker independiente" }), _jsx(DatePicker, { value: date1 ?? undefined, onChange: setDate1, startWeekOn: "monday" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Estados y personalizaci\u00F3n" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(DateInput, { label: "Solo lectura", value: new Date(), readOnly: true, icon: "fa-lock" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "respeta el estado readOnly del Input subyacente" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx(DateInput, { label: "Deshabilitado", value: new Date(), disabled: true, icon: "fa-ban" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "respeta el estado disabled y evita abrir el calendario" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Ejemplo de formulario" }), _jsx(Card, { title: "Formulario de reserva", subtitle: "Combinaci\u00F3n de DateInput, Input y Button", footer: _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(Button, { variant: "outline", icon: "fa-times", children: "Cancelar" }), _jsx(Button, { variant: "primary", icon: "fa-check", children: "Confirmar" })] }), children: _jsxs("div", { className: "space-y-4", children: [_jsx(Input, { label: "Nombre", placeholder: "Nombre completo", icon: "fa-user" }), _jsx(DateInput, { label: "Fecha de entrada", value: date1, onChange: setDate1, format: "dd/mm/yyyy", icon: "fa-calendar-check" }), _jsx(DateInput, { label: "Fecha de salida", value: date2, onChange: setDate2, format: "dd/mm/yyyy", icon: "fa-calendar-minus" })] }) })] })] }) }) }));
20
+ };
21
+ export default DateInputDocs;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const DatePickerDocs: React.FC;
3
+ export default DatePickerDocs;
4
+ //# sourceMappingURL=DatePickerDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatePickerDocs.d.ts","sourceRoot":"","sources":["../../src/docs/DatePickerDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,QAAA,MAAM,cAAc,EAAE,KAAK,CAAC,EA+H3B,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { Card, DatePicker, Button } from "../index";
4
+ const DatePickerDocs = () => {
5
+ const [selectedDate, setSelectedDate] = React.useState(null);
6
+ const [anotherDate, setAnotherDate] = React.useState(new Date());
7
+ const formatDate = (date) => {
8
+ if (!date)
9
+ return "Sin fecha seleccionada";
10
+ return date.toLocaleDateString("es-ES", {
11
+ day: "2-digit",
12
+ month: "long",
13
+ year: "numeric",
14
+ });
15
+ };
16
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "DatePicker - Selector de fecha con calendario", 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("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6 items-start", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(DatePicker, { value: selectedDate ?? undefined, onChange: setSelectedDate }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "selector de fecha sin input, solo calendario" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: "Fecha seleccionada" }), _jsx(Card, { variant: "outlined", children: _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: formatDate(selectedDate) }) })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Navegaci\u00F3n por meses y a\u00F1os" }), _jsxs("div", { className: "space-y-4", children: [_jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Usa los botones con flechas para cambiar de mes o de a\u00F1o. El d\u00EDa actual se resalta con un borde, y el d\u00EDa seleccionado se marca con el color primario." }), _jsx(DatePicker, { value: anotherDate ?? undefined, onChange: setAnotherDate, startWeekOn: "monday" }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: formatDate(anotherDate) }), _jsx(Button, { size: "sm", variant: "outline", icon: "fa-calendar-day", onClick: () => setAnotherDate(new Date()), children: "Ir a hoy" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Inicio de semana configurable" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: "Semana comenzando en lunes (default)" }), _jsx(DatePicker, { startWeekOn: "monday" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: "Semana comenzando en domingo" }), _jsx(DatePicker, { startWeekOn: "sunday" })] })] })] })] }) }) }));
17
+ };
18
+ export default DatePickerDocs;
@@ -1 +1 @@
1
- {"version":3,"file":"DocsMenu.d.ts","sourceRoot":"","sources":["../../src/docs/DocsMenu.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,+CAyBpB,CAAC"}
1
+ {"version":3,"file":"DocsMenu.d.ts","sourceRoot":"","sources":["../../src/docs/DocsMenu.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,+CAqCpB,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/theme", children: "ThemeSwitcher" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/datafield", children: "DataField" }) })] }) }));
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" }) })] }) }));
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;AAS1B,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAY9B,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;AAa1B,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAgB9B,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -7,7 +7,11 @@ import InputDocs from "./InputDocs";
7
7
  import ThemeSwitcherDocs from "./ThemeSwitcherDocs";
8
8
  import BadgeDocs from "./BadgeDocs";
9
9
  import DataFieldDocs from "./DataFieldDocs";
10
+ import AutocompleteInputDocs from "./AutocompleteInputDocs";
11
+ import DatePickerDocs from "./DatePickerDocs";
12
+ import DateInputDocs from "./DateInputDocs";
13
+ import { AuthDocs } from "./AuthDocs.tsx/AuthDocs";
10
14
  export const DocsRouter = () => {
11
- 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: "theme", element: _jsx(ThemeSwitcherDocs, {}) }), _jsx(Route, { path: "datafield", element: _jsx(DataFieldDocs, {}) })] }));
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, {}) })] }));
12
16
  };
13
17
  export default DocsRouter;
@@ -1 +1 @@
1
- {"version":3,"file":"useElementScroll.d.ts","sourceRoot":"","sources":["../../src/hooks/useElementScroll.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,GAC3B,YAAY,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;;;CA6ChD,CAAC"}
1
+ {"version":3,"file":"useElementScroll.d.ts","sourceRoot":"","sources":["../../src/hooks/useElementScroll.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,GAC3B,YAAY,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;;;CAuEhD,CAAC"}