# gpui: Fix scrollbar drag position calculation in list \(\#53378\) · gitcafe/zed

[View on GitCafe](https://git.cafe/gitcafe/zed/commit/1c61cc3fc278c1fbdbfe156b5c8c180336eebc40)

Repository: [gitcafe/zed](https://git.cafe/gitcafe/zed)

Visibility: public

Requested revision: 1c61cc3fc278c1fbdbfe156b5c8c180336eebc40

Requested commit: 1c61cc3fc278c1fbdbfe156b5c8c180336eebc40

Commit: 1c61cc3fc278c1fbdbfe156b5c8c180336eebc40

Tree: 28db0448d6b82ca874d69c659e96640d058a7a20

Author: KlausUllrich

Committer: GitHub

## Message

```
gpui: Fix scrollbar drag position calculation in list (#53378)

## Summary

Fixes scroll position inversion when content height changes during a
scrollbar drag (e.g. in the agent panel while streaming responses).

### Root cause

`set_offset_from_scrollbar` used the **live** `items.summary().height`
for `content_height` and computed a `drag_offset` correction (`live −
frozen`). However, `max_offset_for_scrollbar()` → `max_scroll_offset()`
already uses the **frozen** `scrollbar_drag_start_height` during drag.
This mismatch means:

1. The scrollbar computes thumb position using the frozen height range
2. `set_offset_from_scrollbar` converts that position using the live
height range
3. As content grows during drag, `drag_offset` increases
4. `(point.y - drag_offset).abs()` produces an incorrectly large value,
overshooting `scroll_max`

The `.abs()` call also masked the sign convention:
`compute_click_offset` (in `scrollbar.rs`) returns `-max_offset *
percentage` — a negative value — but `.abs()` converted it regardless of
sign, hiding the mismatch.

### Fix

- Use `scrollbar_drag_start_height` (frozen during drag) for
`content_height` in `set_offset_from_scrollbar`, matching
`max_scroll_offset()`. Both sides of the scrollbar mapping now use the
same height reference.
- Replace `(point.y - drag_offset).abs()` with `(-point.y)` to correctly
convert the negative scroll offset.
- Remove the symmetric `drag_offset` from
`scroll_px_offset_for_scrollbar`, which reported position back to the
scrollbar and suffered from the same inconsistency.
- Update existing tests to use negative offsets, matching the actual
values produced by the scrollbar component.
- Add a regression test that freezes height, grows content, drags the
scrollbar, and asserts the position is correct.

## Test plan

- [x] Existing tests updated to use correct sign convention (negative
offsets)
- [x] New regression test `test_scrollbar_drag_with_growing_content`:
verifies scroll position remains correct when content grows during a
scrollbar drag
- [ ] Manual: open agent panel, start a long generation, drag scrollbar
while content is streaming — position should track the thumb correctly

Release Notes:

- Fixed scrollbar position jumping or inverting when content height
changes during a scrollbar drag (e.g. in the agent panel while
streaming).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
```

## Parents

- [592727b892870cc3d92c186e9aa0a0cfbab2754d](https://git.cafe/gitcafe/zed/commit/592727b892870cc3d92c186e9aa0a0cfbab2754d?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zed/tree/1c61cc3fc278c1fbdbfe156b5c8c180336eebc40?format=markdown)
