fix(mobile): stabilize iOS header item transitions - #8607
Conversation
- Give the mobile brand header a stable native item identifier - Preserve iOS header item groups across unrelated updates - Document mobile navigation header constraints
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 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.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This is a native iOS navigation integration change that adds identifier plumbing, transition callbacks, and shared header-group caching, affecting more than the workspace brand alone. Its transition-sensitive behavior spans existing native-stack headers and requires a new mobile build, making the runtime surface broader than a small isolated UI fix. You can add or adjust custom eligibility rules. Learn more. |
## 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
What Changed
This updates the mobile native-stack header patches so iOS can preserve header item identity during transitions. Custom header items now forward an optional
identifierthrough React Navigation and react-native-screens, and the workspace brand/connection header item uses a shared identifier so UIKit does not confuse it with navigation controls.The react-native-screens patch also caches leading, trailing, and center item groups independently to avoid rebuilding unrelated
UIBarButtonItemGroups while UIKit is animating them. Internal mobile navigation docs were added to capture the constraints around Liquid Glass headers, custom item identifiers, and native rebuild requirements.Why
On iOS, replacing or regrouping bar button items during push/pop or menu transitions can leave visible header artifacts, including stuck glass capsules and malformed back button transitions. Giving the brand item a stable identity and preserving unchanged item groups lets UIKit match the right header elements across route transitions.
This keeps the fix scoped to the mobile native header integration while documenting the behavior so future header changes do not accidentally reintroduce the issue.
UI Changes
This is a mobile UI behavior fix for iOS header transitions. Before/after screenshots or video should be included with the PR if available from simulator or device verification.
Checklist
Note
Medium Risk
Touches patched native navigation stack code on iOS 26+ where incorrect header caching or identifiers could cause visible bar glitches; scope is mobile headers only, not auth or data paths.
Overview
Stabilizes Liquid Glass iOS navigation headers by giving the workspace brand a stable UIKit bar-button identity and avoiding unnecessary native header rebuilds during transitions.
The app exports
BRAND_HEADER_ITEM_IDENTIFIER(workspace-brand) and assigns it to the custom leading brand item in both the static brand header and the connection-status swap, so UIKit can match the same slot across route changes instead of treating it like a new control.Patches extend
@react-navigation/native-stackandreact-native-screensto forward optionalidentifieron custom header subviews intoUIBarButtonItem.identifier, and to cache leading, trailing, and centerUIBarButtonItemGroups separately so unrelated header updates do not regroup items UIKit may still be animating. New internals docmobile-navigation.mdrecords Liquid Glass header constraints and notes that identifiers require a native rebuild, not OTA JS alone.Reviewed by Cursor Bugbot for commit 5752498. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Stabilize iOS header item transitions via
BRAND_HEADER_ITEM_IDENTIFIERandreact-native-screenscachingBRAND_HEADER_ITEM_IDENTIFIER("workspace-brand") in CompactBrandTitle.tsx and assigns it to the custom header item inrenderCompactBrandHeaderItemsandgetConnectionAwareBrandHeaderOptionsin WorkspaceConnectionTitle.tsx@react-navigation/native-stackto propagate anidentifierfield on custom header items throughuseHeaderConfigPropsto native left/right/center header subviews, emit a navigator-levelfinishTransitioningevent, and support custom center header itemsreact-native-screensso iOS caches and reusesUIBarButtonItemgroups per placement (leading/trailing/center) keyed by config and item values, avoiding recreation during transitions; on iOS 26+ forwardsidentifiertoUIBarButtonItem.identifier; Android accepts theidentifierprop as a no-opleadingItemGroups/trailingItemGroupsand on iOS 26+ usescenterItemGroups, with fallback toleftBarButtonItems/rightBarButtonItemson older platforms. ThefinishTransitioningevent and custom center header item support are new native-stack behaviors introduced by the patch.Macroscope summarized 5752498.