flysoft-react-ui 1.2.3 → 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 (270) 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/form-controls/index.d.ts +2 -2
  7. package/dist/components/form-controls/index.d.ts.map +1 -1
  8. package/dist/components/layout/Accordion.d.ts +1 -0
  9. package/dist/components/layout/Accordion.d.ts.map +1 -1
  10. package/dist/components/layout/DataTable.d.ts.map +1 -1
  11. package/dist/components/layout/DropdownMenu.d.ts +2 -1
  12. package/dist/components/layout/DropdownMenu.d.ts.map +1 -1
  13. package/dist/components/layout/DropdownPanel.d.ts +2 -1
  14. package/dist/components/layout/DropdownPanel.d.ts.map +1 -1
  15. package/dist/components/layout/Filter.d.ts +1 -0
  16. package/dist/components/layout/Filter.d.ts.map +1 -1
  17. package/dist/components/layout/Menu.d.ts +2 -1
  18. package/dist/components/layout/Menu.d.ts.map +1 -1
  19. package/dist/components/layout/TabsGroup.d.ts +1 -0
  20. package/dist/components/layout/TabsGroup.d.ts.map +1 -1
  21. package/dist/index.css +1 -1
  22. package/dist/index.d.ts +2 -0
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +11889 -24
  25. package/dist/index.js.map +1 -1
  26. package/dist/templates/forms/ContactForm.d.ts +1 -0
  27. package/dist/templates/forms/ContactForm.d.ts.map +1 -1
  28. package/dist/templates/forms/LoginForm.d.ts +1 -0
  29. package/dist/templates/forms/LoginForm.d.ts.map +1 -1
  30. package/dist/templates/forms/RegistrationForm.d.ts +1 -0
  31. package/dist/templates/forms/RegistrationForm.d.ts.map +1 -1
  32. package/dist/templates/layouts/DashboardLayout.d.ts +1 -0
  33. package/dist/templates/layouts/DashboardLayout.d.ts.map +1 -1
  34. package/dist/templates/layouts/SidebarLayout.d.ts +1 -0
  35. package/dist/templates/layouts/SidebarLayout.d.ts.map +1 -1
  36. package/dist/templates/patterns/FormPattern.d.ts +1 -0
  37. package/dist/templates/patterns/FormPattern.d.ts.map +1 -1
  38. package/dist/templates/patterns/ListPattern.d.ts +77 -0
  39. package/dist/templates/patterns/ListPattern.d.ts.map +1 -0
  40. package/package.json +6 -3
  41. package/dist/App.d.ts +0 -4
  42. package/dist/App.d.ts.map +0 -1
  43. package/dist/App.js +0 -30
  44. package/dist/components/ThemeSwitcher.js +0 -12
  45. package/dist/components/form-controls/AutocompleteInput.js +0 -680
  46. package/dist/components/form-controls/Button.js +0 -211
  47. package/dist/components/form-controls/Checkbox.js +0 -79
  48. package/dist/components/form-controls/CurrencyInput.js +0 -106
  49. package/dist/components/form-controls/DateInput.js +0 -578
  50. package/dist/components/form-controls/DatePicker.js +0 -144
  51. package/dist/components/form-controls/Input.js +0 -35
  52. package/dist/components/form-controls/LinkButton.js +0 -248
  53. package/dist/components/form-controls/Pagination.js +0 -23
  54. package/dist/components/form-controls/RadioButtonGroup.js +0 -220
  55. package/dist/components/form-controls/SearchSelectInput-OLD.d.ts +0 -68
  56. package/dist/components/form-controls/SearchSelectInput-OLD.d.ts.map +0 -1
  57. package/dist/components/form-controls/SearchSelectInput-OLD.js +0 -962
  58. package/dist/components/form-controls/SearchSelectInput.js +0 -336
  59. package/dist/components/form-controls/index.js +0 -11
  60. package/dist/components/index.js +0 -7
  61. package/dist/components/layout/Accordion.js +0 -67
  62. package/dist/components/layout/AppLayout.js +0 -230
  63. package/dist/components/layout/Card.js +0 -54
  64. package/dist/components/layout/Collection.js +0 -18
  65. package/dist/components/layout/DataField.js +0 -38
  66. package/dist/components/layout/DataTable.js +0 -164
  67. package/dist/components/layout/DropdownMenu.js +0 -176
  68. package/dist/components/layout/DropdownPanel.js +0 -162
  69. package/dist/components/layout/Filter.js +0 -629
  70. package/dist/components/layout/Menu.js +0 -21
  71. package/dist/components/layout/TabPanel.js +0 -11
  72. package/dist/components/layout/TabsGroup.js +0 -52
  73. package/dist/components/layout/index.js +0 -12
  74. package/dist/components/utils/Avatar.js +0 -77
  75. package/dist/components/utils/Badge.js +0 -151
  76. package/dist/components/utils/Dialog.js +0 -44
  77. package/dist/components/utils/FiltersDialog.js +0 -104
  78. package/dist/components/utils/Loader.js +0 -44
  79. package/dist/components/utils/RoadMap.js +0 -139
  80. package/dist/components/utils/Skeleton.js +0 -10
  81. package/dist/components/utils/Snackbar.js +0 -136
  82. package/dist/components/utils/SnackbarContainer.js +0 -26
  83. package/dist/components/utils/iconUtils.js +0 -40
  84. package/dist/components/utils/index.js +0 -9
  85. package/dist/contexts/AppLayoutContext.js +0 -104
  86. package/dist/contexts/AuthContext.js +0 -224
  87. package/dist/contexts/CrudContext.js +0 -333
  88. package/dist/contexts/SnackbarContext.js +0 -41
  89. package/dist/contexts/ThemeContext.js +0 -197
  90. package/dist/contexts/index.js +0 -13
  91. package/dist/contexts/presets.js +0 -311
  92. package/dist/contexts/types.js +0 -1
  93. package/dist/docs/AccordionDocs.d.ts +0 -4
  94. package/dist/docs/AccordionDocs.d.ts.map +0 -1
  95. package/dist/docs/AccordionDocs.js +0 -21
  96. package/dist/docs/AuthDocs.tsx/AuthDocs.d.ts +0 -13
  97. package/dist/docs/AuthDocs.tsx/AuthDocs.d.ts.map +0 -1
  98. package/dist/docs/AuthDocs.tsx/AuthDocs.js +0 -18
  99. package/dist/docs/AuthDocs.tsx/AuthDocsContent.d.ts +0 -2
  100. package/dist/docs/AuthDocs.tsx/AuthDocsContent.d.ts.map +0 -1
  101. package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +0 -22
  102. package/dist/docs/AuthDocs.tsx/mockAuthService.d.ts +0 -24
  103. package/dist/docs/AuthDocs.tsx/mockAuthService.d.ts.map +0 -1
  104. package/dist/docs/AuthDocs.tsx/mockAuthService.js +0 -78
  105. package/dist/docs/AutocompleteInputDocs.d.ts +0 -4
  106. package/dist/docs/AutocompleteInputDocs.d.ts.map +0 -1
  107. package/dist/docs/AutocompleteInputDocs.js +0 -84
  108. package/dist/docs/AvatarDocs.d.ts +0 -4
  109. package/dist/docs/AvatarDocs.d.ts.map +0 -1
  110. package/dist/docs/AvatarDocs.js +0 -7
  111. package/dist/docs/BadgeDocs.d.ts +0 -4
  112. package/dist/docs/BadgeDocs.d.ts.map +0 -1
  113. package/dist/docs/BadgeDocs.js +0 -9
  114. package/dist/docs/ButtonDocs.d.ts +0 -4
  115. package/dist/docs/ButtonDocs.d.ts.map +0 -1
  116. package/dist/docs/ButtonDocs.js +0 -7
  117. package/dist/docs/CardDocs.d.ts +0 -4
  118. package/dist/docs/CardDocs.d.ts.map +0 -1
  119. package/dist/docs/CardDocs.js +0 -22
  120. package/dist/docs/CheckboxDocs.d.ts +0 -4
  121. package/dist/docs/CheckboxDocs.d.ts.map +0 -1
  122. package/dist/docs/CheckboxDocs.js +0 -7
  123. package/dist/docs/CurrencyInputDocs.d.ts +0 -4
  124. package/dist/docs/CurrencyInputDocs.d.ts.map +0 -1
  125. package/dist/docs/CurrencyInputDocs.js +0 -22
  126. package/dist/docs/DataFieldDocs.d.ts +0 -4
  127. package/dist/docs/DataFieldDocs.d.ts.map +0 -1
  128. package/dist/docs/DataFieldDocs.js +0 -7
  129. package/dist/docs/DataTableDocs.d.ts +0 -4
  130. package/dist/docs/DataTableDocs.d.ts.map +0 -1
  131. package/dist/docs/DataTableDocs.js +0 -244
  132. package/dist/docs/DateInputDocs.d.ts +0 -5
  133. package/dist/docs/DateInputDocs.d.ts.map +0 -1
  134. package/dist/docs/DateInputDocs.js +0 -19
  135. package/dist/docs/DatePickerDocs.d.ts +0 -5
  136. package/dist/docs/DatePickerDocs.d.ts.map +0 -1
  137. package/dist/docs/DatePickerDocs.js +0 -16
  138. package/dist/docs/DialogDocs.d.ts +0 -4
  139. package/dist/docs/DialogDocs.d.ts.map +0 -1
  140. package/dist/docs/DialogDocs.js +0 -13
  141. package/dist/docs/DocAdmin.d.ts +0 -4
  142. package/dist/docs/DocAdmin.d.ts.map +0 -1
  143. package/dist/docs/DocAdmin.js +0 -68
  144. package/dist/docs/DocsMenu.d.ts +0 -2
  145. package/dist/docs/DocsMenu.d.ts.map +0 -1
  146. package/dist/docs/DocsMenu.js +0 -5
  147. package/dist/docs/DocsRouter.d.ts +0 -4
  148. package/dist/docs/DocsRouter.d.ts.map +0 -1
  149. package/dist/docs/DocsRouter.js +0 -39
  150. package/dist/docs/DropdownMenuDocs.d.ts +0 -4
  151. package/dist/docs/DropdownMenuDocs.d.ts.map +0 -1
  152. package/dist/docs/DropdownMenuDocs.js +0 -66
  153. package/dist/docs/DropdownPanelDocs.d.ts +0 -4
  154. package/dist/docs/DropdownPanelDocs.d.ts.map +0 -1
  155. package/dist/docs/DropdownPanelDocs.js +0 -7
  156. package/dist/docs/ExampleFormDocs.d.ts +0 -4
  157. package/dist/docs/ExampleFormDocs.d.ts.map +0 -1
  158. package/dist/docs/ExampleFormDocs.js +0 -153
  159. package/dist/docs/FilterDocs.d.ts +0 -4
  160. package/dist/docs/FilterDocs.d.ts.map +0 -1
  161. package/dist/docs/FilterDocs.js +0 -130
  162. package/dist/docs/InputDocs.d.ts +0 -4
  163. package/dist/docs/InputDocs.d.ts.map +0 -1
  164. package/dist/docs/InputDocs.js +0 -17
  165. package/dist/docs/LinkButtonDocs.d.ts +0 -4
  166. package/dist/docs/LinkButtonDocs.d.ts.map +0 -1
  167. package/dist/docs/LinkButtonDocs.js +0 -7
  168. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +0 -2
  169. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +0 -1
  170. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +0 -47
  171. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts +0 -2
  172. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts.map +0 -1
  173. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.js +0 -34
  174. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts +0 -2
  175. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts.map +0 -1
  176. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.js +0 -66
  177. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts +0 -2
  178. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +0 -1
  179. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +0 -7
  180. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts +0 -10
  181. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts.map +0 -1
  182. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.js +0 -39
  183. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts +0 -2
  184. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +0 -1
  185. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +0 -57
  186. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts +0 -9
  187. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +0 -1
  188. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +0 -30
  189. package/dist/docs/LoaderDocs.d.ts +0 -4
  190. package/dist/docs/LoaderDocs.d.ts.map +0 -1
  191. package/dist/docs/LoaderDocs.js +0 -33
  192. package/dist/docs/MenuDocs.d.ts +0 -4
  193. package/dist/docs/MenuDocs.d.ts.map +0 -1
  194. package/dist/docs/MenuDocs.js +0 -26
  195. package/dist/docs/PaginationDocs.d.ts +0 -4
  196. package/dist/docs/PaginationDocs.d.ts.map +0 -1
  197. package/dist/docs/PaginationDocs.js +0 -38
  198. package/dist/docs/RadioButtonGroupDocs.d.ts +0 -4
  199. package/dist/docs/RadioButtonGroupDocs.d.ts.map +0 -1
  200. package/dist/docs/RadioButtonGroupDocs.js +0 -46
  201. package/dist/docs/RoadMapDocs.d.ts +0 -4
  202. package/dist/docs/RoadMapDocs.d.ts.map +0 -1
  203. package/dist/docs/RoadMapDocs.js +0 -171
  204. package/dist/docs/SearchSelectInputDocs.d.ts +0 -4
  205. package/dist/docs/SearchSelectInputDocs.d.ts.map +0 -1
  206. package/dist/docs/SearchSelectInputDocs.js +0 -168
  207. package/dist/docs/SkeletonDocs.d.ts +0 -4
  208. package/dist/docs/SkeletonDocs.d.ts.map +0 -1
  209. package/dist/docs/SkeletonDocs.js +0 -7
  210. package/dist/docs/SnackbarDocs.d.ts +0 -4
  211. package/dist/docs/SnackbarDocs.d.ts.map +0 -1
  212. package/dist/docs/SnackbarDocs.js +0 -69
  213. package/dist/docs/TabsGroupDocs.d.ts +0 -4
  214. package/dist/docs/TabsGroupDocs.d.ts.map +0 -1
  215. package/dist/docs/TabsGroupDocs.js +0 -38
  216. package/dist/docs/ThemeSwitcherDocs.d.ts +0 -4
  217. package/dist/docs/ThemeSwitcherDocs.d.ts.map +0 -1
  218. package/dist/docs/ThemeSwitcherDocs.js +0 -11
  219. package/dist/docs/docMockServices/empresaService.d.ts +0 -38
  220. package/dist/docs/docMockServices/empresaService.d.ts.map +0 -1
  221. package/dist/docs/docMockServices/empresaService.js +0 -125
  222. package/dist/docs/docMockServices/index.d.ts +0 -9
  223. package/dist/docs/docMockServices/index.d.ts.map +0 -1
  224. package/dist/docs/docMockServices/index.js +0 -8
  225. package/dist/docs/docMockServices/initialData.d.ts +0 -6
  226. package/dist/docs/docMockServices/initialData.d.ts.map +0 -1
  227. package/dist/docs/docMockServices/initialData.js +0 -132
  228. package/dist/docs/docMockServices/interfaces.d.ts +0 -38
  229. package/dist/docs/docMockServices/interfaces.d.ts.map +0 -1
  230. package/dist/docs/docMockServices/interfaces.js +0 -1
  231. package/dist/docs/docMockServices/personaEmpresaService.d.ts +0 -43
  232. package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +0 -1
  233. package/dist/docs/docMockServices/personaEmpresaService.js +0 -151
  234. package/dist/docs/docMockServices/personaService.d.ts +0 -39
  235. package/dist/docs/docMockServices/personaService.d.ts.map +0 -1
  236. package/dist/docs/docMockServices/personaService.js +0 -190
  237. package/dist/helpers/currencyFormat.js +0 -3
  238. package/dist/helpers/getErrorMessage.js +0 -13
  239. package/dist/helpers/getInitialLetters.js +0 -5
  240. package/dist/helpers/getQueryString.js +0 -13
  241. package/dist/helpers/index.js +0 -9
  242. package/dist/helpers/mappers.js +0 -27
  243. package/dist/helpers/nameValueArrayToObject.js +0 -3
  244. package/dist/helpers/objectToQueryString.js +0 -3
  245. package/dist/helpers/queryStringToObject.js +0 -13
  246. package/dist/helpers/regularExpressions.js +0 -5
  247. package/dist/hooks/index.js +0 -6
  248. package/dist/hooks/useAsyncRequest.js +0 -53
  249. package/dist/hooks/useBreakpoint.js +0 -59
  250. package/dist/hooks/useElementScroll.js +0 -58
  251. package/dist/hooks/useEnum.js +0 -21
  252. package/dist/hooks/useGlobalThemeStyles.js +0 -40
  253. package/dist/hooks/useThemeOverride.js +0 -99
  254. package/dist/interfaces/index.js +0 -1
  255. package/dist/interfaces/name-value.interface.js +0 -1
  256. package/dist/interfaces/pagination.interface.js +0 -1
  257. package/dist/main.d.ts +0 -2
  258. package/dist/main.d.ts.map +0 -1
  259. package/dist/main.js +0 -6
  260. package/dist/services/apiClient.js +0 -216
  261. package/dist/services/index.js +0 -1
  262. package/dist/styles.d.ts +0 -2
  263. package/dist/styles.d.ts.map +0 -1
  264. package/dist/styles.js +0 -3
  265. package/dist/templates/forms/ContactForm.js +0 -58
  266. package/dist/templates/forms/LoginForm.js +0 -36
  267. package/dist/templates/forms/RegistrationForm.js +0 -54
  268. package/dist/templates/layouts/DashboardLayout.js +0 -26
  269. package/dist/templates/layouts/SidebarLayout.js +0 -28
  270. package/dist/templates/patterns/FormPattern.js +0 -68
@@ -1,144 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React from "react";
3
- import dayjs, {} from "dayjs";
4
- import { Button } from "./Button";
5
- const createDateAtMidnight = (date) => {
6
- const d = dayjs(date);
7
- return d.startOf("day");
8
- };
9
- const isSameDay = (a, b) => {
10
- return a.isSame(b, "day");
11
- };
12
- const getDaysInMonth = (year, month) => {
13
- return dayjs().year(year).month(month).daysInMonth();
14
- };
15
- const getWeekdayLabels = (startWeekOn) => {
16
- const base = ["D", "L", "M", "X", "J", "V", "S"];
17
- if (startWeekOn === "sunday") {
18
- return base;
19
- }
20
- return [...base.slice(1), base[0]];
21
- };
22
- export const DatePicker = ({ value, onChange, initialViewDate, startWeekOn = "sunday", className = "", }) => {
23
- const today = React.useMemo(() => dayjs().startOf("day"), []);
24
- const getViewFromValue = React.useCallback((val) => {
25
- const base = val ?? initialViewDate ?? today;
26
- return {
27
- month: base.month(),
28
- year: base.year(),
29
- };
30
- }, [initialViewDate, today]);
31
- const [view, setView] = React.useState(() => getViewFromValue(value));
32
- React.useEffect(() => {
33
- // Sincronizar la vista con el valor actual, incluso si es null/undefined
34
- setView(getViewFromValue(value));
35
- }, [value, getViewFromValue]);
36
- const handlePrevMonth = () => {
37
- setView((prev) => {
38
- const month = prev.month === 0 ? 11 : prev.month - 1;
39
- const year = prev.month === 0 ? prev.year - 1 : prev.year;
40
- return { month, year };
41
- });
42
- };
43
- const handleNextMonth = () => {
44
- setView((prev) => {
45
- const month = prev.month === 11 ? 0 : prev.month + 1;
46
- const year = prev.month === 11 ? prev.year + 1 : prev.year;
47
- return { month, year };
48
- });
49
- };
50
- const handlePrevYear = () => {
51
- setView((prev) => ({ ...prev, year: prev.year - 1 }));
52
- };
53
- const handleNextYear = () => {
54
- setView((prev) => ({ ...prev, year: prev.year + 1 }));
55
- };
56
- const handleSelectDay = (day, month, year) => {
57
- const targetMonth = month !== undefined ? month : view.month;
58
- const targetYear = year !== undefined ? year : view.year;
59
- const date = dayjs().year(targetYear).month(targetMonth).date(day);
60
- onChange?.(createDateAtMidnight(date));
61
- // Si el día es de otro mes, cambiar la vista
62
- if (month !== undefined && month !== view.month) {
63
- setView({ month: targetMonth, year: targetYear });
64
- }
65
- else if (year !== undefined && year !== view.year) {
66
- setView({ month: targetMonth, year: targetYear });
67
- }
68
- };
69
- const firstDayOfMonth = dayjs().year(view.year).month(view.month).date(1);
70
- const firstWeekday = firstDayOfMonth.day(); // 0-6, Sunday=0
71
- const daysInMonth = getDaysInMonth(view.year, view.month);
72
- const weekdayLabels = getWeekdayLabels(startWeekOn);
73
- const offset = startWeekOn === "sunday"
74
- ? firstWeekday
75
- : firstWeekday === 0
76
- ? 6
77
- : firstWeekday - 1;
78
- // Calcular días del mes anterior y siguiente
79
- const prevMonth = view.month === 0 ? 11 : view.month - 1;
80
- const prevYear = view.month === 0 ? view.year - 1 : view.year;
81
- const daysInPrevMonth = getDaysInMonth(prevYear, prevMonth);
82
- const nextMonth = view.month === 11 ? 0 : view.month + 1;
83
- const nextYear = view.month === 11 ? view.year + 1 : view.year;
84
- const weeks = [];
85
- // Construir todas las semanas (6 semanas = 42 días)
86
- let dayCounter = 1 - offset; // Puede ser negativo para días del mes anterior
87
- for (let week = 0; week < 6; week++) {
88
- const currentWeek = [];
89
- for (let dayOfWeek = 0; dayOfWeek < 7; dayOfWeek++) {
90
- if (dayCounter < 1) {
91
- // Día del mes anterior
92
- const day = daysInPrevMonth + dayCounter;
93
- currentWeek.push({ day, month: prevMonth, year: prevYear });
94
- }
95
- else if (dayCounter > daysInMonth) {
96
- // Día del mes siguiente
97
- const day = dayCounter - daysInMonth;
98
- currentWeek.push({ day, month: nextMonth, year: nextYear });
99
- }
100
- else {
101
- // Día del mes actual
102
- currentWeek.push({
103
- day: dayCounter,
104
- month: view.month,
105
- year: view.year,
106
- });
107
- }
108
- dayCounter++;
109
- }
110
- weeks.push(currentWeek);
111
- }
112
- const selectedDate = value && value.isValid() ? createDateAtMidnight(value) : null;
113
- const monthName = dayjs()
114
- .year(view.year)
115
- .month(view.month)
116
- .date(1)
117
- .format("MMMM");
118
- return (_jsxs("div", { className: `inline-flex flex-col rounded-lg border border-[var(--color-border-default)]
119
- bg-[var(--color-bg-default)] p-3 shadow-sm font-[var(--font-default)] text-sm ${className}`, children: [_jsxs("div", { className: "flex items-center justify-between mb-2", children: [_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Button, { type: "button", size: "sm", variant: "ghost", icon: "fa-angle-double-left", onClick: handlePrevYear, "aria-label": "A\u00F1o anterior" }), _jsx(Button, { type: "button", size: "sm", variant: "ghost", icon: "fa-angle-left", onClick: handlePrevMonth, "aria-label": "Mes anterior" })] }), _jsx("div", { className: "text-center", children: _jsxs("div", { className: "text-[var(--color-text-primary)] font-medium capitalize", children: [monthName, " ", view.year] }) }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Button, { type: "button", size: "sm", variant: "ghost", icon: "fa-angle-right", onClick: handleNextMonth, "aria-label": "Mes siguiente" }), _jsx(Button, { type: "button", size: "sm", variant: "ghost", icon: "fa-angle-double-right", onClick: handleNextYear, "aria-label": "A\u00F1o siguiente" })] })] }), _jsx("div", { className: "grid grid-cols-7 gap-1 mb-1", children: weekdayLabels.map((label) => (_jsx("div", { className: "text-xs text-center text-[var(--color-text-secondary)]", children: label }, label))) }), _jsx("div", { className: "grid grid-rows-6 gap-1", children: weeks.map((week, rowIndex) => (_jsx("div", { className: "grid grid-cols-7 gap-1", children: week.map((dayInfo, index) => {
120
- const { day, month, year } = dayInfo;
121
- const isCurrentMonth = month === view.month && year === view.year;
122
- const date = dayjs().year(year).month(month).date(day);
123
- const isToday = isSameDay(date, today);
124
- const isSelected = selectedDate !== null && isSameDay(date, selectedDate);
125
- let dayClasses = "w-8 h-8 flex items-center justify-center rounded-full cursor-pointer text-xs";
126
- if (isSelected) {
127
- dayClasses +=
128
- " bg-[var(--color-primary)] text-[var(--color-primary-contrast)]";
129
- }
130
- else if (isToday) {
131
- dayClasses +=
132
- " border border-[var(--color-primary)] text-[var(--color-primary)]";
133
- }
134
- else if (isCurrentMonth) {
135
- dayClasses +=
136
- " text-[var(--color-text-primary)] hover:bg-[var(--color-bg-secondary)]";
137
- }
138
- else {
139
- dayClasses +=
140
- " text-[var(--color-text-muted)] opacity-50 hover:bg-[var(--color-bg-secondary)] hover:opacity-75";
141
- }
142
- return (_jsx("button", { type: "button", className: dayClasses, onClick: () => handleSelectDay(day, month, year), children: day }, index));
143
- }) }, rowIndex))) })] }));
144
- };
@@ -1,35 +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
- export const Input = React.forwardRef(({ label, error, icon, iconPosition = "left", size = "md", className = "", id, onIconClick, readOnly = false, ...props }, ref) => {
5
- const inputId = id || `input-${Math.random().toString(36).substr(2, 9)}`;
6
- const baseClasses = `
7
- w-full border rounded-lg transition-colors focus:outline-none
8
- disabled:opacity-50 disabled:cursor-not-allowed
9
- font-[var(--font-default)] text-[var(--color-text-primary)]
10
- flysoft-input-reset box-border
11
- `;
12
- const readOnlyClasses = readOnly
13
- ? `border-transparent bg-transparent focus:ring-0`
14
- : `focus:ring-1 bg-[var(--color-bg-default)]`;
15
- const sizeClasses = {
16
- sm: `${readOnly ? "p-0" : "px-3 py-1.5"} text-sm`,
17
- md: `${readOnly ? "p-0" : "px-4 py-2"} text-base`,
18
- lg: `${readOnly ? "p-0" : "px-6 py-3"} text-lg`,
19
- };
20
- const stateClasses = readOnly
21
- ? ""
22
- : error
23
- ? `border-[var(--color-border-error)] focus:border-[var(--color-border-error)] focus:ring-[var(--color-border-error)]`
24
- : `border-[var(--color-border-default)] focus:border-[var(--color-border-focus)] focus:ring-[var(--color-border-focus)]`;
25
- const inputClasses = `${baseClasses} ${readOnlyClasses} ${sizeClasses[size]} ${stateClasses} ${className}`;
26
- const iconClasses = size === "sm" ? "w-4 h-4" : size === "md" ? "w-5 h-5" : "w-6 h-6";
27
- const renderIcon = () => {
28
- if (!icon || readOnly)
29
- return null;
30
- const iconElement = (_jsx("i", { className: `${normalizeIconClass(icon)} ${iconClasses} text-[var(--color-text-muted)] absolute top-1/2 transform -translate-y-1/2 ${iconPosition === "left" ? "left-3" : "right-3"} ${onIconClick && !readOnly ? "cursor-pointer hover:text-[var(--color-primary)] transition-colors" : ""}`, onClick: readOnly ? undefined : onIconClick }));
31
- return iconElement;
32
- };
33
- return (_jsxs("div", { className: "w-full", children: [label && (_jsx("label", { htmlFor: inputId, className: "block text-sm text-[var(--color-primary)] mb-1 font-[var(--font-default)]", children: label })), _jsxs("div", { className: "relative", children: [icon && iconPosition === "left" && renderIcon(), _jsx("input", { ref: ref, id: inputId, className: `${inputClasses} ${icon && iconPosition === "left" && !readOnly ? "pl-10" : ""} ${icon && iconPosition === "right" && !readOnly ? "pr-10" : ""}`, autoComplete: "off", readOnly: readOnly, ...props }), icon && iconPosition === "right" && renderIcon()] }), error && (_jsx("p", { className: "mt-1 text-sm text-[var(--color-danger)] font-[var(--font-default)]", children: error }))] }));
34
- });
35
- Input.displayName = "Input";
@@ -1,248 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React from "react";
3
- import { Link } from "react-router-dom";
4
- import { normalizeIconClass } from "../utils/iconUtils";
5
- // Función helper para convertir nombres de colores comunes a valores CSS válidos
6
- const getColorValue = (color) => {
7
- if (!color)
8
- return undefined;
9
- // Si ya es un valor CSS válido (hex, rgb, rgba, hsl, etc.), retornarlo
10
- if (color.startsWith("#") ||
11
- color.startsWith("rgb") ||
12
- color.startsWith("hsl")) {
13
- return color;
14
- }
15
- // Mapeo de nombres de colores comunes
16
- const colorMap = {
17
- white: "#ffffff",
18
- black: "#000000",
19
- "gray-800": "#1f2937",
20
- "gray-700": "#374151",
21
- "gray-600": "#4b5563",
22
- "gray-500": "#6b7280",
23
- "gray-400": "#9ca3af",
24
- "gray-300": "#d1d5db",
25
- "gray-200": "#e5e7eb",
26
- "gray-100": "#f3f4f6",
27
- "gray-50": "#f9fafb",
28
- };
29
- return colorMap[color.toLowerCase()] || color;
30
- };
31
- export const LinkButton = ({ to, target, variant = "primary", size = "md", color = "primary", bg, textColor, icon, iconPosition = "left", children, className = "", onClick, ...props }) => {
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 no-underline outline-none focus:outline-none
36
- focus-visible:outline-none active:outline-none focus:ring-0 focus:ring-offset-0
37
- font-[var(--font-default)]
38
- `;
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)]
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)]
53
- `;
54
- }
55
- else {
56
- return `
57
- text-[var(--color-primary)] hover:bg-[var(--color-bg-secondary)]
58
- `;
59
- }
60
- }
61
- // Para otros colores, retornar clases base sin color (se aplicarán con estilos inline)
62
- if (variantType === "primary") {
63
- return ``;
64
- }
65
- else if (variantType === "outline") {
66
- return `border hover:bg-[var(--color-bg-secondary)]`;
67
- }
68
- else {
69
- return `hover:bg-[var(--color-bg-secondary)]`;
70
- }
71
- };
72
- // Si se proporciona bg personalizado, no usar las clases de variante
73
- const variantClasses = bg ? "" : getVariantClasses(variant, color);
74
- // Determinar si necesitamos usar estilos inline para colores del sistema
75
- const needsInlineStyles = !bg && color !== "primary";
76
- const sizeClasses = {
77
- sm: `${children ? "px-3 py-1.5" : "p-1.5"} text-sm`,
78
- md: `${children ? "px-4 py-2" : "p-2"} text-base`,
79
- lg: `${children ? "px-6 py-3" : "p-3"} text-lg`,
80
- };
81
- // Clases adicionales para variant outline cuando hay bg personalizado
82
- const outlineClasses = bg && variant === "outline" ? "border" : "";
83
- const classes = `${baseClasses} ${variantClasses} ${sizeClasses[size]} ${outlineClasses} ${className}`;
84
- // Función para obtener el valor de una variable CSS
85
- const getCSSVariable = (varName) => {
86
- if (typeof window !== "undefined") {
87
- const value = getComputedStyle(document.documentElement)
88
- .getPropertyValue(varName)
89
- .trim();
90
- // Si no se encuentra la variable, intentar con el prefijo flysoft
91
- if (!value && varName.startsWith("--color-")) {
92
- const flysoftVarName = varName.replace("--color-", "--flysoft-");
93
- return (getComputedStyle(document.documentElement)
94
- .getPropertyValue(flysoftVarName)
95
- .trim() || value);
96
- }
97
- return value;
98
- }
99
- return "";
100
- };
101
- // Estilos inline para colores personalizados o colores del sistema (no primary)
102
- const inlineStyles = bg
103
- ? {
104
- backgroundColor: variant === "primary" ? getColorValue(bg) || bg : undefined,
105
- color: getColorValue(textColor) ||
106
- textColor ||
107
- (variant === "primary" ? "#ffffff" : getColorValue(bg) || bg),
108
- borderColor: variant === "outline" ? getColorValue(bg) || bg : undefined,
109
- ...(variant === "ghost" && {
110
- color: getColorValue(textColor) || textColor || getColorValue(bg) || bg,
111
- }),
112
- }
113
- : needsInlineStyles
114
- ? {
115
- ...(variant === "primary" && {
116
- backgroundColor: getCSSVariable(`--color-${color}`),
117
- color: getCSSVariable(`--color-${color}-contrast`) || "#ffffff",
118
- }),
119
- ...(variant === "outline" && {
120
- borderColor: getCSSVariable(`--color-${color}`),
121
- color: getCSSVariable(`--color-${color}`),
122
- }),
123
- ...(variant === "ghost" && {
124
- color: getCSSVariable(`--color-${color}`),
125
- }),
126
- }
127
- : {};
128
- // Función para oscurecer un color (para hover en variant primary con bg personalizado)
129
- const darkenColor = (color, percent) => {
130
- const hex = color.replace("#", "");
131
- const num = parseInt(hex, 16);
132
- const r = Math.max(0, Math.floor((num >> 16) * (1 - percent / 100)));
133
- const g = Math.max(0, Math.floor(((num >> 8) & 0x00ff) * (1 - percent / 100)));
134
- const b = Math.max(0, Math.floor((num & 0x0000ff) * (1 - percent / 100)));
135
- return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, "0")}`;
136
- };
137
- const renderIcon = () => {
138
- if (!icon)
139
- return null;
140
- const iconClasses = size === "sm" ? "w-4 h-4" : size === "md" ? "w-5 h-5" : "w-6 h-6";
141
- return (_jsx("i", { className: `${normalizeIconClass(icon)} ${iconClasses} ${children ? (iconPosition === "right" ? "ml-2" : "mr-2") : ""} mt-0.5` }));
142
- };
143
- // Determinar el color del ripple basado en el variant y si hay bg personalizado
144
- const rippleColor = bg
145
- ? variant === "primary"
146
- ? "rgba(255, 255, 255, 0.45)"
147
- : "rgba(0, 0, 0, 0.15)"
148
- : variant === "primary"
149
- ? "rgba(255, 255, 255, 0.45)"
150
- : "rgba(0, 0, 0, 0.15)";
151
- const handleClick = (event) => {
152
- const targetElement = event.currentTarget;
153
- if (targetElement) {
154
- const rect = targetElement.getBoundingClientRect();
155
- const size = Math.max(rect.width, rect.height) * 1.2;
156
- const x = event.clientX - rect.left;
157
- const y = event.clientY - rect.top;
158
- const id = window.performance.now();
159
- const newRipple = { id, x, y, size };
160
- setRipples((prev) => [...prev, newRipple]);
161
- window.setTimeout(() => {
162
- setRipples((prev) => prev.filter((ripple) => ripple.id !== id));
163
- }, 600);
164
- }
165
- onClick?.(event);
166
- };
167
- // Determinar si es una ruta externa (http/https) o interna
168
- const isExternal = to.startsWith("http://") || to.startsWith("https://") || to.startsWith("mailto:") || to.startsWith("tel:");
169
- // Combinar estilos inline - agregar outline: none para asegurar que no aparezca
170
- const combinedStyles = {
171
- ...inlineStyles,
172
- outline: "none",
173
- outlineWidth: "0",
174
- outlineStyle: "none",
175
- outlineOffset: "0",
176
- WebkitTapHighlightColor: "transparent",
177
- boxShadow: "none",
178
- };
179
- const linkProps = {
180
- className: classes,
181
- style: combinedStyles,
182
- onClick: handleClick,
183
- onFocus: (e) => {
184
- e.currentTarget.style.outline = "none";
185
- e.currentTarget.style.outlineWidth = "0";
186
- e.currentTarget.style.outlineStyle = "none";
187
- e.currentTarget.style.outlineOffset = "0";
188
- e.currentTarget.style.boxShadow = "none";
189
- },
190
- onBlur: (e) => {
191
- e.currentTarget.style.outline = "none";
192
- e.currentTarget.style.outlineWidth = "0";
193
- e.currentTarget.style.outlineStyle = "none";
194
- e.currentTarget.style.outlineOffset = "0";
195
- e.currentTarget.style.boxShadow = "none";
196
- },
197
- onKeyDown: (e) => {
198
- // Eliminar outline cuando se presiona cualquier tecla
199
- if (e.key === "Tab" || e.key === "Enter" || e.key === " ") {
200
- e.currentTarget.style.outline = "none";
201
- e.currentTarget.style.outlineWidth = "0";
202
- e.currentTarget.style.outlineStyle = "none";
203
- e.currentTarget.style.outlineOffset = "0";
204
- e.currentTarget.style.boxShadow = "none";
205
- }
206
- },
207
- onMouseEnter: (e) => {
208
- if (variant === "primary") {
209
- if (bg) {
210
- const hoverBg = darkenColor(getColorValue(bg) || bg, 15);
211
- e.currentTarget.style.backgroundColor = hoverBg;
212
- }
213
- else if (needsInlineStyles) {
214
- const hoverBg = getCSSVariable(`--color-${color}-dark`);
215
- e.currentTarget.style.backgroundColor = hoverBg;
216
- }
217
- }
218
- },
219
- onMouseLeave: (e) => {
220
- if (variant === "primary") {
221
- if (bg) {
222
- e.currentTarget.style.backgroundColor = getColorValue(bg) || bg;
223
- }
224
- else if (needsInlineStyles) {
225
- e.currentTarget.style.backgroundColor = getCSSVariable(`--color-${color}`);
226
- }
227
- }
228
- },
229
- ...props,
230
- };
231
- if (isExternal) {
232
- const externalTarget = target || "_blank";
233
- return (_jsxs("a", { href: to, target: externalTarget, rel: externalTarget === "_blank" ? "noopener noreferrer" : undefined, ...linkProps, 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: {
234
- top: ripple.y,
235
- left: ripple.x,
236
- width: ripple.size,
237
- height: ripple.size,
238
- backgroundColor: rippleColor,
239
- } }, ripple.id))) }), _jsxs("span", { className: "relative inline-flex items-center justify-center", children: [icon && iconPosition === "left" && renderIcon(), children, icon && iconPosition === "right" && renderIcon()] })] }));
240
- }
241
- return (_jsxs(Link, { to: to, ...linkProps, 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: {
242
- top: ripple.y,
243
- left: ripple.x,
244
- width: ripple.size,
245
- height: ripple.size,
246
- backgroundColor: rippleColor,
247
- } }, ripple.id))) }), _jsxs("span", { className: "relative inline-flex items-center justify-center", children: [icon && iconPosition === "left" && renderIcon(), children, icon && iconPosition === "right" && renderIcon()] })] }));
248
- };
@@ -1,23 +0,0 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React from "react";
3
- import { useSearchParams } from "react-router-dom";
4
- import { Button } from "./Button";
5
- export const Pagination = ({ fieldName = "pagina", page = 1, pages = 1, total = 0, isLoading = false, }) => {
6
- const [searchParams, setSearchParams] = useSearchParams();
7
- const navigateToPage = (newPage) => {
8
- if (newPage < 1 || newPage > pages || newPage === page) {
9
- return;
10
- }
11
- const newSearchParams = new URLSearchParams(searchParams);
12
- newSearchParams.set(fieldName, newPage.toString());
13
- setSearchParams(newSearchParams, { replace: true });
14
- };
15
- const goToFirstPage = () => navigateToPage(1);
16
- const goToPreviousPage = () => navigateToPage(page - 1);
17
- const goToNextPage = () => navigateToPage(page + 1);
18
- const goToLastPage = () => navigateToPage(pages);
19
- const isFirstPage = page <= 1;
20
- const isLastPage = page >= pages;
21
- const hasPages = pages > 1;
22
- return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { children: _jsx(Button, { variant: "ghost", size: "sm", icon: "fa-angle-double-left", onClick: goToFirstPage, disabled: isFirstPage || !hasPages || isLoading, "aria-label": "Primera p\u00E1gina" }) }), _jsx("div", { children: _jsx(Button, { variant: "ghost", size: "sm", icon: "fa-angle-left", onClick: goToPreviousPage, disabled: isFirstPage || !hasPages || isLoading, "aria-label": "P\u00E1gina anterior" }) }), _jsx("div", { className: `text-xs h-[32px] min-w-[100px] text-center flex flex-col justify-center`, children: isLoading ? (_jsx(_Fragment, { children: _jsx("span", { className: "block", children: "Cargando..." }) })) : (_jsxs(_Fragment, { children: [_jsxs("span", { className: "block", children: ["P\u00E1gina ", page, " de ", pages] }), _jsxs("span", { className: "block", children: [total, " elemento", total !== 1 ? "s" : ""] })] })) }), _jsx("div", { children: _jsx(Button, { variant: "ghost", size: "sm", icon: "fa-angle-right", onClick: goToNextPage, disabled: isLastPage || !hasPages || isLoading, "aria-label": "P\u00E1gina siguiente" }) }), _jsx("div", { children: _jsx(Button, { variant: "ghost", size: "sm", icon: "fa-angle-double-right", onClick: goToLastPage, disabled: isLastPage || !hasPages || isLoading, "aria-label": "\u00DAltima p\u00E1gina" }) })] }));
23
- };