Skip to content

fix(mobile): iPhone Duo sheets use their full width and native headers - #22551

Draft
PixPMusic wants to merge 8 commits into
pingdotgg:mainfrom
PixPMusic:pixpmusic/duo-sheet-headers
Draft

PixPMusic wants to merge 8 commits into
pingdotgg:mainfrom
PixPMusic:pixpmusic/duo-sheet-headers

Conversation

@PixPMusic

@PixPMusic PixPMusic commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Problem

On a folded iPhone Duo, several sheets lose part of their width or their header. Git overview and Linked pull requests stop about two-thirds of the way across, leaving an empty strip before the rail. Thread settings is inset twice, and its Done button drops onto the model list. Branches & worktrees has no header on iOS at all. The shared Sheet (composer context, terminal output, worktree setup) runs its first row under the close button in the rail.

Draft: this builds on #20435 and needs an unpublished Screens build (see Blockers).

Change

The first three commits are #20435's, rebased onto main. Review the commits after them.

  • Git overview and Linked pull requests use the route's native header through SheetHeader, like the commit sheet since fix(mobile): use native sheet headers and toolbar filters #22390. Their nested header stack and NativeSheetContent are gone. That wrapper read the Duo bar's inset a second time, which caused the inner strip.
  • The Git inspector (Git overview as a column on an unfolded Duo) drops NativeSheetContent too. Its column already insets for the rail, so the cards were 195 pt wide in a 279 pt column. The component had no other users and is removed.
  • Branches & worktrees gets a native iOS header.
  • Git confirm keeps fix(mobile): use the sheet width on iPhone Duo #20435's horizontal bars and opens at 0.55 instead of 0.45, so both actions fit.
  • Shared Sheet always uses horizontal bars. Every caller already opted in, so the prop is removed.
  • Thread settings, new-task settings and the scheduled-task model picker keep automatic bar placement, so their controls use the Duo rail:
    • The picker stack spans the sheet (nativeContentInsetHorizontally: false), so its header reaches the rail and the content is inset once.
    • With a vertical bar they skip the mail-search toolbar and keep their own toolbar (nativeKeepsBottomToolbar). The rail then shows cancel and confirm at the top, and filter and search grouped at its foot. Without that option, V5 headers merge a screen's bottom toolbar into the trailing group, which put filter between cancel and confirm.
    • At regular width (Duo unfolded landscape) that same toolbar shows filter beside the search field, and the list reserves room for it.
    • Sheet confirm buttons ask for high visibility priority, so a short rail overflows other items instead of hiding confirm.

Scope and approval

This continues #20435, my PR for the Duo sheet width. It came out of an audit of every iOS sheet on iPhone, iPad and a folded and unfolded Duo, where #20435 alone did not explain the inner strip. There is no separate issue.

Blockers

Verification

Dev clients on the iOS 27.1 iPhone Duo simulator (folded and unfolded, portrait and landscape), an iPhone 18 Pro (iOS 27.0) and an iPad Pro 11-inch (iPadOS 26.5), with synthetic showcase data. I checked each sheet's width, header, rail controls, detents and dismissal from measured element frames and screenshots.

  • Folded Duo:
    • Git overview, Linked PRs, Branches, Commit and the shared Sheet fill the sheet (450 of 450 pt in portrait, 662 of 662 in landscape), with native headers.
    • Confirm is centered.
    • Thread settings shows content at 374 pt, with cancel and Done at the top of the rail and filter and search grouped at its foot. Search opens there and filters the list.
  • Unfolded landscape: thread settings shows filter beside the search field in a bottom toolbar, and the last row scrolls clear of it.
  • Folded landscape: before the grouped toolbar, thread settings kept cancel and Done visible and moved filter and search into the overflow menu, both working from there. The grouped layout is not yet checked in this posture.
  • Unfolded Duo, iPhone and iPad: every sheet has a native header and fills its card or the screen.
  • Rebased head: checked again on the Duo in folded landscape (Git sheets, thread settings, shared Sheet), and on the iPhone and iPad (Git sheets and thread settings), with the same results.
  • Checks: after rebasing onto main, mobile typecheck passes, 201 tests pass in src/native, src/features/threads and src/components, lint reports no errors on changed files, and knip:check passes.
  • Not checked:
    • Unfolded landscape screenshots; the layout was measured only.
    • Android, whose sheets are unchanged.
Before (main) After (this branch)
Git overview on main: cards stop two-thirds across Git overview: native header, full width
Thread settings on main: double inset, Done below the header Thread settings: controls in the rail
Shared sheet on main: close button over the first row Shared sheet: close button in the header
Branches on main: no header Branches: native header
Confirm on main: off-center Confirm: centered
Commit on main: close button in the rail Commit: close button in the header

The before/after pairs are folded-portrait captures of these commits on the previous base. Unfolded Duo, iPhone and iPad after this change:

Duo unfolded landscape iPhone iPad
Thread settings on the unfolded Duo: filter beside the search field in a bottom toolbar Branches on iPhone with a native header Git overview on iPad with a native header

Follow-ups

Model: Claude Opus 5.5 | Harness: Claude Code in T3 Code

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Oct 20, 2026
@PixPMusic
PixPMusic force-pushed the pixpmusic/duo-sheet-headers branch from 61935a0 to aa1813e Compare October 21, 2026 07:24
PixPMusic and others added 8 commits October 21, 2026 12:20
The shared Sheet keeps its close button in the header, so on iPhone Duo its
content no longer runs under a vertical bar. Every caller already opted in.
Git overview and Linked pull requests drop their nested header stack, whose
second safe-area inset left an empty strip on iPhone Duo. Branches & worktrees
gets an iOS header. The confirm sheet starts at a taller detent so both actions
fit under horizontal bars.
The picker sheets keep automatic bar placement. Their header spans the sheet so
cancel, filter, search and confirm sit in the rail, and the content is inset
once. Sheet confirm buttons ask for high visibility priority so a short rail
moves filter and search to the overflow menu instead of the confirm action.
…the Duo rail

On iPhone Duo, V5 headers merge a screen's bottom toolbar into its trailing
items, which put filter between cancel and confirm. The picker stack keeps its
toolbar, which a sheet's rail shows at its foot, so filter and search share one
group there. The list reserves room for that toolbar on iOS.
The inspector column already insets its content for the rail. NativeSheetContent
read the same inset again, which halved the cards on an unfolded Duo. It has no
other users, so it is removed.

This branch has not been deployed

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

Labels

size:L 100-499 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants