Skip to content

Commit 9acebe1

Browse files
authored
Revert "Remove sx props and BoxWithFallback from RadioGroup (#6642)" (#6684)
1 parent 3dfcf30 commit 9acebe1

File tree

13 files changed

+81
-74
lines changed

13 files changed

+81
-74
lines changed

.changeset/quick-bats-remain.md

Lines changed: 0 additions & 6 deletions
This file was deleted.

packages/react/src/Banner/Banner.examples.stories.module.css

Lines changed: 0 additions & 3 deletions
This file was deleted.

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ 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'
1211
import {useFocus} from '../internal/hooks/useFocus'
1312
import {PageLayout} from '../PageLayout'
1413

@@ -66,11 +65,11 @@ export const WithAnnouncement = () => {
6665
secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}
6766
/>
6867
<RadioGroup
68+
sx={{marginTop: 4}}
6969
name="options"
7070
onChange={selected => {
7171
setSelected(selected as Choice)
7272
}}
73-
className={classes.RadioGroupWithTopMargin}
7473
>
7574
<RadioGroup.Label>Choices</RadioGroup.Label>
7675
<FormControl>

packages/react/src/CheckboxGroup/CheckboxGroup.dev.stories.module.css

Lines changed: 0 additions & 19 deletions
This file was deleted.

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

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

54
export default {
65
title: 'Components/CheckboxGroup/Dev',
@@ -9,9 +8,30 @@ export default {
98
} as Meta
109

1110
export const SxProps = () => (
12-
<CheckboxGroup className={classes.CheckboxGroup}>
13-
<CheckboxGroup.Caption className={classes.MutedCaption}>Caption</CheckboxGroup.Caption>
14-
<CheckboxGroup.Label className={classes.BoldLabel}>Choices</CheckboxGroup.Label>
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>
1535
<FormControl required>
1636
<Checkbox value="one" defaultChecked />
1737
<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']}},
8+
parameters: {controls: {exclude: ['aria-labelledby', 'id', 'onChange', 'sx']}},
99
} as Meta
1010

1111
export const Playground = ({

packages/react/src/RadioGroup/RadioGroup.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ 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'
1011

1112
type RadioGroupProps = {
1213
/**
@@ -17,7 +18,8 @@ type RadioGroupProps = {
1718
* The name used to identify this group of radios
1819
*/
1920
name: string
20-
} & CheckboxOrRadioGroupProps
21+
} & CheckboxOrRadioGroupProps &
22+
SxProp
2123

2224
export const RadioGroupContext = createContext<{
2325
disabled?: boolean

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

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ 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'
1011
import classes from './CheckboxOrRadioGroup.module.css'
1112
import {clsx} from 'clsx'
13+
import {BoxWithFallback} from '../BoxWithFallback'
1214

1315
export type CheckboxOrRadioGroupProps = {
1416
/** Class name for custom styling */
@@ -30,7 +32,7 @@ export type CheckboxOrRadioGroupProps = {
3032
* If true, the user must make a selection before the owning form can be submitted
3133
*/
3234
required?: boolean
33-
}
35+
} & SxProp
3436

3537
const CheckboxOrRadioGroup: React.FC<React.PropsWithChildren<CheckboxOrRadioGroupProps>> = ({
3638
'aria-labelledby': ariaLabelledby,
@@ -39,6 +41,7 @@ const CheckboxOrRadioGroup: React.FC<React.PropsWithChildren<CheckboxOrRadioGrou
3941
id: idProp,
4042
required = false,
4143
className,
44+
sx,
4245
}) => {
4346
const [slots, rest] = useSlots(children, {
4447
caption: CheckboxOrRadioGroupCaption,
@@ -77,48 +80,53 @@ const CheckboxOrRadioGroup: React.FC<React.PropsWithChildren<CheckboxOrRadioGrou
7780
}}
7881
>
7982
<div>
80-
{labelChild ? (
81-
<fieldset
82-
className={clsx(className, classes.GroupFieldset)}
83-
data-validation={validationChild ? '' : undefined}
84-
disabled={disabled}
85-
>
86-
{/*
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+
/*
8796
Placing the caption text and validation text in the <legend> provides a better user
8897
experience for more screenreaders.
8998
9099
Reference: https://blog.tenon.io/accessible-validation-of-checkbox-and-radiobutton-groups/
91-
*/}
100+
*/
92101
<legend className={classes.GroupLegend} data-legend-visible={isLegendVisible ? '' : undefined}>
93102
{slots.label}
94103
{slots.caption}
95104
{React.isValidElement(slots.validation) && slots.validation.props.children && (
96105
<VisuallyHidden>{slots.validation.props.children}</VisuallyHidden>
97106
)}
98107
</legend>
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-
{/*
108+
) : (
109+
/*
107110
If CheckboxOrRadioGroup.Label wasn't passed as a child, we don't render a <legend>
108111
but we still want to render a caption
109-
*/}
110-
{slots.caption}
112+
*/
113+
slots.caption
114+
)}
111115

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>
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))}
120128
</div>
121-
)}
129+
</BoxWithFallback>
122130
{validationChild && (
123131
<ValidationAnimationContainer
124132
// 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: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import React from 'react'
22
import Text from '../../../Text'
3+
import type {SxProp} from '../../../sx'
34
import CheckboxOrRadioGroupContext from './CheckboxOrRadioGroupContext'
45
import classes from './CheckboxOrRadioGroup.module.css'
56
import {clsx} from 'clsx'
67

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

9-
const CheckboxOrRadioGroupCaption: React.FC<CheckboxOrRadioGroupCaptionProps> = ({className, children}) => {
10+
const CheckboxOrRadioGroupCaption: React.FC<CheckboxOrRadioGroupCaptionProps> = ({className, children, sx}) => {
1011
const {captionId} = React.useContext(CheckboxOrRadioGroupContext)
1112
return (
12-
<Text className={clsx(className, classes.CheckboxOrRadioGroupCaption)} id={captionId}>
13+
<Text className={clsx(className, classes.CheckboxOrRadioGroupCaption)} id={captionId} sx={sx}>
1314
{children}
1415
</Text>
1516
)

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from 'react'
22
import VisuallyHidden from '../../../_VisuallyHidden'
3+
import type {SxProp} from '../../../sx'
34
import CheckboxOrRadioGroupContext from './CheckboxOrRadioGroupContext'
45
import classes from './CheckboxOrRadioGroup.module.css'
56
import {Stack} from '../../../Stack'
@@ -12,12 +13,13 @@ export type CheckboxOrRadioGroupLabelProps = {
1213
* Whether to visually hide the fieldset legend
1314
*/
1415
visuallyHidden?: boolean
15-
}
16+
} & SxProp
1617

1718
const CheckboxOrRadioGroupLabel: React.FC<React.PropsWithChildren<CheckboxOrRadioGroupLabelProps>> = ({
1819
children,
1920
className,
2021
visuallyHidden = false,
22+
sx,
2123
}) => {
2224
const {required, disabled} = React.useContext(CheckboxOrRadioGroupContext)
2325

@@ -27,6 +29,7 @@ const CheckboxOrRadioGroupLabel: React.FC<React.PropsWithChildren<CheckboxOrRadi
2729
isVisible={!visuallyHidden}
2830
title={required ? 'required field' : undefined}
2931
data-label-disabled={disabled ? '' : undefined}
32+
sx={sx}
3033
>
3134
{required ? (
3235
<Stack direction="horizontal" gap="none">

0 commit comments

Comments
 (0)