# refactor\(web\): the sidebar's thread rows live in their own file · PR \#22696 · pingdotgg/t3code

[View on GitCafe](https://git.cafe/pingdotgg/t3code/pull/22696)

Repository: [pingdotgg/t3code](https://git.cafe/pingdotgg/t3code)

Visibility: public

State: merged

Source repository: pingdotgg/t3code

Source branch: refactor/sidebar-thread-row-file

Target branch: main

Head commit: 12757e8bc5e470d60bc1dc0eac747a9a1293cb87

[Discussion and reviews](https://git.cafe/pingdotgg/t3code/pull/22696)

[Commits](https://git.cafe/pingdotgg/t3code/pull/22696/commits?format=markdown)

[Files changed](https://git.cafe/pingdotgg/t3code/pull/22696/diffs?format=markdown)

## Description

---

Sidebar.tsx is ~5,100 lines, and about a third of it is the thread row: the row itself, its sortable wrapper, the search-result row, and their tooltip, provider stack, snooze menu and time-label helpers.

This PR moves that code as-is into `sidebar/SidebarThreadRow.tsx`. Nothing changes in behavior or render boundaries: the code is the same, and the React Compiler still compiles both files with 0 bailouts.

| | before | after |
|---|---|---|
| `Sidebar.tsx` | 5,108 lines | 3,483 lines |
| `sidebar/SidebarThreadRow.tsx` | — | 1,675 lines |

Renders are unchanged because nothing moved across a subscription boundary. The render win is in the top layer of this stack.

Tests run:
- `vp test run src/reactCompilerCoverage.test.ts -t idebar`
- `Sidebar.logic.test.ts`
- `Sidebar.drag.test.ts`
- `tsc` for apps/web
- oxlint on the changed files

Claude Opus 5.5 in Claude Code.

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

