flysoft-react-ui 0.1.16 → 0.2.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 (58) hide show
  1. package/dist/components/utils/Badge.d.ts +3 -0
  2. package/dist/components/utils/Badge.d.ts.map +1 -1
  3. package/dist/components/utils/Badge.js +11 -4
  4. package/dist/docs/ApiClientDocs.d.ts +4 -0
  5. package/dist/docs/ApiClientDocs.d.ts.map +1 -0
  6. package/dist/docs/ApiClientDocs.js +66 -0
  7. package/dist/docs/BadgeDocs.d.ts +4 -0
  8. package/dist/docs/BadgeDocs.d.ts.map +1 -0
  9. package/dist/docs/BadgeDocs.js +7 -0
  10. package/dist/docs/DocsMenu.d.ts.map +1 -1
  11. package/dist/docs/DocsMenu.js +1 -1
  12. package/dist/docs/DocsRouter.d.ts.map +1 -1
  13. package/dist/docs/DocsRouter.js +3 -1
  14. package/dist/fontawesome/css/all.min.css +5 -0
  15. package/dist/fontawesome/webfonts/fa-brands-400.eot +0 -0
  16. package/dist/fontawesome/webfonts/fa-brands-400.svg +3717 -0
  17. package/dist/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  18. package/dist/fontawesome/webfonts/fa-brands-400.woff +0 -0
  19. package/dist/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  20. package/dist/fontawesome/webfonts/fa-duotone-900.eot +0 -0
  21. package/dist/fontawesome/webfonts/fa-duotone-900.svg +15328 -0
  22. package/dist/fontawesome/webfonts/fa-duotone-900.ttf +0 -0
  23. package/dist/fontawesome/webfonts/fa-duotone-900.woff +0 -0
  24. package/dist/fontawesome/webfonts/fa-duotone-900.woff2 +0 -0
  25. package/dist/fontawesome/webfonts/fa-light-300.eot +0 -0
  26. package/dist/fontawesome/webfonts/fa-light-300.svg +12423 -0
  27. package/dist/fontawesome/webfonts/fa-light-300.ttf +0 -0
  28. package/dist/fontawesome/webfonts/fa-light-300.woff +0 -0
  29. package/dist/fontawesome/webfonts/fa-light-300.woff2 +0 -0
  30. package/dist/fontawesome/webfonts/fa-regular-400.eot +0 -0
  31. package/dist/fontawesome/webfonts/fa-regular-400.svg +11323 -0
  32. package/dist/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  33. package/dist/fontawesome/webfonts/fa-regular-400.woff +0 -0
  34. package/dist/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  35. package/dist/fontawesome/webfonts/fa-solid-900.eot +0 -0
  36. package/dist/fontawesome/webfonts/fa-solid-900.svg +9653 -0
  37. package/dist/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  38. package/dist/fontawesome/webfonts/fa-solid-900.woff +0 -0
  39. package/dist/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  40. package/dist/hooks/index.d.ts +5 -0
  41. package/dist/hooks/index.d.ts.map +1 -1
  42. package/dist/hooks/index.js +3 -0
  43. package/dist/hooks/useApi.d.ts +27 -0
  44. package/dist/hooks/useApi.d.ts.map +1 -0
  45. package/dist/hooks/useApi.js +150 -0
  46. package/dist/hooks/useApiMutation.d.ts +22 -0
  47. package/dist/hooks/useApiMutation.d.ts.map +1 -0
  48. package/dist/hooks/useApiMutation.js +85 -0
  49. package/dist/index.css +1 -1
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +2 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/main.js +1 -1
  55. package/dist/services/apiClient.d.ts +46 -0
  56. package/dist/services/apiClient.d.ts.map +1 -0
  57. package/dist/services/apiClient.js +187 -0
  58. package/package.json +3 -2
@@ -5,6 +5,9 @@ export interface BadgeProps {
5
5
  size?: "sm" | "md" | "lg";
6
6
  rounded?: boolean;
7
7
  className?: string;
8
+ icon?: string;
9
+ iconPosition?: "left" | "right";
10
+ iconLabel?: string;
8
11
  }
9
12
  export declare const Badge: React.FC<BadgeProps>;
10
13
  //# sourceMappingURL=Badge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.d.ts","sourceRoot":"","sources":["../../../src/components/utils/Badge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9E,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CAgDtC,CAAC"}
