fix(mobile): prevent header overflow and back-button artifacts - #8624

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout
Aug 29, 2026
Merged

fix(mobile): prevent header overflow and back-button artifacts#8624
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 29, 2026

Copy link
Copy Markdown
Member

Why

Long connection-status content can crowd the iOS header, hide its leading content, and turn the direct Settings button into UIKit's overflow menu. Separately, iOS 26.5 morphs the custom leading brand item's rectangle into the next screen's glass back button during navigation.

What Changed

  • Render the brand and connection status in the native title slot, separate from toolbar buttons and Back.
  • Bound status width using the header's available width and trailing actions, including the iPad sidebar's pane width. Preserve the full accessibility label.
  • Preserve the native scroll-edge fade with a non-interactive, empty native label matching the custom title's bounds. Keep Fabric child mounting indices intact.
  • Document the title-slot behavior and native rebuild requirements.

Verification

Fresh native Debug build on iPhone 17 Pro, iOS 26.5, using a disposable local environment:

  • Three Settings → thread → Back cycles: direct Settings presentation, visible thread actions, and restored branding.
  • Native edge-swipe Back and frame-by-frame push/pop inspection: no rectangular back-button morph.
  • Accessibility-large text while disconnected: visible, truncated status; no overflow menu; Settings opens directly.
  • Status-title tap opens Environments; reconnecting restores the brand.
  • Scrolled content retains the blur behind the brand.
  • Existing connection-status tests: 8 passed (vp test run apps/mobile/src/features/home/workspace-connection-status.test.ts).
  • Mobile typecheck, targeted lint/formatting, and git diff --check passed.

UI Changes

Header-only crops from the simulator recordings:

Before — the leading rectangle morphs into Back:

Before: rectangular header transition

After — Back remains a separate round control:

After: round back-button transition

Before recording · After push/pop recording

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included videos for animation/interaction changes

Requires a native dev-client rebuild. Refresh CocoaPods after installing the updated patch; a Metro reload alone cannot apply the native change.


Note

Medium Risk
Changes core iOS navigation header rendering and ships a native dependency patch; incorrect title/fade behavior would affect every Home/sidebar session and requires a full iOS rebuild to deploy.

Overview
Moves iOS Home and sidebar branding off custom leading toolbar items and into the native headerTitle slot, so the glass back button no longer morphs from the brand rectangle on push/pop (iOS 26.5). Liquid Glass–specific paths (unstable_headerLeftItems, transparent title, BRAND_HEADER_ITEM_IDENTIFIER) are removed from CompactBrandTitle and getConnectionAwareBrandHeaderOptions.

Connection-status headers are width-bounded using available header width minus trailing bar actions (headerWidth, trailingItemCount), with truncation/flexShrink so long labels do not force Settings into UIKit’s overflow menu. Home passes window width; the iPad sidebar passes pane width and refreshes options when width or header items change.

The react-native-screens patch adds an empty native UILabel guide on title/center header subviews (iOS 26) so scroll-edge fade geometry works with Fabric custom title views without drawing over the brand. Internal docs describe the title-slot policy and note that a native dev-client rebuild (CocoaPods refresh) is required for the patch.

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

Note

Fix header overflow and back-button artifacts by moving brand title to headerTitle slot

  • Moves brand and connection-status rendering from unstable_headerLeftItems to the headerTitle slot across Home and iPad sidebar headers, avoiding UIKit toolbar-item behavior on iOS 26.5.
  • Simplifies brandTitleOffset() to return IPAD_HOME_TITLE_OFFSET on iPad and 0 elsewhere; removes the native-leading-item offset path and deletes renderCompactBrandHeaderItems.
  • Adds maxWidth support to WorkspaceConnectionTitle and StatusFadeIn so long labels truncate within available header space; HomeRouteScreen and ThreadNavigationSidebarPane recompute header options on width changes.
  • Patches react-native-screens@4.26.2 so iOS 26+ custom title/center subviews contribute geometry for UIKit's scroll-edge fade and support UIBarButtonItem.identifier for transition matching.
  • Risk: getCompactBrandHeaderOptions always sets unstable_headerLeftItems to undefined; any caller that previously relied on renderCompactBrandHeaderItems for custom leading items will no longer render them.

