# 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