Skip to content

Fix overflowing tab selection scroll and chrome alignment - #8071

Merged
austinywang merged 3 commits into
mainfrom
issue-8069-tab-overflow-scroll
Jul 14, 2026
Merged

austinywang merged 3 commits into
mainfrom
issue-8069-tab-overflow-scroll

Conversation

@austinywang

@austinywang austinywang commented Jul 14, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • update bonsplit to use one MainActor AppKit geometry authority for tab frames, viewport scrolling, and selection chrome
  • make the selected-tab visible rect exclude the trailing action lane, shifting right-edge tabs far enough left to expose their close buttons
  • align the blue active indicator with the same right-edge fade as the selected tab content
  • keep reveal intent pending until the selected item container reports its final live frame
  • preserve programmatic reveal ownership through layout-driven clip-view bounds changes, while handing ownership back when live user scrolling begins
  • remove competing SwiftUI proxy scrolling and queued clip-view corrections

Paired component PR

Regression coverage

  • Bonsplit 033997e adds failing lifecycle tests for late scroll-view attachment and SwiftUI restoring a stale clip offset
  • Bonsplit f647ae3 preserves pending reveal intent through attachment/layout and makes those lifecycle regressions pass

Verification

  • arch -arm64 swift test in vendor/bonsplit: 197 tests passed
  • tagged cmux Debug build succeeded and was launched with ./scripts/reload.sh --tag issue-8069-tab-overflow-scroll --launch
  • python3 scripts/swift_file_length_budget.py was run and reports five pre-existing over-budget cmux files unchanged by this pointer-only parent diff

Localization audit

No user-facing strings were added or changed, so no English/Japanese catalog entries are required.

Addresses #8069

Summary by CodeRabbit

  • Chores
    • Updated an integrated third-party component to a newer revision.
    • Maintenance update only, with no intentional end-user feature changes or behavior modifications.
    • No action is required from users.

@vercel

vercel Bot commented Jul 14, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment Jul 14, 2026 7:41pm
cmux-staging Building Building Preview, Comment Jul 14, 2026 7:41pm

@coderabbitai

coderabbitai Bot commented Jul 14, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The vendor/bonsplit git submodule pointer is updated from commit a0400b3 to f647ae3.

Changes

Bonsplit submodule update

Layer / File(s) Summary
Advance Bonsplit revision
vendor/bonsplit
Updates the submodule reference to commit f647ae39b34383808648b68dd43090143c6cd7cb.

Estimated code review effort: 1 (Trivial) | ~2 minutes

Possibly related issues

Possibly related PRs

Suggested reviewers: lawrencecchen, azooz2003-bit

