Repository navigation
cmux-next iPhone: reply thread line, single Chief push, swipe actions close before the sidebar - #24202
Conversation
… beside the quote) The thread line's geometry moves into CmuxConversationGeometry (ConversationReplyThread) unchanged; the new tests describe Messages' line, which drops from under the quote, and fail on the current geometry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The inline reply's thread line started beside the quote at its middle: a hook stuck out of the quote's leading side and the line crossed the quote's tail, then ran under the quote toward a reply far on the other side. Messages drops the line from under the quoted bubble (its tail, or a group's avatar column) and turns it toward a reply on the other side in a short curve level with the reply's middle; a reply on the quote's own side gets a straight line that stops above it (a group reply: above its avatar). A quote of an outgoing message threads down the trailing side. The row keeps room for the quote's tail below it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With the Cloud Chief ready and a Mac linked, Home pins the Cloud Chief and the Mac Chief side by side in one List row. Both pins were NavigationLinks, and List treats the row as one cell: a tap there activated both links, so the stack pushed the Cloud Chief and then the Mac Chief over it (the user's recording: a push, then a second push a moment later). The pins are plain buttons now that push their own route through Home's open handler. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ver open row actions Adds the shared RowSwipeActions registry, the List swipe-action button style the Feed will share, and the drawer's mayOpen(at:) seam; the drawer does not consult open rows yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e drawer opens As in Mail and Messages: while a row's swipe actions are open, a rightward swipe closes them and never opens the team drawer; the drawer opens only when no row actions are open. Covers every list: List rows (Workspaces, Home, Settings > Devices, artifacts, checkpoints) are found slid open in the view tree, and the Feed's own rows report open state through RowSwipeActions and name their pan so the drawer waits for it. The Feed's swipe actions now use the same buttons as List's swipe actions on Workspaces and Home (RowSwipeActionButton): tinted capsules with their titles under them, inset from the row's edge, instead of full-height rectangles. Same actions, haptic and full swipe. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s the drawer shut UIKit leaves its List swipe actions view in the hierarchy at full width after the row closes, so counting it kept every later rightward swipe from opening the drawer (found live on the iOS 26.5 simulator). An open row is a cell slid off its laid-out place. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… sibling cells Live on the iOS 26.5 simulator the drawer still opened over an open Home row: UIKit starts closing the row as the finger lands, before the drawer's pan asks to begin, and SwiftUI's List slides the open cell's layout attributes with it. The drawer now notes at touch-down whether a List row is open, and an open row is the cell off the leading edge its siblings share (or left of the content, for a lone row). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rd the reply Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Chief answers the workspace request inline (an incoming reply quoting an outgoing message), and the user's thanks quotes Chief (the user's reported case), so demo builds show both reply quote directions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ext-ios-ui-fixes # Conflicts: # cmux-next-ios/CmuxMobileKit/Sources/CmuxMobileChief/ConversationsHome.swift
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on f61b6a1 to compare; do not merge until green; see lane-rules |
|
Found 11 test failures on Blacksmith runners: Failures
...and 1 more test failures. View all on Blacksmith
|
|
Bead |
…e drawer - A reply on the quote's own side keeps room for a visible straight line (it was a dot), and the line meets the reply's first piece of content (a photo or file above the caption), never runs through it. - A Feed row closes when it leaves the screen, so no open row outlives its registration; registration keys are per Feed screen; the full-swipe threshold stays past an open row's reveal; buttons fit short rows. - Open-row detection counts only vertical lists (no grids, pagers or carousels) and only leftward slides; the touch-down probe walks the tree only where the drawer could open. - A Chief pin's open handler is required. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ame-side reply keeps room for its line The line ends in a short level run toward a reply on the other side. A reply on the quote's own side keeps room for a visible straight line, and the line meets the reply's first piece of content (a photo or file above the caption). Same commits as #24202. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review (correctness-first subagent): findings and resolutionReviewed 19c065e (read-only). No blockers. Fixed in 3145bc8 unless noted.
Tests after the fixes: CmuxConversationGeometryTests 255/255, CmuxMobileChiefTests 68/68, CmuxMobileShellTests 10/10 (iOS 26.5 simulator on a fleet mini). Head build, light and dark: the reply lines in both directions and the Feed's buttons. CI reds on this PR are base findings, not from this change: Upstream: the same CmuxConversation commits are in #24208 ( |
…ext-ios-ui-fixes # Conflicts: # cmux-next-ios/CmuxMobileKit/Sources/CmuxMobileChief/ConversationsHome.swift
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)

