Skip to content

feat(mobile): the folded Duo opens search from a search tab below the tab bar - #24360

Merged
juliusmarminge merged 1 commit into
t3code/settings-split-tabfrom
t3code/duo-search-tab
Oct 25, 2026
Merged

juliusmarminge merged 1 commit into
t3code/settings-split-tabfrom
t3code/duo-search-tab

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Oct 24, 2026 •

Copy link
Copy Markdown
Member

Stacked on #24524.

On the folded Duo, search was a button at the top of the vertical bar, next to compose. Photos puts it in a search tab that UIKit sets apart below the tab bar, which is easier to reach and keeps the top of the bar for actions.

The workspace tab bar gets a native UISearchTab (role: "search" with automaticallyActivatesSearch, which iOS 27 needs to set it apart). It never becomes selected: pressing it returns to the current list (Chats from Usage or Settings, popping an open chat) and starts its search. Search closes from the field's own cancel button.

Starting a search is list state with a focus-request counter. The header focuses the field once per request as soon as the field attaches. This replaces the effect that focused it one frame later and missed fields that mount with the request, so there is no frame waiting anywhere in the flow.

Search tab from Chats, again after closing, from a chat, and from Usage, each with the keyboard up

Verified on the folded Duo simulator with the software keyboard: from the Chats list, a second search after closing, from inside a chat, from Usage and from Settings; submitting a query and tapping the tab again refocuses with the query kept. Not verified: a physical Duo, and folding or unfolding while the search tab is shown.

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

🤖 Generated with Claude Code

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Oct 24, 2026
Comment thread apps/mobile/src/features/workspace/WorkspaceNativeTabs.ios.tsx Outdated
@macroscopeapp

macroscopeapp Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs Human Approval

Macroscope's review found this PR requires human approval — This adds a native search tab for folded Duo devices, replacing the existing folded-Duo toolbar search control and adding cross-layer focus behavior in shared iOS navigation code. The user-facing navigation change spans several runtime layers and merits human review.

No code changes detected at 92b8326. Prior analysis still applies.

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

@coderabbitai

coderabbitai Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review.

Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between ea0773d and 7894c99.

Files selected for processing: 1
  • apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx
Files with no reviewable changes: 1
  • apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 7 remain after this review.

Walkthrough

On folded Duo devices, iOS adds a native search tab that routes selection to search focus. The iOS toolbar removes its folded-Duo search button and related spacing and cancel-button configuration.

Changes: Folded Duo iOS search

Layer / File(s) Summary
Native search tab and activation
apps/mobile/src/features/workspace/WorkspaceNativeTabs.ios.tsx, apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx
Adds a native search item for folded Duo devices. Search selection selects the threads tab when settings are open or the selected tab does not use columns, then schedules search focus; otherwise it dispatches search focus directly. Removes the folded-Duo toolbar search button, its spacer, and the conditional cancelButtonHidden option.

Priority: Low

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant NativeSearchItem
  participant WorkspaceNativeTabs
  participant SelectionCallback as props.onSelect
  participant HardwareSearchFocusCommand
  NativeSearchItem->>WorkspaceNativeTabs: report search selection
  alt settings are open or selected tab does not use columns
    WorkspaceNativeTabs->>SelectionCallback: select threads
    WorkspaceNativeTabs->>HardwareSearchFocusCommand: schedule search focus
  else
    WorkspaceNativeTabs->>HardwareSearchFocusCommand: dispatch search focus
  end
Loading

Possibly related PRs

  • pingdotgg/t3code#24206: Both PRs change folded Duo native search behavior; #24206 addresses search focus and keyboard ownership.
  • pingdotgg/t3code#23841: This PR extends the native workspace tab structure introduced by #23841 with a search slot.
  • pingdotgg/t3code#18158: Both PRs change Duo search presentation while retaining the workspace search behavior.

Suggested reviewers: pixpmusic

Merge Risk: Minimal · up to 7894c

No confirmed issue blocks merging. Search activation after switching from Usage or Settings remains worth checking on a folded Duo.

