diff --git a/.eslintrc.js b/.eslintrc.js
index 177f3cf35b8ccf..7d1bb161a7c3f1 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -397,6 +397,7 @@ module.exports = {
'no-restricted-syntax': [
'error',
...restrictedSyntax,
+ ...restrictedSyntaxComponents,
{
selector:
':matches(Literal[value=/--wp-admin-theme-/],TemplateElement[value.cooked=/--wp-admin-theme-/])',
diff --git a/packages/block-editor/src/components/block-switcher/test/index.js b/packages/block-editor/src/components/block-switcher/test/index.js
index ce900003e7a603..bc1b7d1a4a3640 100644
--- a/packages/block-editor/src/components/block-switcher/test/index.js
+++ b/packages/block-editor/src/components/block-switcher/test/index.js
@@ -134,7 +134,7 @@ describe( 'BlockSwitcher', () => {
expect( items[ 1 ] ).toHaveTextContent( headingBlockType.title );
} );
- test( 'should render disabled block switcher when we have a single selected block without styles and we cannot remove it', () => {
+ test( 'should render accessibly disabled block switcher when we have a single selected block without styles and we cannot remove it', () => {
useSelect.mockImplementation( () => ( {
blocks: [ headingBlock1 ],
icon: copy,
@@ -142,11 +142,11 @@ describe( 'BlockSwitcher', () => {
canRemove: false,
} ) );
render( );
- expect(
- screen.getByRole( 'button', {
- name: 'Block Name',
- } )
- ).toBeDisabled();
+ const blockSwitcher = screen.getByRole( 'button', {
+ name: 'Block Name',
+ } );
+ expect( blockSwitcher ).toBeEnabled();
+ expect( blockSwitcher ).toHaveAttribute( 'aria-disabled', 'true' );
} );
test( 'should render message for no available transforms', async () => {
diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md
index 70fbd64b380c64..29313168993cac 100644
--- a/packages/components/CHANGELOG.md
+++ b/packages/components/CHANGELOG.md
@@ -7,6 +7,7 @@
- `UnitControl`: Fix colors when disabled. ([#62970](https://github.com/WordPress/gutenberg/pull/62970))
- `useUpdateEffect`: Correctly track mounted state in strict mode. ([#62974](https://github.com/WordPress/gutenberg/pull/62974))
- `UnitControl`: Fix an issue where keyboard shortcuts unintentionally shift focus on Windows OS. ([#62988](https://github.com/WordPress/gutenberg/pull/62988))
+- Fix inaccessibly disabled `Button`s ([#62306](https://github.com/WordPress/gutenberg/pull/62306)).
### Internal
diff --git a/packages/components/src/autocomplete/autocompleter-ui.tsx b/packages/components/src/autocomplete/autocompleter-ui.tsx
index a22e197decd154..59c88b4e41ecd1 100644
--- a/packages/components/src/autocomplete/autocompleter-ui.tsx
+++ b/packages/components/src/autocomplete/autocompleter-ui.tsx
@@ -58,6 +58,7 @@ function ListBox( {
id={ `components-autocomplete-item-${ instanceId }-${ option.key }` }
role="option"
aria-selected={ index === selectedIndex }
+ __experimentalIsFocusable
disabled={ option.isDisabled }
className={ clsx(
'components-autocomplete__result',
diff --git a/packages/components/src/button/stories/e2e/index.story.tsx b/packages/components/src/button/stories/e2e/index.story.tsx
index 1baeb08fb73e23..075438fe0579eb 100644
--- a/packages/components/src/button/stories/e2e/index.story.tsx
+++ b/packages/components/src/button/stories/e2e/index.story.tsx
@@ -39,6 +39,7 @@ export const VariantStates: StoryFn< typeof Button > = (
key={ variant ?? 'undefined' }
>
+ { /* eslint-disable-next-line no-restricted-syntax */ }