Skip to content

Contrast fixes found by axe on bubaly.com: every blog post, and white-on-danger text - #590

Merged
NewWorldVenture merged 1 commit into
mainfrom
claude/bubaly-repo-connect-etzqg7
Sep 27, 2026
Merged

NewWorldVenture merged 1 commit into
mainfrom
claude/bubaly-repo-connect-etzqg7

Conversation

@NewWorldVenture

Copy link
Copy Markdown
Owner

Part of the live page audit of www.bubaly.com (after #588 and #589). An axe pass, WCAG 2.2 AA, serious and critical findings only, turned up two defects.

Every blog post (1,049 pages)

The dark article header and footer used text-white/40 (and text-white/30 for the photo credit) on #03090f. That measures 3.73:1 and 2.57:1; small text needs 4.5:1. Affected elements: the breadcrumb, "Written by", SHARE, the previous/next post dates, and related-post details.

All of it now uses text-white/60, about 7:1.

White text on a solid danger fill (dark theme)

White on #f57171 is 2.80:1. Affected: the Button danger variant (axe hit it on /auth/signout/complete), every unread-count badge, and the tel:911 link.

A new --danger-fg token fixes it:

  • white in light mode (4.84:1);
  • the dark page colour in dark mode (7.1:1).

All 13 text sites now use it. The remaining solid bg-danger uses are bars and charts with no text.

Guard

tests/brand-contrast-contract.test.ts now measures --danger-fg on --danger in both themes, and refuses text-white on a solid bg-danger. Both reverts fail it: text-white put back on the button, and the dark --danger-fg set to white.

Auditor

scripts/audit-live-pages.mjs --axe runs the same WCAG tags as tests/e2e/accessibility.spec.ts.

Checks

  • tsc clean; lint 15/15.
  • Contract and blog tests: 35/35.

🤖 Generated with Claude Code

https://claude.ai/code/session_01TRY21ZKsFrfB3qtoP972A4


Generated by Claude Code

… on danger

An axe run (WCAG 2.2 AA; serious and critical findings only) over the
public pages of www.bubaly.com found two defects.

Every blog post, 1,049 pages: the dark article chrome used text-white/40,
and text-white/30 for the photo credit, on #03090f. That is 3.73:1 and
2.57:1; small text needs 4.5:1. Affected: breadcrumb, "Written by",
SHARE, prev/next dates, related-post meta. All now use text-white/60,
about 7:1. The decorative chevron is aria-hidden and is left as it was.

White text on a solid danger fill, in the dark theme: #fff on #f57171 is
2.80:1. This covered the Button danger variant (/auth/signout/complete
is where axe met it), every unread-count badge, and the tel:911 link. A
new --danger-fg token is white in light mode (4.84:1) and the dark
ground colour in dark mode (7.1:1). All 13 text sites use it. The other
solid bg-danger uses are bars and charts with no text.

brand-contrast-contract now measures --danger-fg on --danger in both
themes, and refuses text-white on a solid bg-danger. Both mutations
(text-white put back on the button, dark --danger-fg set to white) fail
it.

scripts/audit-live-pages.mjs gains --axe, with the same WCAG tags as
tests/e2e/accessibility.spec.ts.

tsc clean; lint 15/15; contract and blog tests 35/35.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRY21ZKsFrfB3qtoP972A4
@vercel

vercel Bot commented Sep 27, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
bubaly Ignored Ignored Sep 27, 2026 12:39pm UTC

Request Review

@NewWorldVenture
NewWorldVenture merged commit a30e6b3 into main Sep 27, 2026
7 checks passed
NewWorldVenture pushed a commit that referenced this pull request Sep 27, 2026
A crawl of every route on www.bubaly.com (398 routes, phone and desktop,
axe WCAG 2.1 AA, every internal link) found these on the public pages:

- 67 pages hard-coded a brand suffix ("Send a gift · Bubaly", "Smart
  Kitchen | Bubaly") that the root template then added again, so the tab
  read "… · Bubaly · Bubaly". The suffixes are gone; "Switch to Bubaly"
  and "My Bubaly" opt out of the template. A guard scans every page.
- The social-proof row, the pricing matrix and the display comparison
  scroll sideways on a phone but could not be reached by keyboard (axe
  scrollable-region-focusable). Each is now a named, focusable region.
- /resources/benchmarks, unpublished, is a 404 by design but kept its
  "Household Benchmarks" title; the metadata now asks the same flag.
- /gift/<dead token> drew the live page's header over the "no longer
  active" note; it now answers like /pay/[handle].
- The last-resort error page had no <title>.

(The white-on-danger contrast failure the same crawl found is fixed on
main by #590, from a parallel session, and is not repeated here.)

All 433 internal links resolve. Each behaviour test is red with its fix
reverted (benchmarks 2 of 4, gift 2 of 3).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
NewWorldVenture pushed a commit that referenced this pull request Sep 27, 2026
Lane A (public, auth and marketing pages) re-crawled on production at
e14b12e, phone and desktop, with axe: all 44 rows move to CLEAN, and
the lane is released.

A signed-in 1280 px axe run found three things the phone sweep could
not see, fixed here:
- the family display's list tiles scroll inside a fixed-height cell
  with no keyboard stop: each scrolling tile is now a named, focusable
  region, and the lists inside a tile no longer scroll on their own
  (one scroller per tile, the reachable one);
- /dashboard/calm and the wallet child view each had an empty-state
  link told from its sentence by colour alone: now underlined.

Guard cases in tests/a-signed-in-control-has-a-name.test.ts fail with
the fixes reverted. finalaudit.md gains Q74 (the #548 release and the
#588-#590 live-page fixes) and the findings rows. The live-page auditor
gains --paths and --cookies for targeted and signed-in runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRY21ZKsFrfB3qtoP972A4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants