Skip to content

Commit 82c22e5

Browse files
committed
fix(ui): honor a direct aria-invalid on Otp
1 parent b9c3fdc commit 82c22e5

2 files changed

Lines changed: 19 additions & 1 deletion

File tree

packages/ui/src/mosaic/components/otp/otp.test.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,21 @@ describe('Mosaic Otp', () => {
2929
}
3030
});
3131

32+
it('marks every slot invalid when aria-invalid is passed directly', () => {
33+
render(
34+
<Otp
35+
aria-invalid
36+
length={3}
37+
aria-label='Code'
38+
/>,
39+
);
40+
41+
expect(screen.getByRole('group', { name: 'Code' })).toHaveAttribute('data-status', 'error');
42+
for (const slot of slots()) {
43+
expect(slot).toHaveAttribute('aria-invalid', 'true');
44+
}
45+
});
46+
3247
it('defaults to six slots', () => {
3348
render(<Otp aria-label='Verification code' />);
3449

packages/ui/src/mosaic/components/otp/otp.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,20 @@ export function Otp({
5555
size = 'md',
5656
status: statusProp,
5757
disabled: disabledProp,
58+
'aria-invalid': ariaInvalidProp,
5859
'aria-labelledby': ariaLabelledBy,
5960
'aria-describedby': ariaDescribedBy,
6061
...rest
6162
}: OtpProps): React.ReactElement {
6263
const fieldProps = useOptionalFieldControlProps({
6364
disabled: disabledProp,
65+
ariaInvalid: ariaInvalidProp,
6466
ariaLabelledBy,
6567
ariaDescribedBy,
6668
});
6769
const disabled = fieldProps?.disabled ?? disabledProp ?? false;
68-
const status = statusProp ?? (fieldProps?.['aria-invalid'] === true ? 'error' : 'neutral');
70+
const ariaInvalid = fieldProps?.['aria-invalid'] ?? ariaInvalidProp;
71+
const status = statusProp ?? (ariaInvalid === true || ariaInvalid === 'true' ? 'error' : 'neutral');
6972

7073
return (
7174
<Primitive.Root

0 commit comments

Comments
 (0)