React 19.3 makes <ViewTransition> stable, out of experimental, so it ships without a flag. It drives enter, exit, move, and resize animations via the browser's View Transition API, and React picks the animation, defaulting to a cross-fade. Fragment Refs are stable too.
The trigger rule has teeth: only updates inside startTransition, a <Suspense> reveal, or useDeferredValue animate. Call setState directly and nothing transitions. addTransitionType labels a transition's cause, so forward and back navigation can animate differently from the same state change, and React exposes each type as a browser view transition type, so you can scope animations in CSS with :active-view-transition-type(...).
Fragment Refs yield one FragmentInstance covering a group of children, so a single IntersectionObserver or ResizeObserver replaces a ref per child. browser() is a first-class API for client-only rendering: use(browser()) suspends on the server but not after hydration, and it can be called conditionally. The post gives neither browser() nor addTransitionType a stability label.
Wrap the state update that changes the view in startTransition, and reach for addTransitionType when two triggers need different motion. If you reach for typeof window to keep a component off the server, browser() does that without the guard. If you ship a require-trusted-types-for CSP, note that React no longer coerces values with '' + value before DOM injection, so TrustedHTML values survive.