Fundamentos
Movimiento
Resortes, duraciones y curvas; cómo respetan el movimiento reducido.
El movimiento en Eclipse UI es físico: lo que se arrastra, sigue al cursor o
cambia de forma se mueve con resortes que tienen masa, rigidez y amortiguación, y conservan su
velocidad si el destino cambia a medio camino. Lo demás (colores, hovers, entradas) usa unas
pocas duraciones y curvas con nombre. Todo pasa por el dial --eui-motion y respeta
el movimiento reducido del sistema.
Resortes
Cinco ajustes en eclipse_ui/spring. Los
valores de abajo se leen del módulo; la curva es la respuesta a un salto de 0 a 1 durante un
segundo, con la marca donde entra para siempre al 99%. Haz clic en un carril para mover su pieza
o compáralos todos a la vez.
-
springs.gentle
Pestañas, acordeones, diálogos: ~400ms, sin rebote.
- —
- rigidez
- —
- amortig.
- —
- masa
- Razón de amortiguación
- ζ — · —
- Se asienta en
- 99% en —
- Última vez tardó
- tardó —
6 componentes: Acordeón suave, Pestañas animadas, Zona para subir archivos, Confirmación, Hoja lateral…
-
springs.smooth
Movimiento estándar de tarjetas: apenas orgánico.
- —
- rigidez
- —
- amortig.
- —
- masa
- Razón de amortiguación
- ζ — · —
- Se asienta en
- 99% en —
- Última vez tardó
- tardó —
5 componentes: Aviso, Número que rueda, Actividad de la semana, Campana de notificaciones, Área de texto
-
springs.snappy
Respuesta inmediata: botones, indicadores, íconos (~200ms).
- —
- rigidez
- —
- amortig.
- —
- masa
- Razón de amortiguación
- ζ — · —
- Se asienta en
- 99% en —
- Última vez tardó
- tardó —
17 componentes: Actividad de la semana, Campo de color, Confirmación, Selector de fechas, Menú de acciones…
-
springs.morph
Superficies que cambian de forma: largo, sin rebote.
- —
- rigidez
- —
- amortig.
- —
- masa
- Razón de amortiguación
- ζ — · —
- Se asienta en
- 99% en —
- Última vez tardó
- tardó —
5 componentes: Pestañas animadas, Confirmación, Hoja lateral, Modal, Control segmentado
-
springs.responsive
Regreso magnético, pilas de avisos: un pequeño rebote satisfactorio.
- —
- rigidez
- —
- amortig.
- —
- masa
- Razón de amortiguación
- ζ — · —
- Se asienta en
- 99% en —
- Última vez tardó
- tardó —
16 componentes: Botón con estados, Pila de avatares, Campo de color, Selector de fechas, Menú de acciones…
ζ es la razón de amortiguación: por encima de 1 llega sin pasarse; por debajo
rebota. responsive está ajustado para rebotar apenas: es el de los regresos (el
pulgar que vuelve, el botón magnético que se suelta, la pila de avisos). "Tardó" es lo que midió el
navegador la última vez hasta que la pieza se detuvo (a medio píxel), con el dial de la personalidad
de la barra: incluye la cola de los últimos píxeles, que el ojo ya no ve.
Duraciones
Para lo que no es físico (un color, una opacidad, una entrada) hay cuatro duraciones con nombre.
Todas salen de --eui-motion: Umbra (0.7) es más rápida,
Alba (1.35) más lenta, y con movimiento reducido valen 0. El valor es el
calculado ahora en la muestra.
-
Instante
duration-instant—
La tecla que se hunde, el tooltip ya calentado; y el respiro entre una salida y una entrada. · 7 componentes: Botón con estados, Botón con luz, Botón que se hunde, Tarjeta con luz, Tooltip direccional…
-
Rápida
duration-quick—
Hover, color, borde, opacidad y la presión de eui-press. La de casi todo. · 30 componentes: Actividad de la semana, Actividad reciente, Control segmentado, Encabezado de página, Tabla del admin…
-
Calma
duration-calm—
Lo que se despliega o cambia de estado: paneles, la luz de eui-spotlight, una tarjeta que se ilumina. · 18 componentes: Actividad reciente, Encabezado de página, Número del panel, Tarjeta de precio, Botón con estados…
-
Respiro
duration-breath—
Entradas con animate-rise y animate-settle; lo que llega con un pequeño rebote. · 8 componentes: Botón con estados, Botón con luz, Tarjeta con luz, Campana de notificaciones, Hoja lateral…
Y una más larga sin utilidad, --eui-dur-tide
(—),
para la luna del medidor y los bucles que respiran.
Curvas
Una respiración: lo que entra exhala (rápido y llega suave), lo que sale
inhala (lento y se va rápido). Nunca linear ni las curvas de
Tailwind. Las cuatro se muestran con duration-breath para que se noten.
-
Exhala
ease-exhaleArranca rápido y llega suave: lo que entra, se abre o responde. La curva por defecto.
—32 componentes: Actividad de la semana, Actividad reciente, Encabezado de página, Número del panel, Pastilla de estado…
-
Inhala
ease-inhaleArranca lento y se va rápido: lo que sale o se cierra (un ícono que se esconde).
—6 componentes: Botón con estados, Botón con luz, Tarjeta con luz, Campana de notificaciones, Campo de texto…
-
Se asienta
ease-settlePasa un poco y regresa: lo que llega con un pop, como una palomita o un ícono de éxito.
—6 componentes: Botón con estados, Botón con luz, Tarjeta con luz, Campo de texto, Casilla que se dibuja…
-
Respira
ease-breathSimétrica, de ida y vuelta: los bucles que respiran (animate-breathe).
—5 componentes: Estado vacío, Botón con luz, Tarjeta con luz, Campana de notificaciones, Zona para subir archivos
El dial y el movimiento reducido
--eui-motion va de 0 a 1.5 y escala todas las duraciones CSS y el tiempo de los
resortes (lo lee motionScale en el elemento). Si el sistema pide
prefers-reduced-motion, el motor lo trata como 0: no hace falta escribir nada en
cada componente. Prueba el interruptor: pone el dial en 0 solo en esta muestra.
Resorte snappy
Transición duration-calm
Presión eui-press · escala —
| Qué | Con el dial en 0 o movimiento reducido |
|---|---|
Resortes (eclipse_ui/spring) | Saltan al destino en el mismo cuadro; la promesa de set() se cumple de inmediato. |
| Arrastres y gestos | Siguen al dedo 1:1 (eso no es animación); al soltar, el regreso salta. |
Transiciones (duration-*) | Duran 0 ms: el estado cambia sin recorrido. |
animate-rise, animate-settle | Sin desplazamiento ni escala: solo aparecen. |
Bucles (animate-breathe, medidor) | Quietos. En CSS propio, divide la duración entre max(var(--eui-m, 1), 0.0001). |
eui-press | No se encoge: --eui-press-scale vale 1. |
Resorte o CSS
La regla para decidir, pieza por pieza:
| Si el movimiento… | Usa | Ejemplo |
|---|---|---|
| sigue al dedo o al cursor | resorte responsive o snappy | deslizar para reservar, botón magnético |
| cambia de lugar o de tamaño | resorte morph, gentle o snappy | la pastilla de unas pestañas, un modal que cambia de alto |
| puede cambiar de destino a medio camino | resorte (conserva la velocidad) | números que ruedan, avisos que se apilan |
| es un color, un borde, una opacidad o una sombra | transition-colors duration-quick | hover de filas y botones |
| es una entrada de una sola vez | animate-rise o animate-settle | una fila nueva por Turbo Stream |
| respira en bucle | animate-breathe | el medidor con pocos lugares, "en vivo" |
| es la respuesta al toque | eui-press | todo lo que se presiona |
Y lo que nunca: duraciones fijas en milisegundos, linear, rebotes en un hover, animaciones que no respetan el dial.