Skip to content

Conversation

@rickhanlonii
Copy link
Member

No description provided.

@meta-cla meta-cla bot added the CLA Signed label Dec 19, 2025
@github-actions github-actions bot added the React Core Team Opened by a member of the React Core Team label Dec 19, 2025
@react-sizebot
Copy link

react-sizebot commented Dec 19, 2025

Comparing: 65eec42...d59601f

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable/react-dom/cjs/react-dom.production.js = 6.84 kB 6.84 kB = 1.88 kB 1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js +0.03% 607.60 kB 607.79 kB +0.03% 107.53 kB 107.56 kB
oss-experimental/react-dom/cjs/react-dom.production.js = 6.84 kB 6.84 kB = 1.88 kB 1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js +0.03% 666.83 kB 667.01 kB +0.01% 117.42 kB 117.43 kB
facebook-www/ReactDOM-prod.classic.js +0.05% 692.91 kB 693.25 kB +0.05% 121.92 kB 121.98 kB
facebook-www/ReactDOM-prod.modern.js +0.05% 683.34 kB 683.68 kB +0.05% 120.31 kB 120.36 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against d59601f

@facebook facebook deleted a comment from diffray-bot Dec 22, 2025
@facebook facebook deleted a comment from diffray-bot Dec 22, 2025
@facebook facebook deleted a comment from diffray-bot Dec 22, 2025
@facebook facebook deleted a comment from diffray-bot Dec 22, 2025
@facebook facebook deleted a comment from diffray-bot Dec 22, 2025
@facebook facebook deleted a comment from diffray-bot Dec 22, 2025
@facebook facebook deleted a comment from diffray-bot Dec 22, 2025
@facebook facebook deleted a comment from diffray-bot Dec 22, 2025
@facebook facebook deleted a comment from diffray-bot Dec 22, 2025
@facebook facebook deleted a comment from diffray-bot Dec 22, 2025
@facebook facebook deleted a comment from diffray-bot Dec 22, 2025
@facebook facebook deleted a comment from diffray-bot Dec 22, 2025
@rickhanlonii
Copy link
Member Author

@diffray-bot thanks, you've been banned.

@facebook facebook deleted a comment from diffray-bot Jan 7, 2026
@facebook facebook deleted a comment from diffray-bot Jan 7, 2026
@facebook facebook deleted a comment from diffray-bot Jan 7, 2026
@sebmarkbage
Copy link
Collaborator

I ran into an interesting issue in the View Transition fixture once we unentangle. If there's another Transition that can commit while we have started a Navigation, then we'll wait for that Navigation to finish before we can commit it. However, it might be blocked by a different Navigation which is going to unblock it with its useLayoutEffect. This causes it to trigger this error:

return new Error(
'A ViewTransition timed out because a Navigation stalled. ' +
'This can happen if a Navigation is blocked on React itself. ' +
"Such as if it's resolved inside useEffect. " +
'This can be solved by moving the resolution to useLayoutEffect.',
{cause: error},
);

We have that wait so that scroll restoration and other browser state can resolve properly before the animation finishes but there's no need to wait for it unless this is the Transition that's going to be unblocking it. We'd need to somehow know which Navigation is connected to which Transition.

sebmarkbage added a commit that referenced this pull request Jan 16, 2026
…35486)

Stacked on #35485.

Before this PR, the `startGestureTransition` API would itself never
commit its state. After the gesture releases it stops the animation in
the next commit which just leaves the DOM tree in the original state. If
there's an actual state change from the Action then that's committed as
the new DOM tree. To avoid animating from the original state to the new
state again, this is DOM without an animation. However, this means that
you can't have the actual action committing be in a slightly different
state and animate between the final gesture state and into the new
action.

Instead, we now actually keep the render tree around and commit it in
the end. Basically we assume that if the Timeline was closer to the end
then visually you're already there and we can commit into that state.
Most of the time this will be at the actual end state when you release
but if you have something else cancelling the gesture (e.g.
`touchcancel`) it can still commit this state even though your gesture
recognizer might not consider this an Action. I think this is ok and
keeps it simple.

When the gesture lane commits, it'll leave a Transition behind as work
from the revert lanes on the Optimistic updates. This means that if you
don't do anything in the Action this will cause another commit right
after which reverts. This revert can animate the snap back.

There's a few fixes needed in follow up PRs:

