Skip to content

Commit 55dc352

Browse files
fix: React inert prop compatibility (#7519)
* fix: React inert prop compatibility * chore: lint * Check using `React.version` * Fix type * fix lint --------- Co-authored-by: GitHub <[email protected]> Co-authored-by: Robert Snow <[email protected]>
1 parent 78683ee commit 55dc352

File tree

8 files changed

+24
-11
lines changed

8 files changed

+24
-11
lines changed

packages/@react-aria/utils/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export {useEffectEvent} from './useEffectEvent';
4343
export {useDeepMemo} from './useDeepMemo';
4444
export {useFormReset} from './useFormReset';
4545
export {useLoadMore} from './useLoadMore';
46+
export {inertValue} from './inertValue';
4647
export {CLEAR_FOCUS_EVENT, FOCUS_EVENT, UPDATE_ACTIVEDESCENDANT} from './constants';
4748
export {isCtrlKeyPressed} from './keyboard';
4849
export {useEnterAnimation, useExitAnimation} from './animation';
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import {version} from 'react';
2+
3+
export function inertValue(value?: boolean) {
4+
const pieces = version.split('.');
5+
const major = parseInt(pieces[0], 10);
6+
if (major >= 19) {
7+
return value;
8+
}
9+
// compatibility with React < 19
10+
return value ? 'true' : undefined;
11+
}

packages/@react-spectrum/s2/src/Breadcrumbs.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ import {focusRing, size, style} from '../style' with { type: 'macro' };
3131
import FolderIcon from '../s2wf-icons/S2_Icon_FolderBreadcrumb_20_N.svg';
3232
import {forwardRefType} from './types';
3333
import {getAllowedOverrides, StyleProps} from './style-utils' with {type: 'macro'};
34+
import {inertValue, useLayoutEffect} from '@react-aria/utils';
3435
// @ts-ignore
3536
import intlMessages from '../intl/*.json';
3637
import {Menu, MenuItem, MenuTrigger} from './Menu';
3738
import {Text} from './Content';
3839
import {useDOMRef, useResizeObserver} from '@react-spectrum/utils';
39-
import {useLayoutEffect} from '@react-aria/utils';
4040
import {useLocalizedStringFormatter} from '@react-aria/i18n';
4141
import {useSpectrumContextProps} from './useSpectrumContextProps';
4242

@@ -168,7 +168,7 @@ let HiddenBreadcrumbs = function (props: {listRef: RefObject<HTMLDivElement | nu
168168
return (
169169
<div
170170
// @ts-ignore
171-
inert="true"
171+
inert={inertValue(true)}
172172
ref={listRef}
173173
className={style({
174174
display: '[inherit]',

packages/@react-spectrum/s2/src/Card.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import {ContentContext, FooterContext, TextContext} from './Content';
2020
import {createContext, CSSProperties, forwardRef, ReactNode, useContext} from 'react';
2121
import {DividerContext} from './Divider';
2222
import {DOMProps, DOMRef, DOMRefValue} from '@react-types/shared';
23-
import {filterDOMProps} from '@react-aria/utils';
23+
import {filterDOMProps, inertValue} from '@react-aria/utils';
2424
import {focusRing, lightDark, space, style} from '../style' with {type: 'macro'};
2525
import {getAllowedOverrides, StyleProps, UnsafeStyles} from './style-utils' with {type: 'macro'};
2626
import {IllustrationContext} from './Icon';
@@ -421,7 +421,7 @@ export const Card = forwardRef(function Card(props: CardProps, ref: DOMRef<HTMLD
421421
{...filterDOMProps(otherProps)}
422422
id={id != null ? String(id) : undefined}
423423
// @ts-ignore - React < 19 compat
424-
inert={isSkeleton ? 'true' : undefined}
424+
inert={inertValue(isSkeleton)}
425425
ref={domRef}
426426
className={UNSAFE_className + card({size, density, variant, isCardView: ElementType !== 'div'}, styles)}
427427
style={UNSAFE_style}>

packages/@react-spectrum/s2/src/Content.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import {ContextValue, Keyboard as KeyboardAria, Header as RACHeader, Heading as RACHeading, TextContext as RACTextContext, SlotProps, Text as TextAria} from 'react-aria-components';
1414
import {createContext, forwardRef, ReactNode, useContext} from 'react';
1515
import {DOMRef, DOMRefValue} from '@react-types/shared';
16+
import {inertValue} from '@react-aria/utils';
1617
import {StyleString} from '../style/types';
1718
import {UnsafeStyles} from './style-utils';
1819
import {useDOMRef} from '@react-spectrum/utils';
@@ -107,7 +108,7 @@ export const Text = forwardRef(function Text(props: ContentProps, ref: DOMRef) {
107108
{...otherProps}
108109
ref={domRef}
109110
// @ts-ignore - compatibility with React < 19
110-
inert={isSkeleton ? 'true' : undefined}
111+
inert={inertValue(isSkeleton)}
111112
className={UNSAFE_className + styles}
112113
style={UNSAFE_style}
113114
slot={slot || undefined}

packages/@react-spectrum/s2/src/Skeleton.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import {cloneElement, createContext, CSSProperties, ReactElement, ReactNode, Ref, useCallback, useContext, useRef} from 'react';
1414
import {colorToken} from '../style/tokens' with {type: 'macro'};
15-
import {mergeRefs} from '@react-aria/utils';
15+
import {inertValue, mergeRefs} from '@react-aria/utils';
1616
import {mergeStyles} from '../style/runtime';
1717
import {raw} from '../style/style-macro' with {type: 'macro'};
1818
import {style} from '../style' with {type: 'macro'};
@@ -103,7 +103,7 @@ export function SkeletonText({children}) {
103103
return (
104104
<span
105105
// @ts-ignore - compatibility with React < 19
106-
inert="true"
106+
inert={inertValue(true)}
107107
ref={useLoadingAnimation(true)}
108108
className={loadingStyle + style({
109109
color: 'transparent',

packages/@react-spectrum/s2/src/TagGroup.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ import {FormContext, useFormProps} from './Form';
4040
import {forwardRefType} from './types';
4141
import {IconContext} from './Icon';
4242
import {ImageContext} from './Image';
43+
import {inertValue, useEffectEvent, useId, useLayoutEffect, useResizeObserver} from '@react-aria/utils';
4344
// @ts-ignore
4445
import intlMessages from '../intl/*.json';
4546
import {pressScale} from './pressScale';
4647
import {Text, TextContext} from './Content';
4748
import {useDOMRef} from '@react-spectrum/utils';
48-
import {useEffectEvent, useId, useLayoutEffect, useResizeObserver} from '@react-aria/utils';
4949
import {useLocalizedStringFormatter} from '@react-aria/i18n';
5050
import {useSpectrumContextProps} from './useSpectrumContextProps';
5151

@@ -319,7 +319,7 @@ function TagGroupInner<T>({
319319
{maxRows != null && (
320320
<div
321321
// @ts-ignore
322-
inert="true"
322+
inert={inertValue(true)}
323323
ref={hiddenTagsRef}
324324
className={style({
325325
display: 'inline',

packages/react-aria-components/src/Tabs.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {AriaTabListProps, AriaTabPanelProps, mergeProps, Orientation, useFocusRi
1515
import {Collection, CollectionBuilder, createHideableComponent, createLeafComponent} from '@react-aria/collections';
1616
import {CollectionProps, CollectionRendererContext, DefaultCollectionRenderer, usePersistedKeys} from './Collection';
1717
import {ContextValue, Provider, RenderProps, SlotProps, StyleRenderProps, useContextProps, useRenderProps, useSlottedContext} from './utils';
18-
import {filterDOMProps, useObjectRef} from '@react-aria/utils';
18+
import {filterDOMProps, inertValue, useObjectRef} from '@react-aria/utils';
1919
import {Collection as ICollection, Node, TabListState, useTabListState} from 'react-stately';
2020
import React, {createContext, ForwardedRef, forwardRef, JSX, useContext, useMemo} from 'react';
2121

@@ -320,7 +320,7 @@ export const TabPanel = /*#__PURE__*/ createHideableComponent(function TabPanel(
320320
data-focused={isFocused || undefined}
321321
data-focus-visible={isFocusVisible || undefined}
322322
// @ts-ignore
323-
inert={!isSelected ? 'true' : undefined}
323+
inert={inertValue(!isSelected)}
324324
data-inert={!isSelected ? 'true' : undefined}>
325325
<Provider
326326
values={[

0 commit comments

Comments
 (0)