PX
PIXELWAVE
Dithered Design System
v1.0.0 — 2026
WCAG 2.2 AA React CSS Modules Dark Mode
01 — CONTEXT & GOALS

Intención de Diseño

Fundamentos del sistema visual Dithered para PIXELWAVE — analítica social B2B con estética retro-digital.

PIXELWAVE usa la técnica dithered — patrones de puntos que simulan degradados con paleta limitada — para crear una identidad visual que evoca la nostalgia de los sistemas de 8 bits, aplicada sobre una interfaz funcional y accesible. El resultado es un dashboard de analítica que se siente auténtico, no genérico.
Objetivo visual

Usar el patrón de puntos como elemento de textura — no decoración — en fondos, estados hover, barras de progreso y zonas de énfasis. Paleta de 7 colores máximo.

Objetivo técnico

Todas las texturas dithered mediante CSS puro (radial-gradient + background-size). Cero assets externos. Bundle ligero. Compatible con React + CSS Modules.

Objetivo de accesibilidad

WCAG 2.2 AA como mínimo no negociable. La textura de puntos jamás reduce el contraste de texto por debajo de 4.5:1. Focus visible siempre activo.

02 — DESIGN TOKENS

Tokens y Fundamentos

Los tokens son la fuente única de verdad. Nunca usar valores raw en componentes.

Paleta de color

#3B82F6
Primary
--primary
#8B5CF6
Secondary
--secondary
#16A34A
Success
--success
#D97706
Warning
--warning
#DC2626
Danger
--danger
#0D0D0D
Surface
--surface
#141414
Surface 2
--surface-2
#F0F0F0
Text
--text
#888888
Text Muted
--text-muted

Escala de espaciado

--sp-1
4px
--sp-2
8px
--sp-3
12px
--sp-4
16px
--sp-6
24px
--sp-8
32px

CSS Custom Properties

/* tokens.css — fuente única de verdad */ :root { /* Color */ --primary: #3B82F6; --secondary: #8B5CF6; --success: #16A34A; --warning: #D97706; --danger: #DC2626; /* Surface */ --surface: #0D0D0D; --surface-2: #141414; --surface-3: #1A1A1A; /* Text */ --text: #F0F0F0; --text-muted: #888888; /* Spacing scale */ --sp-1: 4px; --sp-2: 8px; --sp-3: 12px; --sp-4: 16px; --sp-6: 24px; --sp-8: 32px; /* Dither utility */ --dither-dots: radial-gradient(circle, rgba(255,255,255,0.06) 1px, transparent 1px); --dither-size: 20px 20px; }
03 — TYPOGRAPHY

Tipografía

Tres familias: display para títulos, sans para cuerpo, mono para datos y código.

display-xl
Space Grotesk 700 / 40px
Analítica Social
display-lg
Space Grotesk 700 / 32px
PIXELWAVE Dashboard
heading-md
Space Grotesk 600 / 24px
Métricas de Engagement
body-lg
Open Sans 400 / 18px
Tus publicaciones alcanzaron 48K impresiones esta semana.
body-md
Open Sans 400 / 16px
El engagement rate subió un 12% respecto a la semana anterior.
body-sm
Open Sans 400 / 14px
Última actualización: hace 3 minutos
label-caps
IBM Plex Mono 500 / 11px
TOTAL IMPRESIONES · SEMANA 24
data-value
IBM Plex Mono 400 / 13px
48,291 — +12.4% — CTR: 3.7%
04 — COMPONENTS

Componentes

Anatomía, variantes y estados de cada componente del sistema.

Botones

Variantes
Tamaños
Estado deshabilitado
/* Button — regla de área mínima táctil: 44×44px */ .btn { min-height: 36px; padding: var(--sp-2) var(--sp-4); /* 8px 16px */ font-family: var(--font-sans); font-weight: 600; /* Dither hover overlay */ &::before { background-image: radial-gradient(circle, rgba(255,255,255,0.12) 1px, transparent 1px); background-size: 4px 4px; } }

Badges de estado

Publicado Programado Error En revisión Borrador

Alertas del sistema

Actualización disponible
Hay datos nuevos para Instagram desde hace 15 minutos. Actualiza para ver las métricas al día.
Informe exportado
Tu informe semanal se ha enviado a alvarogimeno@agencia.es correctamente.
Token de API próximo a expirar
El token de Facebook Ads caduca en 3 días. Renuévalo antes para evitar interrupciones.
Error de sincronización
No se pudo conectar con la API de TikTok. Verifica las credenciales en Ajustes > Integraciones.

Campos de formulario

Filtra métricas por canal específico.
ERROR: nombre duplicado. Elige otro identificador.
Recibirás el informe cada lunes a las 9:00.

Tarjetas de métricas (Dashboard)

👁 Impresiones
48.2K
↑ +12.4% vs sem. ant.
Engagement
3.7%
↑ +0.4pp vs sem. ant.
🔗 Clicks
1,847
↓ -3.1% vs sem. ant.
👥 Seguidores
12.9K
↑ +241 esta semana
05 — DITHER PATTERNS

Patrones Dithered

Texturas CSS puras. Nunca imágenes externas. Usar como fondos de énfasis, no como decoración arbitraria.

dither-dots — base
Fondo de página principal
dither-dense — hover / énfasis
Estado hover de tarjetas
dither-checker — superficies 2
Fondos de modales / drawers
dither-purple — accent zone
Zonas CTA / upsell premium
dither-success — confirmación
Fondos de estado éxito
dither-danger — alerta crítica
Fondos de estado error
06 — ACCESSIBILITY

Accesibilidad WCAG 2.2 AA

Criterios de contraste y focus testables en code review.

Ratios de contraste

Texto principal
17.5:1
--text sobre --surface
AA PASS
Texto muted
5.2:1
--text-muted sobre --surface
AA PASS
Botón primario
4.6:1
#fff sobre --primary
AA PASS
Botón secondary
5.1:1
#fff sobre --secondary
AA PASS
Placeholder
2.8:1
--text-dim sobre --surface-2 (solo placeholders, no contenido)
AA FAIL (ok en placeholder)

Estados de foco visibles

Implementación obligatoria — outline 2px offset 2px
/* Regla de foco — obligatoria en TODOS los elementos interactivos */ :focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; box-shadow: 0 0 0 4px rgba(59,130,246,0.15); } /* NUNCA: outline: none sin reemplazo visual */

