React 19.3: View Transitions, Fragment Refs and browser() Are Stable
React 19.3 (9 September 2026) makes View Transitions stable with the <ViewTransition> component and addTransitionType, adds Fragment Refs for working with groups of DOM nodes without wrappers, introduces react-dom's browser() for client-only rendering, and adds Trusted Types support. Examples and what changes for your app.
The React team released React 19.3 on 9 September 2026. It's also the React version bundled with Next.js 16.4. (What Is React?)
View Transitions (stable)
The <ViewTransition> component animates elements as they enter, exit, move or resize, using the browser's View Transition API:
import { ViewTransition, startTransition, addTransitionType } from 'react'
{isShowing && (
<ViewTransition>
<Panel />
</ViewTransition>
)}
Updates must be marked as Transitions to animate — urgent updates aren't. addTransitionType tags why a transition happened, so the same change can animate differently:
startTransition(() => {
addTransitionType('next')
setSlide(s => s + 1)
})
// <ViewTransition enter={{ next: 'from-right', previous: 'from-left' }}>
It also integrates with Suspense, so you can animate only the fallback-to-content swap. It currently works in the DOM only.
Fragment Refs
A ref on <Fragment> gives you a FragmentInstance for a group of sibling DOM nodes — no wrapper <div>, and no need for child components to forward refs. It supports addEventListener, focus, scrollIntoView and observeUsing (for IntersectionObserver and friends):
const ref = useRef(null)
useEffect(() => { ref.current.focus() }, [])
return (
<Fragment ref={ref}>
{items.map(item => <Row key={item.id} item={item} />)}
</Fragment>
)
browser(): render only on the client
use(browser()) from react-dom suspends during server rendering — so the Suspense fallback goes into the HTML — and doesn't suspend on the client after hydration. It's a clean fix for components that depend on browser-only information, like time zones or localStorage, which otherwise cause hydration mismatches:
import { use } from 'react'
import { browser } from 'react-dom'
function LocalTime() {
use(browser())
return <p>{new Intl.DateTimeFormat().resolvedOptions().timeZone}</p>
}
(Next.js Hydration Error, window is not defined)
Other additions
- Trusted Types support — React passes values to DOM APIs without string coercion, so strict Trusted Types policies work. (Content Security Policy)
- Context can be rendered directly as
<UserContext value={...}>from a'use client'module in Server Components setups. onFullscreenChange/onFullscreenErrorevents and many bug fixes.
Upgrade
npm install react@^19.3.0 react-dom@^19.3.0
The release post lists no breaking changes. Next.js 16.4 ships it for you. (Next.js 16.4)
Source: React 19.3 announcement
EasySpawn gives Claude Code a running copy of your app on a persistent server, so it can adopt features like View Transitions and check them in a real browser before you merge. See how it works or join the waitlist.
Related: React useActionState and useOptimistic · React Server Components Explained · React useEffect Explained · What Is JSX?
Keep reading
TypeScript 7 Is Out: The Go-Native Compiler and What It Means for Your Project
TypeScript 7.0, released on 8 July 2026, replaces the JavaScript-based compiler with a native port written in Go that is roughly 10x faster. Same package name and tsc command, stricter defaults, removed deprecated options — and a programmatic API caveat for tools. How to upgrade and what to watch for.
Next.js September 2026 Security Release: Upgrade to 16.3.8 or 15.5.27
Next.js patched seven vulnerabilities on 30 September 2026 in v16.3.8 and v15.5.27, after an out-of-band critical fix on 22 September. A high-severity SSRF in image optimisation, several cache-poisoning and cache-leak issues for SSG/ISR and 'use cache', and a dev-server MCP endpoint that leaked project data to malicious websites. Who's affected and what to do.