fix(web): stop composer banner glass overlap - #8034

Open
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap
Open

fix(web): stop composer banner glass overlap#8034
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

summary

  • restore the shared 17px attachment mask so banner fill never stacks under the translucent composer
  • fade virtualized timeline content to fully transparent before the measured composer overlay begins, keeping conversation text out from behind attached banners and the composer
  • preserve the shared eased topbar profile in the combined list mask, keep the scrollbar lane opaque, leave minimap chrome outside the mask, and clamp the bottom fade to at most 60% of timeline height
  • preserve the user's Glass opacity setting across the banner, stack cap, drawers, and composer
  • remove the stale before:mask-none assertion from fix(web): keep server update banners flush with the composer #8000

this keeps #8000's intended content occlusion without its overlap regression or a hardcoded opaque banner.

verification

  • vp test run --project unit src/components/chat/ComposerBannerStack.test.tsx src/components/chat/MessagesTimeline.test.tsx
  • vp lint apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • vp fmt --check apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • web typecheck
  • real web renderer at 1351x522, T3 Chat dark theme at 40% glass opacity
  • masked glass without timeline fade: synthetic background text changed 22,090 visible banner pixels
  • unmasked glass: banner/text affected 7,578 overlap pixels and 11,883 composer pixels
  • final timeline fade: background text changed 0 pixels while banner opacity remained 40%; both standard and WebKit banner masks remained the shared 17px attachment mask
  • verified the combined list mask reproduces the original responsive 48px top profile at 4.8/11.52/20.16/29.76/39.36/48px, retains the virtualized fade's separate opaque scrollbar layer, and leaves the parent viewport unmasked
  • verified a simulated stale 9,999px overlay measurement resolves through min(9999px, 60%) instead of hiding the full timeline

visual proof uses the real app and production composer/banner/timeline components with a synthetic in-flight update item and synthetic background conversation text.

original text show-through

conversation text showing through the update banner

overlap regression

update banner painting through the composer overlap

after

glass update banner with timeline content masked below it and a clean composer seam

request provenance


Note

Low Risk
Visual masking and CSS class selection only; no changes to message data, auth, or composer logic beyond scroll-fade presentation.

Overview
Fixes conversation text showing through translucent composer banners by masking the virtualized timeline where the measured composer stack sits, instead of relying only on the topbar fade.

MessagesTimeline now sets --timeline-composer-overlay-height on the viewport from contentInsetEndAdjustment, clamped with min(..., 60%) so bad measurements cannot wipe the whole list. When that inset is positive, the LegendList uses virtualized-scroll-fade plus either timeline-scroll-bottom-fade or timeline-scroll-combined-fade (when topFadeEnabled), and keeps topbar-scroll-fade only when there is no composer overlay.

index.css adds those timeline utilities: they define --virtualized-scroll-fade-mask with a bottom gradient that fades to transparent at the overlay height (and the combined variant preserves the existing eased top profile, including the sm breakpoint).

Reviewed by Cursor Bugbot for commit 9cb5e8d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix composer banner overlap in MessagesTimeline scroll fades

  • Sets the --timeline-composer-overlay-height CSS variable on the timeline viewport when contentInsetEndAdjustment is non-zero.
  • Adds timeline-scroll-bottom-fade and timeline-scroll-combined-fade utility classes to apply gradient masks that respect the composer height.
  • Switches LegendList to use the new fade classes when a bottom inset exists, preserving topbar-scroll-fade only when the inset is zero.
  • Behavioral Change: Scroll fade masks switch from top-only to bottom or combined fades when the composer is visible.

Macroscope summarized 9cb5e8d.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026
@github-actions

github-actionsBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.4 KiB−16 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+5 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.5 KiB−21 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB55.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire13.5 KiB13.4 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.6 KiB6.6 KiB−9 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB55.8 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 883e1a3 · PR result: 9cb5e8d · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp

macroscopeappBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 9cb5e8d

Macroscope's review found this PR approvable — This narrowly scoped web UI fix adjusts the timeline’s existing scroll masks so translucent composer banners do not overlap conversation content. Its impact is limited to presentation styling, with the scrollbar and minimap kept outside the content mask and no changes to data or application workflows.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 23:12

Dismissing prior approval to re-evaluate 3298ebb

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

One finding on the new glass override in apps/web/src/index.css. Restoring the mask (dropping before:mask-none) looks right; pinning --glass-opacity to 100% for this one surface is the part that introduces a consistency regression.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/index.css Outdated
t3-codeBotand others added 2 commits August 23, 2026 23:26
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Two findings on the new timeline mask. The shared virtualized-scroll-fade contract is the right owner here, but the mask geometry it is handed is unclamped and drops the shared top-fade profile.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the composer/timeline fade changes for consistency with the shared scroll-fade contract. One finding on the new timeline bottom mask.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 87166b0. Configure here.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 23, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 24, 2026 21:33

Dismissing prior approval to re-evaluate 9cb5e8d

@GuilhermeVieiraDev

Copy link
Copy Markdown
Contributor

Fixed on #8083 by Theo.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GuilhermeVieiraDev@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(web): stop composer banner glass overlap - #8034

Open
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap
Open

fix(web): stop composer banner glass overlap#8034
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

summary

  • restore the shared 17px attachment mask so banner fill never stacks under the translucent composer
  • fade virtualized timeline content to fully transparent before the measured composer overlay begins, keeping conversation text out from behind attached banners and the composer
  • preserve the shared eased topbar profile in the combined list mask, keep the scrollbar lane opaque, leave minimap chrome outside the mask, and clamp the bottom fade to at most 60% of timeline height
  • preserve the user's Glass opacity setting across the banner, stack cap, drawers, and composer
  • remove the stale before:mask-none assertion from fix(web): keep server update banners flush with the composer #8000

this keeps #8000's intended content occlusion without its overlap regression or a hardcoded opaque banner.

verification

  • vp test run --project unit src/components/chat/ComposerBannerStack.test.tsx src/components/chat/MessagesTimeline.test.tsx
  • vp lint apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • vp fmt --check apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • web typecheck
  • real web renderer at 1351x522, T3 Chat dark theme at 40% glass opacity
  • masked glass without timeline fade: synthetic background text changed 22,090 visible banner pixels
  • unmasked glass: banner/text affected 7,578 overlap pixels and 11,883 composer pixels
  • final timeline fade: background text changed 0 pixels while banner opacity remained 40%; both standard and WebKit banner masks remained the shared 17px attachment mask
  • verified the combined list mask reproduces the original responsive 48px top profile at 4.8/11.52/20.16/29.76/39.36/48px, retains the virtualized fade's separate opaque scrollbar layer, and leaves the parent viewport unmasked
  • verified a simulated stale 9,999px overlay measurement resolves through min(9999px, 60%) instead of hiding the full timeline

visual proof uses the real app and production composer/banner/timeline components with a synthetic in-flight update item and synthetic background conversation text.

original text show-through

conversation text showing through the update banner

overlap regression

update banner painting through the composer overlap

after

glass update banner with timeline content masked below it and a clean composer seam

request provenance


Note

Low Risk
Visual masking and CSS class selection only; no changes to message data, auth, or composer logic beyond scroll-fade presentation.

Overview
Fixes conversation text showing through translucent composer banners by masking the virtualized timeline where the measured composer stack sits, instead of relying only on the topbar fade.

MessagesTimeline now sets --timeline-composer-overlay-height on the viewport from contentInsetEndAdjustment, clamped with min(..., 60%) so bad measurements cannot wipe the whole list. When that inset is positive, the LegendList uses virtualized-scroll-fade plus either timeline-scroll-bottom-fade or timeline-scroll-combined-fade (when topFadeEnabled), and keeps topbar-scroll-fade only when there is no composer overlay.

index.css adds those timeline utilities: they define --virtualized-scroll-fade-mask with a bottom gradient that fades to transparent at the overlay height (and the combined variant preserves the existing eased top profile, including the sm breakpoint).

Reviewed by Cursor Bugbot for commit 9cb5e8d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix composer banner overlap in MessagesTimeline scroll fades

  • Sets the --timeline-composer-overlay-height CSS variable on the timeline viewport when contentInsetEndAdjustment is non-zero.
  • Adds timeline-scroll-bottom-fade and timeline-scroll-combined-fade utility classes to apply gradient masks that respect the composer height.
  • Switches LegendList to use the new fade classes when a bottom inset exists, preserving topbar-scroll-fade only when the inset is zero.
  • Behavioral Change: Scroll fade masks switch from top-only to bottom or combined fades when the composer is visible.

Macroscope summarized 9cb5e8d.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026
@github-actions

github-actionsBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.4 KiB−16 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+5 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.5 KiB−21 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB55.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire13.5 KiB13.4 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.6 KiB6.6 KiB−9 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB55.8 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 883e1a3 · PR result: 9cb5e8d · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp

macroscopeappBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 9cb5e8d

Macroscope's review found this PR approvable — This narrowly scoped web UI fix adjusts the timeline’s existing scroll masks so translucent composer banners do not overlap conversation content. Its impact is limited to presentation styling, with the scrollbar and minimap kept outside the content mask and no changes to data or application workflows.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 23:12

Dismissing prior approval to re-evaluate 3298ebb

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

One finding on the new glass override in apps/web/src/index.css. Restoring the mask (dropping before:mask-none) looks right; pinning --glass-opacity to 100% for this one surface is the part that introduces a consistency regression.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/index.css Outdated
t3-codeBotand others added 2 commits August 23, 2026 23:26
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Two findings on the new timeline mask. The shared virtualized-scroll-fade contract is the right owner here, but the mask geometry it is handed is unclamped and drops the shared top-fade profile.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the composer/timeline fade changes for consistency with the shared scroll-fade contract. One finding on the new timeline bottom mask.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 87166b0. Configure here.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 23, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 24, 2026 21:33

Dismissing prior approval to re-evaluate 9cb5e8d

@GuilhermeVieiraDev

Copy link
Copy Markdown
Contributor

Fixed on #8083 by Theo.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GuilhermeVieiraDev@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): stop composer banner glass overlap - #8034

Open
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap
Open

