Todos os componentes
MotionSwap
Conteúdo que faz crossfade enquanto o tamanho acompanha.
WebReact NativeConteúdo e tamanho
Experimente
Uso mais curto
SaveButton.jsx<button onClick={save}>
<MotionSwap value={status} effect="up">
{status === 'saving' ? 'Saving…' : status === 'saved' ? 'Saved' : 'Save'}
</MotionSwap>
</button>;
O que ele resolve para você
- O elemento muda do tamanho na tela para o tamanho natural do novo conteúdo, então os botões nunca saltam.
- O conteúdo antigo some onde estava enquanto o novo aparece; nenhum dos dois se reorganiza durante a troca.
- Voltar no meio de uma troca continua do que está na tela, em vez de empilhar cópias.
- Filhos de texto simples são o próprio
value; para todo o resto, passe value.
Use para
- Salvar, depois Salvando…, depois Salvo.
- Um skeleton que vira um card de perfil.
- Um botão de play que vira pause.
Props
| Prop | Tipo | Padrão | Descrição |
|---|
value | unknown | | Identidade do conteúdo; um valor novo dispara a troca. Filhos de texto simples são a própria identidade. |
|---|
children | ReactNode | | O conteúdo. |
|---|
as | element | 'span' | O elemento a renderizar. |
|---|
inline | boolean | as === 'span' | true ajusta o tamanho ao conteúdo (rótulos, ícones); false ocupa a largura do pai e anima a altura. |
|---|
align | 'start' | 'center' | 'end' | 'center' | Onde o conteúdo fica enquanto o tamanho muda. |
|---|
effect | 'fade' | 'up' | 'down' | 'scale' | 'fade' | Como o conteúdo entra e sai: up sobe, down desce, scale cresce. |
|---|
transition | Transition | spring | Uma curva de tempo { duration, easing } ou uma mola { tempo: 'spring', spring }. As molas mantêm o embalo quando interrompidas. |
|---|
onMotionComplete | (value) => void | | Roda quando o movimento se acomoda. |
|---|
As outras props vão para o elemento renderizado, então className, style e handlers de eventos funcionam normalmente.