Macroscope summarized eed8204.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d1a3bafd-5e9a-41c6-98b3-c12abe4b1239

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@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). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 29, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−11 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−13 B (−0.2%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages11110 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.4 KiB+86 B (+0.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.5 KiB+83 B (+1.3%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB+88 B (+0.2%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: d22709f · PR result: eed8204 · Source CI: success

Scenario and decoded snapshot size

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

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

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

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The PR is a focused mobile header fix, but it replaces existing Home/iPad navigation-header behavior and changes shared iOS 26 native header rendering through a dependency patch. That production runtime surface and required native rebuild make it broader than an auto-approvable UI adjustment.

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

@juliusmarminge

Copy link
Copy Markdown
MemberAuthor

Additional verification: scroll-edge blur and header fade

Compared native Debug builds of the PR base (d22709f75) and this PR (eed8204a1) on the same iPhone 17 Pro / iOS 26.5 simulator, with the same populated thread list and swipe sequence, in light and dark appearances.

No visible regression observed:

  • Content progressively blurs and fades beneath the header; the foreground brand stays crisp and readable.
  • The bottom search/filter/compose toolbar retains its blur over the scrolling content.
  • Scrolling back to the top restores the clear at-top header state, as before.

These recordings exercise scrolling under the header, not just the push/pop transition. No code changes were needed for this verification pass.

Recordings

AppearanceBefore (PR base)This PR
Light30-second scroll recording30-second scroll recording
Dark30-second scroll recording30-second scroll recording

Matching scrolled states

Light appearance: before / PR
BeforeThis PR
Before: light scroll-edge blurPR: light scroll-edge blur
Dark appearance: before / PR
BeforeThis PR
Before: dark scroll-edge blurPR: dark scroll-edge blur

@juliusmarminge
juliusmarminge merged commit 053affb into mainAug 29, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-header-title-layout branch August 29, 2026 06:27
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(mobile): prevent header overflow and back-button artifacts - #8624

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout
Aug 29, 2026
Merged

fix(mobile): prevent header overflow and back-button artifacts#8624
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 29, 2026

Copy link
Copy Markdown
Member

Why

Long connection-status content can crowd the iOS header, hide its leading content, and turn the direct Settings button into UIKit's overflow menu. Separately, iOS 26.5 morphs the custom leading brand item's rectangle into the next screen's glass back button during navigation.

What Changed

  • Render the brand and connection status in the native title slot, separate from toolbar buttons and Back.
  • Bound status width using the header's available width and trailing actions, including the iPad sidebar's pane width. Preserve the full accessibility label.
  • Preserve the native scroll-edge fade with a non-interactive, empty native label matching the custom title's bounds. Keep Fabric child mounting indices intact.
  • Document the title-slot behavior and native rebuild requirements.

Verification

Fresh native Debug build on iPhone 17 Pro, iOS 26.5, using a disposable local environment:

  • Three Settings → thread → Back cycles: direct Settings presentation, visible thread actions, and restored branding.
  • Native edge-swipe Back and frame-by-frame push/pop inspection: no rectangular back-button morph.
  • Accessibility-large text while disconnected: visible, truncated status; no overflow menu; Settings opens directly.
  • Status-title tap opens Environments; reconnecting restores the brand.
  • Scrolled content retains the blur behind the brand.
  • Existing connection-status tests: 8 passed (vp test run apps/mobile/src/features/home/workspace-connection-status.test.ts).
  • Mobile typecheck, targeted lint/formatting, and git diff --check passed.

UI Changes

Header-only crops from the simulator recordings:

Before — the leading rectangle morphs into Back:

Before: rectangular header transition

After — Back remains a separate round control:

After: round back-button transition

Before recording · After push/pop recording

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included videos for animation/interaction changes

Requires a native dev-client rebuild. Refresh CocoaPods after installing the updated patch; a Metro reload alone cannot apply the native change.


Note

Medium Risk
Changes core iOS navigation header rendering and ships a native dependency patch; incorrect title/fade behavior would affect every Home/sidebar session and requires a full iOS rebuild to deploy.

Overview
Moves iOS Home and sidebar branding off custom leading toolbar items and into the native headerTitle slot, so the glass back button no longer morphs from the brand rectangle on push/pop (iOS 26.5). Liquid Glass–specific paths (unstable_headerLeftItems, transparent title, BRAND_HEADER_ITEM_IDENTIFIER) are removed from CompactBrandTitle and getConnectionAwareBrandHeaderOptions.

Connection-status headers are width-bounded using available header width minus trailing bar actions (headerWidth, trailingItemCount), with truncation/flexShrink so long labels do not force Settings into UIKit’s overflow menu. Home passes window width; the iPad sidebar passes pane width and refreshes options when width or header items change.

The react-native-screens patch adds an empty native UILabel guide on title/center header subviews (iOS 26) so scroll-edge fade geometry works with Fabric custom title views without drawing over the brand. Internal docs describe the title-slot policy and note that a native dev-client rebuild (CocoaPods refresh) is required for the patch.

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

Note

Fix header overflow and back-button artifacts by moving brand title to headerTitle slot

  • Moves brand and connection-status rendering from unstable_headerLeftItems to the headerTitle slot across Home and iPad sidebar headers, avoiding UIKit toolbar-item behavior on iOS 26.5.
  • Simplifies brandTitleOffset() to return IPAD_HOME_TITLE_OFFSET on iPad and 0 elsewhere; removes the native-leading-item offset path and deletes renderCompactBrandHeaderItems.
  • Adds maxWidth support to WorkspaceConnectionTitle and StatusFadeIn so long labels truncate within available header space; HomeRouteScreen and ThreadNavigationSidebarPane recompute header options on width changes.
  • Patches react-native-screens@4.26.2 so iOS 26+ custom title/center subviews contribute geometry for UIKit's scroll-edge fade and support UIBarButtonItem.identifier for transition matching.
  • Risk: getCompactBrandHeaderOptions always sets unstable_headerLeftItems to undefined; any caller that previously relied on renderCompactBrandHeaderItems for custom leading items will no longer render them.

Macroscope summarized eed8204.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d1a3bafd-5e9a-41c6-98b3-c12abe4b1239

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@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). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 29, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−11 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−13 B (−0.2%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages11110 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.4 KiB+86 B (+0.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.5 KiB+83 B (+1.3%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB+88 B (+0.2%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: d22709f · PR result: eed8204 · Source CI: success

Scenario and decoded snapshot size

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

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

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

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The PR is a focused mobile header fix, but it replaces existing Home/iPad navigation-header behavior and changes shared iOS 26 native header rendering through a dependency patch. That production runtime surface and required native rebuild make it broader than an auto-approvable UI adjustment.

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

@juliusmarminge

Copy link
Copy Markdown
MemberAuthor

Additional verification: scroll-edge blur and header fade

Compared native Debug builds of the PR base (d22709f75) and this PR (eed8204a1) on the same iPhone 17 Pro / iOS 26.5 simulator, with the same populated thread list and swipe sequence, in light and dark appearances.

No visible regression observed:

  • Content progressively blurs and fades beneath the header; the foreground brand stays crisp and readable.
  • The bottom search/filter/compose toolbar retains its blur over the scrolling content.
  • Scrolling back to the top restores the clear at-top header state, as before.

These recordings exercise scrolling under the header, not just the push/pop transition. No code changes were needed for this verification pass.

Recordings

AppearanceBefore (PR base)This PR
Light30-second scroll recording30-second scroll recording
Dark30-second scroll recording30-second scroll recording

Matching scrolled states

Light appearance: before / PR
BeforeThis PR
Before: light scroll-edge blurPR: light scroll-edge blur
Dark appearance: before / PR
BeforeThis PR
Before: dark scroll-edge blurPR: dark scroll-edge blur

@juliusmarminge
juliusmarminge merged commit 053affb into mainAug 29, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-header-title-layout branch August 29, 2026 06:27
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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

fix(mobile): prevent header overflow and back-button artifacts - #8624

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout
Aug 29, 2026
Merged

fix(mobile): prevent header overflow and back-button artifacts#8624
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 29, 2026

Copy link
Copy Markdown
Member

Why

Long connection-status content can crowd the iOS header, hide its leading content, and turn the direct Settings button into UIKit's overflow menu. Separately, iOS 26.5 morphs the custom leading brand item's rectangle into the next screen's glass back button during navigation.

What Changed

  • Render the brand and connection status in the native title slot, separate from toolbar buttons and Back.
  • Bound status width using the header's available width and trailing actions, including the iPad sidebar's pane width. Preserve the full accessibility label.
  • Preserve the native scroll-edge fade with a non-interactive, empty native label matching the custom title's bounds. Keep Fabric child mounting indices intact.
  • Document the title-slot behavior and native rebuild requirements.

Verification

Fresh native Debug build on iPhone 17 Pro, iOS 26.5, using a disposable local environment:

  • Three Settings → thread → Back cycles: direct Settings presentation, visible thread actions, and restored branding.
  • Native edge-swipe Back and frame-by-frame push/pop inspection: no rectangular back-button morph.
  • Accessibility-large text while disconnected: visible, truncated status; no overflow menu; Settings opens directly.
  • Status-title tap opens Environments; reconnecting restores the brand.
  • Scrolled content retains the blur behind the brand.
  • Existing connection-status tests: 8 passed (vp test run apps/mobile/src/features/home/workspace-connection-status.test.ts).
  • Mobile typecheck, targeted lint/formatting, and git diff --check passed.

UI Changes

Header-only crops from the simulator recordings:

Before — the leading rectangle morphs into Back:

Before: rectangular header transition

After — Back remains a separate round control:

After: round back-button transition

Before recording · After push/pop recording

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included videos for animation/interaction changes

Requires a native dev-client rebuild. Refresh CocoaPods after installing the updated patch; a Metro reload alone cannot apply the native change.


Note

Medium Risk
Changes core iOS navigation header rendering and ships a native dependency patch; incorrect title/fade behavior would affect every Home/sidebar session and requires a full iOS rebuild to deploy.

Overview
Moves iOS Home and sidebar branding off custom leading toolbar items and into the native headerTitle slot, so the glass back button no longer morphs from the brand rectangle on push/pop (iOS 26.5). Liquid Glass–specific paths (unstable_headerLeftItems, transparent title, BRAND_HEADER_ITEM_IDENTIFIER) are removed from CompactBrandTitle and getConnectionAwareBrandHeaderOptions.

Connection-status headers are width-bounded using available header width minus trailing bar actions (headerWidth, trailingItemCount), with truncation/flexShrink so long labels do not force Settings into UIKit’s overflow menu. Home passes window width; the iPad sidebar passes pane width and refreshes options when width or header items change.

The react-native-screens patch adds an empty native UILabel guide on title/center header subviews (iOS 26) so scroll-edge fade geometry works with Fabric custom title views without drawing over the brand. Internal docs describe the title-slot policy and note that a native dev-client rebuild (CocoaPods refresh) is required for the patch.

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

Note

Fix header overflow and back-button artifacts by moving brand title to headerTitle slot

  • Moves brand and connection-status rendering from unstable_headerLeftItems to the headerTitle slot across Home and iPad sidebar headers, avoiding UIKit toolbar-item behavior on iOS 26.5.
  • Simplifies brandTitleOffset() to return IPAD_HOME_TITLE_OFFSET on iPad and 0 elsewhere; removes the native-leading-item offset path and deletes renderCompactBrandHeaderItems.
  • Adds maxWidth support to WorkspaceConnectionTitle and StatusFadeIn so long labels truncate within available header space; HomeRouteScreen and ThreadNavigationSidebarPane recompute header options on width changes.
  • Patches react-native-screens@4.26.2 so iOS 26+ custom title/center subviews contribute geometry for UIKit's scroll-edge fade and support UIBarButtonItem.identifier for transition matching.
  • Risk: getCompactBrandHeaderOptions always sets unstable_headerLeftItems to undefined; any caller that previously relied on renderCompactBrandHeaderItems for custom leading items will no longer render them.

Macroscope summarized eed8204.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d1a3bafd-5e9a-41c6-98b3-c12abe4b1239

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@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). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 29, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−11 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−13 B (−0.2%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages11110 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.4 KiB+86 B (+0.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.5 KiB+83 B (+1.3%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB+88 B (+0.2%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: d22709f · PR result: eed8204 · Source CI: success

Scenario and decoded snapshot size

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

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

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

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The PR is a focused mobile header fix, but it replaces existing Home/iPad navigation-header behavior and changes shared iOS 26 native header rendering through a dependency patch. That production runtime surface and required native rebuild make it broader than an auto-approvable UI adjustment.

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

@juliusmarminge

Copy link
Copy Markdown
MemberAuthor

Additional verification: scroll-edge blur and header fade

Compared native Debug builds of the PR base (d22709f75) and this PR (eed8204a1) on the same iPhone 17 Pro / iOS 26.5 simulator, with the same populated thread list and swipe sequence, in light and dark appearances.

No visible regression observed:

  • Content progressively blurs and fades beneath the header; the foreground brand stays crisp and readable.
  • The bottom search/filter/compose toolbar retains its blur over the scrolling content.
  • Scrolling back to the top restores the clear at-top header state, as before.

These recordings exercise scrolling under the header, not just the push/pop transition. No code changes were needed for this verification pass.

Recordings

AppearanceBefore (PR base)This PR
Light30-second scroll recording30-second scroll recording
Dark30-second scroll recording30-second scroll recording

Matching scrolled states

Light appearance: before / PR
BeforeThis PR
Before: light scroll-edge blurPR: light scroll-edge blur
Dark appearance: before / PR
BeforeThis PR
Before: dark scroll-edge blurPR: dark scroll-edge blur

@juliusmarminge
juliusmarminge merged commit 053affb into mainAug 29, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-header-title-layout branch August 29, 2026 06:27
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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 > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(mobile): prevent header overflow and back-button artifacts - #8624

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout
Aug 29, 2026
Merged

fix(mobile): prevent header overflow and back-button artifacts#8624
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 29, 2026

Copy link
Copy Markdown
Member

Why

Long connection-status content can crowd the iOS header, hide its leading content, and turn the direct Settings button into UIKit's overflow menu. Separately, iOS 26.5 morphs the custom leading brand item's rectangle into the next screen's glass back button during navigation.

What Changed

  • Render the brand and connection status in the native title slot, separate from toolbar buttons and Back.
  • Bound status width using the header's available width and trailing actions, including the iPad sidebar's pane width. Preserve the full accessibility label.
  • Preserve the native scroll-edge fade with a non-interactive, empty native label matching the custom title's bounds. Keep Fabric child mounting indices intact.
  • Document the title-slot behavior and native rebuild requirements.

Verification

Fresh native Debug build on iPhone 17 Pro, iOS 26.5, using a disposable local environment:

  • Three Settings → thread → Back cycles: direct Settings presentation, visible thread actions, and restored branding.
  • Native edge-swipe Back and frame-by-frame push/pop inspection: no rectangular back-button morph.
  • Accessibility-large text while disconnected: visible, truncated status; no overflow menu; Settings opens directly.
  • Status-title tap opens Environments; reconnecting restores the brand.
  • Scrolled content retains the blur behind the brand.
  • Existing connection-status tests: 8 passed (vp test run apps/mobile/src/features/home/workspace-connection-status.test.ts).
  • Mobile typecheck, targeted lint/formatting, and git diff --check passed.

UI Changes

Header-only crops from the simulator recordings:

Before — the leading rectangle morphs into Back:

Before: rectangular header transition

After — Back remains a separate round control:

After: round back-button transition

Before recording · After push/pop recording

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included videos for animation/interaction changes

Requires a native dev-client rebuild. Refresh CocoaPods after installing the updated patch; a Metro reload alone cannot apply the native change.


Note

Medium Risk
Changes core iOS navigation header rendering and ships a native dependency patch; incorrect title/fade behavior would affect every Home/sidebar session and requires a full iOS rebuild to deploy.

Overview
Moves iOS Home and sidebar branding off custom leading toolbar items and into the native headerTitle slot, so the glass back button no longer morphs from the brand rectangle on push/pop (iOS 26.5). Liquid Glass–specific paths (unstable_headerLeftItems, transparent title, BRAND_HEADER_ITEM_IDENTIFIER) are removed from CompactBrandTitle and getConnectionAwareBrandHeaderOptions.

Connection-status headers are width-bounded using available header width minus trailing bar actions (headerWidth, trailingItemCount), with truncation/flexShrink so long labels do not force Settings into UIKit’s overflow menu. Home passes window width; the iPad sidebar passes pane width and refreshes options when width or header items change.

The react-native-screens patch adds an empty native UILabel guide on title/center header subviews (iOS 26) so scroll-edge fade geometry works with Fabric custom title views without drawing over the brand. Internal docs describe the title-slot policy and note that a native dev-client rebuild (CocoaPods refresh) is required for the patch.

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

Note

Fix header overflow and back-button artifacts by moving brand title to headerTitle slot

  • Moves brand and connection-status rendering from unstable_headerLeftItems to the headerTitle slot across Home and iPad sidebar headers, avoiding UIKit toolbar-item behavior on iOS 26.5.
  • Simplifies brandTitleOffset() to return IPAD_HOME_TITLE_OFFSET on iPad and 0 elsewhere; removes the native-leading-item offset path and deletes renderCompactBrandHeaderItems.
  • Adds maxWidth support to WorkspaceConnectionTitle and StatusFadeIn so long labels truncate within available header space; HomeRouteScreen and ThreadNavigationSidebarPane recompute header options on width changes.
  • Patches react-native-screens@4.26.2 so iOS 26+ custom title/center subviews contribute geometry for UIKit's scroll-edge fade and support UIBarButtonItem.identifier for transition matching.
  • Risk: getCompactBrandHeaderOptions always sets unstable_headerLeftItems to undefined; any caller that previously relied on renderCompactBrandHeaderItems for custom leading items will no longer render them.

Macroscope summarized eed8204.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d1a3bafd-5e9a-41c6-98b3-c12abe4b1239

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@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). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 29, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−11 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−13 B (−0.2%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages11110 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.4 KiB+86 B (+0.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.5 KiB+83 B (+1.3%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB+88 B (+0.2%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: d22709f · PR result: eed8204 · Source CI: success

Scenario and decoded snapshot size

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

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

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

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The PR is a focused mobile header fix, but it replaces existing Home/iPad navigation-header behavior and changes shared iOS 26 native header rendering through a dependency patch. That production runtime surface and required native rebuild make it broader than an auto-approvable UI adjustment.

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

@juliusmarminge

Copy link
Copy Markdown
MemberAuthor

Additional verification: scroll-edge blur and header fade

Compared native Debug builds of the PR base (d22709f75) and this PR (eed8204a1) on the same iPhone 17 Pro / iOS 26.5 simulator, with the same populated thread list and swipe sequence, in light and dark appearances.

No visible regression observed:

  • Content progressively blurs and fades beneath the header; the foreground brand stays crisp and readable.
  • The bottom search/filter/compose toolbar retains its blur over the scrolling content.
  • Scrolling back to the top restores the clear at-top header state, as before.

These recordings exercise scrolling under the header, not just the push/pop transition. No code changes were needed for this verification pass.

Recordings

AppearanceBefore (PR base)This PR
Light30-second scroll recording30-second scroll recording
Dark30-second scroll recording30-second scroll recording

Matching scrolled states

Light appearance: before / PR
BeforeThis PR
Before: light scroll-edge blurPR: light scroll-edge blur
Dark appearance: before / PR
BeforeThis PR
Before: dark scroll-edge blurPR: dark scroll-edge blur

@juliusmarminge
juliusmarminge merged commit 053affb into mainAug 29, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-header-title-layout branch August 29, 2026 06:27
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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

fix(mobile): prevent header overflow and back-button artifacts - #8624

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout
Aug 29, 2026
Merged

fix(mobile): prevent header overflow and back-button artifacts#8624
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 29, 2026

Copy link
Copy Markdown
Member

Why

Long connection-status content can crowd the iOS header, hide its leading content, and turn the direct Settings button into UIKit's overflow menu. Separately, iOS 26.5 morphs the custom leading brand item's rectangle into the next screen's glass back button during navigation.

What Changed

  • Render the brand and connection status in the native title slot, separate from toolbar buttons and Back.
  • Bound status width using the header's available width and trailing actions, including the iPad sidebar's pane width. Preserve the full accessibility label.
  • Preserve the native scroll-edge fade with a non-interactive, empty native label matching the custom title's bounds. Keep Fabric child mounting indices intact.
  • Document the title-slot behavior and native rebuild requirements.

Verification

Fresh native Debug build on iPhone 17 Pro, iOS 26.5, using a disposable local environment:

  • Three Settings → thread → Back cycles: direct Settings presentation, visible thread actions, and restored branding.
  • Native edge-swipe Back and frame-by-frame push/pop inspection: no rectangular back-button morph.
  • Accessibility-large text while disconnected: visible, truncated status; no overflow menu; Settings opens directly.
  • Status-title tap opens Environments; reconnecting restores the brand.
  • Scrolled content retains the blur behind the brand.
  • Existing connection-status tests: 8 passed (vp test run apps/mobile/src/features/home/workspace-connection-status.test.ts).
  • Mobile typecheck, targeted lint/formatting, and git diff --check passed.

UI Changes

Header-only crops from the simulator recordings:

Before — the leading rectangle morphs into Back:

Before: rectangular header transition

After — Back remains a separate round control:

After: round back-button transition

Before recording · After push/pop recording

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included videos for animation/interaction changes

Requires a native dev-client rebuild. Refresh CocoaPods after installing the updated patch; a Metro reload alone cannot apply the native change.


Note

Medium Risk
Changes core iOS navigation header rendering and ships a native dependency patch; incorrect title/fade behavior would affect every Home/sidebar session and requires a full iOS rebuild to deploy.

Overview
Moves iOS Home and sidebar branding off custom leading toolbar items and into the native headerTitle slot, so the glass back button no longer morphs from the brand rectangle on push/pop (iOS 26.5). Liquid Glass–specific paths (unstable_headerLeftItems, transparent title, BRAND_HEADER_ITEM_IDENTIFIER) are removed from CompactBrandTitle and getConnectionAwareBrandHeaderOptions.

Connection-status headers are width-bounded using available header width minus trailing bar actions (headerWidth, trailingItemCount), with truncation/flexShrink so long labels do not force Settings into UIKit’s overflow menu. Home passes window width; the iPad sidebar passes pane width and refreshes options when width or header items change.

The react-native-screens patch adds an empty native UILabel guide on title/center header subviews (iOS 26) so scroll-edge fade geometry works with Fabric custom title views without drawing over the brand. Internal docs describe the title-slot policy and note that a native dev-client rebuild (CocoaPods refresh) is required for the patch.

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

Note

Fix header overflow and back-button artifacts by moving brand title to headerTitle slot

  • Moves brand and connection-status rendering from unstable_headerLeftItems to the headerTitle slot across Home and iPad sidebar headers, avoiding UIKit toolbar-item behavior on iOS 26.5.
  • Simplifies brandTitleOffset() to return IPAD_HOME_TITLE_OFFSET on iPad and 0 elsewhere; removes the native-leading-item offset path and deletes renderCompactBrandHeaderItems.
  • Adds maxWidth support to WorkspaceConnectionTitle and StatusFadeIn so long labels truncate within available header space; HomeRouteScreen and ThreadNavigationSidebarPane recompute header options on width changes.
  • Patches react-native-screens@4.26.2 so iOS 26+ custom title/center subviews contribute geometry for UIKit's scroll-edge fade and support UIBarButtonItem.identifier for transition matching.
  • Risk: getCompactBrandHeaderOptions always sets unstable_headerLeftItems to undefined; any caller that previously relied on renderCompactBrandHeaderItems for custom leading items will no longer render them.

Macroscope summarized eed8204.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d1a3bafd-5e9a-41c6-98b3-c12abe4b1239

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@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). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 29, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−11 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−13 B (−0.2%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages11110 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.4 KiB+86 B (+0.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.5 KiB+83 B (+1.3%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB+88 B (+0.2%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: d22709f · PR result: eed8204 · Source CI: success

Scenario and decoded snapshot size

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

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

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

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The PR is a focused mobile header fix, but it replaces existing Home/iPad navigation-header behavior and changes shared iOS 26 native header rendering through a dependency patch. That production runtime surface and required native rebuild make it broader than an auto-approvable UI adjustment.

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

@juliusmarminge

Copy link
Copy Markdown
MemberAuthor

Additional verification: scroll-edge blur and header fade

Compared native Debug builds of the PR base (d22709f75) and this PR (eed8204a1) on the same iPhone 17 Pro / iOS 26.5 simulator, with the same populated thread list and swipe sequence, in light and dark appearances.

No visible regression observed:

  • Content progressively blurs and fades beneath the header; the foreground brand stays crisp and readable.
  • The bottom search/filter/compose toolbar retains its blur over the scrolling content.
  • Scrolling back to the top restores the clear at-top header state, as before.

These recordings exercise scrolling under the header, not just the push/pop transition. No code changes were needed for this verification pass.

Recordings

AppearanceBefore (PR base)This PR
Light30-second scroll recording30-second scroll recording
Dark30-second scroll recording30-second scroll recording

Matching scrolled states

Light appearance: before / PR
BeforeThis PR
Before: light scroll-edge blurPR: light scroll-edge blur
Dark appearance: before / PR
BeforeThis PR
Before: dark scroll-edge blurPR: dark scroll-edge blur

@juliusmarminge
juliusmarminge merged commit 053affb into mainAug 29, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-header-title-layout branch August 29, 2026 06:27
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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

fix(mobile): prevent header overflow and back-button artifacts - #8624

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout
Aug 29, 2026
Merged

fix(mobile): prevent header overflow and back-button artifacts#8624
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 29, 2026

Copy link
Copy Markdown
Member

Why

Long connection-status content can crowd the iOS header, hide its leading content, and turn the direct Settings button into UIKit's overflow menu. Separately, iOS 26.5 morphs the custom leading brand item's rectangle into the next screen's glass back button during navigation.

What Changed

  • Render the brand and connection status in the native title slot, separate from toolbar buttons and Back.
  • Bound status width using the header's available width and trailing actions, including the iPad sidebar's pane width. Preserve the full accessibility label.
  • Preserve the native scroll-edge fade with a non-interactive, empty native label matching the custom title's bounds. Keep Fabric child mounting indices intact.
  • Document the title-slot behavior and native rebuild requirements.

Verification

Fresh native Debug build on iPhone 17 Pro, iOS 26.5, using a disposable local environment:

  • Three Settings → thread → Back cycles: direct Settings presentation, visible thread actions, and restored branding.
  • Native edge-swipe Back and frame-by-frame push/pop inspection: no rectangular back-button morph.
  • Accessibility-large text while disconnected: visible, truncated status; no overflow menu; Settings opens directly.
  • Status-title tap opens Environments; reconnecting restores the brand.
  • Scrolled content retains the blur behind the brand.
  • Existing connection-status tests: 8 passed (vp test run apps/mobile/src/features/home/workspace-connection-status.test.ts).
  • Mobile typecheck, targeted lint/formatting, and git diff --check passed.

UI Changes

Header-only crops from the simulator recordings:

Before — the leading rectangle morphs into Back:

Before: rectangular header transition

After — Back remains a separate round control:

After: round back-button transition

Before recording · After push/pop recording

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included videos for animation/interaction changes

Requires a native dev-client rebuild. Refresh CocoaPods after installing the updated patch; a Metro reload alone cannot apply the native change.


Note

Medium Risk
Changes core iOS navigation header rendering and ships a native dependency patch; incorrect title/fade behavior would affect every Home/sidebar session and requires a full iOS rebuild to deploy.

Overview
Moves iOS Home and sidebar branding off custom leading toolbar items and into the native headerTitle slot, so the glass back button no longer morphs from the brand rectangle on push/pop (iOS 26.5). Liquid Glass–specific paths (unstable_headerLeftItems, transparent title, BRAND_HEADER_ITEM_IDENTIFIER) are removed from CompactBrandTitle and getConnectionAwareBrandHeaderOptions.

Connection-status headers are width-bounded using available header width minus trailing bar actions (headerWidth, trailingItemCount), with truncation/flexShrink so long labels do not force Settings into UIKit’s overflow menu. Home passes window width; the iPad sidebar passes pane width and refreshes options when width or header items change.

The react-native-screens patch adds an empty native UILabel guide on title/center header subviews (iOS 26) so scroll-edge fade geometry works with Fabric custom title views without drawing over the brand. Internal docs describe the title-slot policy and note that a native dev-client rebuild (CocoaPods refresh) is required for the patch.

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

Note

Fix header overflow and back-button artifacts by moving brand title to headerTitle slot

  • Moves brand and connection-status rendering from unstable_headerLeftItems to the headerTitle slot across Home and iPad sidebar headers, avoiding UIKit toolbar-item behavior on iOS 26.5.
  • Simplifies brandTitleOffset() to return IPAD_HOME_TITLE_OFFSET on iPad and 0 elsewhere; removes the native-leading-item offset path and deletes renderCompactBrandHeaderItems.
  • Adds maxWidth support to WorkspaceConnectionTitle and StatusFadeIn so long labels truncate within available header space; HomeRouteScreen and ThreadNavigationSidebarPane recompute header options on width changes.
  • Patches react-native-screens@4.26.2 so iOS 26+ custom title/center subviews contribute geometry for UIKit's scroll-edge fade and support UIBarButtonItem.identifier for transition matching.
  • Risk: getCompactBrandHeaderOptions always sets unstable_headerLeftItems to undefined; any caller that previously relied on renderCompactBrandHeaderItems for custom leading items will no longer render them.

Macroscope summarized eed8204.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d1a3bafd-5e9a-41c6-98b3-c12abe4b1239

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@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). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 29, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−11 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−13 B (−0.2%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages11110 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.4 KiB+86 B (+0.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.5 KiB+83 B (+1.3%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB+88 B (+0.2%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: d22709f · PR result: eed8204 · Source CI: success

Scenario and decoded snapshot size

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

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

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

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The PR is a focused mobile header fix, but it replaces existing Home/iPad navigation-header behavior and changes shared iOS 26 native header rendering through a dependency patch. That production runtime surface and required native rebuild make it broader than an auto-approvable UI adjustment.

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

@juliusmarminge

Copy link
Copy Markdown
MemberAuthor

Additional verification: scroll-edge blur and header fade

Compared native Debug builds of the PR base (d22709f75) and this PR (eed8204a1) on the same iPhone 17 Pro / iOS 26.5 simulator, with the same populated thread list and swipe sequence, in light and dark appearances.

No visible regression observed:

  • Content progressively blurs and fades beneath the header; the foreground brand stays crisp and readable.
  • The bottom search/filter/compose toolbar retains its blur over the scrolling content.
  • Scrolling back to the top restores the clear at-top header state, as before.

These recordings exercise scrolling under the header, not just the push/pop transition. No code changes were needed for this verification pass.

Recordings

AppearanceBefore (PR base)This PR
Light30-second scroll recording30-second scroll recording
Dark30-second scroll recording30-second scroll recording

Matching scrolled states

Light appearance: before / PR
BeforeThis PR
Before: light scroll-edge blurPR: light scroll-edge blur
Dark appearance: before / PR
BeforeThis PR
Before: dark scroll-edge blurPR: dark scroll-edge blur

@juliusmarminge
juliusmarminge merged commit 053affb into mainAug 29, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-header-title-layout branch August 29, 2026 06:27
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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

fix(mobile): prevent header overflow and back-button artifacts - #8624

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout
Aug 29, 2026
Merged

fix(mobile): prevent header overflow and back-button artifacts#8624
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 29, 2026

Copy link
Copy Markdown
Member

Why

Long connection-status content can crowd the iOS header, hide its leading content, and turn the direct Settings button into UIKit's overflow menu. Separately, iOS 26.5 morphs the custom leading brand item's rectangle into the next screen's glass back button during navigation.

What Changed

  • Render the brand and connection status in the native title slot, separate from toolbar buttons and Back.
  • Bound status width using the header's available width and trailing actions, including the iPad sidebar's pane width. Preserve the full accessibility label.
  • Preserve the native scroll-edge fade with a non-interactive, empty native label matching the custom title's bounds. Keep Fabric child mounting indices intact.
  • Document the title-slot behavior and native rebuild requirements.

Verification

Fresh native Debug build on iPhone 17 Pro, iOS 26.5, using a disposable local environment:

  • Three Settings → thread → Back cycles: direct Settings presentation, visible thread actions, and restored branding.
  • Native edge-swipe Back and frame-by-frame push/pop inspection: no rectangular back-button morph.
  • Accessibility-large text while disconnected: visible, truncated status; no overflow menu; Settings opens directly.
  • Status-title tap opens Environments; reconnecting restores the brand.
  • Scrolled content retains the blur behind the brand.
  • Existing connection-status tests: 8 passed (vp test run apps/mobile/src/features/home/workspace-connection-status.test.ts).
  • Mobile typecheck, targeted lint/formatting, and git diff --check passed.

UI Changes

Header-only crops from the simulator recordings:

Before — the leading rectangle morphs into Back:

Before: rectangular header transition

After — Back remains a separate round control:

After: round back-button transition

Before recording · After push/pop recording

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included videos for animation/interaction changes

Requires a native dev-client rebuild. Refresh CocoaPods after installing the updated patch; a Metro reload alone cannot apply the native change.


Note

Medium Risk
Changes core iOS navigation header rendering and ships a native dependency patch; incorrect title/fade behavior would affect every Home/sidebar session and requires a full iOS rebuild to deploy.

Overview
Moves iOS Home and sidebar branding off custom leading toolbar items and into the native headerTitle slot, so the glass back button no longer morphs from the brand rectangle on push/pop (iOS 26.5). Liquid Glass–specific paths (unstable_headerLeftItems, transparent title, BRAND_HEADER_ITEM_IDENTIFIER) are removed from CompactBrandTitle and getConnectionAwareBrandHeaderOptions.

Connection-status headers are width-bounded using available header width minus trailing bar actions (headerWidth, trailingItemCount), with truncation/flexShrink so long labels do not force Settings into UIKit’s overflow menu. Home passes window width; the iPad sidebar passes pane width and refreshes options when width or header items change.

The react-native-screens patch adds an empty native UILabel guide on title/center header subviews (iOS 26) so scroll-edge fade geometry works with Fabric custom title views without drawing over the brand. Internal docs describe the title-slot policy and note that a native dev-client rebuild (CocoaPods refresh) is required for the patch.

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

Note

Fix header overflow and back-button artifacts by moving brand title to headerTitle slot

  • Moves brand and connection-status rendering from unstable_headerLeftItems to the headerTitle slot across Home and iPad sidebar headers, avoiding UIKit toolbar-item behavior on iOS 26.5.
  • Simplifies brandTitleOffset() to return IPAD_HOME_TITLE_OFFSET on iPad and 0 elsewhere; removes the native-leading-item offset path and deletes renderCompactBrandHeaderItems.
  • Adds maxWidth support to WorkspaceConnectionTitle and StatusFadeIn so long labels truncate within available header space; HomeRouteScreen and ThreadNavigationSidebarPane recompute header options on width changes.
  • Patches react-native-screens@4.26.2 so iOS 26+ custom title/center subviews contribute geometry for UIKit's scroll-edge fade and support UIBarButtonItem.identifier for transition matching.
  • Risk: getCompactBrandHeaderOptions always sets unstable_headerLeftItems to undefined; any caller that previously relied on renderCompactBrandHeaderItems for custom leading items will no longer render them.

Macroscope summarized eed8204.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d1a3bafd-5e9a-41c6-98b3-c12abe4b1239

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@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). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 29, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−11 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−13 B (−0.2%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages11110 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.4 KiB+86 B (+0.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.5 KiB+83 B (+1.3%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB+88 B (+0.2%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: d22709f · PR result: eed8204 · Source CI: success

Scenario and decoded snapshot size

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

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

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

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The PR is a focused mobile header fix, but it replaces existing Home/iPad navigation-header behavior and changes shared iOS 26 native header rendering through a dependency patch. That production runtime surface and required native rebuild make it broader than an auto-approvable UI adjustment.

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

@juliusmarminge

Copy link
Copy Markdown
MemberAuthor

Additional verification: scroll-edge blur and header fade

Compared native Debug builds of the PR base (d22709f75) and this PR (eed8204a1) on the same iPhone 17 Pro / iOS 26.5 simulator, with the same populated thread list and swipe sequence, in light and dark appearances.

No visible regression observed:

  • Content progressively blurs and fades beneath the header; the foreground brand stays crisp and readable.
  • The bottom search/filter/compose toolbar retains its blur over the scrolling content.
  • Scrolling back to the top restores the clear at-top header state, as before.

These recordings exercise scrolling under the header, not just the push/pop transition. No code changes were needed for this verification pass.

Recordings

AppearanceBefore (PR base)This PR
Light30-second scroll recording30-second scroll recording
Dark30-second scroll recording30-second scroll recording

Matching scrolled states

Light appearance: before / PR
BeforeThis PR
Before: light scroll-edge blurPR: light scroll-edge blur
Dark appearance: before / PR
BeforeThis PR
Before: dark scroll-edge blurPR: dark scroll-edge blur

@juliusmarminge
juliusmarminge merged commit 053affb into mainAug 29, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-header-title-layout branch August 29, 2026 06:27
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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

fix(mobile): prevent header overflow and back-button artifacts - #8624

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout
Aug 29, 2026
Merged

fix(mobile): prevent header overflow and back-button artifacts#8624
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-header-title-layout

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 29, 2026

Copy link
Copy Markdown
Member

Why

Long connection-status content can crowd the iOS header, hide its leading content, and turn the direct Settings button into UIKit's overflow menu. Separately, iOS 26.5 morphs the custom leading brand item's rectangle into the next screen's glass back button during navigation.

What Changed

  • Render the brand and connection status in the native title slot, separate from toolbar buttons and Back.
  • Bound status width using the header's available width and trailing actions, including the iPad sidebar's pane width. Preserve the full accessibility label.
  • Preserve the native scroll-edge fade with a non-interactive, empty native label matching the custom title's bounds. Keep Fabric child mounting indices intact.
  • Document the title-slot behavior and native rebuild requirements.

Verification

Fresh native Debug build on iPhone 17 Pro, iOS 26.5, using a disposable local environment:

  • Three Settings → thread → Back cycles: direct Settings presentation, visible thread actions, and restored branding.
  • Native edge-swipe Back and frame-by-frame push/pop inspection: no rectangular back-button morph.
  • Accessibility-large text while disconnected: visible, truncated status; no overflow menu; Settings opens directly.
  • Status-title tap opens Environments; reconnecting restores the brand.
  • Scrolled content retains the blur behind the brand.
  • Existing connection-status tests: 8 passed (vp test run apps/mobile/src/features/home/workspace-connection-status.test.ts).
  • Mobile typecheck, targeted lint/formatting, and git diff --check passed.

UI Changes

Header-only crops from the simulator recordings:

Before — the leading rectangle morphs into Back:

Before: rectangular header transition

After — Back remains a separate round control:

After: round back-button transition

Before recording · After push/pop recording

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included videos for animation/interaction changes

Requires a native dev-client rebuild. Refresh CocoaPods after installing the updated patch; a Metro reload alone cannot apply the native change.


Note

Medium Risk
Changes core iOS navigation header rendering and ships a native dependency patch; incorrect title/fade behavior would affect every Home/sidebar session and requires a full iOS rebuild to deploy.

Overview
Moves iOS Home and sidebar branding off custom leading toolbar items and into the native headerTitle slot, so the glass back button no longer morphs from the brand rectangle on push/pop (iOS 26.5). Liquid Glass–specific paths (unstable_headerLeftItems, transparent title, BRAND_HEADER_ITEM_IDENTIFIER) are removed from CompactBrandTitle and getConnectionAwareBrandHeaderOptions.

Connection-status headers are width-bounded using available header width minus trailing bar actions (headerWidth, trailingItemCount), with truncation/flexShrink so long labels do not force Settings into UIKit’s overflow menu. Home passes window width; the iPad sidebar passes pane width and refreshes options when width or header items change.

The react-native-screens patch adds an empty native UILabel guide on title/center header subviews (iOS 26) so scroll-edge fade geometry works with Fabric custom title views without drawing over the brand. Internal docs describe the title-slot policy and note that a native dev-client rebuild (CocoaPods refresh) is required for the patch.

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

Note

Fix header overflow and back-button artifacts by moving brand title to headerTitle slot

  • Moves brand and connection-status rendering from unstable_headerLeftItems to the headerTitle slot across Home and iPad sidebar headers, avoiding UIKit toolbar-item behavior on iOS 26.5.
  • Simplifies brandTitleOffset() to return IPAD_HOME_TITLE_OFFSET on iPad and 0 elsewhere; removes the native-leading-item offset path and deletes renderCompactBrandHeaderItems.
  • Adds maxWidth support to WorkspaceConnectionTitle and StatusFadeIn so long labels truncate within available header space; HomeRouteScreen and ThreadNavigationSidebarPane recompute header options on width changes.
  • Patches react-native-screens@4.26.2 so iOS 26+ custom title/center subviews contribute geometry for UIKit's scroll-edge fade and support UIBarButtonItem.identifier for transition matching.
  • Risk: getCompactBrandHeaderOptions always sets unstable_headerLeftItems to undefined; any caller that previously relied on renderCompactBrandHeaderItems for custom leading items will no longer render them.

Macroscope summarized eed8204.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d1a3bafd-5e9a-41c6-98b3-c12abe4b1239

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@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). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 29, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−11 B (−0.1%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+2 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−13 B (−0.2%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages11110 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.4 KiB+86 B (+0.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.5 KiB+83 B (+1.3%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB+88 B (+0.2%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: d22709f · PR result: eed8204 · Source CI: success

Scenario and decoded snapshot size

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

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

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

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The PR is a focused mobile header fix, but it replaces existing Home/iPad navigation-header behavior and changes shared iOS 26 native header rendering through a dependency patch. That production runtime surface and required native rebuild make it broader than an auto-approvable UI adjustment.

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

@juliusmarminge

Copy link
Copy Markdown
MemberAuthor

Additional verification: scroll-edge blur and header fade

Compared native Debug builds of the PR base (d22709f75) and this PR (eed8204a1) on the same iPhone 17 Pro / iOS 26.5 simulator, with the same populated thread list and swipe sequence, in light and dark appearances.

No visible regression observed:

  • Content progressively blurs and fades beneath the header; the foreground brand stays crisp and readable.
  • The bottom search/filter/compose toolbar retains its blur over the scrolling content.
  • Scrolling back to the top restores the clear at-top header state, as before.

These recordings exercise scrolling under the header, not just the push/pop transition. No code changes were needed for this verification pass.

Recordings

AppearanceBefore (PR base)This PR
Light30-second scroll recording30-second scroll recording
Dark30-second scroll recording30-second scroll recording

Matching scrolled states

Light appearance: before / PR
BeforeThis PR
Before: light scroll-edge blurPR: light scroll-edge blur
Dark appearance: before / PR
BeforeThis PR
Before: dark scroll-edge blurPR: dark scroll-edge blur

@juliusmarminge
juliusmarminge merged commit 053affb into mainAug 29, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-header-title-layout branch August 29, 2026 06:27
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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