Fixes three user-reported UI bugs in the cmux-next iPhone app, plus the Feed swipe-button style.
1. Reply quote thread line (CmuxConversation)
Cause.
MessageCellLayoutstarted the thread line beside the quote at its vertical middle (min(quoteBodyLeading - 4, x + 14), then a curve into the avatar column at x = margin + 16). In a 1:1 chat that put a hook outside the quote's leading edge, through the quote's tail and down into a second curve under it, which is the stray "hook" in the user's screenshot.Fix. The line's geometry moves into
CmuxConversationGeometry/ConversationReplyThread(shared, unit-tested). As in Messages, the line drops from under the quoted bubble's tail (or, in a group, from the avatar column beside an incoming quote). For a reply on the other side it turns toward the reply in a short curve level with the reply's middle and ends short of it. For a reply on the same side it is a straight line that stops above the reply (or the replier's avatar). The row now keeps room for the quote's tail. The quote bubble itself is unchanged: an outlined bubble with its tail, in the colors the iMessage team measured.Compared with Messages screenshots (How-To Geek, Gadget Hacks; Messages' line drops from under the quoted bubble and curls toward the reply), in both directions and in both modes:
Packages/iOS/CmuxConversationstays byte-identical tofeat-imsg-parity-gui; the same commits land there too (linked below). The macOS surface (CmuxConversationMacUI) has its own thread layout inMacConversationRowsand does not share this code; it already drops the line from under the quote.2. Opening a Chief pushes twice
Cause. With the Cloud Chief ready and a Mac linked, Home pins the Cloud Chief and the Mac Chief side by side in one
Listrow. Both pins wereNavigationLink(value:).Listtreats the row as one cell, and a tap there activates every link in it, so the stack pushed the Cloud Chief and then the Mac Chief over it. That matches the user's recording: a push, then a second push about a second later. A minimal SwiftUI app reproduces it (two links in one List row, one tap gives depth 2):Videos: before, after
Fix. The pins are plain buttons that push their own route through Home's
openhandler. Update: #24170 (Home parity) landed first and rebuilt Home with button rows and tiles, which carries the same fix, so after the merge this PR'sConversationsHome.swiftmatches the base. This PR keepsChiefPinPushTestsas the regression guard (it passes on the merged head).3. Swipe actions vs the hamburger drawer
Cause. The drawer's pan began for any rightward pan on a tab root, including one over a row whose trailing actions were open (Workspaces, Home, Settings > Devices and the other
Lists). The Feed's custom rows already closed first.Fix. As in Mail and Messages, while a row's actions are open, a rightward swipe closes them and never opens the drawer; the next one does.
RowSwipeActions(CmuxMobileDesign) tells the drawer about open rows.Listrows are read at touch-down, because UIKit starts closing the row as the finger lands. An open row is a cell slid off the leading edge its siblings share (SwiftUI's List slides the layout attributes with it, and UIKit leaves its actions view in place after closing). Feed rows report their open state and name their pan, and the drawer waits for that pan.Videos: Home before, Home after, Workspaces before, Workspaces after, Feed before, Feed after
Feed swipe buttons. The Feed drew its own full-height rectangles. It now uses
RowSwipeActionButton, the same tinted capsules with captions thatList's swipe actions draw on Workspaces and Home (measured on iOS 26.5: 66 x 50 pt, 12 pt apart, 10 pt from the edge). Its actions, haptic, full swipe and close-first rule are unchanged. The swipe row is not in CmuxTabsKit, sofeat-cmux-next-tabs-kitneeds no change.Tests (red on base, green on head)
swift test)swift test --filter ConversationReplyThreadTests(Packages/iOS/CmuxConversation)cmux_mobile_kit-test-ios.sh CmuxMobileChiefTests/ChiefPinPushTestscmux_mobile_kit-test-ios.sh CmuxMobileShellTests/RowSwipeActionsDrawerTestsObserved / Not run
Changelog
No capture: native iPhone UI; simulator captures above (cmux-ci capture drives the Mac app).
🤖 Generated with Claude Code