- Fixed in #35487. ~To support unentangled Transitions we need to
explicitly entangle the revert lane with the Action to avoid committing
a revert followed by a forward instead of committing the forward
entangled with the revert. This just works now since everything is
entangled but won't work with #35392.~
- Fixed in #35510. ~This currently rerenders the gesture lane once
before committing if it was already completed but blocked. We should be
able to commit the already completed tree as is.~
sebmarkbage added a commit that referenced this pull request Jan 16, 2026
…35487)

Stacked on #35486.

When a Gesture commits, it leaves behind work on a Transition lane
(`revertLane`). This entangles that lane with whatever lane we're using
in the event that cancels the Gesture. This ensures that the revert and
the result of any resulting Action commits as one batch. Typically the
Action would apply a new state that is similar or the same as the revert
of the Gesture.

This makes it resilient to unbatching in #35392.
github-actions bot pushed a commit that referenced this pull request Jan 16, 2026
…35486)

Stacked on #35485.

Before this PR, the `startGestureTransition` API would itself never
commit its state. After the gesture releases it stops the animation in
the next commit which just leaves the DOM tree in the original state. If
there's an actual state change from the Action then that's committed as
the new DOM tree. To avoid animating from the original state to the new
state again, this is DOM without an animation. However, this means that
you can't have the actual action committing be in a slightly different
state and animate between the final gesture state and into the new
action.

Instead, we now actually keep the render tree around and commit it in
the end. Basically we assume that if the Timeline was closer to the end
then visually you're already there and we can commit into that state.
Most of the time this will be at the actual end state when you release
but if you have something else cancelling the gesture (e.g.
`touchcancel`) it can still commit this state even though your gesture
recognizer might not consider this an Action. I think this is ok and
keeps it simple.

When the gesture lane commits, it'll leave a Transition behind as work
from the revert lanes on the Optimistic updates. This means that if you
don't do anything in the Action this will cause another commit right
after which reverts. This revert can animate the snap back.

There's a few fixes needed in follow up PRs:

- Fixed in #35487. ~To support unentangled Transitions we need to
explicitly entangle the revert lane with the Action to avoid committing
a revert followed by a forward instead of committing the forward
entangled with the revert. This just works now since everything is
entangled but won't work with #35392.~
- Fixed in #35510. ~This currently rerenders the gesture lane once
before committing if it was already completed but blocked. We should be
able to commit the already completed tree as is.~

DiffTrain build for [4028aaa](4028aaa)
github-actions bot pushed a commit that referenced this pull request Jan 16, 2026
…35486)

Stacked on #35485.

Before this PR, the `startGestureTransition` API would itself never
commit its state. After the gesture releases it stops the animation in
the next commit which just leaves the DOM tree in the original state. If
there's an actual state change from the Action then that's committed as
the new DOM tree. To avoid animating from the original state to the new
state again, this is DOM without an animation. However, this means that
you can't have the actual action committing be in a slightly different
state and animate between the final gesture state and into the new
action.

Instead, we now actually keep the render tree around and commit it in
the end. Basically we assume that if the Timeline was closer to the end
then visually you're already there and we can commit into that state.
Most of the time this will be at the actual end state when you release
but if you have something else cancelling the gesture (e.g.
`touchcancel`) it can still commit this state even though your gesture
recognizer might not consider this an Action. I think this is ok and
keeps it simple.

When the gesture lane commits, it'll leave a Transition behind as work
from the revert lanes on the Optimistic updates. This means that if you
don't do anything in the Action this will cause another commit right
after which reverts. This revert can animate the snap back.

There's a few fixes needed in follow up PRs:

- Fixed in #35487. ~To support unentangled Transitions we need to
explicitly entangle the revert lane with the Action to avoid committing
a revert followed by a forward instead of committing the forward
entangled with the revert. This just works now since everything is
entangled but won't work with #35392.~
- Fixed in #35510. ~This currently rerenders the gesture lane once
before committing if it was already completed but blocked. We should be
able to commit the already completed tree as is.~

DiffTrain build for [4028aaa](4028aaa)
github-actions bot pushed a commit that referenced this pull request Jan 16, 2026
…35487)

Stacked on #35486.

When a Gesture commits, it leaves behind work on a Transition lane
(`revertLane`). This entangles that lane with whatever lane we're using
in the event that cancels the Gesture. This ensures that the revert and
the result of any resulting Action commits as one batch. Typically the
Action would apply a new state that is similar or the same as the revert
of the Gesture.

This makes it resilient to unbatching in #35392.

DiffTrain build for [35a81ce](35a81ce)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed React Core Team Opened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants