[Bug]: Dragging a sidebar thread from the lower part of the list auto-scrolls the sidebar to the bottom
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 78/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
- 技術スタック
- react, typescript
- 領域
- frontend
調査の方向性
apps/web/src/components/Sidebar.tsx の3169行目付近にある autoScroll prop から始め、次に dnd-kit 6.3.1 の自動スクロール設定を確認して、報告された下段からのドラッグを再現してください。ポインターがサイドバーの端に近づくまでリストが動かず、端でドラッグするとスクロールするよう、自動スクロールのゾーンと速度を調整してください。報告された操作をアプリで検証してください。特に、表示中の下段からピン留めされたスレッドをドラッグする操作を確認してください。
索引モデルが issue の本文から書いたものです。
説明
Before submitting
- I searched existing issues and did not find a duplicate. Closest: #27586 (a row jumps down the list on pickup, same build). It may be the same cause, but it doesn't mention the list scrolling, so I'm filing this separately. #26392 fixed a similar jump when settling a thread, through a different path (focus restore).
- I included enough detail to reproduce or investigate the problem.
Area
apps/web
Steps to reproduce
- Have enough threads that the sidebar list is taller than the sidebar, and scroll it to the top.
- Press a thread in the lower part of the visible list. A pinned thread shows it best when Pinned fills most of the sidebar.
- Move the pointer a few pixels to start the drag. A small wobble downward is enough, even if you mean to drag up.
Expected behavior
The list stays put until the pointer reaches the edge of the sidebar, then scrolls at a speed you can control. You can move a pinned thread to the top of Pinned without losing sight of Pinned.
Actual behavior
As soon as the drag starts, the sidebar scrolls to the bottom of the list, even with the pointer held still. The pinned threads leave the screen, so you have to drag all the way back up.
Likely cause
The sidebar uses dnd-kit's default auto-scroll settings, which are too aggressive for a list this narrow and tall:
Sidebar.tsx:3169passesautoScroll={!isContextDrag}, so dnd-kit 6.3.1's defaults apply.- The default zone is 20% of the scroller's height (
getScrollDirectionAndSpeed). In an 800px sidebar that's the bottom 160px, about two thread rows, so a row can start inside it. - The default speed is up to 10px every 5ms at the edge, or 2,000px/s (
useAutoScroller). - Scroll intent is sticky (
useScrollIntent). One pixel of downward movement allows forward scrolling for the rest of the drag. - The scroll interval keeps running while the pointer is still, so the list runs to the end.
What I checked
Confirmed in the source, and with a simulation that runs the real dnd-kit 6.3.1 and an unmodified Sidebar.pointer.ts in jsdom with fake geometry (800px viewport, 82px rows, 3,280px list):
| Gesture | Pressed row | Scrolled after holding 1.5s |
|---|---|---|
| 8px down | Top or middle of the viewport | 0px |
| 8px down | In the bottom 20% | 1,143px, still moving |
| 8px up only | In the bottom 20% | 0px |
| 8px up, then 1px down | In the bottom 20% | 816px, still moving |
Not confirmed: I haven't reproduced this in a running app with this explanation, and the simulation has no real layout. I saw the jump in the app, but didn't measure where the pointer was. In the simulation, rows above the bottom 20% never scroll, so if this happens from the top of the list there is a second cause.
Ruled out by reading the code: the focus restore from #26392 now uses preventScroll, the drag labels and placeholders don't change layout height (h-0), and the sidebar's other scrollIntoView calls only run for keyboard navigation and route reveals.
Suggested fix
A smaller zone and a lower speed, keeping the current on/off behavior:
autoScroll={{ enabled: !isContextDrag, threshold: { x: 0, y: 0.05 }, acceleration: 3 }}
With these values in the same simulation, the row that ran away above stays at 0px, in both the 8px-down and 1px-wobble gestures. Dragging to the edge still scrolls, at about 500px/s. A row pressed in the last 5% still scrolls, at about 400px/s. The values need a real feel test.
Impact
Minor bug or occasional failure
Version or commit
T3 Code (Beta) 0.1.5 (6d450a428485). Source references are from main at 616c426f5f.
Environment
macOS 26.6.2, desktop app.
Workaround
Scroll the list so the row sits higher in the sidebar before picking it up. Based on the simulation, not tested in the app.
Investigated and drafted by Claude Code (Claude Opus 5.5).
- 主要言語
- TypeScript
- スター
- 24.8k
- フォーク
- 6.4k
- 平均マージ
- 3時間 20分
- マージ済み PR(30日)
- 208
環境構築
このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
pingdotgg/t3code のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
pingdotgg/t3code#27445 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
pingdotgg/t3code#27146 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 64/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
pingdotgg/t3code#27022 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
[Bug]: Device hub update button is clipped with long canary version strings対応中かも @juliusmarminge が 1 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信
pingdotgg/t3code の issue をすべて見る
似ている issue
-
bug ready-for-agent
難易度 2/5 1〜3時間 初心者へのやさしさ 73/100
PhyberApex/kuroshiro#1687 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 73/100
microsoft/monaco-editor#5563 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 1/5 1時間未満 初心者へのやさしさ 86/100
awslabs/visual-asset-management-system#937 ·
メンテナーはふだん 1 日以内に返信
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
-
t0ggles
難易度 1/5 1時間未満 初心者へのやさしさ 82/100
nolimits4web/swiper#8255 · コメント 1 件 ·
メンテナーはふだん 15 日以内に返信