feat(web): a11y wiring - label association, machine-readable time, links #473
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/BUNYIP-466-a11y-wiring"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Implements the BUNYIP-466 slice of the 2026-08-04 bunyip UI audit: three a11y-wiring findings (F22, F23, F4).
F22: associate form labels with their inputs
Admin and settings forms rendered
<label>and<input>as siblings with nofor/id, so screen readers could not tie them together. Every hand-written label+control pair now carriesfor/idusing the input'snameas the id (matching the existing auth-helper pattern): 87 pairs across onboarding, dashboard settings, and the admin config/list pages.Same-page id collisions are disambiguated with a form-scoped prefix while the submitted
namestays unchanged, so form semantics are untouched: the settings page renders four forms together, socurrent_password/totp_code/passwordbecomeemail-/password-/disable-2fa-/delete-account-prefixed ids, and the rate-limits per-action rows suffix the id with the action key. Controls that were already associated (the auth helpers, the contact form, and the docs-editor labels that wrap their input) are left untouched; the one genuinely label-less control (the application_groups group_id select, associated by its card title) is noted for a later pass.F23: machine-readable timestamps, one humanizer
Two relative-time humanizers existed (
util::relative_timeand a localtime_agoin the dashboard).time_agois deleted and its callers routed throughrelative_time, leaving one humanizer. A newutil::rel_time(iso) -> Markupwraps the relative string in<time datetime=(iso) title=(absolute)>so the value is machine-readable and carries an absolute-time tooltip; the absolute formatter (abs_time) moved into util alongside it. 17 render sites across users, feedback, entitlements, audit, error-log, ip-bans, rate-limits, the admin dashboard, and the settings sessions/devices lists now use it. Every site had a reachable raw ISO timestamp.F4: two nav links read as links
The "Back to users" (entitlements) and "Documentation" (docs footer) links were styled as body text; both now carry
text-primary hover:underlinelike every other content link.Verification
just check-container(dockerized fmt + clippy + workspace tests) green.#BUNYIP-466