Skip to content

Fix #3465: stop tab indicator animation glitch - #3969

Closed
austinywang wants to merge 11 commits into
mainfrom
issue-3465-tab-indicator-glitch
Closed

austinywang wants to merge 11 commits into
mainfrom
issue-3465-tab-indicator-glitch

Conversation

@austinywang

@austinywang austinywang commented May 12, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Advances vendor/bonsplit to Fix tab indicator selection chrome bonsplit#125 (78de1d7) for the tab-indicator glitch fix.
  • Keeps selected-tab chrome as a computed projection of the current selectedTabId plus the measured tab frame map, removing stale selected-frame preference state from the indicator path.
  • Disables incidental tab-bar hover/press/visibility animation so rapid Next/Previous Surface selection snaps the active chrome atomically.
  • Bounds and hard-clips the split action lane during measurement/overflow states so the indicator and split controls keep stable geometry even before tab widths are fully known.

Repro

Steps used locally before the fix:

  1. Focused a cmux workspace with a pane containing two terminal surfaces.
  2. Rapidly alternated the default Next Surface / Previous Surface shortcuts (Cmd+Shift+], then Cmd+Shift+[), including a repeated near-instant sequence.
  3. Observed the tab-bar active indicator/selection chrome visually transition during rapid selection instead of snapping atomically to the selected surface.

Observed: the blue active-tab indicator can visually lag or jump during rapid shortcut alternation.
Expected: the indicator tracks the selected surface immediately with no intermediate animated state.

Testing

  • Not run locally per repo policy.
  • Bonsplit PR Fix CJK IME input (Korean, Chinese, Japanese) #125 CI passed.
  • Bonsplit coverage includes selected-frame derivation, no-animation tab-bar policy, bounded split action lane measurement, and overflow rendering checks.
  • This cmux PR updates only the vendor/bonsplit submodule pointer and is being driven through required PR checks.

Closes #3465

@vercel

vercel Bot commented May 12, 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 May 19, 2026 5:13am
cmux-staging Building Building Preview, Comment May 19, 2026 5:13am

@coderabbitai

coderabbitai Bot commented May 12, 2026 •

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

The vendor/bonsplit submodule pointer is updated to a new commit SHA (from e1d9954a... to e293ad6173...).

Changes

Bonsplit Submodule Update

Layer / File(s) Summary
Submodule pointer update
vendor/bonsplit
The vendor/bonsplit submodule reference is updated from commit e1d9954a... to e293ad6173....

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~2 minutes

Possibly related PRs

  • manaflow-ai/cmux#4121: Also advances the vendor/bonsplit submodule commit reference in a related update.

Poem

🐇 I hopped through hashes, one then two,
Bonsplit's new home snug and true,
A tiny bump, a quiet cheer,
The vendor lands a fresh new year. ✨

🚥 Pre-merge checks | ✅ 16
✅ Passed checks (16 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately reflects the main objective of the PR—fixing the tab indicator animation glitch reported in issue #3465. It is concise and specific to the primary change.
Linked Issues check ✅ Passed The PR fully addresses #3465 objectives: disables tab-bar animations to prevent glitching and derives indicator frame from current selectedTabId and measured tab frames to ensure atomic updates during rapid selection changes.
Out of Scope Changes check ✅ Passed All changes are scoped to the vendor/bonsplit submodule update addressing the tab indicator glitch. Author explicitly noted leaving unrelated auth-concurrency concerns out of scope, keeping the PR focused.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Cmux Swift Actor Isolation ✅ Passed PR only updates vendor/bonsplit submodule reference. No production Swift code in main codebase modified. Submodule updates are dependency management, not subject to actor isolation review.
Cmux Swift Blocking Runtime ✅ Passed PR updates vendor/bonsplit submodule to fix tab animation glitch. No blocking runtime primitives (semaphores, sleeps, waits, locks) introduced in main Swift code.
Cmux No Hacky Sleeps ✅ Passed PR changes only Swift files (6 .swift) and vendor/bonsplit submodule. Check applies to TS/JS/shell only; Swift covered separately. No TS/JS/shell changes present.
Cmux Swift Concurrency ✅ Passed PR updates only vendor/bonsplit submodule reference. Check applies to cmux-owned Swift code; rules explicitly exclude /vendor/ subtrees. No cmux code changed.
Cmux Swift @Concurrent ✅ Passed PR only updates vendor/bonsplit submodule reference. No Swift source code changes in main repository. @concurrent check not applicable.
Cmux Swift File And Package Boundaries ✅ Passed PR updates only vendor/bonsplit submodule reference. The custom check explicitly excludes /vendor/ path subtrees and allows vendored code. No production Swift files in the main repo are changed.
Cmux Swift Logging ✅ Passed PR updates vendor/bonsplit submodule and refactors Web Inspector code. No logging statements added or modified. No print, debugPrint, dump, NSLog, or Logger violations detected.
Cmux User-Facing Error Privacy ✅ Passed PR only updates vendor/bonsplit submodule; no user-facing error messages, alerts, or command output modified. The change is a visual animation fix unrelated to error messaging.
Cmux Swiftui State Layout ✅ Passed The PR only updates the vendor/bonsplit submodule reference (from 0000000 to e293ad6...). No SwiftUI state or layout changes were made in the main codebase. The check is not applicable.
Cmux Architecture Rethink ✅ Passed Fix converts preference-based state to computed property, eliminating stale state. Uses idiomatic transaction(animation: nil) for animation. Single owner, clear invariants.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR only updates vendor/bonsplit submodule reference; no Swift files in main repo changed. Custom check is not applicable to submodule reference-only updates.
Description check ✅ Passed PR description is comprehensive and well-structured, covering what changed, why, repro steps, testing approach, and issue closure.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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-3465-tab-indicator-glitch

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 and usage tips.

@greptile-apps

greptile-apps Bot commented May 12, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR bumps the vendor/bonsplit submodule to fix a tab-bar active-indicator animation glitch (#3465) that caused the selection chrome to visually lag or animate during rapid Next/Previous Surface switching instead of snapping immediately.

  • The submodule advances through three commits: a regression test covering the animation policy, disabling incidental hover/press/visibility animations on tab-bar buttons, and a follow-up that corrects the indicator frame to derive from the current selectedTabId and measured tab frame map rather than stale selected-frame preference state.
  • No production Swift source files in the main repo are modified; all changes are contained within the vendor/bonsplit dependency.

Confidence Score: 5/5

Safe to merge — the change is a submodule pointer bump with no direct modifications to production Swift sources in the main repo, and the three submodule commits are covered by a regression test.

The entire diff is a single submodule pointer advance. All behavioral changes (disabling tab-bar animations and fixing indicator frame derivation) are encapsulated in the vendor/bonsplit dependency and are accompanied by a Bonsplit regression test. No production Swift code in the main repository is touched, so the blast radius is limited to UI rendering of the tab indicator.

No files in the main repository require special attention; the submodule content is not directly inspectable from this review context.

Important Files Changed

Filename Overview
vendor/bonsplit Submodule pointer bumped from b5dd1f0 to 78de1d7, incorporating three commits: a regression test for the animation policy, animation-disable fix for tab-bar button hover/press/visibility, and a frame-derivation fix that derives the selected indicator from currentSelectedTabId rather than stale preference state.

Sequence Diagram

sequenceDiagram
    participant User
    participant cmux as cmux (Next/Prev Surface)
    participant TabManager
    participant Bonsplit as Bonsplit TabBar

    User->>cmux: Cmd+Shift+] / Cmd+Shift+[
    cmux->>TabManager: setSelectedTabId(newId)
    TabManager->>Bonsplit: update(selectedTabId, measuredTabFrames)
    Note over Bonsplit: (before fix) derives indicator frame from stale selectedFrame preference
    Note over Bonsplit: (after fix) derives indicator frame from currentSelectedTabId + tab frame map
    Bonsplit-->>Bonsplit: No animation (hover/press/visibility animations disabled)
    Bonsplit->>User: Indicator snaps atomically to selected tab
Loading

Reviews (11): Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." | Re-trigger Greptile

Comment thread vendor/bonsplit Outdated
@austinywang
austinywang force-pushed the issue-3465-tab-indicator-glitch branch from 0abc0b7 to feba6fb Compare May 12, 2026 05:06
@austinywang
austinywang force-pushed the issue-3465-tab-indicator-glitch branch from feba6fb to 17381a3 Compare May 12, 2026 06:13
Comment thread vendor/bonsplit Outdated
@austinywang

Copy link
Copy Markdown
Contributor Author

Post-CI feedback sweep:

  • Greptile now reports the earlier frame-derivation and merge-history concerns as resolved.
  • CodeRabbit's pre-merge Cmux Swift @Concurrent note points at Sources/Auth/AuthManager.swift::refreshSession(), which is unchanged by this Bonsplit-only PR (vendor/bonsplit submodule pointer only). I am leaving that inherited auth-concurrency concern out of scope here to avoid mixing an unrelated auth refactor into the Blue tab selection indicator glitches when rapidly switching surfaces with prev/next surface shortcuts #3465 tab indicator fix.
  • All required GitHub checks are green; optional Vercel preview deployments are still queued by Vercel.

…-3465-tab-indicator-glitch

# Conflicts:
#	vendor/bonsplit
@lawrencecchen lawrencecchen added the stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening. label Sep 23, 2026
@github-project-automation github-project-automation Bot moved this from Todo to Done in cmux backlog Sep 23, 2026

This branch was successfully deployed

1 active deployment
Preview – cmux — 857f299b Deployed May 19, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Blue tab selection indicator glitches when rapidly switching surfaces with prev/next surface shortcuts

3 participants