Lab 05: Accessibility Architecture

Time: 60 minutes | Level: Architect | Docker: node:20-alpine

Overview

WCAG 2.2 AAA accessibility engineering: ARIA authoring practices for complex widgets (modal, combobox, tabs, tree), focus trap implementation, live region patterns, color contrast AAA (7:1), keyboard navigation, and automated axe-core auditing.


Step 1: ARIA Modal Dialog Pattern

<!-- Modal: role=dialog, aria-modal, focus trap, return focus -->
<div role="dialog"
     aria-modal="true"
     aria-labelledby="modal-title"
     aria-describedby="modal-desc"
     id="confirm-dialog"
     tabindex="-1">
  <h2 id="modal-title">Confirm Action</h2>
  <p id="modal-desc">This action cannot be undone. Are you sure?</p>
  <div class="dialog-actions">
    <button id="modal-cancel" type="button">Cancel</button>
    <button id="modal-confirm" type="button" class="danger">Confirm</button>
  </div>
</div>

💡 Always use inert attribute (not display:none) to hide background content from AT when modal is open. Supported in all modern browsers.


Step 2: Combobox (Autocomplete) ARIA Pattern


Step 3: Tabs Widget


Step 4: Screen Reader Announcement Patterns


Step 5: Color Contrast AAA (7:1 ratio)


Step 6: Tree Widget Navigation


Step 7: axe-core Audit Setup


Step 8: Capstone — Full axe-core Audit

📸 Verified Output:

(Adding lang="en" to <html> yields 0 violations.)


Summary

Pattern
ARIA Role/Property
Keyboard

Modal

role=dialog, aria-modal

Trap Tab, Esc closes

Combobox

role=combobox, aria-expanded

↑↓ navigate, Enter select

Tabs

role=tablist/tab/tabpanel

←→ switch tabs, Tab to panel

Tree

role=tree/treeitem, aria-expanded

←→ collapse/expand

Live region

role=status/alert

Polite vs assertive

Focus visible

:focus-visible

Keyboard-only outline

SR-only

.sr-only pattern

Visible to AT, not screen

Contrast AAA

7:1 ratio

-

Audit

axe-core

Automated WCAG 2.2

Last updated