Help us improve
Share bugs, ideas, or general feedback.
From builder-design
Use before shipping any UI that renders AI-generated content. Dynamic model output requires ARIA live regions, reading order, and cognitive load review that static content does not. Blocks "we'll do accessibility later" completions.
npx claudepluginhub rbraga01/a-team --plugin builder-designHow this skill is triggered — by the user, by Claude, or both
Slash command
/builder-design:accessible-ai-outputThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
```
Provides a checklist for code reviews covering functionality, security, performance, maintainability, tests, and quality. Use for pull requests, audits, team standards, and developer training.
Share bugs, ideas, or general feedback.
AI OUTPUT IS NOT ACCESSIBLE BY DEFAULT.
Streaming text injected into the DOM is invisible to screen readers without ARIA live regions.
"We'll do accessibility later" ships content that is unusable by assistive technology now.
ARIA live regions + reading order + cognitive load review IS accessible AI output.
Trigger before:
Dynamically inserted content is invisible to screen readers unless an aria-live region is declared.
<!-- Streaming output — use polite: screen reader finishes current before announcing -->
<div
role="log"
aria-live="polite"
aria-label="AI response"
aria-atomic="false"
>
<!-- Streamed tokens inserted here -->
</div>
<!-- Error messages — use assertive: interrupts current reading -->
<div role="alert" aria-live="assertive">
Something went wrong. Try again.
</div>
<!-- Status indicators (generating, done) — polite -->
<div aria-live="polite" aria-label="Generation status">
Generating…
</div>
Rules:
aria-live="polite" for response content — does not interrupt what the user is readingaria-live="assertive" for errors only — interrupts; use sparinglyaria-atomic="false" on streaming containers — announces each new chunk, not the entire accumulated textrole="log" for conversational output (chat); role="status" for status messagesScreen readers follow DOM order. Visual layout does not change DOM order.
Common failures in AI UIs:
Fix: Match DOM order to reading order. Test by tabbing through the page with no CSS.
<!-- Correct DOM order -->
<div class="message user">User message text</div>
<div class="message ai" aria-live="polite">AI response text</div>
<div class="message-actions">
<button>Copy</button>
<button>Retry</button>
</div>
AI outputs are often long, unpredictably structured, and dense. Cognitive load review asks:
<code> or role="code")?<thead>, <th scope>, caption)?For every streaming or dynamic AI output container, add the correct aria-live attribute before the feature ships.
Tab through the feature with CSS disabled (or use browser DevTools to view DOM order). Every interactive element and content block should be reachable in a logical order.
- [ ] Long responses have a "skip to actions" link
- [ ] Code blocks use <code> or role="code" with language label
- [ ] Tables use <thead>, <th scope="col/row">, and a caption
- [ ] Citations / sources reachable by keyboard
- [ ] Truncation announced to screen reader
- [ ] Streaming cursor / animation has prefers-reduced-motion alternative
Run the feature with VoiceOver (macOS) or NVDA (Windows). Verify:
These thoughts mean accessibility was skipped — stop:
When accessible-ai-output is satisfied, state it like this:
Accessibility review complete.
Feature: <name>
ARIA live regions:
Response container: role="log" aria-live="polite" aria-atomic="false" ✓
Error container: role="alert" aria-live="assertive" ✓
Status indicator: aria-live="polite" ✓
Reading order: DOM order matches visual reading order ✓
Verified by: tab navigation test / DOM order audit
Cognitive load checklist:
Code blocks: <code> with language label ✓
Tables: thead + th scope + caption ✓
Truncation: announced to screen reader ✓
Reduced motion: streaming animation alternative ✓
Screen reader test: VoiceOver / NVDA — streaming announced correctly ✓
Accessibility review stored: design/reviews/<feature>/<date>-accessibility.md ✓
Streaming text injected into the DOM without aria-live is completely silent to screen readers. The user hears nothing while the model generates. For a feature where generation is the primary interaction, this makes the feature entirely unusable — not degraded, absent. ARIA live regions are a 20-minute addition that converts a feature from inaccessible to usable.