@@ -66,6 +66,7 @@ const CheckboxOrRadioGroup: React.FC<React.PropsWithChildren<CheckboxOrRadioGrou
6666 const id = useId ( idProp )
6767 const validationMessageId = validationChild ? `${ id } -validationMessage` : undefined
6868 const captionId = captionChild ? `${ id } -caption` : undefined
69+ const requiredMessageId = required ? `${ id } -requiredMessage` : undefined
6970
7071 if ( ! labelChild && ! ariaLabelledby ) {
7172 // eslint-disable-next-line no-console
@@ -106,25 +107,29 @@ const CheckboxOrRadioGroup: React.FC<React.PropsWithChildren<CheckboxOrRadioGrou
106107 */
107108 < legend className = { classes . GroupLegend } data-legend-visible = { isLegendVisible ? '' : undefined } >
108109 { slots . label }
110+ { required && < VisuallyHidden > , required</ VisuallyHidden > }
109111 { slots . caption }
110112 { React . isValidElement ( slots . validation ) && slots . validation . props . children && (
111113 < VisuallyHidden > { slots . validation . props . children } </ VisuallyHidden >
112114 ) }
113115 </ legend >
114116 ) : (
115117 /*
116- If CheckboxOrRadioGroup.Label wasn't passed as a child, we don't render a <legend>
117- but we still want to render a caption
118- */
119- slots . caption
118+ If CheckboxOrRadioGroup.Label wasn't passed as a child, we don't render a <legend>
119+ but we still want to render a caption
120+ */
121+ < >
122+ { slots . caption }
123+ { required && requiredMessageId && < VisuallyHidden id = { requiredMessageId } > Required</ VisuallyHidden > }
124+ </ >
120125 ) }
121126
122127 < div
123128 className = { classes . Body }
124129 { ...( ! labelChild
125130 ? {
126131 [ 'aria-labelledby' ] : ariaLabelledby ,
127- [ 'aria-describedby' ] : [ validationMessageId , captionId ] . filter ( Boolean ) . join ( ' ' ) ,
132+ [ 'aria-describedby' ] : [ validationMessageId , captionId , requiredMessageId ] . filter ( Boolean ) . join ( ' ' ) ,
128133 as : 'div' ,
129134 role : 'group' ,
130135 }
0 commit comments