- 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>
7.1 KiB
7.1 KiB
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-labelledbyused 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
<svg aria-hidden="true" class="..." fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
Fix: Remove duplicate attribute
⚠️ Warnings
- Focus indicators: No explicit
:focusstyles visible in inline CSS (check if Tailwind provides defaults) - Color contrast: Cannot verify without visual inspection (blue-600, purple-600, gray text on backgrounds)
- SVG decorative: All SVGs have
aria-hidden="true"which is correct for decorative icons - 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>
- ✅ All SVGs are decorative with
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
langattribute
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)
- index.html:74 - Remove duplicate
aria-hidden="true"on SVG
High Priority (Should Fix)
- All pages - Add custom
:focusstyles with clear visual indicators - All pages - Verify color contrast ratios programmatically
- Navbar logo - Add alt text if tractatus-icon.svg is used as
<img> - Forms - Comprehensive form accessibility audit needed
Medium Priority (Nice to Have)
- Add site search functionality (WCAG 2.4.5)
- Add sitemap page
- Consider adding focus trap for modals (if any)
- 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:
- All inputs have associated
<label>elements - Required fields marked with
aria-required="true"orrequired - Error messages associated with inputs using
aria-describedby - Fieldsets and legends for grouped inputs
- Clear focus indicators on form controls
- Validation feedback accessible to screen readers
Recommendations
Immediate Actions
- Fix duplicate
aria-hiddenattribute - Add custom focus styles:
a:focus, button:focus, input:focus, select:focus, textarea:focus {
outline: 3px solid #3b82f6;
outline-offset: 2px;
}
Testing Required
- Run automated color contrast checker
- Test keyboard navigation on all pages
- Test with screen reader (NVDA/JAWS/VoiceOver)
- Test form validation accessibility
- Test mobile touch targets (44x44px minimum)
Documentation
- Create accessibility statement page
- Document keyboard shortcuts (if any)
- 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:
- Fix critical issue (duplicate aria-hidden)
- Add focus styles
- Run color contrast verification
- Audit forms comprehensively
- Test keyboard navigation
- Test mobile responsiveness