Animated companions can clarify AI state for sighted users and still fail accessibility if motion is the only channel. Build a dual path: visual presence + textual status.
Non-negotiables
- prefers-reduced-motion — provide a low-motion or static mood change.
- Do not rely on color alone — pair mood hues with labels or shapes.
- Live regions — announce state changes modestly (“Assistant thinking”, “Assistant replied”).
- Focus — decorative companions should be
aria-hiddenwhen a text status exists nearby. - Pause on hide — stop RAF work in background tabs when you can.
Suggested DOM pattern
<div class="ai-chrome">
<div id="glim-host" aria-hidden="true"></div>
<p id="ai-status" role="status" aria-live="polite">Idle</p>
</div>
Update #ai-status whenever you call setState. Sighted users read the companion; assistive tech reads the status.
Seizure and vestibular safety
Cap flash rates. Avoid large full-screen shader thrash for status. Glim’s creatures are corner-scale by design — keep them that way.
QA checklist
- Keyboard-only: status still understandable.
- VoiceOver/NVDA: state changes announced once, not per frame.
- Windows contrast: captions remain readable on your chrome.
- Reduced motion OS setting: no essential info lost.
Try Glim free. Offline starter + MIT creatures. No fake checkout.