Sistema de
Diseño Bold
Guía de implementación opinionada para CULTIVA IA. Tokens listos para ingeniería, componentes con estados completos y criterios de accesibilidad testeables.
Intención de diseño
CULTIVA IA comunica autoridad, claridad y confianza tecnológica. El estilo Bold establece presencia visual fuerte mediante tipografía expresiva, colores de alto contraste y layouts comandantes — sin sacrificar legibilidad ni accesibilidad.
Tokens de color
Todos los valores de color deben referenciarse mediante tokens semánticos. El uso de valores HEX directos en componentes está prohibido.
| Token | Valor | Sobre blanco | Sobre surface | Normal text | Large text |
|---|---|---|---|---|---|
| --color-primary | #0077BC | 5.9:1 | 9.2:1 | ✓ Pasa | ✓ Pasa |
| --color-text | #111827 | 17.1:1 | — | ✓ Pasa | ✓ Pasa |
| --color-text-muted | #6B7280 | 4.6:1 | — | ⚠ Solo large | ✓ Pasa |
| --color-secondary | #009866 | 4.8:1 | 7.4:1 | ✓ Pasa | ✓ Pasa |
Escala tipográfica
Desktop-first expressive scale. Archivo Black para titulares y CTAs. Archivo para body. JetBrains Mono para tokens, código y labels técnicos.
Botones
El botón es el componente de acción principal. Mínimo 44px de altura para touch targets. Siempre usa font-family: var(--font-primary) para el label.
/* Anatomía del botón primario */ .btn-primary { background: var(--color-primary); color: white; padding: 12px var(--space-6); font-family: var(--font-primary); /* MUST */ min-height: 44px; /* MUST — touch target */ border-radius: var(--radius-md); border: 2px solid var(--color-primary); } /* Estado focus-visible OBLIGATORIO */ .btn:focus-visible { outline: 3px solid var(--color-focus-ring); outline-offset: 2px; }
| Estado | Visual | Token/Valor | Teclado |
|---|---|---|---|
| default | Fondo primary, texto blanco | --color-primary | Tab para foco |
| hover | Fondo -15% lightness + shadow-md | --color-primary-hover | — |
| focus-visible | Ring 3px primary + offset 2px | --color-focus-ring | Tab / Shift+Tab |
| active | Fondo -25% + translateY(0) | --color-primary-active | Space / Enter |
| disabled | opacity: 0.38, cursor not-allowed | — | No focusable |
| loading | Spinner + label "Cargando..." | aria-busy="true" | No activable |
Badges y etiquetas
Cards
Formularios
Navegación
Alertas y callouts
Criterios WCAG 2.2 AA
Cada criterio es testeable en code review. No admitir excepciones estéticas que violen los umbrales.
| Criterio | Regla | Cómo testar |
|---|---|---|
| Contraste texto | Mínimo 4.5:1 texto normal, 3:1 texto grande (≥18px bold o ≥24px) | axe DevTools, WebAIM Contrast Checker |
| Focus visible | outline 3px solid --color-focus-ring con offset ≥2px en todos los elementos interactivos | Tab por la página, verificar ring visible |
| Touch target | Mínimo 44×44px para botones, links y controles de formulario | DevTools → bounding box del elemento |
| Movimiento reducido | @media (prefers-reduced-motion: reduce) elimina transform y transition | OS accessibility → reduce motion → verificar |
| Labels | Todo input con label o aria-label explícito. Placeholder no reemplaza label. | axe, NVDA/VoiceOver test |
| Color solo | No usar color como único indicador de estado. Añadir texto o icono. | Screenshot en escala de grises |
| Orden de foco | Tab order sigue orden visual. No usar tabindex positivo. | Tab desde inicio, verificar secuencia lógica |
| Contraste no-texto | Bordes de input y iconos UI mínimo 3:1 sobre fondo | Contrast Analyzer en elementos no-texto |
Qué evitar
var(--color-primary)#0077BC en componentesChecklist de code review
Ejecutar en cada PR que modifique componentes de UI. Cada ítem debe tener un aprobado explícito del revisor.
- Todos los colores usan tokens CSS var(--color-*)
- Espaciado en múltiplos de 4 (4/8/12/16/24/32)
- Contraste verificado con axe DevTools (0 errores AA)
- Tab order probado manualmente (secuencia lógica)
- focus-visible presente en todos los interactivos
- Touch targets ≥44px en todos los botones y links
- Labels en todos los inputs (no solo placeholder)
- Test con prefers-reduced-motion habilitado
- Sin valores HEX directos en componentes
- Test NVDA/VoiceOver en formularios nuevos
- Títulos usan font-family: var(--font-primary)
- Screenshot grayscale: estados distinguibles sin color
- Botones con min-height: 44px
- Imágenes con alt text descriptivo (no vacío)
- Estados hover/focus/active implementados
- Revisión mobile 375px (iPhone SE breakpoint)