-
Notifications
You must be signed in to change notification settings - Fork 1.3k
fix(accessibility): Field announce error message for focused field #8329
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
db1dec4
to
71e40dc
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR fixes the error message announcement behavior for focused fields by updating the logic in the Field component to announce errors via the live announcer. Key changes include:
- Adding a useEffect in Field.tsx to announce error messages when the field is focused.
- Renaming the help text flag to hasErrorMessage for clarity.
- Adding the @react-aria/live-announcer dependency in package.json.
- Extending InlineAlert stories with a new DynamicWithAriaLivePolite variant.
Reviewed Changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.
File | Description |
---|---|
packages/@react-spectrum/label/src/Field.tsx | Updates error message announcement logic and variable naming |
packages/@react-spectrum/label/package.json | Adds dependency for live announcer |
packages/@react-spectrum/inlinealert/stories/InlineAlert.stories.tsx | Adds a new story variant showcasing aria-live behavior |
71e40dc
to
3484b2f
Compare
fee6570
to
af43a05
Compare
Build successful! 🎉 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR improves accessibility by ensuring that error messages are announced when the associated field is focused.
- Introduces an effect in Field.tsx to announce error messages when the field is active.
- Adds a dependency on @react-aria/live-announcer in package.json.
- Updates stories and tests to better handle error message rendering.
Reviewed Changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.
File | Description |
---|---|
packages/@react-spectrum/label/src/Field.tsx | Implements useEffect to announce error messages for focused fields. |
packages/@react-spectrum/label/package.json | Adds the live announcer dependency to support new accessibility logic. |
packages/@react-spectrum/inlinealert/stories/InlineAlert.stories.tsx | Introduces a new story variant with aria-live explicitly set. |
packages/@react-spectrum/datepicker/test/DateField.test.js | Modifies test to access the first instance of the error message element. |
Comments suppressed due to low confidence (2)
packages/@react-spectrum/datepicker/test/DateField.test.js:239
- Verify that multiple occurrences of the 'Date unavailable.' text are expected. If only one error message should appear, consider updating this to use a more specific selector to avoid masking potential duplication issues.
expect(tree.getAllByText('Date unavailable.')[0]).toBeInTheDocument();
packages/@react-spectrum/label/src/Field.tsx:71
- Ensure that the ref passed to Field is always a RefObject. The current cast to RefObject assumes a stable object ref; if callback refs are used, this might lead to unexpected behavior when announcing error messages.
React.useEffect(() => {
Build successful! 🎉 |
fd00b91
to
fbd7356
Compare
Build successful! 🎉 |
Build successful! 🎉 |
3573692
to
bd37367
Compare
Build successful! 🎉 |
Build successful! 🎉 |
f862c17
to
72b183c
Compare
Build successful! 🎉 |
Build successful! 🎉 |
85261b4
to
b495793
Compare
Build successful! 🎉 |
b495793
to
2fb28d7
Compare
Build successful! 🎉 |
Co-authored-by: Copilot <[email protected]>
…blurred field 1. Improves announcement of validation error for just blurred field, by including accessible name in announcement for context. 2. Forgo announcement when the field receiving focus already has a validation error. It can be too much information. 3. Add alt text, "(valid)," to validationIcon, and include it in the `aria-describedby` for input for TextFieldBase. 4. fix tests after adding alt text to validationIcon
2fb28d7
to
4acca66
Compare
Build successful! 🎉 |
…e fields when validationState is 'valid'
Build successful! 🎉 |
Build successful! 🎉 |
Build successful! 🎉 |
Build successful! 🎉 |
…on before validation message announcement
Build successful! 🎉 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This pull request enhances accessibility by ensuring error messages for focused fields are appropriately announced and by refining ID and aria-describedby attributes across form components.
- Introduces a valid state localized string and updates intl files.
- Adjusts IDs and aria attributes for Input, DateField, DatePicker, DateRangePicker, ComboBox, and Autocomplete to improve accessibility announcements.
- Enhances form validation logic with a timeout mechanism to announce error messages upon blur.
Reviewed Changes
Copilot reviewed 24 out of 24 changed files in this pull request and generated 1 comment.
Show a summary per file
File | Description |
---|---|
packages/@react-spectrum/textfield/intl/en-US.json | Adds new locale string for valid state. |
packages/@react-spectrum/label/src/Field.tsx | Removes an unnecessary blank line. |
packages/@react-spectrum/label/package.json | Updates dependency versions and adds live announcer. |
packages/@react-spectrum/inlinealert/stories/InlineAlert.stories.tsx | Adds a new story with aria-live="polite". |
packages/@react-spectrum/datepicker/test/DateField.test.js | Adjusts test selector for improved reliability. |
packages/@react-spectrum/datepicker/src/TimeField.tsx | Adds ID and aria-describedby for valid icon accessibility. |
packages/@react-spectrum/datepicker/src/Input.tsx | Updates ID propagation and valid icon logic. |
packages/@react-spectrum/datepicker/src/DateRangePicker.tsx | Introduces useId for the input and assigns IDs conditionally on validation state. |
packages/@react-spectrum/datepicker/src/DatePickerSegment.tsx | Enhances merging of aria-describedby props. |
packages/@react-spectrum/datepicker/src/DatePickerField.tsx | Propagates the valid icon ID to segments for accessibility. |
packages/@react-spectrum/datepicker/src/DatePicker.tsx | Incorporates useId for improved ID management. |
packages/@react-spectrum/datepicker/src/DateField.tsx | Integrates improved ID handling and aria-describedby for a valid field. |
packages/@react-spectrum/datepicker/intl/en-US.json | Adds new valid state locale string entry. |
packages/@react-spectrum/combobox/src/MobileComboBox.tsx | Adds valid icon ID for improved validation accessibility. |
packages/@react-spectrum/combobox/intl/en-US.json | Updates locale strings to include a valid state. |
packages/@react-spectrum/autocomplete/src/MobileSearchAutocomplete.tsx | Adds valid icon ID and updates aria-labelledby join logic for accessibility. |
packages/@react-spectrum/autocomplete/intl/en-US.json | Updates locale strings to include a valid state. |
packages/@react-aria/form/src/useFormValidation.ts | Enhances error message announcement logic with a delay on blur. |
packages/@react-aria/form/package.json | Updates dependencies and adds dom-accessibility-api. |
packages/@react-aria/form/intl/en-US.json | Introduces new locale strings for invalid value and review field prompts. |
id={validationState === 'valid' ? dateRangePickerInputId : undefined} | ||
data-testid="start-date" | ||
isQuiet={props.isQuiet} | ||
inputClassName={classNames(datepickerStyles, 'react-spectrum-Datepicker-startField')} /> | ||
<DateRangeDash /> | ||
<DatePickerField | ||
{...endFieldProps} | ||
id={validationState === 'valid' ? dateRangePickerInputId : undefined} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Assigning the same ID to both start and end date fields when validationState is 'valid' can result in duplicate IDs in the DOM. Consider generating unique IDs for each field to ensure accessibility and DOM validity.
id={validationState === 'valid' ? dateRangePickerInputId : undefined} | |
data-testid="start-date" | |
isQuiet={props.isQuiet} | |
inputClassName={classNames(datepickerStyles, 'react-spectrum-Datepicker-startField')} /> | |
<DateRangeDash /> | |
<DatePickerField | |
{...endFieldProps} | |
id={validationState === 'valid' ? dateRangePickerInputId : undefined} | |
id={validationState === 'valid' ? `${dateRangePickerInputId}-start` : undefined} | |
data-testid="start-date" | |
isQuiet={props.isQuiet} | |
inputClassName={classNames(datepickerStyles, 'react-spectrum-Datepicker-startField')} /> | |
<DateRangeDash /> | |
<DatePickerField | |
{...endFieldProps} | |
id={validationState === 'valid' ? `${dateRangePickerInputId}-end` : undefined} |
Copilot uses AI. Check for mistakes.
Build successful! 🎉 |
Closes #8328
✅ Pull Request Checklist:
📝 Test Instructions:
🧢 Your Project:
Accessibility/SUSI/Adobe