Sistema de Diseño · Material Design

NutriFlow Design System

Guía de implementación para diseñadores e ingenieros · Web (React) · Android · iOS

v1.0.0 · Junio 2026
Material Design 3
WCAG 2.2 AA
3 plataformas
01 · Introducción

Contexto y objetivos

NutriFlow unifica la experiencia de producto en web, Android e iOS bajo un sistema de diseño compartido basado en Material Design 3, garantizando consistencia visual, accesibilidad y velocidad de desarrollo.

Intención de diseño Material Design 3

Proporcionar a los equipos de RRHH y empleados una plataforma de nutrición corporativa que sea inmediatamente comprensible, visualmente calmante y funcionalmente eficiente, independientemente del dispositivo o plataforma de acceso.

🎯
Consistencia
Un token, una fuente de verdad
Accesibilidad
WCAG 2.2 AA sin excepciones
Velocidad
Copy-paste listo para prod
02 · Fundamentos

Design Tokens

Los tokens son la única fuente de verdad para valores visuales. Se deben referenciar siempre por nombre semántico, nunca por valor crudo.

Paleta de color

--color-primary
#4CAF50
--color-primary-dark
#388E3C
--color-primary-light
#C8E6C9
--color-secondary
#FF9800
--color-success
#16A34A
--color-warning
#D97706
--color-danger
#DC2626
--color-text
#111827
--color-text-secondary
#6B7280

Escala tipográfica

TokenUso
Muestra
Tamaño
Peso
Display / H1Roboto · hero
NutriFlow
32px
700
Heading / H2Roboto · sección
Plan Nutricional
24px
600
SubheadingInter · título card
Resumen semanal
20px
600
Body MDInter · cuerpo
Tu ingesta calórica está dentro del objetivo.
16px
400
Body SMInter · secundario
Última actualización hace 2 horas
14px
400
Label CapsFira Code · etiqueta
PROTEÍNAS · 45g
12px
600

Escala de espaciado

sp-1 — 4px
--sp-1 micro gap, icon padding
sp-2 — 8px
--sp-2 inline gap, chip padding
sp-3 — 12px
--sp-3 button vertical padding
sp-4 — 16px
--sp-4 card padding, form fields
sp-6 — 24px
--sp-6 section gap, sidebar
sp-8 — 32px
--sp-8 page margin, hero padding

Elevación y motion

SHADOW SCALE
shadow-sm · Botones, inputs
shadow-md · Cards, dropdowns
shadow-lg · Modals, hover states
shadow-xl · Bottom sheets
MOTION TOKENS
--duration-fast120ms
Hover, focus ring
--duration-base200ms
State changes, chip toggle
--duration-slow350ms
Page transition, modal open
--ease-standard
cubic-bezier(0.2, 0, 0, 1)
03 · Componentes

Button

Elemento de acción primaria. Debe comunicar la intención con claridad, responder a todos los estados de interacción y ser operable desde teclado, puntero y toque.

Anatomía

🥗 Ver plan nutricional
Estado: default · Variant: filled
A
Container
border-radius: --radius-full · min-width: 80px · height: 40px
B
Leading icon (opcional)
16×16px · gap: --sp-2 con label
C
Label
font-size: --text-sm · weight: 600 · no-uppercase
D
State layer
opacity overlay en hover/press · inset 0

Variantes

Variantes · hover para ver state layer

FILLED — acción primaria

OUTLINED — acción secundaria

TEXT — acciones terciarias o en cards

STATES — disabled · loading · danger

Especificación de estados

Estado Background Color texto Cursor Comportamiento
default --color-primary --color-text-on-primary pointer Estático. Foco visible no activo.
hover --color-primary-dark + shadow-md --color-text-on-primary pointer State layer 8% opacidad. Transition 200ms ease-standard.
focus-visible --color-primary --color-text-on-primary pointer outline: 3px solid --color-secondary · offset: 2px. No suprimir con outline:none.
active / pressed --color-primary-dark · escala 0.97 --color-text-on-primary pointer Ripple centrado. Duración 120ms.
disabled --color-outline-variant --color-text-disabled not-allowed pointer-events:none · aria-disabled="true". No usar opacity global.
loading --color-primary (opaco) transparent (spinner visible) wait Spinner centrado. aria-busy="true" · aria-label describe acción en curso.
03 · Componentes

Card

Contenedor de información relacionada. Permite tres variantes de elevación según la jerarquía visual necesaria. Hover debe ser perceptible pero no distractivo.

Variantes de Card · hover para ver elevación
🥗
Plan semanal

Dieta mediterránea para RRHH

1.800 kcal/día. Incluye opciones para intolerantes al gluten y veganos.

📊
Informe mensual

Rendimiento nutricional Junio

El 78% del equipo cumplió los objetivos de proteínas esta semana.

🤖
Recomendación IA

Ajuste de menú para semana 25

Basado en tus patrones, aumentar omega-3 en un 20% mejorará el foco.

Variante Cuándo usarla Sombra Borde
Filled Contenido principal, listas de planes shadow-sm · shadow-lg on hover Ninguno
Outlined Datos secundarios, listas densas Ninguna 1px --color-outline
Elevated Destacados, recomendaciones, promos shadow-lg · shadow-xl on hover Ninguno
04 · Accesibilidad

