From 7ea68d1621226330adb117548fa334d610a9e241 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 23 Jul 2026 10:59:14 +0000 Subject: [PATCH 1/6] fix(ui): restore edge-to-edge phone search dock Stop the white strip under the bottom search bar by pinning the ClinicalDashboard phone shell with fixed inset-0 (no 100dvh dead band), forcing dock bottom:0 with safe-area as internal padding, and painting opaque dock chrome through the home-indicator band. Tighten Playwright geometry asserts and cover factsheets mode-home hero placement. Co-authored-by: BigSimmo --- src/app/globals.css | 53 ++++++++++++++----- src/components/ClinicalDashboard.tsx | 12 +++-- .../global-search-shell.tsx | 7 ++- tests/ui-tools.spec.ts | 51 +++++++++++++++++- 4 files changed, 100 insertions(+), 23 deletions(-) diff --git a/src/app/globals.css b/src/app/globals.css index 377d58ed..7e560bc4 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -854,17 +854,19 @@ summary::-webkit-details-marker { z-index: 0; height: var(--footer-scrim-height); overflow: hidden; + /* Bottom of the scrim must reach near-opaque so the safe-area band under the + pill reads as continuous dock chrome (edge-to-edge), not a white strip. */ background: linear-gradient( 180deg, transparent 0%, - color-mix(in srgb, var(--background) 8%, transparent) 38%, - color-mix(in srgb, var(--background) 18%, transparent) 68%, - color-mix(in srgb, var(--background) 32%, transparent) 88%, - color-mix(in srgb, var(--background) 42%, transparent) 100% + color-mix(in srgb, var(--background) 12%, transparent) 32%, + color-mix(in srgb, var(--background) 48%, transparent) 62%, + color-mix(in srgb, var(--background) 82%, transparent) 84%, + var(--background) 100% ); backdrop-filter: blur(2px) saturate(130%); - mask-image: linear-gradient(180deg, rgb(0 0 0 / 20%) 0%, rgb(0 0 0 / 45%) 28%, black 55%, black 100%); - -webkit-mask-image: linear-gradient(180deg, rgb(0 0 0 / 20%) 0%, rgb(0 0 0 / 45%) 28%, black 55%, black 100%); + mask-image: linear-gradient(180deg, rgb(0 0 0 / 20%) 0%, rgb(0 0 0 / 55%) 28%, black 52%, black 100%); + -webkit-mask-image: linear-gradient(180deg, rgb(0 0 0 / 20%) 0%, rgb(0 0 0 / 55%) 28%, black 52%, black 100%); } .answer-footer-search-dock .answer-footer-search-backdrop::before, @@ -905,9 +907,9 @@ summary::-webkit-details-marker { background: linear-gradient( 180deg, transparent 0%, - color-mix(in srgb, var(--background) 45%, transparent) 40%, - color-mix(in srgb, var(--background) 78%, transparent) 72%, - color-mix(in srgb, var(--background) 92%, transparent) 100% + color-mix(in srgb, var(--background) 45%, transparent) 36%, + color-mix(in srgb, var(--background) 82%, transparent) 68%, + var(--background) 100% ); } @@ -950,9 +952,9 @@ summary::-webkit-details-marker { background: linear-gradient( 180deg, transparent 0%, - color-mix(in srgb, var(--background) 50%, transparent) 42%, - color-mix(in srgb, var(--background) 82%, transparent) 74%, - color-mix(in srgb, var(--background) 94%, transparent) 100% + color-mix(in srgb, var(--background) 50%, transparent) 36%, + color-mix(in srgb, var(--background) 86%, transparent) 72%, + var(--background) 100% ); } @@ -1794,7 +1796,11 @@ summary::-webkit-details-marker { 0 8px 22px rgb(16 24 40 / 8%); } - /* Edge-to-edge phone dock: full-width footer, progressive scrim, inset pill. */ + /* Edge-to-edge phone dock: full-width footer flush to the glass. The pill is + inset via padding-bottom only — never by a non-zero `bottom` offset (that + reintroduces a white strip under the bar). Form background paints the + safe-area pad so it reads as dock chrome, not empty page margin. */ + .answer-footer-search-dock.answer-footer-search-edge, .answer-footer-search-dock.dashboard-composer-edge.answer-footer-search-edge, .answer-footer-search-dock.document-mobile-search-edge.answer-footer-search-edge { left: 0; @@ -1806,15 +1812,24 @@ summary::-webkit-details-marker { padding-inline: max(0.75rem, var(--safe-area-left)) max(0.75rem, var(--safe-area-right)); padding-top: 0.5rem; padding-bottom: max(0.5rem, var(--safe-area-bottom)); + background: linear-gradient( + 180deg, + transparent 0%, + color-mix(in srgb, var(--background) 72%, transparent) 42%, + color-mix(in srgb, var(--background) 94%, transparent) 72%, + var(--background) 100% + ); } .answer-footer-search-dock.document-mobile-search-edge.answer-footer-search-edge.document-mobile-search-compact, - .answer-footer-search-dock.dashboard-composer-edge.answer-footer-search-edge.document-mobile-search-compact { + .answer-footer-search-dock.dashboard-composer-edge.answer-footer-search-edge.document-mobile-search-compact, + .answer-footer-search-dock.answer-footer-search-edge.document-mobile-search-compact { padding-bottom: max(0.45rem, var(--safe-area-bottom)); } /* Must beat the edge-to-edge dock rule above (transform: none) so scroll-hide actually slides the bar off-screen once data-scroll-hidden is set. */ + .answer-footer-search-dock.answer-footer-search-edge[data-scroll-hidden="true"], .answer-footer-search-dock.document-mobile-search-edge.answer-footer-search-edge[data-scroll-hidden="true"], .answer-footer-search-dock.dashboard-composer-edge.answer-footer-search-edge[data-scroll-hidden="true"] { transform: translateY(calc(100% + env(safe-area-inset-bottom))); @@ -2226,6 +2241,16 @@ html[data-motion="reduced"] .pwa-notice-card { } } + /* Phones: ClinicalDashboard pins with fixed inset-0 utilities. Do not keep a + dvh height clamp here — it recreates the Safari toolbar dead band under + the shell even when inset-0 is present if height still resolves to dvh. */ + @media (max-width: 639px) { + .mobile-app-shell { + min-height: 0; + height: auto; + } + } + /* Scroll and print helpers */ .citation-link { position: relative; diff --git a/src/components/ClinicalDashboard.tsx b/src/components/ClinicalDashboard.tsx index 33edb7fb..8a8e67fe 100644 --- a/src/components/ClinicalDashboard.tsx +++ b/src/components/ClinicalDashboard.tsx @@ -3311,7 +3311,11 @@ export function ClinicalDashboard({