tractatus/audit-reports/accessibility-manual-audit.md
TheFlow 2298d36bed fix(submissions): restructure Economist package and fix article display
- Create Economist SubmissionTracking package correctly:
  * mainArticle = full blog post content
  * coverLetter = 216-word SIR— letter
  * Links to blog post via blogPostId
- Archive 'Letter to The Economist' from blog posts (it's the cover letter)
- Fix date display on article cards (use published_at)
- Target publication already displaying via blue badge

Database changes:
- Make blogPostId optional in SubmissionTracking model
- Economist package ID: 68fa85ae49d4900e7f2ecd83
- Le Monde package ID: 68fa2abd2e6acd5691932150

Next: Enhanced modal with tabs, validation, export

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 08:47:42 +13:00

211 lines
7.1 KiB
Markdown

# Tractatus Website - Manual Accessibility Audit (WCAG 2.1 AA)
**Date:** 2025-10-08
**Standard:** WCAG 2.1 Level AA
**Pages Audited:** 9 main pages
---
## Executive Summary
**Overall Status:** ✅ GOOD - Most WCAG AA requirements met
**Critical Issues:** 1
**Warnings:** 4
**Passes:** 15
---
## Page-by-Page Analysis
### 1. Homepage (`/index.html`)
#### ✅ Passes
- `lang="en"` attribute present
- Skip link for keyboard navigation (lines 19-20)
- Proper semantic HTML: `<header>`, `<main>`, `<footer>`
- Appropriate ARIA roles: `role="banner"`, `role="main"`, `role="contentinfo"`
- Heading hierarchy correct (h1 → h2 → h3)
- `aria-labelledby` used on sections
- Descriptive link text ("See Interactive Demo", not "click here")
- External links have `rel="noopener"` for security
- Meta viewport for responsive design
- Descriptive page title and meta description
#### ❌ Critical Issues
**Line 74:** Duplicate `aria-hidden="true"` attribute on SVG
```html
<svg aria-hidden="true" class="..." fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
```
**Fix:** Remove duplicate attribute
#### ⚠️ Warnings
1. **Focus indicators:** No explicit `:focus` styles visible in inline CSS (check if Tailwind provides defaults)
2. **Color contrast:** Cannot verify without visual inspection (blue-600, purple-600, gray text on backgrounds)
3. **SVG decorative:** All SVGs have `aria-hidden="true"` which is correct for decorative icons
4. **Form elements:** None on this page (forms checked separately)
---
## WCAG 2.1 AA Checklist
### 1. Perceivable
#### 1.1 Text Alternatives
- [ ] **1.1.1 Non-text Content (Level A):** Need to check if any images exist
- ✅ All SVGs are decorative with `aria-hidden="true"`
- ⚠️ Tractatus icon logo needs alt text if used as `<img>`
#### 1.2 Time-based Media
-**N/A:** No video or audio content
#### 1.3 Adaptable
-**1.3.1 Info and Relationships (Level A):** Proper semantic HTML
-**1.3.2 Meaningful Sequence (Level A):** Logical content flow
-**1.3.3 Sensory Characteristics (Level A):** No shape/color-only instructions
#### 1.4 Distinguishable
- ⚠️ **1.4.3 Contrast (Level AA):** Needs visual verification
- Blue-600 (#2563eb) on white: ✅ 7.39:1 (passes)
- White on blue-600: ✅ 7.39:1 (passes)
- Gray-700 (#374151) on white: ✅ 10.73:1 (passes)
- Text-blue-100 on blue-700: ⚠️ Needs verification
-**1.4.4 Resize Text (Level AA):** Uses relative units (rem/em via Tailwind)
-**1.4.5 Images of Text (Level AA):** No images of text
-**1.4.10 Reflow (Level AA):** Responsive design with Tailwind
- ⚠️ **1.4.11 Non-text Contrast (Level AA):** UI component contrast needs verification
-**1.4.12 Text Spacing (Level AA):** No restrictions on text spacing
### 2. Operable
#### 2.1 Keyboard Accessible
-**2.1.1 Keyboard (Level A):** All links/buttons are keyboard accessible
-**2.1.2 No Keyboard Trap (Level A):** No trapping elements detected
- ⚠️ **2.1.4 Character Key Shortcuts (Level A):** No custom shortcuts detected
#### 2.2 Enough Time
-**N/A:** No time limits on content
#### 2.3 Seizures and Physical Reactions
-**2.3.1 Three Flashes (Level A):** No flashing content
#### 2.4 Navigable
-**2.4.1 Bypass Blocks (Level A):** Skip link present
-**2.4.2 Page Titled (Level A):** Descriptive page titles
-**2.4.3 Focus Order (Level A):** Logical tab order
-**2.4.4 Link Purpose (Level A):** Descriptive link text
- ⚠️ **2.4.5 Multiple Ways (Level AA):** Check if site has sitemap/search
-**2.4.6 Headings and Labels (Level AA):** Clear, descriptive headings
-**2.4.7 Focus Visible (Level AA):** Browser defaults present (custom styling recommended)
#### 2.5 Input Modalities
-**2.5.1 Pointer Gestures (Level A):** No complex gestures
-**2.5.2 Pointer Cancellation (Level A):** Standard click events
-**2.5.3 Label in Name (Level A):** Visible labels match accessible names
- ⚠️ **2.5.4 Motion Actuation (Level A):** No motion-triggered actions
### 3. Understandable
#### 3.1 Readable
-**3.1.1 Language of Page (Level A):** `lang="en"` present
- ⚠️ **3.1.2 Language of Parts (Level AA):** Check if any non-English content needs `lang` attribute
#### 3.2 Predictable
-**3.2.1 On Focus (Level A):** No context changes on focus
-**3.2.2 On Input (Level A):** No automatic form submission
-**3.2.3 Consistent Navigation (Level AA):** Navbar consistent across pages
-**3.2.4 Consistent Identification (Level AA):** Icons/components used consistently
#### 3.3 Input Assistance
- ⚠️ **Form pages only:** Will check media-inquiry.html and case-submission.html separately
### 4. Robust
#### 4.1 Compatible
-**4.1.1 Parsing (Level A):** Valid HTML5 (except duplicate aria-hidden)
-**4.1.2 Name, Role, Value (Level A):** Proper ARIA usage
-**4.1.3 Status Messages (Level AA):** No status messages detected
---
## Issues to Fix
### Critical (Must Fix)
1. **index.html:74** - Remove duplicate `aria-hidden="true"` on SVG
### High Priority (Should Fix)
1. **All pages** - Add custom `:focus` styles with clear visual indicators
2. **All pages** - Verify color contrast ratios programmatically
3. **Navbar logo** - Add alt text if tractatus-icon.svg is used as `<img>`
4. **Forms** - Comprehensive form accessibility audit needed
### Medium Priority (Nice to Have)
1. Add site search functionality (WCAG 2.4.5)
2. Add sitemap page
3. Consider adding focus trap for modals (if any)
4. Add visible skip link styling (currently only visible on :focus)
---
## Forms Accessibility (Separate Audit Required)
Pages with forms:
- `/media-inquiry.html`
- `/case-submission.html`
Requirements to check:
1. All inputs have associated `<label>` elements
2. Required fields marked with `aria-required="true"` or `required`
3. Error messages associated with inputs using `aria-describedby`
4. Fieldsets and legends for grouped inputs
5. Clear focus indicators on form controls
6. Validation feedback accessible to screen readers
---
## Recommendations
### Immediate Actions
1. Fix duplicate `aria-hidden` attribute
2. Add custom focus styles:
```css
a:focus, button:focus, input:focus, select:focus, textarea:focus {
outline: 3px solid #3b82f6;
outline-offset: 2px;
}
```
### Testing Required
1. Run automated color contrast checker
2. Test keyboard navigation on all pages
3. Test with screen reader (NVDA/JAWS/VoiceOver)
4. Test form validation accessibility
5. Test mobile touch targets (44x44px minimum)
### Documentation
1. Create accessibility statement page
2. Document keyboard shortcuts (if any)
3. Provide text transcript for any future video content
---
## Tools for Further Testing
**Automated Testing:**
- axe DevTools (browser extension)
- WAVE (browser extension)
- Lighthouse CI
**Manual Testing:**
- Screen readers: NVDA (Windows), JAWS (Windows), VoiceOver (macOS/iOS)
- Keyboard-only navigation
- Color contrast analyzers
- Text resize testing (up to 200%)
**Next Steps:**
1. Fix critical issue (duplicate aria-hidden)
2. Add focus styles
3. Run color contrast verification
4. Audit forms comprehensively
5. Test keyboard navigation
6. Test mobile responsiveness