Pre-merge checks: Passed 3 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Description check Warning The description is mostly complete, but it does not follow the required template. It has no Problem, Change, Scope and approval, or Verification headings. The content covers the problem, the change, a… Restructure the description under the template headings: Problem, Change, Scope and approval, and Verification. Under Scope and approval, link the triaged bug issue or the maintainer discussion with explicit approval of the search-tab direc…
Passed Passed checks: 3 passed
Check name Status Explanation
Title check Passed The title clearly describes the main change: moving folded Duo search to a search tab below the tab bar.
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Description check

Explanation

The description is mostly complete, but it does not follow the required template. It has no Problem, Change, Scope and approval, or Verification headings. The content covers the problem, the change, and verification in prose, so it is substantive. Scope and approval is the main gap. The description says it is stacked on #24524 and gives no linked triaged issue or maintainer approval for the direction and scope of this search-tab change. Some verification detail is present (simulator checks, what was not verified), but the template asks for focused tests or checks. A before/after screenshot is included, but the template requires clear before/after images for UI changes, and the PR shows only after-state screenshots of the search tab.

Resolution

Restructure the description under the template headings: Problem, Change, Scope and approval, and Verification. Under Scope and approval, link the triaged bug issue or the maintainer discussion with explicit approval of the search-tab direction, and link the parent PR #24524 for the stacked dependency. Under Verification, list the focused checks and their observed results, keep the list of unverified items, and add before/after screenshots for the folded Duo search button versus the new search tab. Keep the model and harness line at the end.

Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

@juliusmarminge
juliusmarminge changed the base branch from main to t3code/settings-split-tab October 24, 2026 21:36
@github-actions github-actions Bot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Oct 24, 2026
@github-actions github-actions Bot added size:L 100-499 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Oct 24, 2026
@juliusmarminge
juliusmarminge force-pushed the t3code/duo-search-tab branch 3 times, most recently from a8c419f to b46fa7b Compare October 24, 2026 22:08
… tab bar

UIKit sets a native search tab apart below the workspace tabs, like Photos.
It never becomes selected: pressing it returns to the current list, or Chats
from Usage and Settings, and starts its search. Search closes from the
field's own cancel button instead of a button at the top of the bar.

