Bundle: Geist fonts, cn() extraction, and design-system doc/token pins (#2432 + #2430 + #2440 + #2431 + #2438) - #2432
Conversation
Primary actions on documents, compare, tools, calculators, forms, and chips still used sub-48px heights. Raise those controls to the tap floor so phone targets stay reachable without shrinking CTAs. Co-authored-by: Cursor <cursoragent@cursor.com>
Metadata and disclosure controls were borrowing tap-floor or ad-hoc min-heights. Add --spacing-compact-meta (40px) and adopt it on those surfaces so primary CTAs stay at 48px. Co-authored-by: Cursor <cursoragent@cursor.com>
Mode homes and compare/detail routes still hand-rolled headers, and the sidebar used raw buttons. Adopt PageHeader and Button so those surfaces share the same chrome and type weight as the rest of the shell. Co-authored-by: Cursor <cursoragent@cursor.com>
Therapy, nav, and prescribing surfaces still used raw spacing and an undocumented type-scale map, and medication accent hex needed a fail-closed test. Tokenise those literals and pin the exemption so new debt cannot hide in the same files. Co-authored-by: Cursor <cursoragent@cursor.com>
Remaining chrome still used raw duration, z-index, and radius literals, Ward motion ignored prefers-reduced-motion, and hash scroll could overshoot. Tokenise those values and clamp in-page scroll so reduced-motion and stacking stay on the documented ladder. Co-authored-by: Cursor <cursoragent@cursor.com>
A-E paid down tap, compact-meta, PageHeader, TSX ratchets, and motion/z chrome. Refresh the contract baseline and generated adoption snapshot so the checker matches that new floor. Co-authored-by: Cursor <cursoragent@cursor.com>
Production text-sm is 0.8125rem because ckb-v2 is mounted on html. Pin that literal against @theme --text-sm-minus so the overlap cannot be "fixed" by restoring Tailwind's 14px or by aliasing the two files at each other. Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
…14px The current type catalog still listed text-sm as 14px. Production renders 13px because v2 --text-sm equals @theme --text-sm-minus at 0.8125rem. Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
indexOf("\\n}") returning -1 made slice() cover almost the whole stylesheet,
so the text-sm pin could pass against an unterminated @theme window. Use
sourceSegment so a missing closer is a named failure.
Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>Stop loading production body fonts from next/dist/next-devtools. Keep display:swap, preload the sans face, and leave mono preload:false. Pin the src paths in the CSS delivery contract. Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
Warning Review limit reachedNext included review available in 8 minutes. View limit detailsLimit details: You’ve used the included review currently available. Your 102 included PR review attempts over the past 7 days set your current allowance at 1 review per hour. Your organization has reached its usage spending cap. Adjust your spending cap in the billing tab. Review configuration: ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (10)
📒 Files selected for processing (9)
Comment |
This pull request has been ignored for the connected project Preview Branches by Supabase. |
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_abe946b9-3851-4611-a705-9bee064ea98a) |
Vendored WOFF2s are variable (wght 100–900). localFont() omitted weight, so @font-face had no font-weight and browsers faux-bold headings. Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
Resolve conflicts in favour of main, which has since landed the same design-system intent through the shared recipes and Button/PageHeader adoption (PRs #2420, #2424, #2425, #2426): - ui-primitives.tsx: main split the module into primitive-recipes/*; the branch's compact-meta edits to `interactiveCompact` and `tableMicroActionRow` are already present verbatim in recipes.ts. - specifier compare/map/record/builder, differential-detail: main's `primaryControl` / `Button` adoption carries the same `min-h-tap` floor through `controlBase`, so the hand-rolled classes are superseded. - formulation-builder: main's `fieldControlPlain` recipe supersedes the hand-rolled textarea classes. - pathways-screen: main's therapy-pathways redesign (#2413) already removed the arbitrary spacing literals this branch was ratcheting. Regenerate the contract baseline against the merged tree.
The round-two write-up tagged Version 02 as the recommendation, but the commit that actually shipped this study to /dictionary/browse (PR #2143) records Version 01 as the chosen direction. Confirmed via git history; the earlier "(rec.)" tag was never updated after the decision changed.
Two failures the merge surfaced, both from this branch replaying work that main has since taken in a different shape: - factsheet-detail-page: drop `aria-hidden="true"` from the print portal. It came from this branch's local replay of PR #2426, but the version that merged to main deliberately does not carry it — hiding the portal removes the printed document's `<h1>` and its fact-table row headers from the accessibility tree, which is what `tests/factsheet-detail-header.dom.test.tsx` exists to prevent. - design-system-contract-utils: ratchet the globals.css raw CSS z-index pin from 8 (set by #2421) to 4. The motion/z tokenisation in this branch legitimately paid that debt down; the pin is a floor to lower, not raise. Evidence: 898 test files / 10862 tests passed; lint, typecheck and check:design-system-contract clean.
…e tokens Rewrite SPEC §4.5 to the size-only scale (shared --leading-prose, hero companions only), split GATES §4 so the July snapshot stays historical while the contract bullet re-quotes raw colours 0, and correct the v2 conventions paragraph to the html mount. Pin the three claims in the adoption test so per-step -lh/-tr copy cannot return. Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
PR #2427 (D, TSX ratchets) landed on main while this branch was being reconciled. Its version of sidebar-live-shell.module.css is a superset of this branch's: same --gap-tight / --space-1 / --space-2 snapping, plus the collapsed rail height tokenised to calc(100dvh - var(--space-2)) so the border box and its margins fit the viewport exactly. Take main. Regenerate the contract baseline against the merged tree. The branch now carries only E (globals motion/z, Ward reduced-motion, hash scroll clamp) and the baseline refresh. Evidence: 898 test files / 10862 tests passed; lint, typecheck and check:design-system-contract clean.
PR #2428 (E, globals motion/z + Ward reduced-motion + hash scroll clamp) landed on main, completing the A-E stack. Its version of the DS-P3-06 z-index pin is byte-identical to this branch's ratchet (8 -> 4, probe 9 -> 5), so take main and keep the file free of divergence. The branch now contributes exactly one file over main — the regenerated scripts/design-system-contract-baseline.json — which is what this PR is for. Regenerating against the merged tree produced no further change. Evidence: 898 test files / 10862 tests passed; check:design-system-contract, adoption and design-sync all clean.
Keep the wording pins, and also fail if SPEC §4.5 or conventions name --text-{xs..xl}-lh/-tr or --line-height orphans. Hero companions remain required.
Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_3d107a44-a7bd-4b14-b7f0-7a1c4025a1b1) |
…5wshq' into bundle-ds
Re-applies PR #2430's intent onto main's current structure. #2430 was authored before main split ui-primitives.tsx into primitive-recipes/*, so its diff no longer applies: cn() now lives in primitive-recipes/recipes.ts, not ui-primitives.tsx. recipes.ts re-exports cn from the new module, so ui-primitives.tsx's `export *` and the existing `import { cn } from "./recipes"` callers in clinical.tsx and feedback.tsx are unaffected. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JiaghcKco9xE3vLS4PJHdd
CI triageCI failed on this PR. Automated classification of the 2 failed job(s):
Compared with main CI run #14346 (success). That run's conclusion is an aggregate and did not exercise Classification is evidence routing, not permission to ignore a failure. Exact quarantined Playwright identities remain governed by the flake ledger. |
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_70ec00a6-1740-4028-9cfc-1fe1fa6882fc) |
Uh oh!
There was an error while loading. Please reload this page.
Summary
This PR is a bundle of five originally separate low-risk changes, each a separately revertible commit, collapsed into one CI invocation. Every item was checked against
classifyPullRequestFilesand returnsclinicalRisk: false,operationalRisk: false, no RAG-ranking-surface path — the only two of the ten open PRs that do.next-devtools(Bundle: Geist fonts, cn() extraction, and design-system doc/token pins (#2432 + #2430 + #2440 + #2431 + #2438) #2432).src/app/layout.tsxpreviously pulled Geist fromnode_modules/next/dist/next-devtools/server/font/, a Next.js overlay dev asset rather than a production font contract. The latin-subset WOFF2s now live insrc/fonts/with their SIL OFL licence and a README. Also declaresweight: "100 900"on both faces:next/font/localonly emitsfont-weightwhen it is set, and without the range on a variable font the@font-facecarries no weight and browsers faux-bold headings..gitattributesgains*.woff2 binary.cn()intosrc/lib/cn.ts(Extract cn() into src/lib/cn.ts #2430, re-applied).cn()is a pure class-name composer with no React or component dependency, so it does not belong in the component layer.primitive-recipes/recipes.tsre-exports it, which keepsui-primitives.tsx'sexport *and the existingimport { cn } from "./recipes"callers inclinical.tsxandfeedback.tsxworking unchanged.docs/design-system/SPEC.md§4.5 now describes the seven type steps as size-only: shared--leading-prose, hero companions--text-hero--line-height/--text-hero-tronly, and the live contract test name instead of the drifted:194-204cite.docs/design-system/GATES.md§4 is split so the July 2026tsc/ lint / test /verify:uibullets stay a historical snapshot while thecheck:design-system-contractbullet is re-quoted against the current baseline..design-sync/conventions.mdv2 copy corrected, with a NOTES.md line so the next remote sync does not restore per-step-lh/-tr. Pinned intests/design-system-adoption.test.ts.text-smat 13px in the type catalog (Pin production text-sm at 13px in the type catalog #2431). v2--text-smequals@theme --text-sm-minusat0.8125rem, pinned intests/ckb-v2-token-contract.test.ts. Productiontext-smalready renders 13px becauseckb-v2is mounted on<html>; this records that overlap rather than restoring Tailwind's 14px or aliasing the two files at each other. Updates the docs that still listedtext-smas 14px, and fails closed if the@themeblock has no closer.mockups/README.md(Correct stale Dictionary header recommendation in mockups/README.md #2438). The round-two write-up tagged Version 02 as the recommendation, but the commit that shipped this study to/dictionary/browse(PR Add Dictionary Browse header redesign study with three directions #2143) records Version 01 as the chosen direction. Corrects the table tag, adds a "Shipped: Version 01" note citing the shipping commit, and updates the topic index to reflect that all three routes stay regardless — rounds two and three both import code from round one's component file.#2430 was re-applied, not merged
PR #2430 was authored before
mainsplitui-primitives.tsxintoprimitive-recipes/*. On currentmain,cn()lives inprimitive-recipes/recipes.tsandui-primitives.tsxis four re-export lines, so #2430's diff no longer applies and its merge conflicts outright. The same intent was re-applied against the current structure and its location test retargeted fromui-primitives.tsxtoprimitive-recipes/recipes.ts.Why these five and no others
The font and
cn()halves each independently triggered the full heavy set — Build, four Chromium shards, Unit coverage and Lighthouse budget. The three documentation/pin items add no job to that run, so folding them in is free. Two of the doc items also editeddocs/design-system/GATES.md, so keeping them apart guaranteed repeated conflicts as each landed.Every other open PR is excluded by clause 1 of the bundling rule: #2433 on a genuine clinical path (
src/lib/medication-records.ts); #2436, #2437 and #2441 ondata/**generated snapshots; #2439, #2442, #2296 and #2297 on operational paths (CI workflow, Railway config, dependencies).Verification
Run on the merged bundle head:
npm run lintandnpm run typecheckboth passed on the code-carrying head before the documentation items were folded in; the folded items are Markdown plus two test files already covered by the run above.npm run formatrun on the merged tree; Prettier clean.npm run verify:pr-local— not run; the gates above cover every failure class this diff introduces, and each source branch passed hosted CI independently before bundling.npm run verify:ui— not run locally. Font loading and class-name composition are app-wide, so the hosted Chromium set is the right gate and runs on this PR.npm run verify:release— not run (provider-backed; not requested).npm run eval:retrieval:quality— not applicable; no retrieval, ranking, selection, chunking or scoring change.npm run eval:rag -- --limit 15+npm run eval:quality -- --rag-only— not applicable; no answer-generation change.npm run check:production-readiness— not applicable; no clinical workflow, privacy, environment, Supabase or source-governance change.npm run check:deployment-readiness— not applicable; no deployment startup, hosting or rollout change.Risk and rollout
next-devtoolspath, plus the weight range that fixes faux-bolding. Thecn()move is a pure relocation behind a re-export with no call-site changes. The remaining three items are documentation and two contract-test pins with no runtime effect.Clinical Governance Preflight
Not required: this change does not touch ingestion, answer generation, search/ranking, source rendering, document access, privacy, production env, or clinical output.
classifyPullRequestFilesreturnsclinicalRisk: falseandoperationalRisk: falsefor every path in this diff.Notes
AGENTS.md.origin/mainafter chore(design-system): refresh contract baseline and adoption #2429 and issues: queue #EFETZT update with PR #2413 snapshot-conflict evidence #2435 landed mid-assembly.docs/design-system/GATES.md,docs/design-system/SPEC.md,docs/design-system-contract.md,tests/ckb-v2-token-contract.test.tsandtests/design-system-adoption.test.ts— all five also changed here. Whichever lands second will need a conflict resolution. Cursor/cloud agent 1787842840327 vmus2 #2441 could not be bundled in: it carriesdata/repo-awareness-snapshot.json, which flips it toclinicalRisk: true.Note
Low Risk
App-wide font delivery changes what every route loads, but uses the same latin Geist files plus a weight-range fix; remaining work is docs, tests, and a pure
cn()relocation behind a re-export.Overview
Bundles five low-risk changes (separate revertible commits) to cut CI: production Geist now loads from vendored
src/fonts/*.woff2with SIL OFL, notnext-devtools;next/font/localdeclaresweight: "100 900"so variable faces don’t faux-bold headings.cn()lives insrc/lib/cn.tsand is re-exported fromprimitive-recipes/recipes.tswith no call-site churn.Docs and gates align with live v2 typography: size-only steps, shared
--leading-prose, hero companions only—no per-step-lh/-tr; productiontext-smat 13px (0.8125rem) matches v2--text-smand@theme --text-sm-minus, pinned inckb-v2-token-contractand adoption tests. GATES §4 keeps July snapshot bullets while re-quotingcheck:design-system-contract(raw colours 0).mockups/README.mdrecords Dictionary browse header Version 01 as shipped (not 02).Reviewed by Cursor Bugbot for commit 04d1e1f. Configure here.