feat(web): let users turn off composer collapse on blur and scroll - #9469

Merged
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings
Sep 3, 2026
Merged

feat(web): let users turn off composer collapse on blur and scroll#9469
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

On web and desktop, an existing thread's composer rests into a single line whenever it loses focus or the conversation is scrolled. Some users want it to stay expanded, and there was no way to opt out of either trigger.

A Settings → General → Collapse composer row now offers a multi-select dropdown of On unfocus / On scroll, backed by two client settings (composerCollapseOnBlur, composerCollapseOnScroll). Both default on, so behavior is unchanged unless a user deselects one. The trigger summarises the selection ("On unfocus, On scroll" / "On scroll" / "Never"). With blur collapse off, losing focus never rests the composer; scrolling still does whenever the composer is expanded, focused or not, and lifts on the next composer interaction. With scroll collapse off, the wheel gesture is never eligible. Both off keeps the composer expanded.

The change lives in shouldUseRestingComposerLayout, which now takes the scroll-collapsed flag and the blur preference as separate inputs instead of folding the scroll state into isFocused. The wheel handler used to require editor focus as a proxy for "expanded"; it now keys off the resting state directly, so scroll can rest an unfocused-but-expanded composer. The settings row, search entry, changed-settings list, restore-defaults, and the user docs follow. SelectItem gains an opt-in showCheck so multi-select popups can show every chosen item; single-select callers are untouched.

Settings

DefaultsOpenNeither selected (reset arrow appears)
settings defaultssettings opensettings never

Before (defaults, unchanged)

Click away from a focused composer → rests into a single line.

before: blur collapses

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c3fdd7b5b652ba2d/demo-before.mp4

After

Blur off, scroll on. Clicking away keeps it expanded; scrolling the conversation still rests it.

Click awayScroll up
blur off stays expandedblur off scroll collapses

Both off. Neither scrolling nor clicking away collapses it.

Scroll upClick away
both off scroll stays expandedboth off blur stays expanded

Demo: toggling both off in Settings, then typing, scrolling up, and clicking away in a thread. (Recorded with an earlier two-switch layout of the row; the control is now the multi-select dropdown above and the composer behavior is identical.)

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e76f183fb7494c0c/demo-after.mp4

Surfaces

  • Web and desktop share this path. Mobile has its own focus-driven collapse and is unaffected; both new keys are client settings, so they are per-device.
  • The Settings → General row, settings search, the changed-settings summary, and Restore defaults all know about the new keys.
  • Docs: docs/user/composer.md.

Verification

  • vp test run on composerFooterLayout.test.ts, settings.test.ts, DesktopClientSettings.test.ts (111 passing).
  • tsgo --noEmit in contracts, web, desktop.
  • Manual pass in the web app against a copy of real data for all four setting combinations (screenshots above).

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Client-only UI preference with defaults preserving current behavior; scope is composer layout and settings, not auth or data.

Overview
Adds Settings → General → Collapse composer, a multi-select for On unfocus and On scroll, backed by client settings composerCollapseOnBlur and composerCollapseOnScroll (both default on, so existing behavior is unchanged until the user opts out).

Resting layout logic in shouldUseRestingComposerLayout now treats blur and scroll as separate inputs: scroll collapse can rest the composer even while it is focused; with blur collapse off, unfocus alone never rests it. Scroll collapse in ChatComposer respects composerCollapseOnScroll, only runs while the composer is expanded (not already resting), and no longer requires the prompt editor to be focused for wheel gestures.

Also adds settings search/reset/changed-settings wiring, contract decode tests, user docs, and an opt-in showCheck on SelectItem for the multi-select UI.

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

Note

Add user settings to toggle composer collapse on blur and scroll

  • Adds composerCollapseOnBlur and composerCollapseOnScroll boolean client settings, both defaulting to true when absent, with independent patch fields in ClientSettingsPatch (settings.ts).
  • Adds a searchable General settings multi-select row for choosing unfocus, scroll, both, or neither as collapse triggers (SettingsPanels.tsx).
  • Updates shouldUseRestingComposerLayout to honor the new preferences: an existing desktop composer rests when scroll-collapsed (even while focused), and unfocus alone rests only when blur collapse is enabled (composerFooterLayout.ts).
  • Adds a showCheck prop to SelectItem so multiple selected options display a check icon (select.tsx).
  • Behavioral Change: disabling blur collapse means an unfocused expanded composer no longer rests on its own; it can still rest after an eligible scroll gesture if scroll collapse remains enabled. Disabling scroll collapse clears the scroll-collapsed state.

Macroscope summarized 7a0d572.

The desktop resting composer collapsed whenever it lost focus or the
conversation was scrolled, with no way to opt out. Two client settings
now gate each trigger independently. Both default on, so nothing
changes unless a user flips them.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threaddocs/user/composer.md Outdated
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.5 KiB−39 B (−0.3%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−41 B (−0.6%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages98−1 (−11.1%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−219 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−226 B (−3.3%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 7a0d572 · 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: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 7a0d572

Macroscope's review found this PR approvable — Adds a client-side, opt-out preference for existing composer-collapse behavior while keeping both triggers enabled by default. Runtime impact is limited to web/desktop layout and settings persistence, with backward-compatible contracts, targeted tests, and no sensitive or deployment-related changes.

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

Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 19:53

Dismissing prior approval to re-evaluate 5893781

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 20:08

Dismissing prior approval to re-evaluate 7037198

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@juliusmarmingejuliusmarminge added the preview:web Deploy a hosted-web preview to Vercel for this PR on every push. label Sep 3, 2026
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Web preview

https://t3code-qedvn2fcf-pinglabs.vercel.app (for 7a0d572)

Open this exact URL — the hosted-app origin is baked in at build time.
Pair a server into it with t3 pair --tailscale, or paste a host + pairing
code under Settings → Connections.

…pse setting
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:01

Dismissing prior approval to re-evaluate 81a18d6

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
…e is off
The wheel handler required the prompt editor to be focused, which was a
proxy for "the composer is expanded" back when unfocused always meant
resting. With blur collapse off an unfocused composer stays expanded and
scrolling could not rest it. Key the eligibility off the resting state
instead.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:14

Dismissing prior approval to re-evaluate 7a0d572

@juliusmarminge
juliusmarminge merged commit 0372836 into mainSep 3, 2026
28 checks passed
@juliusmarminge
juliusmarminge deleted the feat/composer-collapse-settings branch September 3, 2026 21:28
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview:webDeploy a hosted-web preview to Vercel for this PR on every push.size:L100-499 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.

1 participant

@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e 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

feat(web): let users turn off composer collapse on blur and scroll - #9469

Merged
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings
Sep 3, 2026
Merged

feat(web): let users turn off composer collapse on blur and scroll#9469
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

On web and desktop, an existing thread's composer rests into a single line whenever it loses focus or the conversation is scrolled. Some users want it to stay expanded, and there was no way to opt out of either trigger.

A Settings → General → Collapse composer row now offers a multi-select dropdown of On unfocus / On scroll, backed by two client settings (composerCollapseOnBlur, composerCollapseOnScroll). Both default on, so behavior is unchanged unless a user deselects one. The trigger summarises the selection ("On unfocus, On scroll" / "On scroll" / "Never"). With blur collapse off, losing focus never rests the composer; scrolling still does whenever the composer is expanded, focused or not, and lifts on the next composer interaction. With scroll collapse off, the wheel gesture is never eligible. Both off keeps the composer expanded.

The change lives in shouldUseRestingComposerLayout, which now takes the scroll-collapsed flag and the blur preference as separate inputs instead of folding the scroll state into isFocused. The wheel handler used to require editor focus as a proxy for "expanded"; it now keys off the resting state directly, so scroll can rest an unfocused-but-expanded composer. The settings row, search entry, changed-settings list, restore-defaults, and the user docs follow. SelectItem gains an opt-in showCheck so multi-select popups can show every chosen item; single-select callers are untouched.

Settings

DefaultsOpenNeither selected (reset arrow appears)
settings defaultssettings opensettings never

Before (defaults, unchanged)

Click away from a focused composer → rests into a single line.

before: blur collapses

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c3fdd7b5b652ba2d/demo-before.mp4

After

Blur off, scroll on. Clicking away keeps it expanded; scrolling the conversation still rests it.

Click awayScroll up
blur off stays expandedblur off scroll collapses

Both off. Neither scrolling nor clicking away collapses it.

Scroll upClick away
both off scroll stays expandedboth off blur stays expanded

Demo: toggling both off in Settings, then typing, scrolling up, and clicking away in a thread. (Recorded with an earlier two-switch layout of the row; the control is now the multi-select dropdown above and the composer behavior is identical.)

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e76f183fb7494c0c/demo-after.mp4

Surfaces

  • Web and desktop share this path. Mobile has its own focus-driven collapse and is unaffected; both new keys are client settings, so they are per-device.
  • The Settings → General row, settings search, the changed-settings summary, and Restore defaults all know about the new keys.
  • Docs: docs/user/composer.md.

Verification

  • vp test run on composerFooterLayout.test.ts, settings.test.ts, DesktopClientSettings.test.ts (111 passing).
  • tsgo --noEmit in contracts, web, desktop.
  • Manual pass in the web app against a copy of real data for all four setting combinations (screenshots above).

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Client-only UI preference with defaults preserving current behavior; scope is composer layout and settings, not auth or data.

Overview
Adds Settings → General → Collapse composer, a multi-select for On unfocus and On scroll, backed by client settings composerCollapseOnBlur and composerCollapseOnScroll (both default on, so existing behavior is unchanged until the user opts out).

Resting layout logic in shouldUseRestingComposerLayout now treats blur and scroll as separate inputs: scroll collapse can rest the composer even while it is focused; with blur collapse off, unfocus alone never rests it. Scroll collapse in ChatComposer respects composerCollapseOnScroll, only runs while the composer is expanded (not already resting), and no longer requires the prompt editor to be focused for wheel gestures.

Also adds settings search/reset/changed-settings wiring, contract decode tests, user docs, and an opt-in showCheck on SelectItem for the multi-select UI.

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

Note

Add user settings to toggle composer collapse on blur and scroll

  • Adds composerCollapseOnBlur and composerCollapseOnScroll boolean client settings, both defaulting to true when absent, with independent patch fields in ClientSettingsPatch (settings.ts).
  • Adds a searchable General settings multi-select row for choosing unfocus, scroll, both, or neither as collapse triggers (SettingsPanels.tsx).
  • Updates shouldUseRestingComposerLayout to honor the new preferences: an existing desktop composer rests when scroll-collapsed (even while focused), and unfocus alone rests only when blur collapse is enabled (composerFooterLayout.ts).
  • Adds a showCheck prop to SelectItem so multiple selected options display a check icon (select.tsx).
  • Behavioral Change: disabling blur collapse means an unfocused expanded composer no longer rests on its own; it can still rest after an eligible scroll gesture if scroll collapse remains enabled. Disabling scroll collapse clears the scroll-collapsed state.

Macroscope summarized 7a0d572.

The desktop resting composer collapsed whenever it lost focus or the
conversation was scrolled, with no way to opt out. Two client settings
now gate each trigger independently. Both default on, so nothing
changes unless a user flips them.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threaddocs/user/composer.md Outdated
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.5 KiB−39 B (−0.3%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−41 B (−0.6%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages98−1 (−11.1%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−219 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−226 B (−3.3%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 7a0d572 · 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: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 7a0d572

Macroscope's review found this PR approvable — Adds a client-side, opt-out preference for existing composer-collapse behavior while keeping both triggers enabled by default. Runtime impact is limited to web/desktop layout and settings persistence, with backward-compatible contracts, targeted tests, and no sensitive or deployment-related changes.

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

Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 19:53

Dismissing prior approval to re-evaluate 5893781

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 20:08

Dismissing prior approval to re-evaluate 7037198

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@juliusmarmingejuliusmarminge added the preview:web Deploy a hosted-web preview to Vercel for this PR on every push. label Sep 3, 2026
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Web preview

https://t3code-qedvn2fcf-pinglabs.vercel.app (for 7a0d572)

Open this exact URL — the hosted-app origin is baked in at build time.
Pair a server into it with t3 pair --tailscale, or paste a host + pairing
code under Settings → Connections.

…pse setting
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:01

Dismissing prior approval to re-evaluate 81a18d6

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
…e is off
The wheel handler required the prompt editor to be focused, which was a
proxy for "the composer is expanded" back when unfocused always meant
resting. With blur collapse off an unfocused composer stays expanded and
scrolling could not rest it. Key the eligibility off the resting state
instead.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:14

Dismissing prior approval to re-evaluate 7a0d572

@juliusmarminge
juliusmarminge merged commit 0372836 into mainSep 3, 2026
28 checks passed
@juliusmarminge
juliusmarminge deleted the feat/composer-collapse-settings branch September 3, 2026 21:28
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview:webDeploy a hosted-web preview to Vercel for this PR on every push.size:L100-499 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.

1 participant

@juliusmarminge
, '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

feat(web): let users turn off composer collapse on blur and scroll - #9469

Merged
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings
Sep 3, 2026
Merged

feat(web): let users turn off composer collapse on blur and scroll#9469
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

On web and desktop, an existing thread's composer rests into a single line whenever it loses focus or the conversation is scrolled. Some users want it to stay expanded, and there was no way to opt out of either trigger.

A Settings → General → Collapse composer row now offers a multi-select dropdown of On unfocus / On scroll, backed by two client settings (composerCollapseOnBlur, composerCollapseOnScroll). Both default on, so behavior is unchanged unless a user deselects one. The trigger summarises the selection ("On unfocus, On scroll" / "On scroll" / "Never"). With blur collapse off, losing focus never rests the composer; scrolling still does whenever the composer is expanded, focused or not, and lifts on the next composer interaction. With scroll collapse off, the wheel gesture is never eligible. Both off keeps the composer expanded.

The change lives in shouldUseRestingComposerLayout, which now takes the scroll-collapsed flag and the blur preference as separate inputs instead of folding the scroll state into isFocused. The wheel handler used to require editor focus as a proxy for "expanded"; it now keys off the resting state directly, so scroll can rest an unfocused-but-expanded composer. The settings row, search entry, changed-settings list, restore-defaults, and the user docs follow. SelectItem gains an opt-in showCheck so multi-select popups can show every chosen item; single-select callers are untouched.

Settings

DefaultsOpenNeither selected (reset arrow appears)
settings defaultssettings opensettings never

Before (defaults, unchanged)

Click away from a focused composer → rests into a single line.

before: blur collapses

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c3fdd7b5b652ba2d/demo-before.mp4

After

Blur off, scroll on. Clicking away keeps it expanded; scrolling the conversation still rests it.

Click awayScroll up
blur off stays expandedblur off scroll collapses

Both off. Neither scrolling nor clicking away collapses it.

Scroll upClick away
both off scroll stays expandedboth off blur stays expanded

Demo: toggling both off in Settings, then typing, scrolling up, and clicking away in a thread. (Recorded with an earlier two-switch layout of the row; the control is now the multi-select dropdown above and the composer behavior is identical.)

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e76f183fb7494c0c/demo-after.mp4

Surfaces

  • Web and desktop share this path. Mobile has its own focus-driven collapse and is unaffected; both new keys are client settings, so they are per-device.
  • The Settings → General row, settings search, the changed-settings summary, and Restore defaults all know about the new keys.
  • Docs: docs/user/composer.md.

Verification

  • vp test run on composerFooterLayout.test.ts, settings.test.ts, DesktopClientSettings.test.ts (111 passing).
  • tsgo --noEmit in contracts, web, desktop.
  • Manual pass in the web app against a copy of real data for all four setting combinations (screenshots above).

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Client-only UI preference with defaults preserving current behavior; scope is composer layout and settings, not auth or data.

Overview
Adds Settings → General → Collapse composer, a multi-select for On unfocus and On scroll, backed by client settings composerCollapseOnBlur and composerCollapseOnScroll (both default on, so existing behavior is unchanged until the user opts out).

Resting layout logic in shouldUseRestingComposerLayout now treats blur and scroll as separate inputs: scroll collapse can rest the composer even while it is focused; with blur collapse off, unfocus alone never rests it. Scroll collapse in ChatComposer respects composerCollapseOnScroll, only runs while the composer is expanded (not already resting), and no longer requires the prompt editor to be focused for wheel gestures.

Also adds settings search/reset/changed-settings wiring, contract decode tests, user docs, and an opt-in showCheck on SelectItem for the multi-select UI.

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

Note

Add user settings to toggle composer collapse on blur and scroll

  • Adds composerCollapseOnBlur and composerCollapseOnScroll boolean client settings, both defaulting to true when absent, with independent patch fields in ClientSettingsPatch (settings.ts).
  • Adds a searchable General settings multi-select row for choosing unfocus, scroll, both, or neither as collapse triggers (SettingsPanels.tsx).
  • Updates shouldUseRestingComposerLayout to honor the new preferences: an existing desktop composer rests when scroll-collapsed (even while focused), and unfocus alone rests only when blur collapse is enabled (composerFooterLayout.ts).
  • Adds a showCheck prop to SelectItem so multiple selected options display a check icon (select.tsx).
  • Behavioral Change: disabling blur collapse means an unfocused expanded composer no longer rests on its own; it can still rest after an eligible scroll gesture if scroll collapse remains enabled. Disabling scroll collapse clears the scroll-collapsed state.

Macroscope summarized 7a0d572.

The desktop resting composer collapsed whenever it lost focus or the
conversation was scrolled, with no way to opt out. Two client settings
now gate each trigger independently. Both default on, so nothing
changes unless a user flips them.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threaddocs/user/composer.md Outdated
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.5 KiB−39 B (−0.3%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−41 B (−0.6%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages98−1 (−11.1%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−219 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−226 B (−3.3%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 7a0d572 · 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: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 7a0d572

Macroscope's review found this PR approvable — Adds a client-side, opt-out preference for existing composer-collapse behavior while keeping both triggers enabled by default. Runtime impact is limited to web/desktop layout and settings persistence, with backward-compatible contracts, targeted tests, and no sensitive or deployment-related changes.

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

Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 19:53

Dismissing prior approval to re-evaluate 5893781

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 20:08

Dismissing prior approval to re-evaluate 7037198

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@juliusmarmingejuliusmarminge added the preview:web Deploy a hosted-web preview to Vercel for this PR on every push. label Sep 3, 2026
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Web preview

https://t3code-qedvn2fcf-pinglabs.vercel.app (for 7a0d572)

Open this exact URL — the hosted-app origin is baked in at build time.
Pair a server into it with t3 pair --tailscale, or paste a host + pairing
code under Settings → Connections.

…pse setting
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:01

Dismissing prior approval to re-evaluate 81a18d6

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
…e is off
The wheel handler required the prompt editor to be focused, which was a
proxy for "the composer is expanded" back when unfocused always meant
resting. With blur collapse off an unfocused composer stays expanded and
scrolling could not rest it. Key the eligibility off the resting state
instead.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:14

Dismissing prior approval to re-evaluate 7a0d572

@juliusmarminge
juliusmarminge merged commit 0372836 into mainSep 3, 2026
28 checks passed
@juliusmarminge
juliusmarminge deleted the feat/composer-collapse-settings branch September 3, 2026 21:28
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview:webDeploy a hosted-web preview to Vercel for this PR on every push.size:L100-499 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.

1 participant

@juliusmarminge
, '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 \u003e 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

feat(web): let users turn off composer collapse on blur and scroll - #9469

Merged
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings
Sep 3, 2026
Merged

feat(web): let users turn off composer collapse on blur and scroll#9469
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

On web and desktop, an existing thread's composer rests into a single line whenever it loses focus or the conversation is scrolled. Some users want it to stay expanded, and there was no way to opt out of either trigger.

A Settings → General → Collapse composer row now offers a multi-select dropdown of On unfocus / On scroll, backed by two client settings (composerCollapseOnBlur, composerCollapseOnScroll). Both default on, so behavior is unchanged unless a user deselects one. The trigger summarises the selection ("On unfocus, On scroll" / "On scroll" / "Never"). With blur collapse off, losing focus never rests the composer; scrolling still does whenever the composer is expanded, focused or not, and lifts on the next composer interaction. With scroll collapse off, the wheel gesture is never eligible. Both off keeps the composer expanded.

The change lives in shouldUseRestingComposerLayout, which now takes the scroll-collapsed flag and the blur preference as separate inputs instead of folding the scroll state into isFocused. The wheel handler used to require editor focus as a proxy for "expanded"; it now keys off the resting state directly, so scroll can rest an unfocused-but-expanded composer. The settings row, search entry, changed-settings list, restore-defaults, and the user docs follow. SelectItem gains an opt-in showCheck so multi-select popups can show every chosen item; single-select callers are untouched.

Settings

DefaultsOpenNeither selected (reset arrow appears)
settings defaultssettings opensettings never

Before (defaults, unchanged)

Click away from a focused composer → rests into a single line.

before: blur collapses

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c3fdd7b5b652ba2d/demo-before.mp4

After

Blur off, scroll on. Clicking away keeps it expanded; scrolling the conversation still rests it.

Click awayScroll up
blur off stays expandedblur off scroll collapses

Both off. Neither scrolling nor clicking away collapses it.

Scroll upClick away
both off scroll stays expandedboth off blur stays expanded

Demo: toggling both off in Settings, then typing, scrolling up, and clicking away in a thread. (Recorded with an earlier two-switch layout of the row; the control is now the multi-select dropdown above and the composer behavior is identical.)

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e76f183fb7494c0c/demo-after.mp4

Surfaces

  • Web and desktop share this path. Mobile has its own focus-driven collapse and is unaffected; both new keys are client settings, so they are per-device.
  • The Settings → General row, settings search, the changed-settings summary, and Restore defaults all know about the new keys.
  • Docs: docs/user/composer.md.

Verification

  • vp test run on composerFooterLayout.test.ts, settings.test.ts, DesktopClientSettings.test.ts (111 passing).
  • tsgo --noEmit in contracts, web, desktop.
  • Manual pass in the web app against a copy of real data for all four setting combinations (screenshots above).

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Client-only UI preference with defaults preserving current behavior; scope is composer layout and settings, not auth or data.

Overview
Adds Settings → General → Collapse composer, a multi-select for On unfocus and On scroll, backed by client settings composerCollapseOnBlur and composerCollapseOnScroll (both default on, so existing behavior is unchanged until the user opts out).

Resting layout logic in shouldUseRestingComposerLayout now treats blur and scroll as separate inputs: scroll collapse can rest the composer even while it is focused; with blur collapse off, unfocus alone never rests it. Scroll collapse in ChatComposer respects composerCollapseOnScroll, only runs while the composer is expanded (not already resting), and no longer requires the prompt editor to be focused for wheel gestures.

Also adds settings search/reset/changed-settings wiring, contract decode tests, user docs, and an opt-in showCheck on SelectItem for the multi-select UI.

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

Note

Add user settings to toggle composer collapse on blur and scroll

  • Adds composerCollapseOnBlur and composerCollapseOnScroll boolean client settings, both defaulting to true when absent, with independent patch fields in ClientSettingsPatch (settings.ts).
  • Adds a searchable General settings multi-select row for choosing unfocus, scroll, both, or neither as collapse triggers (SettingsPanels.tsx).
  • Updates shouldUseRestingComposerLayout to honor the new preferences: an existing desktop composer rests when scroll-collapsed (even while focused), and unfocus alone rests only when blur collapse is enabled (composerFooterLayout.ts).
  • Adds a showCheck prop to SelectItem so multiple selected options display a check icon (select.tsx).
  • Behavioral Change: disabling blur collapse means an unfocused expanded composer no longer rests on its own; it can still rest after an eligible scroll gesture if scroll collapse remains enabled. Disabling scroll collapse clears the scroll-collapsed state.

Macroscope summarized 7a0d572.

The desktop resting composer collapsed whenever it lost focus or the
conversation was scrolled, with no way to opt out. Two client settings
now gate each trigger independently. Both default on, so nothing
changes unless a user flips them.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threaddocs/user/composer.md Outdated
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.5 KiB−39 B (−0.3%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−41 B (−0.6%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages98−1 (−11.1%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−219 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−226 B (−3.3%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 7a0d572 · 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: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 7a0d572

Macroscope's review found this PR approvable — Adds a client-side, opt-out preference for existing composer-collapse behavior while keeping both triggers enabled by default. Runtime impact is limited to web/desktop layout and settings persistence, with backward-compatible contracts, targeted tests, and no sensitive or deployment-related changes.

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

Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 19:53

Dismissing prior approval to re-evaluate 5893781

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 20:08

Dismissing prior approval to re-evaluate 7037198

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@juliusmarmingejuliusmarminge added the preview:web Deploy a hosted-web preview to Vercel for this PR on every push. label Sep 3, 2026
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Web preview

https://t3code-qedvn2fcf-pinglabs.vercel.app (for 7a0d572)

Open this exact URL — the hosted-app origin is baked in at build time.
Pair a server into it with t3 pair --tailscale, or paste a host + pairing
code under Settings → Connections.

…pse setting
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:01

Dismissing prior approval to re-evaluate 81a18d6

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
…e is off
The wheel handler required the prompt editor to be focused, which was a
proxy for "the composer is expanded" back when unfocused always meant
resting. With blur collapse off an unfocused composer stays expanded and
scrolling could not rest it. Key the eligibility off the resting state
instead.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:14

Dismissing prior approval to re-evaluate 7a0d572

@juliusmarminge
juliusmarminge merged commit 0372836 into mainSep 3, 2026
28 checks passed
@juliusmarminge
juliusmarminge deleted the feat/composer-collapse-settings branch September 3, 2026 21:28
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview:webDeploy a hosted-web preview to Vercel for this PR on every push.size:L100-499 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.

1 participant

@juliusmarminge
, '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

feat(web): let users turn off composer collapse on blur and scroll - #9469

Merged
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings
Sep 3, 2026
Merged

feat(web): let users turn off composer collapse on blur and scroll#9469
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

On web and desktop, an existing thread's composer rests into a single line whenever it loses focus or the conversation is scrolled. Some users want it to stay expanded, and there was no way to opt out of either trigger.

A Settings → General → Collapse composer row now offers a multi-select dropdown of On unfocus / On scroll, backed by two client settings (composerCollapseOnBlur, composerCollapseOnScroll). Both default on, so behavior is unchanged unless a user deselects one. The trigger summarises the selection ("On unfocus, On scroll" / "On scroll" / "Never"). With blur collapse off, losing focus never rests the composer; scrolling still does whenever the composer is expanded, focused or not, and lifts on the next composer interaction. With scroll collapse off, the wheel gesture is never eligible. Both off keeps the composer expanded.

The change lives in shouldUseRestingComposerLayout, which now takes the scroll-collapsed flag and the blur preference as separate inputs instead of folding the scroll state into isFocused. The wheel handler used to require editor focus as a proxy for "expanded"; it now keys off the resting state directly, so scroll can rest an unfocused-but-expanded composer. The settings row, search entry, changed-settings list, restore-defaults, and the user docs follow. SelectItem gains an opt-in showCheck so multi-select popups can show every chosen item; single-select callers are untouched.

Settings

DefaultsOpenNeither selected (reset arrow appears)
settings defaultssettings opensettings never

Before (defaults, unchanged)

Click away from a focused composer → rests into a single line.

before: blur collapses

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c3fdd7b5b652ba2d/demo-before.mp4

After

Blur off, scroll on. Clicking away keeps it expanded; scrolling the conversation still rests it.

Click awayScroll up
blur off stays expandedblur off scroll collapses

Both off. Neither scrolling nor clicking away collapses it.

Scroll upClick away
both off scroll stays expandedboth off blur stays expanded

Demo: toggling both off in Settings, then typing, scrolling up, and clicking away in a thread. (Recorded with an earlier two-switch layout of the row; the control is now the multi-select dropdown above and the composer behavior is identical.)

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e76f183fb7494c0c/demo-after.mp4

Surfaces

  • Web and desktop share this path. Mobile has its own focus-driven collapse and is unaffected; both new keys are client settings, so they are per-device.
  • The Settings → General row, settings search, the changed-settings summary, and Restore defaults all know about the new keys.
  • Docs: docs/user/composer.md.

Verification

  • vp test run on composerFooterLayout.test.ts, settings.test.ts, DesktopClientSettings.test.ts (111 passing).
  • tsgo --noEmit in contracts, web, desktop.
  • Manual pass in the web app against a copy of real data for all four setting combinations (screenshots above).

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Client-only UI preference with defaults preserving current behavior; scope is composer layout and settings, not auth or data.

Overview
Adds Settings → General → Collapse composer, a multi-select for On unfocus and On scroll, backed by client settings composerCollapseOnBlur and composerCollapseOnScroll (both default on, so existing behavior is unchanged until the user opts out).

Resting layout logic in shouldUseRestingComposerLayout now treats blur and scroll as separate inputs: scroll collapse can rest the composer even while it is focused; with blur collapse off, unfocus alone never rests it. Scroll collapse in ChatComposer respects composerCollapseOnScroll, only runs while the composer is expanded (not already resting), and no longer requires the prompt editor to be focused for wheel gestures.

Also adds settings search/reset/changed-settings wiring, contract decode tests, user docs, and an opt-in showCheck on SelectItem for the multi-select UI.

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

Note

Add user settings to toggle composer collapse on blur and scroll

  • Adds composerCollapseOnBlur and composerCollapseOnScroll boolean client settings, both defaulting to true when absent, with independent patch fields in ClientSettingsPatch (settings.ts).
  • Adds a searchable General settings multi-select row for choosing unfocus, scroll, both, or neither as collapse triggers (SettingsPanels.tsx).
  • Updates shouldUseRestingComposerLayout to honor the new preferences: an existing desktop composer rests when scroll-collapsed (even while focused), and unfocus alone rests only when blur collapse is enabled (composerFooterLayout.ts).
  • Adds a showCheck prop to SelectItem so multiple selected options display a check icon (select.tsx).
  • Behavioral Change: disabling blur collapse means an unfocused expanded composer no longer rests on its own; it can still rest after an eligible scroll gesture if scroll collapse remains enabled. Disabling scroll collapse clears the scroll-collapsed state.

Macroscope summarized 7a0d572.

The desktop resting composer collapsed whenever it lost focus or the
conversation was scrolled, with no way to opt out. Two client settings
now gate each trigger independently. Both default on, so nothing
changes unless a user flips them.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threaddocs/user/composer.md Outdated
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.5 KiB−39 B (−0.3%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−41 B (−0.6%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages98−1 (−11.1%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−219 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−226 B (−3.3%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 7a0d572 · 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: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 7a0d572

Macroscope's review found this PR approvable — Adds a client-side, opt-out preference for existing composer-collapse behavior while keeping both triggers enabled by default. Runtime impact is limited to web/desktop layout and settings persistence, with backward-compatible contracts, targeted tests, and no sensitive or deployment-related changes.

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

Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 19:53

Dismissing prior approval to re-evaluate 5893781

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 20:08

Dismissing prior approval to re-evaluate 7037198

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@juliusmarmingejuliusmarminge added the preview:web Deploy a hosted-web preview to Vercel for this PR on every push. label Sep 3, 2026
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Web preview

https://t3code-qedvn2fcf-pinglabs.vercel.app (for 7a0d572)

Open this exact URL — the hosted-app origin is baked in at build time.
Pair a server into it with t3 pair --tailscale, or paste a host + pairing
code under Settings → Connections.

…pse setting
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:01

Dismissing prior approval to re-evaluate 81a18d6

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
…e is off
The wheel handler required the prompt editor to be focused, which was a
proxy for "the composer is expanded" back when unfocused always meant
resting. With blur collapse off an unfocused composer stays expanded and
scrolling could not rest it. Key the eligibility off the resting state
instead.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:14

Dismissing prior approval to re-evaluate 7a0d572

@juliusmarminge
juliusmarminge merged commit 0372836 into mainSep 3, 2026
28 checks passed
@juliusmarminge
juliusmarminge deleted the feat/composer-collapse-settings branch September 3, 2026 21:28
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview:webDeploy a hosted-web preview to Vercel for this PR on every push.size:L100-499 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.

1 participant

@juliusmarminge
, '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

feat(web): let users turn off composer collapse on blur and scroll - #9469

Merged
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings
Sep 3, 2026
Merged

feat(web): let users turn off composer collapse on blur and scroll#9469
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

On web and desktop, an existing thread's composer rests into a single line whenever it loses focus or the conversation is scrolled. Some users want it to stay expanded, and there was no way to opt out of either trigger.

A Settings → General → Collapse composer row now offers a multi-select dropdown of On unfocus / On scroll, backed by two client settings (composerCollapseOnBlur, composerCollapseOnScroll). Both default on, so behavior is unchanged unless a user deselects one. The trigger summarises the selection ("On unfocus, On scroll" / "On scroll" / "Never"). With blur collapse off, losing focus never rests the composer; scrolling still does whenever the composer is expanded, focused or not, and lifts on the next composer interaction. With scroll collapse off, the wheel gesture is never eligible. Both off keeps the composer expanded.

The change lives in shouldUseRestingComposerLayout, which now takes the scroll-collapsed flag and the blur preference as separate inputs instead of folding the scroll state into isFocused. The wheel handler used to require editor focus as a proxy for "expanded"; it now keys off the resting state directly, so scroll can rest an unfocused-but-expanded composer. The settings row, search entry, changed-settings list, restore-defaults, and the user docs follow. SelectItem gains an opt-in showCheck so multi-select popups can show every chosen item; single-select callers are untouched.

Settings

DefaultsOpenNeither selected (reset arrow appears)
settings defaultssettings opensettings never

Before (defaults, unchanged)

Click away from a focused composer → rests into a single line.

before: blur collapses

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c3fdd7b5b652ba2d/demo-before.mp4

After

Blur off, scroll on. Clicking away keeps it expanded; scrolling the conversation still rests it.

Click awayScroll up
blur off stays expandedblur off scroll collapses

Both off. Neither scrolling nor clicking away collapses it.

Scroll upClick away
both off scroll stays expandedboth off blur stays expanded

Demo: toggling both off in Settings, then typing, scrolling up, and clicking away in a thread. (Recorded with an earlier two-switch layout of the row; the control is now the multi-select dropdown above and the composer behavior is identical.)

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e76f183fb7494c0c/demo-after.mp4

Surfaces

  • Web and desktop share this path. Mobile has its own focus-driven collapse and is unaffected; both new keys are client settings, so they are per-device.
  • The Settings → General row, settings search, the changed-settings summary, and Restore defaults all know about the new keys.
  • Docs: docs/user/composer.md.

Verification

  • vp test run on composerFooterLayout.test.ts, settings.test.ts, DesktopClientSettings.test.ts (111 passing).
  • tsgo --noEmit in contracts, web, desktop.
  • Manual pass in the web app against a copy of real data for all four setting combinations (screenshots above).

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Client-only UI preference with defaults preserving current behavior; scope is composer layout and settings, not auth or data.

Overview
Adds Settings → General → Collapse composer, a multi-select for On unfocus and On scroll, backed by client settings composerCollapseOnBlur and composerCollapseOnScroll (both default on, so existing behavior is unchanged until the user opts out).

Resting layout logic in shouldUseRestingComposerLayout now treats blur and scroll as separate inputs: scroll collapse can rest the composer even while it is focused; with blur collapse off, unfocus alone never rests it. Scroll collapse in ChatComposer respects composerCollapseOnScroll, only runs while the composer is expanded (not already resting), and no longer requires the prompt editor to be focused for wheel gestures.

Also adds settings search/reset/changed-settings wiring, contract decode tests, user docs, and an opt-in showCheck on SelectItem for the multi-select UI.

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

Note

Add user settings to toggle composer collapse on blur and scroll

  • Adds composerCollapseOnBlur and composerCollapseOnScroll boolean client settings, both defaulting to true when absent, with independent patch fields in ClientSettingsPatch (settings.ts).
  • Adds a searchable General settings multi-select row for choosing unfocus, scroll, both, or neither as collapse triggers (SettingsPanels.tsx).
  • Updates shouldUseRestingComposerLayout to honor the new preferences: an existing desktop composer rests when scroll-collapsed (even while focused), and unfocus alone rests only when blur collapse is enabled (composerFooterLayout.ts).
  • Adds a showCheck prop to SelectItem so multiple selected options display a check icon (select.tsx).
  • Behavioral Change: disabling blur collapse means an unfocused expanded composer no longer rests on its own; it can still rest after an eligible scroll gesture if scroll collapse remains enabled. Disabling scroll collapse clears the scroll-collapsed state.

Macroscope summarized 7a0d572.

The desktop resting composer collapsed whenever it lost focus or the
conversation was scrolled, with no way to opt out. Two client settings
now gate each trigger independently. Both default on, so nothing
changes unless a user flips them.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threaddocs/user/composer.md Outdated
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.5 KiB−39 B (−0.3%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−41 B (−0.6%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages98−1 (−11.1%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−219 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−226 B (−3.3%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 7a0d572 · 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: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 7a0d572

Macroscope's review found this PR approvable — Adds a client-side, opt-out preference for existing composer-collapse behavior while keeping both triggers enabled by default. Runtime impact is limited to web/desktop layout and settings persistence, with backward-compatible contracts, targeted tests, and no sensitive or deployment-related changes.

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

Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 19:53

Dismissing prior approval to re-evaluate 5893781

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 20:08

Dismissing prior approval to re-evaluate 7037198

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@juliusmarmingejuliusmarminge added the preview:web Deploy a hosted-web preview to Vercel for this PR on every push. label Sep 3, 2026
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Web preview

https://t3code-qedvn2fcf-pinglabs.vercel.app (for 7a0d572)

Open this exact URL — the hosted-app origin is baked in at build time.
Pair a server into it with t3 pair --tailscale, or paste a host + pairing
code under Settings → Connections.

…pse setting
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:01

Dismissing prior approval to re-evaluate 81a18d6

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
…e is off
The wheel handler required the prompt editor to be focused, which was a
proxy for "the composer is expanded" back when unfocused always meant
resting. With blur collapse off an unfocused composer stays expanded and
scrolling could not rest it. Key the eligibility off the resting state
instead.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:14

Dismissing prior approval to re-evaluate 7a0d572

@juliusmarminge
juliusmarminge merged commit 0372836 into mainSep 3, 2026
28 checks passed
@juliusmarminge
juliusmarminge deleted the feat/composer-collapse-settings branch September 3, 2026 21:28
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview:webDeploy a hosted-web preview to Vercel for this PR on every push.size:L100-499 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.

1 participant

@juliusmarminge
, '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

feat(web): let users turn off composer collapse on blur and scroll - #9469

Merged
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings
Sep 3, 2026
Merged

feat(web): let users turn off composer collapse on blur and scroll#9469
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

On web and desktop, an existing thread's composer rests into a single line whenever it loses focus or the conversation is scrolled. Some users want it to stay expanded, and there was no way to opt out of either trigger.

A Settings → General → Collapse composer row now offers a multi-select dropdown of On unfocus / On scroll, backed by two client settings (composerCollapseOnBlur, composerCollapseOnScroll). Both default on, so behavior is unchanged unless a user deselects one. The trigger summarises the selection ("On unfocus, On scroll" / "On scroll" / "Never"). With blur collapse off, losing focus never rests the composer; scrolling still does whenever the composer is expanded, focused or not, and lifts on the next composer interaction. With scroll collapse off, the wheel gesture is never eligible. Both off keeps the composer expanded.

The change lives in shouldUseRestingComposerLayout, which now takes the scroll-collapsed flag and the blur preference as separate inputs instead of folding the scroll state into isFocused. The wheel handler used to require editor focus as a proxy for "expanded"; it now keys off the resting state directly, so scroll can rest an unfocused-but-expanded composer. The settings row, search entry, changed-settings list, restore-defaults, and the user docs follow. SelectItem gains an opt-in showCheck so multi-select popups can show every chosen item; single-select callers are untouched.

Settings

DefaultsOpenNeither selected (reset arrow appears)
settings defaultssettings opensettings never

Before (defaults, unchanged)

Click away from a focused composer → rests into a single line.

before: blur collapses

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c3fdd7b5b652ba2d/demo-before.mp4

After

Blur off, scroll on. Clicking away keeps it expanded; scrolling the conversation still rests it.

Click awayScroll up
blur off stays expandedblur off scroll collapses

Both off. Neither scrolling nor clicking away collapses it.

Scroll upClick away
both off scroll stays expandedboth off blur stays expanded

Demo: toggling both off in Settings, then typing, scrolling up, and clicking away in a thread. (Recorded with an earlier two-switch layout of the row; the control is now the multi-select dropdown above and the composer behavior is identical.)

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e76f183fb7494c0c/demo-after.mp4

Surfaces

  • Web and desktop share this path. Mobile has its own focus-driven collapse and is unaffected; both new keys are client settings, so they are per-device.
  • The Settings → General row, settings search, the changed-settings summary, and Restore defaults all know about the new keys.
  • Docs: docs/user/composer.md.

Verification

  • vp test run on composerFooterLayout.test.ts, settings.test.ts, DesktopClientSettings.test.ts (111 passing).
  • tsgo --noEmit in contracts, web, desktop.
  • Manual pass in the web app against a copy of real data for all four setting combinations (screenshots above).

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Client-only UI preference with defaults preserving current behavior; scope is composer layout and settings, not auth or data.

Overview
Adds Settings → General → Collapse composer, a multi-select for On unfocus and On scroll, backed by client settings composerCollapseOnBlur and composerCollapseOnScroll (both default on, so existing behavior is unchanged until the user opts out).

Resting layout logic in shouldUseRestingComposerLayout now treats blur and scroll as separate inputs: scroll collapse can rest the composer even while it is focused; with blur collapse off, unfocus alone never rests it. Scroll collapse in ChatComposer respects composerCollapseOnScroll, only runs while the composer is expanded (not already resting), and no longer requires the prompt editor to be focused for wheel gestures.

Also adds settings search/reset/changed-settings wiring, contract decode tests, user docs, and an opt-in showCheck on SelectItem for the multi-select UI.

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

Note

Add user settings to toggle composer collapse on blur and scroll

  • Adds composerCollapseOnBlur and composerCollapseOnScroll boolean client settings, both defaulting to true when absent, with independent patch fields in ClientSettingsPatch (settings.ts).
  • Adds a searchable General settings multi-select row for choosing unfocus, scroll, both, or neither as collapse triggers (SettingsPanels.tsx).
  • Updates shouldUseRestingComposerLayout to honor the new preferences: an existing desktop composer rests when scroll-collapsed (even while focused), and unfocus alone rests only when blur collapse is enabled (composerFooterLayout.ts).
  • Adds a showCheck prop to SelectItem so multiple selected options display a check icon (select.tsx).
  • Behavioral Change: disabling blur collapse means an unfocused expanded composer no longer rests on its own; it can still rest after an eligible scroll gesture if scroll collapse remains enabled. Disabling scroll collapse clears the scroll-collapsed state.

Macroscope summarized 7a0d572.

The desktop resting composer collapsed whenever it lost focus or the
conversation was scrolled, with no way to opt out. Two client settings
now gate each trigger independently. Both default on, so nothing
changes unless a user flips them.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threaddocs/user/composer.md Outdated
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.5 KiB−39 B (−0.3%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−41 B (−0.6%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages98−1 (−11.1%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−219 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−226 B (−3.3%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 7a0d572 · 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: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 7a0d572

Macroscope's review found this PR approvable — Adds a client-side, opt-out preference for existing composer-collapse behavior while keeping both triggers enabled by default. Runtime impact is limited to web/desktop layout and settings persistence, with backward-compatible contracts, targeted tests, and no sensitive or deployment-related changes.

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

Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 19:53

Dismissing prior approval to re-evaluate 5893781

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 20:08

Dismissing prior approval to re-evaluate 7037198

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@juliusmarmingejuliusmarminge added the preview:web Deploy a hosted-web preview to Vercel for this PR on every push. label Sep 3, 2026
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Web preview

https://t3code-qedvn2fcf-pinglabs.vercel.app (for 7a0d572)

Open this exact URL — the hosted-app origin is baked in at build time.
Pair a server into it with t3 pair --tailscale, or paste a host + pairing
code under Settings → Connections.

…pse setting
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:01

Dismissing prior approval to re-evaluate 81a18d6

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
…e is off
The wheel handler required the prompt editor to be focused, which was a
proxy for "the composer is expanded" back when unfocused always meant
resting. With blur collapse off an unfocused composer stays expanded and
scrolling could not rest it. Key the eligibility off the resting state
instead.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:14

Dismissing prior approval to re-evaluate 7a0d572

@juliusmarminge
juliusmarminge merged commit 0372836 into mainSep 3, 2026
28 checks passed
@juliusmarminge
juliusmarminge deleted the feat/composer-collapse-settings branch September 3, 2026 21:28
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview:webDeploy a hosted-web preview to Vercel for this PR on every push.size:L100-499 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.

1 participant

@juliusmarminge
, '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

feat(web): let users turn off composer collapse on blur and scroll - #9469

Merged
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings
Sep 3, 2026
Merged

feat(web): let users turn off composer collapse on blur and scroll#9469
juliusmarminge merged 5 commits into
mainfrom
feat/composer-collapse-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

On web and desktop, an existing thread's composer rests into a single line whenever it loses focus or the conversation is scrolled. Some users want it to stay expanded, and there was no way to opt out of either trigger.

A Settings → General → Collapse composer row now offers a multi-select dropdown of On unfocus / On scroll, backed by two client settings (composerCollapseOnBlur, composerCollapseOnScroll). Both default on, so behavior is unchanged unless a user deselects one. The trigger summarises the selection ("On unfocus, On scroll" / "On scroll" / "Never"). With blur collapse off, losing focus never rests the composer; scrolling still does whenever the composer is expanded, focused or not, and lifts on the next composer interaction. With scroll collapse off, the wheel gesture is never eligible. Both off keeps the composer expanded.

The change lives in shouldUseRestingComposerLayout, which now takes the scroll-collapsed flag and the blur preference as separate inputs instead of folding the scroll state into isFocused. The wheel handler used to require editor focus as a proxy for "expanded"; it now keys off the resting state directly, so scroll can rest an unfocused-but-expanded composer. The settings row, search entry, changed-settings list, restore-defaults, and the user docs follow. SelectItem gains an opt-in showCheck so multi-select popups can show every chosen item; single-select callers are untouched.

Settings

DefaultsOpenNeither selected (reset arrow appears)
settings defaultssettings opensettings never

Before (defaults, unchanged)

Click away from a focused composer → rests into a single line.

before: blur collapses

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c3fdd7b5b652ba2d/demo-before.mp4

After

Blur off, scroll on. Clicking away keeps it expanded; scrolling the conversation still rests it.

Click awayScroll up
blur off stays expandedblur off scroll collapses

Both off. Neither scrolling nor clicking away collapses it.

Scroll upClick away
both off scroll stays expandedboth off blur stays expanded

Demo: toggling both off in Settings, then typing, scrolling up, and clicking away in a thread. (Recorded with an earlier two-switch layout of the row; the control is now the multi-select dropdown above and the composer behavior is identical.)

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e76f183fb7494c0c/demo-after.mp4

Surfaces

  • Web and desktop share this path. Mobile has its own focus-driven collapse and is unaffected; both new keys are client settings, so they are per-device.
  • The Settings → General row, settings search, the changed-settings summary, and Restore defaults all know about the new keys.
  • Docs: docs/user/composer.md.

Verification

  • vp test run on composerFooterLayout.test.ts, settings.test.ts, DesktopClientSettings.test.ts (111 passing).
  • tsgo --noEmit in contracts, web, desktop.
  • Manual pass in the web app against a copy of real data for all four setting combinations (screenshots above).

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Client-only UI preference with defaults preserving current behavior; scope is composer layout and settings, not auth or data.

Overview
Adds Settings → General → Collapse composer, a multi-select for On unfocus and On scroll, backed by client settings composerCollapseOnBlur and composerCollapseOnScroll (both default on, so existing behavior is unchanged until the user opts out).

Resting layout logic in shouldUseRestingComposerLayout now treats blur and scroll as separate inputs: scroll collapse can rest the composer even while it is focused; with blur collapse off, unfocus alone never rests it. Scroll collapse in ChatComposer respects composerCollapseOnScroll, only runs while the composer is expanded (not already resting), and no longer requires the prompt editor to be focused for wheel gestures.

Also adds settings search/reset/changed-settings wiring, contract decode tests, user docs, and an opt-in showCheck on SelectItem for the multi-select UI.

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

Note

Add user settings to toggle composer collapse on blur and scroll

  • Adds composerCollapseOnBlur and composerCollapseOnScroll boolean client settings, both defaulting to true when absent, with independent patch fields in ClientSettingsPatch (settings.ts).
  • Adds a searchable General settings multi-select row for choosing unfocus, scroll, both, or neither as collapse triggers (SettingsPanels.tsx).
  • Updates shouldUseRestingComposerLayout to honor the new preferences: an existing desktop composer rests when scroll-collapsed (even while focused), and unfocus alone rests only when blur collapse is enabled (composerFooterLayout.ts).
  • Adds a showCheck prop to SelectItem so multiple selected options display a check icon (select.tsx).
  • Behavioral Change: disabling blur collapse means an unfocused expanded composer no longer rests on its own; it can still rest after an eligible scroll gesture if scroll collapse remains enabled. Disabling scroll collapse clears the scroll-collapsed state.

Macroscope summarized 7a0d572.

The desktop resting composer collapsed whenever it lost focus or the
conversation was scrolled, with no way to opt out. Two client settings
now gate each trigger independently. Both default on, so nothing
changes unless a user flips them.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threaddocs/user/composer.md Outdated
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.5 KiB−39 B (−0.3%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−41 B (−0.6%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages98−1 (−11.1%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−219 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−226 B (−3.3%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 7a0d572 · 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: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 7a0d572

Macroscope's review found this PR approvable — Adds a client-side, opt-out preference for existing composer-collapse behavior while keeping both triggers enabled by default. Runtime impact is limited to web/desktop layout and settings persistence, with backward-compatible contracts, targeted tests, and no sensitive or deployment-related changes.

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

Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 19:53

Dismissing prior approval to re-evaluate 5893781

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 20:08

Dismissing prior approval to re-evaluate 7037198

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Sep 3, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
@juliusmarmingejuliusmarminge added the preview:web Deploy a hosted-web preview to Vercel for this PR on every push. label Sep 3, 2026
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Web preview

https://t3code-qedvn2fcf-pinglabs.vercel.app (for 7a0d572)

Open this exact URL — the hosted-app origin is baked in at build time.
Pair a server into it with t3 pair --tailscale, or paste a host + pairing
code under Settings → Connections.

…pse setting
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:01

Dismissing prior approval to re-evaluate 81a18d6

macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 3, 2026
…e is off
The wheel handler required the prompt editor to be focused, which was a
proxy for "the composer is expanded" back when unfocused always meant
resting. With blur collapse off an unfocused composer stays expanded and
scrolling could not rest it. Key the eligibility off the resting state
instead.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 3, 2026 21:14

Dismissing prior approval to re-evaluate 7a0d572

@juliusmarminge
juliusmarminge merged commit 0372836 into mainSep 3, 2026
28 checks passed
@juliusmarminge
juliusmarminge deleted the feat/composer-collapse-settings branch September 3, 2026 21:28
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview:webDeploy a hosted-web preview to Vercel for this PR on every push.size:L100-499 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.

1 participant

@juliusmarminge