Skip to content

Enables Basic View Transition support for React Native Fabric renderer#504

Open
everettbu wants to merge 15 commits into
mainfrom
view-transition-fabric
Open

Enables Basic View Transition support for React Native Fabric renderer#504
everettbu wants to merge 15 commits into
mainfrom
view-transition-fabric

Conversation

@everettbu

@everettbu everettbu commented Feb 11, 2026

Copy link
Copy Markdown

Mirror of facebook/react#35764
Original author: zeyap


Summary

Enables Basic View Transition support for React Native Fabric renderer.

Implemented:

  • Added FabricUIManager bindings for view transition methods: measureInstance, applyViewTransitionName, startViewTransition, restoreViewTransitionName, and cancelViewTransitionName
  • Implemented startViewTransition with proper callback orchestration (mutation → layout → afterMutation → spawnedWork → passive)
  • Added fallback behavior that flushes work synchronously when Fabric's startViewTransition returns false (e.g., when the ViewTransition ReactNativeFeatureFlag is not enabled)
  • Added Flow type declarations for new FabricUIManager methods

Stubbed with __DEV__ warnings (not yet implemented):

  • cancelRootViewTransitionName
  • restoreRootViewTransitionName
  • cloneRootViewTransitionContainer
  • removeRootViewTransitionClone
  • measureClonedInstance
  • hasInstanceChanged
  • hasInstanceAffectedParent
  • startGestureTransition
  • stopViewTransition
  • getCurrentGestureOffset

This allows React Native apps using Fabric to leverage the View Transition API for coordinated animations during state transitions, with graceful degradation when the native side doesn't support it.

Below are diagrams of proposed architecture in fabric, and observation of what/when config functions get called during a basic shared transition example
Untitled-2026-02-11-1156

How did you test this change?

  • yarn flow fabric - Flow type checks pass
  • yarn lint - Lint checks pass
  • Manually tested in Android catalyst app with enableViewTransition in ReactFeatureFlags.test-renderer.native-fb.js and View Transition enabled via ReactNativeFeatureFlag
  • Verified in the minified ReactFabric-dev.fb.js that the 'shim' config functions are not included
  • Verified fallback behavior logs warning in __DEV__ and flushes work synchronously when ViewTransition flag isn't enabled in Fabric

@greptile-apps

greptile-apps Bot commented Feb 11, 2026

Copy link
Copy Markdown

Greptile Summary

This PR wires up basic View Transition support for the React Native Fabric renderer by adding FabricUIManager bindings, implementing startViewTransition with a mutation→layout→afterMutation→spawned→passive callback pipeline, and consolidating no-op view-transition stubs across ART, legacy Native, and test renderers into a shared ReactFiberConfigWithNoViewTransition module. All new flags default to false, so the feature is off by default and gated behind ReactNativeFeatureFlag on the native side.

