# fix\(mobile\): the iPhone Duo's search field and composer line up with its tab bar · PR \#23150 · pingdotgg/t3code

[View on GitCafe](https://git.cafe/pingdotgg/t3code/pull/23150)

Repository: [pingdotgg/t3code](https://git.cafe/pingdotgg/t3code)

Visibility: public

State: merged

Source repository: pingdotgg/t3code

Source branch: duo/bottom-line

Target branch: duo/feed-anchoring

Head commit: 5877d50a540f0e8d4cc0e6b8d51252a431443901

[Discussion and reviews](https://git.cafe/pingdotgg/t3code/pull/23150)

[Commits](https://git.cafe/pingdotgg/t3code/pull/23150/commits?format=markdown)

[Files changed](https://git.cafe/pingdotgg/t3code/pull/23150/diffs?format=markdown)

## Description

---

UIKit floats the iPhone Duo's tab bar 24 pt above the bottom edge, below the 34 pt safe area. The list's search field sat on the safe area, 10 pt higher, and the composer added its 6 pt gutter on top, 16 pt higher, so the three bottoms didn't line up.

The layout metrics observer now also reports UIKit's bar layout region for a 48 pt bar on the bottom edge (iOS 27.1), measured in each column. On the Duo, the search field and the composer pill end on it, level with the tab bar, and the workspace list keeps its last row clear of the field. Other devices keep their safe-area placement.

## Verification

- Software-keyboard clearance checked folded and unfolded.
- Measured at this PR's base `5b5e9062d3e` and head `38a2aba508e` (restacked commits), on one development client built from the stack's tip on current main (fingerprint `a6c8232e`). Both sides run on it, because this layer's native inputs don't change except the bar region the head reads:

| Bottom edge (pt) | Before | After | Tab bar |
|---|---|---|---|
| Folded composer | 636 | 652 | 652 |
| Unfolded composer | 627 | 643 | 643 |
| Search field text, folded | 632 | 642 | |

| | Before | After |
|---|---|---|
| Folded thread | ![Before: the folded composer sits above the tab bar](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e31098a692373e19/folded-thread-before.png) | ![After: the folded composer ends level with the tab bar](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a586f18516bcc707/folded-thread-after.png) |
| Folded list | ![Before: the folded search field sits above the tab bar](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/70e7c39b82b048b6/folded-list-before.png) | ![After: the folded search field ends level with the tab bar](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e8fc8d61af036453/folded-list-after.png) |
| Unfolded thread | ![Before: the unfolded composer and search sit above the tab bar](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/69600ae4ce8d4ce6/unfolded-thread-before.png) | ![After: the unfolded composer, search and tab bar share one bottom line](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8e7725e7966f5723/unfolded-thread-after.png) |

Implemented with Claude Opus 5.5 in Claude Code, running in T3 Code.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

