Movimiento
Las curvas de easing, duraciones y la comprobación de movimiento reducido con las que se anima cada componente, además de hooks para transformaciones de tamaño y resaltados deslizantes.
pnpm dlx shadcn@latest add https://hextaui.com/r/motion.jsonAñade la utilidad y todo aquello de lo que depende a tu proyecto.
Copia y pega el siguiente código en tu proyecto.
lib/motion.ts Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
Todos los componentes de HextaUI se mueven con las mismas pocas curvas y duraciones, de modo que la librería se siente como una sola cosa.
- Ease out para lo que responde a ti. Los elementos que entran, se expanden o siguen a un clic empiezan rápido y se asientan, para que la interfaz se sienta inmediata.
- Corto e interrumpible. La mayor parte del movimiento dura de 150 a 300ms. Todo lo que se puede revertir parte de donde está ahora en lugar de reiniciarse.
- El movimiento reducido es un segundo diseño, no un interruptor de apagado. El movimiento se convierte en cambios instantáneos o fundidos simples, y el estado sigue siendo legible.
El tema define las curvas como utilidades de easing de Tailwind, y lib/motion exporta los mismos valores para la Web Animations API.
| Clase | Descripción |
|---|---|
ease-out-quint | easeOut en JS. El valor por defecto para el movimiento: popovers, resaltados, cambios de tamaño. |
ease-out-cubic | Un ease out más suave para los cambios de color y sombra al pasar el cursor y al enfocar. |
ease-in-out-quart | easeInOut en JS. Para el movimiento entre dos estados de reposo que nadie provocó directamente. |
ease-spring | easeSpring en JS. Un spring con un pequeño rebote, escrito como linear(), para cosas que aterrizan, como el thumb de un toggle. |
ease-drawer | La curva de sheet de iOS para drawers y sheets que se deslizan desde un borde. |
| duration. | Descripción |
|---|---|
press: 100 | Estado pulsado al bajar. |
release: 200 | Volver a subir después de una pulsación. |
hover: 150 | Feedback al pasar el cursor y al enfocar. |
enter: 200 | Elementos que aparecen. |
exit: 150 | Elementos que se van. Las salidas son más rápidas que las entradas, así que nunca retienen nada. |
morph: 300 | Cambios de tamaño y de posición. |
prefersReducedMotion() lee la media query en el momento de la llamada. Compruébalo cuando empiece una animación en lugar de una sola vez al montar, para que un cambio en el ajuste del sistema se aplique de inmediato. Devuelve true en el servidor.
- Cualquier cambio del DOM dentro del elemento dispara un morph, ya sea texto, hijos o iconos. Los cambios de tamaño desde fuera, como un resize, no lo hacen, así que el elemento sigue a su contenedor sin retraso.
- Un cambio a mitad de un morph continúa desde el tamaño actual. Mientras se ejecuta, el elemento tiene
data-morphing, que puedes usar para recortar el desbordamiento o pausar otras transiciones. - Mantén el elemento en su tamaño natural: sin ancho ni alto fijos en el eje animado. Añade
overflow-hiddenpara que el contenido nuevo no se desborde mientras crece. - Devuelve un ref de callback. Combínalo con otros refs usando
useMergedRef.
- El resaltado se dimensiona y se traslada con estilos en línea. Dale
absolute top-0y una transición sobretransform,width,heightyopacity. - El hook observa el atributo que indiques con un
MutationObserver, así que sigue el estado desde cualquier lugar, incluidos losdata-pressed,data-checkedoaria-currentpropios de Base UI. data-visiblese establece mientras algo coincide.data-instantse establece cuando el resaltado debe saltar: en la primera aparición, al cambiar de tamaño y al hacer scroll, y con movimiento reducido. Dale estilo comodata-instant:transition-opacity.- Mide teniendo en cuenta la escala de la barra, así que permanece alineado dentro de un dialog que todavía está haciendo zoom de entrada.
| Prop | Tipo | Predeterminado |
|---|---|---|
axisQué dimensión animar. | "width" | "height" | – |
enabledSi se debe animar. | boolean | true |
durationMilisegundos. | number | 300 |
easingCualquier easing de CSS. | string | easeOut |
| Prop | Tipo | Predeterminado |
|---|---|---|
barRefEl contenedor posicionado. | RefObject<HTMLElement | null> | – |
highlightRefEl elemento que se va a mover. | RefObject<HTMLElement | null> | – |
selectorCoincide con el hijo que se va a resaltar. | string | – |
attributeEl atributo cuyos cambios mueven el resaltado. | string | "data-popup-open" |
| Exportación | Descripción |
|---|---|
easeOut | cubic-bezier(0.23, 1, 0.32, 1) |
easeInOut | cubic-bezier(0.77, 0, 0.175, 1) |
easeSpring | Un spring con linear(). |
duration | press, release, hover, enter, exit y morph. |
prefersReducedMotion() | Si el movimiento reducido está activado. true en el servidor. |
- AlertMensajes en línea para estado y comentarios, con una superficie neutra, un icono de color y un descarte que se colapsa con suavidad.
- AttachmentTarjetas de archivos e imágenes para subidas, con progreso, estados, acciones, un trigger de tarjeta completa y nombres que conservan su extensión.
- BadgeEtiquetas de estado con puntos de color, tags eliminables que se deslizan al cerrarse y contadores que ruedan hasta su nuevo valor.
- BreadcrumbUn rastro de enlaces hasta la página actual que se ajusta de forma segura, se refleja en diseños de derecha a izquierda y expande los segmentos colapsados en su lugar.
- CalendarUna cuadrícula de fechas para selección única, de rango y múltiple, con meses deslizantes, vistas previas de rango y días de tamaño táctil.
- CommandUna lista de acciones con búsqueda, en línea o como paleta ⌘K, con páginas, atajos y coincidencias resaltadas.