Lyra Web3 Playground is committed to being truly accessible to all users. We go beyond WCAG 2.1 Level AA compliance to implement cutting-edge, futuristic accessibility features that make Web3 development accessible to everyone.
Our accessibility system includes features for:
- Blind users - Full screen reader support, text-to-speech, code-to-natural-language
- Low vision - High contrast, large text, color blind filters, reading guides
- Deaf users - Visual feedback for all audio cues, captions
- Motor impairments - Dwell click, large targets, full keyboard navigation
- Cognitive disabilities - Simplified UI, focus mode, reduced motion, extended timeouts
- Quick Start
- One-Click Profiles
- Vision Features
- Motor Accessibility
- Cognitive Support
- Audio & Speech
- Keyboard Shortcuts
- Developer Guide
- Component Reference
Method 1: Floating Button
- Look for the ♿ button in the bottom-left corner (draggable)
- Click to open quick menu or full settings panel
Method 2: Keyboard Shortcut
- Press
Alt + Aanywhere to open/close the accessibility panel
Method 3: Quick Menu
- The floating button shows a quick menu with common toggles:
- Dark Mode
- High Contrast
- Large Text
- Text-to-Speech
Apply optimized settings instantly with our accessibility profiles:
| Profile | Icon | What It Enables |
|---|---|---|
| Low Vision | 👓 | High contrast, 150% text, reading guide, enhanced focus |
| Blind | 🦯 | Screen reader optimized, text-to-speech, reduced motion |
| Deaf | 🦻 | Visual notifications only, captions, sign language info |
| Motor Impaired | 🖐️ | Large click targets (64px), dwell click, sticky keys |
| Cognitive | 🧠 | Simplified UI, focus mode, extended timeouts, reduced motion |
- Open the Accessibility Panel (
Alt + A) - Click on a profile card
- Settings are applied immediately
- Customize further as needed
Enables maximum contrast for better visibility:
- Pure black backgrounds
- Bright white text
- Thick, visible borders
- No subtle gradients or shadows
/* Automatically applied */
body.high-contrast {
background: #000 !important;
color: #fff !important;
}Scale text from 100% to 200%:
| Setting | Size | Best For |
|---|---|---|
| 100% | Default | Normal vision |
| 125% | Large | Mild vision issues |
| 150% | Larger | Low vision |
| 175% | Very Large | Significant low vision |
| 200% | Maximum | Severe low vision |
We provide SVG-based color blind simulation and correction:
| Filter | Affects | Description |
|---|---|---|
| Protanopia | Red | Red-blind, no red cones |
| Deuteranopia | Green | Green-blind, no green cones |
| Tritanopia | Blue | Blue-blind, no blue cones |
| Protanomaly | Red | Weak red perception |
| Deuteranomaly | Green | Weak green perception |
| Tritanomaly | Blue | Weak blue perception |
A horizontal highlight bar that follows your mouse cursor:
- Helps track the current line while reading
- Customizable color and opacity
- Height adjusts based on text size setting
Toggle OpenDyslexic font for easier reading:
- Weighted bottoms help anchor letters
- Unique letter shapes reduce confusion
- Applied site-wide when enabled
Personalize your experience:
- Text Color: Choose your preferred text color
- Background Color: Set a comfortable background
- Link Color: Make links stand out
Click without clicking - activate elements by hovering:
- Enable in Accessibility Panel → Motor tab
- Hover over any clickable element
- A circular progress indicator appears
- After the dwell time (configurable), click is triggered
Settings:
- Dwell Time: 500ms - 3000ms
- Works on buttons, links, and interactive elements
Increase the size of clickable areas:
| Setting | Size | Description |
|---|---|---|
| Normal | Default | Standard sizing |
| Large | 48px min | Easier to hit |
| Extra Large | 64px min | Maximum touch area |
For users who cannot hold multiple keys:
- Modifier keys (Ctrl, Alt, Shift) stay "pressed"
- Helps with keyboard shortcuts
- Visual indicator shows active modifiers
Navigate the entire site without a mouse:
- Tab: Move to next element
- Shift + Tab: Move to previous element
- Enter/Space: Activate buttons
- Escape: Close modals
- Arrow keys: Navigate menus
Reduces visual complexity:
- Hides non-essential decorative elements
- Straightforward layouts
- Clear, consistent navigation
Highlights only the current task:
- Dims surrounding content
- Reduces distractions
- Centered attention on active area
Disables animations and transitions:
- Respects
prefers-reduced-motionby default - Can be manually enabled
- Instant state changes
Gives more time for:
- Toast notifications (longer display)
- Session timeouts
- Auto-save delays
- Reading content
Adjusts text-to-speech rate for comfortable listening:
- Range: 50% to 200% of normal speed
- Useful for processing information
Have any content read aloud:
- Uses Web Speech API
- Adjustable speech rate (0.5x - 2x)
- Adjustable pitch (0.5 - 2)
- Voice selection (system voices)
Revolutionary feature: Translates code into plain English!
Example:
function transfer(address to, uint256 amount) public returns (bool)Becomes:
"A public function called 'transfer' that takes an address named 'to' and a number named 'amount', and returns a boolean"
This makes code accessible to:
- Blind developers using screen readers
- Beginners learning to code
- Anyone who prefers natural language
- All dynamic content announced via ARIA live regions
- Proper heading hierarchy
- Descriptive link text
- Form field labels and descriptions
For deaf users:
- All audio cues have visual equivalents
- Toast notifications for status changes
- Visual indicators for connection states
| Shortcut | Action |
|---|---|
Alt + A |
Open/close Accessibility Panel |
Tab |
Navigate forward |
Shift + Tab |
Navigate backward |
Escape |
Close modals/menus |
Enter |
Activate focused element |
Space |
Toggle buttons |
Press Tab on page load to reveal skip links:
- Skip to main content
- Skip to navigation
- Skip to search
import { useAccessibilityStore } from '@/stores/accessibilityStore';
function MyComponent() {
const {
highContrast,
textSize,
textToSpeech,
speak
} = useAccessibilityStore();
// Read content aloud
const handleSpeak = () => {
if (textToSpeech) {
speak('Hello, this is being read aloud!');
}
};
return (
<div style={{ fontSize: `${textSize}%` }}>
<button onClick={handleSpeak}>Read Aloud</button>
</div>
);
}import { useAnnouncer } from '@/components/Accessibility';
function MyComponent() {
const { announce } = useAnnouncer();
const handleSave = async () => {
await saveData();
// Announced to screen readers
announce('Document saved successfully');
};
return <button onClick={handleSave}>Save</button>;
}// ✅ Correct
<button aria-label="Close dialog">
<X className="w-5 h-5" aria-hidden="true" />
</button>
// ❌ Wrong - no accessible name
<button>
<X className="w-5 h-5" />
</button><div
role="dialog"
aria-modal="true"
aria-labelledby="modal-title"
aria-describedby="modal-description"
>
<h2 id="modal-title">Dialog Title</h2>
<p id="modal-description">Description text</p>
</div><div>
<label htmlFor="email">Email</label>
<input
id="email"
type="email"
aria-required="true"
aria-describedby="email-hint"
autoComplete="email"
/>
<p id="email-hint">We'll never share your email</p>
</div>| Component | File | Purpose |
|---|---|---|
AccessibilityButton |
Accessibility/AccessibilityButton.tsx |
Floating button + quick menu |
AccessibilityPanel |
Accessibility/AccessibilityPanel.tsx |
Full settings panel |
SkipLinks |
Accessibility/SkipLinks.tsx |
Skip navigation links |
AnnouncerProvider |
Accessibility/Announcer.tsx |
Screen reader announcements |
DwellClick |
Accessibility/DwellClick.tsx |
Click-by-hovering |
ReadingGuide |
Accessibility/ReadingGuide.tsx |
Line highlighter |
ColorBlindFilters |
Accessibility/ColorBlindFilters.tsx |
SVG color filters |
| Store | File | Purpose |
|---|---|---|
accessibilityStore |
stores/accessibilityStore.ts |
All accessibility settings |
| File | Purpose |
|---|---|
styles/accessibility.css |
All accessibility styles |
| Class | Purpose |
|---|---|
.sr-only |
Visually hidden, screen reader accessible |
.skip-link |
Skip to content link |
.high-contrast |
High contrast mode styles |
.large-text |
Large text mode |
.dyslexic-font |
OpenDyslexic font |
.dwell-click-enabled |
Dwell click mode |
.reading-guide |
Reading guide line |
All accessibility settings are automatically saved to localStorage and persist across sessions:
// Settings auto-persist via Zustand persist middleware
const useAccessibilityStore = create(
persist(
(set, get) => ({
// ... settings
}),
{ name: 'accessibility-settings' }
)
);Users can export their settings as JSON and import them on other devices:
- Open Accessibility Panel → Advanced tab
- Click "Export Settings"
- Save the JSON file
- On another device: "Import Settings" and select the file
- Screen Reader: Test with NVDA (Windows), VoiceOver (Mac), or Orca (Linux)
- Keyboard Only: Navigate entire site without mouse
- Zoom: Test at 200% and 400% browser zoom
- High Contrast: Enable Windows High Contrast or macOS Increase Contrast
- Reduced Motion: Enable in OS settings and verify animations stop
# Run accessibility audit
npm run test:a11yFound an accessibility barrier? We take this seriously!
- GitHub Issues: Open an issue with the
accessibilitylabel - Include:
- Browser and version
- Assistive technology used (if any)
- Steps to reproduce
- Expected vs actual behavior
- Priority: Accessibility issues are treated as high priority
| Standard | Level | Status |
|---|---|---|
| WCAG 2.1 | AA | ✅ Compliant |
| WCAG 2.1 | AAA | ✅ Many criteria met |
| Section 508 | - | ✅ Compliant |
| EN 301 549 | - | ✅ Compliant |
- WCAG 2.1 Guidelines
- ARIA Authoring Practices
- WebAIM
- A11y Project
- Inclusive Components
- Deque University
Last updated: December 2025