fix(web): stop composer banner glass overlap#8034
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

summary

  • restore the shared 17px attachment mask so banner fill never stacks under the translucent composer
  • fade virtualized timeline content to fully transparent before the measured composer overlay begins, keeping conversation text out from behind attached banners and the composer
  • preserve the shared eased topbar profile in the combined list mask, keep the scrollbar lane opaque, leave minimap chrome outside the mask, and clamp the bottom fade to at most 60% of timeline height
  • preserve the user's Glass opacity setting across the banner, stack cap, drawers, and composer
  • remove the stale before:mask-none assertion from fix(web): keep server update banners flush with the composer #8000

this keeps #8000's intended content occlusion without its overlap regression or a hardcoded opaque banner.

verification

  • vp test run --project unit src/components/chat/ComposerBannerStack.test.tsx src/components/chat/MessagesTimeline.test.tsx
  • vp lint apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • vp fmt --check apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • web typecheck
  • real web renderer at 1351x522, T3 Chat dark theme at 40% glass opacity
  • masked glass without timeline fade: synthetic background text changed 22,090 visible banner pixels
  • unmasked glass: banner/text affected 7,578 overlap pixels and 11,883 composer pixels
  • final timeline fade: background text changed 0 pixels while banner opacity remained 40%; both standard and WebKit banner masks remained the shared 17px attachment mask
  • verified the combined list mask reproduces the original responsive 48px top profile at 4.8/11.52/20.16/29.76/39.36/48px, retains the virtualized fade's separate opaque scrollbar layer, and leaves the parent viewport unmasked
  • verified a simulated stale 9,999px overlay measurement resolves through min(9999px, 60%) instead of hiding the full timeline

visual proof uses the real app and production composer/banner/timeline components with a synthetic in-flight update item and synthetic background conversation text.

original text show-through

conversation text showing through the update banner

overlap regression

update banner painting through the composer overlap

after

glass update banner with timeline content masked below it and a clean composer seam

request provenance


Note

Low Risk
Visual masking and CSS class selection only; no changes to message data, auth, or composer logic beyond scroll-fade presentation.

Overview
Fixes conversation text showing through translucent composer banners by masking the virtualized timeline where the measured composer stack sits, instead of relying only on the topbar fade.

MessagesTimeline now sets --timeline-composer-overlay-height on the viewport from contentInsetEndAdjustment, clamped with min(..., 60%) so bad measurements cannot wipe the whole list. When that inset is positive, the LegendList uses virtualized-scroll-fade plus either timeline-scroll-bottom-fade or timeline-scroll-combined-fade (when topFadeEnabled), and keeps topbar-scroll-fade only when there is no composer overlay.

index.css adds those timeline utilities: they define --virtualized-scroll-fade-mask with a bottom gradient that fades to transparent at the overlay height (and the combined variant preserves the existing eased top profile, including the sm breakpoint).

Reviewed by Cursor Bugbot for commit 9cb5e8d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix composer banner overlap in MessagesTimeline scroll fades

  • Sets the --timeline-composer-overlay-height CSS variable on the timeline viewport when contentInsetEndAdjustment is non-zero.
  • Adds timeline-scroll-bottom-fade and timeline-scroll-combined-fade utility classes to apply gradient masks that respect the composer height.
  • Switches LegendList to use the new fade classes when a bottom inset exists, preserving topbar-scroll-fade only when the inset is zero.
  • Behavioral Change: Scroll fade masks switch from top-only to bottom or combined fades when the composer is visible.

Macroscope summarized 9cb5e8d.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026
@github-actions

github-actionsBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.4 KiB−16 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+5 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.5 KiB−21 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB55.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire13.5 KiB13.4 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.6 KiB6.6 KiB−9 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB55.8 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 883e1a3 · PR result: 9cb5e8d · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp

macroscopeappBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 9cb5e8d

Macroscope's review found this PR approvable — This narrowly scoped web UI fix adjusts the timeline’s existing scroll masks so translucent composer banners do not overlap conversation content. Its impact is limited to presentation styling, with the scrollbar and minimap kept outside the content mask and no changes to data or application workflows.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 23:12

Dismissing prior approval to re-evaluate 3298ebb

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

One finding on the new glass override in apps/web/src/index.css. Restoring the mask (dropping before:mask-none) looks right; pinning --glass-opacity to 100% for this one surface is the part that introduces a consistency regression.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/index.css Outdated
t3-codeBotand others added 2 commits August 23, 2026 23:26
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Two findings on the new timeline mask. The shared virtualized-scroll-fade contract is the right owner here, but the mask geometry it is handed is unclamped and drops the shared top-fade profile.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the composer/timeline fade changes for consistency with the shared scroll-fade contract. One finding on the new timeline bottom mask.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 87166b0. Configure here.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 23, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 24, 2026 21:33

Dismissing prior approval to re-evaluate 9cb5e8d

@GuilhermeVieiraDev

Copy link
Copy Markdown
Contributor

Fixed on #8083 by Theo.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GuilhermeVieiraDev@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): stop composer banner glass overlap - #8034

Open
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap
Open

fix(web): stop composer banner glass overlap#8034
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

summary

  • restore the shared 17px attachment mask so banner fill never stacks under the translucent composer
  • fade virtualized timeline content to fully transparent before the measured composer overlay begins, keeping conversation text out from behind attached banners and the composer
  • preserve the shared eased topbar profile in the combined list mask, keep the scrollbar lane opaque, leave minimap chrome outside the mask, and clamp the bottom fade to at most 60% of timeline height
  • preserve the user's Glass opacity setting across the banner, stack cap, drawers, and composer
  • remove the stale before:mask-none assertion from fix(web): keep server update banners flush with the composer #8000

this keeps #8000's intended content occlusion without its overlap regression or a hardcoded opaque banner.

verification

  • vp test run --project unit src/components/chat/ComposerBannerStack.test.tsx src/components/chat/MessagesTimeline.test.tsx
  • vp lint apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • vp fmt --check apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • web typecheck
  • real web renderer at 1351x522, T3 Chat dark theme at 40% glass opacity
  • masked glass without timeline fade: synthetic background text changed 22,090 visible banner pixels
  • unmasked glass: banner/text affected 7,578 overlap pixels and 11,883 composer pixels
  • final timeline fade: background text changed 0 pixels while banner opacity remained 40%; both standard and WebKit banner masks remained the shared 17px attachment mask
  • verified the combined list mask reproduces the original responsive 48px top profile at 4.8/11.52/20.16/29.76/39.36/48px, retains the virtualized fade's separate opaque scrollbar layer, and leaves the parent viewport unmasked
  • verified a simulated stale 9,999px overlay measurement resolves through min(9999px, 60%) instead of hiding the full timeline

visual proof uses the real app and production composer/banner/timeline components with a synthetic in-flight update item and synthetic background conversation text.

original text show-through

conversation text showing through the update banner

overlap regression

update banner painting through the composer overlap

after

glass update banner with timeline content masked below it and a clean composer seam

request provenance


Note

Low Risk
Visual masking and CSS class selection only; no changes to message data, auth, or composer logic beyond scroll-fade presentation.

Overview
Fixes conversation text showing through translucent composer banners by masking the virtualized timeline where the measured composer stack sits, instead of relying only on the topbar fade.

MessagesTimeline now sets --timeline-composer-overlay-height on the viewport from contentInsetEndAdjustment, clamped with min(..., 60%) so bad measurements cannot wipe the whole list. When that inset is positive, the LegendList uses virtualized-scroll-fade plus either timeline-scroll-bottom-fade or timeline-scroll-combined-fade (when topFadeEnabled), and keeps topbar-scroll-fade only when there is no composer overlay.

index.css adds those timeline utilities: they define --virtualized-scroll-fade-mask with a bottom gradient that fades to transparent at the overlay height (and the combined variant preserves the existing eased top profile, including the sm breakpoint).

Reviewed by Cursor Bugbot for commit 9cb5e8d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix composer banner overlap in MessagesTimeline scroll fades

  • Sets the --timeline-composer-overlay-height CSS variable on the timeline viewport when contentInsetEndAdjustment is non-zero.
  • Adds timeline-scroll-bottom-fade and timeline-scroll-combined-fade utility classes to apply gradient masks that respect the composer height.
  • Switches LegendList to use the new fade classes when a bottom inset exists, preserving topbar-scroll-fade only when the inset is zero.
  • Behavioral Change: Scroll fade masks switch from top-only to bottom or combined fades when the composer is visible.

Macroscope summarized 9cb5e8d.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026
@github-actions

github-actionsBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.4 KiB−16 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+5 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.5 KiB−21 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB55.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire13.5 KiB13.4 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.6 KiB6.6 KiB−9 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB55.8 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 883e1a3 · PR result: 9cb5e8d · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp

macroscopeappBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 9cb5e8d

Macroscope's review found this PR approvable — This narrowly scoped web UI fix adjusts the timeline’s existing scroll masks so translucent composer banners do not overlap conversation content. Its impact is limited to presentation styling, with the scrollbar and minimap kept outside the content mask and no changes to data or application workflows.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 23:12

Dismissing prior approval to re-evaluate 3298ebb

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

One finding on the new glass override in apps/web/src/index.css. Restoring the mask (dropping before:mask-none) looks right; pinning --glass-opacity to 100% for this one surface is the part that introduces a consistency regression.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/index.css Outdated
t3-codeBotand others added 2 commits August 23, 2026 23:26
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Two findings on the new timeline mask. The shared virtualized-scroll-fade contract is the right owner here, but the mask geometry it is handed is unclamped and drops the shared top-fade profile.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the composer/timeline fade changes for consistency with the shared scroll-fade contract. One finding on the new timeline bottom mask.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 87166b0. Configure here.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 23, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 24, 2026 21:33

Dismissing prior approval to re-evaluate 9cb5e8d

@GuilhermeVieiraDev

Copy link
Copy Markdown
Contributor

Fixed on #8083 by Theo.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GuilhermeVieiraDev@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(web): stop composer banner glass overlap - #8034

Open
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap
Open

fix(web): stop composer banner glass overlap#8034
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