1
+ {"version":3,"file":"Badge.d.ts","sourceRoot":"","sources":["../../../src/components/utils/Badge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9E,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CAyEtC,CAAC"}
@@ -1,6 +1,6 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from "react";
3
- export const Badge = ({ children, variant = "primary", size = "md", rounded = false, className = "", }) => {
3
+ export const Badge = ({ children, variant = "primary", size = "md", rounded = false, className = "", icon, iconPosition = "left", iconLabel, }) => {
4
4
  const baseClasses = "inline-flex items-center font-medium font-[var(--font-default)]";
5
5
  const variantClasses = {
6
6
  primary: `
@@ -34,6 +34,13 @@ export const Badge = ({ children, variant = "primary", size = "md", rounded = fa
34
34
  lg: "px-3 py-1 text-base",
35
35
  };
36
36
  const roundedClasses = rounded ? "rounded-full" : "rounded-md";
37
- const classes = `${baseClasses} ${variantClasses[variant]} ${sizeClasses[size]} ${roundedClasses} ${className}`;
38
- return _jsx("span", { className: classes, children: children });
37
+ const gapClasses = icon ? "gap-2" : "";
38
+ const iconSizeClasses = size === "sm" ? "text-xs" : size === "md" ? "text-sm" : "text-base";
39
+ const classes = `${baseClasses} ${variantClasses[variant]} ${sizeClasses[size]} ${roundedClasses} ${gapClasses} ${className}`;
40
+ const renderIcon = () => {
41
+ if (!icon)
42
+ return null;
43
+ return (_jsx("i", { className: `fa ${icon} ${iconSizeClasses}`, "aria-hidden": !iconLabel, "aria-label": iconLabel }));
44
+ };
45
+ return (_jsxs("span", { className: classes, children: [icon && iconPosition === "left" && renderIcon(), _jsx("span", { children: children }), icon && iconPosition === "right" && renderIcon()] }));
39
46
  };
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const ApiClientDocs: React.FC;
3
+ export default ApiClientDocs;
4
+ //# sourceMappingURL=ApiClientDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiClientDocs.d.ts","sourceRoot":"","sources":["../../src/docs/ApiClientDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAarD,QAAA,MAAM,aAAa,EAAE,KAAK,CAAC,EAiO1B,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useCallback, useState } from "react";
3
+ import { Badge, Button, Card, Input, useApi, useApiMutation, } from "../index";
4
+ const API_BASE = "https://jsonplaceholder.typicode.com";
5
+ const ApiClientDocs = () => {
6
+ const [postId, setPostId] = useState("1");
7
+ const [formState, setFormState] = useState({
8
+ title: "",
9
+ body: "",
10
+ });
11
+ const { data: postData, loading: loadingPost, error: postError, refetch: refetchPost, } = useApi({
12
+ url: `${API_BASE}/posts/${postId || 1}`,
13
+ method: "get",
14
+ enabled: false,
15
+ queryKey: "docs.posts.detail",
16
+ onError: (error) => {
17
+ console.warn("Example query error", error);
18
+ },
19
+ });
20
+ const { data: createdPost, loading: creatingPost, error: createError, mutateAsync: createPost, reset: resetMutation, } = useApiMutation({
21
+ url: `${API_BASE}/posts`,
22
+ method: "post",
23
+ invalidateKeys: ["docs.posts.detail"],
24
+ onSuccess: () => {
25
+ // Invalidate re-executes the query registered under the same key.
26
+ setFormState({ title: "", body: "" });
27
+ },
28
+ });
29
+ const handleFetchPost = useCallback(() => {
30
+ void refetchPost();
31
+ }, [refetchPost]);
32
+ const handleSubmit = useCallback(async (event) => {
33
+ event.preventDefault();
34
+ try {
35
+ await createPost({
36
+ data: {
37
+ title: formState.title,
38
+ body: formState.body,
39
+ userId: 1,
40
+ },
41
+ });
42
+ }
43
+ catch (error) {
44
+ console.info("Example mutation error", error);
45
+ }
46
+ }, [createPost, formState.body, formState.title]);
47
+ const renderErrorBadge = (error) => {
48
+ if (!error)
49
+ return null;
50
+ return (_jsx(Badge, { variant: "danger", icon: "fa-exclamation-triangle", children: error.message }));
51
+ };
52
+ return (_jsxs("div", { className: "max-w-5xl mx-auto space-y-8", children: [_jsx(Card, { title: "ApiClient - Resumen", children: _jsxs("div", { className: "space-y-4", children: [_jsxs("p", { style: { color: "var(--flysoft-text-secondary)" }, children: ["La capa de networking usa ", _jsx("code", { children: "axios" }), " con interceptores listos para inyectar tokens y normalizar errores en", _jsx("code", { children: "AppApiError" }), ". Importa los estilos con", _jsx("code", { children: "import \"flysoft-react-ui/styles\";" }), " y consume", _jsx("code", { children: "apiClient" }), ",", _jsx("code", { children: "useApi" }), " y ", _jsx("code", { children: "useApiMutation" }), " directamente desde la librer\u00EDa."] }), _jsxs("ul", { className: "list-disc list-inside space-y-2 text-sm", children: [_jsxs("li", { children: ["M\u00E9todos disponibles: ", _jsx("code", { children: "get" }), ", ", _jsx("code", { children: "post" }), ",", _jsx("code", { children: "put" }), ", ", _jsx("code", { children: "delete" }), " y ", _jsx("code", { children: "patch" }), " con opciones tipadas."] }), _jsxs("li", { children: ["Los errores se entregan como ", _jsx("code", { children: "AppApiError" }), " para que los componentes usen badges, alerts u otros patrones ya disponibles sin tocar los hooks."] }), _jsxs("li", { children: ["Usa ", _jsx("code", { children: "setApiClientTokenProvider" }), " para inyectar tokens (placeholder listo para integrarse con tu ThemeProvider o contextos existentes)."] })] })] }) }), _jsx(Card, { title: "Consulta simple con useApi", children: _jsxs("div", { className: "space-y-6", children: [_jsxs("form", { className: "grid grid-cols-1 sm:grid-cols-[1fr_auto] gap-4 items-end", onSubmit: (event) => {
53
+ event.preventDefault();
54
+ handleFetchPost();
55
+ }, children: [_jsx(Input, { label: "ID del post", icon: "fa-hashtag", value: postId, onChange: (event) => setPostId(event.target.value) }), _jsx(Button, { type: "submit", variant: "primary", icon: "fa-search", loading: loadingPost, children: "Consultar" })] }), _jsxs("div", { className: "space-y-3", children: [loadingPost && (_jsx(Badge, { variant: "info", icon: "fa-spinner", className: "animate-pulse", children: "Cargando post..." })), renderErrorBadge(postError), postData && !loadingPost && (_jsx(Card, { title: `Post ${postData.id}`, children: _jsxs("div", { className: "space-y-2", children: [_jsx("h4", { className: "text-lg font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: postData.title }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: postData.body })] }) }))] })] }) }), _jsx(Card, { title: "Mutaci\u00F3n con useApiMutation", children: _jsxs("form", { className: "space-y-6", onSubmit: handleSubmit, children: [_jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [_jsx(Input, { label: "T\u00EDtulo", icon: "fa-heading", value: formState.title, onChange: (event) => setFormState((prev) => ({
56
+ ...prev,
57
+ title: event.target.value,
58
+ })) }), _jsx(Input, { label: "Contenido", icon: "fa-align-left", value: formState.body, onChange: (event) => setFormState((prev) => ({
59
+ ...prev,
60
+ body: event.target.value,
61
+ })) })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [_jsx(Button, { type: "submit", variant: "primary", icon: "fa-paper-plane", loading: creatingPost, children: "Enviar datos" }), _jsx(Button, { type: "button", variant: "outline", icon: "fa-undo", onClick: () => {
62
+ setFormState({ title: "", body: "" });
63
+ resetMutation();
64
+ }, children: "Reiniciar" })] }), _jsxs("div", { className: "space-y-3", children: [creatingPost && (_jsx(Badge, { variant: "info", icon: "fa-spinner", className: "animate-pulse", children: "Enviando..." })), renderErrorBadge(createError), createdPost && !creatingPost && (_jsxs(Badge, { variant: "success", icon: "fa-check-circle", children: ["Post #", createdPost.id, " creado (ejemplo)."] })), _jsxs("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Usa ", _jsx("code", { children: "invalidateKeys" }), " para refrescar queries que hayan sido registradas con ", _jsx("code", { children: "queryKey" }), " en ", _jsx("code", { children: "useApi" }), ". Esto permite mantener badges y alerts sincronizados con el estado de la UI sin alterar los hooks."] })] })] }) })] }));
65
+ };
66
+ export default ApiClientDocs;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const BadgeDocs: React.FC;
3
+ export default BadgeDocs;
4
+ //# sourceMappingURL=BadgeDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BadgeDocs.d.ts","sourceRoot":"","sources":["../../src/docs/BadgeDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAiFtB,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { Badge, Card } from "../index";
4
+ const BadgeDocs = () => {
5
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "Badge - Variantes y Estados", 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: "Variantes" }), _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4", children: [_jsx(Badge, { variant: "primary", children: "Primario" }), _jsx(Badge, { variant: "secondary", children: "Secundario" }), _jsx(Badge, { variant: "success", icon: "fa-check-circle", children: "\u00C9xito" }), _jsx(Badge, { variant: "warning", icon: "fa-exclamation-triangle", children: "Advertencia" }), _jsx(Badge, { variant: "danger", icon: "fa-times-circle", children: "Error" }), _jsx(Badge, { variant: "info", icon: "fa-info-circle", children: "Informaci\u00F3n" })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Tama\u00F1os" }), _jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [_jsx(Badge, { size: "sm", icon: "fa-circle", iconLabel: "Indicador peque\u00F1o", children: "Peque\u00F1o" }), _jsx(Badge, { size: "md", icon: "fa-circle", children: "Mediano" }), _jsx(Badge, { size: "lg", icon: "fa-circle", children: "Grande" })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "\u00CDconos y dise\u00F1o" }), _jsxs("div", { className: "flex flex-wrap gap-3 items-center", children: [_jsx(Badge, { icon: "fa-bell", rounded: true, children: "Notificaci\u00F3n" }), _jsx(Badge, { icon: "fa-arrow-right", iconPosition: "right", children: "Acci\u00F3n" }), _jsx(Badge, { icon: "fa-shield-alt", iconLabel: "Estado protegido", children: "Accesible" })] }), _jsxs("p", { className: "text-sm mt-3", style: { color: "var(--flysoft-text-secondary)" }, children: ["Usa ", _jsx("code", { children: "icon" }), " con clases FontAwesome 5 (ej.", " ", _jsx("code", { children: "fa-check" }), ") y combina ", _jsx("code", { children: "rounded" }), " para badges tipo pills."] })] })] }) }) }));
6
+ };
7
+ export default BadgeDocs;
@@ -1 +1 @@
1
- {"version":3,"file":"DocsMenu.d.ts","sourceRoot":"","sources":["../../src/docs/DocsMenu.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,+CAmBpB,CAAC"}
1
+ {"version":3,"file":"DocsMenu.d.ts","sourceRoot":"","sources":["../../src/docs/DocsMenu.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,+CAyBpB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { Link } from "react-router-dom";
3
3
  export const DocsMenu = () => {
4
- return (_jsx(_Fragment, { children: _jsxs("ul", { children: [_jsx("li", { children: _jsx(Link, { to: "/docs/button", children: "Button" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/card", children: "Card" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/input", children: "Input" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/theme", children: "ThemeSwitcher" }) })] }) }));
4
+ return (_jsx(_Fragment, { children: _jsxs("ul", { children: [_jsx("li", { children: _jsx(Link, { to: "/docs/button", children: "Button" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/badge", children: "Badge" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/card", children: "Card" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/input", children: "Input" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/theme", children: "ThemeSwitcher" }) }), _jsx("li", { children: _jsx(Link, { to: "/docs/api-client", children: "ApiClient" }) })] }) }));
5
5
  };
@@ -1 +1 @@
1
- {"version":3,"file":"DocsRouter.d.ts","sourceRoot":"","sources":["../../src/docs/DocsRouter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAU9B,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"DocsRouter.d.ts","sourceRoot":"","sources":["../../src/docs/DocsRouter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAY9B,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -5,7 +5,9 @@ import ButtonDocs from "./ButtonDocs";
5
5
  import CardDocs from "./CardDocs";
6
6
  import InputDocs from "./InputDocs";
7
7
  import ThemeSwitcherDocs from "./ThemeSwitcherDocs";
8
+ import ApiClientDocs from "./ApiClientDocs";
9
+ import BadgeDocs from "./BadgeDocs";
8
10
  export const DocsRouter = () => {
9
- return (_jsxs(Routes, { children: [_jsx(Route, { path: "", element: _jsx(Navigate, { to: "button", replace: true }) }), _jsx(Route, { path: "button", element: _jsx(ButtonDocs, {}) }), _jsx(Route, { path: "card", element: _jsx(CardDocs, {}) }), _jsx(Route, { path: "input", element: _jsx(InputDocs, {}) }), _jsx(Route, { path: "theme", element: _jsx(ThemeSwitcherDocs, {}) })] }));
11
+ return (_jsxs(Routes, { children: [_jsx(Route, { path: "", element: _jsx(Navigate, { to: "button", replace: true }) }), _jsx(Route, { path: "button", element: _jsx(ButtonDocs, {}) }), _jsx(Route, { path: "badge", element: _jsx(BadgeDocs, {}) }), _jsx(Route, { path: "card", element: _jsx(CardDocs, {}) }), _jsx(Route, { path: "input", element: _jsx(InputDocs, {}) }), _jsx(Route, { path: "theme", element: _jsx(ThemeSwitcherDocs, {}) }), _jsx(Route, { path: "api-client", element: _jsx(ApiClientDocs, {}) })] }));
10
12
  };
11
13
  export default DocsRouter;