Key concerns identified in this review (in addition to those already raised in prior threads):

  • Double mutation risk in fallback path (ReactFiberConfigFabricWithViewTransition.js:229–251): The combined callback passed to fabricStartViewTransition includes mutationCallback(), layoutCallback(), and afterMutationCallback(). If the native side invokes this callback before returning null (e.g. transition attempted but animation couldn't be prepared), the fallback block re-invokes mutationCallback() and layoutCallback() — applying mutations twice. The safety of the current code relies on an undocumented contract that the native side will never call the callback when returning null.
  • blockedCallback never invoked (ReactFiberConfigFabricWithViewTransition.js:226): This profiling-only callback (called inside enableProfilerTimer in the DOM renderer) is accepted as a parameter but never called in any code path, so Fabric view-transition profiler traces will always appear unblocked.
  • No null guard on fabricMeasureInstance result (ReactFiberConfigFabricWithViewTransition.js:113–126): The native measurement is destructured immediately without a null check, risking a TypeError if the node is unmounted or not yet attached.

Confidence Score: 2/5

  • Not safe to merge — multiple unresolved correctness issues in the core transition implementation that could corrupt commit state or crash at runtime.
  • Between the issues already flagged in prior threads (always-null startViewTransition return, immediate addViewTransitionFinishedListener callback, missing error handler on ready promise, finishedAnimation never called, ViewTransitionPseudoElement missing prototype methods, Flow type mismatch on startViewTransition, missing GestureTimeline/getCurrentGestureOffset exports) and the new issues identified here (double mutation risk in the fallback path, blockedCallback never invoked, no null guard on native measurement), the main implementation file has too many open correctness gaps to merge safely. The overall architecture and staging approach are sound, but the implementation needs several targeted fixes before it can be relied upon.
  • packages/react-native-renderer/src/ReactFiberConfigFabricWithViewTransition.js requires the most attention, followed by scripts/flow/react-native-host-hooks.js for the Flow type mismatch and packages/react-reconciler/src/ReactFiberConfigWithNoViewTransition.js for the missing GestureTimeline/getCurrentGestureOffset exports.

Important Files Changed

Filename Overview
packages/react-native-renderer/src/ReactFiberConfigFabricWithViewTransition.js Core Fabric view transition implementation. Contains several issues: double mutation risk in the null-transition fallback path, blockedCallback never invoked, finishedAnimation never called (profiler impact), missing error handler on ready promise, addViewTransitionFinishedListener fires immediately rather than after animation, and ViewTransitionPseudoElement missing .animate()/.getAnimations() prototype methods.
packages/react-native-renderer/src/ReactFiberConfigFabric.js Fabric renderer config that now delegates all view-transition exports to ReactFiberConfigFabricWithViewTransition. The delegation is clean, but inherits all issues from that module. Also, startViewTransition via delegation always returns null from startGestureTransition, which can cause problems when the reconciler uses the return value to manage running transitions.
scripts/flow/react-native-host-hooks.js Flow type for nativeFabricUIManager.startViewTransition declares three parameters (mutationCallback, onReady, onComplete) and returns boolean, but the implementation calls it with a single argument and expects a nullable RunningViewTransition object back. The mismatch means Flow will not catch call-site errors and the declared onReady/onComplete callbacks are never actually wired up.
packages/react-reconciler/src/ReactFiberConfigWithNoViewTransition.js New shared no-op module for renderers that don't support view transitions. Correctly shims all known view-transition APIs, but is missing the GestureTimeline type export and getCurrentGestureOffset function that the reconciler imports from ReactFiberConfig via ReactFiberGestureScheduler.js. ART and the legacy Native renderer now depend on this module and will be missing those two exports.
packages/react-art/src/ReactFiberConfigART.js Removed ~90 lines of inline view-transition stubs and replaced with a single export * from 'react-reconciler/src/ReactFiberConfigWithNoViewTransition'. Clean consolidation, but inherits the missing GestureTimeline/getCurrentGestureOffset gap from that module.
packages/react-native-renderer/src/ReactFiberConfigNative.js Legacy Native renderer now re-exports view-transition stubs from ReactFiberConfigWithNoViewTransition. Same missing-export concern as ART, but otherwise a straightforward cleanup.
packages/shared/forks/ReactFeatureFlags.native-fb.js Added enableViewTransition, enableViewTransitionForPersistenceMode, and enableGestureTransition flags, all defaulting to false. This is correct for a staged rollout — the implementation is wired in but gated off until the native side is ready.
packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js Added view-transition feature flags mirroring the native-fb fork. All flags default to false, consistent with the rest of the feature flag forks in this PR.

Comments Outside Diff (3)

  1. packages/react-native-renderer/src/ReactFiberConfigFabricWithViewTransition.js, line 229-251 (link)

    Double mutation risk in fallback path

    fabricStartViewTransition is called with a combined callback that runs mutationCallback(), layoutCallback(), and afterMutationCallback(). If the native implementation invokes this callback before returning null (e.g., because it starts the transition, applies mutations, but then fails to produce an animation object), the fallback block at lines 243–251 re-invokes mutationCallback() and layoutCallback() a second time.

    Whether this is safe depends entirely on an undocumented contract — that the native side guarantees it will never call the callback if it returns null. That guarantee is not asserted or documented anywhere in this code, making it fragile and easy to break from the native side.

    At minimum, the assumption should be explicitly documented with a comment like:

    // NOTE: fabricStartViewTransition MUST NOT invoke the mutationCallback if it
    // returns null, or these calls below will duplicate the mutation phase.
    mutationCallback();
    layoutCallback();

    Alternatively, a boolean guard could prevent the double-call:

    let mutationsApplied = false;
    const transition = fabricStartViewTransition(() => {
      mutationsApplied = true;
      mutationCallback();
      layoutCallback();
      afterMutationCallback();
    });
    
    if (transition == null) {
      if (!mutationsApplied) {
        mutationCallback();
        layoutCallback();
        spawnedWorkCallback();
      }
      return null;
    }
  2. packages/react-native-renderer/src/ReactFiberConfigFabricWithViewTransition.js, line 226-261 (link)

    blockedCallback is accepted but never invoked

    The blockedCallback parameter is declared in the function signature but is never called anywhere in the function body — not in the success path (transition.ready.then(...), transition.finished.finally(...)), not in the fallback path, and not in startGestureTransition.

    In the DOM renderer (ReactFiberConfigDOM.js:2227–2234), blockedCallback is called inside an enableProfilerTimer guard when the view transition is stalled waiting on fonts or images:

    if (enableProfilerTimer) {
      blockedCallback(blockedReason);
    }

    This callback feeds into React's performance profiling pipeline (trackAnimatingTask). Without calling it, Fabric view transitions will always appear as "unblocked" in profiler traces, even when the native side is waiting on resources.

    If blocking detection is not yet implemented for Fabric, consider adding a // TODO comment to note the gap, so the missing call is visible to future implementors.

  3. packages/react-native-renderer/src/ReactFiberConfigFabricWithViewTransition.js, line 113-126 (link)

    No null guard on fabricMeasureInstance result

    fabricMeasureInstance(instance.node) is called and its result is destructured immediately without a null check. While the Flow type for nativeFabricUIManager.measureInstance declares a non-nullable return type, native methods can return null in practice if the node is not yet attached to the tree, has been detached, or if the native side encounters an error.

    If fabricMeasureInstance returns null, the accesses to measurement.x, measurement.y, measurement.width, and measurement.height will throw a TypeError at runtime, crashing the transition.

    Consider adding a guard:

Fix All in Claude Code Fix All in Codex

Prompt To Fix All With AI
This is a comment left during a code review.
Path: packages/react-native-renderer/src/ReactFiberConfigFabricWithViewTransition.js
Line: 229-251

Comment:
**Double mutation risk in fallback path**

`fabricStartViewTransition` is called with a combined callback that runs `mutationCallback()`, `layoutCallback()`, and `afterMutationCallback()`. If the native implementation invokes this callback before returning `null` (e.g., because it starts the transition, applies mutations, but then fails to produce an animation object), the fallback block at lines 243–251 re-invokes `mutationCallback()` and `layoutCallback()` a second time.

Whether this is safe depends entirely on an undocumented contract — that the native side guarantees it will **never** call the callback if it returns `null`. That guarantee is not asserted or documented anywhere in this code, making it fragile and easy to break from the native side.

At minimum, the assumption should be explicitly documented with a comment like:

```js
// NOTE: fabricStartViewTransition MUST NOT invoke the mutationCallback if it
// returns null, or these calls below will duplicate the mutation phase.
mutationCallback();
layoutCallback();
```

Alternatively, a boolean guard could prevent the double-call:
```js
let mutationsApplied = false;
const transition = fabricStartViewTransition(() => {
  mutationsApplied = true;
  mutationCallback();
  layoutCallback();
  afterMutationCallback();
});

if (transition == null) {
  if (!mutationsApplied) {
    mutationCallback();
    layoutCallback();
    spawnedWorkCallback();
  }
  return null;
}
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: packages/react-native-renderer/src/ReactFiberConfigFabricWithViewTransition.js
Line: 226-261

Comment:
**`blockedCallback` is accepted but never invoked**

The `blockedCallback` parameter is declared in the function signature but is never called anywhere in the function body — not in the success path (`transition.ready.then(...)`, `transition.finished.finally(...)`), not in the fallback path, and not in `startGestureTransition`.

In the DOM renderer (`ReactFiberConfigDOM.js:2227–2234`), `blockedCallback` is called inside an `enableProfilerTimer` guard when the view transition is stalled waiting on fonts or images:

```js
if (enableProfilerTimer) {
  blockedCallback(blockedReason);
}
```

This callback feeds into React's performance profiling pipeline (`trackAnimatingTask`). Without calling it, Fabric view transitions will always appear as "unblocked" in profiler traces, even when the native side is waiting on resources.

If blocking detection is not yet implemented for Fabric, consider adding a `// TODO` comment to note the gap, so the missing call is visible to future implementors.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: packages/react-native-renderer/src/ReactFiberConfigFabricWithViewTransition.js
Line: 113-126

Comment:
**No null guard on `fabricMeasureInstance` result**

`fabricMeasureInstance(instance.node)` is called and its result is destructured immediately without a null check. While the Flow type for `nativeFabricUIManager.measureInstance` declares a non-nullable return type, native methods can return `null` in practice if the node is not yet attached to the tree, has been detached, or if the native side encounters an error.

If `fabricMeasureInstance` returns `null`, the accesses to `measurement.x`, `measurement.y`, `measurement.width`, and `measurement.height` will throw a `TypeError` at runtime, crashing the transition.

Consider adding a guard:

```suggestion
export function measureInstance(instance: Instance): InstanceMeasurement {
  const measurement = fabricMeasureInstance(instance.node);
  if (measurement == null) {
    return {rect: {x: 0, y: 0, width: 0, height: 0}, abs: false, clip: false, view: false};
  }
  return {
    rect: {
      x: measurement.x,
      y: measurement.y,
      width: measurement.width,
      height: measurement.height,
    },
    abs: false,
    clip: false,
    view: true,
  };
}
```

How can I resolve this? If you propose a fix, please make it concise.

Last reviewed commit: aff6b07

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

4 files reviewed, 2 comments

Edit Code Review Agent Settings | Greptile

Comment thread packages/react-native-renderer/src/ReactFiberConfigFabric.js Outdated
Comment on lines +243 to +246
export function cancelRootViewTransitionName(rootContainer: Container): void {
if (__DEV__) {
console.warn('cancelRootViewTransitionName is not implemented');
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Root APIs are no-ops

cancelRootViewTransitionName/restoreRootViewTransitionName are stubbed (only __DEV__ warnings), but the reconciler calls these for persistence renderers during commit/gesture flows. As a result, root-level view-transition-name cancellation/restoration won’t happen on Fabric, leaving root transition state inconsistent with what the reconciler assumes (e.g., cancellations that bubbled to the root never get undone).

Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/react-native-renderer/src/ReactFiberConfigFabric.js
Line: 243:246

Comment:
**Root APIs are no-ops**

`cancelRootViewTransitionName`/`restoreRootViewTransitionName` are stubbed (only `__DEV__` warnings), but the reconciler calls these for persistence renderers during commit/gesture flows. As a result, root-level view-transition-name cancellation/restoration won’t happen on Fabric, leaving root transition state inconsistent with what the reconciler assumes (e.g., cancellations that bubbled to the root never get undone).

How can I resolve this? If you propose a fix, please make it concise.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

4 files reviewed, 3 comments

Edit Code Review Agent Settings | Greptile

Comment thread scripts/flow/react-native-host-hooks.js
Comment on lines +332 to +348
export function startGestureTransition(
suspendedState: null | SuspendedState,
rootContainer: Container,
timeline: GestureTimeline,
rangeStart: number,
rangeEnd: number,
transitionTypes: null | TransitionTypes,
mutationCallback: () => void,
animateCallback: () => void,
errorCallback: (error: mixed) => void,
finishedAnimation: () => void,
): RunningViewTransition {
if (__DEV__) {
console.warn('startGestureTransition is not implemented');
}
return null;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

startGestureTransition returns null despite non-nullable type

The return type is declared as RunningViewTransition (non-nullable, per line 218-223: an object with skipTransition(), finished, and ready), but this function returns null. The reconciler at ReactFiberWorkLoop.js:4432 assigns the result to both pendingViewTransition and finishedGesture.running, which are later used by stopViewTransition() and for cancellation logic.

Returning null here means finishedGesture.running will be null, and any attempt to stop or cancel the gesture transition will silently fail or error. Either the return type should be null | RunningViewTransition, or this stub needs to return a valid RunningViewTransition object (e.g., with no-op skipTransition and pre-resolved promises).

Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/react-native-renderer/src/ReactFiberConfigFabric.js
Line: 332:348

Comment:
**`startGestureTransition` returns null despite non-nullable type**

The return type is declared as `RunningViewTransition` (non-nullable, per line 218-223: an object with `skipTransition()`, `finished`, and `ready`), but this function returns `null`. The reconciler at `ReactFiberWorkLoop.js:4432` assigns the result to both `pendingViewTransition` and `finishedGesture.running`, which are later used by `stopViewTransition()` and for cancellation logic.

Returning `null` here means `finishedGesture.running` will be `null`, and any attempt to stop or cancel the gesture transition will silently fail or error. Either the return type should be `null | RunningViewTransition`, or this stub needs to return a valid `RunningViewTransition` object (e.g., with no-op `skipTransition` and pre-resolved promises).

How can I resolve this? If you propose a fix, please make it concise.

Comment on lines +356 to +361
export function addViewTransitionFinishedListener(
transition: RunningViewTransition,
callback: () => void,
): void {
callback();
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Immediate callback invocation may cause premature cleanup

addViewTransitionFinishedListener calls callback() immediately, but the reconciler uses this to register cleanup functions that should run when the view transition animation finishes (see ReactFiberWorkLoop.js:4278-4284). In the DOM renderer, this is transition.finished.finally(callback).

Since Fabric's startViewTransition now returns a RunningViewTransition with a finished promise (line 218-223), this implementation should use transition.finished.finally(callback) (or .then(callback)) like the DOM renderer does, so cleanup runs after the native animation completes rather than immediately.

Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/react-native-renderer/src/ReactFiberConfigFabric.js
Line: 356:361

Comment:
**Immediate callback invocation may cause premature cleanup**

`addViewTransitionFinishedListener` calls `callback()` immediately, but the reconciler uses this to register *cleanup* functions that should run when the view transition animation finishes (see `ReactFiberWorkLoop.js:4278-4284`). In the DOM renderer, this is `transition.finished.finally(callback)`.

Since Fabric's `startViewTransition` now returns a `RunningViewTransition` with a `finished` promise (line 218-223), this implementation should use `transition.finished.finally(callback)` (or `.then(callback)`) like the DOM renderer does, so cleanup runs after the native animation completes rather than immediately.

How can I resolve this? If you propose a fix, please make it concise.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

4 files reviewed, 2 comments

Edit Code Review Agent Settings | Greptile

Comment on lines +422 to +424
transition.ready.then(() => {
spawnedWorkCallback();
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing error handler on ready promise

The DOM renderer handles transition.ready rejection with a dedicated error handler (transition.ready.then(readyCallback, handleError) in ReactFiberConfigDOM.js:2322) that calls errorCallback and flushes remaining work synchronously as a recovery path. Here, if transition.ready rejects (e.g., due to a native-side error), spawnedWorkCallback will never be called, the errorCallback parameter is silently ignored, and the unhandled promise rejection could crash the app or leave the commit lifecycle in an inconsistent state where spawned work is never flushed.

Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/react-native-renderer/src/ReactFiberConfigFabric.js
Line: 422-424

Comment:
**Missing error handler on `ready` promise**

The DOM renderer handles `transition.ready` rejection with a dedicated error handler (`transition.ready.then(readyCallback, handleError)` in `ReactFiberConfigDOM.js:2322`) that calls `errorCallback` and flushes remaining work synchronously as a recovery path. Here, if `transition.ready` rejects (e.g., due to a native-side error), `spawnedWorkCallback` will never be called, the `errorCallback` parameter is silently ignored, and the unhandled promise rejection could crash the app or leave the commit lifecycle in an inconsistent state where spawned work is never flushed.

How can I resolve this? If you propose a fix, please make it concise.

Comment thread scripts/flow/react-native-host-hooks.js
@everettbu
everettbu force-pushed the view-transition-fabric branch from 3b94734 to def44a1 Compare March 5, 2026 20:22
@everettbu
everettbu force-pushed the view-transition-fabric branch from c730c17 to efe355f Compare March 6, 2026 14:22
export const stopViewTransition = shim;
export const addViewTransitionFinishedListener = shim;
export type ViewTransitionInstance = null | {name: string, ...};
export const createViewTransitionInstance = shim;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing GestureTimeline and getCurrentGestureOffset exports

This module is missing exports for GestureTimeline (type) and getCurrentGestureOffset (function), which the reconciler imports from ReactFiberConfig at ReactFiberGestureScheduler.js:12,27:

import type {GestureTimeline, RunningViewTransition} from './ReactFiberConfig';
import {getCurrentGestureOffset, stopViewTransition} from './ReactFiberConfig';

Prior to this PR, these were defined directly in each renderer config (ART, Native legacy, Test). This PR removes them from ART and Native (legacy) — those renderers now rely solely on ReactFiberConfigWithNoViewTransition for view-transition-related exports, but this module doesn't include these two. The result is that ART and the legacy Native renderer are missing required exports that the reconciler depends on.

The Test renderer still defines GestureTimeline and getCurrentGestureOffset locally (lines 371-376), so it's unaffected. Fabric gets them from ReactFiberConfigWithNoMutation. But ART and the legacy Native renderer have no source for these.

Consider adding the following to this module:

export type GestureTimeline = null;
export function getCurrentGestureOffset(provider: GestureTimeline): number {
  throw new Error(
    'The current renderer does not support view transitions. ' +
      'This error is likely caused by a bug in React. ' +
      'Please file an issue.',
  );
}
Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/react-reconciler/src/ReactFiberConfigWithNoViewTransition.js
Line: 42

Comment:
**Missing `GestureTimeline` and `getCurrentGestureOffset` exports**

This module is missing exports for `GestureTimeline` (type) and `getCurrentGestureOffset` (function), which the reconciler imports from `ReactFiberConfig` at `ReactFiberGestureScheduler.js:12,27`:

```js
import type {GestureTimeline, RunningViewTransition} from './ReactFiberConfig';
import {getCurrentGestureOffset, stopViewTransition} from './ReactFiberConfig';
```

Prior to this PR, these were defined directly in each renderer config (ART, Native legacy, Test). This PR removes them from ART and Native (legacy) — those renderers now rely solely on `ReactFiberConfigWithNoViewTransition` for view-transition-related exports, but this module doesn't include these two. The result is that ART and the legacy Native renderer are missing required exports that the reconciler depends on.

The Test renderer still defines `GestureTimeline` and `getCurrentGestureOffset` locally (lines 371-376), so it's unaffected. Fabric gets them from `ReactFiberConfigWithNoMutation`. But ART and the legacy Native renderer have no source for these.

Consider adding the following to this module:

```
export type GestureTimeline = null;
export function getCurrentGestureOffset(provider: GestureTimeline): number {
  throw new Error(
    'The current renderer does not support view transitions. ' +
      'This error is likely caused by a bug in React. ' +
      'Please file an issue.',
  );
}
```

How can I resolve this? If you propose a fix, please make it concise.

Fix in Claude Code Fix in Codex

zeyap added 15 commits March 11, 2026 15:35
Wherever the reconciler checks supportsMutation before running view
transition logic, add an else-if branch gated on
enableViewTransitionForPersistenceMode for persistent renderers (Fabric).

This follows the pattern that supportsMutation guards mutation-mode-only
logic, and persistent mode should have its own branch rather than being
lumped under a single supportsViewTransition capability flag.

For now the persistent mode branches duplicate the mutation logic.
The flag defaults to false in all channels.
Summary:
- turn on enableViewTransition feature
- stub shim
- run some mutation config fn at persistence mode too
Better reflects that this signals the transition has started rather than
initiating it.
@everettbu
everettbu force-pushed the view-transition-fabric branch from e5a7693 to aff6b07 Compare March 11, 2026 23:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants