WCAG AA accessibility checklist and verification protocols for Somali dialect classifier dashboard...
Tab Order:
Interactive Elements:
Testing:
1. Unplug mouse
2. Navigate entire dashboard using only keyboard
3. Verify all features accessible
4. Check tab order is logical
Visibility:
outline: none unless replacedImplementation:
/* Good focus states */
.btn:focus-visible {
outline: 3px solid var(--tableau-blue);
outline-offset: 3px;
}
.data-toggle__option:focus-visible {
outline: 2px solid var(--data-blue-primary);
outline-offset: 2px;
z-index: 1;
}
/* Chart canvas focus */
canvas:focus-visible {
outline: 2px solid var(--data-cyan-primary);
outline-offset: 2px;
border-radius: 4px;
}
Normal Text (< 18px):
Large Text (≥ 18px or 14px bold):
UI Components:
Verified Combinations:
| Foreground | Background | Ratio | Status |
|---|---|---|---|
| White | Tableau Blue (#0176D3) | 4.83:1 | ✅ AA |
| White | Tableau Navy (#032D60) | 13.55:1 | ✅ AAA |
| Text (#333) | White | 12.63:1 | ✅ AAA |
| Data Cyan (#33BBEE) | White | 2.4:1 | ❌ (use dark text) |
Testing Tool:
Landmarks:
<header> for site/page header<nav> for navigation<main> for main content<aside> for sidebars<footer> for footerHeadings:
Lists:
<ul>/<ol> for lists<dl> for definition listsButtons vs Links:
<button> for actions (submit, toggle, delete)<a> for navigation (go to another page)Example:
<!-- Good semantic structure -->
<header>
<h1>Somali Dialect Classifier Dashboard</h1>
<nav aria-label="Main navigation">
<ul>
<li><a href="/overview">Overview</a></li>
<li><a href="/data">Data Sources</a></li>
</ul>
</nav>
</header>
<main>
<section aria-labelledby="metrics-heading">
<h2 id="metrics-heading">Pipeline Metrics</h2>
<!-- Content -->
</section>
</main>
Icon Buttons:
<button aria-label="Delete dataset">
<svg><!-- trash icon --></svg>
</button>
Status Indicators:
<span
className="status-icon"
aria-label="Pipeline status: healthy"
role="img"
>
✓
</span>
Charts (Canvas):
<canvas
aria-label="Bar chart showing dialect distribution: Northern 60%, Southern 25%, Central 15%"
role="img"
></canvas>
Form Inputs:
<label for="dataset-name">Dataset Name</label>
<input
id="dataset-name"
type="text"
aria-describedby="name-help"
/>
<p id="name-help" className="help-text">
Choose a descriptive name for your dataset
</p>
Informative Images:
Decorative Images:
alt="" (empty alt attribute)Examples:
<!-- Informative -->
<img
src="confusion-matrix.png"
alt="Confusion matrix showing Northern dialect correctly classified 94% of the time, Southern 82%, Central 79%"
/>
<!-- Decorative -->
<img src="decorative-pattern.svg" alt="" />
Charts as Images:
Labels:
<label>Error Messages:
aria-describedbyExample:
<div className="form-field">
<label for="source-url">Source URL</label>
<input
id="source-url"
type="url"
aria-describedby="url-error"
aria-invalid="true"
/>
<p id="url-error" className="error-message" role="alert">
Invalid URL format. Use: https://example.com
</p>
</div>
Announcement Priorities:
Live Regions:
<!-- Status updates -->
<div aria-live="polite" aria-atomic="true">
{statusMessage}
</div>
<!-- Urgent alerts -->
<div role="alert" aria-live="assertive">
{errorMessage}
</div>
Testing Tools:
Focus Management:
ARIA Attributes:
<div
role="dialog"
aria-modal="true"
aria-labelledby="dialog-title"
aria-describedby="dialog-desc"
>
<h2 id="dialog-title">Delete Dataset?</h2>
<p id="dialog-desc">
This action cannot be undone.
</p>
<button onClick={confirmDelete}>Delete</button>
<button onClick={closeModal}>Cancel</button>
</div>
Keyboard:
Screen Reader:
Visual:
Browser Extensions:
Command:
# Run Lighthouse accessibility audit
npx lighthouse https://dashboard-url --only-categories=accessibility --view
Target Score: Lighthouse Accessibility Score ≥ 95/100
Fix: Add descriptive alt attributes to all images
Fix: Use design-system colors (verified contrast ratios)
Fix: Add :focus-visible styles to all interactive elements
Fix: Add aria-label to canvas, provide data table alternative
Fix: Use role="alert" and aria-describedby
This skill auto-invokes when you mention:
Version: 1.0.0 Last Updated: 2025-11-06 Project: Somali Dialect Classifier Dashboard