From ce586cc2f9f420258f6b41e3221c7474672c1275 Mon Sep 17 00:00:00 2001 From: fullsend-code <278716306+fullsend-ai-coder[bot]@users.noreply.github.com> Date: Thu, 25 Jun 2026 16:32:37 +0000 Subject: [PATCH] feat(#3580): enable accessibility checks and fix a11y issues Remove the skipFailures option from runAccessibilityTests so that accessibility violations always cause test failures instead of being silently ignored. Fix WCAG 2.0/2.1 AA violations across the extensions plugin: - PluginCard: add role="link", tabIndex, keyboard handler, and aria-label to the clickable card for keyboard accessibility - PluginIcon: add role="img" and aria-label to CardMedia elements so screen readers announce plugin icons - RowActions: add aria-label to all IconButton components; replace nested IconButton+Switch with standalone Switch using inputProps aria-label to eliminate nested interactive elements - Badges: replace title attr with aria-label on BadgeChip; add role="img" and aria-label to BadgeTriangle; mark decorative SVG icons with aria-hidden - TabPanel: add id and aria-labelledby to the tabpanel element; replace keyless Fragment with keyed Box in inner map Update PluginIcon tests to verify the new aria-label attribute on both icon and fallback-icon states. Closes #3580 --- .../e2e-tests/utils/accessibility.ts | 11 ++-- .../extensions/src/components/Badges.tsx | 9 +++- .../InstalledPackages/RowActions.tsx | 51 +++++++++++++------ .../extensions/src/components/PluginCard.tsx | 16 +++++- .../src/components/PluginIcon.test.tsx | 14 +++-- .../extensions/src/components/PluginIcon.tsx | 7 +++ .../extensions/src/components/TabPanel.tsx | 40 ++++++++------- 7 files changed, 99 insertions(+), 49 deletions(-) diff --git a/workspaces/extensions/e2e-tests/utils/accessibility.ts b/workspaces/extensions/e2e-tests/utils/accessibility.ts index 586d0c10c3..ed38579fa1 100644 --- a/workspaces/extensions/e2e-tests/utils/accessibility.ts +++ b/workspaces/extensions/e2e-tests/utils/accessibility.ts @@ -21,7 +21,6 @@ export async function runAccessibilityTests( page: Page, testInfo: TestInfo, attachName = 'accessibility-scan-results.json', - options: { skipFailures?: boolean } = { skipFailures: true }, ) { const accessibilityScanResults = await new AxeBuilder({ page }) .withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa']) @@ -32,10 +31,8 @@ export async function runAccessibilityTests( contentType: 'application/json', }); - if (!options?.skipFailures) { - expect( - accessibilityScanResults.violations, - 'Accessibility violations found', - ).toEqual([]); - } + expect( + accessibilityScanResults.violations, + 'Accessibility violations found', + ).toEqual([]); } diff --git a/workspaces/extensions/plugins/extensions/src/components/Badges.tsx b/workspaces/extensions/plugins/extensions/src/components/Badges.tsx index ad4fe6cba3..0ad5fe9cca 100644 --- a/workspaces/extensions/plugins/extensions/src/components/Badges.tsx +++ b/workspaces/extensions/plugins/extensions/src/components/Badges.tsx @@ -116,7 +116,7 @@ export const BadgeChip = ({ plugin }: { plugin: ExtensionsPlugin }) => { label={options.label} variant="outlined" size="small" - title={options.tooltip} + aria-label={options.tooltip ?? options.label} sx={{ cursor: 'pointer', }} @@ -142,7 +142,11 @@ export const BadgeTriange = ({ plugin }: { plugin: ExtensionsPlugin }) => {
-
+
{ }} />