Skip to content

Keep iOS New Task button clear of the bottom search pill - #9136

Merged
azooz2003-bit merged 2 commits into
mainfrom
fix-ios-bottom-search-compose-overlap
Jul 29, 2026
Merged

azooz2003-bit merged 2 commits into
mainfrom
fix-ios-bottom-search-compose-overlap

Conversation

@azooz2003-bit

@azooz2003-bit azooz2003-bit commented Jul 29, 2026 •

Copy link
Copy Markdown
Collaborator

On iOS 26 the workspace list mounted New Task as a .bottomBar toolbar item (#8645), but the TabView search-role tab renders its pill in the same bottom-trailing slot, so the two controls stacked on top of each other: New Task sat underneath the search pill, occluded and untappable.

The fix mounts the shared TaskComposerButton in the bottom safe-area bar (safeAreaBar) on iOS 26, which the system lays out above the tab-bar chrome, so the button now sits as its own glass circle stacked above the search pill. The pre-iOS-26 overlay mounting moves from both shell layouts (compact stack and split sidebar) into the same WorkspaceListSearchHost, giving the button one shared layout path instead of three mounting sites.

First commit adds the failing regression test only (workspace-list preview now renders the New Task button next to the pill, and a UI test asserts the frames do not intersect and both stay tappable); second commit adds the fix.

Verification

  • Isolated iOS 26.5 simulators (cmux-bscomp-promax-20260728, cmux-bscomp-se-20260728): New Task renders above the search pill on iPhone 17 Pro Max and iPhone SE, no overlap, long-list content scrolls under the glass band.
  • Isolated iOS 18.4 simulator (cmux-bscomp-ios18-20260728): pre-26 layout unchanged (top search drawer, bottom-trailing floating button above the opaque tab bar).
  • Search tab destination mounts no composer, so the search-active/keyboard state has no colliding control by construction.
  • Localization audit: no new user-facing strings; the button reuses TaskComposerButton's existing localized label and hint keys.

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.


Summary by cubic

Fixes the iOS 26 overlap where the New Task button sat under the bottom search pill. The button now sits above the tab bar and stays tappable.

  • Bug Fixes
    • iOS 26: mount TaskComposerButton in the bottom safeAreaBar (trailing) instead of a .bottomBar toolbar item.
    • Unified pre‑iOS‑26 overlay into WorkspaceListSearchHost; removed shell overlays for a single layout path.
    • Updated preview to render both the search pill and New Task for layout coverage.
    • Added a UI test ensuring the two controls do not intersect and both are tappable.
    • iOS < 26 behavior unchanged.

Written for commit 3623212. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Bug Fixes

    • Improved placement of the New Task button in the workspace list across supported iOS versions.
    • Prevented the button from overlapping the system Search control when tabs are enabled.
    • Removed redundant task composer overlays from workspace shell layouts.
  • Tests

    • Added UI coverage verifying the New Task button and Search control remain separate and usable.

azooz2003-bit and others added 2 commits July 29, 2026 00:18
On iOS 26 the workspace list preview now renders the New Task button the
live shell mounts next to the system search pill, and a UI test asserts
the two controls do not intersect and stay tappable. The fix lands in
the next commit, so this run documents the overlap.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
On iOS 26 the workspace list mounted New Task as a bottomBar toolbar
item, but the TabView search-role tab renders its pill in the same
bottom-trailing slot, so the two controls stacked and New Task was
occluded and untappable. Mount the shared TaskComposerButton in the
bottom safe-area bar instead, which the system lays out above the tab
bar chrome, and move the pre-iOS-26 overlay mounting from both shell
layouts into the same WorkspaceListSearchHost so the button has one
shared layout path.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 29, 2026 •

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: d1866eed-62f4-4c26-9857-0d5b121d0286

📥 Commits

Reviewing files that changed from the base of the PR and between ae52684 and 3623212.

📒 Files selected for processing (4)
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swift
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListSearchHost.swift
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceShellView.swift
  • ios/cmuxUITests/cmuxUITests.swift
💤 Files with no reviewable changes (1)
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceShellView.swift

📝 Walkthrough

Walkthrough

The task composer button is relocated from WorkspaceShellView overlays into WorkspaceListSearchHost, using safeAreaBar on iOS 26+ and a bottom-trailing overlay on earlier versions. Preview wiring and an iOS 26 overlap regression test are added.

Changes

Task composer placement

Layer / File(s) Summary
Search host placement and workspace wiring
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListSearchHost.swift, Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swift, Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceShellView.swift
The task composer uses a bottom safeAreaBar on iOS 26+ and a bottom-trailing overlay on earlier versions. Preview wiring supplies the action for tab-scaffold layouts, while duplicate shell overlays and helpers are removed.
Placement regression validation
ios/cmuxUITests/cmuxUITests.swift
Adds an iOS 26 UI test confirming the task composer does not intersect the Search tab pill and both controls remain hittable.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

Suggested reviewers: lawrencecchen

🚥 Pre-merge checks | ✅ 25
✅ Passed checks (25 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly describes the main fix: keeping the iOS New Task button clear of the bottom search pill.
Description check ✅ Passed The description covers the summary, verification/testing details, review trigger, and checklist; only the demo video field is missing.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
Cmux Swift Actor Isolation ✅ Passed The patch only moves SwiftUI UI mounting in @MainActor views and adds a @MainActor UI test; it adds no new service protocols, Sendable refs, or background-store access.
Cmux Swift Blocking Runtime ✅ Passed The actual diff only moves SwiftUI layout code and removes an overlay; no new blocking waits, sleeps, semaphores, or locks were introduced.
Cmux Browser Automation Off-Main ✅ Passed PR only changes iOS mobile-shell UI/UI tests; no browser.* socket commands, worker routing, or WebKit/AppKit automation paths were touched.
Cmux Expensive Synchronous Load ✅ Passed The changed files only adjust New Task button layout and add a UI test; they introduce no RestorableAgentSessionIndex.load() or other expensive sync agent-history loads.
Cmux Cache Substitution Correctness ✅ Passed PR only changes transient UI mounting for New Task and adds a UI test; no fresh-read-to-cache substitution in a persistence/history/snapshot path.
Cmux No Hacky Sleeps ✅ Passed PASS: The PR only changes Swift files, and the new UI test uses bounded XCTest waits; no fixed sleeps/timers were added in covered non-Swift runtime code.
Cmux Algorithmic Complexity ✅ Passed Diff only repositions New Task UI and adds a UI test; no new scalable collection scans, sorts, or nested rescans were introduced.
Cmux Swift Concurrency ✅ Passed Added lines only adjust SwiftUI layout and an XCTest; no new DispatchQueue, completion handlers, Combine, or fire-and-forget Task patterns appear in the diff.
Cmux Swift @Concurrent ✅ Passed The PR only moves UI layout/test code; no new @concurrent or nonisolated async helpers were added, and the new test is intentionally MainActor/UI-bound.
Cmux Swift Package Boundaries ✅ Passed Only UI composition, DEBUG preview code, and a UI test changed; no reusable domain logic was added to the app target.
Cmux Swiftpm Lockfiles ✅ Passed Full branch diff only touches Swift sources and UI tests; no Package.resolved, .gitignore, Xcode project, or package/dependency files changed.
Cmux Swift Logging ✅ Passed The diff adds no print/debugPrint/dump/NSLog/os_log/Logger calls, no ad hoc stdout/file logging, and no sensitive-data logging.
Cmux User-Facing Error Privacy ✅ Passed Layout and UI-test changes only; no production error/alert/API/recovery copy was added or altered, and no vendor/internal details leaked.
Cmux Full Internationalization ✅ Passed Diff only remounts existing TaskComposerButton and adds tests/comments; no new user-facing text or locale/catalog changes, and the button’s strings already exist in xcstrings.
Cmux Swiftui State Layout ✅ Passed Diff only relocates TaskComposerButton mounting and adds a UI test; no new ObservableObject/@published, GeometryReader measurement, row store refs, or render-time state writes.
Cmux Architecture Rethink ✅ Passed PASS: The task composer still has one owner/closure in WorkspaceShellView; WorkspaceListSearchHost only bridges platform placement, with no timing hacks or duplicate owners.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PASS: The PR only adjusts SwiftUI view layout and adds a UI test; no NSWindow/NSPanel/WindowGroup or cmux.* auxiliary window identifiers were introduced.
Cmux Source Artifacts ✅ Passed All changed paths are intentional source/test files; no logs, screenshots, caches, temp dirs, or other source-control artifacts appear in the diff.
Cmux No Test Or Debug Seam In Production Source ✅ Passed No new test/debug seam was added in Sources; the changes are regular task-composer layout plumbing, while the regression test lives under Tests.
Cmux No Ambient Global State ✅ Passed The diff only adds instance-owned state/parameters inside existing views; no new top-level funcs, mutable globals, namespace-only helper bags, or singletons were introduced.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix-ios-bottom-search-compose-overlap

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@azooz2003-bit

Copy link
Copy Markdown
Collaborator Author

Regression-test red/green proof (test-ios.yml is manual-dispatch while iOS CI is paused, so dispatched explicitly with test_filter=cmuxUITests/cmuxUITests/testWorkspaceListNewTaskButtonClearsSearchPill):

  • Test-only commit 29cb509: run 30432899119 — ios-simulator (iphone) failed with XCTAssertFalse failed - New Task (336.7, 804.0, 26.7, 36.0) must not overlap the search pill (319.0, 791.0, 62.0, 62.0), documenting the stacked controls.
  • Fix head 3623212: run 30432903341 — same test passed (Executed 1 test, with 0 failures) on the iOS 26.5 iPhone simulator.

The package-conventions-lint and mobile-core-package job failures in both runs are pre-existing on main (same failures in baseline run 30418897145) and untouched by this PR.

Note: #9130 addresses the same overlap with a different placement (New Task moved to the top navigation bar and a MobilePrimaryTabScaffold rewrite); it is currently conflicting with main after #9129 merged. This PR keeps New Task at the bottom above the search pill and is mergeable against current main; one of the two should be closed.

@azooz2003-bit
azooz2003-bit merged commit 7200a8f into main Jul 29, 2026
6 checks passed
@azooz2003-bit
azooz2003-bit deleted the fix-ios-bottom-search-compose-overlap branch July 29, 2026 18:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant