flysoft-react-ui 0.5.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/dist/App.d.ts.map +1 -1
  2. package/dist/App.js +5 -6
  3. package/dist/components/form-controls/AutocompleteInput.d.ts.map +1 -1
  4. package/dist/components/form-controls/AutocompleteInput.js +177 -131
  5. package/dist/components/form-controls/Button.d.ts +3 -0
  6. package/dist/components/form-controls/Button.d.ts.map +1 -1
  7. package/dist/components/form-controls/Button.js +160 -19
  8. package/dist/components/form-controls/Checkbox.d.ts.map +1 -1
  9. package/dist/components/form-controls/Checkbox.js +3 -1
  10. package/dist/components/form-controls/DateInput.d.ts +5 -1
  11. package/dist/components/form-controls/DateInput.d.ts.map +1 -1
  12. package/dist/components/form-controls/DateInput.js +94 -27
  13. package/dist/components/form-controls/Input.d.ts.map +1 -1
  14. package/dist/components/form-controls/Input.js +2 -1
  15. package/dist/components/form-controls/LinkButton.d.ts +15 -0
  16. package/dist/components/form-controls/LinkButton.d.ts.map +1 -0
  17. package/dist/components/form-controls/LinkButton.js +248 -0
  18. package/dist/components/form-controls/SearchSelectInput-OLD.d.ts.map +1 -1
  19. package/dist/components/form-controls/SearchSelectInput-OLD.js +5 -4
  20. package/dist/components/form-controls/SearchSelectInput.d.ts.map +1 -1
  21. package/dist/components/form-controls/SearchSelectInput.js +3 -2
  22. package/dist/components/form-controls/index.d.ts +2 -0
  23. package/dist/components/form-controls/index.d.ts.map +1 -1
  24. package/dist/components/form-controls/index.js +1 -0
  25. package/dist/components/layout/Accordion.d.ts +13 -0
  26. package/dist/components/layout/Accordion.d.ts.map +1 -0
  27. package/dist/components/layout/Accordion.js +67 -0
  28. package/dist/components/layout/AppLayout.d.ts.map +1 -1
  29. package/dist/components/layout/AppLayout.js +7 -7
  30. package/dist/components/layout/Card.d.ts +8 -3
  31. package/dist/components/layout/Card.d.ts.map +1 -1
  32. package/dist/components/layout/Card.js +21 -22
  33. package/dist/components/layout/DataTable.js +1 -1
  34. package/dist/components/layout/DropdownMenu.d.ts.map +1 -0
  35. package/dist/components/{utils → layout}/DropdownMenu.js +12 -6
  36. package/dist/components/layout/DropdownPanel.d.ts +7 -0
  37. package/dist/components/layout/DropdownPanel.d.ts.map +1 -0
  38. package/dist/components/layout/DropdownPanel.js +137 -0
  39. package/dist/components/{utils → layout}/Filter.d.ts +5 -0
  40. package/dist/components/layout/Filter.d.ts.map +1 -0
  41. package/dist/components/{utils → layout}/Filter.js +18 -9
  42. package/dist/components/layout/Menu.d.ts +31 -0
  43. package/dist/components/layout/Menu.d.ts.map +1 -0
  44. package/dist/components/layout/Menu.js +21 -0
  45. package/dist/components/layout/index.d.ts +10 -0
  46. package/dist/components/layout/index.d.ts.map +1 -1
  47. package/dist/components/layout/index.js +5 -0
  48. package/dist/components/utils/Badge.d.ts.map +1 -1
  49. package/dist/components/utils/Badge.js +3 -2
  50. package/dist/components/utils/Dialog.d.ts +2 -2
  51. package/dist/components/utils/Dialog.d.ts.map +1 -1
  52. package/dist/components/utils/Dialog.js +4 -3
  53. package/dist/components/utils/FiltersDialog.d.ts +1 -1
  54. package/dist/components/utils/FiltersDialog.d.ts.map +1 -1
  55. package/dist/components/utils/FiltersDialog.js +2 -2
  56. package/dist/components/utils/Loader.js +1 -1
  57. package/dist/components/utils/RoadMap.d.ts.map +1 -1
  58. package/dist/components/utils/RoadMap.js +2 -1
  59. package/dist/components/utils/Snackbar.d.ts.map +1 -1
  60. package/dist/components/utils/Snackbar.js +2 -1
  61. package/dist/components/utils/iconUtils.d.ts +16 -0
  62. package/dist/components/utils/iconUtils.d.ts.map +1 -0
  63. package/dist/components/utils/iconUtils.js +40 -0
  64. package/dist/components/utils/index.d.ts +0 -2
  65. package/dist/components/utils/index.d.ts.map +1 -1
  66. package/dist/components/utils/index.js +0 -1
  67. package/dist/contexts/CrudContext.d.ts +62 -0
  68. package/dist/contexts/CrudContext.d.ts.map +1 -0
  69. package/dist/contexts/CrudContext.js +333 -0
  70. package/dist/contexts/index.d.ts +2 -2
  71. package/dist/contexts/index.d.ts.map +1 -1
  72. package/dist/contexts/index.js +2 -2
  73. package/dist/docs/AccordionDocs.d.ts +4 -0
  74. package/dist/docs/AccordionDocs.d.ts.map +1 -0
  75. package/dist/docs/AccordionDocs.js +21 -0
  76. package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +3 -5
  77. package/dist/docs/AutocompleteInputDocs.js +1 -1
  78. package/dist/docs/ButtonDocs.d.ts.map +1 -1
  79. package/dist/docs/ButtonDocs.js +1 -1
  80. package/dist/docs/CardDocs.d.ts.map +1 -1
  81. package/dist/docs/CardDocs.js +17 -8
  82. package/dist/docs/DataTableDocs.js +3 -3
  83. package/dist/docs/DialogDocs.d.ts.map +1 -1
  84. package/dist/docs/DialogDocs.js +1 -1
  85. package/dist/docs/DocAdmin.js +1 -1
  86. package/dist/docs/DocsMenu.d.ts.map +1 -1
  87. package/dist/docs/DocsMenu.js +3 -3
  88. package/dist/docs/DocsRouter.d.ts.map +1 -1
  89. package/dist/docs/DocsRouter.js +5 -1
  90. package/dist/docs/DropdownMenuDocs.js +1 -1
  91. package/dist/docs/DropdownPanelDocs.d.ts +4 -0
  92. package/dist/docs/DropdownPanelDocs.d.ts.map +1 -0
  93. package/dist/docs/DropdownPanelDocs.js +7 -0
  94. package/dist/docs/FilterDocs.d.ts.map +1 -1
  95. package/dist/docs/FilterDocs.js +19 -1
  96. package/dist/docs/LinkButtonDocs.d.ts +4 -0
  97. package/dist/docs/LinkButtonDocs.d.ts.map +1 -0
  98. package/dist/docs/LinkButtonDocs.js +7 -0
  99. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +0 -9
  100. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +1 -1
  101. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +32 -16
  102. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts +2 -0
  103. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts.map +1 -0
  104. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.js +34 -0
  105. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts +2 -0
  106. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts.map +1 -0
  107. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.js +66 -0
  108. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts +2 -0
  109. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +1 -0
  110. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +7 -0
  111. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts +10 -0
  112. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts.map +1 -0
  113. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.js +39 -0
  114. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +1 -1
  115. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +33 -27
  116. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts +9 -0
  117. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +1 -0
  118. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +30 -0
  119. package/dist/docs/MenuDocs.d.ts +4 -0
  120. package/dist/docs/MenuDocs.d.ts.map +1 -0
  121. package/dist/docs/MenuDocs.js +26 -0
  122. package/dist/docs/SearchSelectInputDocs.js +1 -1
  123. package/dist/docs/docMockServices/empresaService.d.ts +5 -5
  124. package/dist/docs/docMockServices/empresaService.d.ts.map +1 -1
  125. package/dist/docs/docMockServices/empresaService.js +20 -11
  126. package/dist/docs/docMockServices/interfaces.d.ts +12 -0
  127. package/dist/docs/docMockServices/interfaces.d.ts.map +1 -1
  128. package/dist/docs/docMockServices/personaEmpresaService.d.ts +6 -6
  129. package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +1 -1
  130. package/dist/docs/docMockServices/personaEmpresaService.js +52 -14
  131. package/dist/docs/docMockServices/personaService.d.ts +2 -2
  132. package/dist/docs/docMockServices/personaService.d.ts.map +1 -1
  133. package/dist/docs/docMockServices/personaService.js +17 -7
  134. package/dist/index.css +1 -1
  135. package/dist/index.d.ts +12 -4
  136. package/dist/index.d.ts.map +1 -1
  137. package/dist/index.js +6 -2
  138. package/dist/index.js.map +1 -1
  139. package/dist/templates/forms/ContactForm.js +2 -2
  140. package/dist/templates/forms/LoginForm.js +1 -1
  141. package/dist/templates/forms/RegistrationForm.js +1 -1
  142. package/dist/templates/layouts/SidebarLayout.d.ts.map +1 -1
  143. package/dist/templates/layouts/SidebarLayout.js +3 -2
  144. package/dist/templates/patterns/FormPattern.d.ts.map +1 -1
  145. package/dist/templates/patterns/FormPattern.js +4 -3
  146. package/package.json +4 -3
  147. package/dist/components/utils/DropdownMenu.d.ts.map +0 -1
  148. package/dist/components/utils/Filter.d.ts.map +0 -1
  149. package/dist/contexts/ListCrudContext.d.ts +0 -29
  150. package/dist/contexts/ListCrudContext.d.ts.map +0 -1
  151. package/dist/contexts/ListCrudContext.js +0 -209
  152. /package/dist/components/{utils → layout}/DropdownMenu.d.ts +0 -0
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from "react";
3
+ import { normalizeIconClass } from "./iconUtils";
3
4
  /**
4
5
  * Helper function to convert color names to CSS values
5
6
  */
