Skip to content

fix(web): dragging a sidebar thread no longer scrolls the list out from under the pointer - #30346

Merged
juliusmarminge merged 2 commits into
mainfrom
t3/fix-working-section-file-drop
Nov 5, 2026
Merged

juliusmarminge merged 2 commits into
mainfrom
t3/fix-working-section-file-drop

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Nov 3, 2026 •

Copy link
Copy Markdown
Member

Dragging a thread in the sidebar was broken whenever the list was taller than the sidebar, which the Working section makes common. On the first move the list jumped several rows, so the drop landed somewhere other than under the pointer.

The cause is the Settled drop hint. It shows for every drag, and since https://git.cafe/pingdotgg/t3code/pulls/26736 it scrolls itself into view whenever its drag transform changes. Starting any drag therefore scrolled the sidebar to the bottom (0 → 343px in the repro) while the pointer stayed put.

The hint now scrolls into view only while Settled is the drop target, which is what https://git.cafe/pingdotgg/t3code/pulls/26736 was for.

Before (Working section on): the list jumps on the first move and rows overlap.

Before: the list jumps and rows overlap mid-drag

After: the list stays put and rows shift under the pointer.

After: rows reorder in place mid-drag

Dragging down to Settled still brings the hint into view:

After: Settled hint scrolls into view when it is the drop target

A second case made the list jump while the pointer was held still near the bottom. Projected rows count toward the list's scroll range, so the range shrank whenever the target flipped between Active and Settled. The browser clamped scrollTop, rows moved under the pointer, and the target flipped back, looping with auto-scroll. The list now reserves the largest projected overflow (two boundary labels and two hints, 120px) for the whole drag, so the range stays constant.

Before: holding a row at the bottom, the list keeps jumping.

Before: held drag near the bottom, list oscillates

After: the list settles once and Settled stays the target.

After: held drag near the bottom settles

Verified in a dev build with agent-browser, with the Working section on and off, including a working thread finishing mid-drag.

Claude Opus 5.5 in Claude Code.

🤖 Generated with Claude Code

…om under the pointer

The Settled drop hint scrolled itself into view on every drag, so a tall
sidebar jumped to the bottom as soon as a drag started. Reveal it only
while Settled is the drop target.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Nov 3, 2026
macroscopeapp[bot]
macroscopeapp Bot previously approved these changes Nov 3, 2026
@macroscopeapp

macroscopeapp Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at d65efb3

Macroscope's review found this PR approvable — This stabilizes sidebar scrolling during thread dragging by reserving overflow space and limiting automatic placeholder scrolling to the drop target. Its effects are confined to transient UI behavior, with no changes to saved data or thread actions.

You can add or adjust custom eligibility rules. Learn more.

@github-actions github-actions Bot added the size:XS 0-9 changed lines (additions + deletions). label Nov 3, 2026
@coderabbitai

coderabbitai Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Explain Change →

No actionable comments were generated in the recent review.

Walkthrough

During an active thread drag, the sidebar list gains a non-interactive bottom extension. A settled placeholder reveals overflow only when its hint is shown and it is the current drop target.

Changes: Sidebar drag scroll

Layer / File(s) Summary
Adjust sidebar scroll behavior during drag
apps/web/src/components/Sidebar.tsx, apps/web/src/components/sidebar/SidebarListMarkers.tsx
During an active drag, the list gains a non-interactive bottom extension. revealOverflow also requires isDropTarget when the marker is settled-placeholder and the hint is shown.

Estimated code review effort: 2 (Simple) | ~8 minutes

Change: Bug fix

Possibly related issues

  • pingdotgg/t3code#27669: The issue concerns unexpected sidebar scrolling during a thread drag. This change adjusts the drag-time scroll range and drop-hint overflow condition.
  • pingdotgg/t3code#27586: The issue concerns thread movement during drag initiation or reordering. This change adjusts the sidebar list’s scroll range during a drag.

Suggested reviewers: yash-singh1, maria-rcks

Merge Risk: Minimal · up to d65ef

Sidebar dragging should be more stable. A narrow wheel-scroll case may still cause a small shift, but no merge-blocking risk is established.

Pre-merge checks: Passed 4

Check name Status Explanation
Title check Passed The title clearly and concisely describes the primary fix: preventing sidebar thread dragging from scrolling the list away from the pointer.
Description check Passed The description clearly documents the problem, root cause, implemented changes, screenshots, and focused verification. It does not explicitly include the Scope and approval section or explain an appro…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Description check

Explanation

The description clearly documents the problem, root cause, implemented changes, screenshots, and focused verification. It does not explicitly include the Scope and approval section or explain an approval exemption, but it is otherwise mostly complete and directly related to the fix.

Finishing Touches

Generate docstrings

  • Commit to this branch
  • Create a new PR
Generate unit tests (beta)

  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Recent review info

Run configuration

Commits

Reviewing files that changed from the base of the PR and between e4df6b9 and d65efb3.

Files selected for processing: 1

  • apps/web/src/components/Sidebar.tsx

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 7 remain after this review.

…makes the list jump

Projected drag rows count toward the list's scroll range, so the range
shrank whenever the drop target changed. The browser clamped scrollTop,
rows moved under the still pointer, and the target flipped back in a
loop with auto-scroll. Reserve the largest projected overflow for the
whole drag so the range stays constant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@macroscopeapp
macroscopeapp Bot dismissed their stale review November 5, 2026 19:27

Dismissing prior approval to re-evaluate d65efb3

@juliusmarminge
juliusmarminge merged commit 37481f0 into main Nov 5, 2026
32 of 33 checks passed
@juliusmarminge
juliusmarminge deleted the t3/fix-working-section-file-drop branch November 5, 2026 19:38
Pipyakas pushed a commit to Pipyakas/t3code that referenced this pull request Nov 5, 2026
…om under the pointer (pingdotgg#30346)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 37481f0)
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Nov 6, 2026
**v0.1.8-nightly.20261106.4247** · 67 changes from 19 contributors

- **Environment dictation.** Choose an environment for dictation in web and desktop, including desktop browser annotations.
- **Fresh sessions.** Use /clear to start a fresh session without leaving your thread.
- **Scheduled task sessions.** Run scheduled tasks in one thread, either continuing the conversation or starting fresh each time.
- **Secret requests.** Answer secret requests using a secret provider instead of copying and pasting credentials.
- **Snooze questions.** Snooze a thread with a pending question and answer it later.
- **Claude Ultracode.** Use Ultracode at any effort level, including with Claude Sonnet 5.5 and Haiku 5.5.
- **Faster pull requests.** Pull requests open faster using data already available in the app.

### Plus 31 more bug fixes and performance improvements.

<details>
<summary>Full changelog</summary>

## What's Changed
* fix(threads): side chats inherit parent permissions by default by @extoci in pingdotgg/t3code#31114
* fix(server): threads follow their worktree's branch changes by @Yash-Singh1 in pingdotgg/t3code#31599
* fix(pi): usage reports include sessions stored in a --session-dir launch argument by @saphid in pingdotgg/t3code#30690
* perf(mobile): skip unchanged terminal toolbar fade updates by @saphid in pingdotgg/t3code#25312
* perf(mobile): assemble HTML replacements in one pass by @saphid in pingdotgg/t3code#25278
* perf(mobile): skip canceled SVG parsing by @saphid in pingdotgg/t3code#25314
* test(server): strengthen v1 cutover proof with event-stream waits and content snapshots by @saphid in pingdotgg/t3code#11869
* fix(contracts): a stored secret reference is always sensitive by @yordis in pingdotgg/t3code#31403
* fix(server): a settings save no longer reads an unreadable secret again by @yordis in pingdotgg/t3code#31226
* fix(threads): allow snoozing pending input requests by @saphid in pingdotgg/t3code#20058
* fix(server): repair cutover test crypto import breaking main CI by @Yash-Singh1 in pingdotgg/t3code#31630
* feat(server): sends can start a fresh provider session by @juliusmarminge in pingdotgg/t3code#30323
* feat: /clear starts a fresh session in the same thread by @juliusmarminge in pingdotgg/t3code#30325
* feat: scheduled tasks can run in one thread with a fresh session each run by @juliusmarminge in pingdotgg/t3code#30326
* fix(web): dragging a sidebar thread no longer scrolls the list out from under the pointer by @juliusmarminge in pingdotgg/t3code#30346
* fix(assets): preserve the PR repository for GitHub media by @juliusmarminge in pingdotgg/t3code#21631
* fix(server): load PR uploads from SSO organizations by @juliusmarminge in pingdotgg/t3code#21632
* fix(mobile): the Duo inspector stops at its widest instead of vanishing by @juliusmarminge in pingdotgg/t3code#31665
* test(server): launcher PATH lookup test no longer drops the Windows drive letter by @tris203 in pingdotgg/t3code#22534
* test(server): replay tests delete their temp directories by @only21mil in pingdotgg/t3code#23445
* fix(mobile): transcribe Android audio during recording by @PixPMusic in pingdotgg/t3code#31300
* test(web): linked-environment subagents keep opening in their own thread by @RealDoc06 in pingdotgg/t3code#26492
* test(server): pin post-commit outbox settle boundary by @Narayan201120 in pingdotgg/t3code#27560
* test: remove unreachable github cli decoding test by @t3-code-bot[bot] in pingdotgg/t3code#28115
* test(server): retain delegated child events when detaching a parent by @benjamin-di in pingdotgg/t3code#29622
* test(lint): pin which ResizeObserver constructions no-raw-resize-observer reports by @only21mil in pingdotgg/t3code#28781
* test(mobile): drop two deleted tests from the React test list by @only21mil in pingdotgg/t3code#28800
* test(web): worked-for expand test waits for the timeline to finish loading by @saphid in pingdotgg/t3code#29661
* test(web): avoid PDF worker startup timeouts in attachment tests by @voltcrash in pingdotgg/t3code#29933
* test(web): source control writing settings test waits for the reset button by @juliusmarminge in pingdotgg/t3code#30372
* test(web): keep the work heading test inside the viewport by @voltcrash in pingdotgg/t3code#30613
* test: use an empty config file instead of the null device for git fixtures on Windows by @Pyseph in pingdotgg/t3code#30772
* test: remove stale tests for unused thread and onboarding helpers by @t3-code-bot[bot] in pingdotgg/t3code#30817
* test(server): correct Windows path and settings assertions by @ElliotDrel in pingdotgg/t3code#30983
* feat(claude): Ultracode works with any effort, like Claude Desktop by @Bil0000 in pingdotgg/t3code#27034
* perf(pr): pull requests paint from data already held, on web, desktop and mobile by @Bil0000 in pingdotgg/t3code#27798
* fix(mobile): approval card buttons line up by @shivamhwp in pingdotgg/t3code#31415
* fix(gitlab): author names link to GitLab profiles by @TonybynMp4 in pingdotgg/t3code#30418
* fix(gitlab): merge messages drop agent credits by @TonybynMp4 in pingdotgg/t3code#30441
* fix(gitlab): file and image comments appear as review threads by @TonybynMp4 in pingdotgg/t3code#30425
* fix(web): screen readers no longer read out a secret typed into the request card by @juliusmarminge in pingdotgg/t3code#31653
* perf(pr): actions update every client from the host's reply instead of re-reads by @Bil0000 in pingdotgg/t3code#25761
* feat(mobile): start side chats with /side by @juliusmarminge in pingdotgg/t3code#31709
* feat(claude): expose Ultracode on Claude Sonnet 5.5 and Haiku 5.5 by @DrSeedon in pingdotgg/t3code#30781
* feat(settings): Simlock, Antigravity and OpenCode credentials can come from a secret provider by @juliusmarminge in pingdotgg/t3code#31652
* refactor(mobile): screens declare what they are; layout and AppBar own every platform bar decision by @juliusmarminge in pingdotgg/t3code#31310
* fix(server): a saved source control token that can't be read no longer falls back to another account by @juliusmarminge in pingdotgg/t3code#31646
* feat(secrets): answer a secret request with a secret provider reference by @juliusmarminge in pingdotgg/t3code#31670
* fix(settings): removing a secret provider clears the fields that used it by @juliusmarminge in pingdotgg/t3code#31651
* docs(user): explain secret providers and secret requests by @juliusmarminge in pingdotgg/t3code#31654
* feat(server): transcribe audio on a chosen environment by @juliusmarminge in pingdotgg/t3code#30625
* feat(web): opt into environment dictation on this device by @juliusmarminge in pingdotgg/t3code#30623
* feat(desktop): dictate into browser annotations with the same consent by @juliusmarminge in pingdotgg/t3code#30624
* feat(mobile): opt in to dictation on a paired environment by @juliusmarminge in pingdotgg/t3code#31059
* fix(web): keep the folder path caret in place while editing by @juliusmarminge in pingdotgg/t3code#31642
* perf(mobile): call the highlights lexer through Nitro, up to 10x faster calls on Android by @camchis in pingdotgg/t3code#31188
* fix(claude): turns use the downloaded model catalog by @juliusmarminge in pingdotgg/t3code#31717
* fix(gitlab): bot authors are flagged as bots by @TonybynMp4 in pingdotgg/t3code#30383
* fix(gitlab): merge requests can edit their labels by @TonybynMp4 in pingdotgg/t3code#30483
* perf(mobile): faster thread sync, connects, and reconnects on bad wifi by @Bil0000 in pingdotgg/t3code#28487
* fix(mobile): iPad composer drops when the keyboard floats or minimizes by @juliusmarminge in pingdotgg/t3code#31251
* perf(mobile): stop iOS syntax highlighting from looking up a thread-local on every lexer call by @camchis in pingdotgg/t3code#31187
* fix(gitlab): edited comments wake PR watchers by @TonybynMp4 in pingdotgg/t3code#30403

## New Contributors
* @benjamin-di made their first contribution in pingdotgg/t3code#29622
* @ElliotDrel made their first contribution in pingdotgg/t3code#30983
* @DrSeedon made their first contribution in pingdotgg/t3code#30781

**Full Changelog**: pingdotgg/t3code@v0.1.8-nightly.20261105.4234...v0.1.8-nightly.20261106.4247

</details>


Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.8-nightly.20261106.4247
incognitojam pushed a commit to incognitojam/styal that referenced this pull request Nov 6, 2026
…om under the pointer (pingdotgg#30346)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 37481f0)
Upstream-PR: 30346
Early-Import: the sidebar drop hint fix scrolls the list to the bottom whenever a thread drag starts
incognitojam pushed a commit to incognitojam/styal that referenced this pull request Nov 6, 2026
…om under the pointer (pingdotgg#30346)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 37481f0)
Upstream-PR: 30346
Early-Import: the sidebar drop hint fix scrolls the list to the bottom whenever a thread drag starts
t3dotgg added a commit that referenced this pull request Nov 6, 2026
#30346 already limits the settled hint's scrollIntoView to drags that
target Settled, so the on-screen guard and its tests are redundant and
the tests fail against current main. Keep the autoscroll tuning, which
still fixes the bottom-edge runaway.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS 0-9 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant