NovaPay Design System
Sistema de diseño minimalista para el dashboard SaaS de NovaPay — pagos y facturación para PYMEs españolas. Basado en shadcn/ui con tokens semánticos, tipografía Geist y criterios de accesibilidad verificables en code review.
01 · Contexto y objetivos
Intent: Unificar la interfaz del dashboard de NovaPay con un sistema coherente, predecible y mantenible por un equipo de desarrollo sin diseñador dedicado. Cada token, regla y componente debe poder implementarse directamente sin interpretación subjetiva.
02 · Tokens de color
Los tokens son la única fuente de verdad para colores. Usar siempre el token semántico, nunca el valor hexadecimal directo en componentes.
:root {
--color-primary: #000000;
--color-success: #16A34A;
--color-warning: #D97706;
--color-danger: #DC2626;
--color-surface: #FFFFFF;
--color-text: #111827;
}
03 · Tipografía
Escala de 6 tamaños. Font primaria: Geist (texto y display). Font mono: Fira Code (labels, código, métricas).
04 · Espaciado
Escala de 4px base. Todos los márgenes, padding y gaps deben usar estos valores. Nunca usar valores arbitrarios.
05 · Componente — Button
El botón es el componente de acción principal. Cada variante tiene una semántica clara y no debe usarse fuera de su contexto.
btn-default (CTA primario) por vista. Si hay dos acciones, la secundaria usa btn-outline.
btn-danger para la CTA principal. Solo para acciones destructivas irreversibles (eliminar, cancelar contrato).
06 · Componente — Input
Campos de texto, número e importe. Cuatro estados requeridos: default, focus, error, disabled.
07 · Componente — Badge
Etiquetas de estado para transacciones, facturas y usuarios. Nunca usar color sin significado semántico claro.
08 · Componente — Table
Tabla de datos para listados de facturas y transacciones. Headers siempre en monospace mayúsculas. Importes en Fira Code.
| REFERENCIA | CLIENTE | CONCEPTO | FECHA | IMPORTE | ESTADO |
|---|---|---|---|---|---|
| NP-2026-001 | Tienda Natura SL | Consultoría marketing IA | 01/06/2026 | +3.200,00 € | Pagado |
| NP-2026-002 | Farmacia Roca | Automatización WhatsApp | 08/06/2026 | +1.850,00 € | Pendiente |
| NP-2026-003 | Clínica Ortiz | Agente IA atención cliente | 01/05/2026 | +900,00 € | Vencido |
| NP-2026-004 | LogiTrans SL | Dashboard analítico | 14/06/2026 | — | Borrador |
09 · Componente — Alert
Mensajes del sistema no interruptivos. Para errores críticos de flujo, usar Modal. Para confirmaciones post-acción, usar Alert success transitorio (auto-dismiss 5s).
10 · Componente — Card
Contenedor de sección con header, body y footer opcionales. El footer siempre alinea acciones a la derecha.
11 · Componente — Modal
Para acciones que requieren confirmación explícita (destructivas o de alto impacto). Siempre incluir: título claro, descripción de consecuencias, acción secundaria de escape.
12 · Accesibilidad WCAG 2.2 AA
Cada criterio es testeable en implementación. Sin excepciones estéticas que sacrifiquen accesibilidad.
color-text (#111827) sobre surface (#FFF) = 16.1:1 ✓. color-muted (#6B7280) sobre blanco = 4.63:1 ✓.
box-shadow: 0 0 0 2px rgba(0,0,0,0.12). No usar outline: none sin reemplazo equivalente.
<input> debe tener un <label> asociado con for o aria-label. Nunca usar solo placeholder como label.
role="dialog" aria-modal="true" aria-labelledby. Alerts: role="alert" para mensajes que aparecen dinámicamente.
tabindex="0" en filas accionables.
13 · Anti-patterns prohibidos
Implementaciones incorrectas frecuentes en dashboards. Cada "no hacer" va acompañado de su alternativa correcta.
border-radius: 2px; /* fuera de escala */
border-radius: var(--radius-md);
/* sin label, sin aria */
<input id="email"
placeholder="empresa@email.com"
aria-describedby="email-hint" />
14 · QA Checklist — Code Review
Ejecutar en cada PR que modifique componentes o añada nueva UI. Bloquear merge si algún punto falla.
-
TOKENSNingún valor de color hexadecimal hardcoded fuera de
tokens.css. Buscar congrep -r "#[0-9A-Fa-f]{6}"en componentes. -
TIPOGRAFÍASolo tamaños de la escala (12/14/16/20/24/32px). No
font-size: 13pxnifont-size: 15px. -
ESPACIADOPadding/margin/gap usan valores de la escala o múltiplos de 4px. Cero valores arbitrarios como
padding: 7px 11px. -
CONTRASTEVerificar con axe DevTools o Lighthouse. Ratio ≥ 4.5:1 en texto normal. Ningún warning abierto en WCAG AA.
-
KEYBOARDNavegar toda la vista nueva solo con Tab/Shift+Tab/Enter/Escape. Ningún elemento interactivo sin foco visible.
-
LABELSCada
<input>y<select>tiene label asociado. Cada icon-only button tienearia-label. -
ESTADOSComponentes interactivos implementan todos los estados requeridos: default, hover, focus, disabled. Loading state si la acción es asíncrona.
-
BADGES SEMÁNTICOSCada Badge usa el token correcto para su significado (success=completado, warning=acción requerida, danger=error/urgente). Ningún color decorativo.
-
MODAL / DIALOGIncluye
role="dialog",aria-modal="true", focus trap activo, cierre con Escape, botón de escape visible. -
RESPONSIVEVista validada en 1280px (desktop), 768px (tablet). Ningún overflow horizontal en contenedores principales.
Este documento es la fuente de verdad del sistema de diseño de NovaPay v1.0. Generado con la skill sistema-diseno-shadcn de CULTIVA IA (Branding & Diseño). Cualquier excepción a estas reglas requiere decisión documentada en el PR.