flysoft-react-ui 1.2.4 → 1.2.5

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 (265) hide show
  1. package/AI_CONTEXT.md +1400 -217
  2. package/AI_INTEGRATION_GUIDE.md +343 -0
  3. package/INTEGRATION_GUIDE.md +60 -0
  4. package/README.md +5 -3
  5. package/dist/components/form-controls/Input.d.ts.map +1 -1
  6. package/dist/components/layout/Accordion.d.ts +1 -0
  7. package/dist/components/layout/Accordion.d.ts.map +1 -1
  8. package/dist/components/layout/DataTable.d.ts.map +1 -1
  9. package/dist/components/layout/DropdownMenu.d.ts +2 -1
  10. package/dist/components/layout/DropdownMenu.d.ts.map +1 -1
  11. package/dist/components/layout/DropdownPanel.d.ts +2 -1
  12. package/dist/components/layout/DropdownPanel.d.ts.map +1 -1
  13. package/dist/components/layout/Filter.d.ts +1 -0
  14. package/dist/components/layout/Filter.d.ts.map +1 -1
  15. package/dist/components/layout/Menu.d.ts +2 -1
  16. package/dist/components/layout/Menu.d.ts.map +1 -1
  17. package/dist/components/layout/TabsGroup.d.ts +1 -0
  18. package/dist/components/layout/TabsGroup.d.ts.map +1 -1
  19. package/dist/index.css +1 -1
  20. package/dist/index.d.ts +2 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +11889 -24
  23. package/dist/index.js.map +1 -1
  24. package/dist/templates/forms/ContactForm.d.ts +1 -0
  25. package/dist/templates/forms/ContactForm.d.ts.map +1 -1
  26. package/dist/templates/forms/LoginForm.d.ts +1 -0
  27. package/dist/templates/forms/LoginForm.d.ts.map +1 -1
  28. package/dist/templates/forms/RegistrationForm.d.ts +1 -0
  29. package/dist/templates/forms/RegistrationForm.d.ts.map +1 -1
  30. package/dist/templates/layouts/DashboardLayout.d.ts +1 -0
  31. package/dist/templates/layouts/DashboardLayout.d.ts.map +1 -1
  32. package/dist/templates/layouts/SidebarLayout.d.ts +1 -0
  33. package/dist/templates/layouts/SidebarLayout.d.ts.map +1 -1
  34. package/dist/templates/patterns/FormPattern.d.ts +1 -0
  35. package/dist/templates/patterns/FormPattern.d.ts.map +1 -1
  36. package/dist/templates/patterns/ListPattern.d.ts +77 -0
  37. package/dist/templates/patterns/ListPattern.d.ts.map +1 -0
  38. package/package.json +6 -3
  39. package/dist/App.d.ts +0 -4
  40. package/dist/App.d.ts.map +0 -1
  41. package/dist/App.js +0 -30
  42. package/dist/components/ThemeSwitcher.js +0 -12
  43. package/dist/components/form-controls/AutocompleteInput.js +0 -680
  44. package/dist/components/form-controls/Button.js +0 -211
  45. package/dist/components/form-controls/Checkbox.js +0 -79
  46. package/dist/components/form-controls/CurrencyInput.js +0 -106
  47. package/dist/components/form-controls/DateInput.js +0 -578
  48. package/dist/components/form-controls/DatePicker.js +0 -144
  49. package/dist/components/form-controls/Input.js +0 -35
  50. package/dist/components/form-controls/LinkButton.js +0 -248
  51. package/dist/components/form-controls/Pagination.js +0 -23
  52. package/dist/components/form-controls/RadioButtonGroup.js +0 -220
  53. package/dist/components/form-controls/SearchSelectInput.js +0 -336
  54. package/dist/components/form-controls/index.js +0 -11
  55. package/dist/components/index.js +0 -7
  56. package/dist/components/layout/Accordion.js +0 -67
  57. package/dist/components/layout/AppLayout.js +0 -230
  58. package/dist/components/layout/Card.js +0 -54
  59. package/dist/components/layout/Collection.js +0 -18
  60. package/dist/components/layout/DataField.js +0 -38
  61. package/dist/components/layout/DataTable.js +0 -164
  62. package/dist/components/layout/DropdownMenu.js +0 -176
  63. package/dist/components/layout/DropdownPanel.js +0 -162
  64. package/dist/components/layout/Filter.js +0 -629
  65. package/dist/components/layout/Menu.js +0 -21
  66. package/dist/components/layout/TabPanel.js +0 -11
  67. package/dist/components/layout/TabsGroup.js +0 -52
  68. package/dist/components/layout/index.js +0 -12
  69. package/dist/components/utils/Avatar.js +0 -77
  70. package/dist/components/utils/Badge.js +0 -151
  71. package/dist/components/utils/Dialog.js +0 -44
  72. package/dist/components/utils/FiltersDialog.js +0 -104
  73. package/dist/components/utils/Loader.js +0 -44
  74. package/dist/components/utils/RoadMap.js +0 -139
  75. package/dist/components/utils/Skeleton.js +0 -10
  76. package/dist/components/utils/Snackbar.js +0 -136
  77. package/dist/components/utils/SnackbarContainer.js +0 -26
  78. package/dist/components/utils/iconUtils.js +0 -40
  79. package/dist/components/utils/index.js +0 -9
  80. package/dist/contexts/AppLayoutContext.js +0 -104
  81. package/dist/contexts/AuthContext.js +0 -224
  82. package/dist/contexts/CrudContext.js +0 -333
  83. package/dist/contexts/SnackbarContext.js +0 -41
  84. package/dist/contexts/ThemeContext.js +0 -197
  85. package/dist/contexts/index.js +0 -13
  86. package/dist/contexts/presets.js +0 -311
  87. package/dist/contexts/types.js +0 -1
  88. package/dist/docs/AccordionDocs.d.ts +0 -4
  89. package/dist/docs/AccordionDocs.d.ts.map +0 -1
  90. package/dist/docs/AccordionDocs.js +0 -21
  91. package/dist/docs/AuthDocs.tsx/AuthDocs.d.ts +0 -13
  92. package/dist/docs/AuthDocs.tsx/AuthDocs.d.ts.map +0 -1
  93. package/dist/docs/AuthDocs.tsx/AuthDocs.js +0 -18
  94. package/dist/docs/AuthDocs.tsx/AuthDocsContent.d.ts +0 -2
  95. package/dist/docs/AuthDocs.tsx/AuthDocsContent.d.ts.map +0 -1
  96. package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +0 -22
  97. package/dist/docs/AuthDocs.tsx/mockAuthService.d.ts +0 -24
  98. package/dist/docs/AuthDocs.tsx/mockAuthService.d.ts.map +0 -1
  99. package/dist/docs/AuthDocs.tsx/mockAuthService.js +0 -78
  100. package/dist/docs/AutocompleteInputDocs.d.ts +0 -4
  101. package/dist/docs/AutocompleteInputDocs.d.ts.map +0 -1
  102. package/dist/docs/AutocompleteInputDocs.js +0 -84
  103. package/dist/docs/AvatarDocs.d.ts +0 -4
  104. package/dist/docs/AvatarDocs.d.ts.map +0 -1
  105. package/dist/docs/AvatarDocs.js +0 -7
  106. package/dist/docs/BadgeDocs.d.ts +0 -4
  107. package/dist/docs/BadgeDocs.d.ts.map +0 -1
  108. package/dist/docs/BadgeDocs.js +0 -9
  109. package/dist/docs/ButtonDocs.d.ts +0 -4
  110. package/dist/docs/ButtonDocs.d.ts.map +0 -1
  111. package/dist/docs/ButtonDocs.js +0 -7
  112. package/dist/docs/CardDocs.d.ts +0 -4
  113. package/dist/docs/CardDocs.d.ts.map +0 -1
  114. package/dist/docs/CardDocs.js +0 -22
  115. package/dist/docs/CheckboxDocs.d.ts +0 -4
  116. package/dist/docs/CheckboxDocs.d.ts.map +0 -1
  117. package/dist/docs/CheckboxDocs.js +0 -7
  118. package/dist/docs/CurrencyInputDocs.d.ts +0 -4
  119. package/dist/docs/CurrencyInputDocs.d.ts.map +0 -1
  120. package/dist/docs/CurrencyInputDocs.js +0 -22
  121. package/dist/docs/DataFieldDocs.d.ts +0 -4
  122. package/dist/docs/DataFieldDocs.d.ts.map +0 -1
  123. package/dist/docs/DataFieldDocs.js +0 -7
  124. package/dist/docs/DataTableDocs.d.ts +0 -4
  125. package/dist/docs/DataTableDocs.d.ts.map +0 -1
  126. package/dist/docs/DataTableDocs.js +0 -244
  127. package/dist/docs/DateInputDocs.d.ts +0 -5
  128. package/dist/docs/DateInputDocs.d.ts.map +0 -1
  129. package/dist/docs/DateInputDocs.js +0 -19
  130. package/dist/docs/DatePickerDocs.d.ts +0 -5
  131. package/dist/docs/DatePickerDocs.d.ts.map +0 -1
  132. package/dist/docs/DatePickerDocs.js +0 -16
  133. package/dist/docs/DialogDocs.d.ts +0 -4
  134. package/dist/docs/DialogDocs.d.ts.map +0 -1
  135. package/dist/docs/DialogDocs.js +0 -13
  136. package/dist/docs/DocAdmin.d.ts +0 -4
  137. package/dist/docs/DocAdmin.d.ts.map +0 -1
  138. package/dist/docs/DocAdmin.js +0 -68
  139. package/dist/docs/DocsMenu.d.ts +0 -2
  140. package/dist/docs/DocsMenu.d.ts.map +0 -1
  141. package/dist/docs/DocsMenu.js +0 -5
  142. package/dist/docs/DocsRouter.d.ts +0 -4
  143. package/dist/docs/DocsRouter.d.ts.map +0 -1
  144. package/dist/docs/DocsRouter.js +0 -39
  145. package/dist/docs/DropdownMenuDocs.d.ts +0 -4
  146. package/dist/docs/DropdownMenuDocs.d.ts.map +0 -1
  147. package/dist/docs/DropdownMenuDocs.js +0 -66
  148. package/dist/docs/DropdownPanelDocs.d.ts +0 -4
  149. package/dist/docs/DropdownPanelDocs.d.ts.map +0 -1
  150. package/dist/docs/DropdownPanelDocs.js +0 -7
  151. package/dist/docs/ExampleFormDocs.d.ts +0 -4
  152. package/dist/docs/ExampleFormDocs.d.ts.map +0 -1
  153. package/dist/docs/ExampleFormDocs.js +0 -153
  154. package/dist/docs/FilterDocs.d.ts +0 -4
  155. package/dist/docs/FilterDocs.d.ts.map +0 -1
  156. package/dist/docs/FilterDocs.js +0 -130
  157. package/dist/docs/InputDocs.d.ts +0 -4
  158. package/dist/docs/InputDocs.d.ts.map +0 -1
  159. package/dist/docs/InputDocs.js +0 -17
  160. package/dist/docs/LinkButtonDocs.d.ts +0 -4
  161. package/dist/docs/LinkButtonDocs.d.ts.map +0 -1
  162. package/dist/docs/LinkButtonDocs.js +0 -7
  163. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +0 -2
  164. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +0 -1
  165. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +0 -47
  166. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts +0 -2
  167. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts.map +0 -1
  168. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.js +0 -34
  169. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts +0 -2
  170. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts.map +0 -1
  171. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.js +0 -66
  172. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts +0 -2
  173. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +0 -1
  174. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +0 -7
  175. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts +0 -10
  176. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts.map +0 -1
  177. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.js +0 -39
  178. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts +0 -2
  179. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +0 -1
  180. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +0 -57
  181. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts +0 -9
  182. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +0 -1
  183. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +0 -30
  184. package/dist/docs/LoaderDocs.d.ts +0 -4
  185. package/dist/docs/LoaderDocs.d.ts.map +0 -1
  186. package/dist/docs/LoaderDocs.js +0 -33
  187. package/dist/docs/MenuDocs.d.ts +0 -4
  188. package/dist/docs/MenuDocs.d.ts.map +0 -1
  189. package/dist/docs/MenuDocs.js +0 -26
  190. package/dist/docs/PaginationDocs.d.ts +0 -4
  191. package/dist/docs/PaginationDocs.d.ts.map +0 -1
  192. package/dist/docs/PaginationDocs.js +0 -38
  193. package/dist/docs/RadioButtonGroupDocs.d.ts +0 -4
  194. package/dist/docs/RadioButtonGroupDocs.d.ts.map +0 -1
  195. package/dist/docs/RadioButtonGroupDocs.js +0 -46
  196. package/dist/docs/RoadMapDocs.d.ts +0 -4
  197. package/dist/docs/RoadMapDocs.d.ts.map +0 -1
  198. package/dist/docs/RoadMapDocs.js +0 -171
  199. package/dist/docs/SearchSelectInputDocs.d.ts +0 -4
  200. package/dist/docs/SearchSelectInputDocs.d.ts.map +0 -1
  201. package/dist/docs/SearchSelectInputDocs.js +0 -168
  202. package/dist/docs/SkeletonDocs.d.ts +0 -4
  203. package/dist/docs/SkeletonDocs.d.ts.map +0 -1
  204. package/dist/docs/SkeletonDocs.js +0 -7
  205. package/dist/docs/SnackbarDocs.d.ts +0 -4
  206. package/dist/docs/SnackbarDocs.d.ts.map +0 -1
  207. package/dist/docs/SnackbarDocs.js +0 -69
  208. package/dist/docs/TabsGroupDocs.d.ts +0 -4
  209. package/dist/docs/TabsGroupDocs.d.ts.map +0 -1
  210. package/dist/docs/TabsGroupDocs.js +0 -38
  211. package/dist/docs/ThemeSwitcherDocs.d.ts +0 -4
  212. package/dist/docs/ThemeSwitcherDocs.d.ts.map +0 -1
  213. package/dist/docs/ThemeSwitcherDocs.js +0 -11
  214. package/dist/docs/docMockServices/empresaService.d.ts +0 -38
  215. package/dist/docs/docMockServices/empresaService.d.ts.map +0 -1
  216. package/dist/docs/docMockServices/empresaService.js +0 -125
  217. package/dist/docs/docMockServices/index.d.ts +0 -9
  218. package/dist/docs/docMockServices/index.d.ts.map +0 -1
  219. package/dist/docs/docMockServices/index.js +0 -8
  220. package/dist/docs/docMockServices/initialData.d.ts +0 -6
  221. package/dist/docs/docMockServices/initialData.d.ts.map +0 -1
  222. package/dist/docs/docMockServices/initialData.js +0 -132
  223. package/dist/docs/docMockServices/interfaces.d.ts +0 -38
  224. package/dist/docs/docMockServices/interfaces.d.ts.map +0 -1
  225. package/dist/docs/docMockServices/interfaces.js +0 -1
  226. package/dist/docs/docMockServices/personaEmpresaService.d.ts +0 -43
  227. package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +0 -1
  228. package/dist/docs/docMockServices/personaEmpresaService.js +0 -151
  229. package/dist/docs/docMockServices/personaService.d.ts +0 -39
  230. package/dist/docs/docMockServices/personaService.d.ts.map +0 -1
  231. package/dist/docs/docMockServices/personaService.js +0 -190
  232. package/dist/helpers/currencyFormat.js +0 -3
  233. package/dist/helpers/getErrorMessage.js +0 -13
  234. package/dist/helpers/getInitialLetters.js +0 -5
  235. package/dist/helpers/getQueryString.js +0 -13
  236. package/dist/helpers/index.js +0 -9
  237. package/dist/helpers/mappers.js +0 -27
  238. package/dist/helpers/nameValueArrayToObject.js +0 -3
  239. package/dist/helpers/objectToQueryString.js +0 -3
  240. package/dist/helpers/queryStringToObject.js +0 -13
  241. package/dist/helpers/regularExpressions.js +0 -5
  242. package/dist/hooks/index.js +0 -6
  243. package/dist/hooks/useAsyncRequest.js +0 -53
  244. package/dist/hooks/useBreakpoint.js +0 -59
  245. package/dist/hooks/useElementScroll.js +0 -58
  246. package/dist/hooks/useEnum.js +0 -21
  247. package/dist/hooks/useGlobalThemeStyles.js +0 -40
  248. package/dist/hooks/useThemeOverride.js +0 -99
  249. package/dist/interfaces/index.js +0 -1
  250. package/dist/interfaces/name-value.interface.js +0 -1
  251. package/dist/interfaces/pagination.interface.js +0 -1
  252. package/dist/main.d.ts +0 -2
  253. package/dist/main.d.ts.map +0 -1
  254. package/dist/main.js +0 -6
  255. package/dist/services/apiClient.js +0 -216
  256. package/dist/services/index.js +0 -1
  257. package/dist/styles.d.ts +0 -2
  258. package/dist/styles.d.ts.map +0 -1
  259. package/dist/styles.js +0 -3
  260. package/dist/templates/forms/ContactForm.js +0 -58
  261. package/dist/templates/forms/LoginForm.js +0 -36
  262. package/dist/templates/forms/RegistrationForm.js +0 -54
  263. package/dist/templates/layouts/DashboardLayout.js +0 -26
  264. package/dist/templates/layouts/SidebarLayout.js +0 -28
  265. package/dist/templates/patterns/FormPattern.js +0 -68
