flysoft-react-ui 0.5.0 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +19 -7
- package/dist/components/form-controls/AutocompleteInput.d.ts +11 -3
- package/dist/components/form-controls/AutocompleteInput.d.ts.map +1 -1
- package/dist/components/form-controls/AutocompleteInput.js +411 -31
- package/dist/components/form-controls/Button.d.ts +3 -0
- package/dist/components/form-controls/Button.d.ts.map +1 -1
- package/dist/components/form-controls/Button.js +160 -19
- package/dist/components/form-controls/Checkbox.d.ts +14 -0
- package/dist/components/form-controls/Checkbox.d.ts.map +1 -0
- package/dist/components/form-controls/Checkbox.js +79 -0
- package/dist/components/form-controls/DateInput.d.ts +24 -4
- package/dist/components/form-controls/DateInput.d.ts.map +1 -1
- package/dist/components/form-controls/DateInput.js +492 -70
- package/dist/components/form-controls/DatePicker.d.ts +4 -3
- package/dist/components/form-controls/DatePicker.d.ts.map +1 -1
- package/dist/components/form-controls/DatePicker.js +26 -30
- package/dist/components/form-controls/Input.d.ts +10 -1
- package/dist/components/form-controls/Input.d.ts.map +1 -1
- package/dist/components/form-controls/Input.js +17 -10
- package/dist/components/form-controls/LinkButton.d.ts +15 -0
- package/dist/components/form-controls/LinkButton.d.ts.map +1 -0
- package/dist/components/form-controls/LinkButton.js +248 -0
- package/dist/components/form-controls/Pagination.d.ts +1 -0
- package/dist/components/form-controls/Pagination.d.ts.map +1 -1
- package/dist/components/form-controls/Pagination.js +3 -40
- package/dist/components/form-controls/RadioButtonGroup.d.ts +62 -0
- package/dist/components/form-controls/RadioButtonGroup.d.ts.map +1 -0
- package/dist/components/form-controls/RadioButtonGroup.js +220 -0
- package/dist/components/form-controls/SearchSelectInput-OLD.d.ts +68 -0
- package/dist/components/form-controls/SearchSelectInput-OLD.d.ts.map +1 -0
- package/dist/components/form-controls/SearchSelectInput-OLD.js +963 -0
- package/dist/components/form-controls/SearchSelectInput.d.ts +70 -0
- package/dist/components/form-controls/SearchSelectInput.d.ts.map +1 -0
- package/dist/components/form-controls/SearchSelectInput.js +336 -0
- package/dist/components/form-controls/index.d.ts +9 -1
- package/dist/components/form-controls/index.d.ts.map +1 -1
- package/dist/components/form-controls/index.js +4 -0
- package/dist/components/layout/Accordion.d.ts +13 -0
- package/dist/components/layout/Accordion.d.ts.map +1 -0
- package/dist/components/layout/Accordion.js +67 -0
- package/dist/components/layout/AppLayout.d.ts +3 -2
- package/dist/components/layout/AppLayout.d.ts.map +1 -1
- package/dist/components/layout/AppLayout.js +104 -31
- package/dist/components/layout/Card.d.ts +8 -3
- package/dist/components/layout/Card.d.ts.map +1 -1
- package/dist/components/layout/Card.js +18 -19
- package/dist/components/layout/Collection.js +1 -1
- package/dist/components/layout/DataTable.d.ts +3 -1
- package/dist/components/layout/DataTable.d.ts.map +1 -1
- package/dist/components/layout/DataTable.js +34 -29
- package/dist/components/layout/index.d.ts +2 -0
- package/dist/components/layout/index.d.ts.map +1 -1
- package/dist/components/layout/index.js +1 -0
- package/dist/components/utils/Avatar.d.ts +49 -0
- package/dist/components/utils/Avatar.d.ts.map +1 -0
- package/dist/components/utils/Avatar.js +93 -0
- package/dist/components/utils/Badge.d.ts +3 -0
- package/dist/components/utils/Badge.d.ts.map +1 -1
- package/dist/components/utils/Badge.js +131 -26
- package/dist/components/utils/Dialog.d.ts.map +1 -1
- package/dist/components/utils/Dialog.js +6 -1
- package/dist/components/utils/Filter.d.ts +57 -0
- package/dist/components/utils/Filter.d.ts.map +1 -0
- package/dist/components/utils/Filter.js +581 -0
- package/dist/components/utils/FiltersDialog.d.ts +21 -0
- package/dist/components/utils/FiltersDialog.d.ts.map +1 -0
- package/dist/components/utils/FiltersDialog.js +104 -0
- package/dist/components/utils/Loader.js +2 -2
- package/dist/components/utils/RoadMap.d.ts +59 -0
- package/dist/components/utils/RoadMap.d.ts.map +1 -0
- package/dist/components/utils/RoadMap.js +139 -0
- package/dist/components/utils/Snackbar.d.ts +13 -0
- package/dist/components/utils/Snackbar.d.ts.map +1 -0
- package/dist/components/utils/Snackbar.js +122 -0
- package/dist/components/utils/SnackbarContainer.d.ts +7 -0
- package/dist/components/utils/SnackbarContainer.d.ts.map +1 -0
- package/dist/components/utils/SnackbarContainer.js +25 -0
- package/dist/components/utils/iconUtils.d.ts +16 -0
- package/dist/components/utils/iconUtils.d.ts.map +1 -0
- package/dist/components/utils/iconUtils.js +40 -0
- package/dist/components/utils/index.d.ts +12 -0
- package/dist/components/utils/index.d.ts.map +1 -1
- package/dist/components/utils/index.js +6 -0
- package/dist/contexts/AppLayoutContext.d.ts +40 -0
- package/dist/contexts/AppLayoutContext.d.ts.map +1 -0
- package/dist/contexts/AppLayoutContext.js +98 -0
- package/dist/contexts/ListCrudContext.d.ts +50 -0
- package/dist/contexts/ListCrudContext.d.ts.map +1 -0
- package/dist/contexts/ListCrudContext.js +253 -0
- package/dist/contexts/SnackbarContext.d.ts +26 -0
- package/dist/contexts/SnackbarContext.d.ts.map +1 -0
- package/dist/contexts/SnackbarContext.js +34 -0
- package/dist/contexts/index.d.ts +6 -0
- package/dist/contexts/index.d.ts.map +1 -1
- package/dist/contexts/index.js +6 -0
- package/dist/contexts/presets.js +6 -6
- package/dist/docs/AccordionDocs.d.ts +4 -0
- package/dist/docs/AccordionDocs.d.ts.map +1 -0
- package/dist/docs/AccordionDocs.js +21 -0
- package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +3 -5
- package/dist/docs/AutocompleteInputDocs.js +1 -1
- package/dist/docs/AvatarDocs.d.ts +4 -0
- package/dist/docs/AvatarDocs.d.ts.map +1 -0
- package/dist/docs/AvatarDocs.js +7 -0
- package/dist/docs/BadgeDocs.d.ts.map +1 -1
- package/dist/docs/BadgeDocs.js +4 -2
- package/dist/docs/ButtonDocs.d.ts.map +1 -1
- package/dist/docs/ButtonDocs.js +1 -1
- package/dist/docs/CardDocs.d.ts.map +1 -1
- package/dist/docs/CardDocs.js +17 -8
- package/dist/docs/CheckboxDocs.d.ts +4 -0
- package/dist/docs/CheckboxDocs.d.ts.map +1 -0
- package/dist/docs/CheckboxDocs.js +7 -0
- package/dist/docs/DataTableDocs.d.ts.map +1 -1
- package/dist/docs/DataTableDocs.js +9 -5
- package/dist/docs/DateInputDocs.d.ts +1 -0
- package/dist/docs/DateInputDocs.d.ts.map +1 -1
- package/dist/docs/DateInputDocs.js +7 -9
- package/dist/docs/DatePickerDocs.d.ts +1 -0
- package/dist/docs/DatePickerDocs.d.ts.map +1 -1
- package/dist/docs/DatePickerDocs.js +6 -8
- package/dist/docs/DialogDocs.js +1 -1
- package/dist/docs/DocAdmin.d.ts +4 -0
- package/dist/docs/DocAdmin.d.ts.map +1 -0
- package/dist/docs/DocAdmin.js +68 -0
- package/dist/docs/DocsMenu.d.ts.map +1 -1
- package/dist/docs/DocsMenu.js +3 -3
- package/dist/docs/DocsRouter.d.ts.map +1 -1
- package/dist/docs/DocsRouter.js +13 -1
- package/dist/docs/DropdownMenuDocs.js +1 -1
- package/dist/docs/ExampleFormDocs.d.ts +4 -0
- package/dist/docs/ExampleFormDocs.d.ts.map +1 -0
- package/dist/docs/ExampleFormDocs.js +148 -0
- package/dist/docs/FilterDocs.d.ts +4 -0
- package/dist/docs/FilterDocs.d.ts.map +1 -0
- package/dist/docs/FilterDocs.js +112 -0
- package/dist/docs/InputDocs.d.ts.map +1 -1
- package/dist/docs/InputDocs.js +11 -1
- package/dist/docs/LinkButtonDocs.d.ts +4 -0
- package/dist/docs/LinkButtonDocs.d.ts.map +1 -0
- package/dist/docs/LinkButtonDocs.js +7 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +29 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +7 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +57 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts +9 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +30 -0
- package/dist/docs/PaginationDocs.js +6 -6
- package/dist/docs/RadioButtonGroupDocs.d.ts +4 -0
- package/dist/docs/RadioButtonGroupDocs.d.ts.map +1 -0
- package/dist/docs/RadioButtonGroupDocs.js +46 -0
- package/dist/docs/RoadMapDocs.d.ts +4 -0
- package/dist/docs/RoadMapDocs.d.ts.map +1 -0
- package/dist/docs/RoadMapDocs.js +171 -0
- package/dist/docs/SearchSelectInputDocs.d.ts +4 -0
- package/dist/docs/SearchSelectInputDocs.d.ts.map +1 -0
- package/dist/docs/SearchSelectInputDocs.js +168 -0
- package/dist/docs/SnackbarDocs.d.ts +4 -0
- package/dist/docs/SnackbarDocs.d.ts.map +1 -0
- package/dist/docs/SnackbarDocs.js +50 -0
- package/dist/docs/TabsGroupDocs.d.ts.map +1 -1
- package/dist/docs/TabsGroupDocs.js +12 -1
- package/dist/docs/docMockServices/empresaService.d.ts +38 -0
- package/dist/docs/docMockServices/empresaService.d.ts.map +1 -0
- package/dist/docs/docMockServices/empresaService.js +117 -0
- package/dist/docs/docMockServices/index.d.ts +9 -0
- package/dist/docs/docMockServices/index.d.ts.map +1 -0
- package/dist/docs/docMockServices/index.js +8 -0
- package/dist/docs/docMockServices/initialData.d.ts +6 -0
- package/dist/docs/docMockServices/initialData.d.ts.map +1 -0
- package/dist/docs/docMockServices/initialData.js +132 -0
- package/dist/docs/docMockServices/interfaces.d.ts +26 -0
- package/dist/docs/docMockServices/interfaces.d.ts.map +1 -0
- package/dist/docs/docMockServices/interfaces.js +1 -0
- package/dist/docs/docMockServices/personaEmpresaService.d.ts +43 -0
- package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +1 -0
- package/dist/docs/docMockServices/personaEmpresaService.js +113 -0
- package/dist/docs/docMockServices/personaService.d.ts +39 -0
- package/dist/docs/docMockServices/personaService.d.ts.map +1 -0
- package/dist/docs/docMockServices/personaService.js +181 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useAsyncRequest.d.ts +17 -0
- package/dist/hooks/useAsyncRequest.d.ts.map +1 -0
- package/dist/hooks/useAsyncRequest.js +70 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +23 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/templates/forms/ContactForm.js +2 -2
- package/dist/templates/forms/LoginForm.js +1 -1
- package/dist/templates/forms/RegistrationForm.js +1 -1
- package/dist/templates/layouts/SidebarLayout.d.ts.map +1 -1
- package/dist/templates/layouts/SidebarLayout.js +3 -2
- package/dist/templates/patterns/FormPattern.d.ts.map +1 -1
- package/dist/templates/patterns/FormPattern.js +4 -3
- package/package.json +5 -2
|
@@ -1,6 +1,33 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React from "react";
|
|
3
|
-
|
|
3
|
+
import { normalizeIconClass } from "../utils/iconUtils";
|
|
4
|
+
// Función helper para convertir nombres de colores comunes a valores CSS válidos
|
|
5
|
+
const getColorValue = (color) => {
|
|
6
|
+
if (!color)
|
|
7
|
+
return undefined;
|
|
8
|
+
// Si ya es un valor CSS válido (hex, rgb, rgba, hsl, etc.), retornarlo
|
|
9
|
+
if (color.startsWith("#") ||
|
|
10
|
+
color.startsWith("rgb") ||
|
|
11
|
+
color.startsWith("hsl")) {
|
|
12
|
+
return color;
|
|
13
|
+
}
|
|
14
|
+
// Mapeo de nombres de colores comunes
|
|
15
|
+
const colorMap = {
|
|
16
|
+
white: "#ffffff",
|
|
17
|
+
black: "#000000",
|
|
18
|
+
"gray-800": "#1f2937",
|
|
19
|
+
"gray-700": "#374151",
|
|
20
|
+
"gray-600": "#4b5563",
|
|
21
|
+
"gray-500": "#6b7280",
|
|
22
|
+
"gray-400": "#9ca3af",
|
|
23
|
+
"gray-300": "#d1d5db",
|
|
24
|
+
"gray-200": "#e5e7eb",
|
|
25
|
+
"gray-100": "#f3f4f6",
|
|
26
|
+
"gray-50": "#f9fafb",
|
|
27
|
+
};
|
|
28
|
+
return colorMap[color.toLowerCase()] || color;
|
|
29
|
+
};
|
|
30
|
+
export const Button = ({ variant = "primary", size = "md", color = "primary", bg, textColor, icon, iconPosition = "left", loading = false, children, className = "", disabled, onClick, ...props }) => {
|
|
4
31
|
const buttonRef = React.useRef(null);
|
|
5
32
|
const [ripples, setRipples] = React.useState([]);
|
|
6
33
|
const baseClasses = `
|
|
@@ -9,33 +36,125 @@ export const Button = ({ variant = "primary", size = "md", icon, iconPosition =
|
|
|
9
36
|
disabled:opacity-50 disabled:cursor-not-allowed
|
|
10
37
|
font-[var(--font-default)]
|
|
11
38
|
`;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
39
|
+
// Mapeo de clases para variant primary con color primary (usa Tailwind)
|
|
40
|
+
const getVariantClasses = (variantType, colorType) => {
|
|
41
|
+
// Solo usar clases Tailwind para primary con color primary
|
|
42
|
+
if (colorType === "primary") {
|
|
43
|
+
if (variantType === "primary") {
|
|
44
|
+
return `
|
|
45
|
+
bg-[var(--color-primary)] text-[var(--color-primary-contrast)]
|
|
46
|
+
hover:bg-[var(--color-primary-dark)] focus:ring-[var(--color-primary)]
|
|
47
|
+
`;
|
|
48
|
+
}
|
|
49
|
+
else if (variantType === "outline") {
|
|
50
|
+
return `
|
|
51
|
+
border border-[var(--color-primary)] text-[var(--color-primary)]
|
|
52
|
+
hover:bg-[var(--color-bg-secondary)] focus:ring-[var(--color-primary)]
|
|
53
|
+
`;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
return `
|
|
57
|
+
text-[var(--color-primary)] hover:bg-[var(--color-bg-secondary)]
|
|
58
|
+
focus:ring-[var(--color-primary)]
|
|
59
|
+
`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Para otros colores, retornar clases base sin color (se aplicarán con estilos inline)
|
|
63
|
+
if (variantType === "primary") {
|
|
64
|
+
return `focus:ring-2 focus:ring-offset-2`;
|
|
65
|
+
}
|
|
66
|
+
else if (variantType === "outline") {
|
|
67
|
+
return `border hover:bg-[var(--color-bg-secondary)] focus:ring-2 focus:ring-offset-2`;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return `hover:bg-[var(--color-bg-secondary)] focus:ring-2 focus:ring-offset-2`;
|
|
71
|
+
}
|
|
25
72
|
};
|
|
73
|
+
// Si se proporciona bg personalizado, no usar las clases de variante
|
|
74
|
+
const variantClasses = bg ? "" : getVariantClasses(variant, color);
|
|
75
|
+
// Determinar si necesitamos usar estilos inline para colores del sistema
|
|
76
|
+
const needsInlineStyles = !bg && color !== "primary";
|
|
26
77
|
const sizeClasses = {
|
|
27
78
|
sm: `${children ? "px-3 py-1.5" : "p-1.5"} text-sm`,
|
|
28
79
|
md: `${children ? "px-4 py-2" : "p-2"} text-base`,
|
|
29
80
|
lg: `${children ? "px-6 py-3" : "p-3"} text-lg`,
|
|
30
81
|
};
|
|
31
|
-
|
|
82
|
+
// Clases adicionales para variant outline cuando hay bg personalizado
|
|
83
|
+
const outlineClasses = bg && variant === "outline" ? "border" : "";
|
|
84
|
+
const classes = `${baseClasses} ${variantClasses} ${sizeClasses[size]} ${outlineClasses} ${className}`;
|
|
85
|
+
// Función para obtener el valor de una variable CSS
|
|
86
|
+
const getCSSVariable = (varName) => {
|
|
87
|
+
if (typeof window !== "undefined") {
|
|
88
|
+
const value = getComputedStyle(document.documentElement)
|
|
89
|
+
.getPropertyValue(varName)
|
|
90
|
+
.trim();
|
|
91
|
+
// Si no se encuentra la variable, intentar con el prefijo flysoft
|
|
92
|
+
if (!value && varName.startsWith("--color-")) {
|
|
93
|
+
const flysoftVarName = varName.replace("--color-", "--flysoft-");
|
|
94
|
+
return (getComputedStyle(document.documentElement)
|
|
95
|
+
.getPropertyValue(flysoftVarName)
|
|
96
|
+
.trim() || value);
|
|
97
|
+
}
|
|
98
|
+
return value;
|
|
99
|
+
}
|
|
100
|
+
return "";
|
|
101
|
+
};
|
|
102
|
+
// Estilos inline para colores personalizados o colores del sistema (no primary)
|
|
103
|
+
const inlineStyles = bg
|
|
104
|
+
? {
|
|
105
|
+
backgroundColor: variant === "primary" ? getColorValue(bg) || bg : undefined,
|
|
106
|
+
color: getColorValue(textColor) ||
|
|
107
|
+
textColor ||
|
|
108
|
+
(variant === "primary" ? "#ffffff" : getColorValue(bg) || bg),
|
|
109
|
+
borderColor: variant === "outline" ? getColorValue(bg) || bg : undefined,
|
|
110
|
+
...(variant === "ghost" && {
|
|
111
|
+
color: getColorValue(textColor) || textColor || getColorValue(bg) || bg,
|
|
112
|
+
}),
|
|
113
|
+
}
|
|
114
|
+
: needsInlineStyles
|
|
115
|
+
? {
|
|
116
|
+
...(variant === "primary" && {
|
|
117
|
+
backgroundColor: getCSSVariable(`--color-${color}`),
|
|
118
|
+
color: getCSSVariable(`--color-${color}-contrast`) || "#ffffff",
|
|
119
|
+
}),
|
|
120
|
+
...(variant === "outline" && {
|
|
121
|
+
borderColor: getCSSVariable(`--color-${color}`),
|
|
122
|
+
color: getCSSVariable(`--color-${color}`),
|
|
123
|
+
}),
|
|
124
|
+
...(variant === "ghost" && {
|
|
125
|
+
color: getCSSVariable(`--color-${color}`),
|
|
126
|
+
}),
|
|
127
|
+
}
|
|
128
|
+
: {};
|
|
129
|
+
// Función para oscurecer un color (para hover en variant primary con bg personalizado)
|
|
130
|
+
const darkenColor = (color, percent) => {
|
|
131
|
+
const hex = color.replace("#", "");
|
|
132
|
+
const num = parseInt(hex, 16);
|
|
133
|
+
const r = Math.max(0, Math.floor((num >> 16) * (1 - percent / 100)));
|
|
134
|
+
const g = Math.max(0, Math.floor(((num >> 8) & 0x00ff) * (1 - percent / 100)));
|
|
135
|
+
const b = Math.max(0, Math.floor((num & 0x0000ff) * (1 - percent / 100)));
|
|
136
|
+
return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, "0")}`;
|
|
137
|
+
};
|
|
138
|
+
// Agregar hover style cuando hay bg personalizado y variant es primary
|
|
139
|
+
const hoverStyle = bg && variant === "primary" && !disabled && !loading
|
|
140
|
+
? {
|
|
141
|
+
"--hover-bg": darkenColor(getColorValue(bg) || bg, 15),
|
|
142
|
+
}
|
|
143
|
+
: {};
|
|
32
144
|
const renderIcon = () => {
|
|
33
145
|
if (!icon)
|
|
34
146
|
return null;
|
|
35
147
|
const iconClasses = size === "sm" ? "w-4 h-4" : size === "md" ? "w-5 h-5" : "w-6 h-6";
|
|
36
|
-
return (_jsx("i", { className:
|
|
148
|
+
return (_jsx("i", { className: `${normalizeIconClass(icon)} ${iconClasses} ${children ? (iconPosition === "right" ? "ml-2" : "mr-2") : ""} mt-0.5` }));
|
|
37
149
|
};
|
|
38
|
-
|
|
150
|
+
// Determinar el color del ripple basado en el variant y si hay bg personalizado
|
|
151
|
+
const rippleColor = bg
|
|
152
|
+
? variant === "primary"
|
|
153
|
+
? "rgba(255, 255, 255, 0.45)"
|
|
154
|
+
: "rgba(0, 0, 0, 0.15)"
|
|
155
|
+
: variant === "primary"
|
|
156
|
+
? "rgba(255, 255, 255, 0.45)"
|
|
157
|
+
: "rgba(0, 0, 0, 0.15)";
|
|
39
158
|
const handleClick = (event) => {
|
|
40
159
|
if (!disabled && !loading && buttonRef.current) {
|
|
41
160
|
const rect = buttonRef.current.getBoundingClientRect();
|
|
@@ -51,11 +170,33 @@ export const Button = ({ variant = "primary", size = "md", icon, iconPosition =
|
|
|
51
170
|
}
|
|
52
171
|
onClick?.(event);
|
|
53
172
|
};
|
|
54
|
-
|
|
173
|
+
// Combinar estilos inline
|
|
174
|
+
const combinedStyles = { ...inlineStyles, ...hoverStyle };
|
|
175
|
+
return (_jsxs("button", { ref: buttonRef, className: classes, style: combinedStyles, disabled: disabled || loading, onClick: handleClick, onMouseEnter: (e) => {
|
|
176
|
+
if (variant === "primary" && !disabled && !loading) {
|
|
177
|
+
if (bg) {
|
|
178
|
+
const hoverBg = darkenColor(getColorValue(bg) || bg, 15);
|
|
179
|
+
e.currentTarget.style.backgroundColor = hoverBg;
|
|
180
|
+
}
|
|
181
|
+
else if (needsInlineStyles) {
|
|
182
|
+
const hoverBg = getCSSVariable(`--color-${color}-dark`);
|
|
183
|
+
e.currentTarget.style.backgroundColor = hoverBg;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}, onMouseLeave: (e) => {
|
|
187
|
+
if (variant === "primary") {
|
|
188
|
+
if (bg) {
|
|
189
|
+
e.currentTarget.style.backgroundColor = getColorValue(bg) || bg;
|
|
190
|
+
}
|
|
191
|
+
else if (needsInlineStyles) {
|
|
192
|
+
e.currentTarget.style.backgroundColor = getCSSVariable(`--color-${color}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}, ...props, children: [_jsx("span", { className: "absolute inset-0 pointer-events-none", children: ripples.map((ripple) => (_jsx("span", { className: "absolute rounded-full opacity-40 flysoft-button-ripple", style: {
|
|
55
196
|
top: ripple.y,
|
|
56
197
|
left: ripple.x,
|
|
57
198
|
width: ripple.size,
|
|
58
199
|
height: ripple.size,
|
|
59
200
|
backgroundColor: rippleColor,
|
|
60
|
-
} }, ripple.id))) }), _jsxs("span", { className: "relative inline-flex items-center justify-center", children: [loading && _jsx("i", { className: "fa
|
|
201
|
+
} }, ripple.id))) }), _jsxs("span", { className: "relative inline-flex items-center justify-center", children: [loading && (_jsx("i", { className: `${normalizeIconClass("fa-spinner fa-spin")} mr-2` })), icon && iconPosition === "left" && !loading && renderIcon(), children, icon && iconPosition === "right" && !loading && renderIcon()] })] }));
|
|
61
202
|
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "type" | "size"> {
|
|
3
|
+
label?: string;
|
|
4
|
+
labelPosition?: "left" | "right";
|
|
5
|
+
error?: string;
|
|
6
|
+
size?: "sm" | "md" | "lg";
|
|
7
|
+
/**
|
|
8
|
+
* Si es true, el checkbox será de solo lectura. No se podrá modificar pero se verá igual visualmente.
|
|
9
|
+
* Por defecto es false.
|
|
10
|
+
*/
|
|
11
|
+
readOnly?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLInputElement>>;
|
|
14
|
+
//# sourceMappingURL=Checkbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../../../src/components/form-controls/Checkbox.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,aACf,SAAQ,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,QAAQ,wFA0IpB,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
export const Checkbox = React.forwardRef(({ label, labelPosition = "right", error, size = "md", className = "", id, readOnly = false, onClick, onChange, ...props }, ref) => {
|
|
4
|
+
const checkboxId = id || `checkbox-${Math.random().toString(36).substr(2, 9)}`;
|
|
5
|
+
const sizeClasses = {
|
|
6
|
+
sm: "w-4 h-4",
|
|
7
|
+
md: "w-5 h-5",
|
|
8
|
+
lg: "w-6 h-6",
|
|
9
|
+
};
|
|
10
|
+
const labelSizeClasses = {
|
|
11
|
+
sm: "text-sm",
|
|
12
|
+
md: "text-base",
|
|
13
|
+
lg: "text-lg",
|
|
14
|
+
};
|
|
15
|
+
const checkboxClasses = `
|
|
16
|
+
${sizeClasses[size]}
|
|
17
|
+
rounded border transition-colors focus:outline-none focus:ring-2 focus:ring-offset-0
|
|
18
|
+
cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed
|
|
19
|
+
border-[var(--color-border-default)]
|
|
20
|
+
checked:bg-[var(--color-primary)] checked:border-[var(--color-primary)]
|
|
21
|
+
focus:ring-[var(--color-primary)]
|
|
22
|
+
${error
|
|
23
|
+
? "border-[var(--color-border-error)] checked:border-[var(--color-border-error)] checked:bg-[var(--color-danger)]"
|
|
24
|
+
: ""}
|
|
25
|
+
${className}
|
|
26
|
+
`;
|
|
27
|
+
const checkboxStyle = error
|
|
28
|
+
? { accentColor: "var(--color-danger)" }
|
|
29
|
+
: { accentColor: "var(--color-primary)" };
|
|
30
|
+
const labelClasses = `
|
|
31
|
+
${labelSizeClasses[size]}
|
|
32
|
+
font-[var(--font-default)] cursor-pointer select-none
|
|
33
|
+
${props.disabled ? "opacity-50 cursor-not-allowed" : ""}
|
|
34
|
+
${error
|
|
35
|
+
? "text-[var(--color-danger)]"
|
|
36
|
+
: "text-[var(--color-text-primary)]"}
|
|
37
|
+
`;
|
|
38
|
+
const containerClasses = `
|
|
39
|
+
flex items-center gap-2
|
|
40
|
+
${labelPosition === "left" ? "flex-row-reverse" : "flex-row"}
|
|
41
|
+
`;
|
|
42
|
+
// Prevenir cambios cuando está en modo readOnly
|
|
43
|
+
const handleClick = (e) => {
|
|
44
|
+
if (readOnly) {
|
|
45
|
+
e.preventDefault();
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
// Llamar al onClick original si existe
|
|
49
|
+
if (onClick) {
|
|
50
|
+
onClick(e);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const handleChange = (e) => {
|
|
54
|
+
if (readOnly) {
|
|
55
|
+
e.preventDefault();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Llamar al onChange original si existe
|
|
59
|
+
if (onChange) {
|
|
60
|
+
onChange(e);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const handleLabelClick = (e) => {
|
|
64
|
+
if (readOnly) {
|
|
65
|
+
e.preventDefault();
|
|
66
|
+
e.stopPropagation();
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const handleLabelMouseDown = (e) => {
|
|
71
|
+
if (readOnly) {
|
|
72
|
+
e.preventDefault();
|
|
73
|
+
e.stopPropagation();
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
return (_jsxs("div", { className: "w-full", children: [_jsxs("div", { className: containerClasses, children: [_jsx("input", { ref: ref, type: "checkbox", id: checkboxId, className: checkboxClasses, style: checkboxStyle, readOnly: readOnly, onClick: handleClick, onChange: handleChange, ...props }), label && (_jsx("label", { htmlFor: readOnly ? undefined : checkboxId, className: labelClasses, onClick: handleLabelClick, onMouseDown: handleLabelMouseDown, children: label }))] }), error && (_jsx("p", { className: "mt-1 text-sm text-[var(--color-danger)] font-[var(--font-default)]", children: error }))] }));
|
|
78
|
+
});
|
|
79
|
+
Checkbox.displayName = "Checkbox";
|
|
@@ -1,12 +1,32 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
+
import { type Dayjs } from "dayjs";
|
|
2
3
|
import type { InputProps } from "./Input";
|
|
3
4
|
import type { DatePickerProps } from "./DatePicker";
|
|
4
5
|
export type DateInputFormat = "dd/mm/yyyy" | "mm/dd/yyyy";
|
|
5
|
-
export interface DateInputProps extends Omit<InputProps, "type" | "value" | "onChange"> {
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
export interface DateInputProps extends Omit<InputProps, "type" | "value" | "onChange" | "ref"> {
|
|
7
|
+
/**
|
|
8
|
+
* Valor de la fecha.
|
|
9
|
+
* En modo register con FormProvider: Dayjs | null (se guarda como Dayjs en el formulario)
|
|
10
|
+
* En modo register sin FormProvider: string ISO (se guarda como ISO string, se puede parsear a Dayjs)
|
|
11
|
+
* En modo Controller: Dayjs | null
|
|
12
|
+
*/
|
|
13
|
+
value?: Dayjs | null | string;
|
|
14
|
+
/**
|
|
15
|
+
* Callback cuando cambia la fecha.
|
|
16
|
+
* En modo register: ChangeEventHandler (de register)
|
|
17
|
+
* En modo Controller: (date: Dayjs | null) => void
|
|
18
|
+
*
|
|
19
|
+
* NOTA: Para usar Dayjs directamente con register, el formulario debe estar envuelto en FormProvider.
|
|
20
|
+
* Sin FormProvider, el valor se guarda como ISO string y se puede parsear de vuelta a Dayjs usando normalizeToDayjs.
|
|
21
|
+
*/
|
|
22
|
+
onChange?: ((date: Dayjs | null) => void) | React.ChangeEventHandler<HTMLInputElement>;
|
|
8
23
|
format?: DateInputFormat;
|
|
9
24
|
datePickerProps?: Omit<DatePickerProps, "value" | "onChange">;
|
|
25
|
+
/**
|
|
26
|
+
* Si es true, el input será de solo lectura. No se podrá modificar ni desplegar el DatePicker.
|
|
27
|
+
* Por defecto es false.
|
|
28
|
+
*/
|
|
29
|
+
readOnly?: boolean;
|
|
10
30
|
}
|
|
11
|
-
export declare const DateInput: React.
|
|
31
|
+
export declare const DateInput: React.ForwardRefExoticComponent<DateInputProps & React.RefAttributes<HTMLInputElement>>;
|
|
12
32
|
//# sourceMappingURL=DateInput.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateInput.d.ts","sourceRoot":"","sources":["../../../src/components/form-controls/DateInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DateInput.d.ts","sourceRoot":"","sources":["../../../src/components/form-controls/DateInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAc,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAI1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,YAAY,CAAC;AAE1D,MAAM,WAAW,cACf,SAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,CAAC;IAC/D;;;;;OAKG;IACH,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;IAC9B;;;;;;;OAOG;IACH,QAAQ,CAAC,EACL,CAAC,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,GAC9B,KAAK,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAC/C,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,eAAe,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,UAAU,CAAC,CAAC;IAC9D;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA2HD,eAAO,MAAM,SAAS,yFAgmBrB,CAAC"}
|