# fix\(mobile\): keep Duo toolbar actions clear of workspace tabs · PR \#22976 · pingdotgg/t3code

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

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

Visibility: public

State: merged

Source repository: pingdotgg/t3code

Source branch: duo/toolbars

Target branch: main

Head commit: 7153c10fce9f43da2b036ae398e0ea821f2ed391

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

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

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

## Description

---

Duo workspace toolbars could overlap the native tab bar, hide actions, or duplicate Compose. This layer keeps modal toolbar groups native while moving workspace rail actions away from the tabs, and gives the workspace one Compose action. A pull request opened from a thread also leaves Compose out of its bar.

Verified folded and unfolded landscape on the Duo: PR actions and tabs do not overlap, search opens, and modal search remains usable. Focused header tests and mobile typecheck passed.

This is the first toolbar layer. #23145 later in this stack moves list search to a bottom field and makes header actions update when their contents change. Unfolded portrait is unverified.

Intermediate failing layout, before the overlap correction:
![Before: toolbar overlaps workspace tabs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d41b201834e74f8a/toolbar-corrected-pr.png)

After the correction, on another PR with the same viewport:
![After: actions above separate workspace tabs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7be6cbc47f47b36f/toolbar-no-overlap-folded.png)

Implemented with Claude Opus 5.5 in Claude Code; integrated and reviewed with GPT-6.1 in Codex.


## Motion verification

Fresh, real-time 30 fps recordings from the exact commits labeled in the videos, using fingerprint-matched debug native clients. Black cards mark cuts between displays.

**Before**

![Before — PR 22976](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3e35d49468a9f662/pr22976-toolbars-BEFORE-a01f4107ca4.mp4)

**After**

![After — PR 22976](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cd6d1ebb6f0dee31/pr22976-toolbars-AFTER-0c813861622.mp4)

The BEFORE recording uses the original merge base `a01f4107ca4`, not the current main base. A cleared thread reappears after folding in both recordings; this PR does not fix that.

### Restack

Restacked onto main `a12d6ed942` on 2026-10-21. The commits are unchanged apart from lockfile peer strings. The recordings above show the pre-restack commits they name.


