Intención de Diseño
Fundamentos del sistema visual Dithered para PIXELWAVE — analítica social B2B con estética retro-digital.
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.
Todas las texturas dithered mediante CSS puro (radial-gradient + background-size). Cero assets externos. Bundle ligero. Compatible con React + CSS Modules.
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.
Tokens y Fundamentos
Los tokens son la fuente única de verdad. Nunca usar valores raw en componentes.
Paleta de color
Escala de espaciado
CSS Custom Properties
Tipografía
Tres familias: display para títulos, sans para cuerpo, mono para datos y código.
Componentes
Anatomía, variantes y estados de cada componente del sistema.
Botones
Badges de estado
Alertas del sistema
Campos de formulario
Tarjetas de métricas (Dashboard)
Patrones Dithered
Texturas CSS puras. Nunca imágenes externas. Usar como fondos de énfasis, no como decoración arbitraria.
Accesibilidad WCAG 2.2 AA
Criterios de contraste y focus testables en code review.
Ratios de contraste
Estados de foco visibles
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 |
Patrones Prohibidos
Implementaciones incorrectas más comunes. Cada una incluye la alternativa correcta.
Nunca usar --text-dim (#555) para contenido lector. Solo para placeholders de inputs.
Usar --text (#F0F0F0) para contenido. --text-muted (#888) solo para metadatos secundarios.
Nunca poner la textura dithered con z-index superior al texto ni con opacidad >0.08 sobre áreas de contenido.
Textura siempre pointer-events:none y opacity máx 0.06 en áreas con texto.
Botones con padding 2px 4px — área real ~20×18px, imposible de pulsar con precisión en móvil.
Padding 8px 18px con min-height 44px. El área de golpe excede los 24×24px mínimos de WCAG 2.2.
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