Skip to content

Design pass: contrast gate, honest states, no-JS content, one mark - #6

Open
devdattatalele wants to merge 1 commit into
mainfrom
claude/dazzling-pasteur-3wl3vz
Open

devdattatalele wants to merge 1 commit into
mainfrom
claude/dazzling-pasteur-3wl3vz

Conversation

@devdattatalele

Copy link
Copy Markdown
Contributor

Summary

Applies the lessons from a design teardown to the site, the playground and the console. The biggest fix is contrast: muted text, orange text and the primary button text all failed WCAG AA. A new CI script now enforces it.

Type of change

  • Bug fix (non-breaking)
  • New feature (non-breaking)
  • Breaking change (docs + contract test updated)
  • Docs only
  • Chore (deps, CI, refactor)

Linked issues

None.

Testing

  • pytest -q green locally (206 passed, 4 skipped)
  • ruff check on the CI scope plus scripts/check_contrast.py reports no errors
  • Manual smoke: bash site/e2e/run.sh and bash console/e2e/run.sh both pass, with new checks for no-JS content, reduced motion, PNG OG assets, the stream status light, "—" for unknowns, and no horizontal scroll at 375px on every site page and console tab

Contract impact

  • No wire-format change

Docs impact

  • Changelog entry added (CHANGELOG.md)
  • New design/README.md writes down the colour, radius, type and behaviour rules.

What changed

  • Tokens. Every text colour passes 4.5:1 on its backgrounds. --accent-text (#b8401a) is the orange for text; the bright --accent is for shapes only. One radius multiplier and an 11px type floor. scripts/check_contrast.py runs in CI; it fails 11 pairs on the old tokens.
  • Brand. One mark for the site, docs, favicon and console. PNG OG image, apple-touch-icon and theme-color. The robots.txt sitemap pointed at the wrong domain.
  • No-JS and motion. The home replay renders the recorded run on the server and does not autoplay under reduced motion. The playground has a <noscript> explanation. Agent specs open with a native disclosure.
  • Honest states. Unknowns render "—". The console has loading states for the transcript, usage and sign-in. A server error no longer looks like a logout. Bundle load errors are listed. The console event stream reconnects behind a Live / Reconnecting status light, and the playground shows the same light. Rate limits and a spent daily budget get their own notice. A failed kill is reported.
  • Controls. Disabled controls say why. Deleting a secret names what breaks. The console "clear view" button, which hid events until a reload, is removed.
  • Layout. 44px touch targets on coarse pointers, one focus ring, status marks on plan pills, numbered eyebrows and hairline index rows on the home page.

UI checklist (site, playground, console)

  • Screenshots at 1280px and 375px wide, no horizontal scroll at 375 (CI artifacts site-screenshots, console-screenshots)
  • Loading, empty and error states shown; unknown values render —
  • python scripts/check_contrast.py passes
  • Nothing under 11px; touch targets 44px on a coarse pointer
  • Keyboard path works with a visible focus ring
  • Works without JS, or says why it can't
  • No new colours, radii or sizes outside design/tokens.css

Anything reviewers should look at closely

  • The console stream now loads history with GET /events before opening the SSE stream. That is what makes "loading" distinguishable from "empty".
  • The primary button text changed from white to ink. White on the bright orange was 3.1:1.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Udnbt6XW46u1BijbbkGkuU


Generated by Claude Code

Apply the design-teardown lessons to the site, playground and console.

- Tokens: every text colour passes WCAG AA; a text-safe --accent-text for
  orange text, the bright --accent for shapes only; one radius multiplier;
  an 11px type floor. scripts/check_contrast.py enforces it in CI and
  design/README.md writes the rules down.
- Brand: one mark for site, docs, favicon and console; PNG OG image,
  apple-touch-icon, theme-color; robots.txt sitemap domain fixed.
- Home: the replay renders the recorded run on the server and respects
  reduced motion; numbered eyebrows; hairline index rows. Playground
  explains itself without JS.
- States: "—" for unknowns, loading states in the console, server errors
  no longer look like a logout, bundle load errors are shown, the console
  stream reconnects behind a Live/Reconnecting status light, rate-limit
  and budget notices, kill errors surfaced.
- Controls: disabled controls say why, secret delete confirms the
  consequence, the console "clear view" button is removed, agent specs
  use a native disclosure.
- 44px touch targets on coarse pointers, one focus ring, status marks on
  plan pills, no horizontal scroll at 375px (checked in both e2e suites).
- PR template gains a UI checklist.

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

vercel Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated
plnt Error Error Oct 7, 2026 8:18pm UTC
plnt-site Ready Ready Preview Oct 7, 2026 8:18pm UTC

Copy link
Copy Markdown
Contributor Author

The red Vercel deployment for the plnt project is not from this PR. That project builds from the repo root, which has no web app, and it fails the same way on every branch. The real site project, plnt-site (root site/), deployed this branch fine. The fix is to delete or disconnect the stray plnt project in the Vercel dashboard. No code change in this PR can address it.


Generated by Claude Code

This branch had an error being deployed

1 failed and 1 active deployments
Preview – plnt-site — c1fa2468 Deployed Oct 7, 2026 by vercel[bot]
Preview – plnt — c1fa2468 Deployed Oct 7, 2026 by vercel[bot]
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