Accessibility Compliance Report
Organization: Project Lior
Report date: April 6, 2026
Prepared by: Automated audit + manual review
Contact: legal@projectlior.org
1. Executive Summary
A comprehensive accessibility audit was conducted across all three production tenants of the Project Lior platform. The audit assessed conformance with WCAG 2.2 Level AA, EN 301 549 v3.2.1, and the European Accessibility Act (Directive 2019/882).
Result: All automated tests pass with zero violations across all tenants, viewports, and color schemes.
| Metric | Result |
|---|---|
| Tenants tested | 3 (Bordeaux, Lior, Andernos) |
| Total tests | 45 (15 per tenant) |
| Tests passed | 45/45 (100%) |
| WCAG 2.2 AA violations | 0 |
| svelte-check warnings | 0 (across 7,414 files) |
| Severity S1 (Blocker) | 0 open |
| Severity S2 (Critical) | 0 open |
| Severity S3 (Moderate) | 0 open |
2. Scope and Methodology
2.1 Pages Tested
| Route | Description |
|---|---|
/ |
Homepage (marketing) |
/privacy-policy |
Privacy Policy |
/terms-of-service |
Terms of Service |
/auth/signin |
Sign-in / Sign-up |
/auth/reset-password/request |
Password reset request |
2.2 Tenants Tested
| Tenant | URL | Port (dev) | Light theme | Dark theme |
|---|---|---|---|---|
| Bordeaux | bordeaux.projectlior.org | 5173 | bordeaux | bordeaux-dark |
| Lior | www.projectlior.org | 5174 | lior | lior-dark |
| Andernos | andernos.projectlior.org | 5175 | andernos | andernos-dark |
2.3 Automated Tools
| Tool | Version | Purpose |
|---|---|---|
| axe-core | 4.11.1 | WCAG 2.2 AA automated rule checking |
| @axe-core/playwright | 4.11.1 | Playwright integration for axe-core |
| Playwright | Installed via @playwright/test | Browser automation and test framework |
| svelte-check | Project dependency | Svelte compiler accessibility warnings |
2.4 Test Categories
| Category | Tests per tenant | What it verifies |
|---|---|---|
| axe-core light mode | 6 | 3 public pages x 2 viewports (375px mobile, 1280px desktop) |
| axe-core dark mode | 3 | 3 public pages at desktop viewport |
| Auth page audits | 2 | Sign-in and password reset pages |
| Reduced motion | 1 | No content hidden when prefers-reduced-motion: reduce is active |
| Skip-to-content | 1 | First Tab focuses skip link, Enter activates navigation to main content |
| Landmarks | 1 | <main>, <nav>, <footer> landmarks present |
| Focus indicators | 1 | Interactive elements display visible outline on :focus-visible |
2.5 Manual Testing
- Keyboard navigation: Tab, Shift+Tab, Enter, Escape through all pages
- Focus indicator visibility in light and dark themes
- Landmark structure verification
- ARIA attribute review on custom widgets (FloatingMenu, LanguageSwitcher, CookieConsent)
3. Regulatory Frameworks Assessed
3.1 WCAG 2.2 Level A (30 criteria)
| Result | Count |
|---|---|
| Pass | 26 |
| N/A | 4 (1.2.1, 1.2.2, 1.2.3, 2.5.4 — no audio/video/motion-actuated content) |
| Fail | 0 |
3.2 WCAG 2.2 Level AA (26 criteria)
| Result | Count |
|---|---|
| Pass | 22 |
| N/A | 4 (1.4.5 — no images of text; 3.3.4 — no legal/financial commitments; 3.3.7 — no multi-step flows; 3.3.3 — error suggestions context-dependent) |
| Fail | 0 |
3.3 EN 301 549 Additional Requirements
| Requirement | Status |
|---|---|
| 5.2 Activation of accessibility features | N/A — no custom a11y features beyond OS-level |
| 9.6 Full page conformance | Pass |
| 11.7 User preferences (reduced motion, color scheme) | Pass |
| 11.8.2 Accessible content creation | Partial — Handsontable editor not fully audited |
| 12.1.1 Accessibility features documentation | Pass — accessibility statement page created |
| AT interoperability (ARIA) | Pass |
3.4 EAA-Specific
| Requirement | Status |
|---|---|
| Accessibility statement (Article 14) | Pass — /accessibility route |
| Feedback mechanism | Pass — legal@projectlior.org, 5 business day response |
| Enforcement body references | Pass — listed in statement |
4. Findings — Remediated Issues
All 29 issues identified during the initial audit have been resolved. No open findings remain.
4.1 S1 Blockers (5 found, 5 fixed)
| # | Criterion | Issue | Resolution |
|---|---|---|---|
| 1 | 2.4.1 | No <main> landmark in marketing layout |
Added <main id="main-content"> |
| 2 | 2.4.1 | No <main> landmark in app layout |
Changed wrapping <div> to <main> |
| 3 | 2.4.1 | No skip-to-content link | Added in root +layout.svelte |
| 4 | 1.3.1 | Auth form inputs missing labels | Added sr-only <label> elements |
| 5 | 11.7 | ScrollReveal content invisible with reduced motion | Added prefersReducedMotion check + CSS safety net |
4.2 S2 Critical (9 found, 9 fixed)
| # | Criterion | Issue | Resolution |
|---|---|---|---|
| 1 | 4.1.2 | FloatingMenu not wrapped in <nav> |
Added <nav aria-label={menuLabel}> |
| 2 | 2.4.7 | No visible focus indicators project-wide | Global *:focus-visible styles in app.css |
| 3 | 3.3.2 | CookieConsent toggles unlabeled | Added <label for="..."> with i18n text |
| 4 | 4.1.2 | FloatingMenu overlay misusing role="button" |
Changed to aria-hidden="true" |
| 5 | 4.1.3 | Form submissions lack live regions | Added aria-live="polite" / aria-live="assertive" |
| 6 | 2.4.7 | Focus obscured behind fixed menu | Added scroll-margin-top: 5rem |
| 7 | 1.4.3 | text-secondary on inputs fails contrast (2.12:1) |
Changed to text-base-content |
| 8 | 1.4.3 | Footer label-text contrast (4.41:1) | Added explicit text-base-content |
| 9 | 2.4.2 | Auth error container not announcing changes | Added role="alert" aria-live="assertive" |
4.3 S3 Moderate (10 found, 10 fixed)
| # | Criterion | Issue | Resolution |
|---|---|---|---|
| 1 | Various | 4 suppressed svelte a11y warnings | Replaced with proper ARIA roles |
| 2 | 1.4.1 | HomepageAlert hardcoded color classes | Replaced with DaisyUI semantic tokens |
| 3 | 1.4.3 | Footer heading contrast (text-base-content/45) |
Changed to text-base-content/70 |
| 4 | 1.4.3 | Logo tagline text-secondary (1.73:1) |
Changed to base-content with opacity: 0.7 |
| 5 | 3.3.2 | Footer links not localized | Added localizeUrl() to all hrefs |
| 6 | i18n | CookieConsent hardcoded English strings | Replaced with Paraglide message keys |
| 7 | i18n | Footer "Cookie Settings" hardcoded | Replaced with footer_cookie_settings() |
| 8 | 2.4.2 | Privacy Policy empty <title> |
Set to footer_privacy() |
| 9 | 2.4.2 | Terms of Service missing <title> |
Added SeoTags with footer_terms() |
| 10 | 2.4.2 | Password reset missing <title> |
Added <svelte:head><title> |
4.4 S4 Advisory (5 found, 5 fixed)
| # | Criterion | Issue | Resolution |
|---|---|---|---|
| 1 | 1.4.3 | heading-2 / app-heading-1 contrast |
Changed from text-secondary to text-primary |
| 2 | 3.3.8 | Password autocomplete not context-aware | Dynamic current-password / new-password |
| 3 | 1.4.3 | Lior primary color (#d97706) fails contrast | Darkened to #8B5A0B |
| 4 | 1.4.3 | Andernos primary color (#0EA5E9) fails contrast | Darkened to #056DA0 |
| 5 | 1.4.3 | Dark mode CTA button contrast | bg-secondary/50 text-white in dark mode |
5. Per-Tenant Theme Contrast Verification
5.1 Bordeaux
| Element | Light mode | Dark mode | Status |
|---|---|---|---|
| Primary on base-100 | #722F37 on #faf9f7 = 5.6:1 | #C2687A on #0f080c = 5.2:1 | Pass |
| Primary on base-300 | #722F37 on #e5e2dc = 4.7:1 | #C2687A on #2d1f27 = 4.2:1 | Pass (large text) |
| CTA button | text-base-content on bg-secondary/50 | text-white on bg-secondary/50 = 5.6:1 | Pass |
| Footer headings | text-base-content/70 | text-base-content/70 | Pass |
5.2 Lior
| Element | Light mode | Dark mode | Status |
|---|---|---|---|
| Primary on base-100 | #8B5A0B on #f9fafb = 5.6:1 | #f59e0b on #030712 = 9.9:1 | Pass |
| Primary on base-300 | #8B5A0B on #e5e7eb = 4.8:1 | #f59e0b on #1f2937 = 6.8:1 | Pass |
5.3 Andernos
| Element | Light mode | Dark mode | Status |
|---|---|---|---|
| Primary on base-100 | #056DA0 on #f8fbfd = 5.5:1 | #38BDF8 on #040d16 = 10.6:1 | Pass |
| Primary on base-300 | #056DA0 on #dce9f2 = 4.6:1 | #38BDF8 on #1a3147 = 5.5:1 | Pass |
6. Conformance Declaration
Project Lior substantially conforms with WCAG 2.2 Level AA, EN 301 549, and the European Accessibility Act.
Exceptions:
- Third-party OAuth provider pages are outside our control
- User-generated content within the app may not meet all criteria
- Handsontable data editor (app-only, behind authentication) has not been fully audited for AT interoperability
7. Testing Environment
| Parameter | Value |
|---|---|
| Operating system | Windows 11 Pro 10.0.26200 |
| Browser | Chromium (via Playwright) |
| Screen reader | Manual testing with NVDA |
| Viewports | 375x812 (mobile), 1280x800 (desktop) |
| Color schemes | Light, Dark (via prefers-color-scheme) |
| Motion | Normal, Reduced (via prefers-reduced-motion) |
8. Recommendations
Immediate (completed)
- All S1 and S2 issues have been resolved
Next release cycle
- Handsontable audit — Full AT interoperability review of the data editor (EN 301 549 11.8.2)
- Authenticated app pages — Extend axe-core test suite to cover
/app/*routes (requires test auth setup) - AAA enhancements — Consider 7:1 contrast ratio (1.4.6) and enhanced focus appearance (2.4.13) for competitive positioning
Ongoing
- Run
npm run test:a11ybefore each release - Run
npm run test:a11y:allwhen modifying themes or shared components - Update the accessibility statement annually or after significant changes
- Re-audit when adding new interactive components or content types