Changelogs

New in 3.10

v3.10 makes Boundary handoff, escape clipping, navigation zoom, and gesture-driven transitions more reliable and much lighter to mount.

v3.10 is a reliability and performance release for bounds transitions.

There are no new public APIs to migrate to. The work in this release makes the existing boundary, handoff, escapeClipping, and navigation.zoom() APIs behave more predictably when transitions are interrupted, retargeted, scrolled, or driven by gestures.

More reliable Boundary handoff

Live-content handoff now follows the screen that is visually animating instead of waiting for React to remove a route. This makes a handoff chain behave more consistently when screens are opened, dismissed, or retargeted in quick succession.

The public setup is unchanged: every matching boundary in a handoff chain still opts in with handoff.

TSX

1<Transition.Boundary id="video" handoff>
2 <Transition.Boundary.Target style={styles.video} />
3</Transition.Boundary>

When a boundary moves from A to B, B becomes the active receiving location for the live payload. If B closes, the payload returns to its measured source location at the end of B's visual close rather than at an arbitrary React lifecycle point.

This improves rapid A → B → A → B flows, preserves source placeholder sizing, and avoids a class of blank frames and premature returns.

handoff remains experimental, particularly for native-backed Android views. The existing live handoff caveats still apply to video surfaces and other platform-composited content.

Smoother escape clipping

escapeClipping now attaches a linked source to its closest valid screen host as soon as that host has committed layout. This fixes source elements that previously stayed inside their clipped container instead of participating in an escapeClipping transition.

The host still waits for real layout before teleporting. That prevents the first-frame x: 0, y: 0 placement flash without delaying a valid source transition.

TSX

1<Transition.Boundary
2 id="cover"
3 escapeClipping
4 onPress={() => navigation.navigate("Detail")}
5>
6 <Transition.Boundary.Target style={styles.cover}>
7 <Image source={cover} style={styles.image} />
8 </Transition.Boundary.Target>
9</Transition.Boundary>

navigation.zoom() now keeps track of the source scroll position for keepFocusedVisible flows. If a source list moves while its destination is open, dismissing the destination returns the focused content to its current source position instead of an old snapshot.

TSX

1return bounds(id).navigation.zoom({
2 target: "bound",
3 keepFocusedVisible: true,
4});

This is built into the zoom recipe. For custom handoff scrolling outside navigation.zoom(), keep scroll compensation in your own content/interpolator layer. A handoff payload remains normal content inside its receiving screen, so the app is the right owner of custom scrolling behavior.

Zoom also has less repeated geometry work on the UI thread. The result is noticeably smoother source-to-destination and gesture-driven zoom motion, especially on Android.

More predictable gestures

Rotation is now derived directly from the active pinch gesture instead of using a separate rotation recognizer. Pan, pinch, and rotation still compose together, but the system has fewer independent gesture lifecycles to reconcile.

Interrupted pinch transitions now resume toward the active transition target when cancelled. A pinch that begins during an entering animation no longer leaves the screen stranded between its source and destination visual states.

Boundary measurement also avoids refreshing while a gesture is actively dragging, dismissing, or settling. This prevents a scaled unfocused source from being captured as a new source measurement during a pinch dismissal.

Faster Boundary mounting

Boundary targets are now resolved from the rendered child tree before the portal runtime mounts. Disabled portals render inline without mounting portal hooks, and the selected target no longer has to register through an additional React state update.

In practice, screens that mount many boundaries—such as a grid or feed of matched elements—do less initial React and portal work.

Upgrade notes

v3.10 does not require a migration. Existing Boundary, handoff, escapeClipping, pinch, and zoom code keeps the same public shape.

If you worked around previous flicker, premature handoff, source-size, or stale-scroll issues with manual delays or custom lifecycle guards, try removing those workarounds after upgrading. The transition runtime now owns those visual sequencing rules directly.

For the complete API setup, see Shared Elements and Navigation Zoom.