Skip to content

Give the Guide Centre footer search the shared edge-to-edge phone dock - #2137

Merged
BigSimmo merged 16 commits into
mainfrom
claude/clinical-guide-footer-search-4l54hp
Aug 18, 2026
Merged

Give the Guide Centre footer search the shared edge-to-edge phone dock#2137
BigSimmo merged 16 commits into
mainfrom
claude/clinical-guide-footer-search-4l54hp

Conversation

@BigSimmo

Copy link
Copy Markdown
Owner

Summary

  • The Guide Centre composer was the only phone search bar not using the shared dock chrome. GuideDialog renders its composer through the generic Sheet footer slot, and Sheet always wraps that slot in border-t border-[color:var(--border)] p-3 sm:p-4 (src/components/ui/sheet.tsx:554); the guide then layered bg-[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.
  • Every other phone composer keeps the band itself transparent — .answer-footer-search-dock.answer-footer-search-edge (src/app/globals.css) sets flush left/right/bottom: 0, safe-area padding and background: transparent — and paints one localized .answer-footer-search-backdrop scrim 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 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: 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.md gains 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.tsx now pins the dock chrome (dock/edge classes present, phone band chrome off, sm: band chrome on, scrim child sm:hidden). The old assertion that the footer carries shadow-[var(--e4)] was pinning the elevated slab itself and is replaced; the guard against the unapproved --shadow-elevated token is kept.
  • docs/design-system/adoption-manifest.json regenerated (the edited test file now registers under the Sheet component's testFiles).

Verification

  • npm run verify:pr-local
PR-local verification summary:
- completed: check:runtime, check:installed-lock-parity, format:changed, sitemap:check, docs:check-index, docs:check-inventory, docs:check-scripts, docs:check-links, check:branch-review-ledger, check:outstanding-issues, check:ledger-write-discipline, lint, typecheck, test, build, check:rag:fixtures, check:medication-interactions, check:medication-lexicon-report
- failed: (none)
- not reached: (none)

Unit 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), covering header-scroll-hide-contract, mobile-composer-reserve, ui-overlay-css-contract, use-hide-on-scroll). Its focused-browser stage 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:

left 0, right 0, bottom 0, width 393
background rgba(0, 0, 0, 0) borderTopWidth 0px boxShadow none
paddingBottom 8px paddingLeft 12px
backdrop present, display block, height 160px

and at 1024 wide (unchanged desktop band):

position static, background rgb(28, 33, 38), borderTopWidth 1px, padding 16px, backdrop display none

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

  • Risk: Low, and confined to phone widths inside the Guide Centre dialog. The change is presentational: it swaps the dialog's own footer band chrome for the shared dock classes that already style every other phone composer. Desktop/tablet rendering is byte-for-byte the previous band (verified by computed style above). The one behavioural coupling worth naming is that the guide footer now inherits future edits to .answer-footer-search-dock — which is the intent, since the point is a single owner for phone composer chrome.
  • Rollback: revert the single commit; no data, schema, or config is touched.
  • Provider or production effects: None.

Notes

  • No RAG impact: line and no Clinical Governance Preflight: classifyPullRequestFiles returns clinicalRisk: false, operationalRisk: false, ragRanking: false, ui: true for this diff.

Generated by Claude Code

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
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@supabase

supabaseBot commented Aug 18, 2026

Copy link
Copy Markdown

This pull request has been ignored for the connected project sjrfecxgysukkwxsowpy because there are no changes detected in supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@coderabbitai

coderabbitaiBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your current included review allowance is based on your included PR review attempts over the past 7 days.

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 @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 56a7add1-6faf-42b5-a30e-b313311d7ca7

📥 Commits

Reviewing files that changed from the base of the PR and between 2763e96 and ea132c1.

📒 Files selected for processing (7)
  • docs/branch-review-records/19cdca49e6751aaf2914f2d6ee4ab144b1689c076eb51580aff9534f27b98c65.record.md
  • docs/branch-review-records/5ef27bddd67e7684747a62117c9d75bf90397fb061f937dc1df32ca05c31fbbc.record.md
  • docs/design-system/adoption-manifest.json
  • docs/search-chrome-behaviour.md
  • src/components/clinical-dashboard/guide-dialog.tsx
  • tests/guide-centre-chrome.spec.ts
  • tests/guide-centre-design-contract.dom.test.tsx

Comment @coderabbitai help to get the list of available commands.

claudeand others added 3 commits August 18, 2026 16:17
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
@BigSimmo
BigSimmo enabled auto-merge (squash) August 18, 2026 17:58
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
claudeand others added 8 commits August 18, 2026 18:27
…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
@BigSimmoBigSimmo added the skip-branch-sync Opt out of hosted pr-branch-sync / update-branch on this PR label Aug 18, 2026 — with Claude
@BigSimmo
BigSimmo disabled auto-merge August 18, 2026 20:01
@BigSimmo
BigSimmo enabled auto-merge (squash) August 18, 2026 20:17
@BigSimmo
BigSimmo merged commit 7b2aee6 into mainAug 18, 2026
26 checks passed
@BigSimmo
BigSimmo deleted the claude/clinical-guide-footer-search-4l54hp branch August 18, 2026 20:25
BigSimmo added a commit that referenced this pull request Aug 18, 2026
…earch-4l54hp
Record the PR #2137 prlanded verification in the ledger
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-branch-syncOpt out of hosted pr-branch-sync / update-branch on this PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@BigSimmo@claude