CmuxConversation iOS: the reply thread drops from under the quote's tail

Merged
AZ
15d ago
+238-15

Upstream copy of the CmuxConversation part of #24202 (feat-cmux-next), so Packages/iOS/CmuxConversation stays byte-identical on both branches (the TestFlight builder checks for drift).

Cause. MessageCellLayout started the thread line beside the quote at its middle, which drew a hook out of the quote's leading side through its tail (user report in Chief, 2026-10-21).

Fix. The line comes from ConversationReplyThread (CmuxConversationGeometry). It drops from under the quoted bubble's tail (or, in a group, the avatar column beside an incoming quote), turns toward a reply on the other side level with the reply's middle, and ends in a short level run before the reply. A same-side reply gets a straight line that stops above it. The row keeps room for the quote's tail. Before/after against Messages, in both directions and light and dark: see #24202.

Tests. swift test --filter ConversationReplyThreadTests on a fleet mini: 6 tests with 13 issues on the old geometry, all pass now. All 255 CmuxConversationGeometryTests pass.

The macOS UI (MacConversationRows) has its own thread layout and is unchanged.

šŸ¤– Generated with Claude Code


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


Summary by cubic

Fixes the inline reply thread line in CmuxConversation iOS so it no longer draws a hook out of the quote's leading side through its tail.

  • The ConversationReplyThread geometry drops the line from under the quote's tail (or a group's avatar column), turns it toward a reply on the other side level with the reply's middle, and ends in a short level run short of the reply; same-side replies get a straight line that stops above them.
  • The line meets the reply's first piece of content, so a photo or file above the caption is never crossed.
  • Rows now keep room for the quote's tail and for a same-side reply's straight line.
  • Keeps Packages/iOS/CmuxConversation byte-identical with the feat-cmux-next branch's #24202, so the TestFlight drift check passes.
  • Adds ConversationReplyThreadTests (6 tests, all failing on the old geometry) plus a new geometry suite (255 tests).