Design System Documentation — v2.0.0
NexaFlow AI

Sistema de diseño futurista-profesional. Construido para equipos que escalan. Cada token, componente y regla está pensado para eliminar la inconsistencia y acelerar la entrega.

Figma Variables ready WCAG 2.2 AA Next.js + Tailwind 9 devs / 3 diseñadores
42
Tokens de color
5
Componentes base
6
Pasos de espaciado
AA
WCAG 2.2

Propósito del sistema

NexaFlow AI opera en el espacio de PropTech / Operations Intelligence. Su dashboard conecta datos de propiedades, tareas y análisis predictivo. La estética debe transmitir velocidad, confianza y precisión técnica — nunca decorativismo vacío.

Este documento es la única fuente de verdad para diseñadores e ingenieros. Cada regla está anclada a un token o umbral medible; ninguna queda en términos subjetivos como "moderno" o "limpio" sin especificación concreta.

Regla maestra: la consistencia visual supera cualquier optimización local. Si tu componente necesita un valor fuera del sistema, crea primero el token.

Roboto 400/500/700
Audiowide display
Fondo #050A0F
Primario #3B82F6
Grid 4px

Color Tokens

Usa siempre el nombre del token, nunca el valor hexadecimal directamente. En Tailwind: extiende el config con estas variables CSS.

Paleta Base

bg-base
#050A0F
bg-surface
#0D1520
bg-elevated
#111D2C
bg-overlay
#162437
primary
#3B82F6
secondary
#8B5CF6
success
#16A34A
warning
#D97706
danger
#DC2626

Tokens de Texto

TokenValorUso
--color-text-high #E8F0FE Títulos, labels primarios, valores clave
--color-text-mid #94A3B8 Texto de soporte, descripciones, cuerpo
--color-text-low #475569 Metadatos, timestamps, labels secundarios
/* tailwind.config.ts — extender con tokens */ extend: { colors: { bg: { base: "var(--color-bg-base)", surface: "var(--color-bg-surface)", elevated: "var(--color-bg-elevated)", }, primary: "var(--color-primary)", secondary: "var(--color-secondary)", success: "var(--color-success)", danger: "var(--color-danger)", } }

Escala Tipográfica

Tres familias con roles distintos. Roboto para todo el UI de datos. Audiowide exclusivamente para títulos de pantalla y el logotipo. Anonymous Pro para código y valores técnicos.

hero / 4rem
Audiowide
NexaFlow
3xl / 1.875rem
Audiowide
Panel de Control
2xl / 1.5rem
Audiowide
Análisis Predictivo
xl / 1.25rem
Roboto 500
Sección de Propiedades
lg / 1.125rem
Roboto 400
Descripción del módulo de tareas automatizadas
md / 1rem
Roboto 400
El texto de cuerpo principal sigue esta escala en dashboards y formularios.
sm / 0.875rem
Roboto 400
Labels de tablas, hints de formulario, metadatos de tarjeta
xs / 0.75rem
Roboto 500
ETIQUETA DE SECCIÓN · UPPERCASE
mono / 0.75rem
Anonymous Pro
--color-primary: #3B82F6 | space-4: 16px
✓ Usar
  • Audiowide solo en h1/h2 de pantalla y logo
  • Roboto 400 para cuerpo; 500 para énfasis
  • Anonymous Pro en valores técnicos y código
  • letter-spacing 0.08-0.12em en xs uppercase
✗ Evitar
  • Audiowide en párrafos o labels de formulario
  • Roboto con weight 300 en texto menor a 14px
  • Más de 3 pesos tipográficos en una pantalla
  • Texto body en Anonymous Pro

Escala de Espaciado

Base de 4px. Todos los márgenes, paddings y gaps deben ser múltiplos de la escala. Nunca usar valores arbitrarios como 10px, 15px o 20px.

space-1
4px — micro (iconos, dot separators)
space-2
8px — nano (padding interno de badge/chip)
space-3
12px — xs (padding celda tabla, gap nav)
space-4
16px — sm (padding de botón, gap de formulario)
space-6
24px — md (padding de card, gap de sección)
space-8
32px — lg (separación entre bloques)

Botones

El botón es el componente más usado del sistema. Existen cuatro variantes semánticas; la elección debe basarse en la importancia de la acción, no en preferencias estéticas.

Variantes principales
Tamaños
Estados especiales

Anatomía del botón

PropiedadPrimarySecondaryGhost
Background --color-primary transparent transparent
Border --color-primary --color-border-strong transparent
Padding 8px 16px 8px 16px 8px 16px
Focus ring 3px offset, --primary 0.15 alpha 3px offset, --primary 0.15 alpha 3px offset, --primary 0.15 alpha
Disabled opacity 0.38 0.38 0.38

Una pantalla debe tener un máximo de 1 botón primary visible a la vez. Si necesitas dos CTA primarios, reconsideras la jerarquía de acciones.

Formularios e Inputs

Estados del input
Identificador único en el sistema.
⚠ El identificador contiene caracteres no permitidos.

Estados requeridos

EstadoBorderSombraTrigger
default --color-border none Estado inicial
focus --color-primary 0 0 0 3px rgba(primary, 0.15) :focus-visible
error --color-danger 0 0 0 3px rgba(danger, 0.12) Validación fallida
success --color-success none Validación ok

Badges y Tags

Comunican estado semántico. La variante se elige por su significado, no por colores favoritos.

Variantes semánticas
En Progreso Completado Revisión Bloqueado Archivado Beta
Sin dot indicator (tipo Tag)
PropTech IA Generativa Q3 2025 Alta prioridad
VarianteUso semánticoMust NOT usar para
primary Estado activo, en progreso, seleccionado Decoración, sin valor semántico
danger Error, bloqueado, crítico Urgente o importante (usar warning)
success Completado, verificado, activo Progreso parcial

DataTable

La tabla es el componente central del dashboard de NexaFlow. Reglas de anatomía obligatorias: cabecera fija, fila de hover, estado vacío y paginación.

DataTable — listado de propiedades
Propiedad Ubicación Estado Rendimiento Última IA
Torre Diagonal 4B Barcelona, ES Activa +8.4% ROI hace 2h
Local Gràcia 12 Barcelona, ES Revisión +3.1% ROI hace 5h
Oficina Paseo de Gracia Barcelona, ES En Proceso hace 1d
Nave Industrial L'H L'Hospitalet, ES Bloqueada –2.0% ROI hace 3d
✓ Tabla correcta
  • th en uppercase xs mono + letter-spacing
  • Hover row con bg-elevated completo
  • Alinear números a la derecha
  • Estado vacío con ilustración + CTA
✗ Tabla rota
  • Borders en todas las celdas (solo row-bottom)
  • Múltiples colores de fondo por fila
  • Texto truncado sin tooltip
  • Columna de acciones sin alineación right

Reglas Do / Don't

✓ Hacer siempre
  • Usar tokens semánticos, no hex directos
  • Mantener jerarquía visual: 1 primary CTA por pantalla
  • Focus ring visible en todos los elementos interactivos
  • Escala de espaciado 4px en todo el sistema
  • Definir estados vacíos con contenido accionable
  • Texto de error con posición predecible (debajo del campo)
✗ Nunca hacer
  • Texto gris sobre fondo oscuro sin verificar ratio AA
  • Espaciado arbitrario (10px, 15px, 20px)
  • Ocultar focus ring con outline: none
  • Usar Audiowide en cuerpo de texto
  • Múltiples botones primary en la misma zona visual
  • Bordes decorativos sin función semántica

Anti-Patrones y Migraciones

Anti-patrón 1: Botón sin jerarquía

✗ Antes (4 botones primary)

El usuario no sabe qué acción es la principal. El azul saturado en fondo oscuro pierde contraste.

✓ Después (jerarquía clara)

Un primary CTA, acciones secundarias con jerarquía decreciente. Escaneo visual inmediato.

Anti-patrón 2: Tokens en línea

✗ Hardcoded hex
/* ❌ Incorrecto */ .alert { background: #3B82F6; color: #E8F0FE; border: 1px solid rgba(59,130,246,0.3); }
✓ Token semántico
/* ✓ Correcto */ .alert { background: var(--color-primary-dim); color: var(--color-text-high); border: 1px solid var(--color-border-strong); }

Migración: cualquier componente existente con valores hex directos debe ser refactorizado antes del merge a main en v2.0. El PR checker rechaza archivos que contengan #3B82F6 fuera de globals.css.

Requisitos WCAG 2.2 AA

Cada criterio es testable en code review. No son recomendaciones, son blockers de merge.

CriterioUmbralCómo verificar
Contraste texto normal ≥ 4.5:1 axe DevTools / Storybook a11y addon
Contraste texto grande (≥18px bold) ≥ 3:1 Figma Color Contrast plugin
Focus ring visible ≥ 3px offset Tab navigation manual en cada PR
Área de clic mínima ≥ 44×44px Chrome DevTools grid inspect
Atributo aria-label en icon buttons obligatorio ESLint jsx-a11y
Loading state anunciado aria-busy aria-busy="true" en botón loading
/* ✓ Ejemplo botón accessible */ <button className="btn btn-primary" aria-busy={isLoading} aria-label="Guardar propiedad" disabled={isLoading || isDisabled} > {isLoading ? <Spinner aria-hidden="true" /> : "Guardar"} </button>

QA Checklist

Ejecutar en cada PR que modifique UI. Los ítems con badge blocker detienen el merge.

  • Tokens de colorNo hay valores hex directos fuera de globals.css
  • Contraste AATodos los textos superan ratio 4.5:1 (axe)
  • Focus ringTab key navega todos los elementos interactivos
  • EspaciadoNingún valor de margin/padding fuera de escala 4px
  • ResponsiveBreakpoints 320px / 768px / 1280px testeados
  • Estados vacíosTablas y listas tienen empty state con CTA
  • Errores de formMensaje de error bajo el campo, no en toast solo
  • 1 Primary CTAMáximo 1 btn-primary visible por zona de acción
  • TipografíaAudiowide solo en h1/h2; Roboto en resto
  • Loading statesBotones con aria-busy y spinner visible
NexaFlow AI Design System v2.0 · Generado por CULTIVA IA · Skill: sistema-diseno-futurista · 2026-06-16