# Sistema de Temas - Analítica Núcleo > **Documentación definitiva del sistema de temas personalizable** > Versión: 2.0 | Última actualización: 2025-10-30 ## Índice 1. [Introducción](#introducción) 2. [Arquitectura del Sistema](#arquitectura-del-sistema) 3. [Variables CSS Disponibles](#variables-css-disponibles) 4. [Reglas de Uso Obligatorias](#reglas-de-uso-obligatorias) 5. [Clases Utilitarias](#clases-utilitarias) 6. [Composable useTheme()](#composable-usetheme) 7. [Ejemplos de Uso](#ejemplos-de-uso) 8. [Integración con Nuxt UI](#integración-con-nuxt-ui) 9. [Casos Especiales](#casos-especiales) 10. [Troubleshooting](#troubleshooting) --- ## Introducción Analítica Núcleo cuenta con un sistema de temas completamente dinámico que permite personalizar todos los colores de la interfaz en tiempo real. Los cambios se aplican instantáneamente a todos los componentes de la aplicación. **Características principales:** - ✅ 8 variables de color personalizables - ✅ 4 temas predefinidos (Café, Azul, Verde, Carbón) - ✅ Persistencia en localStorage - ✅ Vista previa en tiempo real - ✅ Exportar/importar temas en JSON - ✅ Integración completa con Nuxt UI --- ## Arquitectura del Sistema ### Flujo de Datos ``` Usuario modifica tema en /settings ↓ useTheme() composable ↓ Actualiza variables CSS (--brand-*) ↓ Variables --ui-color-neutral-* mapeadas automáticamente ↓ Todos los componentes se actualizan instantáneamente ``` ### Archivos Clave | Archivo | Propósito | |---------|-----------| | `app/assets/css/main.css` | Definición de variables CSS y clases utilitarias | | `app/composables/useTheme.ts` | Lógica del sistema de temas | | `app/pages/settings.vue` | Interfaz de configuración | --- ## Variables CSS Disponibles ### Variables Base (`--brand-*`) Estas variables controlan la apariencia general de la aplicación: | Variable | Uso | Ejemplo de valor | |----------|-----|------------------| | `--brand-bg` | Fondo principal de la app | `#14100b` | | `--brand-surface` | Fondos de cards, modales, elementos elevados | `#1f180f` | | `--brand-border` | Bordes de todos los elementos | `#3a2a16` | | `--brand-primary` | Color principal para enlaces, títulos destacados | `#e0c080` | | `--brand-primary-strong` | Variante más intensa del primario | `#c08040` | | `--brand-accent` | Highlights, elementos de énfasis | `#ffe0a0` | | `--brand-text` | Texto principal (alta legibilidad) | `#fef9f0` | | `--brand-text-muted` | Texto secundario, descripciones | `#d8c7a6` | ### Variables de Tipos de Café (`--coffee-*`) Estas variables se usan para identificar visualmente los tipos de café en gráficas y tablas: | Variable | Uso | Ejemplo de valor | |----------|-----|------------------| | `--coffee-uva` | Color de identificación para Café Uva | `#a855f7` (Purple) | | `--coffee-oreado` | Color de identificación para Café Oreado | `#f97316` (Orange) | | `--coffee-mojado` | Color de identificación para Café Mojado | `#06b6d4` (Cyan) | | `--coffee-verde` | Color de identificación para Café Verde | `#22c55e` (Green) | ### Variables de Estados (`--status-*`) Estas variables se usan para indicar estados de pago en tablas y badges: | Variable | Uso | Ejemplo de valor | |----------|-----|------------------| | `--status-pendiente` | Estado de pago pendiente | `#f59e0b` (Amber) | | `--status-pagado` | Estado pagado completamente | `#10b981` (Emerald) | | `--status-anulado` | Estado anulado o cancelado | `#6b7280` (Gray) | ### Variables de Nuxt UI (`--ui-color-neutral-*`) ⚠️ **NO uses estas variables directamente**. Están mapeadas automáticamente a `--brand-*` en `main.css`. **Mapeo actual (NO modificar):** ```css --ui-color-neutral-50: var(--brand-text); /* Texto más claro */ --ui-color-neutral-100: var(--brand-text-muted); /* Texto secundario */ --ui-color-neutral-200: var(--brand-primary); /* Primario claro */ --ui-color-neutral-300: var(--brand-primary); /* Primario */ --ui-color-neutral-400: var(--brand-primary-strong); /* Primario fuerte */ --ui-color-neutral-500: var(--brand-border); /* Bordes */ --ui-color-neutral-600: var(--brand-border); /* Bordes */ --ui-color-neutral-700: var(--brand-surface); /* Surface */ --ui-color-neutral-800: var(--brand-surface); /* Surface */ --ui-color-neutral-900: var(--brand-bg); /* Fondo más oscuro */ --ui-color-neutral-950: var(--brand-bg); /* Fondo */ ``` > **IMPORTANTE:** Nuxt UI usa la escala neutral de forma invertida en dark mode: > - `neutral-50/100` → Colores claros (texto) > - `neutral-900/950` → Colores oscuros (fondos) --- ## Reglas de Uso Obligatorias ### ✅ SIEMPRE Hacer 1. **Usar variables CSS en lugar de colores hardcoded:** ```vue
Contenido
``` 2. **Usar clases utilitarias cuando existan:** ```vue