summary

  • restore the shared 17px attachment mask so banner fill never stacks under the translucent composer
  • fade virtualized timeline content to fully transparent before the measured composer overlay begins, keeping conversation text out from behind attached banners and the composer
  • preserve the shared eased topbar profile in the combined list mask, keep the scrollbar lane opaque, leave minimap chrome outside the mask, and clamp the bottom fade to at most 60% of timeline height
  • preserve the user's Glass opacity setting across the banner, stack cap, drawers, and composer
  • remove the stale before:mask-none assertion from fix(web): keep server update banners flush with the composer #8000

this keeps #8000's intended content occlusion without its overlap regression or a hardcoded opaque banner.

verification

  • vp test run --project unit src/components/chat/ComposerBannerStack.test.tsx src/components/chat/MessagesTimeline.test.tsx
  • vp lint apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • vp fmt --check apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • web typecheck
  • real web renderer at 1351x522, T3 Chat dark theme at 40% glass opacity
  • masked glass without timeline fade: synthetic background text changed 22,090 visible banner pixels
  • unmasked glass: banner/text affected 7,578 overlap pixels and 11,883 composer pixels
  • final timeline fade: background text changed 0 pixels while banner opacity remained 40%; both standard and WebKit banner masks remained the shared 17px attachment mask
  • verified the combined list mask reproduces the original responsive 48px top profile at 4.8/11.52/20.16/29.76/39.36/48px, retains the virtualized fade's separate opaque scrollbar layer, and leaves the parent viewport unmasked
  • verified a simulated stale 9,999px overlay measurement resolves through min(9999px, 60%) instead of hiding the full timeline

visual proof uses the real app and production composer/banner/timeline components with a synthetic in-flight update item and synthetic background conversation text.

original text show-through

conversation text showing through the update banner

overlap regression

update banner painting through the composer overlap

after

glass update banner with timeline content masked below it and a clean composer seam

request provenance


Note

Low Risk
Visual masking and CSS class selection only; no changes to message data, auth, or composer logic beyond scroll-fade presentation.

Overview
Fixes conversation text showing through translucent composer banners by masking the virtualized timeline where the measured composer stack sits, instead of relying only on the topbar fade.

MessagesTimeline now sets --timeline-composer-overlay-height on the viewport from contentInsetEndAdjustment, clamped with min(..., 60%) so bad measurements cannot wipe the whole list. When that inset is positive, the LegendList uses virtualized-scroll-fade plus either timeline-scroll-bottom-fade or timeline-scroll-combined-fade (when topFadeEnabled), and keeps topbar-scroll-fade only when there is no composer overlay.

index.css adds those timeline utilities: they define --virtualized-scroll-fade-mask with a bottom gradient that fades to transparent at the overlay height (and the combined variant preserves the existing eased top profile, including the sm breakpoint).

Reviewed by Cursor Bugbot for commit 9cb5e8d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix composer banner overlap in MessagesTimeline scroll fades

  • Sets the --timeline-composer-overlay-height CSS variable on the timeline viewport when contentInsetEndAdjustment is non-zero.
  • Adds timeline-scroll-bottom-fade and timeline-scroll-combined-fade utility classes to apply gradient masks that respect the composer height.
  • Switches LegendList to use the new fade classes when a bottom inset exists, preserving topbar-scroll-fade only when the inset is zero.
  • Behavioral Change: Scroll fade masks switch from top-only to bottom or combined fades when the composer is visible.

Macroscope summarized 9cb5e8d.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026
@github-actions

github-actionsBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.4 KiB−16 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+5 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.5 KiB−21 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB55.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire13.5 KiB13.4 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.6 KiB6.6 KiB−9 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB55.8 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 883e1a3 · PR result: 9cb5e8d · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp

macroscopeappBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 9cb5e8d

Macroscope's review found this PR approvable — This narrowly scoped web UI fix adjusts the timeline’s existing scroll masks so translucent composer banners do not overlap conversation content. Its impact is limited to presentation styling, with the scrollbar and minimap kept outside the content mask and no changes to data or application workflows.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 23:12

Dismissing prior approval to re-evaluate 3298ebb

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

One finding on the new glass override in apps/web/src/index.css. Restoring the mask (dropping before:mask-none) looks right; pinning --glass-opacity to 100% for this one surface is the part that introduces a consistency regression.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/index.css Outdated
t3-codeBotand others added 2 commits August 23, 2026 23:26
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Two findings on the new timeline mask. The shared virtualized-scroll-fade contract is the right owner here, but the mask geometry it is handed is unclamped and drops the shared top-fade profile.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the composer/timeline fade changes for consistency with the shared scroll-fade contract. One finding on the new timeline bottom mask.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 87166b0. Configure here.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 23, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 24, 2026 21:33

Dismissing prior approval to re-evaluate 9cb5e8d

@GuilhermeVieiraDev

Copy link
Copy Markdown
Contributor

Fixed on #8083 by Theo.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GuilhermeVieiraDev@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): stop composer banner glass overlap - #8034

Open
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap
Open

fix(web): stop composer banner glass overlap#8034
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

summary

  • restore the shared 17px attachment mask so banner fill never stacks under the translucent composer
  • fade virtualized timeline content to fully transparent before the measured composer overlay begins, keeping conversation text out from behind attached banners and the composer
  • preserve the shared eased topbar profile in the combined list mask, keep the scrollbar lane opaque, leave minimap chrome outside the mask, and clamp the bottom fade to at most 60% of timeline height
  • preserve the user's Glass opacity setting across the banner, stack cap, drawers, and composer
  • remove the stale before:mask-none assertion from fix(web): keep server update banners flush with the composer #8000

this keeps #8000's intended content occlusion without its overlap regression or a hardcoded opaque banner.

verification

  • vp test run --project unit src/components/chat/ComposerBannerStack.test.tsx src/components/chat/MessagesTimeline.test.tsx
  • vp lint apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • vp fmt --check apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • web typecheck
  • real web renderer at 1351x522, T3 Chat dark theme at 40% glass opacity
  • masked glass without timeline fade: synthetic background text changed 22,090 visible banner pixels
  • unmasked glass: banner/text affected 7,578 overlap pixels and 11,883 composer pixels
  • final timeline fade: background text changed 0 pixels while banner opacity remained 40%; both standard and WebKit banner masks remained the shared 17px attachment mask
  • verified the combined list mask reproduces the original responsive 48px top profile at 4.8/11.52/20.16/29.76/39.36/48px, retains the virtualized fade's separate opaque scrollbar layer, and leaves the parent viewport unmasked
  • verified a simulated stale 9,999px overlay measurement resolves through min(9999px, 60%) instead of hiding the full timeline

visual proof uses the real app and production composer/banner/timeline components with a synthetic in-flight update item and synthetic background conversation text.

original text show-through

conversation text showing through the update banner

overlap regression

update banner painting through the composer overlap

after

glass update banner with timeline content masked below it and a clean composer seam

request provenance


Note

Low Risk
Visual masking and CSS class selection only; no changes to message data, auth, or composer logic beyond scroll-fade presentation.

Overview
Fixes conversation text showing through translucent composer banners by masking the virtualized timeline where the measured composer stack sits, instead of relying only on the topbar fade.

MessagesTimeline now sets --timeline-composer-overlay-height on the viewport from contentInsetEndAdjustment, clamped with min(..., 60%) so bad measurements cannot wipe the whole list. When that inset is positive, the LegendList uses virtualized-scroll-fade plus either timeline-scroll-bottom-fade or timeline-scroll-combined-fade (when topFadeEnabled), and keeps topbar-scroll-fade only when there is no composer overlay.

index.css adds those timeline utilities: they define --virtualized-scroll-fade-mask with a bottom gradient that fades to transparent at the overlay height (and the combined variant preserves the existing eased top profile, including the sm breakpoint).

Reviewed by Cursor Bugbot for commit 9cb5e8d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix composer banner overlap in MessagesTimeline scroll fades

  • Sets the --timeline-composer-overlay-height CSS variable on the timeline viewport when contentInsetEndAdjustment is non-zero.
  • Adds timeline-scroll-bottom-fade and timeline-scroll-combined-fade utility classes to apply gradient masks that respect the composer height.
  • Switches LegendList to use the new fade classes when a bottom inset exists, preserving topbar-scroll-fade only when the inset is zero.
  • Behavioral Change: Scroll fade masks switch from top-only to bottom or combined fades when the composer is visible.

Macroscope summarized 9cb5e8d.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026
@github-actions

github-actionsBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.4 KiB−16 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+5 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.5 KiB−21 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB55.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire13.5 KiB13.4 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.6 KiB6.6 KiB−9 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB55.8 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 883e1a3 · PR result: 9cb5e8d · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp

macroscopeappBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 9cb5e8d

Macroscope's review found this PR approvable — This narrowly scoped web UI fix adjusts the timeline’s existing scroll masks so translucent composer banners do not overlap conversation content. Its impact is limited to presentation styling, with the scrollbar and minimap kept outside the content mask and no changes to data or application workflows.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 23:12

Dismissing prior approval to re-evaluate 3298ebb

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

One finding on the new glass override in apps/web/src/index.css. Restoring the mask (dropping before:mask-none) looks right; pinning --glass-opacity to 100% for this one surface is the part that introduces a consistency regression.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/index.css Outdated
t3-codeBotand others added 2 commits August 23, 2026 23:26
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Two findings on the new timeline mask. The shared virtualized-scroll-fade contract is the right owner here, but the mask geometry it is handed is unclamped and drops the shared top-fade profile.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the composer/timeline fade changes for consistency with the shared scroll-fade contract. One finding on the new timeline bottom mask.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 87166b0. Configure here.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 23, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 24, 2026 21:33

Dismissing prior approval to re-evaluate 9cb5e8d

@GuilhermeVieiraDev

Copy link
Copy Markdown
Contributor

Fixed on #8083 by Theo.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GuilhermeVieiraDev@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): stop composer banner glass overlap - #8034

Open
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap
Open

fix(web): stop composer banner glass overlap#8034
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

