Some checks failed
Architecture Lint / Linter Tests (pull_request) Successful in 11s
Smoke Test / smoke (pull_request) Failing after 16s
Validate Config / YAML Lint (pull_request) Failing after 14s
Validate Config / JSON Validate (pull_request) Successful in 15s
Validate Config / Python Syntax & Import Check (pull_request) Failing after 49s
Validate Config / Python Test Suite (pull_request) Has been skipped
Validate Config / Cron Syntax Check (pull_request) Successful in 10s
Validate Config / Shell Script Lint (pull_request) Failing after 51s
Validate Config / Deploy Script Dry Run (pull_request) Successful in 10s
Validate Config / Playbook Schema Validation (pull_request) Successful in 20s
Architecture Lint / Lint Repository (pull_request) Failing after 17s
PR Checklist / pr-checklist (pull_request) Successful in 4m8s
Implements V1 skip navigation fix by: - Adding .skip-link CSS to a11y-fixes.css (visually hidden until focus) - Updating header_banner.tmpl to emit skip link as first element - Updating README with V1 entry and description Fixes #545
77 lines
2.7 KiB
Markdown
77 lines
2.7 KiB
Markdown
# Gitea Accessibility Fixes
|
|
|
|
Custom template overrides for WCAG 2.1 AA compliance on the Timmy Foundation Forge.
|
|
|
|
Applied fixes identified by the accessibility audit (#492):
|
|
|
|
| Fix | Issue | WCAG | Description |
|
|
|-----|-------|------|-------------|
|
|
| V1 | #545 | 2.4.1 | Skip navigation link — `<a href="#main" class="skip-link">Skip to content</a>` added to header, visually hidden until focus |
|
|
| R1 | #551 | Best Practice | Password visibility toggle (eye icon) on sign-in page |
|
|
| R2 | #552 | 3.3.1 | `aria-required="true"` on required form fields |
|
|
| R3 | #553 | 4.1.2 | `aria-label` on star/fork count links ("2 stars", "0 forks") |
|
|
| R4 | #554 | 1.3.1 | `<time datetime="...">` elements for relative timestamps |
|
|
|
|
## Structure
|
|
|
|
```
|
|
deploy/gitea-a11y/
|
|
├── deploy-gitea-a11y.sh # Deployment script
|
|
├── README.md
|
|
└── custom/
|
|
├── public/
|
|
│ ├── css/
|
|
│ └── js/
|
|
└── templates/
|
|
├── custom/
|
|
│ └── time_relative.tmpl # R4: <time> helper
|
|
├── repo/
|
|
│ └── list_a11y.tmpl # R3: aria-label on counts
|
|
└── user/auth/
|
|
└── signin_inner.tmpl # R1+R2: password toggle + aria-required
|
|
```
|
|
|
|
## Deploy
|
|
|
|
```bash
|
|
bash deploy/gitea-a11y/deploy-gitea-a11y.sh
|
|
# or to a specific host:
|
|
bash deploy/gitea-a11y/deploy-gitea-a11y.sh root@my-gitea-host.com
|
|
```
|
|
|
|
## Template Overrides
|
|
|
|
Gitea supports custom template overrides by placing files in `custom/templates/`.
|
|
The templates here override the default Gitea templates with a11y improvements.
|
|
|
|
### V1: Skip Navigation Link
|
|
|
|
Adds a skip navigation link as the first focusable element in the header,
|
|
allowing keyboard users to bypass the navigation and jump directly to the main
|
|
content. The link is visually hidden by default and becomes visible on focus.
|
|
|
|
- Meets WCAG 2.4.1 (Bypass Blocks)
|
|
- Uses `<a href="#main" class="skip-link">Skip to content</a>`
|
|
- Styled via `.skip-link` CSS rules (hidden off-screen, brought into view on `:focus`)
|
|
- Implemented in `custom/header_banner.tmpl` alongside the banner landmark
|
|
|
|
### R1: Password Visibility Toggle
|
|
|
|
Adds an eye icon (👁) button next to the password field that toggles between
|
|
`type="password"` and `type="text"`. Updates `aria-label` dynamically.
|
|
|
|
### R2: aria-required
|
|
|
|
Adds `aria-required="true"` to the username and password inputs, which
|
|
properly communicates required state to screen readers.
|
|
|
|
### R3: Star/Fork aria-label
|
|
|
|
Wraps star and fork count links with `aria-label="2 stars"` so screen
|
|
readers announce the meaning, not just the number.
|
|
|
|
### R4: `<time>` Elements
|
|
|
|
Wraps relative timestamps ("2 minutes ago") in `<time datetime="2026-04-13T17:00:00Z">`
|
|
providing both human-readable text and machine-readable ISO 8601 dates.
|