Título

``` 3. **Usar transparencias para hover states:** ```vue ``` ### ❌ NUNCA Hacer 1. **NO usar colores hardcoded:** ```vue
Contenido
``` 2. **NO usar clases gray-scale genéricas:** ```vue
Contenido
``` 3. **NO mezclar variables con hardcoded:** ```vue
Contenido
``` --- ## Clases Utilitarias ### `.brand-shell` Contenedor principal con gradiente radial. ```vue
``` ### `.brand-card` Tarjetas con estilos consistentes (gradiente, borde, sombra). ```vue

Título

Contenido

``` ### `.brand-divider` Divisor horizontal decorativo. ```vue
``` ### `.brand-section-title` Títulos de sección con color primario. ```vue

Mi Sección

``` ### `.brand-chip` / `.brand-pill` Tags o badges pequeños. ```vue Estado Badge ``` ### `.brand-badge` Badge con fondo primario sólido. ```vue 3 ``` ### `.brand-table` Estilos para tablas. ```vue ......
``` --- ## Composable useTheme() ### Importar ```typescript const { theme, applyTheme, saveTheme, resetTheme, exportTheme, importTheme } = useTheme() ``` ### API #### `theme` (Ref) Estado reactivo del tema actual. ```typescript interface ThemeColors { bg: string surface: string border: string primary: string primaryStrong: string accent: string text: string textMuted: string } ``` #### `applyTheme(newTheme?: ThemeColors)` Aplica el tema a las variables CSS del DOM. ```typescript applyTheme() // Aplica theme.value actual applyTheme(customTheme) // Aplica un tema personalizado ``` #### `saveTheme()` Guarda el tema actual en localStorage. ```typescript const success = saveTheme() if (success) { console.log('Tema guardado') } ``` #### `resetTheme()` Resetea al tema por defecto (Café). ```typescript resetTheme() ``` #### `exportTheme()` Exporta el tema actual como JSON string. ```typescript const jsonTheme = exportTheme() await navigator.clipboard.writeText(jsonTheme) ``` #### `importTheme(jsonString: string, autoSave: boolean = false)` Importa un tema desde JSON string. ```typescript const success = importTheme(jsonString, true) // true = guardar automáticamente ``` --- ## Ejemplos de Uso ### Ejemplo 1: Card Básica ```vue ``` ### Ejemplo 2: Botón con Hover ```vue ``` ### Ejemplo 3: Input Personalizado ```vue ``` ### Ejemplo 4: Link con Hover ```vue ``` ### Ejemplo 5: Iconos ```vue ``` ### Ejemplo 6: Manipular Tema Programáticamente ```vue ``` ### Ejemplo 7: Usar Colores de Tipos de Café ```vue ``` ### Ejemplo 8: Usar Colores de Estados ```vue ``` --- ## Integración con Nuxt UI ### Componentes que Respetan el Tema Automáticamente Los siguientes componentes de Nuxt UI **NO necesitan customización** porque usan `--ui-color-neutral-*` internamente: - `UButton` (con `color="neutral"`) - `UBadge` (con `color="neutral"`) - `UInput` (parcialmente) - `UTextarea` (parcialmente) - `USelect` (parcialmente) - Componentes de navegación (sidebar, navbar) ### Componentes que Necesitan `:ui` Prop Para estos componentes, debes especificar colores explícitamente: #### UCard ```vue ``` #### UModal ```vue ``` #### UDropdown ```vue ``` --- ## Casos Especiales ### Colores Semánticos (Success, Error, Warning) Para estados semánticos, **SÍ puedes usar colores fijos de Tailwind** porque no forman parte del tema personalizable: ```vue ``` ### Imágenes y Avatares ```vue ``` ### Gradientes ```vue ``` --- ## Troubleshooting ### Problema 1: Texto Invisible **Síntoma:** El texto no se ve en algunos componentes. **Causa:** Estás usando un color de fondo donde debería ir un color de texto. **Solución:** ```vue
``` ### Problema 2: Componentes No Cambian con el Tema **Síntoma:** Algunos componentes mantienen colores fijos cuando cambias de tema. **Causa:** Estás usando colores hardcoded o clases gray-scale. **Solución:** Reemplaza todos los colores fijos con variables `--brand-*`. ### Problema 3: UCard con Fondo Incorrecto **Síntoma:** UCard tiene un fondo que no corresponde al tema. **Causa:** Falta especificar la prop `:ui`. **Solución:** ```vue ``` ### Problema 4: Hover No Se Ve **Síntoma:** Los hover effects no son visibles. **Causa:** Estás usando colores sólidos en lugar de transparencias. **Solución:** ```vue