Accessibility Statement
Last Updated: August 23, 2026
1. My commitment
I want this site to be usable by everyone, including people who browse with a keyboard, a screen reader, magnification, or a reduced-motion or high-contrast setting. Accessibility is treated here as part of the build, not as a pass at the end: several of the measures below are enforced by automated tests that fail the build if they regress.
2. Conformance status
This site aims to conform to the Web Content Accessibility Guidelines (WCAG) 2.2 at Level AA. I believe it is substantially conformant, meaning it meets the Level AA success criteria to the best of my knowledge and testing.
I am deliberately not claiming full conformance. No independent third-party accessibility audit has been carried out, and no formal WCAG-EM evaluation report exists for this site. That is a limit on the evidence behind the claim, not a known failure — where I find a failure, it is listed in section 5.
3. What is in place
Keyboard and focus
- A skip link is the first focusable element on every page that carries the site navigation, and it moves focus to the main content rather than only scrolling to it.
- Every interactive element shows a visible focus indicator. The rule that draws it cannot be switched off by a utility class, which is enforced by a test.
- The mobile menu is a focus trap: focus moves into it on open, cycles inside it with Tab, closes on Escape, and returns to the button that opened it.
- No element takes a positive
tabindex, so the tab order follows the page.
Structure and screen readers
-
Exactly one
mainlandmark per page and — wherever the site header and footer are present — onebannerand onecontentinfo, plus named navigation landmarks. -
Exactly one
h1per page, with headings nested in order beneath it and no skipped levels. - Every image carries alternative text, and decorative graphics are hidden from assistive technology rather than given filler descriptions.
- Where an icon carries the meaning of a control, the control has a text name — the visible label always opens that name, so speech input can address it by what it says.
- The page language is declared, and every page has a unique, descriptive title.
Colour, contrast and type
- Text and interface colours are derived at build time and checked against their own backgrounds: body text is held to at least 4.5:1, primary text to 7:1, and any solid button fill is darkened until its label clears 4.5:1.
- No text on the site renders below 12px. This is a floor, enforced by a test.
-
Colour is never the only way information is conveyed: selected states also carry a label, a
shape or an
aria-currentvalue. - Both a light and a dark theme are available. The site opens in dark rather than reading your system setting, and remembers whichever you pick with the toggle in the header.
Motion, zoom and pointer
- Reduced motion is respected. If your system asks for it, entrance animations, scroll reveals and view transitions are suppressed.
- Increased contrast and Windows High Contrast Mode are handled: gradient text falls back to a solid colour, and states shown only by fill gain a system-coloured border.
- Zoom is not blocked. The page can be magnified to 500%, and at the 320px width that WCAG 1.4.10 Reflow specifies it lays out as a single column with no horizontal scrolling. Every width between 320px and 1920px is checked, not only the named breakpoints.
- Interactive controls present a target of at least 44 × 44 px, which exceeds the 24 × 24 px WCAG 2.2 minimum. Where a control is drawn smaller than that, its clickable area is enlarged behind it rather than left small. The one exception is a link inside a sentence, which takes the WCAG 2.5.8 inline exemption — forcing a fixed height there would break the line spacing of the paragraph around it.
Forms
-
Every field has a programmatically associated name. Where a form has more than one field — the
contact form, and the cookie preferences panel — that name is a visible
<label>. The single-field controls (newsletter sign-up, listing search, the comment box, the email sign-in prompt) take their name from anaria-labelinstead, with the heading, icon or button beside them carrying the same meaning on screen. - Errors are described in text next to the field they belong to, not by colour alone, and are linked to it so a screen reader announces the message when the field takes focus.
- Submitting a form with an invalid field moves focus to that field, so the problem finds you rather than the other way round.
- Text fields render at 16px on touch devices, so focusing one does not force an iOS zoom you cannot undo.
4. How this was assessed
By self-evaluation, using a combination of automated and manual checks:
- Automated tests in the project's own test suite, which fail the build on regressions to focus indicators, minimum text size, target size, landmark structure, image alternative text and heading order.
- Contrast measured from rendered pixels, compositing translucent layers rather than reading declared colours.
- A viewport sweep from 320px to 1920px checking for horizontal overflow, overlapping elements and clipped text at every step in between, not only at the named breakpoints.
- Manual keyboard walkthroughs, and cross-engine checks in Chromium, Firefox and WebKit.
5. Known limitations
- No independent audit. Everything above is self-assessed. An audit by someone other than the author would be a stronger basis for the conformance claim in section 2.
- Limited assistive-technology testing. Structure and behaviour are verified against the accessibility tree and by keyboard, but the site has not been tested end to end with every major screen reader.
- Third-party content. Scheduling is handled by an external booking service on its own domain. I do not control its accessibility. If it is a barrier for you, use any of the contact routes in section 6 instead — a call can always be arranged by email.
- Embedded media. No video is published on this site today. The introduction video the About page marks as coming is not yet recorded; when it is, WCAG 1.2.2 and 1.2.3 require captions and a transcript for the conformance level claimed above.
6. Feedback and how to reach me
If you hit a barrier on this site, please tell me — it is the fastest way for it to get fixed, and reports are welcome even if you are not sure the problem is on my side.
- Email contact@mhsaeed.com — put "Accessibility" in the subject line if you would like it prioritised.
- Or use the contact form.
I respond within 24 hours, the same commitment the contact page makes. Please describe the page, what you were trying to do, and the browser or assistive technology you were using, if you are comfortable sharing that — it makes the problem much faster to reproduce.