@@ -1,211 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React from "react";
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 }) => {
31
- const buttonRef = React.useRef(null);
32
- const [ripples, setRipples] = React.useState([]);
33
- const baseClasses = `
34
- inline-flex items-center justify-center font-medium rounded-sm transition-colors
35
- cursor-pointer relative overflow-hidden
36
- disabled:opacity-50 disabled:cursor-not-allowed
37
- font-[var(--font-default)]
38
- flysoft-button-reset
39
- `;
40
- // Mapeo de clases para variant primary con color primary (usa Tailwind)
41
- const getVariantClasses = (variantType, colorType) => {
42
- // Solo usar clases Tailwind para primary con color primary
43
- if (colorType === "primary") {
44
- if (variantType === "primary") {
45
- return `
46
- bg-primary text-primary-contrast
47
- hover:bg-primary-dark focus:ring-primary
48
- `;
49
- }
50
- if (variantType === "secondary") {
51
- return `
52
- bg-primary-light/10 text-primary border border-primary/20
53
- hover:bg-primary-light/20 focus:ring-primary
54
- `;
55
- }
56
- if (variantType === "outline") {
57
- return `
58
- border border-primary text-primary bg-transparent
59
- hover:bg-primary hover:text-primary-contrast focus:ring-primary
60
- `;
61
- }
62
- if (variantType === "ghost") {
63
- return `
64
- text-primary bg-transparent
65
- hover:bg-primary/10 focus:ring-primary
66
- `;
67
- }
68
- // Default for primary colorType if variantType not matched
69
- return `focus:ring-2 focus:ring-offset-2`;
70
- }
71
- // Para otros colores, retornar clases base sin color (se aplicarán con estilos inline)
72
- if (variantType === "primary") {
73
- return `focus:ring-2 focus:ring-offset-2`;
74
- }
75
- else if (variantType === "outline") {
76
- return `border bg-transparent hover:bg-[var(--color-bg-secondary)] focus:ring-2 focus:ring-offset-2`;
77
- }
78
- else {
79
- return `bg-transparent border-none hover:bg-[var(--color-bg-secondary)] focus:ring-2 focus:ring-offset-2`;
80
- }
81
- };
82
- // Si se proporciona bg personalizado, no usar las clases de variante
83
- const variantClasses = bg ? "" : getVariantClasses(variant, color);
84
- // Determinar si necesitamos usar estilos inline para colores del sistema
85
- const needsInlineStyles = !bg && color !== "primary";
86
- const sizeClasses = {
87
- sm: `${children ? "px-3 py-1.5" : "p-1.5"} text-sm`,
88
- md: `${children ? "px-4 py-2" : "p-2"} text-base`,
89
- lg: `${children ? "px-6 py-3" : "p-3"} text-lg`,
90
- };
91
- // Clases adicionales para variant outline cuando hay bg personalizado
92
- const outlineClasses = bg && variant === "outline" ? "border" : "";
93
- const classes = `${baseClasses} ${variantClasses} ${sizeClasses[size]} ${outlineClasses} ${className}`;
94
- // Función para obtener el valor de una variable CSS
95
- const getCSSVariable = (varName) => {
96
- if (typeof window !== "undefined") {
97
- const value = getComputedStyle(document.documentElement)
98
- .getPropertyValue(varName)
99
- .trim();
100
- // Si no se encuentra la variable, intentar con el prefijo flysoft
101
- if (!value && varName.startsWith("--color-")) {
102
- const flysoftVarName = varName.replace("--color-", "--flysoft-");
103
- return (getComputedStyle(document.documentElement)
104
- .getPropertyValue(flysoftVarName)
105
- .trim() || value);
106
- }
107
- return value;
108
- }
109
- return "";
110
- };
111
- // Estilos inline para colores personalizados o colores del sistema (no primary)
112
- const inlineStyles = bg
113
- ? {
114
- backgroundColor: variant === "primary" ? getColorValue(bg) || bg : undefined,
115
- color: getColorValue(textColor) ||
116
- textColor ||
117
- (variant === "primary" ? "#ffffff" : getColorValue(bg) || bg),
118
- borderColor: variant === "outline" ? getColorValue(bg) || bg : undefined,
119
- ...(variant === "ghost" && {
120
- color: getColorValue(textColor) || textColor || getColorValue(bg) || bg,
121
- }),
122
- }
123
- : needsInlineStyles
124
- ? {
125
- ...(variant === "primary" && {
126
- backgroundColor: getCSSVariable(`--color-${color}`),
127
- color: getCSSVariable(`--color-${color}-contrast`) || "#ffffff",
128
- }),
129
- ...(variant === "outline" && {
130
- borderColor: getCSSVariable(`--color-${color}`),
131
- color: getCSSVariable(`--color-${color}`),
132
- }),
133
- ...(variant === "ghost" && {
134
- color: getCSSVariable(`--color-${color}`),
135
- }),
136
- }
137
- : {};
138
- // Función para oscurecer un color (para hover en variant primary con bg personalizado)
139
- const darkenColor = (color, percent) => {
140
- const hex = color.replace("#", "");
141
- const num = parseInt(hex, 16);
142
- const r = Math.max(0, Math.floor((num >> 16) * (1 - percent / 100)));
143
- const g = Math.max(0, Math.floor(((num >> 8) & 0x00ff) * (1 - percent / 100)));
144
- const b = Math.max(0, Math.floor((num & 0x0000ff) * (1 - percent / 100)));
145
- return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, "0")}`;
146
- };
147
- // Agregar hover style cuando hay bg personalizado y variant es primary
148
- const hoverStyle = bg && variant === "primary" && !disabled && !loading
149
- ? {
150
- "--hover-bg": darkenColor(getColorValue(bg) || bg, 15),
151
- }
152
- : {};
153
- const renderIcon = () => {
154
- if (!icon)
155
- return null;
156
- const iconClasses = size === "sm" ? "w-4 h-4" : size === "md" ? "w-5 h-5" : "w-6 h-6";
157
- return (_jsx("i", { className: `${normalizeIconClass(icon)} ${iconClasses} flex items-center justify-center ${children ? (iconPosition === "right" ? "ml-2" : "mr-2") : ""}` }));
158
- };
159
- // Determinar el color del ripple basado en el variant y si hay bg personalizado
160
- const rippleColor = bg
161
- ? variant === "primary"
162
- ? "rgba(255, 255, 255, 0.45)"
163
- : "rgba(0, 0, 0, 0.15)"
164
- : variant === "primary"
165
- ? "rgba(255, 255, 255, 0.45)"
166
- : "rgba(0, 0, 0, 0.15)";
167
- const handleClick = (event) => {
168
- if (!disabled && !loading && buttonRef.current) {
169
- const rect = buttonRef.current.getBoundingClientRect();
170
- const size = Math.max(rect.width, rect.height) * 1.2;
171
- const x = event.clientX - rect.left;
172
- const y = event.clientY - rect.top;
173
- const id = window.performance.now();
174
- const newRipple = { id, x, y, size };
175
- setRipples((prev) => [...prev, newRipple]);
176
- window.setTimeout(() => {
177
- setRipples((prev) => prev.filter((ripple) => ripple.id !== id));
178
- }, 600);
179
- }
180
- onClick?.(event);
181
- };
182
- // Combinar estilos inline
183
- const combinedStyles = { ...inlineStyles, ...hoverStyle };
184
- return (_jsxs("button", { ref: buttonRef, className: classes, style: combinedStyles, disabled: disabled || loading, onClick: handleClick, onMouseEnter: (e) => {
185
- if (variant === "primary" && !disabled && !loading) {
186
- if (bg) {
187
- const hoverBg = darkenColor(getColorValue(bg) || bg, 15);
188
- e.currentTarget.style.backgroundColor = hoverBg;
189
- }
190
- else if (needsInlineStyles) {
191
- const hoverBg = getCSSVariable(`--color-${color}-dark`);
192
- e.currentTarget.style.backgroundColor = hoverBg;
193
- }
194
- }
195
- }, onMouseLeave: (e) => {
196
- if (variant === "primary") {
197
- if (bg) {
198
- e.currentTarget.style.backgroundColor = getColorValue(bg) || bg;
199
- }
200
- else if (needsInlineStyles) {
201
- e.currentTarget.style.backgroundColor = getCSSVariable(`--color-${color}`);
202
- }
203
- }
204
- }, ...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: {
205
- top: ripple.y,
206
- left: ripple.x,
207
- width: ripple.size,
208
- height: ripple.size,
209
- backgroundColor: rippleColor,
210
- } }, 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()] })] }));
211
- };
@@ -1,79 +0,0 @@
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", { 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,106 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import React, { useState, useEffect, useCallback, useMemo } from "react";
3
- import { Input } from "./Input";
4
- import { useFormContext } from "react-hook-form";
5
- /**
6
- * Componente de entrada para valores monetarios.
7
- * Muestra el valor formateado con separadores de miles (puntos) y decimales (comas).
8
- * Al recibir el foco, quita los puntos para facilitar la edición.
9
- */
10
- export const CurrencyInput = React.forwardRef(({ value, onChange, onFocus, onBlur, ...props }, ref) => {
11
- const [isFocused, setIsFocused] = useState(false);
12
- const [displayValue, setDisplayValue] = useState("");
13
- // Detectar si estamos en modo register (si viene 'name')
14
- const isRegisterMode = useMemo(() => {
15
- return "name" in props && props.name !== undefined;
16
- }, [props]);
17
- const fieldName = props.name;
18
- // Obtener el contexto de react-hook-form si existe
19
- const formContext = useFormContext();
20
- const setValue = formContext?.setValue;
21
- // Formateador para mostrar el valor final (con puntos y comas)
22
- const formatToCurrency = useCallback((val) => {
23
- if (val === null || val === undefined || isNaN(val))
24
- return "";
25
- return new Intl.NumberFormat("es-AR", {
26
- minimumFractionDigits: 2,
27
- maximumFractionDigits: 2,
28
- }).format(val);
29
- }, []);
30
- // Formateador para cuando tiene el foco (sin puntos de miles)
31
- const formatToFocus = useCallback((val) => {
32
- if (val === null || val === undefined || isNaN(val))
33
- return "";
34
- return new Intl.NumberFormat("es-AR", {
35
- minimumFractionDigits: 2,
36
- maximumFractionDigits: 2,
37
- useGrouping: false,
38
- }).format(val);
39
- }, []);
40
- // Función para parsear el string de vuelta a número
41
- const parseToNumeric = useCallback((val) => {
42
- if (!val || val.trim() === "")
43
- return null;
44
- // Reemplazamos la coma por punto para que parseFloat funcione correctamente
45
- const cleanValue = val.replace(/\./g, "").replace(",", ".");
46
- const numeric = parseFloat(cleanValue);
47
- return isNaN(numeric) ? null : numeric;
48
- }, []);
49
- // Valor actual a usar (del prop value o del formulario)
50
- const numericValue = useMemo(() => {
51
- if (isRegisterMode && formContext && fieldName) {
52
- return formContext.watch(fieldName);
53
- }
54
- return value;
55
- }, [isRegisterMode, formContext, fieldName, value]);
56
- // Sincronizar el valor externo con el estado interno cuando no hay foco
57
- useEffect(() => {
58
- if (!isFocused) {
59
- setDisplayValue(formatToCurrency(numericValue));
60
- }
61
- }, [numericValue, isFocused, formatToCurrency]);
62
- const handleFocus = (e) => {
63
- setIsFocused(true);
64
- // Al ganar foco, mostramos el valor sin separadores de miles
65
- setDisplayValue(formatToFocus(numericValue));
66
- if (onFocus)
67
- onFocus(e);
68
- };
69
- const handleBlur = (e) => {
70
- setIsFocused(false);
71
- const numericVal = parseToNumeric(displayValue);
72
- // Notificamos el cambio
73
- if (isRegisterMode && setValue && fieldName) {
74
- // Si estamos en modo register con FormProvider, usamos setValue para guardar el número
75
- setValue(fieldName, numericVal, {
76
- shouldValidate: true,
77
- shouldDirty: true,
78
- shouldTouch: true,
79
- });
80
- }
81
- else if (onChange) {
82
- // Si no, llamamos al onChange tradicional
83
- onChange(numericVal);
84
- }
85
- // Formateamos el valor final para mostrarlo al perder el foco
86
- setDisplayValue(formatToCurrency(numericVal));
87
- if (onBlur)
88
- onBlur(e);
89
- };
90
- const handleChange = (e) => {
91
- let val = e.target.value;
92
- // Solo permitimos números y una sola coma
93
- // Si el usuario presiona punto, lo convertimos a coma para facilitar la entrada
94
- val = val.replace(/\./g, ",");
95
- // Limpiamos caracteres no permitidos
96
- val = val.replace(/[^0-9,]/g, "");
97
- // Aseguramos que solo haya una coma
98
- const parts = val.split(",");
99
- if (parts.length > 2) {
100
- val = parts[0] + "," + parts.slice(1).join("");
101
- }
102
- setDisplayValue(val);
103
- };
104
- return (_jsx(Input, { ...props, ref: ref, type: "text", value: displayValue, onChange: handleChange, onFocus: handleFocus, onBlur: handleBlur }));
105
- });
106
- CurrencyInput.displayName = "CurrencyInput";