Saltar al contenido
Alea0.1
Pro
  1. Alea
  2. Motion
  3. Sistema de motion

Movimiento

Sistema de motion

Cada animación de Alea es uno de 33 patrones, hechos solo con los tokens de movimiento. El movimiento explica qué cambió: de dónde vino algo, a dónde fue la selección, que se escuchó un toque. Con movimiento reducido, nada se desplaza; las cosas igual se desvanecen.

Cámbialo, en tres niveles

Cada componente tiene un valor por defecto sensato. Tú decides dónde va el movimiento y cuál, sin modificar nada del kit.

  1. Toda la app: ThemeProvider motion define el modo (expressive, productive, reduced u off), sigue o reemplaza el ajuste de movimiento reducido del sistema, escala la velocidad y la intensidad, y cambia el valor por defecto por tipo de componente.
  2. Un tipo de componente, en CSS: .alea-popover { --alea-enter: alea-m-fade-in; --alea-exit: alea-m-fade-out; }. Estas variables no se heredan, así un diálogo nunca pasa su movimiento al select de adentro.
  3. Una instancia: cada overlay acepta una prop motion : un preset, false, o { enter, exit, duration, easing, delay }. Míralo en vivo.
<ThemeProvider motion={{
mode: 'productive', // expressive (default) | productive | reduced | off
reduced: 'system', // follow the OS (default) | 'always' | 'never'
speed: 0.9, // multiplies every duration
intensity: 1.2, // multiplies distances, scales and blur
components: { dialog: 'scale', tooltip: 'fade', toast: { enter: 'slide-left', duration: 300 } },
}}>
<Select motion="blur" />
<DialogModal motion={{ enter: 'zoom', duration: 320, easing: 'spring' }} />
<Popover motion={false} />

Presets: fade, scale, pop, rise, drop, slide-up, slide-down, slide-left, slide-right, blur, zoom, flip, morph, none. Cada uno es un par de keyframes, alea-m-<preset>-in y -out, que también puedes usar en tu propio CSS.

Modos

Prueba los mismos controles en cada modo. Productive es más corto y discreto, para apps densas; reduced mantiene los fundidos y quita los desplazamientos; off quita todas las animaciones.

Pasa el mouse

Patrones

El botón abajo de la pantalla repite las demos automáticas; el resto lo puedes probar a mano.

Pop pop

Los overlays anclados crecen desde lo que los abrió, del lado en que se abren, y se encogen más rápido de lo que llegaron.

Usado en
Popover, Select, ComboBox, Autocomplete, menús, selectores de fecha, HoverCard, Tooltip, NavigationMenu
Tokens
duration-base al entrar, duration-fast al salir, scale-from, distance-sm, ease-out / ease-in

Rise rise

Los overlays de página suben un poco mientras el fondo se desvanece. Los toasts suben con un pequeño rebote y salen hacia el costado.

Usado en
Dialog, AlertDialog, CommandPalette, Toast, Tour
Tokens
duration-slow, distance-lg, ease-out; toasts ease-emphasized

Slide slide

Los paneles entran desde su borde y vuelven por el mismo lado.

Usado en
Drawer, hojas inferiores, la navegación móvil
Tokens
duration-slow al entrar, duration-base al salir

Stagger stagger

Los elementos de una lista recién abierta llegan uno tras otro, así la vista los lee de arriba abajo. Solo esperan los primeros doce.

Usado en
Opciones, elementos de menú, resultados de comandos
Tokens
stagger (40 ms), distance-sm, duration-base

Expand expand

El contenido se abre hasta su propia altura, luego aparece gradualmente, así el diseño de abajo se mueve con suavidad.

Usado en
Accordion, Spoiler, Tree, paneles de NavigationMenu
Tokens
duration-slow, ease-out

Glide glide

Un indicador por grupo se mueve al nuevo elemento y toma su tamaño, con un leve rebote. Ves a dónde fue la selección.

Usado en
Tabs, SegmentedControl, ToggleGroup
Tokens
duration-base, ease-emphasized

Pasa el mouse

Sube 4 px.

Lift lift

Las superficies clicables suben un poco y proyectan una sombra más profunda con hover.

Usado en
Card interactiva, tarjetas kanban, mosaicos de imagen, FloatButton
Tokens
lift (-4 px), duration-base

Press press

Los controles se encogen un poco al presionarlos y vuelven con un resorte, así un toque se siente respondido.

