- Shipped
- August 19, 2026 at 6:08 PM UTC
- Author
- Kamo
- Commit
- 59bbac0
Three separate defects, all of them invisible to the build, the type check, the lint run and both existing guards. UNNAMED CONTROLS — the phone layout's navigation toggle is a bare icon, lucide marks its own <svg aria-hidden>, and the button carried no label, so a screen reader announced "button" and nothing else. It is in the shared chrome, so that is every one of the 163 routes in the sitemap. Same shape on the calculator's home link, the two language selectors, the toast dismiss, and the demo's submit button, which swaps its label for a spinner at exactly the moment a reader is most likely to ask what it is doing. The menu and language buttons also now report aria-expanded, and the menu owns the panel it opens via aria-controls. The toast additionally had no live region. It arrives and leaves without focus ever moving, so its message — sometimes the only feedback an action gives — was never announced at all. role=alert for the two types that report a failure, role=status for the rest. MISSING COPY — next-intl does not fall back when a key is absent from English: it logs MISSING_MESSAGE and RENDERS THE KEY PATH. The home page's two "Explore all" CTAs were buttons reading `home.ucExploreAll` and `home.featuresExploreAll` in the served HTML, and the alternatives hub's primary CTA read `alternativesHub.startFree`. The strings are now in kamo-translation-dictionary, and scripts/check-i18n-keys.mjs (prebuild, alongside the navigation guard, same shape as kamo-internal's) resolves all 1028 statically-checkable keys against English so the next gap fails the build instead of shipping as furniture. CONTRAST — secondary copy on this site is set at 11-13px, which WCAG treats as normal text needing 4.5:1, and the bottom of the grey ramp was nowhere near it: #666 at 2.98, #6a6a6a at 3.17, #707070 at 3.46, #6b7280 at 3.54, #808080 at 4.34 — captions, timestamps, table labels, fine print, placeholders. Two colours failed only on a tinted surface, which is why they were easy to miss: #8c8c8c is 5.09 on the canvas but 4.47 on the changelog's chip, and the security page's architecture ramp STARTED in the brand green at 3.76 on its own tint — the same mistake 4bf89a5 fixed in the section headings. The comparison matrix's "no" red was 2.98, under even the 3:1 floor for a graphic. The replacements are three documented tokens in globals.css, each measured against both surfaces text lands on — the canvas #0f1f14 and the lightest card the site paints, #1b2a20 — so the next tweak is one edit rather than 69. There is deliberately no step below --color-text-dim. Measured on the built HTML of all 181 prerendered pages: 0 elements below AA, 0 interactive elements without an accessible name, 0 raw key paths. Before: 10 distinct failing colour pairs, 164 unnamed controls, 3 raw keys. Also: the console greeting still named CockroachDB, which was retired from the platform on 2026-08-12.