Filosofía de movimiento
En Flow, el motion cumple una función: guiar la atención, confirmar acciones y comunicar jerarquía. Nunca es decorativo.
Los 4 pilares
El movimiento guía, no distrae. Cada transición tiene un propósito: indicar que algo cambió, confirmar una acción, o revelar contenido.
La interfaz debe sentirse inmediata. Los elementos pequeños responden en 150ms, los cambios de contenido en 300ms. Nada debería tardar más de 500ms.
Usa solo las 3 duraciones y 3 curvas del sistema. Un botón siempre reacciona igual, un modal siempre entra igual.
Siempre respeta prefers-reduced-motion. Ningún motion debe causar incomodidad o accesibilidad reducida.
Cuándo usar (y cuándo no)
Hover en botones y cards. Apertura/cierre de modales y dropdowns. Cambio entre estados (toggle, tabs). Feedback visual de acciones (submit, delete). Entrada de elementos nuevos en la página.
Decoración de fondo (partículas, gradientes animados). Animaciones infinitas en loop. Parallax excesivo. Transiciones entre páginas completas (excepto SPA). Micro-bounces o spring effects.
Sistema de 3 niveles
Solo existen 3 duraciones en Flow. Elige según el tamaño del cambio visual.
Pasa el mouse sobre cada barra para ver la duración en acción
| Token | Valor | Uso | Ejemplos |
|---|---|---|---|
motion.duration.fast |
150ms | Micro-interacciones, cambios de color, hover | Hover en botón, cambio de color en link, border-color en input focus |
motion.duration.default |
300ms | Transiciones de contenido, cambios de layout | Apertura de dropdown, cambio de tab, card hover lift, toggle switch |
motion.duration.slow |
500ms | Cambios grandes, overlays, transiciones complejas | Apertura de modal, fade de overlay, transición de página (SPA) |
3 curvas, 3 propósitos
Cada curva tiene una personalidad diferente. Standard para ida y vuelta, Entrance para lo que aparece, Exit para lo que desaparece.
Hover, toggle, cualquier cambio reversible
Modal abriendo, dropdown entrando, toast apareciendo
Modal cerrando, elemento saliendo, overlay fade-out
Pasa el mouse sobre cada tarjeta para ver la curva en acción
| Token | Valor | Cuándo usar |
|---|---|---|
motion.easing.standard |
cubic-bezier(0.4, 0, 0.2, 1) | Transiciones reversibles — hover, toggle, tab switch, color change |
motion.easing.entrance |
cubic-bezier(0, 0, 0.2, 1) | Elementos que aparecen — modal abriendo, dropdown, toast, fade-in |
motion.easing.exit |
cubic-bezier(0.4, 0, 1, 1) | Elementos que desaparecen — modal cerrando, overlay fade-out, collapse |
Motion por componente
Cada componente tiene sus propiedades animables y configuración exacta. Los demos son interactivos — pruébalos.
Botones
| Propiedad | Duración | Curva | Detalles |
|---|---|---|---|
| background-color | fast (150ms) |
standard | Hover: green-500 → green-600 |
| transform | fast (150ms) |
standard | Hover: translateY(-1px) · Active: translateY(0) |
| box-shadow | fast (150ms) |
standard | Hover: elevation.md · Active: none |
| border-color (secondary) | fast (150ms) |
standard | Hover: border → green-500 |
Cards
| Propiedad | Duración | Curva | Detalles |
|---|---|---|---|
| transform | default (300ms) |
standard | Hover: translateY(-4px) |
| box-shadow | default (300ms) |
standard | Hover: elevation.lg |
| border-color | default (300ms) |
standard | Hover: border → green-500 |
Inputs & Focus
| Propiedad | Duración | Curva | Detalles |
|---|---|---|---|
| border-color | fast (150ms) |
standard | Focus: border → green-500 |
| box-shadow (focus ring) | fast (150ms) |
standard | Focus: 0 0 0 3px rgba(59,235,100, 0.12) |
Toggle Switch
| Propiedad | Duración | Curva | Detalles |
|---|---|---|---|
| background (track) | default (300ms) |
standard | border → green-500 |
| transform (knob) | default (300ms) |
standard | translateX(0) → translateX(20px) |
Patrones de entrada y salida
Cómo aparece y desaparece el contenido — modales, dropdowns, toasts, y tooltips.
Modal / Dialog
| Elemento | Entrada | Salida |
|---|---|---|
| Overlay (backdrop) | opacity 0→0.9 · slow · entrance |
opacity 0.9→0 · default · exit |
| Panel (contenido) | opacity 0→1, translateY(16px→0) · slow · entrance |
opacity 1→0, translateY(0→8px) · default · exit |
Dropdown / Popover
| Propiedad | Entrada | Salida |
|---|---|---|
| opacity | 0→1 · default · entrance |
1→0 · fast · exit |
| transform | translateY(-4px)→translateY(0) · default · entrance |
Ninguno — solo fade out |
| transform-origin | Según posición: top para dropdown, bottom para popup, center para tooltip | |
Toast / Notification
| Propiedad | Entrada | Auto-dismiss |
|---|---|---|
| opacity + translateY | 0→1, translateY(12px→0) · default · entrance |
1→0, translateY(0→-8px) · default · exit |
| Duración visible | Success: 3s · Error: 5s (o manual dismiss) · Info: 4s | |
Tooltip
| Propiedad | Entrada | Salida |
|---|---|---|
| opacity | 0→1 · fast · entrance |
1→0 · fast · exit |
| Delay | Entrada: 200ms delay · Salida: inmediata | |
Navegación y cambios de vista
Para aplicaciones SPA o secciones con cambio de contenido dinámico.
Dashboard
Vista principal con métricas y acceso rápido.
Proyectos
Lista de proyectos activos del equipo.
Configuración
Preferencias y ajustes de la cuenta.
Haz clic en los dots del sidebar para ver la transición entre páginas
| Patrón | Transición | Cuándo usar |
|---|---|---|
| Fade + Slide Up | opacity 0→1, translateY(12px→0) · default · entrance |
Cambio de tab, navegación entre vistas en SPA |
| Cross-fade | Salida: opacity 1→0 · Entrada: opacity 0→1 · default |
Cambio entre contenidos del mismo nivel jerárquico |
| Slide lateral | translateX(100%→0) · slow · entrance |
Panel lateral, drawer, step wizard |
| Expand/Collapse | max-height 0→auto, opacity 0→1 · default · standard |
Accordions, secciones expandibles, FAQs |
Referencia rápida por componente
Tabla completa de qué propiedades animar en cada componente, con duración y curva exactas.
fastfastdefaultfastdefaultfastslowdefaultdefault / fastdefaultfastslow / defaultdefaultdefaultslowAccesibilidad de motion
Flow respeta la preferencia del sistema operativo. Si el usuario tiene activada la reducción de movimiento, todas las animaciones se desactivan o simplifican.
Regla obligatoria: Todo archivo CSS o componente que incluya transiciones debe incluir el media query prefers-reduced-motion: reduce.
Los elementos con prefers-reduced-motion activo reemplazan todas las transiciones con cambios instantáneos (duration: 0ms) o transiciones mínimas (opacity only, fast).
Eliminar translateY, translateX, scale. Reducir duraciones a instantáneo. Mantener cambios de color/opacity como feedback mínimo. Usar opacity como fallback de transiciones complejas.
Ignorar la preferencia del usuario. Usar !important para forzar animaciones. Dejar scroll-behavior: smooth sin override. Depender del motion como único indicador de estado.
Custom properties y mixins
Variables CSS listas para copiar. Todas las animaciones del sistema se construyen con estas 6 custom properties.
Shorthand patterns
① ¿Usas solo las 3 duraciones del sistema? (150 / 300 / 500ms)
② ¿Cada transición usa la curva correcta? (standard / entrance / exit)
③ ¿Incluiste el media query
prefers-reduced-motion?④ ¿Las transiciones de hover usan
fast?⑤ ¿Los modales usan
slow para entrada y default para salida?⑥ ¿El motion comunica algo? Si no, elimínalo.