Accessibility
Built to WCAG 2.2 AA, and measured rather than assumed.
Every colour pair on this site was contrast-tested against the tokens in the stylesheet, not against the values somebody meant to use.
What was actually done
- Every text and boundary colour pair measured by a checker that parses the tokens out of the stylesheet, so a colour that changed cannot pass on the strength of an old value.
- A skip link first in the tab order, one
h1per page, heading levels that do not skip, and landmark regions throughout. - Visible focus rings defined once and never removed, with a separate colour on dark bands.
aria-current="page"on the active navigation item, and Escape closes the mobile menu.- Every form field has a real label, and the submit result is announced in a
role="status"region. - Headings that animate are split by word, never by character — per-character splitting makes a screen reader read a heading letter by letter.
- Decorative imagery carries empty
alt; meaningful imagery is described.
Motion
The scroll work on this site is substantial, so it is all switched off byprefers-reduced-motion. With that setting on, the hero renders as a still composition, the horizontal gallery becomes a normal wrapped grid, the smooth-scrolling is disabled and every reveal animation is skipped with the content left fully visible. Nothing is hidden behind an animation that reduced motion prevents from running.
Inertial scrolling is also off entirely on touch devices, where the operating system’s own scroller is better than anything a website should override.
Without JavaScript
Every page renders completely with JavaScript disabled. The reveal animations resolve to their finished state rather than leaving content invisible, and the hero collapses to a single still screen instead of three screens of dead scroll.
What is deliberately not claimed
Nothing on this site makes a claim about physical access to a building, because Casement Cleaning Co. has no premises and does not exist. On a real client build, access claims get described only from what a photograph actually shows, and anything uncertain points the visitor at the phone instead. Somebody can travel a long way on the strength of an accessibility promise, and a promise nobody verified is worse than no promise.
Something not working?
This is a demonstration site, so there is no support line behind it. If you found an accessibility problem here, it is a bug in our work and we would genuinely like to know — SearchSpruce Studio.