@@ -127,7 +128,7 @@ export const RoadMap = ({ stages, className = "", }) => {
127
128
  `, style: {
128
129
  backgroundColor: bgColor,
129
130
  color: "#ffffff",
130
- }, children: stage.icon ? (_jsx("i", { className: `fa ${stage.icon} text-xs` })) : null }), !isLast && (_jsx("div", { className: "w-0.5 h-4 flex-shrink-0", style: {
131
+ }, children: stage.icon ? (_jsx("i", { className: `${normalizeIconClass(stage.icon)} text-xs` })) : null }), !isLast && (_jsx("div", { className: "w-0.5 h-4 flex-shrink-0", style: {
131
132
  background: connectorGradient || undefined,
132
133
  } }))] }), _jsxs("div", { className: `
133
134
  flex-1
@@ -1 +1 @@
1
- {"version":3,"file":"Snackbar.d.ts","sourceRoot":"","sources":["../../../src/components/utils/Snackbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEtE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAqM5C,CAAC"}
1
+ {"version":3,"file":"Snackbar.d.ts","sourceRoot":"","sources":["../../../src/components/utils/Snackbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGtE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAqM5C,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React, { useEffect, useState, useRef, useCallback } from "react";
3
+ import { normalizeIconClass } from "./iconUtils";
3
4
  export const Snackbar = ({ id, message, variant, duration = 3000, icon, iconLabel, onClose, }) => {
4
5
  const [progress, setProgress] = useState(100);
5
6
  const [isClosing, setIsClosing] = useState(false);
@@ -117,5 +118,5 @@ export const Snackbar = ({ id, message, variant, duration = 3000, icon, iconLabe
117
118
  `, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, role: "alert", "aria-live": "polite", children: _jsxs("div", { className: `${config.bg} ${config.text} p-4 flex items-start gap-3 relative`, children: [duration > 0 && (_jsx("div", { className: "absolute bottom-0 left-0 right-0 h-[3px] overflow-hidden", children: _jsx("div", { className: "h-full transition-all duration-50 ease-linear", style: {
118
119
  width: `${progress}%`,
119
120
  backgroundColor: "#00000050",
120
- } }) })), displayIcon && (_jsx("div", { className: "flex-shrink-0 -mt-0.5", children: _jsx("i", { className: `fa ${displayIcon} text-base`, "aria-hidden": !iconLabel, "aria-label": iconLabel }) })), _jsx("div", { className: "flex-1 min-w-0", children: _jsx("p", { className: "text-sm font-medium break-words max-w-full", children: message }) }), _jsx("button", { onClick: handleClose, className: "flex-shrink-0 ml-2 text-gray-600 hover:text-gray-800 transition-colors cursor-pointer", "aria-label": "Cerrar notificaci\u00F3n", type: "button", children: _jsx("i", { className: "fa fa-times text-sm" }) })] }) }));
121
+ } }) })), displayIcon && (_jsx("div", { className: "flex-shrink-0 -mt-0.5", children: _jsx("i", { className: `${normalizeIconClass(displayIcon)} text-base`, "aria-hidden": !iconLabel, "aria-label": iconLabel }) })), _jsx("div", { className: "flex-1 min-w-0", children: _jsx("p", { className: "text-sm font-medium break-words max-w-full", children: message }) }), _jsx("button", { onClick: handleClose, className: "flex-shrink-0 ml-2 text-gray-600 hover:text-gray-800 transition-colors cursor-pointer", "aria-label": "Cerrar notificaci\u00F3n", type: "button", children: _jsx("i", { className: `${normalizeIconClass("fa-times")} text-sm` }) })] }) }));
121
122
  };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Normaliza las clases de iconos de FontAwesome para usar el estilo light (fal) por defecto
3
+ *
4
+ * Convierte:
5
+ * - "fa fa-user" -> "fal fa-user"
6
+ * - "fas fa-user" -> "fal fa-user"
7
+ * - "far fa-user" -> "fal fa-user"
8
+ * - "fal fa-user" -> "fal fa-user" (ya es light, se mantiene)
9
+ * - "fa-user" -> "fal fa-user"
10
+ * - "fa-spinner fa-spin" -> "fal fa-spinner fa-spin" (preserva clases adicionales)
11
+ *
12
+ * @param iconClass - La clase del icono a normalizar
13
+ * @returns La clase del icono normalizada con el estilo light (fal)
14
+ */
15
+ export declare function normalizeIconClass(iconClass: string | undefined): string;
16
+ //# sourceMappingURL=iconUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iconUtils.d.ts","sourceRoot":"","sources":["../../../src/components/utils/iconUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CA6BxE"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Normaliza las clases de iconos de FontAwesome para usar el estilo light (fal) por defecto
3
+ *
4
+ * Convierte:
5
+ * - "fa fa-user" -> "fal fa-user"
6
+ * - "fas fa-user" -> "fal fa-user"
7
+ * - "far fa-user" -> "fal fa-user"
8
+ * - "fal fa-user" -> "fal fa-user" (ya es light, se mantiene)
9
+ * - "fa-user" -> "fal fa-user"
10
+ * - "fa-spinner fa-spin" -> "fal fa-spinner fa-spin" (preserva clases adicionales)
11
+ *
12
+ * @param iconClass - La clase del icono a normalizar
13
+ * @returns La clase del icono normalizada con el estilo light (fal)
14
+ */
15
+ export function normalizeIconClass(iconClass) {
16
+ if (!iconClass)
17
+ return "";
18
+ // Dividir las clases por espacios
19
+ const classes = iconClass.trim().split(/\s+/);
20
+ // Buscar y reemplazar el prefijo de estilo
21
+ const stylePrefixes = ["fas", "far", "fal", "fab"];
22
+ let hasStylePrefix = false;
23
+ const normalizedClasses = classes.map((cls) => {
24
+ // Si es un prefijo de estilo, reemplazarlo por "fal"
25
+ if (stylePrefixes.includes(cls)) {
26
+ hasStylePrefix = true;
27
+ return "fal";
28
+ }
29
+ return cls;
30
+ });
31
+ // Si no tenía prefijo de estilo y la primera clase empieza con "fa-", agregar "fal" al inicio
32
+ if (!hasStylePrefix && classes[0]?.startsWith("fa-")) {
33
+ normalizedClasses.unshift("fal");
34
+ }
35
+ // Si no tenía prefijo de estilo y ninguna clase es un prefijo, agregar "fal" al inicio
36
+ else if (!hasStylePrefix && !classes.some(cls => stylePrefixes.includes(cls))) {
37
+ normalizedClasses.unshift("fal");
38
+ }
39
+ return normalizedClasses.join(" ");
40
+ }
@@ -8,8 +8,6 @@ export { Dialog } from "./Dialog";
8
8
  export type { DialogProps } from "./Dialog";
9
9
  export { Loader } from "./Loader";
10
10
  export type { LoaderProps } from "./Loader";
11
- export { Filter } from "./Filter";
12
- export type { FilterProps } from "./Filter";
13
11
  export { FiltersDialog } from "./FiltersDialog";
14
12
  export type { FiltersDialogProps, FilterConfig } from "./FiltersDialog";
15
13
  export { Snackbar } from "./Snackbar";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -3,7 +3,6 @@ export { Avatar } from "./Avatar";
3
3
  export { RoadMap } from "./RoadMap";
4
4
  export { Dialog } from "./Dialog";
5
5
  export { Loader } from "./Loader";
6
- export { Filter } from "./Filter";
7
6
  export { FiltersDialog } from "./FiltersDialog";
8
7
  export { Snackbar } from "./Snackbar";
9
8
  export { SnackbarContainer } from "./SnackbarContainer";
@@ -0,0 +1,62 @@
1
+ import { type ReactNode, type Dispatch, type SetStateAction } from "react";
2
+ import { type PaginationInterface } from "../components/form-controls/Pagination";
3
+ export interface CrudContextType<T> {
4
+ list: Array<T> | undefined;
5
+ item: T | undefined;
6
+ page: number;
7
+ pages: number;
8
+ total: number;
9
+ limit: number;
10
+ isLoading: boolean;
11
+ pagination: ReactNode;
12
+ params: Record<string, any>;
13
+ extraData?: Record<string, any>;
14
+ setExtraData: Dispatch<SetStateAction<Record<string, any> | undefined>>;
15
+ fetchItems: {
16
+ execute: (params?: Record<string, any>) => Promise<void>;
17
+ isLoading: boolean;
18
+ };
19
+ fetchItem: {
20
+ execute: (params?: Record<string, any> | string | number) => Promise<T | undefined>;
21
+ isLoading: boolean;
22
+ };
23
+ createItem: {
24
+ execute: (item: T) => Promise<T | undefined | null>;
25
+ isLoading: boolean;
26
+ };
27
+ updateItem: {
28
+ execute: (item: T) => Promise<T | undefined | null>;
29
+ isLoading: boolean;
30
+ };
31
+ deleteItem: {
32
+ execute: (item: T) => Promise<void>;
33
+ isLoading: boolean;
34
+ };
35
+ }
36
+ export declare const CrudContext: import("react").Context<CrudContextType<any> | undefined>;
37
+ export interface PromiseWithOptions<TResult, TParams extends any[] = []> {
38
+ execute: (...params: TParams) => Promise<TResult>;
39
+ successMessage?: string;
40
+ errorMessage?: string;
41
+ }
42
+ interface CrudProviderProps<T> {
43
+ children: ReactNode;
44
+ getPromise?: ((params?: Record<string, any>) => Promise<Array<T> | PaginationInterface<T> | undefined>) | PromiseWithOptions<Array<T> | PaginationInterface<T> | undefined, [
45
+ params?: Record<string, any>
46
+ ]>;
47
+ getItemPromise?: ((params?: Record<string, any> | string | number) => Promise<T | undefined>) | PromiseWithOptions<T | undefined, [
48
+ params?: Record<string, any> | string | number
49
+ ]>;
50
+ postPromise?: ((item: T) => Promise<T | undefined | null>) | PromiseWithOptions<T | undefined | null, [item: T]>;
51
+ putPromise?: ((item: T) => Promise<T | undefined | null>) | PromiseWithOptions<T | undefined | null, [item: T]>;
52
+ deletePromise?: ((item: T) => Promise<void>) | PromiseWithOptions<void, [item: T]>;
53
+ urlParams?: Array<string>;
54
+ limit?: number;
55
+ pageParam?: string;
56
+ singleItemId?: string | number;
57
+ extraData?: Record<string, any>;
58
+ }
59
+ export declare function CrudProvider<T>({ children, getPromise, getItemPromise, postPromise, putPromise, deletePromise, limit, pageParam, urlParams, singleItemId, extraData: extraDataProp, }: CrudProviderProps<T>): import("react/jsx-runtime").JSX.Element;
60
+ export declare function useCrud<T>(): CrudContextType<T>;
61
+ export {};
62
+ //# sourceMappingURL=CrudContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrudContext.d.ts","sourceRoot":"","sources":["../../src/contexts/CrudContext.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,333 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useEffect, useMemo, useRef, useState, useCallback, } from "react";
3
+ import { useSearchParams } from "react-router-dom";
4
+ import { Pagination, } from "../components/form-controls/Pagination";
5
+ import { useAsyncRequest } from "../hooks/useAsyncRequest";
6
+ const createCrudContext = () => {
7
+ return createContext(undefined);
8
+ };
9
+ // Crear el contexto con un tipo genérico por defecto
10
+ // Los usuarios pueden crear su propio contexto con su tipo específico
11
+ export const CrudContext = createCrudContext();
12
+ export function CrudProvider({ children, getPromise, getItemPromise, postPromise, putPromise, deletePromise, limit = 15, pageParam = "pagina", urlParams = [], singleItemId, extraData: extraDataProp, }) {
13
+ const [extraData, setExtraData] = useState(extraDataProp);
14
+ const [list, setList] = useState(undefined);
15
+ const [item, setItem] = useState(undefined);
16
+ const [page, setPage] = useState(1);
17
+ const [pages, setPages] = useState(1);
18
+ const [total, setTotal] = useState(0);
19
+ const [searchParams, setSearchParams] = useSearchParams();
20
+ // Extraer funciones execute y opciones de las promises
21
+ const getPromiseExecute = getPromise
22
+ ? typeof getPromise === "function"
23
+ ? getPromise
24
+ : getPromise.execute
25
+ : undefined;
26
+ const getPromiseSuccessMessage = getPromise && typeof getPromise === "object"
27
+ ? getPromise.successMessage
28
+ : undefined;
29
+ const getPromiseErrorMessage = getPromise && typeof getPromise === "object"
30
+ ? getPromise.errorMessage
31
+ : undefined;
32
+ const postPromiseExecute = postPromise
33
+ ? typeof postPromise === "function"
34
+ ? postPromise
35
+ : postPromise.execute
36
+ : undefined;
37
+ const postPromiseSuccessMessage = postPromise && typeof postPromise === "object"
38
+ ? postPromise.successMessage
39
+ : undefined;
40
+ const postPromiseErrorMessage = postPromise && typeof postPromise === "object"
41
+ ? postPromise.errorMessage
42
+ : undefined;
43
+ const putPromiseExecute = putPromise
44
+ ? typeof putPromise === "function"
45
+ ? putPromise
46
+ : putPromise.execute
47
+ : undefined;
48
+ const putPromiseSuccessMessage = putPromise && typeof putPromise === "object"
49
+ ? putPromise.successMessage
50
+ : undefined;
51
+ const putPromiseErrorMessage = putPromise && typeof putPromise === "object"
52
+ ? putPromise.errorMessage
53
+ : undefined;
54
+ const deletePromiseExecute = deletePromise
55
+ ? typeof deletePromise === "function"
56
+ ? deletePromise
57
+ : deletePromise.execute
58
+ : undefined;
59
+ const deletePromiseSuccessMessage = deletePromise && typeof deletePromise === "object"
60
+ ? deletePromise.successMessage
61
+ : undefined;
62
+ const deletePromiseErrorMessage = deletePromise && typeof deletePromise === "object"
63
+ ? deletePromise.errorMessage
64
+ : undefined;
65
+ const getItemPromiseExecute = getItemPromise
66
+ ? typeof getItemPromise === "function"
67
+ ? getItemPromise
68
+ : getItemPromise.execute
69
+ : undefined;
70
+ const getItemPromiseSuccessMessage = getItemPromise && typeof getItemPromise === "object"
71
+ ? getItemPromise.successMessage
72
+ : undefined;
73
+ const getItemPromiseErrorMessage = getItemPromise && typeof getItemPromise === "object"
74
+ ? getItemPromise.errorMessage
75
+ : undefined;
76
+ const getPromiseRef = useRef(getPromiseExecute);
77
+ // Hooks para manejar las peticiones asíncronas con mensajes opcionales
78
+ const fetchDataAsync = useAsyncRequest({
79
+ successMessage: getPromiseSuccessMessage,
80
+ errorMessage: getPromiseErrorMessage,
81
+ });
82
+ const createItemAsync = useAsyncRequest({
83
+ successMessage: postPromiseSuccessMessage,
84
+ errorMessage: postPromiseErrorMessage,
85
+ });
86
+ const updateItemAsync = useAsyncRequest({
87
+ successMessage: putPromiseSuccessMessage,
88
+ errorMessage: putPromiseErrorMessage,
89
+ });
90
+ const deleteItemAsync = useAsyncRequest({
91
+ successMessage: deletePromiseSuccessMessage,
92
+ errorMessage: deletePromiseErrorMessage,
93
+ });
94
+ const fetchItemAsync = useAsyncRequest({
95
+ successMessage: getItemPromiseSuccessMessage,
96
+ errorMessage: getItemPromiseErrorMessage,
97
+ });
98
+ // El isLoading del contexto usa el hook de fetchData
99
+ const isLoading = fetchDataAsync.isLoading;
100
+ // Actualizar la referencia cuando cambie getPromise
101
+ useEffect(() => {
102
+ getPromiseRef.current = getPromiseExecute;
103
+ }, [getPromiseExecute]);
104
+ // Función para obtener los parámetros de la URL
105
+ const getUrlParams = useCallback(() => {
106
+ const params = { limit };
107
+ // Agregar pageParam si existe en la URL
108
+ const pageValue = searchParams.get(pageParam);
109
+ if (pageValue) {
110
+ const parsedPage = parseInt(pageValue, 10);
111
+ if (!isNaN(parsedPage)) {
112
+ params[pageParam] = parsedPage;
113
+ }
114
+ }
115
+ // Agregar urlParams si existen en la URL
116
+ urlParams.forEach((paramName) => {
117
+ const paramValue = searchParams.get(paramName);
118
+ if (paramValue !== null) {
119
+ params[paramName] = paramValue;
120
+ }
121
+ });
122
+ return params;
123
+ }, [searchParams, pageParam, urlParams, limit]);
124
+ // Función para obtener los datos
125
+ const fetchData = useCallback(async (params) => {
126
+ if (!getPromiseExecute) {
127
+ return;
128
+ }
129
+ // Obtener los parámetros que se van a usar
130
+ const requestParams = params || getUrlParams();
131
+ const result = await fetchDataAsync.execute(async () => {
132
+ return await getPromiseRef.current(requestParams);
133
+ });
134
+ // Solo procesar el resultado si no es undefined (undefined significa error)
135
+ if (result !== undefined) {
136
+ if (result && typeof result === "object" && "list" in result) {
137
+ // Es un PaginationInterface
138
+ const { list, page, pages, total } = result;
139
+ setList(list);
140
+ setPage(page);
141
+ setPages(pages);
142
+ setTotal(total);
143
+ }
144
+ else if (Array.isArray(result)) {
145
+ // Es un array simple
146
+ setList(result);
147
+ setPage(1);
148
+ setTotal(result.length);
149
+ setPages(Math.ceil(result.length / limit));
150
+ }
151
+ else {
152
+ // Resultado null
153
+ setList(undefined);
154
+ setPage(1);
155
+ setPages(1);
156
+ setTotal(0);
157
+ }
158
+ }
159
+ }, [getUrlParams, limit, fetchDataAsync, getPromiseExecute]);
160
+ // Ref para almacenar los valores anteriores de urlParams
161
+ const prevUrlParamsValuesRef = useRef({});
162
+ // Memoizar los valores actuales de los urlParams
163
+ const urlParamsValues = useMemo(() => {
164
+ const values = {};
165
+ urlParams.forEach((paramName) => {
166
+ values[paramName] = searchParams.get(paramName);
167
+ });
168
+ return values;
169
+ }, [searchParams, urlParams]);
170
+ // Memoizar los parámetros de URL para evitar re-renders innecesarios
171
+ const urlParamsKey = useMemo(() => urlParams.join(","), [urlParams]);
172
+ // Memoizar solo los parámetros relevantes de la URL (urlParams + pageParam)
173
+ // para que el useEffect solo se ejecute cuando cambien estos parámetros
174
+ const relevantParamsKey = useMemo(() => {
175
+ const relevantParams = {};
176
+ // Agregar pageParam si existe
177
+ const pageValue = searchParams.get(pageParam);
178
+ if (pageValue) {
179
+ relevantParams[pageParam] = pageValue;
180
+ }
181
+ // Agregar urlParams si existen
182
+ urlParams.forEach((paramName) => {
183
+ const paramValue = searchParams.get(paramName);
184
+ if (paramValue !== null) {
185
+ relevantParams[paramName] = paramValue;
186
+ }
187
+ });
188
+ return JSON.stringify(relevantParams);
189
+ }, [searchParams, pageParam, urlParams]);
190
+ // Memoizar los parámetros actuales para exponerlos
191
+ const currentParams = useMemo(() => getUrlParams(),
192
+ // eslint-disable-next-line react-hooks/exhaustive-deps
193
+ [searchParams, pageParam, urlParamsKey, limit, urlParams]);
194
+ // Función para recargar los datos
195
+ const fetchItemsExecute = useCallback(async (params) => {
196
+ await fetchData(params);
197
+ }, [fetchData]);
198
+ // Función para obtener un item individual
199
+ const fetchItemExecute = useCallback(async (params) => {
200
+ if (!getItemPromiseExecute) {
201
+ throw new Error("getItemPromise is not defined. Please provide getItemPromise to CrudProvider.");
202
+ }
203
+ // Si no se pasan parámetros, usar singleItemId si está disponible
204
+ const finalParams = params !== undefined ? params : singleItemId;
205
+ if (finalParams === undefined) {
206
+ throw new Error("No parameters provided and singleItemId is not defined. Please provide parameters or set singleItemId in CrudProvider.");
207
+ }
208
+ const result = await fetchItemAsync.execute(async () => {
209
+ return await getItemPromiseExecute(finalParams);
210
+ });
211
+ if (result !== undefined) {
212
+ setItem(result);
213
+ }
214
+ return result;
215
+ }, [getItemPromiseExecute, fetchItemAsync, singleItemId]);
216
+ // Función para crear un item
217
+ const createItemExecute = useCallback(async (item) => {
218
+ if (!postPromiseExecute) {
219
+ throw new Error("postPromise is not defined. Please provide postPromise to CrudProvider.");
220
+ }
221
+ return await createItemAsync.execute(async () => {
222
+ return await postPromiseExecute(item);
223
+ });
224
+ }, [postPromiseExecute, createItemAsync]);
225
+ // Función para actualizar un item
226
+ const updateItemExecute = useCallback(async (item) => {
227
+ if (!putPromiseExecute) {
228
+ throw new Error("putPromise is not defined. Please provide putPromise to CrudProvider.");
229
+ }
230
+ return await updateItemAsync.execute(async () => {
231
+ return await putPromiseExecute(item);
232
+ });
233
+ }, [putPromiseExecute, updateItemAsync]);
234
+ // Función para eliminar un item
235
+ const deleteItemExecute = useCallback(async (item) => {
236
+ if (!deletePromiseExecute) {
237
+ throw new Error("deletePromise is not defined. Please provide deletePromise to CrudProvider.");
238
+ }
239
+ await deleteItemAsync.execute(async () => {
240
+ await deletePromiseExecute(item);
241
+ });
242
+ }, [deletePromiseExecute, deleteItemAsync]);
243
+ // useEffect para resetear pageParam a 1 cuando cambien los urlParams
244
+ useEffect(() => {
245
+ // Verificar si hay algún urlParam definido
246
+ if (urlParams.length === 0) {
247
+ prevUrlParamsValuesRef.current = {};
248
+ return;
249
+ }
250
+ // Comparar valores actuales con los anteriores
251
+ const prevValues = prevUrlParamsValuesRef.current;
252
+ const hasChanged = urlParams.some((paramName) => prevValues[paramName] !== urlParamsValues[paramName]);
253
+ // Si los urlParams cambiaron, resetear pageParam a 1
254
+ if (hasChanged) {
255
+ const currentPage = searchParams.get(pageParam);
256
+ if (currentPage && currentPage !== "1") {
257
+ const newSearchParams = new URLSearchParams(searchParams);
258
+ newSearchParams.set(pageParam, "1");
259
+ setSearchParams(newSearchParams, { replace: true });
260
+ // No hacer fetchData aquí, se hará cuando cambien los searchParams
261
+ return;
262
+ }
263
+ }
264
+ // Actualizar los valores anteriores
265
+ prevUrlParamsValuesRef.current = { ...urlParamsValues };
266
+ // eslint-disable-next-line react-hooks/exhaustive-deps
267
+ }, [JSON.stringify(urlParamsValues), pageParam, urlParamsKey]);
268
+ // useEffect para ejecutar fetchData cuando cambian los parámetros relevantes o getPromise
269
+ useEffect(() => {
270
+ if (!getPromiseExecute) {
271
+ return;
272
+ }
273
+ const timeoutId = setTimeout(() => {
274
+ fetchData();
275
+ }, 0);
276
+ return () => clearTimeout(timeoutId);
277
+ // eslint-disable-next-line react-hooks/exhaustive-deps
278
+ }, [relevantParamsKey, getPromiseExecute]);
279
+ // useEffect para obtener el item individual cuando cambie singleItemId
280
+ useEffect(() => {
281
+ if (singleItemId !== undefined && getItemPromiseExecute) {
282
+ fetchItemExecute(singleItemId);
283
+ }
284
+ // eslint-disable-next-line react-hooks/exhaustive-deps
285
+ }, [singleItemId]);
286
+ // Sincronizar extraDataProp con el estado local
287
+ useEffect(() => {
288
+ setExtraData(extraDataProp);
289
+ }, [extraDataProp]);
290
+ const value = {
291
+ list,
292
+ item,
293
+ page,
294
+ pages,
295
+ total,
296
+ limit,
297
+ isLoading,
298
+ params: currentParams,
299
+ fetchItems: {
300
+ execute: fetchItemsExecute,
301
+ isLoading: fetchDataAsync.isLoading,
302
+ },
303
+ fetchItem: {
304
+ execute: fetchItemExecute,
305
+ isLoading: fetchItemAsync.isLoading,
306
+ },
307
+ createItem: {
308
+ execute: createItemExecute,
309
+ isLoading: createItemAsync.isLoading,
310
+ },
311
+ updateItem: {
312
+ execute: updateItemExecute,
313
+ isLoading: updateItemAsync.isLoading,
314
+ },
315
+ deleteItem: {
316
+ execute: deleteItemExecute,
317
+ isLoading: deleteItemAsync.isLoading,
318
+ },
319
+ pagination: (_jsx(Pagination, { page: page, pages: pages, total: total, fieldName: pageParam, isLoading: isLoading })),
320
+ extraData,
321
+ setExtraData,
322
+ };
323
+ return _jsx(CrudContext.Provider, { value: value, children: children });
324
+ }
325
+ // Hook to use Crud context
326
+ // eslint-disable-next-line react-refresh/only-export-components
327
+ export function useCrud() {
328
+ const context = useContext(CrudContext);
329
+ if (context === undefined) {
330
+ throw new Error("useCrud must be used within a CrudProvider");
331
+ }
332
+ return context;
333
+ }
@@ -4,8 +4,8 @@ export type { Theme, ThemeContextType, ThemeOverride } from "./types";
4
4
  export { lightTheme, darkTheme, blueTheme, greenTheme, defaultTheme, themes, } from "./presets";
5
5
  export { AuthProvider, AuthContext } from "./AuthContext";
6
6
  export type { AuthContextType, AuthContextUserInterface, AuthTokenInterface, } from "./AuthContext";
7
- export { ListCrudProvider, ListCrudContext, useListCrud } from "./ListCrudContext";
8
- export type { ListCrudContextType } from "./ListCrudContext";
7
+ export { CrudProvider, CrudContext, useCrud } from "./CrudContext";
8
+ export type { CrudContextType } from "./CrudContext";
9
9
  export { AppLayoutProvider, useAppLayout, useAppLayoutContext } from "./AppLayoutContext";
10
10
  export type { AppLayoutContextType, NavbarInterface, LeftDrawerInterface, } from "./AppLayoutContext";
11
11
  export { SnackbarProvider, useSnackbar } from "./SnackbarContext";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contexts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAGnC,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGtE,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,MAAM,GACP,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EACV,eAAe,EACf,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACnF,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contexts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAGnC,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGtE,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,MAAM,GACP,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EACV,eAAe,EACf,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
@@ -5,8 +5,8 @@ export { useThemeOverride, useTemporaryOverride, } from "../hooks/useThemeOverri
5
5
  export { lightTheme, darkTheme, blueTheme, greenTheme, defaultTheme, themes, } from "./presets";
6
6
  // Auth system exports
7
7
  export { AuthProvider, AuthContext } from "./AuthContext";
8
- // ListCrud system exports
9
- export { ListCrudProvider, ListCrudContext, useListCrud } from "./ListCrudContext";
8
+ // Crud system exports
9
+ export { CrudProvider, CrudContext, useCrud } from "./CrudContext";
10
10
  // AppLayout system exports
11
11
  export { AppLayoutProvider, useAppLayout, useAppLayoutContext } from "./AppLayoutContext";
12
12
  // Snackbar system exports
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const AccordionDocs: React.FC;
3
+ export default AccordionDocs;
4
+ //# sourceMappingURL=AccordionDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccordionDocs.d.ts","sourceRoot":"","sources":["../../src/docs/AccordionDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,QAAA,MAAM,aAAa,EAAE,KAAK,CAAC,EAwuB1B,CAAC;AAEF,eAAe,aAAa,CAAC"}