About this atlas
How “live” the weather really is
Open-Meteo is a plain REST API with no push channel, and the readings it returns carry a 15-minute interval. So nothing here is a firehose: a server-side poller asks for all twelve regions in a single request every 60 seconds, and publishes only the readings that actually changed. Claiming per-second weather would be a lie told with animation.
The browser receives those changes over Server-Sent Events. SSE is the right fit because the traffic is one-directional and it reconnects by itself, sending a Last-Event-ID header that the server treats as a resume offset, so a dropped connection does not drop observations.
Why the split-flap board is hidden from screen readers
A split-flap board reaches its destination by cycling every character through a drum. Rendered naively, a screen reader would announce each intermediate frame, turning “Leeds” into several hundred utterances of alphabet soup.
So the flipping glyphs sit inside aria-hidden, and the real values are announced from a single polite live region once the rows have settled. They are batched into one sentence, because twelve regions updating at once would otherwise mean twelve interruptions. If you have asked your system to reduce motion, the flaps do not cycle at all: values change straight to their target.
The board also has a genuine pause control. Automatically updating content needs one (WCAG 2.1 success criterion 2.2.2), and pausing closes the stream rather than merely hiding it.
Colour
The sheet is printed in brass and deep red on midnight teal. Every colour that carries text was measured against both page surfaces before it went in: nothing textual sits below 4.5:1, and most is above 7:1. Body copy is 14.3:1, secondary copy 8.8:1, and the brass used for section labels 8.4:1.
Borders are the part people usually get wrong on a dark theme. A hairline written as 40% of a pale colour composites down to roughly 2:1 and quietly fails the 3:1 that non-text contrast requires (success criterion 1.4.11), so the rules here are solid tokens measured at full opacity instead. The contour lines and the map's land fill are the deliberate exceptions: both are low-contrast texture inside aria-hidden nodes, and no information is encoded in either. The coastline is drawn in brass at 7.1:1 against the water, and every region on the plot is also a text entry in the list below it.
The herringbone is the one texture that sits behind live text, so it is checked rather than exempted. A single thread of the weave is the lightest surface anything on this site can land on, and body copy still reads 8:1 against it. All of this runs as a script over the stylesheet: npm run check:contrast parses the tokens out of the CSS, composites every alpha, and exits non-zero if a single pairing slips. Contrast claims rot otherwise.
Regions
The twelve regions are the ONS ITL 1 statistical regions, so the geography is defensible rather than improvised. The map itself is stylised and not to scale, which is exactly why every region is also listed as plain text beneath it.