Some checks failed
Architecture Lint / Lint Repository (push) Has been cancelled
Architecture Lint / Linter Tests (push) Has been cancelled
Smoke Test / smoke (push) Has been cancelled
Validate Config / YAML Lint (push) Has been cancelled
Validate Config / JSON Validate (push) Has been cancelled
Validate Config / Python Syntax & Import Check (push) Has been cancelled
Validate Config / Python Test Suite (push) Has been cancelled
Validate Config / Shell Script Lint (push) Has been cancelled
Validate Config / Cron Syntax Check (push) Has been cancelled
Validate Config / Deploy Script Dry Run (push) Has been cancelled
Validate Config / Playbook Schema Validation (push) Has been cancelled
Merge PR #556
151 lines
5.9 KiB
Markdown
151 lines
5.9 KiB
Markdown
# Visual Accessibility Audit — Foundation Web Properties
|
|
|
|
**Issue:** timmy-config #492
|
|
**Date:** 2026-04-13
|
|
**Label:** gemma-4-multimodal
|
|
**Scope:** forge.alexanderwhitestone.com (Gitea 1.25.4)
|
|
|
|
## Executive Summary
|
|
|
|
The Foundation's primary accessible web property is the Gitea forge. The Matrix homeserver (matrix.timmy.foundation) is currently unreachable (DNS/SSL issues). This audit covers the forge across three page types: Homepage, Login, and Explore/Repositories.
|
|
|
|
**Overall: 6 WCAG 2.1 AA violations found, 4 best-practice recommendations.**
|
|
|
|
---
|
|
|
|
## Pages Audited
|
|
|
|
| Page | URL | Status |
|
|
|------|-----|--------|
|
|
| Homepage | forge.alexanderwhitestone.com | Live |
|
|
| Sign In | forge.alexanderwhitestone.com/user/login | Live |
|
|
| Explore Repos | forge.alexanderwhitestone.com/explore/repos | Live |
|
|
| Matrix/Element | matrix.timmy.foundation | DOWN (DNS/SSL) |
|
|
|
|
---
|
|
|
|
## Findings
|
|
|
|
### P1 — Violations (WCAG 2.1 AA)
|
|
|
|
#### V1: No Skip Navigation Link (2.4.1)
|
|
- **Pages:** All
|
|
- **Severity:** Medium
|
|
- **Description:** No "Skip to content" link exists. Keyboard users must tab through the full navigation on every page load.
|
|
- **Evidence:** Programmatic check returned `skipNav: false`
|
|
- **Fix:** Add `<a href="#main" class="skip-link">Skip to content</a>` visually hidden until focused.
|
|
|
|
#### V2: 25 Form Inputs Without Labels (1.3.1, 3.3.2)
|
|
- **Pages:** Explore/Repositories (filter dropdowns)
|
|
- **Severity:** High
|
|
- **Description:** The search input and all radio buttons in the Filter/Sort dropdowns lack programmatic label associations.
|
|
- **Evidence:** Programmatic check found 25 inputs without `label[for=]`, `aria-label`, or `aria-labelledby`
|
|
- **Affected inputs:** `q` (search), `archived` (x2), `fork` (x2), `mirror` (x2), `template` (x2), `private` (x2), `sort` (x12), `clear-filter` (x1)
|
|
- **Fix:** Add `aria-label="Search repositories"` to search input. Add `aria-label` to each radio button group and individual options.
|
|
|
|
#### V3: Low-Contrast Footer Text (1.4.3)
|
|
- **Pages:** All
|
|
- **Severity:** Medium
|
|
- **Description:** Footer text (version, page render time) appears light gray on white, likely failing the 4.5:1 contrast ratio.
|
|
- **Evidence:** 30 elements flagged as potential low-contrast suspects.
|
|
- **Fix:** Darken footer text to at least `#767676` on white (4.54:1 ratio).
|
|
|
|
#### V4: Green Link Color Fails Contrast (1.4.3)
|
|
- **Pages:** Homepage
|
|
- **Severity:** Medium
|
|
- **Description:** Inline links use medium-green (~#609926) on white. This shade typically fails 4.5:1 for normal body text.
|
|
- **Evidence:** Visual analysis identified green links ("run the binary", "Docker", "contributing") as potentially failing.
|
|
- **Fix:** Darken link color to at least `#507020` or add an underline for non-color differentiation (SC 1.4.1).
|
|
|
|
#### V5: Missing Header/Banner Landmark (1.3.1)
|
|
- **Pages:** All
|
|
- **Severity:** Low
|
|
- **Description:** No `<header>` or `role="banner"` element found. The navigation bar is a `<nav>` but not wrapped in a banner landmark.
|
|
- **Evidence:** `landmarks.banner: 0`
|
|
- **Fix:** Wrap the top navigation in `<header>` or add `role="banner"`.
|
|
|
|
#### V6: Heading Hierarchy Issue (1.3.1)
|
|
- **Pages:** Login
|
|
- **Severity:** Low
|
|
- **Description:** The Sign In heading is `<h4>` rather than `<h1>`, breaking the heading hierarchy. The page has no `<h1>`.
|
|
- **Evidence:** Accessibility tree shows `heading "Sign In" [level=4]`
|
|
- **Fix:** Use `<h1>` for "Sign In" on the login page.
|
|
|
|
---
|
|
|
|
### P2 — Best Practice Recommendations
|
|
|
|
#### R1: Add Password Visibility Toggle
|
|
- **Page:** Login
|
|
- **Description:** No show/hide toggle on the password field. This helps users with cognitive or motor impairments verify input.
|
|
|
|
#### R2: Add `aria-required` to Required Fields
|
|
- **Page:** Login
|
|
- **Evidence:** `inputsWithAriaRequired: 0` (no inputs marked as required)
|
|
- **Description:** The username field shows a red asterisk but has no `required` or `aria-required="true"` attribute.
|
|
|
|
#### R3: Improve Star/Fork Link Labels
|
|
- **Page:** Explore Repos
|
|
- **Description:** Star and fork counts are bare numbers (e.g., "0", "2"). Screen readers announce these without context.
|
|
- **Fix:** Add `aria-label="2 stars"` / `aria-label="0 forks"` to count links.
|
|
|
|
#### R4: Use `<time>` Elements for Timestamps
|
|
- **Page:** Explore Repos
|
|
- **Description:** Relative timestamps ("2 minutes ago") are human-readable but lack machine-readable fallbacks.
|
|
- **Fix:** Wrap in `<time datetime="2026-04-13T17:00:00Z">2 minutes ago</time>`.
|
|
|
|
---
|
|
|
|
## What's Working Well
|
|
|
|
- **Color contrast (primary):** Black text on white backgrounds — excellent 21:1 ratio.
|
|
- **Heading structure (homepage):** Clean h1 > h2 > h3 hierarchy.
|
|
- **Landmark regions:** `<main>` and `<nav>` landmarks present.
|
|
- **Language attribute:** `lang="en-US"` set on `<html>`.
|
|
- **Link text:** Descriptive — no "click here" or "read more" patterns found.
|
|
- **Form layout:** Login form uses clean single-column with good spacing.
|
|
- **Submit button:** Full-width, good contrast, large touch target.
|
|
- **Navigation:** Simple, consistent across pages.
|
|
|
|
---
|
|
|
|
## Out of Scope
|
|
|
|
- **matrix.timmy.foundation:** Unreachable (DNS resolution failure / SSL cert mismatch). Should be re-audited when operational.
|
|
- **Evennia web client (localhost:4001):** Local-only, not publicly accessible.
|
|
- **WCAG AAA criteria:** This audit covers AA only.
|
|
|
|
---
|
|
|
|
## Remediation Priority
|
|
|
|
| Priority | Issue | Effort |
|
|
|----------|-------|--------|
|
|
| P1 | V2: 25 unlabeled inputs | Medium |
|
|
| P1 | V1: Skip nav link | Small |
|
|
| P1 | V4: Green link contrast | Small |
|
|
| P1 | V3: Footer text contrast | Small |
|
|
| P2 | V6: Heading hierarchy | Small |
|
|
| P2 | V5: Banner landmark | Small |
|
|
| P2 | R1-R4: Best practices | Small |
|
|
|
|
---
|
|
|
|
## Automated Check Results
|
|
|
|
```
|
|
skipNav: false
|
|
headings: h1(3), h4(1)
|
|
imgsNoAlt: 0 / 1
|
|
inputsNoLabel: 25
|
|
genericLinks: 0
|
|
lowContrastSuspects: 30
|
|
inputsWithAriaRequired: 0
|
|
landmarks: main=1, nav=2, banner=0, contentinfo=2
|
|
hasLang: true (en-US)
|
|
```
|
|
|
|
---
|
|
|
|
*Generated via visual + programmatic analysis of forge.alexanderwhitestone.com*
|