Starting a search is list state with a focus request counter; the header
focuses the field once per request as soon as the field attaches, replacing
the effect that focused it one frame later and missed fields that mount with
the request.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@juliusmarminge
juliusmarminge force-pushed the t3code/duo-search-tab branch 2 times, most recently from 4e4ece0 to 92b8326 Compare October 24, 2026 22:57
@juliusmarminge
juliusmarminge added this pull request to stack #24624 October 25, 2026 00:29
@juliusmarminge
juliusmarminge merged commit 5cf4995 into main Oct 25, 2026
56 of 57 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/duo-search-tab branch October 25, 2026 00:29
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Oct 25, 2026
## What's Changed
* perf(mobile): highlight code with native @pierre/highlights instead of Shiki by @juliusmarminge in pingdotgg/t3code#24544
* fix(desktop): support Linux distro protocol launchers by @juliusmarminge in pingdotgg/t3code#24591
* fix(provider-acp): force-kill terminal commands that ignore SIGTERM by @juliusmarminge in pingdotgg/t3code#24596
* fix(grok): invoke leading picked skills through native commands by @juliusmarminge in pingdotgg/t3code#24605
* fix(server): long agent turns no longer load whole when a thread opens by @t3dotgg in pingdotgg/t3code#24589
* fix(server): analytics stop counting reconnects, retries, and dev servers by @t3dotgg in pingdotgg/t3code#24601
* fix(acp): idle agent errors fail their turns by @juliusmarminge in pingdotgg/t3code#24615
* fix(provider-acp): Grok monitors show as monitors in background work by @t3dotgg in pingdotgg/t3code#24609
* feat(server): devices on the same network reach background services over LAN by @t3dotgg in pingdotgg/t3code#24588
* fix(codex): bound pending requests after app-server stdout closes by @juliusmarminge in pingdotgg/t3code#24600
* fix(cursor): discover built-in skills in the composer by @juliusmarminge in pingdotgg/t3code#24595
* fix(server): retry provider event writes after brief SQLite locks by @juliusmarminge in pingdotgg/t3code#24571
* fix(server): settle inactive threads with persisted open PR links by @juliusmarminge in pingdotgg/t3code#24617
* feat(mobile): Settings is a workspace tab, and tabs never open on an empty detail by @juliusmarminge in pingdotgg/t3code#24524
* feat(mobile): the folded Duo opens search from a search tab below the tab bar by @juliusmarminge in pingdotgg/t3code#24360
* revert(mobile): take the folded Duo search tab back out for now by @juliusmarminge in pingdotgg/t3code#24626
* fix(web): preview images outside the workspace by @juliusmarminge in pingdotgg/t3code#24627
* fix(threads): Working holds only background work the agent waits on by @t3dotgg in pingdotgg/t3code#24610
* fix(web): switched threads and Scroll to end land on the real end by @t3dotgg in pingdotgg/t3code#24622
* fix(web): attach DNG originals as generic files by @juliusmarminge in pingdotgg/t3code#24625
* fix(server): surface failed runtime request answer delivery by @juliusmarminge in pingdotgg/t3code#24616
* fix(preview): report navigation timeout accurately by @Ethereal49 in pingdotgg/t3code#24356
* fix(web): give PR row metadata room below the title by @juliusmarminge in pingdotgg/t3code#24553
* fix(mobile): center floating status actions by @PixPMusic in pingdotgg/t3code#24526
* fix(mobile): the iPhone new-chat button sits beside the tab bar on iOS 26.6 by @wojas in pingdotgg/t3code#24492
* fix(web): signed-out T3 Connect shows a Sign in button by @t3dotgg in pingdotgg/t3code#24636
* perf(mobile): stop menu fault logging and whole-list re-renders on Home by @juliusmarminge in pingdotgg/t3code#24646
* fix(mobile): preserve syntax and navigation in large diffs by @juliusmarminge in pingdotgg/t3code#24276
* perf(shell): cold connects skip idle subagent threads, a third of the thread list by @t3dotgg in pingdotgg/t3code#24648
* feat: share a thread with a guest who watches live and sends messages you approve by @t3dotgg in pingdotgg/t3code#24104
* fix(antigravity): say when sign-in cannot reach Google by @t3dotgg in pingdotgg/t3code#24652
* fix: canonicalize git.cafe pull request links by @maria-rcks in pingdotgg/t3code#22634
* feat(mobile): manage labels, edit PRs and comments, react, and refresh checks live by @juliusmarminge in pingdotgg/t3code#24602
* perf(web): highlight code with @pierre/highlights instead of Shiki by @maria-rcks in pingdotgg/t3code#23178
* perf(server): thread opens and live events send each message body once by @t3dotgg in pingdotgg/t3code#24647
* refactor: halve code comments and cap comment blocks at four lines by @maria-rcks in pingdotgg/t3code#21514
* chore: fit three comments to the four-line cap so lint passes on main by @t3dotgg in pingdotgg/t3code#24675
* fix(claude): ENABLE_TOOL_SEARCH=auto no longer costs 10x cache writes per session by @t3dotgg in pingdotgg/t3code#24654
* perf(orchestration): thread snapshots send each long ID once by @t3dotgg in pingdotgg/t3code#24643
* fix(mobile): keep visible diff files highlighted by @juliusmarminge in pingdotgg/t3code#24682
* fix(mobile): Settings split view keeps its selection and its header matches the page by @juliusmarminge in pingdotgg/t3code#24644
* fix(mobile): every Duo header blurs under the vertical bar, from one place by @juliusmarminge in pingdotgg/t3code#24671
* feat(settings): follow-ups steer the running turn by default by @maria-rcks in pingdotgg/t3code#24718
* fix(mobile): Duo threads no longer open shifted left by @juliusmarminge in pingdotgg/t3code#24732
* fix(mobile): PR links open in the app the same way they do on web by @juliusmarminge in pingdotgg/t3code#24738
* feat(web): command palette search finds options inside submenus by @maria-rcks in pingdotgg/t3code#24709

## New Contributors
* @Ethereal49 made their first contribution in pingdotgg/t3code#24356
* @wojas made their first contribution in pingdotgg/t3code#24492

**Full Changelog**: pingdotgg/t3code@v0.1.3-nightly.20261024.3643...v0.1.3-nightly.20261025.3655

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.3-nightly.20261025.3655
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.

1 participant