Todos los componentes
MotionSwap
Contenido que hace un fundido cruzado mientras su tamaño lo acompaña.
WebReact NativeContenido y tamaño
Pruébalo
Uso mínimo
SaveButton.jsx<button onClick={save}>
<MotionSwap value={status} effect="up">
{status === 'saving' ? 'Saving…' : status === 'saved' ? 'Saved' : 'Save'}
</MotionSwap>
</button>;
Lo que resuelve por ti
- El elemento se redimensiona desde su tamaño en pantalla hasta el tamaño natural del contenido nuevo, así que los botones nunca saltan.
- El contenido anterior se desvanece donde estaba mientras el nuevo aparece; ninguno se recoloca durante el cambio.
- Volver atrás a mitad de un cambio continúa desde lo que se ve en pantalla en lugar de apilar copias.
- Los hijos de texto plano son su propio
value; pasa value para cualquier otra cosa.
Úsalo para
- Guardar, luego Guardando… y luego Guardado.
- Un esqueleto que se convierte en una tarjeta de perfil.
- Un botón de reproducir que se convierte en pausa.
Props
| Prop | Tipo | Por defecto | Descripción |
|---|
value | unknown | | Identidad del contenido; un valor nuevo provoca el cambio. Los hijos de texto plano son su propia identidad. |
|---|
children | ReactNode | | El contenido. |
|---|
as | element | 'span' | El elemento que se renderiza. |
|---|
inline | boolean | as === 'span' | true ajusta el tamaño al contenido (etiquetas, iconos); false ocupa el ancho del padre y anima la altura. |
|---|
align | 'start' | 'center' | 'end' | 'center' | Dónde se sitúa el contenido mientras cambia el tamaño. |
|---|
effect | 'fade' | 'up' | 'down' | 'scale' | 'fade' | Cómo entra y sale el contenido: up sube, down baja y scale crece. |
|---|
transition | Transition | spring | Una curva de tiempo { duration, easing } o un resorte { tempo: 'spring', spring }. Los resortes conservan su impulso cuando se interrumpen. |
|---|
onMotionComplete | (value) => void | | Se ejecuta cuando el movimiento se asienta. |
|---|
Las demás props van al elemento renderizado, así que className, style y los manejadores de eventos funcionan como siempre.