flysoft-react-ui 0.5.0 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/dist/App.d.ts.map +1 -1
  2. package/dist/App.js +19 -7
  3. package/dist/components/form-controls/AutocompleteInput.d.ts +11 -3
  4. package/dist/components/form-controls/AutocompleteInput.d.ts.map +1 -1
  5. package/dist/components/form-controls/AutocompleteInput.js +411 -31
  6. package/dist/components/form-controls/Button.d.ts +3 -0
  7. package/dist/components/form-controls/Button.d.ts.map +1 -1
  8. package/dist/components/form-controls/Button.js +160 -19
  9. package/dist/components/form-controls/Checkbox.d.ts +14 -0
  10. package/dist/components/form-controls/Checkbox.d.ts.map +1 -0
  11. package/dist/components/form-controls/Checkbox.js +79 -0
  12. package/dist/components/form-controls/DateInput.d.ts +24 -4
  13. package/dist/components/form-controls/DateInput.d.ts.map +1 -1
  14. package/dist/components/form-controls/DateInput.js +492 -70
  15. package/dist/components/form-controls/DatePicker.d.ts +4 -3
  16. package/dist/components/form-controls/DatePicker.d.ts.map +1 -1
  17. package/dist/components/form-controls/DatePicker.js +26 -30
  18. package/dist/components/form-controls/Input.d.ts +10 -1
  19. package/dist/components/form-controls/Input.d.ts.map +1 -1
  20. package/dist/components/form-controls/Input.js +17 -10
  21. package/dist/components/form-controls/LinkButton.d.ts +15 -0
  22. package/dist/components/form-controls/LinkButton.d.ts.map +1 -0
  23. package/dist/components/form-controls/LinkButton.js +248 -0
  24. package/dist/components/form-controls/Pagination.d.ts +1 -0
  25. package/dist/components/form-controls/Pagination.d.ts.map +1 -1
  26. package/dist/components/form-controls/Pagination.js +3 -40
  27. package/dist/components/form-controls/RadioButtonGroup.d.ts +62 -0
  28. package/dist/components/form-controls/RadioButtonGroup.d.ts.map +1 -0
  29. package/dist/components/form-controls/RadioButtonGroup.js +220 -0
  30. package/dist/components/form-controls/SearchSelectInput-OLD.d.ts +68 -0
  31. package/dist/components/form-controls/SearchSelectInput-OLD.d.ts.map +1 -0
  32. package/dist/components/form-controls/SearchSelectInput-OLD.js +963 -0
  33. package/dist/components/form-controls/SearchSelectInput.d.ts +70 -0
  34. package/dist/components/form-controls/SearchSelectInput.d.ts.map +1 -0
  35. package/dist/components/form-controls/SearchSelectInput.js +336 -0
  36. package/dist/components/form-controls/index.d.ts +9 -1
  37. package/dist/components/form-controls/index.d.ts.map +1 -1
  38. package/dist/components/form-controls/index.js +4 -0
  39. package/dist/components/layout/Accordion.d.ts +13 -0
  40. package/dist/components/layout/Accordion.d.ts.map +1 -0
  41. package/dist/components/layout/Accordion.js +67 -0
  42. package/dist/components/layout/AppLayout.d.ts +3 -2
  43. package/dist/components/layout/AppLayout.d.ts.map +1 -1
  44. package/dist/components/layout/AppLayout.js +104 -31
  45. package/dist/components/layout/Card.d.ts +8 -3
  46. package/dist/components/layout/Card.d.ts.map +1 -1
  47. package/dist/components/layout/Card.js +18 -19
  48. package/dist/components/layout/Collection.js +1 -1
  49. package/dist/components/layout/DataTable.d.ts +3 -1
  50. package/dist/components/layout/DataTable.d.ts.map +1 -1
  51. package/dist/components/layout/DataTable.js +34 -29
  52. package/dist/components/layout/index.d.ts +2 -0
  53. package/dist/components/layout/index.d.ts.map +1 -1
  54. package/dist/components/layout/index.js +1 -0
  55. package/dist/components/utils/Avatar.d.ts +49 -0
  56. package/dist/components/utils/Avatar.d.ts.map +1 -0
  57. package/dist/components/utils/Avatar.js +93 -0
  58. package/dist/components/utils/Badge.d.ts +3 -0
  59. package/dist/components/utils/Badge.d.ts.map +1 -1
  60. package/dist/components/utils/Badge.js +131 -26
  61. package/dist/components/utils/Dialog.d.ts.map +1 -1
  62. package/dist/components/utils/Dialog.js +6 -1
  63. package/dist/components/utils/Filter.d.ts +57 -0
  64. package/dist/components/utils/Filter.d.ts.map +1 -0
  65. package/dist/components/utils/Filter.js +581 -0
  66. package/dist/components/utils/FiltersDialog.d.ts +21 -0
  67. package/dist/components/utils/FiltersDialog.d.ts.map +1 -0
  68. package/dist/components/utils/FiltersDialog.js +104 -0
  69. package/dist/components/utils/Loader.js +2 -2
  70. package/dist/components/utils/RoadMap.d.ts +59 -0
  71. package/dist/components/utils/RoadMap.d.ts.map +1 -0
  72. package/dist/components/utils/RoadMap.js +139 -0
  73. package/dist/components/utils/Snackbar.d.ts +13 -0
  74. package/dist/components/utils/Snackbar.d.ts.map +1 -0
  75. package/dist/components/utils/Snackbar.js +122 -0
  76. package/dist/components/utils/SnackbarContainer.d.ts +7 -0
  77. package/dist/components/utils/SnackbarContainer.d.ts.map +1 -0
  78. package/dist/components/utils/SnackbarContainer.js +25 -0
  79. package/dist/components/utils/iconUtils.d.ts +16 -0
  80. package/dist/components/utils/iconUtils.d.ts.map +1 -0
  81. package/dist/components/utils/iconUtils.js +40 -0
  82. package/dist/components/utils/index.d.ts +12 -0
  83. package/dist/components/utils/index.d.ts.map +1 -1
  84. package/dist/components/utils/index.js +6 -0
  85. package/dist/contexts/AppLayoutContext.d.ts +40 -0
  86. package/dist/contexts/AppLayoutContext.d.ts.map +1 -0
  87. package/dist/contexts/AppLayoutContext.js +98 -0
  88. package/dist/contexts/ListCrudContext.d.ts +50 -0
  89. package/dist/contexts/ListCrudContext.d.ts.map +1 -0
  90. package/dist/contexts/ListCrudContext.js +253 -0
  91. package/dist/contexts/SnackbarContext.d.ts +26 -0
  92. package/dist/contexts/SnackbarContext.d.ts.map +1 -0
  93. package/dist/contexts/SnackbarContext.js +34 -0
  94. package/dist/contexts/index.d.ts +6 -0
  95. package/dist/contexts/index.d.ts.map +1 -1
  96. package/dist/contexts/index.js +6 -0
  97. package/dist/contexts/presets.js +6 -6
  98. package/dist/docs/AccordionDocs.d.ts +4 -0
  99. package/dist/docs/AccordionDocs.d.ts.map +1 -0
  100. package/dist/docs/AccordionDocs.js +21 -0
  101. package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +3 -5
  102. package/dist/docs/AutocompleteInputDocs.js +1 -1
  103. package/dist/docs/AvatarDocs.d.ts +4 -0
  104. package/dist/docs/AvatarDocs.d.ts.map +1 -0
  105. package/dist/docs/AvatarDocs.js +7 -0
  106. package/dist/docs/BadgeDocs.d.ts.map +1 -1
  107. package/dist/docs/BadgeDocs.js +4 -2
  108. package/dist/docs/ButtonDocs.d.ts.map +1 -1
  109. package/dist/docs/ButtonDocs.js +1 -1
  110. package/dist/docs/CardDocs.d.ts.map +1 -1
  111. package/dist/docs/CardDocs.js +17 -8
  112. package/dist/docs/CheckboxDocs.d.ts +4 -0
  113. package/dist/docs/CheckboxDocs.d.ts.map +1 -0
  114. package/dist/docs/CheckboxDocs.js +7 -0
  115. package/dist/docs/DataTableDocs.d.ts.map +1 -1
  116. package/dist/docs/DataTableDocs.js +9 -5
  117. package/dist/docs/DateInputDocs.d.ts +1 -0
  118. package/dist/docs/DateInputDocs.d.ts.map +1 -1
  119. package/dist/docs/DateInputDocs.js +7 -9
  120. package/dist/docs/DatePickerDocs.d.ts +1 -0
  121. package/dist/docs/DatePickerDocs.d.ts.map +1 -1
  122. package/dist/docs/DatePickerDocs.js +6 -8
  123. package/dist/docs/DialogDocs.js +1 -1
  124. package/dist/docs/DocAdmin.d.ts +4 -0
  125. package/dist/docs/DocAdmin.d.ts.map +1 -0
  126. package/dist/docs/DocAdmin.js +68 -0
  127. package/dist/docs/DocsMenu.d.ts.map +1 -1
  128. package/dist/docs/DocsMenu.js +3 -3
  129. package/dist/docs/DocsRouter.d.ts.map +1 -1
  130. package/dist/docs/DocsRouter.js +13 -1
  131. package/dist/docs/DropdownMenuDocs.js +1 -1
  132. package/dist/docs/ExampleFormDocs.d.ts +4 -0
  133. package/dist/docs/ExampleFormDocs.d.ts.map +1 -0
  134. package/dist/docs/ExampleFormDocs.js +148 -0
  135. package/dist/docs/FilterDocs.d.ts +4 -0
  136. package/dist/docs/FilterDocs.d.ts.map +1 -0
  137. package/dist/docs/FilterDocs.js +112 -0
  138. package/dist/docs/InputDocs.d.ts.map +1 -1
  139. package/dist/docs/InputDocs.js +11 -1
  140. package/dist/docs/LinkButtonDocs.d.ts +4 -0
  141. package/dist/docs/LinkButtonDocs.d.ts.map +1 -0
  142. package/dist/docs/LinkButtonDocs.js +7 -0
  143. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +2 -0
  144. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +1 -0
  145. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +29 -0
  146. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts +2 -0
  147. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +1 -0
  148. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +7 -0
  149. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts +2 -0
  150. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +1 -0
  151. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +57 -0
  152. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts +9 -0
  153. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +1 -0
  154. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +30 -0
  155. package/dist/docs/PaginationDocs.js +6 -6
  156. package/dist/docs/RadioButtonGroupDocs.d.ts +4 -0
  157. package/dist/docs/RadioButtonGroupDocs.d.ts.map +1 -0
  158. package/dist/docs/RadioButtonGroupDocs.js +46 -0
  159. package/dist/docs/RoadMapDocs.d.ts +4 -0
  160. package/dist/docs/RoadMapDocs.d.ts.map +1 -0
  161. package/dist/docs/RoadMapDocs.js +171 -0
  162. package/dist/docs/SearchSelectInputDocs.d.ts +4 -0
  163. package/dist/docs/SearchSelectInputDocs.d.ts.map +1 -0
  164. package/dist/docs/SearchSelectInputDocs.js +168 -0
  165. package/dist/docs/SnackbarDocs.d.ts +4 -0
  166. package/dist/docs/SnackbarDocs.d.ts.map +1 -0
  167. package/dist/docs/SnackbarDocs.js +50 -0
  168. package/dist/docs/TabsGroupDocs.d.ts.map +1 -1
  169. package/dist/docs/TabsGroupDocs.js +12 -1
  170. package/dist/docs/docMockServices/empresaService.d.ts +38 -0
  171. package/dist/docs/docMockServices/empresaService.d.ts.map +1 -0
  172. package/dist/docs/docMockServices/empresaService.js +117 -0
  173. package/dist/docs/docMockServices/index.d.ts +9 -0
  174. package/dist/docs/docMockServices/index.d.ts.map +1 -0
  175. package/dist/docs/docMockServices/index.js +8 -0
  176. package/dist/docs/docMockServices/initialData.d.ts +6 -0
  177. package/dist/docs/docMockServices/initialData.d.ts.map +1 -0
  178. package/dist/docs/docMockServices/initialData.js +132 -0
  179. package/dist/docs/docMockServices/interfaces.d.ts +26 -0
  180. package/dist/docs/docMockServices/interfaces.d.ts.map +1 -0
  181. package/dist/docs/docMockServices/interfaces.js +1 -0
  182. package/dist/docs/docMockServices/personaEmpresaService.d.ts +43 -0
  183. package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +1 -0
  184. package/dist/docs/docMockServices/personaEmpresaService.js +113 -0
  185. package/dist/docs/docMockServices/personaService.d.ts +39 -0
  186. package/dist/docs/docMockServices/personaService.d.ts.map +1 -0
  187. package/dist/docs/docMockServices/personaService.js +181 -0
  188. package/dist/hooks/index.d.ts +2 -0
  189. package/dist/hooks/index.d.ts.map +1 -1
  190. package/dist/hooks/index.js +1 -0
  191. package/dist/hooks/useAsyncRequest.d.ts +17 -0
  192. package/dist/hooks/useAsyncRequest.d.ts.map +1 -0
  193. package/dist/hooks/useAsyncRequest.js +70 -0
  194. package/dist/index.css +1 -1
  195. package/dist/index.d.ts +23 -1
  196. package/dist/index.d.ts.map +1 -1
  197. package/dist/index.js +11 -0
  198. package/dist/index.js.map +1 -1
  199. package/dist/templates/forms/ContactForm.js +2 -2
  200. package/dist/templates/forms/LoginForm.js +1 -1
  201. package/dist/templates/forms/RegistrationForm.js +1 -1
  202. package/dist/templates/layouts/SidebarLayout.d.ts.map +1 -1
  203. package/dist/templates/layouts/SidebarLayout.js +3 -2
  204. package/dist/templates/patterns/FormPattern.d.ts.map +1 -1
  205. package/dist/templates/patterns/FormPattern.js +4 -3
  206. package/package.json +5 -2
