Skip to content

[autocomplete] Wrap the no results message in a status element#48690

Open
silviuaavram wants to merge 8 commits into
mui:masterfrom
silviuaavram:feat/no-options-slot-for-autocomplete
Open

[autocomplete] Wrap the no results message in a status element#48690
silviuaavram wants to merge 8 commits into
mui:masterfrom
silviuaavram:feat/no-options-slot-for-autocomplete

Conversation

@silviuaavram

@silviuaavram silviuaavram commented Jun 18, 2026

Copy link
Copy Markdown
Member

Fixes #48666

Add a new noOptionsContainer slot that wraps the "no options" content with a container element. The container renders with role="status", aria-live="polite", and aria-atomic="true" so assistive technologies announce the absence of options without requiring the popup to be open.

Changes

  • Add the noOptionsContainer slot via useSlot backed by a plain 'div' (no styled wrapper needed)
  • Assign the new noOptionsContainer CSS class to the container element so consumers can style it
  • Add noOptionsContainer to autocompleteClasses and AutocompleteClasses
  • Add AutocompleteNoOptionsContainerSlotPropsOverrides augmentation interface
  • Add noOptionsContainer to AutocompleteSlots and AutocompleteSlotsAndSlotProps
  • Update PropTypes for slots (noOptionsContainer) and slotProps (noOptionsContainer)
  • Regenerate API docs

Copilot AI review requested due to automatic review settings June 18, 2026 12:58
@silviuaavram silviuaavram added accessibility a11y scope: autocomplete Changes related to the autocomplete. This includes ComboBox. labels Jun 18, 2026
@code-infra-dashboard

code-infra-dashboard Bot commented Jun 18, 2026

Copy link
Copy Markdown

Deploy preview

https://deploy-preview-48690--material-ui.netlify.app/

Bundle size

Bundle Parsed size Gzip size
@mui/material 🔺+326B(+0.06%) 🔺+82B(+0.05%)
@mui/lab 0B(0.00%) 0B(0.00%)
@mui/private-theming 0B(0.00%) 0B(0.00%)
@mui/system 0B(0.00%) 0B(0.00%)
@mui/utils 0B(0.00%) 0B(0.00%)

Details of bundle changes


Check out the code infra dashboard for more information about this PR.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 updates Autocomplete to improve assistive-technology announcements when there are no matching options by introducing a new noOptions slot that provides a live-region status container around the existing “no options” content.

Changes:

  • Add a noOptions slot (and slotProps.noOptions) and wrap the no-options content in a role="status" live region (aria-live="polite", aria-atomic="true").
  • Extend TypeScript typings (slot + overrides augmentation) and PropTypes to include the new slot.
  • Add/adjust tests and regenerate API docs reflecting the new slot.

Reviewed changes

Copilot reviewed 5 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
packages/mui-material/src/Autocomplete/Autocomplete.js Adds noOptions slot via useSlot and wraps the no-options message in a status live region.
packages/mui-material/src/Autocomplete/Autocomplete.d.ts Adds noOptions to AutocompleteSlots and slot-props typing + overrides interface.
packages/mui-material/src/Autocomplete/Autocomplete.spec.tsx Adds TS coverage for slots.noOptions / slotProps.noOptions usage (including ref).
packages/mui-material/src/Autocomplete/Autocomplete.test.js Adds tests around noOptionsText rendering and the status container behavior.
docs/translations/api-docs/autocomplete/autocomplete.json Updates slot descriptions to include noOptions.
docs/pages/material-ui/api/autocomplete.json Updates API docs output for the new noOptions slot and slotProps.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/mui-material/src/Autocomplete/Autocomplete.js Outdated
Comment thread packages/mui-material/src/Autocomplete/Autocomplete.js Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 5 out of 6 changed files in this pull request and generated 3 comments.

Comments suppressed due to low confidence (1)

docs/translations/api-docs/autocomplete/autocomplete.json:323

  • In the translations JSON, noOptions has been moved from classDescriptions to slotDescriptions, implying noOptions is now a slot (and no longer a documented utility class). However, the current implementation still applies classes.noOptions to the inner message wrapper (<AutocompleteNoOptions className={classes.noOptions} ...>), while the new noOptions slot container has no class.

This makes the generated docs inconsistent with the actual DOM/class placement. Consider aligning the implementation with the slot documentation (or vice-versa) and regenerating these files.

  "slotDescriptions": {
    "clearIndicator": "The component used to render the clear indicator element.",
    "listbox": "The component used to render the listbox.",
    "noOptions": "The component used to render the &quot;no options&quot; container.",
    "paper": "The component used to render the body of the popup.",
    "popper": "The component used to position the popup.",
    "popupIndicator": "The component used to render the popup indicator element.",
    "root": "The component that renders the root."
  }

Comment thread packages/mui-material/src/Autocomplete/Autocomplete.js Outdated
Comment thread packages/mui-material/src/Autocomplete/Autocomplete.js
Comment thread docs/pages/material-ui/api/autocomplete.json
Comment thread packages/mui-material/src/Autocomplete/Autocomplete.js Outdated
Comment on lines +614 to +616
role: 'status',
'aria-live': 'polite',
'aria-atomic': 'true',

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the loading text would also benefit from being inside this, though it can be done separately

We should come up with a better name for the slot though, maybe status or liveRegion

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@silviuaavram Is it possible to have existing paper slot having these attributes?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not possible since we don't want to announce all the changes in the listbox.

) : null}
<NoOptionsSlot {...noOptionsProps}>
{renderedOptions.length === 0 && !freeSolo && !loading ? (
<AutocompleteNoOptions

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@siriwatknp Do you think this (internal) DOM change is ok?

The only risk I can think of is it would break brittle CSS selectors like > .NoOptions which seems ok

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think > .NoOptions is a very edge case. I don't see why consumers would target it like that.
For me I'd frame it like this:

  • a fix? if yes, I think it's okay to risk in minor release
  • an enhancement? if yes and a lot of upvotes, it's okay to risk in minor release
  • otherwise, I'd wait or find a different solution.

@silviuaavram silviuaavram force-pushed the feat/no-options-slot-for-autocomplete branch from e7139c4 to 29583ca Compare June 25, 2026 11:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

accessibility a11y scope: autocomplete Changes related to the autocomplete. This includes ComboBox.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Autocomplete] hardcoded role="presentation" on noOptionsText container suppresses semantics for some screen readers

4 participants