Skip to content

Commit 8814b0e

Browse files
authored
Add React 19 support (#3543)
This PR fixes an issue where `@headlessui/react` was not compatible with React 19. We made sure that accessing `ref`s is safe and works in React 18 and React 19. We also made sure to include React 19 as a valid version in the peer dependencies. For now, we also allowed the RC versions of React and React DOM.
1 parent 5eb3b12 commit 8814b0e

File tree

3 files changed

+12
-5
lines changed

3 files changed

+12
-5
lines changed

packages/@headlessui-react/CHANGELOG.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10-
- Nothing yet!
10+
### Added
11+
12+
- Add React 19 support ([#3543](https://github.com/tailwindlabs/headlessui/pull/3543))
1113

1214
## [2.1.10] - 2024-10-10
1315

packages/@headlessui-react/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@
4242
"clean": "rimraf ./dist"
4343
},
4444
"peerDependencies": {
45-
"react": "^18",
46-
"react-dom": "^18"
45+
"react": "^18 || ^19 || ^19.0.0-rc",
46+
"react-dom": "^18 || ^19 || ^19.0.0-rc"
4747
},
4848
"devDependencies": {
4949
"@testing-library/react": "^15.0.7",

packages/@headlessui-react/src/utils/render.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {
1+
import React, {
22
Fragment,
33
cloneElement,
44
createElement,
@@ -257,7 +257,7 @@ function _render<TTag extends ElementType, TSlot>(
257257
mergedProps,
258258
dataAttributes,
259259
refRelatedProps,
260-
{ ref: mergeRefs((resolvedChildren as any).ref, refRelatedProps.ref) },
260+
{ ref: mergeRefs(getElementRef(resolvedChildren), refRelatedProps.ref) },
261261
classNameProps
262262
)
263263
)
@@ -460,3 +460,8 @@ function omit<T extends Record<any, any>>(object: T, keysToOmit: string[] = [])
460460
}
461461
return clone
462462
}
463+
464+
function getElementRef(element: React.ReactElement) {
465+
// @ts-expect-error
466+
return React.version.split('.')[0] >= '19' ? element.props.ref : element.ref
467+
}

0 commit comments

Comments
 (0)