fix(cmux-next): animate side-open tabs in their destination pane
Leo reported: “the animation ... starts ... on the main pane, right? But then you open up the second pane, and then it does it again there ... The order of operations is not good.”
A side-bound open was created in the source pane, so TabStripView animated it there before TabMoves created the destination. This PR adds an OutboundTab placement hold: source strips hide only the tab being moved, the destination is allowed to mount, and the tab is exposed once in its final pane. The hold handles a daemon echo before the move answer, move failure, pane teardown, user selection, reused IDs, and provisional stand-ins.
Changelog
- Fixed: side-open tabs animate once in their final pane instead of flashing/animating in the source pane first.
Validation
swiftc -parsepassed for the changed Swift sources on Big Red.git diff --checkpassed.- Added
SideOpenStripTestscovering source suppression, final-pane reveal, failed moves, selection, stand-ins, reused IDs, and move-before-source-drop. - Native build, Swift tests, and frame timing are fleet-only and remain to be attached from the exact head
45b349a5d13d950d44b8cbf8d2fcc4bd90661e4cusingmotion-proof.py/golden.py. - Timer cleanup:
OutboundTabownsDemandTimerand cancels it on finish/drop; source teardown and rejection clear the hold; no new polling loop was added.
Agent session: big-red
![View with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v3-3x.png)
![Autofix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark-3x.png)
Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Fixes side-opened tabs animating in their source pane before reaching their destination pane. Links, files, and agent tabs opened to the right were created unselected in the pane they opened from, so TabStripView animated them there before TabMoves moved them into a new split, column, or dock chat.
Adds OutboundTab, a placement hold that keeps the tab out of the source strip until it lands in its final pane, so the opening animation plays only once, there.
- Source strips hide only the outbound tab; the destination pane mounts and lists it normally.
- The hold releases on failed moves, pane teardown, user selection mid-move, reused tab IDs, and provisional stand-ins, and follows agent tab ids when they are rekeyed.
- Adds
SideOpenStripTestscovering source suppression, final-pane reveal, failed moves, selection, stand-ins, reused IDs, and move-before-source-drop.