Usado en
Button, IconButton, alternancias, etiquetas, paginación, herramientas de editor, navegación inferior
Tokens
scale-press (0.96), duration-instant

Morph morph

Un ícono pasa a su otro estado en lugar de cambiarse de golpe: los chevrons giran, los checks aparecen, la hamburguesa se vuelve un ícono de cerrar, los switches rebotan.

Usado en
Select, Accordion, Tree, Checkbox, Radio, Switch, Rating, Burger, ThemeToggle
Tokens
duration-base, ease-emphasized
tokens.json
theme.css
icons.svg

Tint tint

Los colores de hover y selección aparecen muy rápido; lo bastante rápido para sentirse instantáneo, lo bastante suave para no parpadear.

Usado en
Opciones, elementos de menú, filas, enlaces, enlaces de barra lateral y de navegación
Tokens
duration-instant

Nudge nudge

Un campo que pasa a inválido se sacude una vez, con el texto de error, así el problema se encuentra sin buscarlo.

Usado en
TextField, Select, selectores, TextArea
Tokens
distance-sm, duration-slow

Draw draw

Trazos y barras crecen hasta su lugar: progreso, pasos y líneas de gráficos.

Usado en
ProgressBar, Meter, Steps, gráficos
Tokens
duration-slow / slower, ease-out

Pulse pulse

Lo que está en vivo o es nuevo respira despacio. Se detiene con movimiento reducido.

Usado en
Punto de Badge, estado de Avatar, Indicator
Tokens
bucle de 1,6 s, ease-out

Shimmer shimmer

Un brillo recorre los rellenos mientras carga el contenido.

Usado en
Skeleton
Tokens
bucle de 1,6 s (3 s con movimiento reducido)

Swap swap

El texto o un ícono cambia con un breve fundido con desenfoque, así notas la palabra nueva sin un salto.

Usado en
TextSwap: etiquetas de botones (Guardar a Guardado), texto de estado, nombres de planes
Tokens
duration-base al entrar, duration-fast al salir, blur-sm, distance-sm

Roll roll

Los dígitos ruedan hasta el nuevo número, así un cambio de valor se lee como un cambio, no como un parpadeo.

Usado en
NumberRoll: precios, contadores, estadísticas, cantidad en el carrito
Tokens
duration-slow, ease-emphasized

Badge pop badge

Un contador salta con un pequeño resorte cuando cambia (no en el primer render).

Usado en
CountBadge, puntos de notificación
Tokens
duration-base, ease-emphasized, scale-from

Éxito success

El estado ocupado se convierte en un check que se dibuja solo, y luego vuelve a la etiqueta.

Usado en
Button isSuccess después de isLoading: guardar, enviar, copiar
Tokens
duration-slow, ease-out
TokensMovimientoFigma

Dissolve dissolve

Lo que se quita se desenfoca, se encoge y se desvanece antes de irse, así ves qué se fue.

Usado en
Presence: etiquetas, filas de listas, archivos, una búsqueda borrada
Tokens
duration-base, blur-md, ease-in

Alea Motion anima lo que cambió.

Resize resize

Cuando el contenido crece o se achica, la caja se anima hasta su nueva altura en lugar de saltar.

Usado en
AutoHeight: tarjetas que crecen, paneles, leer más
Tokens
duration-base, ease-out

Fan fan

Los elementos superpuestos se separan con hover o foco, así cada uno se puede ver.

Usado en
Abanico de AvatarGroup
Tokens
duration-base, ease-emphasized, lift

Ripple ripple

La respuesta al presionar crece desde donde presionaste (opcional, apagada por defecto).

Usado en
Ripple de Button, useRipple para tus propios elementos
Tokens
duration-slower, ease-out
Mantén presionado para confirmar

Hold hold

Mantener presionado llena una barra; la acción corre solo cuando se llena. Soltar cancela.

Usado en
HoldButton para acciones destructivas
Tokens
1200 ms por defecto, linear

Hint hint

Una flecha se mueve hacia donde va un enlace, con hover y foco de teclado.

Usado en
Enlaces independientes con un ícono, .alea-hint
Tokens
duration-base, ease-emphasized, 3 px

Tokens

Componentes

Movimiento

Reveal reveal

Las secciones entran al aparecer con el scroll, los hijos uno tras otro. El contenido que empieza en pantalla, o sin JavaScript, nunca se oculta.

Usado en
Reveal, data-stagger, secciones de landing
Tokens
duration-slow, distance-lg, stagger