@@ -0,0 +1,46 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useState } from "react";
3
+ import { Card, RadioButtonGroup, Button } from "../index";
4
+ import { useForm, FormProvider } from "react-hook-form";
5
+ const FormExample = () => {
6
+ const methods = useForm({
7
+ defaultValues: {
8
+ gender: "male",
9
+ preferences: "notifications",
10
+ },
11
+ });
12
+ const { handleSubmit, watch, register, formState: { errors }, } = methods;
13
+ const onSubmit = () => {
14
+ console.log(watch());
15
+ };
16
+ return (_jsx(FormProvider, { ...methods, children: _jsx(Card, { title: "Formulario con RadioButtonGroup", subtitle: "Ejemplo pr\u00E1ctico de uso de RadioButtonGroup en un formulario con react-hook-form", children: _jsxs("form", { onSubmit: handleSubmit(onSubmit), children: [_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { children: [_jsx("label", { className: "block text-sm text-[var(--color-primary)] mb-1 font-[var(--font-default)]", children: "G\u00E9nero" }), _jsx(RadioButtonGroup, { options: [
17
+ { label: "Masculino", value: "male" },
18
+ { label: "Femenino", value: "female" },
19
+ { label: "Otro", value: "other" },
20
+ ], ...register("gender", {
21
+ required: "El género es obligatorio",
22
+ }), error: errors.gender?.message })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-sm text-[var(--color-primary)] mb-1 font-[var(--font-default)]", children: "Preferencias" }), _jsx(RadioButtonGroup, { options: [
23
+ { label: "Notificaciones", value: "notifications" },
24
+ { label: "Email", value: "email" },
25
+ { label: "SMS", value: "sms" },
26
+ ], ...register("preferences", {
27
+ required: "Las preferencias son obligatorias",
28
+ }), error: errors.preferences?.message, direction: "horizontal" })] })] }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(Button, { variant: "outline", icon: "fa-times", type: "button", children: "Cancelar" }), _jsx(Button, { variant: "primary", icon: "fa-check", type: "submit", children: "Enviar" })] })] }) }) }));
29
+ };
30
+ const RadioButtonGroupDocs = () => {
31
+ const [selectedValue1, setSelectedValue1] = useState("option1");
32
+ const basicOptions = [
33
+ { label: "Opción 1", value: "option1" },
34
+ { label: "Opción 2", value: "option2" },
35
+ { label: "Opción 3", value: "option3" },
36
+ ];
37
+ const optionsWithNumbers = [
38
+ { label: "Uno", value: 1 },
39
+ { label: "Dos", value: 2 },
40
+ { label: "Tres", value: 3 },
41
+ ];
42
+ // Crear un FormProvider mínimo para los ejemplos en modo controlado
43
+ const controlMethods = useForm();
44
+ return (_jsx(FormProvider, { ...controlMethods, children: _jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "RadioButtonGroup - Variantes y Ejemplos", children: _jsxs("div", { className: "space-y-10", children: [_jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Uso b\u00E1sico con options" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(RadioButtonGroup, { options: basicOptions, value: selectedValue1, onChange: (value) => setSelectedValue1(value), name: "basic-group" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "grupo de radio buttons con options, label a la derecha (por defecto)" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx(RadioButtonGroup, { options: basicOptions, value: selectedValue1, onChange: (value) => setSelectedValue1(value), name: "basic-group-left", labelPosition: "left" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "grupo con labels a la izquierda" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Tama\u00F1os" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(RadioButtonGroup, { options: basicOptions, value: selectedValue1, onChange: (value) => setSelectedValue1(value), name: "size-sm", size: "sm" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "tama\u00F1o compacto" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx(RadioButtonGroup, { options: basicOptions, value: selectedValue1, onChange: (value) => setSelectedValue1(value), name: "size-md", size: "md" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "tama\u00F1o por defecto" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx(RadioButtonGroup, { options: basicOptions, value: selectedValue1, onChange: (value) => setSelectedValue1(value), name: "size-lg", size: "lg" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "tama\u00F1o amplio" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Direcci\u00F3n del layout" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(RadioButtonGroup, { options: basicOptions, value: selectedValue1, onChange: (value) => setSelectedValue1(value), name: "direction-vertical", direction: "vertical" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "direcci\u00F3n vertical (por defecto)" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx(RadioButtonGroup, { options: basicOptions, value: selectedValue1, onChange: (value) => setSelectedValue1(value), name: "direction-horizontal", direction: "horizontal" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "direcci\u00F3n horizontal" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Estados" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(RadioButtonGroup, { options: basicOptions, value: selectedValue1, onChange: (value) => setSelectedValue1(value), name: "error-group", error: "Debes seleccionar una opci\u00F3n" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "utiliza el prop error para mostrar mensajes y estilos" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx(RadioButtonGroup, { options: basicOptions, value: selectedValue1, onChange: (value) => setSelectedValue1(value), name: "disabled-group", disabled: true }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "el estado disabled aplica estilos y bloqueo de interacci\u00F3n" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Valores num\u00E9ricos" }), _jsxs("div", { className: "space-y-3", children: [_jsx(RadioButtonGroup, { options: optionsWithNumbers, value: selectedValue1, onChange: (value) => setSelectedValue1(value), name: "numeric-group" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "soporta valores num\u00E9ricos adem\u00E1s de strings" })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Espaciado personalizado" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(RadioButtonGroup, { options: basicOptions, value: selectedValue1, onChange: (value) => setSelectedValue1(value), name: "gap-sm", gap: "sm" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "espaciado peque\u00F1o" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx(RadioButtonGroup, { options: basicOptions, value: selectedValue1, onChange: (value) => setSelectedValue1(value), name: "gap-md", gap: "md" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "espaciado mediano (por defecto)" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx(RadioButtonGroup, { options: basicOptions, value: selectedValue1, onChange: (value) => setSelectedValue1(value), name: "gap-lg", gap: "lg" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "espaciado grande" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Ejemplo de uso" }), _jsx(FormExample, {})] })] }) }) }) }));
45
+ };
46
+ export default RadioButtonGroupDocs;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const RoadMapDocs: React.FC;
3
+ export default RoadMapDocs;
4
+ //# sourceMappingURL=RoadMapDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoadMapDocs.d.ts","sourceRoot":"","sources":["../../src/docs/RoadMapDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAkTxB,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,171 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { RoadMap, Card } from "../index";
4
+ const RoadMapDocs = () => {
5
+ const basicStages = [
6
+ { name: "Inicio", variant: "primary" },
7
+ { name: "Progreso", variant: "success" },
8
+ { name: "Finalización", variant: "info" },
9
+ ];
10
+ const stagesWithDescriptions = [
11
+ {
12
+ name: "Planificación",
13
+ description: "Definir requisitos y alcance del proyecto",
14
+ variant: "primary",
15
+ },
16
+ {
17
+ name: "Desarrollo",
18
+ description: "Construir las funcionalidades principales",
19
+ variant: "success",
20
+ },
21
+ {
22
+ name: "Pruebas",
23
+ description: "Realizar testing completo del sistema",
24
+ variant: "warning",
25
+ },
26
+ {
27
+ name: "Lanzamiento",
28
+ description: "Publicar y desplegar la aplicación",
29
+ variant: "info",
30
+ },
31
+ ];
32
+ const stagesWithIcons = [
33
+ {
34
+ name: "Análisis",
35
+ description: "Analizar requerimientos",
36
+ icon: "fa-search",
37
+ variant: "primary",
38
+ },
39
+ {
40
+ name: "Diseño",
41
+ description: "Crear el diseño de la solución",
42
+ icon: "fa-pencil-alt",
43
+ variant: "secondary",
44
+ },
45
+ {
46
+ name: "Implementación",
47
+ description: "Desarrollar la solución",
48
+ icon: "fa-code",
49
+ variant: "success",
50
+ },
51
+ {
52
+ name: "Despliegue",
53
+ description: "Publicar en producción",
54
+ icon: "fa-rocket",
55
+ variant: "info",
56
+ },
57
+ ];
58
+ const disabledStages = [
59
+ {
60
+ name: "Completado",
61
+ description: "Esta etapa ya está finalizada",
62
+ icon: "fa-check-circle",
63
+ variant: "success",
64
+ },
65
+ {
66
+ name: "En Progreso",
67
+ description: "Trabajando actualmente en esta etapa",
68
+ icon: "fa-spinner",
69
+ variant: "primary",
70
+ },
71
+ {
72
+ name: "Pendiente",
73
+ description: "Esta etapa aún no ha comenzado",
74
+ icon: "fa-clock",
75
+ variant: "warning",
76
+ disabled: true,
77
+ },
78
+ {
79
+ name: "Bloqueado",
80
+ description: "Esta etapa está bloqueada",
81
+ icon: "fa-lock",
82
+ variant: "danger",
83
+ disabled: true,
84
+ },
85
+ ];
86
+ const customColorStages = [
87
+ {
88
+ name: "Etapa 1",
89
+ description: "Con color personalizado",
90
+ icon: "fa-star",
91
+ bg: "#8b5cf6",
92
+ },
93
+ {
94
+ name: "Etapa 2",
95
+ description: "Otro color personalizado",
96
+ icon: "fa-heart",
97
+ bg: "#ec4899",
98
+ },
99
+ {
100
+ name: "Etapa 3",
101
+ description: "Verde personalizado",
102
+ icon: "fa-leaf",
103
+ bg: "#10b981",
104
+ },
105
+ ];
106
+ const allVariantsStages = [
107
+ {
108
+ name: "Primary",
109
+ description: "Variante primaria",
110
+ variant: "primary",
111
+ },
112
+ {
113
+ name: "Secondary",
114
+ description: "Variante secundaria",
115
+ variant: "secondary",
116
+ },
117
+ {
118
+ name: "Success",
119
+ description: "Variante de éxito",
120
+ variant: "success",
121
+ },
122
+ {
123
+ name: "Warning",
124
+ description: "Variante de advertencia",
125
+ variant: "warning",
126
+ },
127
+ {
128
+ name: "Danger",
129
+ description: "Variante de peligro",
130
+ variant: "danger",
131
+ },
132
+ {
133
+ name: "Info",
134
+ description: "Variante informativa",
135
+ variant: "info",
136
+ },
137
+ ];
138
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "RoadMap - Etapas y Progreso", children: _jsxs("div", { className: "space-y-8", children: [_jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Uso B\u00E1sico" }), _jsx(RoadMap, { stages: basicStages }), _jsx("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: "El componente RoadMap muestra una serie de etapas conectadas con l\u00EDneas. Cada etapa tiene un c\u00EDrculo con el color seg\u00FAn su variante." })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Con Descripciones" }), _jsx(RoadMap, { stages: stagesWithDescriptions }), _jsx("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: "Puedes agregar descripciones a cada etapa que se mostrar\u00E1n debajo del nombre en un texto m\u00E1s peque\u00F1o." })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Con \u00CDconos" }), _jsx(RoadMap, { stages: stagesWithIcons }), _jsxs("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: ["Cada etapa puede tener un \u00EDcono FontAwesome 5 que se mostrar\u00E1 dentro del c\u00EDrculo. Usa clases como ", _jsx("code", { children: "fa-check" }), ",", " ", _jsx("code", { children: "fa-code" }), ", etc."] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Etapas Deshabilitadas" }), _jsx(RoadMap, { stages: disabledStages }), _jsxs("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: ["Las etapas con ", _jsx("code", { children: "disabled: true" }), " se muestran con una opacidad de 0.5, tanto el c\u00EDrculo como el texto (nombre y descripci\u00F3n)."] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Colores Personalizados" }), _jsx(RoadMap, { stages: customColorStages }), _jsxs("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: ["Puedes usar la propiedad ", _jsx("code", { children: "bg" }), " para definir un color de fondo personalizado (hexadecimal, rgb, o nombre de color). Esto tiene prioridad sobre la variante."] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Todas las Variantes" }), _jsx(RoadMap, { stages: allVariantsStages }), _jsxs("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: ["Las variantes disponibles son: ", _jsx("code", { children: "primary" }), ",", " ", _jsx("code", { children: "secondary" }), ", ", _jsx("code", { children: "success" }), ", ", _jsx("code", { children: "warning" }), ", ", _jsx("code", { children: "danger" }), ", e ", _jsx("code", { children: "info" }), ". Las l\u00EDneas conectadoras tienen un gradiente que combina 50% del color de la etapa origen y 50% del color de la etapa destino."] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Ejemplo Completo" }), _jsx(RoadMap, { stages: [
139
+ {
140
+ name: "Inicio del Proyecto",
141
+ description: "Kickoff y definición de objetivos",
142
+ icon: "fa-flag",
143
+ variant: "primary",
144
+ },
145
+ {
146
+ name: "Desarrollo",
147
+ description: "Implementación de funcionalidades",
148
+ icon: "fa-code",
149
+ variant: "success",
150
+ },
151
+ {
152
+ name: "Revisión",
153
+ description: "Code review y testing",
154
+ icon: "fa-eye",
155
+ variant: "warning",
156
+ },
157
+ {
158
+ name: "Despliegue",
159
+ description: "Publicación en producción",
160
+ icon: "fa-rocket",
161
+ variant: "info",
162
+ },
163
+ {
164
+ name: "Post-Lanzamiento",
165
+ description: "Monitoreo y mejoras continuas",
166
+ icon: "fa-chart-line",
167
+ variant: "secondary",
168
+ },
169
+ ] }), _jsx("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: "Ejemplo completo combinando todas las caracter\u00EDsticas: variantes, \u00EDconos y descripciones." })] })] }) }) }));
170
+ };
171
+ export default RoadMapDocs;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const SearchSelectInputDocs: React.FC;
3
+ export default SearchSelectInputDocs;
4
+ //# sourceMappingURL=SearchSelectInputDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchSelectInputDocs.d.ts","sourceRoot":"","sources":["../../src/docs/SearchSelectInputDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAoK1B,QAAA,MAAM,qBAAqB,EAAE,KAAK,CAAC,EA+elC,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,168 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { Card, SearchSelectInput, Button, Input, DateInput } from "../index";
4
+ import { useForm } from "react-hook-form";
5
+ const sampleOptions = [
6
+ {
7
+ label: "España",
8
+ value: "es",
9
+ icon: "fa-flag",
10
+ description: "Madrid",
11
+ },
12
+ {
13
+ label: "Estados Unidos",
14
+ value: "us",
15
+ icon: "fa-flag",
16
+ description: "Washington D.C.",
17
+ },
18
+ {
19
+ label: "México",
20
+ value: "mx",
21
+ icon: "fa-flag",
22
+ description: "Ciudad de México",
23
+ },
24
+ {
25
+ label: "Argentina",
26
+ value: "ar",
27
+ icon: "fa-flag",
28
+ description: "Buenos Aires",
29
+ },
30
+ {
31
+ label: "Chile",
32
+ value: "cl",
33
+ icon: "fa-flag",
34
+ description: "Santiago",
35
+ },
36
+ {
37
+ label: "Colombia",
38
+ value: "co",
39
+ icon: "fa-flag",
40
+ description: "Bogotá",
41
+ },
42
+ ];
43
+ const users = [
44
+ {
45
+ id: 1,
46
+ firstName: "Juan",
47
+ lastName: "Pérez",
48
+ email: "juan.perez@empresa.com",
49
+ role: "Desarrollador",
50
+ department: "Tecnología",
51
+ },
52
+ {
53
+ id: 2,
54
+ firstName: "María",
55
+ lastName: "García",
56
+ email: "maria.garcia@empresa.com",
57
+ role: "Diseñadora",
58
+ department: "Diseño",
59
+ },
60
+ {
61
+ id: 3,
62
+ firstName: "Carlos",
63
+ lastName: "Rodríguez",
64
+ email: "carlos.rodriguez@empresa.com",
65
+ role: "Gerente",
66
+ department: "Ventas",
67
+ },
68
+ {
69
+ id: 4,
70
+ firstName: "Ana",
71
+ lastName: "Martínez",
72
+ email: "ana.martinez@empresa.com",
73
+ role: "Analista",
74
+ department: "Marketing",
75
+ },
76
+ {
77
+ id: 5,
78
+ firstName: "Luis",
79
+ lastName: "Fernández",
80
+ email: "luis.fernandez@empresa.com",
81
+ role: "Desarrollador",
82
+ department: "Tecnología",
83
+ },
84
+ ];
85
+ // Simular búsqueda asíncrona
86
+ const mockSearchPromise = async (text) => {
87
+ await new Promise((resolve) => setTimeout(resolve, 500));
88
+ const search = text.toLowerCase();
89
+ return sampleOptions.filter((option) => option.label.toLowerCase().includes(search) ||
90
+ (option.value && option.value.toLowerCase().includes(search)) ||
91
+ (option.description &&
92
+ String(option.description).toLowerCase().includes(search)));
93
+ };
94
+ // Simular búsqueda de un elemento individual por valor
95
+ const mockSingleSearchPromise = async (value) => {
96
+ await new Promise((resolve) => setTimeout(resolve, 300));
97
+ return sampleOptions.find((option) => option.value === value);
98
+ };
99
+ // Simular búsqueda con PaginationInterface
100
+ const mockSearchWithPagination = async (text) => {
101
+ await new Promise((resolve) => setTimeout(resolve, 500));
102
+ const search = text.toLowerCase();
103
+ const filtered = sampleOptions.filter((option) => option.label.toLowerCase().includes(search) ||
104
+ (option.value && option.value.toLowerCase().includes(search)) ||
105
+ (option.description &&
106
+ String(option.description).toLowerCase().includes(search)));
107
+ return {
108
+ list: filtered,
109
+ limit: 10,
110
+ page: 1,
111
+ pages: 1,
112
+ total: filtered.length,
113
+ };
114
+ };
115
+ // Simular búsqueda de usuarios
116
+ const mockUserSearch = async (text) => {
117
+ await new Promise((resolve) => setTimeout(resolve, 600));
118
+ const search = text.toLowerCase();
119
+ return users.filter((user) => user.firstName.toLowerCase().includes(search) ||
120
+ user.lastName.toLowerCase().includes(search) ||
121
+ user.email.toLowerCase().includes(search) ||
122
+ user.role.toLowerCase().includes(search));
123
+ };
124
+ // Simular búsqueda de un usuario individual por ID
125
+ const mockSingleUserSearch = async (userId) => {
126
+ await new Promise((resolve) => setTimeout(resolve, 300));
127
+ return users.find((user) => user.id === userId);
128
+ };
129
+ const SearchSelectInputDocs = () => {
130
+ const [selectedCountry, setSelectedCountry] = React.useState();
131
+ const [internalValue, setInternalValue] = React.useState("");
132
+ const [selectedUser, setSelectedUser] = React.useState();
133
+ const { register, handleSubmit, reset, setFocus, formState: { errors, isSubmitted }, watch, } = useForm();
134
+ const onSubmit = (data) => {
135
+ console.log(data);
136
+ };
137
+ // Enfocar el primer campo con error después de un submit fallido
138
+ React.useEffect(() => {
139
+ if (isSubmitted && Object.keys(errors).length > 0) {
140
+ // Usar setTimeout para asegurar que se ejecute después del render
141
+ const timer = setTimeout(() => {
142
+ if (errors.country) {
143
+ setFocus("country");
144
+ }
145
+ else if (errors.birthDate) {
146
+ setFocus("birthDate");
147
+ }
148
+ else if (errors.city) {
149
+ setFocus("city");
150
+ }
151
+ }, 100);
152
+ return () => clearTimeout(timer);
153
+ }
154
+ }, [errors, isSubmitted, setFocus]);
155
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "SearchSelectInput - B\u00FAsqueda as\u00EDncrona y selecci\u00F3n en Dialog", children: _jsxs("div", { className: "space-y-10", children: [_jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Uso b\u00E1sico" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "Buscar pa\u00EDs", placeholder: "Escribe y presiona Enter o click en buscar...", icon: "fa-globe", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise, onSelectOption: (option) => setSelectedCountry(option) }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Escribe el texto, presiona Enter o haz click en el bot\u00F3n de b\u00FAsqueda para abrir el dialog con los resultados" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: "Selecci\u00F3n actual" }), _jsx(Card, { variant: "outlined", children: _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: selectedCountry
156
+ ? `${selectedCountry.label} (${selectedCountry.value?.toUpperCase() ?? "N/A"})`
157
+ : "Ningún país seleccionado" }) })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Posici\u00F3n del bot\u00F3n de b\u00FAsqueda" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "Bot\u00F3n a la derecha (por defecto)", placeholder: "Escribe y busca...", icon: "fa-search", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "searchButtonPosition=\"right\" (valor por defecto)" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "Bot\u00F3n a la izquierda", placeholder: "Escribe y busca...", icon: "fa-search", iconPosition: "left", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "searchButtonPosition=\"left\"" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Controlado vs no controlado" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "SearchSelectInput no controlado", placeholder: "Escribe y busca...", icon: "fa-search", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "sin prop value: el componente maneja internamente el valor del input" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "SearchSelectInput controlado", placeholder: "Escribe y busca...", icon: "fa-search", value: internalValue, getOptionValue: (option) => option.value ?? "", onChange: (val) => {
158
+ if (typeof val === "string") {
159
+ setInternalValue(val);
160
+ }
161
+ }, onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "con value y onChange: el valor del input se controla desde el estado externo" }), _jsx(Input, { label: "Valor actual", value: internalValue, readOnly: true, icon: "fa-code" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Con PaginationInterface" }), _jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "B\u00FAsqueda con paginaci\u00F3n", placeholder: "Escribe y busca pa\u00EDses...", icon: "fa-globe", onSearchPromiseFn: mockSearchWithPagination, onSingleSearchPromiseFn: mockSingleSearchPromise, dialogTitle: "Seleccione un pa\u00EDs", onSelectOption: (option) => {
162
+ console.log("País seleccionado:", option);
163
+ } }), _jsxs("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["La funci\u00F3n onSearchPromiseFn puede devolver un", " ", _jsx("code", { children: "PaginationInterface<T>" }), ". El componente extraer\u00E1 autom\u00E1ticamente el array de la propiedad", " ", _jsx("code", { children: "list" }), "."] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Personalizaci\u00F3n del Dialog" }), _jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "Dialog personalizado", placeholder: "Escribe y busca...", icon: "fa-search", dialogTitle: "Buscar y seleccionar un pa\u00EDs", noResultsText: "No se encontraron pa\u00EDses con ese criterio", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsxs("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Puedes personalizar el t\u00EDtulo del dialog con", " ", _jsx("code", { children: "dialogTitle" }), " y el mensaje de sin resultados con", " ", _jsx("code", { children: "noResultsText" }), "."] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Uso gen\u00E9rico con renderOption personalizado" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "Buscar usuario", placeholder: "Escribe nombre, email o rol...", icon: "fa-users", onSearchPromiseFn: mockUserSearch, onSingleSearchPromiseFn: mockSingleUserSearch, getOptionLabel: (user) => `${user.firstName} ${user.lastName}`, getOptionValue: (user) => user.id, getOptionDescription: (user) => user.email, onSelectOption: (user, userId) => {
164
+ setSelectedUser(user);
165
+ console.log("Usuario seleccionado:", user, "ID:", userId);
166
+ }, renderOption: (user) => (_jsxs("div", { className: "flex items-start gap-3 w-full", children: [_jsx("div", { className: "flex-shrink-0 w-10 h-10 rounded-full bg-[var(--color-primary-soft)] flex items-center justify-center", children: _jsx("i", { className: "fal fa-user text-[var(--color-primary)]" }) }), _jsxs("div", { className: "flex flex-col flex-1 min-w-0", children: [_jsxs("span", { className: "font-medium text-[var(--color-text-primary)]", children: [user.firstName, " ", user.lastName] }), _jsx("span", { className: "text-xs text-[var(--color-text-secondary)] truncate", children: user.email }), _jsxs("div", { className: "flex items-center gap-2 mt-1", children: [_jsx("span", { className: "text-xs px-2 py-0.5 rounded bg-[var(--color-bg-secondary)] text-[var(--color-text-secondary)]", children: user.role }), _jsxs("span", { className: "text-xs text-[var(--color-text-muted)]", children: ["\u2022 ", user.department] })] })] })] })) }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "usando getOptionLabel, getOptionValue y renderOption para personalizar completamente el renderizado de opciones sin propiedades label/value/description" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: "Usuario seleccionado" }), _jsx(Card, { variant: "outlined", children: selectedUser ? (_jsxs("div", { className: "space-y-2", children: [_jsxs("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: [selectedUser.firstName, " ", selectedUser.lastName] }), _jsx("p", { className: "text-xs", style: { color: "var(--flysoft-text-secondary)" }, children: selectedUser.email }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-xs px-2 py-0.5 rounded bg-[var(--color-bg-secondary)]", style: { color: "var(--flysoft-text-secondary)" }, children: selectedUser.role }), _jsx("span", { className: "text-xs", style: { color: "var(--flysoft-text-muted)" }, children: selectedUser.department })] }), _jsxs("p", { className: "text-xs mt-2", style: { color: "var(--flysoft-text-muted)" }, children: ["ID: ", selectedUser.id] })] })) : (_jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Ning\u00FAn usuario seleccionado" })) })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Ejemplo de formulario" }), _jsx(Card, { title: "Formulario de b\u00FAsqueda con SearchSelectInput", subtitle: "Combinaci\u00F3n de SearchSelectInput, DateInput, Input y Button", children: _jsxs("form", { className: "space-y-4", onSubmit: handleSubmit(onSubmit), children: [_jsx(SearchSelectInput, { label: "Pa\u00EDs de residencia", ...register("country"), placeholder: "Busca y selecciona un pa\u00EDs", getOptionLabel: (option) => option.label, getOptionValue: (option) => option.value ?? "", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise, dialogTitle: "Seleccione un pa\u00EDs" }), _jsxs("div", { children: ["Pa\u00EDs de residencia: ", watch("country")?.toString()] }), _jsx(DateInput, { label: "Fecha de nacimiento", placeholder: "dd/mm/yyyy", ...register("birthDate") }), _jsx(Input, { label: "Ciudad", placeholder: "Introduce tu ciudad", icon: "fa-city", error: errors.city?.message }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(Button, { variant: "outline", icon: "fa-times", type: "submit", onClick: () => reset(), children: "Limpiar" }), _jsx(Button, { variant: "primary", icon: "fa-search", type: "submit", children: "Buscar" })] })] }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Tama\u00F1os" }), _jsxs("div", { className: "space-y-4", children: [_jsx(SearchSelectInput, { label: "Tama\u00F1o peque\u00F1o", placeholder: "Escribe y busca...", size: "sm", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx(SearchSelectInput, { label: "Tama\u00F1o mediano (por defecto)", placeholder: "Escribe y busca...", size: "md", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx(SearchSelectInput, { label: "Tama\u00F1o grande", placeholder: "Escribe y busca...", size: "lg", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Estados y validaci\u00F3n" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "Con error", placeholder: "Escribe y busca...", error: "Este campo es requerido", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "respeta el estado error heredado del componente Input" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "Deshabilitado", placeholder: "No editable", icon: "fa-ban", disabled: true, onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "respeta el estado disabled heredado del componente Input" })] })] })] })] }) }) }));
167
+ };
168
+ export default SearchSelectInputDocs;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const SnackbarDocs: React.FC;
3
+ export default SnackbarDocs;
4
+ //# sourceMappingURL=SnackbarDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SnackbarDocs.d.ts","sourceRoot":"","sources":["../../src/docs/SnackbarDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AA+c1B,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAWzB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { Card, Button, SnackbarProvider, SnackbarContainer, useSnackbar } from "../index";
4
+ // Componente wrapper para usar el hook dentro del provider
5
+ const SnackbarExamples = () => {
6
+ const { showSnackbar } = useSnackbar();
7
+ return (_jsxs("div", { className: "space-y-8", children: [_jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Variantes" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Los snackbars soportan las mismas variantes que el componente Badge:", _jsx("code", { children: "primary" }), ", ", _jsx("code", { children: "secondary" }), ", ", _jsx("code", { children: "success" }), ",", " ", _jsx("code", { children: "warning" }), ", ", _jsx("code", { children: "danger" }), ", e ", _jsx("code", { children: "info" }), "."] }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx(Button, { variant: "primary", onClick: () => showSnackbar("Mensaje de información primaria", "primary"), children: "Primary" }), _jsx(Button, { variant: "outline", onClick: () => showSnackbar("Mensaje secundario", "secondary"), children: "Secondary" }), _jsx(Button, { variant: "primary", onClick: () => showSnackbar("Operación completada exitosamente", "success"), children: "Success" }), _jsx(Button, { variant: "primary", onClick: () => showSnackbar("Advertencia: revisa esta acción", "warning"), children: "Warning" }), _jsx(Button, { variant: "primary", onClick: () => showSnackbar("Error al procesar la solicitud", "danger"), children: "Danger" }), _jsx(Button, { variant: "primary", onClick: () => showSnackbar("Información adicional disponible", "info"), children: "Info" })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Con \u00EDconos personalizados" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Puedes especificar un \u00EDcono personalizado usando clases de FontAwesome 5. Si no especificas un \u00EDcono, se usa uno por defecto seg\u00FAn la variante." }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx(Button, { variant: "primary", icon: "fa-star", onClick: () => showSnackbar("¡Favorito agregado!", "success", {
8
+ icon: "fa-star",
9
+ iconLabel: "Favorito",
10
+ }), children: "Con \u00EDcono estrella" }), _jsx(Button, { variant: "primary", icon: "fa-bell", onClick: () => showSnackbar("Nueva notificación recibida", "info", {
11
+ icon: "fa-bell",
12
+ iconLabel: "Notificación",
13
+ }), children: "Con \u00EDcono campana" }), _jsx(Button, { variant: "primary", icon: "fa-download", onClick: () => showSnackbar("Descarga completada", "success", {
14
+ icon: "fa-download",
15
+ iconLabel: "Descarga",
16
+ }), children: "Con \u00EDcono descarga" }), _jsx(Button, { variant: "primary", icon: "fa-save", onClick: () => showSnackbar("Cambios guardados correctamente", "success", {
17
+ icon: "fa-save",
18
+ iconLabel: "Guardado",
19
+ }), children: "Con \u00EDcono guardar" })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Duraci\u00F3n personalizada" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Por defecto, los snackbars se muestran durante 3 segundos. Puedes personalizar la duraci\u00F3n en milisegundos. Usa ", _jsx("code", { children: "0" }), " para que no se cierren autom\u00E1ticamente."] }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx(Button, { variant: "primary", onClick: () => showSnackbar("Este snackbar dura 2 segundos", "info", {
20
+ duration: 2000,
21
+ }), children: "2 segundos" }), _jsx(Button, { variant: "primary", onClick: () => showSnackbar("Este snackbar dura 10 segundos", "warning", {
22
+ duration: 10000,
23
+ }), children: "10 segundos" }), _jsx(Button, { variant: "primary", onClick: () => showSnackbar("Este snackbar no se cierra automáticamente", "success", {
24
+ duration: 0,
25
+ }), children: "Sin auto-cierre" })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Mensajes largos" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Los snackbars tienen un ancho fijo de 18rem. Los mensajes largos se ajustan autom\u00E1ticamente ocupando varios renglones sin estirar el snackbar." }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx(Button, { variant: "primary", onClick: () => showSnackbar("Este es un mensaje muy largo que debería ocupar varios renglones en el snackbar sin estirarlo, manteniendo el ancho fijo de 18rem.", "info"), children: "Mensaje largo" }), _jsx(Button, { variant: "primary", onClick: () => showSnackbar("Este es otro ejemplo de mensaje extenso que demuestra cómo el texto se ajusta automáticamente dentro del snackbar, permitiendo que el contenido sea legible sin afectar el diseño.", "warning", {
26
+ icon: "fa-exclamation-triangle",
27
+ }), children: "Mensaje muy largo" })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "M\u00FAltiples snackbars" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Puedes mostrar m\u00FAltiples snackbars simult\u00E1neamente. Los nuevos aparecen abajo y los antiguos arriba. La barra de progreso se pausa cuando pasas el mouse sobre un snackbar." }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx(Button, { variant: "primary", onClick: () => {
28
+ showSnackbar("Primer snackbar", "success");
29
+ setTimeout(() => showSnackbar("Segundo snackbar", "info"), 500);
30
+ setTimeout(() => showSnackbar("Tercer snackbar", "warning"), 1000);
31
+ }, children: "Mostrar 3 snackbars" }), _jsx(Button, { variant: "primary", onClick: () => {
32
+ for (let i = 1; i <= 5; i++) {
33
+ setTimeout(() => showSnackbar(`Snackbar número ${i}`, "primary", {
34
+ duration: 3000,
35
+ }), i * 300);
36
+ }
37
+ }, children: "Mostrar 5 snackbars" })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Casos de uso comunes" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h4", { className: "text-md font-medium mb-2", style: { color: "var(--flysoft-text-primary)" }, children: "Operaci\u00F3n exitosa" }), _jsx(Button, { variant: "primary", icon: "fa-check", onClick: () => showSnackbar("Los cambios se guardaron correctamente", "success", {
38
+ icon: "fa-check-circle",
39
+ }), children: "Guardar cambios" })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-md font-medium mb-2", style: { color: "var(--flysoft-text-primary)" }, children: "Error de validaci\u00F3n" }), _jsx(Button, { variant: "primary", icon: "fa-exclamation-triangle", onClick: () => showSnackbar("Por favor, completa todos los campos requeridos", "danger", {
40
+ icon: "fa-times-circle",
41
+ duration: 6000,
42
+ }), children: "Validar formulario" })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-md font-medium mb-2", style: { color: "var(--flysoft-text-primary)" }, children: "Informaci\u00F3n importante" }), _jsx(Button, { variant: "primary", icon: "fa-info-circle", onClick: () => showSnackbar("Tu sesión expirará en 5 minutos. Guarda tu trabajo.", "warning", {
43
+ icon: "fa-clock",
44
+ duration: 8000,
45
+ }), children: "Mostrar advertencia" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Posiciones del contenedor" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["El ", _jsx("code", { children: "SnackbarContainer" }), " puede posicionarse en diferentes lugares de la pantalla. En esta documentaci\u00F3n est\u00E1 configurado en", " ", _jsx("code", { children: "top-right" }), ". Las opciones disponibles son:"] }), _jsxs("ul", { className: "list-disc list-inside space-y-1 text-sm mb-4", style: { color: "var(--flysoft-text-secondary)" }, children: [_jsxs("li", { children: [_jsx("code", { children: "top-right" }), " - Esquina superior derecha (por defecto)"] }), _jsxs("li", { children: [_jsx("code", { children: "top-left" }), " - Esquina superior izquierda"] }), _jsxs("li", { children: [_jsx("code", { children: "bottom-right" }), " - Esquina inferior derecha"] }), _jsxs("li", { children: [_jsx("code", { children: "bottom-left" }), " - Esquina inferior izquierda"] }), _jsxs("li", { children: [_jsx("code", { children: "top-center" }), " - Centro superior"] }), _jsxs("li", { children: [_jsx("code", { children: "bottom-center" }), " - Centro inferior"] })] }), _jsx("div", { className: "bg-gray-100 dark:bg-gray-800 p-4 rounded-md", children: _jsx("code", { className: "text-sm", children: `<SnackbarContainer position="top-right" />` }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Caracter\u00EDsticas" }), _jsxs("ul", { className: "list-disc list-inside space-y-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: [_jsxs("li", { children: [_jsx("strong", { children: "Ancho fijo:" }), " 18rem (288px)"] }), _jsxs("li", { children: [_jsx("strong", { children: "Barra de progreso:" }), " Muestra el tiempo restante en el borde inferior con el color de la variante"] }), _jsxs("li", { children: [_jsx("strong", { children: "Auto-cierre:" }), " Se cierra autom\u00E1ticamente despu\u00E9s de la duraci\u00F3n especificada (default: 3 segundos)"] }), _jsxs("li", { children: [_jsx("strong", { children: "Pausa al hover:" }), " La barra de progreso se pausa cuando pasas el mouse sobre el snackbar"] }), _jsxs("li", { children: [_jsx("strong", { children: "Cierre manual:" }), " Bot\u00F3n X en la esquina superior derecha"] }), _jsxs("li", { children: [_jsx("strong", { children: "\u00CDconos:" }), " Soporte para \u00EDconos FontAwesome 5 con \u00EDconos por defecto seg\u00FAn la variante"] }), _jsxs("li", { children: [_jsx("strong", { children: "Mensajes largos:" }), " El texto se ajusta autom\u00E1ticamente en m\u00FAltiples l\u00EDneas"] }), _jsxs("li", { children: [_jsx("strong", { children: "M\u00FAltiples snackbars:" }), " Soporte para mostrar varios snackbars apilados verticalmente"] }), _jsxs("li", { children: [_jsx("strong", { children: "Posiciones:" }), " Configurable en el SnackbarContainer (top-right, top-left, bottom-right, bottom-left, top-center, bottom-center)"] })] })] })] }));
46
+ };
47
+ const SnackbarDocs = () => {
48
+ return (_jsxs(SnackbarProvider, { children: [_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "Snackbar - Notificaciones y Mensajes", children: _jsx(SnackbarExamples, {}) }) }), _jsx(SnackbarContainer, { position: "top-right" })] }));
49
+ };
50
+ export default SnackbarDocs;
@@ -1 +1 @@
1
- {"version":3,"file":"TabsGroupDocs.d.ts","sourceRoot":"","sources":["../../src/docs/TabsGroupDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,QAAA,MAAM,aAAa,EAAE,KAAK,CAAC,EAwY1B,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"TabsGroupDocs.d.ts","sourceRoot":"","sources":["../../src/docs/TabsGroupDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AA+IxC,QAAA,MAAM,aAAa,EAAE,KAAK,CAAC,EAsa1B,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -1,6 +1,17 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React, { useState } from "react";
3
+ import { useSearchParams } from "react-router-dom";
3
4
  import { Card, TabsGroup, TabPanel, Button, Badge, Input } from "../index";
5
+ const UrlSyncExample = () => {
6
+ const [searchParams] = useSearchParams();
7
+ const urlTab = searchParams.get("tab");
8
+ const tabsForUrl = [
9
+ { id: "overview", label: "Resumen" },
10
+ { id: "details", label: "Detalles" },
11
+ { id: "settings", label: "Configuración" },
12
+ ];
13
+ return (_jsxs("div", { className: "space-y-4", children: [urlTab && (_jsxs("div", { className: "p-3 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: [_jsxs("p", { className: "text-sm", children: [_jsx("span", { className: "font-semibold", children: "Tab desde URL:" }), " ", _jsx("span", { style: { color: "var(--flysoft-text-secondary)" }, children: urlTab })] }), _jsxs("p", { className: "text-xs mt-1", style: { color: "var(--flysoft-text-secondary)" }, children: ["URL actual:", " ", _jsxs("code", { className: "px-1 py-0.5 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: ["?tab=", urlTab] })] }), _jsxs("p", { className: "text-xs mt-2", style: { color: "var(--flysoft-text-secondary)" }, children: ["\uD83D\uDCA1 Prueba cambiar de tab y observa c\u00F3mo se actualiza la URL. Tambi\u00E9n puedes recargar la p\u00E1gina con", " ", _jsx("code", { className: "px-1 py-0.5 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: "?tab=details" }), "en la URL para ver c\u00F3mo se carga directamente ese tab."] })] })), !urlTab && (_jsx("div", { className: "p-3 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: _jsxs("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["\uD83D\uDCA1 Cambia de tab y observa c\u00F3mo se actualiza la URL. Tambi\u00E9n puedes agregar", " ", _jsx("code", { className: "px-1 py-0.5 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: "?tab=details" }), "manualmente en la URL para cargar directamente ese tab."] }) })), _jsxs(TabsGroup, { tabs: tabsForUrl, paramName: "tab", children: [_jsx(TabPanel, { tabId: "overview", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Resumen General" }), _jsxs("p", { style: { color: "var(--flysoft-text-secondary)" }, children: ["Este es el tab de resumen. Cuando este tab est\u00E9 activo, la URL mostrar\u00E1", " ", _jsx("code", { className: "px-1 py-0.5 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded text-xs", children: "?tab=overview" }), "."] }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { variant: "primary", icon: "fa-chart-bar", children: "Ver Estad\u00EDsticas" }), _jsx(Button, { variant: "outline", icon: "fa-download", children: "Exportar" })] })] }) }), _jsx(TabPanel, { tabId: "details", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Detalles Completos" }), _jsxs("p", { style: { color: "var(--flysoft-text-secondary)" }, children: ["Este es el tab de detalles. Cuando este tab est\u00E9 activo, la URL mostrar\u00E1", " ", _jsx("code", { className: "px-1 py-0.5 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded text-xs", children: "?tab=details" }), "."] }), _jsxs("p", { style: { color: "var(--flysoft-text-secondary)" }, children: ["Si recargas la p\u00E1gina con", " ", _jsx("code", { className: "px-1 py-0.5 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded text-xs", children: "?tab=details" }), "en la URL, este tab se cargar\u00E1 autom\u00E1ticamente."] }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { variant: "primary", icon: "fa-info-circle", children: "M\u00E1s Informaci\u00F3n" }), _jsx(Button, { variant: "outline", icon: "fa-edit", children: "Editar" })] })] }) }), _jsx(TabPanel, { tabId: "settings", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Configuraci\u00F3n" }), _jsxs("p", { style: { color: "var(--flysoft-text-secondary)" }, children: ["Este es el tab de configuraci\u00F3n. Cuando este tab est\u00E9 activo, la URL mostrar\u00E1", " ", _jsx("code", { className: "px-1 py-0.5 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded text-xs", children: "?tab=settings" }), "."] }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { variant: "primary", icon: "fa-cog", children: "Configurar" }), _jsx(Button, { variant: "outline", icon: "fa-save", children: "Guardar" })] })] }) })] })] }));
14
+ };
4
15
  const TabsGroupDocs = () => {
5
16
  const [selectedTab, setSelectedTab] = useState("");
6
17
  const basicTabs = [
@@ -18,7 +29,7 @@ const TabsGroupDocs = () => {
18
29
  { id: "analytics", label: "Analytics" },
19
30
  { id: "reports", label: "Reportes" },
20
31
  ];
21
- return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "TabsGroup - Variantes y Ejemplos", children: _jsxs("div", { className: "space-y-10", children: [_jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Uso b\u00E1sico" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "El componente TabsGroup permite organizar contenido en pesta\u00F1as. Cada TabPanel muestra su contenido cuando el tab correspondiente est\u00E1 activo." }), _jsx(Card, { title: "Ejemplo b\u00E1sico", children: _jsxs(TabsGroup, { tabs: basicTabs, children: [_jsx(TabPanel, { tabId: "users", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Lista de Usuarios" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Contenido del panel de usuarios. Aqu\u00ED puedes mostrar una lista, formulario, o cualquier contenido relacionado con usuarios." }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { variant: "primary", icon: "fa-user-plus", children: "Agregar Usuario" }), _jsx(Button, { variant: "outline", icon: "fa-search", children: "Buscar" })] })] }) }), _jsx(TabPanel, { tabId: "roles", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Gesti\u00F3n de Roles" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Contenido del panel de roles. Aqu\u00ED puedes gestionar los diferentes roles del sistema." }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { variant: "primary", icon: "fa-shield-alt", children: "Crear Rol" }), _jsx(Button, { variant: "outline", icon: "fa-list", children: "Ver Todos" })] })] }) }), _jsx(TabPanel, { tabId: "permissions", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Permisos del Sistema" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Contenido del panel de permisos. Aqu\u00ED puedes configurar los permisos disponibles en el sistema." }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { variant: "primary", icon: "fa-key", children: "Asignar Permisos" }), _jsx(Button, { variant: "outline", icon: "fa-cog", children: "Configurar" })] })] }) })] }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Tabs con IDs num\u00E9ricos" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Los tabs pueden usar tanto strings como n\u00FAmeros como identificadores." }), _jsx(Card, { title: "Ejemplo con IDs num\u00E9ricos", children: _jsxs(TabsGroup, { tabs: tabsWithNumbers, children: [_jsx(TabPanel, { tabId: 1, children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Contenido del Primer Tab" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este tab usa el ID num\u00E9rico 1." })] }) }), _jsx(TabPanel, { tabId: 2, children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Contenido del Segundo Tab" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este tab usa el ID num\u00E9rico 2." })] }) }), _jsx(TabPanel, { tabId: 3, children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Contenido del Tercer Tab" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este tab usa el ID num\u00E9rico 3." })] }) })] }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Tabs con headerNode" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "El prop headerNode permite agregar contenido adicional en la misma l\u00EDnea que los tabs, alineado a la derecha. \u00DAtil para botones de acci\u00F3n, badges, o cualquier otro contenido." }), _jsx(Card, { title: "Ejemplo con headerNode", children: _jsxs(TabsGroup, { tabs: tabsWithHeader, headerNode: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "info", children: "Nuevo" }), _jsx(Button, { size: "sm", variant: "primary", icon: "fa-plus", children: "Agregar" })] }), children: [_jsx(TabPanel, { tabId: "dashboard", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Dashboard" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Vista general del sistema con m\u00E9tricas y estad\u00EDsticas importantes." })] }) }), _jsx(TabPanel, { tabId: "analytics", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Analytics" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "An\u00E1lisis detallado de datos y tendencias del sistema." })] }) }), _jsx(TabPanel, { tabId: "reports", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Reportes" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Generaci\u00F3n y visualizaci\u00F3n de reportes del sistema." })] }) })] }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Con callback onChangeTab" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "El prop onChangeTab permite ejecutar una funci\u00F3n cuando se cambia de tab. \u00DAtil para sincronizar estado externo o realizar acciones al cambiar de pesta\u00F1a." }), _jsx(Card, { title: "Ejemplo con onChangeTab", children: _jsxs("div", { className: "space-y-4", children: [selectedTab && (_jsx("div", { className: "p-3 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: _jsxs("p", { className: "text-sm", children: [_jsx("span", { className: "font-semibold", children: "Tab seleccionado:" }), " ", _jsx("span", { style: { color: "var(--flysoft-text-secondary)" }, children: selectedTab })] }) })), _jsxs(TabsGroup, { tabs: basicTabs, onChangeTab: (tab) => setSelectedTab(tab), children: [_jsx(TabPanel, { tabId: "users", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Usuarios" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este tab notifica el cambio mediante onChangeTab." })] }) }), _jsx(TabPanel, { tabId: "roles", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Roles" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este tab tambi\u00E9n notifica el cambio mediante onChangeTab." })] }) }), _jsx(TabPanel, { tabId: "permissions", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Permisos" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este tab tambi\u00E9n notifica el cambio mediante onChangeTab." })] }) })] })] }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Ejemplo completo con formularios" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Ejemplo pr\u00E1ctico usando TabsGroup con TabPanel para organizar formularios en diferentes secciones." }), _jsx(Card, { title: "Formulario de Configuraci\u00F3n", children: _jsxs(TabsGroup, { tabs: [
32
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "TabsGroup - Variantes y Ejemplos", children: _jsxs("div", { className: "space-y-10", children: [_jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Uso b\u00E1sico" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "El componente TabsGroup permite organizar contenido en pesta\u00F1as. Cada TabPanel muestra su contenido cuando el tab correspondiente est\u00E1 activo." }), _jsx(Card, { title: "Ejemplo b\u00E1sico", children: _jsxs(TabsGroup, { tabs: basicTabs, children: [_jsx(TabPanel, { tabId: "users", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Lista de Usuarios" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Contenido del panel de usuarios. Aqu\u00ED puedes mostrar una lista, formulario, o cualquier contenido relacionado con usuarios." }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { variant: "primary", icon: "fa-user-plus", children: "Agregar Usuario" }), _jsx(Button, { variant: "outline", icon: "fa-search", children: "Buscar" })] })] }) }), _jsx(TabPanel, { tabId: "roles", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Gesti\u00F3n de Roles" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Contenido del panel de roles. Aqu\u00ED puedes gestionar los diferentes roles del sistema." }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { variant: "primary", icon: "fa-shield-alt", children: "Crear Rol" }), _jsx(Button, { variant: "outline", icon: "fa-list", children: "Ver Todos" })] })] }) }), _jsx(TabPanel, { tabId: "permissions", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Permisos del Sistema" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Contenido del panel de permisos. Aqu\u00ED puedes configurar los permisos disponibles en el sistema." }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { variant: "primary", icon: "fa-key", children: "Asignar Permisos" }), _jsx(Button, { variant: "outline", icon: "fa-cog", children: "Configurar" })] })] }) })] }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Tabs con IDs num\u00E9ricos" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Los tabs pueden usar tanto strings como n\u00FAmeros como identificadores." }), _jsx(Card, { title: "Ejemplo con IDs num\u00E9ricos", children: _jsxs(TabsGroup, { tabs: tabsWithNumbers, children: [_jsx(TabPanel, { tabId: 1, children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Contenido del Primer Tab" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este tab usa el ID num\u00E9rico 1." })] }) }), _jsx(TabPanel, { tabId: 2, children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Contenido del Segundo Tab" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este tab usa el ID num\u00E9rico 2." })] }) }), _jsx(TabPanel, { tabId: 3, children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Contenido del Tercer Tab" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este tab usa el ID num\u00E9rico 3." })] }) })] }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Tabs con headerNode" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "El prop headerNode permite agregar contenido adicional en la misma l\u00EDnea que los tabs, alineado a la derecha. \u00DAtil para botones de acci\u00F3n, badges, o cualquier otro contenido." }), _jsx(Card, { title: "Ejemplo con headerNode", children: _jsxs(TabsGroup, { tabs: tabsWithHeader, headerNode: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "info", children: "Nuevo" }), _jsx(Button, { size: "sm", variant: "primary", icon: "fa-plus", children: "Agregar" })] }), children: [_jsx(TabPanel, { tabId: "dashboard", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Dashboard" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Vista general del sistema con m\u00E9tricas y estad\u00EDsticas importantes." })] }) }), _jsx(TabPanel, { tabId: "analytics", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Analytics" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "An\u00E1lisis detallado de datos y tendencias del sistema." })] }) }), _jsx(TabPanel, { tabId: "reports", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Reportes" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Generaci\u00F3n y visualizaci\u00F3n de reportes del sistema." })] }) })] }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Con callback onChangeTab" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "El prop onChangeTab permite ejecutar una funci\u00F3n cuando se cambia de tab. \u00DAtil para sincronizar estado externo o realizar acciones al cambiar de pesta\u00F1a." }), _jsx(Card, { title: "Ejemplo con onChangeTab", children: _jsxs("div", { className: "space-y-4", children: [selectedTab && (_jsx("div", { className: "p-3 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: _jsxs("p", { className: "text-sm", children: [_jsx("span", { className: "font-semibold", children: "Tab seleccionado:" }), " ", _jsx("span", { style: { color: "var(--flysoft-text-secondary)" }, children: selectedTab })] }) })), _jsxs(TabsGroup, { tabs: basicTabs, onChangeTab: (tab) => setSelectedTab(tab), children: [_jsx(TabPanel, { tabId: "users", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Usuarios" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este tab notifica el cambio mediante onChangeTab." })] }) }), _jsx(TabPanel, { tabId: "roles", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Roles" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este tab tambi\u00E9n notifica el cambio mediante onChangeTab." })] }) }), _jsx(TabPanel, { tabId: "permissions", children: _jsxs("div", { className: "space-y-4", children: [_jsx("h4", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: "Permisos" }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este tab tambi\u00E9n notifica el cambio mediante onChangeTab." })] }) })] })] }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Sincronizaci\u00F3n con URL (paramName)" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["El prop", " ", _jsx("code", { className: "px-1 py-0.5 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded text-xs", children: "paramName" }), " ", "permite sincronizar el tab activo con los par\u00E1metros de la URL. Cuando cambias de tab, se actualiza la URL autom\u00E1ticamente. Si la URL ya contiene el par\u00E1metro al cargar la p\u00E1gina, se mostrar\u00E1 el tab correspondiente. Esto es \u00FAtil para compartir enlaces directos a un tab espec\u00EDfico o para mantener el estado al navegar con el bot\u00F3n atr\u00E1s/adelante del navegador."] }), _jsx(Card, { title: "Ejemplo con sincronizaci\u00F3n de URL", children: _jsx(UrlSyncExample, {}) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Ejemplo completo con formularios" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Ejemplo pr\u00E1ctico usando TabsGroup con TabPanel para organizar formularios en diferentes secciones." }), _jsx(Card, { title: "Formulario de Configuraci\u00F3n", children: _jsxs(TabsGroup, { tabs: [
22
33
  { id: "personal", label: "Personal" },
23
34
  { id: "contact", label: "Contacto" },
24
35
  { id: "security", label: "Seguridad" },