# refactor\(web\): the pull request header's crumbs, title editor and base branch live in their own components · PR \#22672 · pingdotgg/t3code

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

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

Visibility: public

State: merged

Source repository: pingdotgg/t3code

Source branch: refactor/split-pull-requests-detail-header

Target branch: refactor/split-pull-requests

Head commit: deb06508250ef29db3af594ae34852dcd88f9ecc

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

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

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

## Description

---

`PullRequestDetailPanel.tsx` was 2,934 lines and rendered the repository/number crumbs, the title editor and the base branch (twice, condensed and expanded) inline.

- `PullRequestDetailCrumbs.tsx`: the repo and number row and its condensed twin.
- `PullRequestTitleEditor.tsx`: owns the title draft, saving state and the update command, so typing a new title re-renders the editor instead of the whole panel.
- `PullRequestBaseBranch.tsx`: the base branch label with its out-of-date warning, written once instead of twice.

| File | Before | After |
|---|---|---|
| PullRequestDetailPanel.tsx | 2,934 | 2,545 |
| PullRequestDetailCrumbs.tsx | - | 193 |
| PullRequestTitleEditor.tsx | - | 127 |
| PullRequestBaseBranch.tsx | - | 137 |

Part of the pull request page split stack: #22671 → #22672 → #22702 → #22703 → #22704 → #22705 → #22706.

Measured with the rc-init render counter against a dev server seeded from real data (136 pull requests listed), fresh browser per side, main `6a6c84f990` vs the stack top. Opening a PR detail: 6482 / 947 / 1249 renders on main vs 6331 / 1187 / 956 on the stack (noise, the first open includes data arriving). Switching Summary/Timeline/Code: 2-13 renders per switch on both sides. Holding Shift 3 times on the list: 14952 vs 14937 renders; the page and column no longer re-render (6 + 6 before, 0 after), the rows still do because their speed-mode prop really changes.

Tests run on this layer: `tsc --noEmit` for apps/web, `vp lint` on the changed files, `vp test run src/reactCompilerCoverage.test.ts -t pullRequest` (every new file compiles with 0 bailouts), `vp test run src/components/pullRequest/pullRequestsRouteSearch.test.ts`.

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

