Web Interface Guidelines & WCAG 2.2 AA · 2026-05-13T16:51:54Z · 0 critical · 1 warning · 2 info · 28 passed
Mchael Poncardas (m@poncardas.com)
| Metric | Initial | Post-fix #1 | This audit | Total Δ |
|---|---|---|---|---|
| Critical | 7 | 0 | 0 | −7 |
| Warnings | 12 | 2 | 1 | −11 |
| Info | 9 | 2 | 2 | −7 |
| Passed | 15 | 27 | 28 | +13 |
<input type="file"> via
onClick={() => inputRef.current?.click()} with
aria-controls="file-upload-input" now present. While
this improves programmatic association, the hidden-input proxy
pattern remains second-class for some assistive technologies. The
file input is sr-only (positioned off-screen) and
some AT may not follow the click-through to open the native file
dialog. ::file-selector-button pseudo-element as a more
natively accessible alternative. This is the only remaining
warning in the entire form.
nuqs.
<a href="#form-content"> with
sr-only/focus-visible styling. ✓
role="status" aria-live="polite" aria-atomic="true". ✓
role="alert" aria-live="assertive". ✓
role="alert" aria-live="assertive". ✓
role="alert" aria-live="assertive". ✓
aria-hidden="true" where
decorative. ✓
<button>; links use
<a>. No <div onClick>. ✓
htmlFor/id linking. ✓
aria-labelledby on fieldsets. ✓
focus-visible:ring styles. ✓
focus-visible:outline-none focus-visible:ring-2
focus-visible:ring-ring/50 rounded-sm. ✓
focus-visible:ring-2 focus-visible:ring-ring/50
focus-visible:outline-none. ✓
name + autoComplete="off".
✓
aria-label={t("date_step.aria_pick_date")}. ✓
aria-describedby="date-step-hint". ✓
t("file_upload.error_type"),
t("file_upload.error_size"),
t("file_upload.error_generic") with en/fi/sv
translations. ✓
t("text_step.placeholder_optional"). ✓
t("file_upload.hint"). ✓
… U+2026). ✓
@media (prefers-reduced-motion: reduce) resets all
animation/transition durations. ✓
transition-[width]. badge.tsx:
transition-colors. Form step cards:
transition-colors. ✓
for attribute. ✓
overscroll-contain on content. ✓
Intl.NumberFormat(locale) with
non-breaking spaces. ✓
Intl.DateTimeFormat(locale, { dateStyle: "long" }). ✓
lang attribute
on <html>
<html lang={locale}>. ✓
color-scheme: light. ✓
other: { "theme-color": "#fcfaf9" }. ✓
aria-busy="true" +
aria-live="polite" + sr-only text. ✓
<nav aria-label="Form progress"> + sr-only live
region. ✓
.focus() on step
change. ✓
onPaste + preventDefault found anywhere. ✓
aria-label. ✓