Each value line takes the colour its type carries in the measurement list (a --chart-N token); where two chosen lines would share one, or a type has none, the later line in the menu's order takes the first free data token, and a sixth line with none left falls back to the foreground. The swatch beside the name, the line, the dashed bridge, filled and hollow points and a ring on the selected bucket all inherit one colour from their group. The menu, the selection bar and the phone chronicle mark each value with the same dot. The colour map moves to an icon-free module so the timeline does not pull the list's icons. The selection bar is a cross-section of one bucket and now says which: its head names the quarter, month or week in full, its entries are the ones that touch that bucket, and each mean keeps its readings count. Values go through the day view's formatter, so sleep reads as a duration and the unit preference applies; the server sends canonical units, which the old formatter took for display units. Before anyone picks a day the bar opens on the newest bucket it has something for in the requested window (documents, which it never lists, no longer count), and a short line says how to pick another.
e2e/
End-to-end browser tests. Playwright 1.60 drives a production build of the app against a real PostgreSQL, with @axe-core/playwright for accessibility assertions. This is the heaviest test tier; CI runs it on every PR, and locally it is worth running when a change touches a UI flow.
Running
pnpm e2e
The Playwright config (../playwright.config.ts) builds the app (next build) and brings up Postgres before the specs run; setup/global-setup.ts seeds the auth + fixture state. The suite is not part of the fast local gate (typecheck / lint / test) — it surfaces at PR CI, so expect responsive/wizard/nav reworks to flag here first.
Layout
setup/—test.ts(the suite'stest+expectentry point),global-setup.ts(auth + DB seeding),test-helpers.ts(shared login + navigation helpers).utils/— fixtures such asmock-dashboard-snapshot.ts.fixtures/— synthetic payloads a journey uploads, built in code rather than committed as blobs so the content stays reviewable (apple-health-export.ts).*.spec.ts— one spec per flow: auth/login/redirect, dashboard, charts, the medication-wizard cadences (medications-wizard-*), insights generation + scroll restoration, doctor report, settings, mobile-viewport consistency, locale switch, accessibility (a11y.spec.ts), and thev1427-*regression set.
Conventions
Import test and expect from ./setup/test, never from @playwright/test — types (Page, Route, …) still come from the package. The entry point extends Playwright's test with an automatic fixture that drops route handlers and page listeners after every test, so a handler left in flight cannot fail the test it belonged to once the context closes. src/__tests__/e2e-route-cleanup-guard.test.ts enforces the import boundary.
Assert against stable data-* attributes (data-slot, data-display-step, root display attrs), not viewport-dependent visible text. Responsive sm:hidden UI changes break getByText on desktop while the underlying element is still present — anchoring on data attributes keeps the specs stable across breakpoints. See ../CLAUDE.md.