# Guía de Desarrollo - Sistema de Temas
## Introducción
Esta guía está dirigida a desarrolladores que trabajan en Analítica Núcleo y necesitan entender cómo funciona el sistema de temas y cómo mantener la consistencia visual en toda la aplicación.
## Principios Fundamentales
### 1. Siempre Usa Variables CSS
**✅ CORRECTO:**
```vue
Contenido
```
**❌ INCORRECTO:**
```vue
Contenido
```
**❌ INCORRECTO:**
```vue
Contenido
```
### 2. Usa las Clases Utilitarias de Marca
Para elementos comunes, usa las clases predefinidas en lugar de duplicar estilos:
```vue
Título
Título
```
## Variables de Tema Disponibles
| Variable CSS | Uso | Ejemplo |
|--------------|-----|---------|
| `--brand-bg` | Fondo principal de la aplicación | `bg-[var(--brand-bg)]` |
| `--brand-surface` | Fondos de elementos elevados (cards, modales) | `bg-[var(--brand-surface)]` |
| `--brand-border` | Bordes de elementos | `border-[var(--brand-border)]` |
| `--brand-primary` | Color principal (enlaces, botones) | `text-[var(--brand-primary)]` |
| `--brand-primary-strong` | Variante más intensa del primario | `bg-[var(--brand-primary-strong)]` |
| `--brand-accent` | Color de acento para highlights | `text-[var(--brand-accent)]` |
| `--brand-text` | Texto principal | `text-[var(--brand-text)]` |
| `--brand-text-muted` | Texto secundario/menos prominente | `text-[var(--brand-text-muted)]` |
## Clases Utilitarias de Marca
### `.brand-shell`
Contenedor principal para layouts con gradiente radial.
```vue
```
### `.brand-card`
Tarjetas con estilos consistentes.
```vue
Título de la Card
Contenido
```
### `.brand-divider`
Divisor horizontal decorativo.
```vue
```
### `.brand-chip` y `.brand-pill`
Para pequeños tags o badges.
```vue
EstadoBadge
```
### `.brand-table`
Estilos para tablas.
```vue
```
## Patrones de Uso Común
### Cards con Bordes y Sombras
```vue
Título
Descripción del contenido
```
### Botones con Hover Personalizado
```vue
```
### Inputs y Formularios
```vue
```
### Links con Hover
```vue
Ver perfil →
```
### Personalización de Componentes Nuxt UI
Muchos componentes de Nuxt UI aceptan la prop `:ui` para personalización:
```vue
Botón Personalizado
```
## Composable `useTheme()`
Para manipular el tema programáticamente, usa el composable `useTheme()`:
```vue
```
## Checklist Pre-Commit
Antes de hacer commit de tu código, verifica:
- [ ] **No hay colores hardcoded** (`#ffffff`, `#000000`, etc.)
- [ ] **No hay clases gray-scale genéricas** (`bg-gray-900`, `text-gray-500`, etc.)
- [ ] **Todos los fondos usan** `--brand-bg` o `--brand-surface`
- [ ] **Todos los bordes usan** `--brand-border`
- [ ] **Todo el texto usa** `--brand-text` o `--brand-text-muted`
- [ ] **Los elementos interactivos usan** `--brand-primary` o `--brand-accent`
- [ ] **Los hover states usan transparencias** (ej: `hover:bg-[var(--brand-primary)]/10`)
- [ ] **Se usan clases utilitarias** cuando sea posible (`.brand-card`, `.brand-shell`, etc.)
## Casos Especiales
### Colores Semánticos (Success, Error, Warning)
Para colores que NO son parte del tema (éxito, error, advertencia), puedes usar colores de Tailwind:
```vue
Éxito
Error
Advertencia
Info
Operación exitosa
```
### Iconos
Los iconos deben usar colores del tema:
```vue
```
### Imágenes y Avatares con Bordes
```vue
```
### Hover y Focus States
Siempre usa transparencias para hover states para que funcionen con cualquier tema:
```vue
```
## Ejemplos de Migración
### Antes (Incorrecto)
```vue
Título
Descripción
```
### Después (Correcto)
```vue
Título
Descripción
Acción
```
## Errores Comunes y Soluciones
### Error 1: Mezclar Variables con Hardcoded Colors
**❌ No hagas esto:**
```vue
Contenido
```
**✅ Haz esto:**
```vue
Contenido
```
### Error 2: No Considerar el Contraste
Asegúrate de que el texto tenga suficiente contraste sobre su fondo:
**❌ Mal contraste:**
```vue
Texto importante
```
**✅ Buen contraste:**
```vue
Texto importante
```
### Error 3: Duplicar Estilos en Lugar de Usar Clases
**❌ Duplicación:**
```vue
Card 1
Card 2
```
**✅ Reutilización:**
```vue
Card 1
Card 2
```
## Testing del Tema
Para probar que tu componente respeta el tema:
1. Ve a `/settings`
2. Cambia el tema a "Azul Corporativo" o "Verde Natural"
3. Navega a tu componente
4. Verifica que todos los colores cambien correctamente
5. Verifica que no haya elementos con colores hardcoded que no cambiaron
## Recursos Adicionales
- **Documentación del usuario:** `THEME_CUSTOMIZATION.md`
- **Composable de temas:** `app/composables/useTheme.ts`
- **Variables CSS:** `app/assets/css/main.css`
- **Configuración de Nuxt UI:** `app.config.ts`
## Preguntas Frecuentes
### ¿Puedo usar colores de Tailwind como `bg-blue-500`?
Solo para estados semánticos (éxito, error, advertencia) que NO forman parte del tema. Para todo lo demás, usa las variables de tema.
### ¿Cómo personalizo un componente de Nuxt UI?
Usa la prop `:ui` con las variables de tema:
```vue
Contenido
```
### ¿Qué hago si necesito un color que no está en el tema?
Primero pregunta: ¿realmente necesito un color nuevo, o puedo usar uno existente? Si es absolutamente necesario, propón agregar una nueva variable al sistema de temas en lugar de hardcodear el color.
### ¿Cómo manejo dark mode?
No necesitas manejarlo manualmente. Las variables CSS ya están optimizadas para dark mode. Solo usa las variables y funcionará automáticamente.
---
**Última actualización:** 2025-10-30
**Mantenedor:** Claude Code para Núcleo Río Frío
**Versión:** 1.0.0