summary

  • restore the shared 17px attachment mask so banner fill never stacks under the translucent composer
  • fade virtualized timeline content to fully transparent before the measured composer overlay begins, keeping conversation text out from behind attached banners and the composer
  • preserve the shared eased topbar profile in the combined list mask, keep the scrollbar lane opaque, leave minimap chrome outside the mask, and clamp the bottom fade to at most 60% of timeline height
  • preserve the user's Glass opacity setting across the banner, stack cap, drawers, and composer
  • remove the stale before:mask-none assertion from fix(web): keep server update banners flush with the composer #8000

this keeps #8000's intended content occlusion without its overlap regression or a hardcoded opaque banner.

verification

  • vp test run --project unit src/components/chat/ComposerBannerStack.test.tsx src/components/chat/MessagesTimeline.test.tsx
  • vp lint apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • vp fmt --check apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • web typecheck
  • real web renderer at 1351x522, T3 Chat dark theme at 40% glass opacity
  • masked glass without timeline fade: synthetic background text changed 22,090 visible banner pixels
  • unmasked glass: banner/text affected 7,578 overlap pixels and 11,883 composer pixels
  • final timeline fade: background text changed 0 pixels while banner opacity remained 40%; both standard and WebKit banner masks remained the shared 17px attachment mask
  • verified the combined list mask reproduces the original responsive 48px top profile at 4.8/11.52/20.16/29.76/39.36/48px, retains the virtualized fade's separate opaque scrollbar layer, and leaves the parent viewport unmasked
  • verified a simulated stale 9,999px overlay measurement resolves through min(9999px, 60%) instead of hiding the full timeline

visual proof uses the real app and production composer/banner/timeline components with a synthetic in-flight update item and synthetic background conversation text.

original text show-through

conversation text showing through the update banner

overlap regression

update banner painting through the composer overlap

after

glass update banner with timeline content masked below it and a clean composer seam

request provenance


Note

Low Risk
Visual masking and CSS class selection only; no changes to message data, auth, or composer logic beyond scroll-fade presentation.

Overview
Fixes conversation text showing through translucent composer banners by masking the virtualized timeline where the measured composer stack sits, instead of relying only on the topbar fade.

MessagesTimeline now sets --timeline-composer-overlay-height on the viewport from contentInsetEndAdjustment, clamped with min(..., 60%) so bad measurements cannot wipe the whole list. When that inset is positive, the LegendList uses virtualized-scroll-fade plus either timeline-scroll-bottom-fade or timeline-scroll-combined-fade (when topFadeEnabled), and keeps topbar-scroll-fade only when there is no composer overlay.

index.css adds those timeline utilities: they define --virtualized-scroll-fade-mask with a bottom gradient that fades to transparent at the overlay height (and the combined variant preserves the existing eased top profile, including the sm breakpoint).

Reviewed by Cursor Bugbot for commit 9cb5e8d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix composer banner overlap in MessagesTimeline scroll fades

  • Sets the --timeline-composer-overlay-height CSS variable on the timeline viewport when contentInsetEndAdjustment is non-zero.
  • Adds timeline-scroll-bottom-fade and timeline-scroll-combined-fade utility classes to apply gradient masks that respect the composer height.
  • Switches LegendList to use the new fade classes when a bottom inset exists, preserving topbar-scroll-fade only when the inset is zero.
  • Behavioral Change: Scroll fade masks switch from top-only to bottom or combined fades when the composer is visible.

Macroscope summarized 9cb5e8d.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026
@github-actions

github-actionsBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.4 KiB−16 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+5 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.5 KiB−21 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB55.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire13.5 KiB13.4 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.6 KiB6.6 KiB−9 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB55.8 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 883e1a3 · PR result: 9cb5e8d · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp

macroscopeappBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 9cb5e8d

Macroscope's review found this PR approvable — This narrowly scoped web UI fix adjusts the timeline’s existing scroll masks so translucent composer banners do not overlap conversation content. Its impact is limited to presentation styling, with the scrollbar and minimap kept outside the content mask and no changes to data or application workflows.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 23:12

Dismissing prior approval to re-evaluate 3298ebb

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

One finding on the new glass override in apps/web/src/index.css. Restoring the mask (dropping before:mask-none) looks right; pinning --glass-opacity to 100% for this one surface is the part that introduces a consistency regression.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/index.css Outdated
t3-codeBotand others added 2 commits August 23, 2026 23:26
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Two findings on the new timeline mask. The shared virtualized-scroll-fade contract is the right owner here, but the mask geometry it is handed is unclamped and drops the shared top-fade profile.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the composer/timeline fade changes for consistency with the shared scroll-fade contract. One finding on the new timeline bottom mask.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 87166b0. Configure here.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 23, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 24, 2026 21:33

Dismissing prior approval to re-evaluate 9cb5e8d

@GuilhermeVieiraDev

Copy link
Copy Markdown
Contributor

Fixed on #8083 by Theo.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GuilhermeVieiraDev@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(web): stop composer banner glass overlap - #8034

Open
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap
Open

fix(web): stop composer banner glass overlap#8034
t3-code[bot] wants to merge 7 commits into
mainfrom
fix/composer-banner-glass-overlap

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

