f4d4c82910c24189900cbbf63bd7de8323cc5d8c
Tapping a group's heading used to send that heading up off the top of the screen and fill the space above it, so the calls appeared on the far side of the control that produced them. The transcript is laid out from the bottom, so every row's bottom edge is what the list holds still and all growth goes upward. The rule now is that the end the reader pressed is the end that must not move. A heading anchors the top, so the row opens downwards under it; the bar at the foot of an open group anchors the bottom, so shutting it from there leaves what follows the group where it is -- which is what already happened, but by accident of the layout rather than on purpose, and would have been lost the moment anything else changed. Bottom is the list's own behaviour and costs nothing. Top is measured rather than calculated: only the layout knows how tall an open group is, so `toggleAnchored` reads where the top edge was, lets the change land, and scrolls by however far it moved. Applied to every row that opens, not just groups -- a lone tool call and a peer message are the same gesture, and one of them opening the other way would be the odder for it.
Languages
Rust
54%
Kotlin
43.6%
Shell
2.4%