Aller au contenu

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

  1. Handsontable audit — Full AT interoperability review of the data editor (EN 301 549 11.8.2)
  2. Authenticated app pages — Extend axe-core test suite to cover /app/* routes (requires test auth setup)
  3. 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:a11y before each release
  • Run npm run test:a11y:all when modifying themes or shared components
  • Update the accessibility statement annually or after significant changes
  • Re-audit when adding new interactive components or content types