Skip to content

fix(ui): restore real backdrop blur and harden the glass header#578

Merged
BigSimmo merged 2 commits into
mainfrom
claude/phone-blackout-fix-nuxnt3
Jul 13, 2026
Merged

fix(ui): restore real backdrop blur and harden the glass header#578
BigSimmo merged 2 commits into
mainfrom
claude/phone-blackout-fix-nuxnt3

Conversation

@BigSimmo

Copy link
Copy Markdown
Owner

Summary

Post-merge review of the glass header (#570) — two independent review passes (CSS/visual/a11y/perf and logic/regression) found no P0/P1 but three substantive P2s. Root-causing the biggest one uncovered a repo-wide latent defect:

  • The CSS build was silently dropping every hand-authored backdrop-filter. The manual -webkit-backdrop-filter duplicates in globals.css confuse Lightning CSS's property merging, so the served CSS contained no hand-authored backdrop-filter at all — verified via CSSOM dump (only Tailwind's backdrop-blur-* utilities survived). This means the bottom dock's celebrated three-pass "progressive blur" and the composer pill's blur(18px) have been tint-only in every engine since they shipped; the header's visible frost came solely from its Tailwind backdrop-blur-xl. Fix: remove the manual -webkit- duplicates (the pipeline handles prefixing per browserslist). The dock and pill now render their designed blur for the first time — verified via computed styles (blur(2px)/blur(8px)/blur(22px) on the dock, 14/20/26px on the header scrim) and visual probes.
  • Single-source the bar's frost in the scrim (review P2): the header element no longer carries backdrop-blur utilities — an element with backdrop-filter forms a backdrop root (Filter Effects L2) that starves the nested scrim of the page behind it (redundant in Chromium, historically inert in WebKit). The retuned scrim (14/20/26px, top-biased masks) now samples the real page in every engine and fully frosts the bar; net fewer always-active blur layers on the answer view.
  • No more resting veil (review P2): every scrim mask now fades to true zero before content rests (the old base mask ended at 20% alpha, leaving a faint frost band on the first line); the hidden-state scrim residual is bounded by a new test assertion (≤34px whisper).
  • Private-scope alert stays reachable (review P2): it's now sticky inside <main>, pinned below the glass bar in answer mode and just under the in-flow header otherwise — previously (post-feat(ui): edge-to-edge glass header with progressive-blur scrolling #570) it scrolled away with content in non-answer modes, stranding its "Reselect documents / Run without private scope" actions. New test covers it (the selector previously had zero test references).
  • P3s: scroll-hide reporter resets direction state when the breakpoint gate changes (kills a stale hide/reveal blip on phone mode switches); the no-blur / reduced-transparency fallback bar backgrounds moved inside @layer components so call-site utilities keep winning per the header-chrome layering contract (forced-colors stays unlayered deliberately, with a comment).
  • Review recorded in docs/branch-review-ledger.md per docs/codex-review-protocol.md.