summary

  • restore the shared 17px attachment mask so banner fill never stacks under the translucent composer
  • fade virtualized timeline content to fully transparent before the measured composer overlay begins, keeping conversation text out from behind attached banners and the composer
  • preserve the shared eased topbar profile in the combined list mask, keep the scrollbar lane opaque, leave minimap chrome outside the mask, and clamp the bottom fade to at most 60% of timeline height
  • preserve the user's Glass opacity setting across the banner, stack cap, drawers, and composer
  • remove the stale before:mask-none assertion from fix(web): keep server update banners flush with the composer #8000

this keeps #8000's intended content occlusion without its overlap regression or a hardcoded opaque banner.

verification

  • vp test run --project unit src/components/chat/ComposerBannerStack.test.tsx src/components/chat/MessagesTimeline.test.tsx
  • vp lint apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • vp fmt --check apps/web/src/components/chat/ComposerBannerStack.tsx apps/web/src/components/chat/ComposerBannerStack.test.tsx apps/web/src/components/chat/MessagesTimeline.tsx
  • web typecheck
  • real web renderer at 1351x522, T3 Chat dark theme at 40% glass opacity
  • masked glass without timeline fade: synthetic background text changed 22,090 visible banner pixels
  • unmasked glass: banner/text affected 7,578 overlap pixels and 11,883 composer pixels
  • final timeline fade: background text changed 0 pixels while banner opacity remained 40%; both standard and WebKit banner masks remained the shared 17px attachment mask
  • verified the combined list mask reproduces the original responsive 48px top profile at 4.8/11.52/20.16/29.76/39.36/48px, retains the virtualized fade's separate opaque scrollbar layer, and leaves the parent viewport unmasked
  • verified a simulated stale 9,999px overlay measurement resolves through min(9999px, 60%) instead of hiding the full timeline

visual proof uses the real app and production composer/banner/timeline components with a synthetic in-flight update item and synthetic background conversation text.

original text show-through

conversation text showing through the update banner

overlap regression

update banner painting through the composer overlap

after

glass update banner with timeline content masked below it and a clean composer seam

request provenance


Note

Low Risk
Visual masking and CSS class selection only; no changes to message data, auth, or composer logic beyond scroll-fade presentation.

Overview
Fixes conversation text showing through translucent composer banners by masking the virtualized timeline where the measured composer stack sits, instead of relying only on the topbar fade.

MessagesTimeline now sets --timeline-composer-overlay-height on the viewport from contentInsetEndAdjustment, clamped with min(..., 60%) so bad measurements cannot wipe the whole list. When that inset is positive, the LegendList uses virtualized-scroll-fade plus either timeline-scroll-bottom-fade or timeline-scroll-combined-fade (when topFadeEnabled), and keeps topbar-scroll-fade only when there is no composer overlay.

index.css adds those timeline utilities: they define --virtualized-scroll-fade-mask with a bottom gradient that fades to transparent at the overlay height (and the combined variant preserves the existing eased top profile, including the sm breakpoint).

Reviewed by Cursor Bugbot for commit 9cb5e8d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix composer banner overlap in MessagesTimeline scroll fades

  • Sets the --timeline-composer-overlay-height CSS variable on the timeline viewport when contentInsetEndAdjustment is non-zero.
  • Adds timeline-scroll-bottom-fade and timeline-scroll-combined-fade utility classes to apply gradient masks that respect the composer height.
  • Switches LegendList to use the new fade classes when a bottom inset exists, preserving topbar-scroll-fade only when the inset is zero.
  • Behavioral Change: Scroll fade masks switch from top-only to bottom or combined fades when the composer is visible.

Macroscope summarized 9cb5e8d.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026
@github-actions

github-actionsBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.4 KiB−16 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+5 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.5 KiB−21 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB55.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire13.5 KiB13.4 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.6 KiB6.6 KiB−9 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB55.8 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 883e1a3 · PR result: 9cb5e8d · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp

macroscopeappBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 9cb5e8d

Macroscope's review found this PR approvable — This narrowly scoped web UI fix adjusts the timeline’s existing scroll masks so translucent composer banners do not overlap conversation content. Its impact is limited to presentation styling, with the scrollbar and minimap kept outside the content mask and no changes to data or application workflows.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 23:12

Dismissing prior approval to re-evaluate 3298ebb

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

One finding on the new glass override in apps/web/src/index.css. Restoring the mask (dropping before:mask-none) looks right; pinning --glass-opacity to 100% for this one surface is the part that introduces a consistency regression.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/index.css Outdated
t3-codeBotand others added 2 commits August 23, 2026 23:26
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Two findings on the new timeline mask. The shared virtualized-scroll-fade contract is the right owner here, but the mask geometry it is handed is unclamped and drops the shared top-fade profile.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the composer/timeline fade changes for consistency with the shared scroll-fade contract. One finding on the new timeline bottom mask.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 87166b0. Configure here.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 23, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 23, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 24, 2026 21:33

Dismissing prior approval to re-evaluate 9cb5e8d

@GuilhermeVieiraDev

Copy link
Copy Markdown
Contributor

Fixed on #8083 by Theo.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GuilhermeVieiraDev@maria-rcks