# Guía de Componentes UI **Versión:** 1.0.0 **Última Actualización:** 2025-11-28 **Aplica a:** apps/frontend/src/shared/components/ui/ --- ## Resumen GAMILIT utiliza una librería de componentes UI propios construidos sobre Tailwind CSS y Radix UI primitives. Esta guía documenta los componentes disponibles y cómo utilizarlos. --- ## Stack de UI - **Tailwind CSS**: Estilos utilitarios - **Radix UI**: Primitivos accesibles (Dialog, Dropdown, etc.) - **CVA (class-variance-authority)**: Variantes de componentes - **Lucide Icons**: Iconografía - **Sonner**: Toasts/Notificaciones --- ## Componentes Base ### Button ```typescript import { Button } from '@/shared/components/ui'; // Variantes // Tamaños // Estados // Con icono ``` ### Input ```typescript import { Input } from '@/shared/components/ui'; // Básico // Con label
// Con error // Variantes // Iconos } placeholder="Buscar..." /> } type="password" /> ``` ### Card ```typescript import { Card, CardHeader, CardBody, CardFooter } from '@/shared/components/ui';

Título de la tarjeta

Contenido de la tarjeta...
// Variantes Con sombra Con borde Fondo sólido // Interactiva Tarjeta clickeable ``` ### Badge ```typescript import { Badge } from '@/shared/components/ui'; // Colores Default Completado Pendiente Error Nuevo // Tamaños Pequeño Mediano // Con ícono Premium ``` ### Avatar ```typescript import { Avatar, AvatarGroup } from '@/shared/components/ui'; // Básico // Fallback con iniciales // Tamaños {/* 32px */} {/* 40px */} {/* 56px */} // Grupo de avatares {/* +1 */} ``` --- ## Componentes de Formulario ### Select ```typescript import { Select, SelectOption } from '@/shared/components/ui'; ``` ### Checkbox ```typescript import { Checkbox } from '@/shared/components/ui'; // Sin label ``` ### Switch ```typescript import { Switch } from '@/shared/components/ui'; ``` ### Form Field ```typescript import { FormField, Input, FormError, FormHelper } from '@/shared/components/ui'; Usaremos este email para contactarte {errors.email && {errors.email.message}} ``` --- ## Componentes de Feedback ### Modal / Dialog ```typescript import { Modal, ModalHeader, ModalBody, ModalFooter } from '@/shared/components/ui'; const [isOpen, setIsOpen] = useState(false); setIsOpen(false)}>

Confirmar acción

¿Estás seguro de que deseas continuar?
``` ### Toast ```typescript import { toast } from 'sonner'; // Éxito toast.success('Guardado correctamente'); // Error toast.error('Ocurrió un error'); // Info toast.info('Nueva notificación'); // Con acción toast('Archivo eliminado', { action: { label: 'Deshacer', onClick: () => undoDelete(), }, }); // Promesa toast.promise(saveData(), { loading: 'Guardando...', success: 'Guardado', error: 'Error al guardar', }); ``` ### LoadingSpinner ```typescript import { LoadingSpinner } from '@/shared/components/ui'; // Básico // Tamaños // Centrado en página
``` ### EmptyState ```typescript import { EmptyState } from '@/shared/components/ui'; } title="No hay resultados" description="No encontramos ejercicios que coincidan con tu búsqueda" action={ } /> ``` --- ## Componentes de Navegación ### Tabs ```typescript import { Tabs, TabList, Tab, TabPanel } from '@/shared/components/ui'; General Avanzado Configuración Contenido de General Contenido de Avanzado Contenido de Configuración ``` ### Dropdown ```typescript import { Dropdown, DropdownTrigger, DropdownContent, DropdownItem } from '@/shared/components/ui'; Editar Duplicar Eliminar ``` ### Pagination ```typescript import { Pagination } from '@/shared/components/ui'; ``` --- ## Componentes de Datos ### Table ```typescript import { Table, TableHead, TableBody, TableRow, TableCell } from '@/shared/components/ui'; Nombre Email Rol Acciones {users.map((user) => ( {user.name} {user.email} {user.role} ))}
``` ### Progress Bar ```typescript import { Progress } from '@/shared/components/ui'; // Básico // Con label // Colores // XP Progress (específico de GAMILIT) ``` --- ## Componentes de GAMILIT ### RankBadge ```typescript import { RankBadge } from '@/features/gamification'; ``` ### MlCoinsDisplay ```typescript import { MlCoinsDisplay } from '@/features/gamification'; // Animación al cambiar ``` ### AchievementCard ```typescript import { AchievementCard } from '@/features/gamification'; ``` --- ## Theming ### Variables CSS ```css /* shared/styles/variables.css */ :root { --color-primary: #3b82f6; --color-primary-dark: #2563eb; --color-secondary: #8b5cf6; --color-success: #22c55e; --color-warning: #f59e0b; --color-danger: #ef4444; --radius-sm: 0.25rem; --radius-md: 0.5rem; --radius-lg: 0.75rem; } ``` ### Tailwind Config ```javascript // tailwind.config.js module.exports = { theme: { extend: { colors: { primary: 'var(--color-primary)', 'primary-dark': 'var(--color-primary-dark)', secondary: 'var(--color-secondary)', }, }, }, }; ``` --- ## Buenas Prácticas 1. **Usar componentes base**: No reinventar la rueda 2. **Props consistentes**: Mismos nombres en todos los componentes 3. **Variantes con CVA**: Para componentes con múltiples estilos 4. **Accesibilidad**: Usar ARIA labels y keyboard navigation 5. **Composición**: Preferir composición sobre props complejas 6. **Documentar**: Storybook para documentación visual --- ## Ver También - [ESTRUCTURA-SHARED.md](./ESTRUCTURA-SHARED.md) - Ubicación de componentes - [STATE-MANAGEMENT.md](./STATE-MANAGEMENT.md) - Estado en componentes