Accessibility

Fareband aims to meet WCAG 2.2 Level AA. This page states what that means here in concrete terms, what is checked automatically on every build, what is not done yet, and how to tell us when something is in your way.

Last reviewed 30 August 2026

What is in place

Each commitment, and how it is kept honest.
CommitmentHow it is enforced
Keyboard access to everything No control is mouse-only. The menu, the FAQ and the subscribe form all work from the keyboard alone, and the drawer traps and restores focus.
Visible focus, never removed A two-pixel focus ring in Signal Teal with an offset, defined once in the global stylesheet and never overridden per component.
Colour is never the only signal The amber used for a fare below the tenth percentile always sits next to a written figure and a text label. A build test fails if amber is used decoratively.
One h1, no skipped heading levels Checked on every page of the built site by scripts/check-meta.mjs, which fails the build rather than warning.
Charts are not the only copy of the data Every price band has a real HTML table underneath it with the same figures, selectable and readable by a screen reader. Nothing important lives only inside an SVG.
Data graphics carry a prose label Each band exposes a complete sentence as its accessible name, because a screen reader cannot narrate a shape.
Reduced motion is respected properly Under prefers-reduced-motion every animation and transition is cut to one millisecond and runs once, so content lands in its final state at once instead of fading. Nothing on the site is revealed by animation alone.
Tables are navigable Every data table has a caption and scoped headers, and wide tables scroll inside their own container so the page itself never scrolls sideways.
Text scales to 200% Type is set in relative units against a fluid scale, and layouts reflow rather than clipping.
Touch targets are at least 44 by 44 pixels Applied to the menu control, form fields and every call to action.
Errors say what happened and what to do Form errors are announced in a live region and tied to the field with aria-describedby, never signalled by a red border alone.
The site works without JavaScript Prices, bands, tables, FAQs and navigation all render server-side. Script adds convenience, never content.

Contrast

Correction, 30 August 2026. An earlier version of this page stated contrast figures that had not been measured, and two of them were wrong. At the same time a structural grey was being used for small print at 2.26:1, which is well below any threshold and was genuinely hard to read. Both are fixed, the figures below are computed, and the build now fails if any of them regresses.

Measured, not asserted. Computed by scripts/check-contrast.mjs on every build, which resolves the token layer and fails if a pair drops below its threshold.
PairRatioNeeds
Body text on the page14.88:14.5
Body text on a card13.69:14.5
Secondary text on the page5.11:14.5
Secondary text on a card4.70:14.5
Links as text4.94:14.5
Links on a card4.55:14.5
Reversed text on a dark button14.88:14.5
Success, warning and error labels4.55–6.00:14.5
Focus ring and borders (not text)3.78:13.0

Signal Teal in its pure form measures 3.78:1 on the page background. That is enough for a focus ring, a border or large text, and not enough for a link in running text, so links use a darkened variant of it. The distinction is enforced by the build rather than left to whoever writes the next component.

Beacon Amber measures 1.98:1 and never carries text. It marks a fare at or below the tenth percentile, and that fare is always written out beside it in the main text colour.

What is not done yet

Telling us about a barrier

If something on this site stops you doing what you came to do, write to hello@fareband.com and say which page and what happened. We answer within five working days and will tell you either when it is fixed or why it is not straightforward.

If you need a figure from this site in another format, ask and we will send it. The data is ours, so there is nothing stopping us.