Tabla de criterios testables

Criterio WCAG Nivel Implementación requerida Testeable con
1.4.3 Contrast (Minimum) AA Ratio ≥ 4.5:1 para texto <18pt axe-core, Colour Contrast Analyser
2.4.7 Focus Visible AA outline en :focus-visible siempre visible Tab manual, axe-core
2.5.8 Target Size AA 2.2 Área clicable ≥ 24×24px; recomendado 44×44px DevTools > computed styles
1.4.11 Non-text Contrast AA Bordes de inputs con ratio ≥ 3:1 vs fondo Inspector visual, axe-core
4.1.2 Name, Role, Value AA aria-label en iconos sin texto visible NVDA / VoiceOver smoke test
07 — ANTI-PATTERNS

Patrones Prohibidos

Implementaciones incorrectas más comunes. Cada una incluye la alternativa correcta.

✕ NO — Bajo contraste de texto
Ejemplo incorrecto
Texto con ratio 1.8:1

Nunca usar --text-dim (#555) para contenido lector. Solo para placeholders de inputs.

✓ SÍ — Contraste mínimo 4.5:1
Alternativa correcta
Texto con ratio 17.5:1

Usar --text (#F0F0F0) para contenido. --text-muted (#888) solo para metadatos secundarios.

✕ NO — Dither sobre texto
Ejemplo incorrecto
Texto ilegible con patrón encima

Nunca poner la textura dithered con z-index superior al texto ni con opacidad >0.08 sobre áreas de contenido.

✓ SÍ — Dither solo en fondos
Alternativa correcta
Texto perfectamente legible

Textura siempre pointer-events:none y opacity máx 0.06 en áreas con texto.

✕ NO — Área táctil insuficiente
Ejemplo incorrecto

Botones con padding 2px 4px — área real ~20×18px, imposible de pulsar con precisión en móvil.

✓ SÍ — Mínimo 44×44px táctil
Alternativa correcta

Padding 8px 18px con min-height 44px. El área de golpe excede los 24×24px mínimos de WCAG 2.2.

08 — QA CHECKLIST

Checklist de Code Review

Ejecutar en cada PR que modifique componentes o estilos visuales.

Visual & Tokens

  • Sin valores raw de color en componentes. Todos los colores referenciados via var(--token).
    grep-able
  • Espaciado usando escala 4/8/12/16/24/32. No valores intermedios (ej. 10px, 15px).
    visual
  • Textura dithered tiene pointer-events:none y no superpone áreas de texto con opacidad >0.08.
    code
  • Box-shadow con offset pixelado (ej. 3px 3px 0) en botones y tarjetas interactivas.
    visual
  • font-family referencia tokens. No Google Fonts inline en componentes individuales.
    code

Accesibilidad

  • Ratio de contraste verificado con axe-core. Cero violaciones de nivel AA.
    axe-core
  • focus-visible visible en todos los interactivos. Nunca outline:none sin alternativa.
    tab manual
  • Área táctil ≥ 44×44px en botones, links e iconos interactivos.
    devtools
  • Iconos sin texto tienen aria-label. Mensajes de error tienen role="alert".
    screen-reader
  • No motion decorativo sin prefers-reduced-motion. Transiciones <300ms.
    css

Componentes

  • Estados definidos: default, hover, focus, active, disabled. Loading y error donde aplique.
    storybook
  • Responsive probado en 320px, 768px, 1280px. No overflow horizontal.
    responsive
  • Estados vacíos y de carga definidos con skeleton o placeholder coherente.
    ux
  • Labels no ambiguos. Botones con verbo de acción claro (no "Ok", "Click aquí").
    copy

Migración

  • Componentes legacy actualizados en mismo PR si el cambio afecta a su patrón base.
    refactor
  • Sin duplicación de patrones dithered. Usar clases utilitarias del design system.
    dry
  • Changelog actualizado con token o componente nuevo/modificado y motivo.
    docs
  • Sin assets de imagen para texturas. Todo dithering via CSS radial-gradient.
    performance