🚥 Pre-merge checks | ✅ 25
✅ Passed checks (25 passed)
Check name Status Explanation
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 Changes are confined to a MainActor AppKit tab-geometry registry and tests; no new service protocols, Sendable refs, or background UI access were introduced.
Cmux Swift Blocking Runtime ✅ Passed The vendored commit adds notification-driven scroll reconciliation; scans of changed files found no semaphores, waits, sleeps, main.sync, or locks, and only existing tests use RunLoop timing.
Cmux Browser Automation Off-Main ✅ Passed Only vendor/bonsplit submodule pointer changed; no edits to the rule-scoped browser automation files or tests, so no off-main routing issue is introduced.
Cmux Expensive Synchronous Load ✅ Passed Parent diff is only a vendor/bonsplit gitlink bump; no Swift source changed in the main repo, so this sync-load rule isn’t implicated.
Cmux Cache Substitution Correctness ✅ Passed Change only adjusts transient tab scroll/geometry logic with live-scroll observers and freshness checks; no persistence/history/undo/snapshot cache substitution.
Cmux No Hacky Sleeps ✅ Passed Only vendor/bonsplit submodule pointer changed; no TS/JS/shell/runtime-script sleeps or timing hacks were introduced. Swift changes are out of this check's scope.
Cmux Algorithmic Complexity ✅ Passed f647 adds direct map lookups and one-pass observer iteration; no nested scans, repeated sorts/filters, or per-target rescans were introduced.
Cmux Swift Concurrency ✅ Passed Diff only updates vendor/bonsplit submodule pointer; no cmux-owned Swift code or new concurrency patterns were introduced.
Cmux Swift @Concurrent ✅ Passed No changed Swift concurrency annotations or actor-hopping issues; only UI-bound sync AppKit geometry updates and a main-queue test hop were added.
Cmux Swift File And Package Boundaries ✅ Passed Only a vendored submodule pointer changed under vendor/bonsplit; the boundary rule explicitly allows vendored code and no cmux Swift source grew or mixed responsibilities.
Cmux Swiftpm Lockfiles ✅ Passed Only vendor/bonsplit gitlink changed; it's a vendored third-party submodule, and no cmux-owned .gitignore, Package.swift, or cmux.xcodeproj package-reference changes occurred.
Cmux Swift Logging ✅ Passed Parent diff only bumps vendor/bonsplit as a gitlink; no Swift source or logging statements were added or changed.
Cmux User-Facing Error Privacy ✅ Passed The PR only updates the vendor/bonsplit submodule pointer; no user-facing error/alert/recovery text changed in the parent diff, and the vendored change is layout-focused.
Cmux Full Internationalization ✅ Passed Only the vendor/bonsplit gitlink changed; no Swift text, catalogs, web messages, or Info.plist entries were modified.
Cmux Swiftui State Layout ✅ Passed PASS: the changed bonsplit commits only add AppKit registry/bridge updates and tests; no new ObservableObject, @Published, GeometryReader, or render-time state writes appear.
Cmux Architecture Rethink ✅ Passed Pointer-only bonsplit bump; the parent diff adds no Swift code and the described change is a local correctness fix with clear ownership/invariants, not a timing/split-lifecycle patch.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed Only the vendor/bonsplit gitlink changed; the outer diff adds no Swift NSWindow/WindowGroup code or cmux window-ID changes.
Cmux Source Artifacts ✅ Passed Only vendor/bonsplit changed, and it is a deliberate submodule pointer update, not a local/generated artifact.
Cmux No Test Or Debug Seam In Production Source ✅ Passed The PR only bumps vendor/bonsplit as a submodule gitlink; no production Swift Sources files or test/debug seams were added in this repo diff.
Cmux No Ambient Global State ✅ Passed The diff only updates instance methods in TabBarItemGeometryRegistry.swift; no new free funcs, globals, static-only namespaces, or singletons were added.
Title check ✅ Passed The title clearly matches the main change: fixing tab overflow scroll and chrome alignment.
Description check ✅ Passed The description covers summary, verification, and regression coverage, with only minor template sections like demo video and checklist omitted.
✨ 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 issue-8069-tab-overflow-scroll

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.

@greptile-apps

greptile-apps Bot commented Jul 14, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR updates bonsplit’s overflowing tab selection behavior. The main changes are:

  • Uses one MainActor AppKit authority for tab geometry and scrolling.
  • Keeps selected tabs and close buttons clear of the trailing action lane.
  • Aligns the active indicator with the tab’s right-edge fade.
  • Waits for the selected item’s live frame before completing reveal.

Confidence Score: 5/5

This looks safe to merge.

  • No blocking issues found in the updated code.

Important Files Changed

Filename Overview
vendor/bonsplit Updates the bonsplit submodule revision containing the tab geometry, overflow scrolling, reveal lifecycle, and selection chrome changes.

Reviews (3): Last reviewed commit: "Update bonsplit tab scroll lifecycle" | Re-trigger Greptile

This branch was successfully deployed

1 active deployment
Preview – cmux — 643b9d63 Deployed Jul 14, 2026 by vercel[bot]
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