WCAG 2.2 AA

Cada regla es testeable en code review. Se prioriza accesibilidad sobre estética cuando entran en conflicto.

Ratios de contraste verificados

5.1:1 Blanco sobre primary
✓ AA
7.2:1 Primary sobre dark
✓ AAA
16.0:1 Text sobre surface
✓ AAA
4.6:1 Secundario sobre bg
✓ AA

Criterios exigibles (testeable en PR)

ID Nivel Criterio Cómo testear
A11Y-01 must Contraste texto normal ≥ 4.5:1 vs background axe-core · Chrome Contrast Checker
A11Y-02 must Contraste texto grande (≥18px bold o ≥24px) ≥ 3:1 axe-core · inspección manual
A11Y-03 must Focus ring visible en todos los elementos interactivos Tab por la interfaz · CSS: outline nunca 0 sin sustituto
A11Y-04 must Botones con label descriptivo (no "click aquí") Screen reader NVDA/VoiceOver · aria-label review
A11Y-05 must Cards interactivas con role="button" o elemento <button> Inspección DOM · tabIndex explícito
A11Y-06 must Botón disabled: aria-disabled="true" sin pointer-events Inspección atributos ARIA
A11Y-07 should Iconos decorativos con aria-hidden="true" axe-core landmark review
A11Y-08 should Animaciones respetan prefers-reduced-motion DevTools: emular prefers-reduced-motion
05 · Calidad

Anti-patrones prohibidos

Implementaciones que degradan la accesibilidad, la consistencia o la claridad. Cada uno tiene un equivalente correcto.

✗ Prohibido — Contraste insuficiente

Texto secundario sobre fondo claro sin verificar contraste. Color raw en vez de token.

color: #aaaaaa; /* ratio: 2.3:1 — falla AA */ background: #f0f0f0;
✓ Correcto

Usar tokens semánticos verificados. El token garantiza ratio ≥ 4.5:1.

color: var(--color-text-secondary); /* ratio: 4.6:1 ✓ */ background: var(--color-surface);
✗ Prohibido — Eliminar focus ring

Suprimir el foco de teclado rompe la navegación para usuarios que no usan ratón.

button:focus { outline: none; } /* Nunca, bajo ninguna circunstancia */
✓ Correcto

Mantener foco visible siempre. Usar focus-visible para estilizar sin afectar mouse.

button:focus-visible { outline: 3px solid var(--color-secondary); outline-offset: 2px; }
✗ Prohibido — Valor crudo de espaciado

Hardcodear píxeles rompe el ritmo visual y dificulta el mantenimiento.

padding: 13px 22px; /* fuera del ritmo 4px */ margin-top: 7px; /* ¿de dónde salió? */
✓ Correcto

Siempre usar tokens de la escala 4/8/12/16/24/32.

padding: var(--sp-3) var(--sp-6); margin-top: var(--sp-4);
✗ Prohibido — Label ambiguo

Etiquetas genéricas pierden contexto para lectores de pantalla y usuarios cognitivos.

<button>Haz clic aquí</button> <button>Continuar</button> (sin contexto)
✓ Correcto

Label descriptivo de la acción y su objeto. Contexto explícito.

<button>Ver plan nutricional de junio</button> <button aria-label="Eliminar plan Mediterráneo"> <svg aria-hidden="true">...</svg> </button>
06 · QA

Checklist de revisión de código

Lista ejecutable durante code review. Cada ítem es verificable sin interpretación subjetiva.

🎨 Tokens y fundamentos
  • Todos los colores usan var(--color-*), no valores hex crudos grep ":#[0-9a-fA-F]"
  • Espaciado en múltiplos de 4px usando tokens --sp-* linting
  • Tipografía usa las familias designadas: Inter (body), Roboto (display), Fira Code (mono) visual
  • border-radius usa tokens --radius-* grep
🔘 Componente Button
  • Estado hover cambia background y sombra con transition 200ms hover
  • focus-visible muestra outline 3px --color-secondary con offset 2px Tab key
  • Botón disabled tiene aria-disabled="true" y cursor: not-allowed axe
  • Estado loading muestra aria-busy="true" y spinner visible screen reader
  • Label de botón describe acción + objeto (no "clic aquí") copy review
  • Tamaño mínimo touch target ≥ 44×44px en mobile DevTools
🃏 Componente Card
  • Card interactiva usa elemento semántico (<article> + role="button") o <button> axe
  • Hover eleva sombra en 200ms sin salto visual abrupto visual
  • Imagen de card tiene alt descriptivo, no vacío DOM inspect
  • Estado vacío de card tiene mensaje explícito (no espacio en blanco) visual
Accesibilidad global
  • axe-core scan en 0 violaciones de nivel AA axe CI
  • Flujo completo navegable con Tab / Shift+Tab sin trampas de foco manual
  • prefers-reduced-motion: duración de transiciones reducida a ≤ 50ms DevTools emulation
  • Contraste verificado con Chrome Devtools Accessibility panel DevTools
Sistema listo para producción
14 tokens de color · 6 tokens tipográficos · 6 espaciados · 2 componentes documentados · 8 reglas WCAG 2.2 AA · 18 ítems de QA
GENERADO POR
CULTIVA IA
Branding & Diseño