Skip to content

Commit 03c635c

Browse files
authored
Remove sx props and BoxWithFallback from RadioGroup (#6642)
Co-authored-by: liuliu-dev <[email protected]>
1 parent 3a778b9 commit 03c635c

File tree

13 files changed

+78
-81
lines changed

13 files changed

+78
-81
lines changed

.changeset/quick-bats-remain.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@primer/styled-react': patch
3+
'@primer/react': major
4+
---
5+
6+
Update RadioGroup component to no longer support sx, add sx wrapper to @primer/styled-react.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.RadioGroupWithTopMargin {
2+
margin-top: var(--base-size-24);
3+
}

packages/react/src/Banner/Banner.examples.stories.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import RadioGroup from '../RadioGroup'
88
import Radio from '../Radio'
99
import {Button} from '../Button'
1010
import React from 'react'
11+
import classes from './Banner.examples.stories.module.css'
1112
import {useFocus} from '../internal/hooks/useFocus'
1213
import {PageLayout} from '../PageLayout'
1314

@@ -65,11 +66,11 @@ export const WithAnnouncement = () => {
6566
secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}
6667
/>
6768
<RadioGroup
68-
sx={{marginTop: 4}}
6969
name="options"
7070
onChange={selected => {
7171
setSelected(selected as Choice)
7272
}}
73+
className={classes.RadioGroupWithTopMargin}
7374
>
7475
<RadioGroup.Label>Choices</RadioGroup.Label>
7576
<FormControl>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
.CheckboxGroup {
2+
color: var(--fgColor-default, var(--color-fg-default));
3+
/* stylelint-disable-next-line primer/spacing */
4+
margin-top: 15px;
5+
/* stylelint-disable-next-line primer/spacing */
6+
margin-bottom: 15px;
7+
}
8+
9+
.MutedCaption {
10+
color: var(--fgColor-muted);
11+
font-size: var(--text-body-size-small);
12+
font-weight: var(--text-caption-weight);
13+
}
14+
15+
.BoldLabel {
16+
color: var(--fgColor-default, var(--color-fg-default));
17+
font-size: var(--text-body-size-medium);
18+
font-weight: var(--base-text-weight-semibold);
19+
}

packages/react/src/CheckboxGroup/CheckboxGroup.dev.stories.tsx

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {Meta} from '@storybook/react-vite'
22
import {Checkbox, CheckboxGroup, FormControl} from '..'
3+
import classes from './CheckboxGroup.dev.stories.module.css'
34

45
export default {
56
title: 'Components/CheckboxGroup/Dev',
@@ -8,30 +9,9 @@ export default {
89
} as Meta
910

1011
export const SxProps = () => (
11-
<CheckboxGroup
12-
sx={{
13-
color: 'var(--fgColor-default, var(--color-fg-default))',
14-
my: '15px',
15-
}}
16-
>
17-
<CheckboxGroup.Caption
18-
sx={{
19-
color: 'fg.muted',
20-
fontSize: 0,
21-
fontWeight: 400,
22-
}}
23-
>
24-
Caption
25-
</CheckboxGroup.Caption>
26-
<CheckboxGroup.Label
27-
sx={{
28-
color: 'var(--fgColor-default, var(--color-fg-default))',
29-
fontSize: ['14px'],
30-
fontWeight: 600,
31-
}}
32-
>
33-
Choices
34-
</CheckboxGroup.Label>
12+
<CheckboxGroup className={classes.CheckboxGroup}>
13+
<CheckboxGroup.Caption className={classes.MutedCaption}>Caption</CheckboxGroup.Caption>
14+
<CheckboxGroup.Label className={classes.BoldLabel}>Choices</CheckboxGroup.Label>
3515
<FormControl required>
3616
<Checkbox value="one" defaultChecked />
3717
<FormControl.Label>Choice one</FormControl.Label>

packages/react/src/RadioGroup/RadioGroup.stories.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type {CheckboxOrRadioGroupArgs} from '../utils/form-story-helpers'
55
export default {
66
title: 'Components/RadioGroup',
77
component: RadioGroup,
8-
parameters: {controls: {exclude: ['aria-labelledby', 'id', 'onChange', 'sx']}},
8+
parameters: {controls: {exclude: ['aria-labelledby', 'id', 'onChange']}},
99
} as Meta
1010

1111
export const Playground = ({

packages/react/src/RadioGroup/RadioGroup.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import CheckboxOrRadioGroupCaption from '../internal/components/CheckboxOrRadioG
77
import CheckboxOrRadioGroupLabel from '../internal/components/CheckboxOrRadioGroup/CheckboxOrRadioGroupLabel'
88
import CheckboxOrRadioGroupValidation from '../internal/components/CheckboxOrRadioGroup/CheckboxOrRadioGroupValidation'
99
import {useRenderForcingRef} from '../hooks'
10-
import type {SxProp} from '../sx'
1110

1211
type RadioGroupProps = {
1312
/**
@@ -18,8 +17,7 @@ type RadioGroupProps = {
1817
* The name used to identify this group of radios
1918
*/
2019
name: string
21-
} & CheckboxOrRadioGroupProps &
22-
SxProp
20+
} & CheckboxOrRadioGroupProps
2321

2422
export const RadioGroupContext = createContext<{
2523
disabled?: boolean

packages/react/src/internal/components/CheckboxOrRadioGroup/CheckboxOrRadioGroup.tsx

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,8 @@ import CheckboxOrRadioGroupValidation from './CheckboxOrRadioGroupValidation'
77
import CheckboxOrRadioGroupContext from './CheckboxOrRadioGroupContext'
88
import VisuallyHidden from '../../../_VisuallyHidden'
99
import {useSlots} from '../../../hooks/useSlots'
10-
import type {SxProp} from '../../../sx'
1110
import classes from './CheckboxOrRadioGroup.module.css'
1211
import {clsx} from 'clsx'
13-
import {BoxWithFallback} from '../BoxWithFallback'
1412

1513
export type CheckboxOrRadioGroupProps = {
1614
/** Class name for custom styling */
@@ -32,7 +30,7 @@ export type CheckboxOrRadioGroupProps = {
3230
* If true, the user must make a selection before the owning form can be submitted
3331
*/
3432
required?: boolean
35-
} & SxProp
33+
}
3634

3735
const CheckboxOrRadioGroup: React.FC<React.PropsWithChildren<CheckboxOrRadioGroupProps>> = ({
3836
'aria-labelledby': ariaLabelledby,
@@ -41,7 +39,6 @@ const CheckboxOrRadioGroup: React.FC<React.PropsWithChildren<CheckboxOrRadioGrou
4139
id: idProp,
4240
required = false,
4341
className,
44-
sx,
4542
}) => {
4643
const [slots, rest] = useSlots(children, {
4744
caption: CheckboxOrRadioGroupCaption,
@@ -80,53 +77,48 @@ const CheckboxOrRadioGroup: React.FC<React.PropsWithChildren<CheckboxOrRadioGrou
8077
}}
8178
>
8279
<div>
83-
<BoxWithFallback
84-
className={clsx(className, classes.GroupFieldset)}
85-
data-validation={validationChild ? '' : undefined}
86-
{...(labelChild
87-
? {
88-
as: 'fieldset',
89-
disabled,
90-
}
91-
: {})}
92-
sx={sx}
93-
>
94-
{labelChild ? (
95-
/*
80+
{labelChild ? (
81+
<fieldset
82+
className={clsx(className, classes.GroupFieldset)}
83+
data-validation={validationChild ? '' : undefined}
84+
disabled={disabled}
85+
>
86+
{/*
9687
Placing the caption text and validation text in the <legend> provides a better user
9788
experience for more screenreaders.
9889
9990
Reference: https://blog.tenon.io/accessible-validation-of-checkbox-and-radiobutton-groups/
100-
*/
91+
*/}
10192
<legend className={classes.GroupLegend} data-legend-visible={isLegendVisible ? '' : undefined}>
10293
{slots.label}
10394
{slots.caption}
10495
{React.isValidElement(slots.validation) && slots.validation.props.children && (
10596
<VisuallyHidden>{slots.validation.props.children}</VisuallyHidden>
10697
)}
10798
</legend>
108-
) : (
109-
/*
99+
100+
<div className={classes.Body}>
101+
{React.Children.toArray(rest).filter(child => React.isValidElement(child))}
102+
</div>
103+
</fieldset>
104+
) : (
105+
<div className={clsx(className, classes.GroupFieldset)} data-validation={validationChild ? '' : undefined}>
106+
{/*
110107
If CheckboxOrRadioGroup.Label wasn't passed as a child, we don't render a <legend>
111108
but we still want to render a caption
112-
*/
113-
slots.caption
114-
)}
109+
*/}
110+
{slots.caption}
115111

116-
<div
117-
className={classes.Body}
118-
{...(!labelChild
119-
? {
120-
['aria-labelledby']: ariaLabelledby,
121-
['aria-describedby']: [validationMessageId, captionId].filter(Boolean).join(' '),
122-
as: 'div',
123-
role: 'group',
124-
}
125-
: {})}
126-
>
127-
{React.Children.toArray(rest).filter(child => React.isValidElement(child))}
112+
<div
113+
className={classes.Body}
114+
aria-labelledby={ariaLabelledby}
115+
aria-describedby={[validationMessageId, captionId].filter(Boolean).join(' ')}
116+
role="group"
117+
>
118+
{React.Children.toArray(rest).filter(child => React.isValidElement(child))}
119+
</div>
128120
</div>
129-
</BoxWithFallback>
121+
)}
130122
{validationChild && (
131123
<ValidationAnimationContainer
132124
// If we have CheckboxOrRadioGroup.Label as a child, we render a screenreader-accessible validation message in the <legend>

packages/react/src/internal/components/CheckboxOrRadioGroup/CheckboxOrRadioGroupCaption.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
import React from 'react'
22
import Text from '../../../Text'
3-
import type {SxProp} from '../../../sx'
43
import CheckboxOrRadioGroupContext from './CheckboxOrRadioGroupContext'
54
import classes from './CheckboxOrRadioGroup.module.css'
65
import {clsx} from 'clsx'
76

8-
type CheckboxOrRadioGroupCaptionProps = React.PropsWithChildren<SxProp> & {className?: string}
7+
type CheckboxOrRadioGroupCaptionProps = React.PropsWithChildren<{className?: string}>
98

10-
const CheckboxOrRadioGroupCaption: React.FC<CheckboxOrRadioGroupCaptionProps> = ({className, children, sx}) => {
9+
const CheckboxOrRadioGroupCaption: React.FC<CheckboxOrRadioGroupCaptionProps> = ({className, children}) => {
1110
const {captionId} = React.useContext(CheckboxOrRadioGroupContext)
1211
return (
13-
<Text className={clsx(className, classes.CheckboxOrRadioGroupCaption)} id={captionId} sx={sx}>
12+
<Text className={clsx(className, classes.CheckboxOrRadioGroupCaption)} id={captionId}>
1413
{children}
1514
</Text>
1615
)

packages/react/src/internal/components/CheckboxOrRadioGroup/CheckboxOrRadioGroupLabel.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import React from 'react'
22
import VisuallyHidden from '../../../_VisuallyHidden'
3-
import type {SxProp} from '../../../sx'
43
import CheckboxOrRadioGroupContext from './CheckboxOrRadioGroupContext'
54
import classes from './CheckboxOrRadioGroup.module.css'
65
import {Stack} from '../../../Stack'
@@ -13,13 +12,12 @@ export type CheckboxOrRadioGroupLabelProps = {
1312
* Whether to visually hide the fieldset legend
1413
*/
1514
visuallyHidden?: boolean
16-
} & SxProp
15+
}
1716

1817
const CheckboxOrRadioGroupLabel: React.FC<React.PropsWithChildren<CheckboxOrRadioGroupLabelProps>> = ({
1918
children,
2019
className,
2120
visuallyHidden = false,
22-
sx,
2321
}) => {
2422
const {required, disabled} = React.useContext(CheckboxOrRadioGroupContext)
2523

@@ -29,7 +27,6 @@ const CheckboxOrRadioGroupLabel: React.FC<React.PropsWithChildren<CheckboxOrRadi
2927
isVisible={!visuallyHidden}
3028
title={required ? 'required field' : undefined}
3129
data-label-disabled={disabled ? '' : undefined}
32-
sx={sx}
3330
>
3431
{required ? (
3532
<Stack direction="horizontal" gap="none">

0 commit comments

Comments
 (0)