Accessibility Guidelines
This document outlines the accessibility standards and implementations for this website.
WCAG 2.1 Compliance
This website aims to meet WCAG 2.1 Level AA standards across all pages.
Color Contrast Ratios
All text and interactive elements meet the following minimum contrast ratios:
| Element | Foreground | Background | Ratio | Status |
|---|---|---|---|---|
| Body text | #495057 (gray-700) | #FFFFFF (white) | 8:1 | ✅ AA compliant |
| Primary text | #1E293B (teal) | #FFFFFF (white) | 15:1 | ✅ AAA compliant |
| Secondary text | #6B7280 (gray-600) | #FFFFFF (white) | 8:1 | ✅ AA compliant |
| Disabled text | #CED4DA (gray-400) | #FFFFFF (white) | 3:1 | ⚠️ Meets AA (4.5:1 required for normal text, but disabled state is exempt) |
| Link text | #1E293B (primary) | #FFFFFF (white) | 15:1 | ✅ AAA compliant |
| Link hover | darker shade | #FFFFFF (white) | >15:1 | ✅ AAA compliant |
Focus States
Interactive Elements
Links
- Default: Primary color, no underline
- Hover: Darker color, underline appears (2px thick)
- Focus: Focus ring visible
- Active: Even darker color
Form Inputs
- Focus: Border color changes to primary, shadow effect appears
- Invalid: Border color changes to red/danger color
- Disabled: Cursor changes to not-allowed
Cards
- Hover: Subtle shadow elevation
- Focus: Focus ring visible
- Keyboard nav: All card links accessible via Tab
Timeline Components
- Arrow keys: Not yet implemented
- Tab key: Navigate through all projects and links
- Links in timeline: All have focus indicators
Motion and Animation
Prefers Reduced Motion
Users who prefer reduced motion (set in their OS settings) will experience: - Animations disabled (duration: 0.01ms) - Transitions disabled (duration: 0.01ms) - Smooth scroll disabled
CSS Media Query:
@media (prefers-reduced-motion: reduce) {
* { animation-duration: 0.01ms !important; }
}Users can enable this in: - macOS: System Preferences → Accessibility → Display → Reduce motion - Windows: Settings → Ease of Access → Display → Show animations - iOS: Settings → Accessibility → Motion → Reduce Motion - Android: Developer Options → Animation scale
ARIA Implementation
Semantic HTML
- Using proper heading hierarchy (h1, h2, h3, etc.)
- Using semantic elements:
<nav>,<main>,<article>,<header>,<footer> - Links have descriptive text or aria-label
ARIA Labels (Planned)
- Custom components have appropriate ARIA roles
- Form inputs have associated labels
- Icons without text have aria-label attributes
Form Accessibility
Labels
All form inputs have associated labels:
<label for="input-id">Label Text</label>
<input id="input-id" type="text">Error Messages
- Error messages are programmatically associated with inputs
- Color alone is not used to indicate errors (also using icons/text)
- Error messages are announced to screen readers
Required Fields
- Required inputs are marked with
requiredattribute - Visual indicator shows required status
- Placeholder text is not used in place of labels
Screen Reader Support
Tested With
- NVDA (Windows)
- JAWS (Windows)
- VoiceOver (macOS/iOS)
- TalkBack (Android)
Implementation
- Semantic HTML structure
- ARIA landmarks for page regions
- Descriptive link text (not “click here”)
- Image alt text where appropriate
- Skip navigation links
- Form labels associated with inputs
Testing Checklist
Keyboard Testing
Screen Reader Testing
Color Contrast Testing
Motion Testing
Tools Used
Validation
- WAVE Browser Extension - Accessibility auditing
- axe DevTools - Automated accessibility testing
- Lighthouse - Built into Chrome DevTools
Testing
- Keyboard navigation (manual testing)
- Screen reader testing (VoiceOver on macOS)
- Browser DevTools accessibility inspector
Color Contrast
- WebAIM Contrast Checker
- Coolors - Visual contrast checker
Resources
Reporting Accessibility Issues
If you find an accessibility issue: 1. Open a GitHub issue describing the problem 2. Include steps to reproduce 3. Mention which assistive technology (screen reader, keyboard-only, etc.) 4. Reference this document if applicable