Skip to content

feat(frontend): WCAG AAA accessibility + UI consistency improvements#616

Open
MaxRink wants to merge 1 commit intomainfrom
feat/frontend-accessibility-improvements
Open

feat(frontend): WCAG AAA accessibility + UI consistency improvements#616
MaxRink wants to merge 1 commit intomainfrom
feat/frontend-accessibility-improvements

Conversation

@MaxRink
Copy link
Copy Markdown
Collaborator

@MaxRink MaxRink commented Apr 3, 2026

Summary

Comprehensive frontend accessibility improvements targeting WCAG 2.1 AAA compliance across the entire k8s-breakglass Vue 3 frontend, with contrast fixes for all theme modes, design token consistency, automated a11y regression testing, and extensive UI/UX improvements.

See frontend/SCALE_DEVIATIONS.md for documented contrast deviations from the Scale Design System and their rationale.

Accessibility (WCAG AAA — 7:1 contrast ratio)

Contrast Fixes

  • Text colors: Override Scale's hsla(0,0%,0%,0.65) additional text color with solid AAA-compliant values across all 4 theme combinations (light, dark, HC-light, HC-dark)
  • Telekom Magenta (#e20074): Preserved intact at AA level (4.68:1) per brand guidelines — never overridden
  • CTA buttons (e.g. 404 page): Use --cta-bg / --cta-bg-hover CSS variables with AAA-compliant dark magenta (#8a004f / #6b003d)
  • Nav links: Active link color #8e004a (light) / #ff8cc8 (dark) for AAA on respective backgrounds
  • Ghost buttons: Dark mode override #93a8ff (7.1+:1 on #151517)
  • Chip/tag text: All semantic tones (info, success, warning, danger) use darkened text meeting 7:1
  • DebugSessionCard expires text: Replaced --telekom-color-functional-warning-standard with accessible --tone-chip-warning-text
  • ApprovalModalContent danger text: Replaced --telekom-color-functional-danger-standard with --tone-chip-danger-text

High Contrast Mode

  • :root[data-high-contrast="true"] theme layer with maximum contrast text (#000/#fff)
  • Combined HC + dark mode overrides
  • 44×44px minimum touch targets (WCAG SC 2.5.5)
  • @media (forced-colors: active) for Windows High Contrast
  • User-facing eye icon toggle in header navigation (persisted to localStorage)
  • Documented in docs/branding.md

Structural & ARIA Fixes

  • Removed duplicate <main> landmarks in 8 view files
  • Added role="timer", aria-label, aria-busy to interactive elements
  • Wrapped decorative emojis in <span aria-hidden="true">
  • Focus management on route changes
  • Skip-to-content link
  • CountdownTimer: Correct singular/plural in aria-live announcements ("1 second remaining" not "1 seconds remaining")

Design Token Consistency

  • Defined --radius-xs CSS token (was referenced in 5 files but never declared)
  • Replaced all hardcoded border-radius: 999px with var(--radius-pill) across 6 files
  • Tokenized hardcoded spacing in SessionErrorView (px/rem → Scale design tokens)
  • Tokenized TimelineGrid highlight radius (8pxvar(--radius-md))
  • Removed unused CSS tokens: --tone-chip-muted-*, --surface-raised, --surface-section
  • Added missing .tag-icon CSS class in PendingApprovalsView
  • Replaced inline styles with semantic CSS classes
  • Extracted CTA button colors into --cta-bg / --cta-bg-hover CSS variables

Code Quality Improvements

  • Typed BreakglassCard emits: Converted from array form defineEmits(["..."]) to proper TypeScript signatures
  • BreakglassSessionCard terminal states: Expanded from 4 to 11 states (added dropped, timeout, idleexpired, cancelled, canceled, completed, ended)
  • BreakglassView emit types: Aligned with typed BreakglassCard emits (scheduledStartTime: string | null)
  • Narrowed isScaleShadowDomNode(): No longer suppresses fixable Scale components (scale-tag, scale-button, scale-checkbox, scale-dropdown)
  • Improved a11y assertion: Shows violation rule IDs on failure (toEqual([]) instead of toHaveLength(0))

Automated A11y Testing

  • 52 Playwright + axe-core tests: 6 pages + 3 error pages + 4 modals × 4 themes (light, dark, HC-light, HC-dark)
  • Scale shadow DOM issues handled via disableRules() for rules we cannot fix externally
  • isScaleShadowDomNode() narrowed to only suppress genuinely unfixable shadow DOM violations
  • eslint-plugin-vuejs-accessibility for lint-time a11y checks
  • Screenshot visual regression tests cover all theme modes including high-contrast
  • All a11y tests run in CI (frontend/playwright.a11y.config.ts)

Documentation

  • frontend/SCALE_DEVIATIONS.md: Complete list of Scale Design System contrast deviations with rationale
  • docs/branding.md: New "High Contrast Mode" section documenting the 4 theme modes, contrast targets, and CI testing
  • frontend/README.md: New "Accessibility Testing" section with instructions
  • CHANGELOG.md: Updated with PR feat(frontend): WCAG AAA accessibility + UI consistency improvements #616 reference

Files Changed (47 files, +1733/−287)

Category Files Summary
CSS & Tokens base.css AAA color overrides, token definitions, CTA variables, unused token cleanup
A11y Tests a11y.spec.ts, playwright.a11y.config.ts 52 axe-core tests across 4 theme modes
Components 15 Vue SFCs Contrast fixes, ARIA, typed emits, terminal states, pluralization
Views 10 Vue views Duplicate <main> removal, spacing, layout fixes, CSS variable usage
Unit Tests CountdownTimer.spec.ts, ErrorToasts.spec.ts Pluralization tests, compact spacing test
Docs CHANGELOG.md, branding.md, README.md, SCALE_DEVIATIONS.md HC mode docs, a11y testing instructions
CI ci.yml, ui-screenshots.yml HC mode in screenshot CI, a11y test job
Config eslint.config.mjs, package.json a11y lint plugin, axe-core dependency

Validation

Check Result
vue-tsc --noEmit ✅ Clean
eslint . ✅ Clean
Unit tests (npm test) ✅ 951 passed, 1 skipped
Playwright axe-core (light) ✅ 13/13
Playwright axe-core (dark) ✅ 13/13
Playwright axe-core (high-contrast) ✅ 13/13
Playwright axe-core (high-contrast-dark) ✅ 13/13

Known Limitations

  • Scale web components (scale-telekom-header, scale-telekom-nav-list, etc.) produce shadow DOM ARIA violations (aria-required-children, button-name, aria-prohibited-attr) that cannot be fixed from the application side. These are disabled in automated checks via disableRules().
  • The HC toggle button cannot use aria-pressed because Scale's navigation parent assigns an implicit menuitem role where aria-pressed is invalid per ARIA spec. Toggle state is communicated via dynamic aria-label text instead.
  • Telekom magenta (#e20074) meets AA (4.68:1) but not AAA (7:1) — this is an intentional brand guideline decision documented in SCALE_DEVIATIONS.md.

@MaxRink MaxRink requested a review from a team as a code owner April 3, 2026 11:31
Copilot AI review requested due to automatic review settings April 3, 2026 11:31
@github-actions github-actions bot added documentation Improvements or additions to documentation dependencies Pull requests that update a dependency file frontend size/M labels Apr 3, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 3, 2026

⚠️ Deprecation Warning: The deny-licenses option is deprecated for possible removal in the next major release. For more information, see issue 997.

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Snapshot Warnings

⚠️: No snapshots were found for the head SHA ca11e98.
Ensure that dependencies are being submitted on PR branches and consider enabling retry-on-snapshot-warnings. See the documentation for more information and troubleshooting advice.

OpenSSF Scorecard

Scorecard details
PackageVersionScoreDetails
npm/@axe-core/playwright 4.11.1 🟢 6
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Maintained🟢 1018 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
Security-Policy🟢 10security policy file detected
Packaging⚠️ -1packaging workflow not detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Pinned-Dependencies🟢 5dependency not pinned by hash detected -- score normalized to 5
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ 1branch protection is not maximal on development and all release branches
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
npm/@vitest/coverage-v8 4.1.3 UnknownUnknown
npm/@vitest/expect 4.1.3 UnknownUnknown
npm/@vitest/mocker 4.1.3 UnknownUnknown
npm/@vitest/pretty-format 4.1.3 UnknownUnknown
npm/@vitest/runner 4.1.3 UnknownUnknown
npm/@vitest/snapshot 4.1.3 UnknownUnknown
npm/@vitest/spy 4.1.3 UnknownUnknown
npm/@vitest/utils 4.1.3 UnknownUnknown
npm/aria-query 5.3.2 🟢 4.7
Details
CheckScoreReason
Packaging⚠️ -1packaging workflow not detected
Code-Review🟢 3Found 9/23 approved changesets -- score normalized to 3
Maintained⚠️ 00 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Security-Policy🟢 9security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 8dependency not pinned by hash detected -- score normalized to 8
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
npm/axe-core 4.11.2 🟢 6.5
Details
CheckScoreReason
Maintained🟢 1030 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Code-Review🟢 10all changesets reviewed
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 5dependency not pinned by hash detected -- score normalized to 5
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Fuzzing⚠️ 0project is not fuzzed
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Packaging🟢 10packaging workflow detected
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
npm/eslint-plugin-vuejs-accessibility 2.5.0 🟢 4.6
Details
CheckScoreReason
Code-Review🟢 8Found 20/23 approved changesets -- score normalized to 8
Packaging⚠️ -1packaging workflow not detected
Binary-Artifacts🟢 10no binaries found in the repo
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Maintained🟢 1030 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Security-Policy⚠️ 0security policy file not detected
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
Signed-Releases⚠️ -1no releases found
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
npm/globals 17.4.0 🟢 4.7
Details
CheckScoreReason
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Maintained🟢 79 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 7
Packaging⚠️ -1packaging workflow not detected
Binary-Artifacts🟢 10no binaries found in the repo
Code-Review🟢 5Found 14/24 approved changesets -- score normalized to 5
Security-Policy🟢 10security policy file detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
npm/tinyexec 1.0.4 UnknownUnknown
npm/vitest 4.1.3 UnknownUnknown

Scanned Files

  • frontend/package-lock.json

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 3, 2026

Manifest Changes vs v0.1.0-beta.27

base

✅ No changes

debug

✅ No changes

crds

✅ No changes

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 3, 2026

📸 UI Screenshots

Captured 44 screenshots (11 light, 22 dark, 22 high-contrast mode)

📥 Download

Pages Captured

Page Light Dark High Contrast
Home
Session Browser
Pending Approvals
My Requests
Session Review
Debug Sessions
Create Debug Session
404 Not Found
Mobile Views
Tablet Views

Screenshots are generated automatically on each PR that modifies frontend code.

@codecov-commenter
Copy link
Copy Markdown

codecov-commenter commented Apr 3, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 68.72%. Comparing base (c2b918e) to head (ca11e98).

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##             main     #616   +/-   ##
=======================================
  Coverage   68.72%   68.72%           
=======================================
  Files         159      159           
  Lines       33620    33620           
=======================================
  Hits        23107    23107           
  Misses       8985     8985           
  Partials     1528     1528           
Flag Coverage Δ
cli 61.60% <ø> (ø)
controller 71.17% <ø> (-0.02%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Frontend accessibility improvements targeting WCAG 2.1 AA compliance across the Vue 3 UI, adding high-contrast theming and automated accessibility checks.

Changes:

  • Fix landmark/ARIA issues (remove duplicate <main>, add ARIA labels/roles, route-change focus management).
  • Address contrast violations by replacing opacity-based “muted” text with explicit Telekom Scale design tokens and adding high-contrast + forced-colors support.
  • Add automated accessibility tooling (eslint accessibility plugin + axe-core Playwright E2E audits) and document the user-facing change in the changelog.

Reviewed changes

Copilot reviewed 24 out of 25 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
frontend/tests/e2e/a11y.spec.ts Adds axe-core Playwright accessibility audits across key pages and theme modes.
frontend/src/views/SessionErrorView.vue Uses a themed surface token for code block backgrounds (contrast/readability).
frontend/src/views/SessionBrowser.vue Removes duplicate <main> landmark and replaces opacity-muted styling with explicit disabled text token.
frontend/src/views/PendingApprovalsView.vue Removes duplicate <main> landmark.
frontend/src/views/MyPendingRequests.vue Removes duplicate <main> landmark.
frontend/src/views/DebugSessionDetails.vue Removes duplicate <main> landmark.
frontend/src/views/DebugSessionCreate.vue Removes duplicate <main> landmark and replaces opacity-based step styling with explicit text tokens.
frontend/src/views/DebugSessionBrowser.vue Removes duplicate <main> landmark.
frontend/src/views/BreakglassView.vue Removes duplicate <main> landmark and adds an accessible label to the loading spinner.
frontend/src/views/BreakglassSessionReview.vue Removes duplicate <main> landmark.
frontend/src/router/index.ts Implements post-navigation focus management for improved screen reader/keyboard UX.
frontend/src/main.ts Improves initialization error announcement (role="alert") and uses functional danger token.
frontend/src/components/debug-session/ClusterSelectGrid.vue Replaces opacity-muted styling with explicit token to improve contrast.
frontend/src/components/debug-session/BindingOptionsGrid.vue Uses explicit text tokens (including inverted text) instead of hardcoded/opacity-muted colors.
frontend/src/components/CountdownTimer.vue Adds role="timer", accessible labeling, and a live region for announcements.
frontend/src/components/common/ActionButton.vue Adds aria-busy and an accessible label for the loading spinner.
frontend/src/components/BreakglassSessionCard.vue Replaces opacity-muted styling with explicit token to improve contrast.
frontend/src/components/BreakglassCard.vue Replaces opacity-muted styling with explicit token to improve contrast.
frontend/src/components/ApprovalModalContent.vue Hides decorative emoji from screen readers (aria-hidden).
frontend/src/assets/base.css Adds high-contrast theme overrides and expands forced-colors support; adjusts chip text colors for contrast.
frontend/src/App.vue Adds high-contrast mode toggle (persisted), applies root attribute, and improves nav accessibility attributes.
frontend/package.json Adds dev dependencies for accessibility linting and axe-core Playwright integration.
frontend/package-lock.json Locks new accessibility tooling dependencies.
frontend/eslint.config.mjs Enables vue accessibility lint rules (with targeted rule disablements).
CHANGELOG.md Documents the new user-facing accessibility improvements under Unreleased.
Files not reviewed (1)
  • frontend/package-lock.json: Language not supported

@MaxRink MaxRink force-pushed the feat/frontend-accessibility-improvements branch from 057baf1 to 2748add Compare April 3, 2026 17:02
Copilot AI review requested due to automatic review settings April 3, 2026 17:27
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 30 out of 31 changed files in this pull request and generated 2 comments.

Files not reviewed (1)
  • frontend/package-lock.json: Language not supported

@MaxRink MaxRink force-pushed the feat/frontend-accessibility-improvements branch from e9d8e5b to af8ec12 Compare April 3, 2026 23:57
@MaxRink MaxRink changed the title feat(frontend): comprehensive accessibility improvements (WCAG 2.1 AA) feat(frontend): WCAG AAA accessibility + UI consistency improvements Apr 3, 2026
Copilot AI review requested due to automatic review settings April 4, 2026 09:04
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 35 out of 36 changed files in this pull request and generated 5 comments.

Files not reviewed (1)
  • frontend/package-lock.json: Language not supported

Copilot AI review requested due to automatic review settings April 4, 2026 12:28
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 37 out of 38 changed files in this pull request and generated 4 comments.

Files not reviewed (1)
  • frontend/package-lock.json: Language not supported

Copilot AI review requested due to automatic review settings April 4, 2026 13:07
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 38 out of 39 changed files in this pull request and generated 4 comments.

Files not reviewed (1)
  • frontend/package-lock.json: Language not supported

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 46 out of 47 changed files in this pull request and generated 1 comment.

Files not reviewed (1)
  • frontend/package-lock.json: Language not supported

Copilot AI review requested due to automatic review settings April 6, 2026 18:37
@MaxRink MaxRink force-pushed the feat/frontend-accessibility-improvements branch from 2851477 to 3e05a8b Compare April 6, 2026 18:37
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 46 out of 47 changed files in this pull request and generated no new comments.

Files not reviewed (1)
  • frontend/package-lock.json: Language not supported

MaxRink added a commit that referenced this pull request Apr 6, 2026
- Add aria-pressed attribute to high-contrast toggle button in App.vue
  so assistive technology can announce the button's on/off state
- Fix lint formatting in a11y.spec.ts error page test declaration

Notes on pre-existing fixes verified in this pass:
- CountdownTimer unit tests for SR announcements already present
- ErrorToasts compact spacing test already present
- SCALE_COMPONENT_EXCLUDES replaced by isScaleShadowDomNode() filter
- router/index.ts already cancels focusTimerId on every navigation
- localStorage guarded with try/catch in both getInitialHighContrast/toggleHighContrast
- BreakglassSessionCard/BreakglassCard cluster duplication already fixed
- NotFoundView CTA already uses CSS variables
MaxRink added a commit that referenced this pull request Apr 6, 2026
- Remove aria-pressed from high-contrast toggle button: Scale nav-item
  may assign an implicit menuitem role to slotted content where
  aria-pressed is invalid per WAI-ARIA spec; convey toggle state via
  the dynamic aria-label instead (now includes '(currently on/off)')
Copilot AI review requested due to automatic review settings April 6, 2026 21:00
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 46 out of 47 changed files in this pull request and generated no new comments.

Files not reviewed (1)
  • frontend/package-lock.json: Language not supported

Copilot AI review requested due to automatic review settings April 6, 2026 23:19
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 47 out of 48 changed files in this pull request and generated 1 comment.

Files not reviewed (1)
  • frontend/package-lock.json: Language not supported

Copilot AI review requested due to automatic review settings April 7, 2026 01:15
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 48 out of 49 changed files in this pull request and generated 3 comments.

Files not reviewed (1)
  • frontend/package-lock.json: Language not supported
Comments suppressed due to low confidence (1)

frontend/src/App.vue:407

  • aria-current is being set on <scale-telekom-nav-item>, but the actual navigable element here is the inner <a>. This is both a semantics issue (screen readers typically expect aria-current on the current link) and it likely prevents the active-link contrast override in src/assets/base.css (targets scale-telekom-nav-item a[aria-current="page"], see base.css:266) from applying. Consider moving aria-current onto the <a> element (and/or ensure Scale forwards it to the anchor).
          <scale-telekom-nav-item
            v-for="item in primaryNavItems"
            :key="item.id"
            variant="main-nav"
            :active="activeNavId === item.id"
            :aria-current="activeNavId === item.id ? 'page' : undefined"
          >
            <a :href="navHref(item)" @click="handlePrimaryNavClick($event, item)">
              {{ item.label }}
            </a>

Copilot AI review requested due to automatic review settings April 7, 2026 02:10
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 49 out of 50 changed files in this pull request and generated no new comments.

Files not reviewed (1)
  • frontend/package-lock.json: Language not supported

Copilot AI review requested due to automatic review settings April 7, 2026 08:52
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 49 out of 50 changed files in this pull request and generated 2 comments.

Files not reviewed (1)
  • frontend/package-lock.json: Language not supported

MaxRink added a commit that referenced this pull request Apr 7, 2026
- Add aria-pressed attribute to high-contrast toggle button in App.vue
  so assistive technology can announce the button's on/off state
- Fix lint formatting in a11y.spec.ts error page test declaration

Notes on pre-existing fixes verified in this pass:
- CountdownTimer unit tests for SR announcements already present
- ErrorToasts compact spacing test already present
- SCALE_COMPONENT_EXCLUDES replaced by isScaleShadowDomNode() filter
- router/index.ts already cancels focusTimerId on every navigation
- localStorage guarded with try/catch in both getInitialHighContrast/toggleHighContrast
- BreakglassSessionCard/BreakglassCard cluster duplication already fixed
- NotFoundView CTA already uses CSS variables
MaxRink added a commit that referenced this pull request Apr 7, 2026
- Remove aria-pressed from high-contrast toggle button: Scale nav-item
  may assign an implicit menuitem role to slotted content where
  aria-pressed is invalid per WAI-ARIA spec; convey toggle state via
  the dynamic aria-label instead (now includes '(currently on/off)')
@MaxRink MaxRink force-pushed the feat/frontend-accessibility-improvements branch from 3ed089d to 46a2161 Compare April 7, 2026 10:33
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 49 out of 50 changed files in this pull request and generated 1 comment.

Files not reviewed (1)
  • frontend/package-lock.json: Language not supported

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 49 out of 50 changed files in this pull request and generated 1 comment.

Files not reviewed (1)
  • frontend/package-lock.json: Language not supported

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 49 out of 50 changed files in this pull request and generated no new comments.

Files not reviewed (1)
  • frontend/package-lock.json: Language not supported

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation frontend size/L size/M size/XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants