<LayoutTransition> animates an element from its position in the previous scene to
its new position in the current scene. Matching is by id.12345678# Scene 1 duration=3s <LayoutTransition id="title">**Hello**</LayoutTransition> # Scene 2 duration=3s <LayoutTransition id="title" duration={25} bounce={0.2}>**Hello**</LayoutTransition> <LayoutTransition id="subtitle">**World**</LayoutTransition>
| Prop | Type | Default | Description |
id | string | required | Match key between scenes |
duration | number | 20 | Animation duration in frames |
bounce | number | 0.15 | Spring bounce (0-1) |
easing | function | - | Custom easing (overrides bounce) |
mode | string | 'both' | 'both', 'position', or 'size' |
bounce. When easing is set,
the spring is replaced with interpolate() using that easing function:123<LayoutTransition id="card" easing={EASE.overshootBouncy} duration={30}> <div>Card content</div> </LayoutTransition>
showFrom and showUpTo to animate within a single section:12345678910111213141516# Active Item duration=6s <div style={{ display: 'flex', flexDirection: 'column', gap: 48 }}> <div style={{ display: 'flex', alignItems: 'center', gap: 16 }}> <LayoutTransition id="dot" showFrom={0} showUpTo={2 * FPS}> <Dot /> </LayoutTransition> <span>First item</span> </div> <div style={{ display: 'flex', alignItems: 'center', gap: 16 }}> <LayoutTransition id="dot" showFrom={2 * FPS} showUpTo={4 * FPS}> <Dot /> </LayoutTransition> <span>Second item</span> </div> </div>
LayoutTransition automatically interpolates:AbsoluteFill measure as zero-size and the transition no-ops.