Ir al contenido

Sistema visual

El sistema visual es Onyx + Champagne: una paleta seria, premium y neutral que no compite con la iconografía de las franquicias TCG. No usamos colores vibrantes de marca (rojo Pokémon, azul Magic, etc.) — el sitio es neutral porque es multi-TCG.

Reglas firmes:

  • Todo nuevo componente soporta dark y light desde el primer commit (no son una feature posterior).
  • Cero hex hardcoded en JSX/TSX/CSS fuera de los archivos de emails. Siempre usar tokens.
  • Color space: OKLCH (no HSL ni RGB), para uniformidad perceptual entre modos.

Definida en src/app/globals.css. Usar siempre las variables CSS (var(--primary)) o las clases Tailwind generadas (bg-primary, text-foreground, etc.).

TokenValor (OKLCH)Uso
--background0.99 0.005 80Fondo de página
--foreground0.18 0.01 280Texto principal (onyx)
--card1.00 0 0Fondo de cards
--card-foreground0.18 0.01 280Texto sobre cards
--muted0.96 0.008 80Fondo neutro secundario
--muted-foreground0.50 0.01 280Texto secundario
--primary0.74 0.10 80Champagne — acción principal
--primary-foreground0.18 0.01 280Texto sobre primary
--accent0.93 0.04 80Hover/realce sutil
--secondary0.96 0.008 80Acción secundaria
--border0.92 0.005 80Líneas y separadores
--ring0.74 0.10 80Focus ring
TokenValor (OKLCH)Notas
--background0.13 0.005 280Fondo oscuro azulado-onyx
--foreground0.96 0.005 80Casi blanco champagne
--card0.16 0.005 280Card un poco más claro que bg
--muted-foreground0.78 0.01 280Subido desde 0.68 para contraste 6.5:1 sobre card
--primary0.78 0.10 80Champagne más luminoso
--accent0.30 0.05 80Realce oscuro

El muted-foreground en dark se ajustó intencionalmente para pasar WCAG AA. No bajar de 0.78 sin verificar contraste.

Cuatro estados con foreground propio para garantizar contraste:

TokenLightDarkUso
--successverde 145°verde luminosoConfirmaciones, badges OK
--warningámbar 70°ámbar luminosoAvisos, badges pendientes
--destructiverojo 25°rojo luminosoErrores, eliminación
--infoazul 240°azul luminosoInformación neutral

Cada uno tiene su *-foreground correspondiente (siempre usarlo cuando se usa el de fondo).

Tres familias de fuente declaradas en src/app/layout.tsx:

Variable CSSFamiliaUso
--font-sansInterTexto general, párrafos, UI
--font-displayFraunces (500/600/700)Headings de marketing y títulos grandes
--font-monoGeist MonoCódigo, IDs, precios técnicos

En Tailwind:

  • font-sans → Inter (default del body)
  • font-display → Fraunces (usar para <h1> de páginas hero, no para todos los headings)
  • font-mono → Geist Mono

Fraunces tiene display: swap para no bloquear render. Inter es default.

Base: --radius: 0.625rem (10px). Todos derivan de aquí:

TokenCálculoAproximado
--radius-smradius * 0.66px
--radius-mdradius * 0.88px
--radius-lgradius * 1.010px (default)
--radius-xlradius * 1.414px
--radius-2xlradius * 1.818px
--radius-3xlradius * 2.222px
--radius-4xlradius * 2.626px

Si en el futuro queremos un look más cuadrado o más redondeado, basta cambiar --radius y toda la escala se ajusta.

Una sola sombra custom: --shadow-premium.

ModoValor
Light0 1px 2px 0 rgb(20 20 25 / 0.04), 0 4px 12px -2px rgb(20 20 25 / 0.06)
Dark0 1px 2px 0 rgb(0 0 0 / 0.4), 0 4px 16px -2px rgb(232 196 128 / 0.06)

Uso: cards destacados (shadow-premium en Tailwind). En dark tiene un glow champagne sutil.

Para sombras genéricas, usar las de Tailwind (shadow-sm, shadow-md).

Cinco colores alineados a la paleta (para charts si se agregan):

  • --chart-1 → primary (champagne)
  • --chart-2 → muted-foreground (gris)
  • --chart-3 → success (verde)
  • --chart-4 → warning (ámbar)
  • --chart-5 → info (azul)

Variantes propias --sidebar-* para layouts con sidebar (admin, dashboard). Mismos tonos pero ligeramente diferenciados del background general para crear jerarquía visual.

  • src/app/globals.css — definición de tokens (light + dark)
  • src/app/layout.tsx — declaración de fuentes Next.js
  • components.json — config shadcn (style radix-nova, base neutral)