Accessibility Guidelines: 40 Days of Existential Threats
WCAG 2.1 Level AA Compliance for Interactive Experience Collection
1. WCAG Compliance Overview
Target Compliance: WCAG 2.1 Level AA
The β40 Days of Existential Threatsβ interactive experience collection must meet WCAG 2.1 Level AA standards to ensure accessibility for users with diverse abilities.
The Four POUR Principles
Principle
Description
WCAG Criteria
Perceivable
Information must be presentable in ways users can perceive
1.1.1 - 1.4.13
Operable
Interface components must be operable by all users
2.1.1 - 2.5.6
Understandable
Information and UI operation must be understandable
3.1.1 - 3.3.6
Robust
Content must work with current and future assistive technologies
4.1.1 - 4.1.3
Compliance Checklist Summary
β‘ All images have appropriate alt text (1.1.1)
β‘ Color is not the only means of conveying information (1.4.1)
β‘ Audio content has transcripts/captions (1.2.1-1.2.4)
β‘ Text contrast meets 4.5:1 minimum (1.4.3)
β‘ All functionality available via keyboard (2.1.1)
β‘ No keyboard traps (2.1.2)
β‘ Focus order is logical (2.4.3)
β‘ Focus is visible (2.4.7)
β‘ Page has descriptive title (2.4.2)
β‘ Form labels are associated (1.3.1, 3.3.2)
β‘ Error messages are descriptive (3.3.1, 3.3.3)
β‘ Animations respect prefers-reduced-motion (2.3.3)
β‘ Touch targets are 44x44px minimum (2.5.5)
2. Color & Contrast
Minimum Contrast Ratios (WCAG 1.4.3, 1.4.11)
Element Type
Minimum Ratio
Enhanced (AAA)
Normal text (<18pt / <14pt bold)
4.5:1
7:1
Large text (β₯18pt / β₯14pt bold)
3:1
4.5:1
UI Components & Graphics
3:1
N/A
Focus indicators
3:1
N/A
Dark Theme Specific Considerations
For the dark, luminous aesthetic with bioluminescent accents:
/* Base dark theme with accessible contrast */:root { /* Background colors - ensure 4.5:1 with text */ --bg-primary: #0a0a0f; /* Deepest black-blue */ --bg-secondary: #12121a; /* Slightly elevated */ --bg-tertiary: #1a1a25; /* Cards/surfaces */ /* Text colors - must contrast 4.5:1 with backgrounds */ --text-primary: #f0f0f5; /* Primary text */ --text-secondary: #a0a0b0; /* Secondary text (min 4.5:1) */ --text-muted: #707080; /* Disabled/hints (min 4.5:1) */ /* Bioluminescent accents - ensure contrast */ --accent-cyan: #00d4aa; /* Primary accent */ --accent-purple: #a855f7; /* Secondary accent */ --accent-amber: #f59e0b; /* Warning accent */}
Bioluminescent Accent Color Contrast Requirements
/* Accent colors must meet 3:1 against backgrounds for UI elements */.bioluminescent-button { background: transparent; border: 2px solid var(--accent-cyan); color: var(--accent-cyan); /* Border + text must have 3:1 contrast against bg */}/* For text on accent backgrounds, use dark overlay */.accent-bg-text { background: var(--accent-cyan); color: var(--bg-primary); /* Dark text on light accent */}
Danger/Warning/Success Color Contrast
/* Status colors with guaranteed contrast */:root { --status-error: #ef4444; /* Must be 3:1 against bg */ --status-warning: #f59e0b; /* Must be 3:1 against bg */ --status-success: #22c55e; /* Must be 3:1 against bg */ --status-info: #3b82f6; /* Must be 3:1 against bg */}/* Always pair with icons/text, never color alone */.status-message { display: flex; align-items: center; gap: 0.5rem;}.status-message::before { content: "β "; /* Icon + color */}
Text on Glass-Morphism Backgrounds
/* Glass morphism with accessible text */.glass-card { background: rgba(255, 255, 255, 0.05); backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.1);}/* Ensure text has sufficient contrast */.glass-card p { color: var(--text-primary); /* #f0f0f5 on dark bg = sufficient contrast */ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); /* Enhances readability */}
Testing Tools
Tool
Purpose
URL
WebAIM Contrast Checker
Manual color testing
webaim.org/resources/contrastchecker/
axe DevTools
Automated contrast testing
deque.com/axe/devtools/
Stark (Figma/Sketch)
Design phase testing
getstark.co
Colour Contrast Analyser
Desktop app
tpgi.com/cca/
Lighthouse
Automated audit
Built into Chrome DevTools
Donβt Rely on Color Alone (WCAG 1.4.1)
<!-- β INCORRECT: Color only --><span class="red-text">Critical threat level</span><!-- β CORRECT: Color + icon + text --><span class="status-critical"> <svg aria-hidden="true" class="icon-critical">...</svg> <span class="visually-hidden">Critical:</span> Threat level maximum</span>
All Interactive Elements Must Be Keyboard Accessible (WCAG 2.1.1)
<!-- β Native elements are keyboard accessible by default --><button>Activate</button><a href="/path">Navigate</a><input type="text" /><select>...</select><!-- β Custom elements need tabindex and keyboard handlers --><div role="button" tabindex="0" aria-pressed="false" onkeydown="handleKey(event)"> Custom Button</div>
<!-- Skip link as first focusable element --><a href="#main-content" class="skip-link"> Skip to main content</a><nav aria-label="Main">...</nav><main id="main-content" tabindex="-1"> <!-- Experience content --></main>
<!-- aria-label for elements without visible text --><button aria-label="Close experience"> <svg aria-hidden="true">...</svg></button><!-- aria-labelledby for complex labeling --><div role="group" aria-labelledby="group-title group-desc"> <h3 id="group-title">Threat Level Selection</h3> <p id="group-desc">Choose how challenging this experience will be</p> <!-- Radio buttons --></div><!-- aria-describedby for additional context --><input type="text" id="username" aria-describedby="username-hint username-error" aria-required="true" /><p id="username-hint">Enter your codename for this experience</p><p id="username-error" role="alert" aria-live="polite"></p>
Live Regions for Dynamic Content (WCAG 4.1.3)
<!-- Polite live region - announces when user is idle --><div aria-live="polite" aria-atomic="true" id="status-updates"> <!-- Dynamic status messages --></div><!-- Assertive live region - interrupts immediately --><div aria-live="assertive" aria-atomic="true" id="critical-alerts"> <!-- Critical notifications only --></div><!-- Log region for chat/history --><div role="log" aria-live="polite" aria-relevant="additions"> <!-- Experience event log --></div><!-- Status region for progress updates --><div role="status" aria-live="polite" aria-atomic="true"> <p>Experience saved successfully</p></div>
<!-- β Descriptive button labels --><button>Start Day 1 Experience</button><button aria-describedby="save-desc">Save Progress</button><span id="save-desc" class="visually-hidden">Saves your current position in this experience</span><!-- β Descriptive link text --><a href="/day-2">Continue to Day 2: The Gathering</a><!-- β Avoid vague labels --><button>Click here</button> <!-- β --><a href="/next">Read more</a> <!-- β -->
Icon-Only Button Requirements
<!-- Icon-only buttons MUST have accessible names --><button aria-label="Play experience"> <svg aria-hidden="true" focusable="false"> <use href="#icon-play" /> </svg></button><!-- Or use visually hidden text --><button> <svg aria-hidden="true" focusable="false">...</svg> <span class="visually-hidden">Pause experience</span></button><!-- Toggle buttons need aria-pressed --><button aria-pressed="false" aria-label="Mute audio"> <svg aria-hidden="true">...</svg></button>
// Check user preference before animatingconst prefersReducedMotion = window.matchMedia( '(prefers-reduced-motion: reduce)').matches;function playThreatAnimation() { if (prefersReducedMotion) { // Show static representation showStaticThreatIndicator(); } else { // Play full animation playFullAnimation(); }}
No Auto-Playing Content Without Pause (WCAG 1.4.2)
<!-- Auto-playing content must have pause control --><div class="ambient-audio"> <audio autoplay loop> <source src="ambient.mp3" type="audio/mpeg" /> </audio> <button aria-label="Pause ambient audio" aria-pressed="false"> <svg aria-hidden="true">...</svg> </button></div><!-- Or provide pause before 3 seconds --><div class="auto-advance" data-auto-advance="3000"> <button class="pause-advance" aria-label="Pause auto-advance"> Pause </button> <!-- Content --></div>
β‘ aria-modal="true" on dialog element
β‘ aria-labelledby pointing to title
β‘ aria-describedby for content summary (optional)
β‘ Focus trap implemented
β‘ Initial focus on title or first interactive element
β‘ Escape key closes modal
β‘ Focus returns to trigger element on close
β‘ Click outside closes (with option to disable)
β‘ Background content is inert
/* Support both orientations */@supports not (orientation: landscape) { /* Fallback for devices that lock orientation */}/* Ensure content works in both orientations */.experience-container { /* Mobile portrait */ @media (orientation: portrait) { flex-direction: column; } /* Mobile landscape / desktop */ @media (orientation: landscape) { flex-direction: row; }}/* Never lock orientation via CSS or JS *//* β screen.orientation.lock('portrait') */
Zoom Without Loss of Functionality (WCAG 1.4.4, 1.4.10)
/* Allow zoom up to 400% */html { /* Never disable zoom */ /* β user-scalable=no */}/* Responsive at 320px equivalent (400% of 1280px) */@media (max-width: 320px) { .experience-content { /* Reflow content vertically */ display: flex; flex-direction: column; } /* Ensure no horizontal scroll */ body { overflow-x: hidden; }}/* Reflow requirements */.experience-container { /* Content must reflow without horizontal scroll */ max-width: 100%; /* No content loss at 400% zoom */ min-height: auto; /* Vertical scrolling only */ overflow-y: auto; overflow-x: hidden;}
10. Testing Checklist
Automated Testing Tools
Tool
Type
Coverage
axe DevTools
Browser extension
WCAG 2.1 AA
Lighthouse
Built-in Chrome
Basic a11y
WAVE
Browser extension
Visual feedback
Pa11y
CLI/CI
Automated scanning
eslint-plugin-jsx-a11y
Linting
React a11y
Manual Keyboard Testing
β‘ Tab through entire page - is order logical?
β‘ Shift+Tab moves backwards correctly
β‘ All interactive elements reachable via Tab
β‘ No keyboard traps
β‘ Focus visible on all elements
β‘ Enter activates buttons/links
β‘ Space activates buttons
β‘ Arrow keys work in widgets
β‘ Escape closes modals/menus
β‘ Home/End work in lists
β‘ Page Up/Down scroll content
Screen Reader Testing
Screen Reader
Browser
Platform
NVDA
Firefox, Chrome
Windows
JAWS
Chrome, Edge
Windows
VoiceOver
Safari
macOS, iOS
TalkBack
Chrome
Android
Narrator
Edge
Windows
Testing Commands:
NVDA:
- Insert + F7: Elements list
- Insert + Space: Focus/browse mode
- H: Next heading
- D: Next landmark
- T: Next table
- F: Next form field
VoiceOver:
- Cmd + F5: Toggle VoiceOver
- VO + U: Rotor
- VO + Cmd + H: Next heading
- VO + Cmd + L: Next link
Screen Reader Testing Checklist
β‘ Page title announced on load
β‘ Heading hierarchy makes sense
β‘ Landmarks navigable
β‘ All images have alt text
β‘ Form labels announced correctly
β‘ Error messages announced
β‘ Buttons have accessible names
β‘ Links are descriptive
β‘ Live regions announce updates
β‘ Progress changes announced
β‘ Modal content accessible
β‘ Tables have headers
β‘ Lists properly structured
Color Contrast Verification
β‘ Normal text (4.5:1 minimum)
β‘ Large text (3:1 minimum)
β‘ UI components (3:1 minimum)
β‘ Focus indicators (3:1 minimum)
β‘ Graphs/charts don't rely on color alone
β‘ Error states have more than color
β‘ Success states have more than color
Cognitive Accessibility Considerations
β‘ Clear, simple language
β‘ Consistent navigation
β‘ Predictable behavior
β‘ Error prevention
β‘ Clear error messages
β‘ No time limits (or adjustable)
β‘ No flashing content (>3Hz)
β‘ Clear focus indicators
β‘ Help text available
β‘ Consistent icon usage
11. Accessibility Statement Template
# Accessibility Statement## 40 Days of Existential Threats**Last Updated:** [Date]### Our Commitment40 Days of Existential Threats is committed to ensuring digital accessibility for people with disabilities. We are continually improving the user experience for everyone and applying the relevant accessibility standards.### Conformance StatusThis website is partially conformant with WCAG 2.1 Level AA. Partially conformant means that some parts of the content do not fully conform to the accessibility standard.### Accessibility Features- Keyboard navigation support for all interactive elements- Screen reader compatibility with ARIA landmarks and labels- Color contrast ratios meeting WCAG 2.1 AA standards- Reduced motion support for animations- Resizable text up to 400% without loss of functionality- Alternative text for all images- Descriptive link text and button labels### Known Limitations- [List any known accessibility issues]- [Describe workarounds if available]- [Timeline for resolution]### FeedbackWe welcome your feedback on the accessibility of 40 Days of Existential Threats.- Email: [[email protected]]- Phone: [Phone number with accessibility support]- Address: [Physical address]We aim to respond to accessibility feedback within [timeframe] business days.### Compatibility40 Days of Existential Threats is designed to be compatible with:- Current versions of Chrome, Firefox, Safari, and Edge- Screen readers including NVDA, JAWS, and VoiceOver- Operating system accessibility features### AssessmentAccessibility of 40 Days of Existential Threats is assessed by:- Self-evaluation using automated testing tools- Manual testing with assistive technologies- [Third-party assessment if applicable]### Formal ComplaintsIf you are not satisfied with our response to your accessibility concerns, you may contact [relevant authority or ombudsman].### Technical SpecificationsAccessibility of 40 Days of Existential Threats relies on the following technologies:- HTML5- WAI-ARIA- CSS- JavaScriptThese technologies are relied upon for conformance with the accessibility standards used.---This statement was created using the W3C Accessibility Statement Generator Tool.