fix(web): remove black seam at the topbar scroll fade boundary - #7787
fix(web): remove black seam at the topbar scroll fade boundary#7787Luca-Lucidera wants to merge 1 commit into
Conversation
The timeline scroller masks its top edge with three mask layers: the fade gradient, a solid black rectangle for the rest of the viewport, and the opaque scrollbar lane. The gradient and the solid layer met at exactly --topbar-scroll-fade-height, and mask composition unions the layer alphas, so under fractional display scaling that shared edge can land on a half pixel where the gradient has ended and the solid layer has not yet begun. Both contribute zero alpha there, the row of content turns transparent and the dark window background shows through as a 1px black line cutting across the message text. Extend the gradient layer by 1px so it overlaps the solid layer. The extra pixel sits past the gradient's `black 100%` stop, so it stays fully opaque: the seam is now covered by both layers and the fade looks unchanged.
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a minimal CSS-only fix that adjusts mask-size calculations by 1px to eliminate a visual artifact (black seam at scroll fade boundary). No runtime behavior changes beyond the visual fix. You can add or adjust custom eligibility rules. Learn more. |
Problem
In the desktop app, a message scrolling under the topbar gets cut by a 1px black line that runs across the text.
The timeline scroller masks its top edge with three mask layers: the fade gradient, a solid black rectangle covering the rest of the viewport, and the opaque scrollbar lane. The gradient and the solid layer met at exactly
--topbar-scroll-fade-height. Mask composition unions the layer alphas, so under fractional display scaling that shared edge can land on a half pixel where the gradient has already ended and the solid layer has not yet begun. Both contribute zero alpha, the row of content turns transparent, and the dark window background shows through.Fix
Extend the gradient layer by 1px so it overlaps the solid layer. The extra pixel sits past the gradient's
black 100%stop, so it stays fully opaque: the seam is covered by both layers and the fade itself looks unchanged. The other consumers oftopbar-scroll-fade(pull requests view, settings layout, both at--topbar-scroll-fade-height: 1.5rem) are unaffected — the solid layer still starts at 1.5rem and the extra pixel is black on black.Before / after
Before
After
Verification
vp fmt --check apps/web/src/index.cssvp test run src/components/chat/MessagesTimeline.test.tsx— 26/26Out of scope:
virtualized-scroll-fadehas the same seam risk on the horizontal axis. Separate PR.Model: Claude Opus 5 (1M). Harness: T3 Code.
Note
Low Risk
One-pixel CSS mask overlap in a visual utility; no logic, auth, or data-path changes.
Overview
Fixes a 1px black line where timeline content scrolls under the topbar.
topbar-scroll-fadenow sizes the fade mask 1px taller so it overlaps the solid viewport mask. That covers a subpixel gap under fractional display scaling without changing the visible fade.Reviewed by Cursor Bugbot for commit b4cb1d1. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Fix black seam at topbar scroll fade boundary in
index.cssUpdates
mask-sizeand-webkit-mask-sizefor the topbar scroll fade to usecalc(var(--topbar-scroll-fade-height) + 1px)instead of the raw variable. This makes the masked fade region 1px taller and eliminates a visible seam at the boundary.Macroscope summarized b4cb1d1.