Give the Guide Centre footer search the shared edge-to-edge phone dock - #2137
Conversation
The Guide Centre composer was the only phone search bar that did not use the shared dock chrome. It rides the generic `Sheet` footer slot, and `Sheet` always wraps that slot in `border-t border-[color:var(--border)] p-3 sm:p-4`; the guide then added `bg-[color:var(--surface-raised)]` and `shadow-[var(--e4)]` on top. On phones that produced a full-width opaque raised band with a hard top border sitting over the content behind the pill — the "cover" the shared dock exists to avoid. Every other phone composer keeps the band itself transparent (`.answer-footer-search-dock.answer-footer-search-edge`: flush left/right/bottom, safe-area padding, `background: transparent`) and paints one localized `.answer-footer-search-backdrop` scrim that tints around the pill and tapers to zero at the physical edge. Adopt exactly that pair on the guide footer and move the band's own border, surface and elevation to `sm:` only, so the tablet/desktop dialog footer is unchanged. The dock stays on the default scrim height rather than `document-mobile-search-compact`, because the tour action row sits above the pill in the same shape as the differentials-compare and patient-details dock addons. Measured on a 393x852 phone: left 0, right 0, bottom 0, width 393, background rgba(0,0,0,0), border-top 0px, no box-shadow, 160px scrim. At 1024 wide the footer is still static, `--surface-raised`, 1px top border, 16px padding, scrim hidden. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012gATrPoaRwCEU21gex48Ve
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
This pull request has been ignored for the connected project Preview Branches by Supabase. |
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in:24 minutes Limit details: You’ve used the included review currently available. Your 101 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. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits within each organization. For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (7)
Comment |
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012gATrPoaRwCEU21gex48Ve
Resolves the sole real conflict in docs/search-chrome-behaviour.md (Page ownership model table): keeps main's renamed "Shared home" column-1 label and its Tools-row scoping paragraph, and re-adds this branch's Guide Centre dialog row plus the "Guide Centre footer is a dock" section. Every other file merged cleanly. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012gATrPoaRwCEU21gex48Ve
Converting the footer to the shared dock left one filled control inside it. The band behind the tour action is now deliberately transparent so page content reads through the scrim, and dropping an opaque `primaryControl` on top puts back a smaller version of the exact cover the conversion removed. Every other dock addon in this repo is an outlined translucent pill: `patient-details-fab__button` and Compare's quiet `differentials-mobile-compare-fab__button--empty`. Give the tour action the same framing — pill radius, 1px `--border-strong`, `color-mix(--surface 92%)`, weight 800, `--e3` — scoped `max-sm:` so the `sm+` Sheet band keeps the primary treatment for the guide's main call to action. Measured at 393x852: background `srgb 0.07 0.086 0.102 / 0.92`, border `rgb(71, 80, 90)` 1px, pill radius, 48px min-height, weight 800. At 1024: unchanged filled `rgb(245, 247, 247)`, 12px radius, no border, weight 600. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012gATrPoaRwCEU21gex48Ve
…rch-4l54hp' into claude/clinical-guide-footer-search-4l54hp
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012gATrPoaRwCEU21gex48Ve
…s name The DOM contract test asserts the footer carries the dock classes — the cause, not the effect. jsdom implements neither media queries nor cascade layers, so it would pass just as happily with those styles inert; that is the exact failure tests/helpers/style-contracts.ts was written about after `.search-band` shipped dead behind a class-presence assertion. Two things here are only decidable in a real browser at a real width: - `Sheet` always wraps its footer slot in `border-t border-[color:var(--border)] p-3`, so a transparent, borderless, flush band is what proves the unlayered dock rules actually beat those utilities. - The addon pill's overrides are `max-sm:` variants layered over `primaryControl`'s own `bg-`/`text-` utilities. tailwind-merge keeps BOTH, because they are different variant keys, so generated stylesheet order decides which one paints. A class-list assertion cannot see the filled slab come back. Assert the painted background, border width, elevation, flush geometry and scrim on the band, and the rendered border, pill radius, tap height and background alpha on the action. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012gATrPoaRwCEU21gex48Ve
…rch-4l54hp' into claude/clinical-guide-footer-search-4l54hp
…rch-4l54hp' into claude/clinical-guide-footer-search-4l54hp
Uh oh!
There was an error while loading. Please reload this page.
…earch-4l54hp Record the PR #2137 prlanded verification in the ledger
Summary
GuideDialogrenders its composer through the genericSheetfooter slot, andSheetalways wraps that slot inborder-t border-[color:var(--border)] p-3 sm:p-4(src/components/ui/sheet.tsx:554); the guide then layeredbg-[color:var(--surface-raised)]+shadow-[var(--e4)]on top. On phones that is a full-width opaque raised band with a hard top border sitting over the content behind the pill — the "cover" the shared dock exists to avoid..answer-footer-search-dock.answer-footer-search-edge(src/app/globals.css) sets flushleft/right/bottom: 0, safe-area padding andbackground: transparent— and paints one localized.answer-footer-search-backdropscrim that tints around the pill and tapers to zero at the physical edge. The guide footer now carries exactly that pair and renders the scrim child; its own border, surface and elevation moved tosm:only, so the tablet/desktop dialog footer is unchanged.document-mobile-search-compact: the tour action row sits above the pill, the same shape the differentials-compare and patient-details dock addons take, and the compact 5rem scrim would end mid-row.docs/search-chrome-behaviour.mdgains a Guide Centre row in the page-ownership table plus a short section recording why the footer is a dock and not a footer band.tests/guide-centre-design-contract.dom.test.tsxnow pins the dock chrome (dock/edge classes present, phone band chrome off,sm:band chrome on, scrim childsm:hidden). The old assertion that the footer carriesshadow-[var(--e4)]was pinning the elevated slab itself and is replaced; the guard against the unapproved--shadow-elevatedtoken is kept.docs/design-system/adoption-manifest.jsonregenerated (the edited test file now registers under theSheetcomponent'stestFiles).Verification
npm run verify:pr-localUnit suite within that run:
Test Files 673 passed (673)/Tests 7277 passed | 4 skipped (7281).npm run verify:phone-chrome— static and unit stages passed (Test Files 9 passed (9)/Tests 130 passed (130), coveringheader-scroll-hide-contract,mobile-composer-reserve,ui-overlay-css-contract,use-hide-on-scroll). Itsfocused-browserstage could not run in this container: the Playwright browser preflight reports the pinned revision missing (/opt/pw-browsers/chromium_headless_shell-1234/...; the image ships 1194), the known browser-revision drift. Per the repo rule, the mismatched path was not forced — UI verification not run: pinned Playwright Chromium revision unavailable in this container; delegating the Chromium journey proof to CI Production UI.Manual browser evidence was still gathered against the container's own Chromium 1194 on the running dev server, measuring the footer's computed style at 393×852:
and at 1024 wide (unchanged desktop band):
Scroll-hide still works on phones (footer
aria-hidden="true", opacity 0 after scrolling the guide body).npm run verify:release— not run; no release or handoff confidence claim is made here.Risk and rollout
.answer-footer-search-dock— which is the intent, since the point is a single owner for phone composer chrome.Notes
RAG impact:line and no Clinical Governance Preflight:classifyPullRequestFilesreturnsclinicalRisk: false,operationalRisk: false,ragRanking: false,ui: truefor this diff.Generated by Claude Code