fix(b4-bugs): external-EOI cache collision + stage-gate regression test + search popover opacity

Three B4 bug fixes shipped together:

- **#4 Upload-signed-copy blank body** — ExternalEoiUploadDialog used
  queryKey=['interests', interestId] but didn't unwrap the {data} envelope
  while the parent InterestDetail (same key) does, so opening the dialog
  clobbered the cache with a wrapped shape and blanked the detail page
  ("Unknown Client" + empty tab body). Dialog now unwraps to match.

- **#2 Legacy-stage canonicalization regression test** — new integration
  test locks in the external-EOI advance gate: canonical pre-EOI stages
  (enquiry/qualified/nurturing) advance to 'eoi' on upload; at-or-past-EOI
  stages stay put while metadata still writes. 7/7 passing. Backfill
  script intentionally not shipped — dev DB is test data, prod cutover
  is manual.

- **#3 Global-search dropdown translucent rows** — defensive opaque
  background on the popover wrapper (bg-white dark:bg-popover) guards
  against the subtle transparency UAT captured on the Berths page.
  Live-browser repro still needed to identify the exact bleeding row;
  this defense makes the surface unambiguously solid in light mode
  regardless of which class wins tailwind-merge.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-25 12:59:25 +02:00
parent 13834afa46
commit 65b92cace1
3 changed files with 171 additions and 7 deletions

View File

@@ -318,7 +318,13 @@ export function CommandSearch() {
role="listbox"
aria-label="Search results"
className={cn(
'absolute top-[calc(100%+4px)] left-0 z-50 rounded-md border bg-popover shadow-lg overflow-hidden',
// Explicit white/popover background pair guards against subtle
// transparency artifacts UAT 2026-05-24 captured (rows on the
// Berths page bled through to the table behind even though
// bg-popover resolves opaque on paper). bg-white wins the
// tailwind-merge race so light mode is unambiguously solid;
// dark mode falls through to bg-popover via the dark: prefix.
'absolute top-[calc(100%+4px)] left-0 z-50 rounded-md border bg-white dark:bg-popover shadow-lg overflow-hidden',
// Desktop: anchored to the input width, capped on viewport
'w-full max-w-[min(720px,calc(100vw-2rem))]',
// Mobile (<lg): full-screen sheet so cramped phone widths