Mira la barra en lo más alto de esta página mientras haces scroll.

Scroll scroll

Una barra se llena mientras lees; un encabezado puede ocultarse al bajar y volver al subir.

Usado en
ScrollProgress, useScrollDirection, Navbar
Tokens
scroll timeline de CSS donde está disponible

Pensando…

Stream stream

El texto transmitido aparece por partes con un cursor; un brillo indica que el modelo está pensando.

Usado en
StreamingText, .alea-text-shimmer, respuestas de IA
Tokens
duration-slow, blur-sm

Stack stack

Los toasts se apilan detrás del más nuevo y se abren en abanico con hover o foco de teclado, así muchas notificaciones nunca tapan la página.

Usado en
ToastProvider apilado
Tokens
duration-base, ease-out, 10 px y 5% por capa

Abre un toast con la demo de Stack y arrástralo de lado.

Swipe swipe

Arrastra un toast de lado para cerrarlo: pasados 80 px o con un movimiento rápido se va, si no vuelve con un resorte. El botón de cerrar sigue ahí para todos los demás.

Usado en
Toast
Tokens
duration-base, ease-out

Cargando loading

Algo está trabajando: un spinner gira, una barra hace un barrido cuando no hay porcentaje. Siguen moviéndose con movimiento reducido porque llevan significado; todo lo decorativo se detiene.

Usado en
Spinner, ProgressBar y ProgressCircle sin valor, Button isLoading, LoadingOverlay
Tokens
giro de 0,8 s, barrido de 1,4 s
Descargas
12,840

Count count

Un número cuenta hasta su valor cuando aparece por primera vez, así una estadística se lee como un resultado. Los lectores de pantalla reciben el número final de una vez.

Usado en
Statistic animate, NumberRoll para cambios posteriores
Tokens
duration-slower, ease-out

Ambient ambient

Un movimiento lento y tranquilo en el fondo le da vida a una superficie sin pedir atención: los orbes flotan, un punto respira, una aurora se desplaza. Se detiene por completo con movimiento reducido.

Usado en
OrbBackground, GradientDot, Aurora (Pro)
Tokens
bucles de 18 a 26 s

Muévete entre páginas de esta documentación: se funden.

Route route

Los cambios de página se funden, deslizan o hacen zoom con la API View Transitions (fundido por defecto).

Usado en
startViewTransition, viewTransition de React Router, data-route-motion en <html>
Tokens
duration-fast al salir, duration-base al entrar

Curvas

--alea-motion-ease-out
cubic-bezier(0.16, 1, 0.3, 1)
--alea-motion-ease-in-out
cubic-bezier(0.65, 0, 0.35, 1)
--alea-motion-ease-standard
cubic-bezier(0.2, 0, 0, 1)
--alea-motion-ease-emphasized
cubic-bezier(0.34, 1.56, 0.64, 1)
--alea-motion-ease-in
cubic-bezier(0.4, 0, 1, 1)

Duraciones, distancias y escalas

--alea-motion-duration-instant120ms
--alea-motion-duration-fast200ms
--alea-motion-duration-base320ms
--alea-motion-duration-slow480ms
--alea-motion-duration-slower720ms
--alea-motion-distance-sm8px
--alea-motion-distance-md12px
--alea-motion-distance-lg24px
--alea-motion-scale-from0.92
--alea-motion-scale-press0.96
--alea-motion-stagger40ms
--alea-motion-lift-4px

Movimiento reducido

  • Las distancias, escalas, la elevación y el stagger van a cero: los overlays y elementos aparecen en su lugar, nada cruza la pantalla.
  • Las duraciones lentas se acortan a base; la curva emphasized deja de rebotar.
  • Los bucles decorativos se detienen (pulse, orbes, el ping del indicador); el brillo del esqueleto baja a 3 s. Los spinners siguen girando porque te dicen que algo está pasando.
  • Nada importante espera a una animación: las salidas terminan en menos de 200 ms, y el foco se mueve de inmediato.

Reglas para componentes nuevos

  • Usa un patrón; si ninguno sirve, agrega uno aquí primero. Nunca un keyframe suelto.
  • Entra con ease-out, sal con ease-in y más rápido que la entrada.
  • Aparece desde 0.01, no desde 0, así la primera pintura cuenta.
  • Anima solo transform y opacity (y height para expand): sin saltos de diseño.
  • En Figma, los mismos patrones son componentes interactivos con Smart Animate en la curva ease-out.