Verification

  • npm run verify:pr-local — not run; equivalent gates below.
  • npm run verify:cheapexit 0 (full lint, typecheck, 1,935 unit tests, runtime/pins/sitemap/brand/scale checks) + npm run format:check clean.
  • Empirical blur probes (Chromium, computed styles + clipped-strip visual buffers): baseline (merged feat(ui): edge-to-edge glass header with progressive-blur scrolling #570) showed all scrim/dock/pill backdrop-filters computing to none and text legible through the "scrim-only" bar; after the fix, all passes compute their designed values and probe text behind the bar is fully frosted, with a crisp zero-veil handoff below the bar and the dock showing real progressive frost.
  • Playwright Chromium: targeted glass/alert/layout tests 6/6; full tests/ui-smoke.spec.ts71 passed, only the pre-existing unrelated /privacy heading failures (identical on clean main).
  • WebKit/Safari device check still recommended (no WebKit runner in this environment) — though the architecture is now engine-independent by construction (no nested backdrop roots, standard property only).

Clinical Governance Preflight

N/A — presentation-layer only (CSS blur/scrim, header chrome, one sticky alert, scroll-hide state hygiene, tests, review ledger). No ingestion, answer generation, search/ranking, source rendering logic, document access, privacy, production env, or clinical output behavior changes.

Notes

  • The -webkit-backdrop-filter removal is safe cross-browser: the build pipeline auto-prefixes per browserslist, and Safari ≥18 (project baseline) supports unprefixed backdrop-filter natively.
  • Visual delta to expect: the bottom dock and composer pill now genuinely frost content behind them (as originally designed); the top bar's frost is now scrim-driven and slightly more graduated (strongest at the notch band).

Generated by Claude Code

Post-merge review of the glass header (#570) surfaced that the CSS build
pipeline was silently dropping EVERY hand-authored backdrop-filter
declaration: the manual -webkit-backdrop-filter duplicates in
globals.css confused Lightning CSS's property merging, so the header
scrim, the bottom dock's three-pass progressive blur, and the composer
pill had been tint-only in every engine all along — the only real blur
came from Tailwind utilities. Removing the manual -webkit- duplicates
(the pipeline handles prefixing) restores genuine blur to all of them,
verified via computed styles and visual probes.

With real blur available, the review's remaining findings are fixed:

- The header element no longer carries backdrop-blur utilities (an
  element with backdrop-filter forms a backdrop root that starves the
  nested scrim of the page behind it — redundant in Chromium, inert in
  WebKit). The retuned scrim (14/20/26px, top-biased masks) is now the
  single source of the bar's frost and samples the real page in every
  engine, cutting the always-active blur layers on the answer view.
- Every scrim mask now fades to true zero before content rests, so no
  faint veil sits on the first line at rest, and the hidden-state
  residual is bounded by a new test assertion.
- The private-scope recovery alert is sticky inside <main> so its
  actions stay reachable while scrolling in every mode (it previously
  scrolled away in non-answer modes); covered by a new test.
- The scroll-hide reporter resets its direction state when the
  breakpoint gate changes, avoiding a stale hide/reveal blip on phone
  mode switches.
- The no-blur / reduced-transparency fallback bar backgrounds are now
  layered so call-site utilities keep winning per the header-chrome
  layering contract; the forced-colors override stays unlayered on
  purpose.

Review recorded in docs/branch-review-ledger.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A1ekcXQZVFVKKzdoVpjyVQ
@supabase

supabase Bot commented Jul 13, 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

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 279efe1b-278f-4721-8585-e60324c3e440

📥 Commits

Reviewing files that changed from the base of the PR and between 9319499 and 94d1613.

📒 Files selected for processing (3)
  • docs/branch-review-ledger.md
  • src/app/globals.css
  • tests/clinical-dashboard-merge-artifacts.test.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • docs/branch-review-ledger.md
  • src/app/globals.css

📝 Walkthrough

Summary by CodeRabbit

  • UI Improvements

    • Refined the glass header and answer composer visuals for smoother blur, layering, and transparency behavior.
    • Improved header appearance in forced-colors and reduced-transparency modes.
    • Recovery alerts now remain accessible while scrolling through answer views.
  • Bug Fixes

    • Corrected header visibility behavior when responsive layout settings change.
  • Tests

    • Added coverage for scrolling recovery alerts and glass header positioning across display modes.

Walkthrough

The change retunes glass header and composer styling, removes authored vendor backdrop declarations, resets scroll-hide state when breakpoint behavior changes, keeps the private-scope recovery alert visible during answer scrolling, updates smoke and CSS checks, and adds a review ledger record.

Changes

Glass UI and scroll reachability

Layer / File(s) Summary
Retune glass backdrop and fallback styling
src/app/globals.css, tests/clinical-dashboard-merge-artifacts.test.ts
Header and composer scrims receive updated blur, saturation, masks, fallback layering, forced-colors behavior, and a guard against authored -webkit-backdrop-filter declarations.
Align header and scroll state
src/components/clinical-dashboard/master-search-header.tsx, src/components/clinical-dashboard/use-hide-on-scroll.ts
The header delegates backdrop effects to the scrim element, and scroll-hide state resets when breakpoint behavior changes.
Keep recovery alert reachable
src/components/ClinicalDashboard.tsx, tests/ui-smoke.spec.ts
The private-scope alert becomes sticky with answer-mode positioning, and smoke tests cover hidden glass-header bounds and scrolling recovery visibility.

Review ledger update

Layer / File(s) Summary
Record review outcome
docs/branch-review-ledger.md
The Review Records table adds the 2026-07-13 main PR #570 squash entry and associated checks.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 11
✅ Passed checks (11 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main UI and blur-fix changes in the PR.
Description check ✅ Passed The description covers summary, verification, governance notes, and rationale, though a few template checkboxes like verify:ui/release are not explicit.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Generated And Sensitive Files ✅ Passed PASS: The PR only touches docs, CSS, TSX, and tests; no .env/secrets/keys/logs/build artifacts or secret-like literals appeared in the changed files.
Verification Claims ✅ Passed PASS: The PR’s verification section and new ledger row both name exact commands/checks plus results (e.g. verify:cheap, format:check, Playwright Chromium, UI smoke counts).
Risky Git Or Deployment Actions ✅ Passed PR only changes a review ledger entry, CSS, and tests; I found no new instructions or workflows recommending force-push/reset/destructive clean/branch deletion/rebase/deploy without confirmation.
Supabase Project And Schema Safety ✅ Passed Only UI/CSS/test and ledger updates changed; no Supabase project refs, env examples, migrations, RLS/policy, or DB-affecting code were touched.
Runtime And Package Manager Integrity ✅ Passed PR only changes docs/CSS/tests; no package.json, lockfile, .npmrc, or Node version changes, and repo still pins npm@11.17.0 with Node 24.x engine-strict.
Api Route Failure Handling ✅ Passed Only docs/CSS/tests changed in HEAD; no API route, server action, RAG, search, ingestion, or provider code was touched, so failure-handling coverage is not applicable.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/phone-blackout-fix-nuxnt3
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch claude/phone-blackout-fix-nuxnt3

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

@BigSimmo
BigSimmo marked this pull request as ready for review July 13, 2026 12:14

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9319499ff9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/app/globals.css
@github-actions

Copy link
Copy Markdown

@codex resolve actionable Codex review findings for this pull request and current head using the repository instructions. This is the pull request's single automatic repair pass: do not perform a fresh review, create new standalone findings, or request another review. Work only the existing unresolved Codex threads on the current head. Always fix P0 and P1 findings. For P2 and lower findings, fix only clear, scoped, low-risk issues; otherwise disposition them with a concise reason. After fixing or dispositioning a thread, reply in that thread with as the first line, followed by a concise summary; that marker authorizes the workflow to close that exact thread. If human input or new authorization is required, do not use the marker and leave the thread open with the blocker. Finish only after every actionable thread is fixed or dispositioned and closed, or explicitly left open for a human decision. Do not update the branch from main, address unrelated reviews, broaden scope, or create more than one scoped fix commit. Do not use external APIs, paid services, credentials, dependency changes, or broad refactors unless explicitly authorized. Add targeted tests where behavior changes and run the narrowest relevant validation.

@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create a Codex account and connect to github.

… claims

Disposition of the Codex P2 on the glass-header PR ("preserve prefixed
backdrop filters for WebKit-only support"): verified moot against the
built artifact. The served client stylesheet pairs an auto-generated
-webkit-backdrop-filter with every unprefixed declaration, so
prefix-only Safari (<= 17) already receives the blur; the finding
reviewed the source diff, not the build output. Re-adding hand-written
prefixes would reintroduce the very Lightning CSS property-drop bug this
branch fixes.

- Document the authoring rule beside the header scrim: write ONLY the
  unprefixed backdrop-filter; the pipeline prefixes the build.
- Guard test: reject any hand-authored -webkit-backdrop-filter
  declaration in globals.css (feature probes in @supports conditions
  remain allowed).
- Rewrite the review-ledger Checks column as exact command: result
  claims (fixes the CodeRabbit "Verification Claims" pre-merge check).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A1ekcXQZVFVKKzdoVpjyVQ
@BigSimmo
BigSimmo enabled auto-merge (squash) July 13, 2026 12:37
@BigSimmo
BigSimmo merged commit d25f495 into main Jul 13, 2026
15 of 16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants