# refactor\(web\): composer mode controls and footer actions live in ComposerFooterControls · PR \#22720 · pingdotgg/t3code

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

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

Visibility: public

State: merged

Source repository: pingdotgg/t3code

Source branch: refactor/chat-composer-footer-controls

Target branch: refactor/chat-composer-resting-previews

Head commit: 8c483f867955bff4383fe6014589cab135984d68

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

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

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

## Description

---

Continues the ChatComposer split.

`ComposerFooterModeControls` (the runtime mode select and the plan/build toggle) and `ComposerFooterPrimaryActions` (the context meter and send actions) move unchanged into `ComposerFooterControls.tsx`. The runtime mode option list ChatComposer filters stays in ChatComposer.

| | before | this PR |
|---|---|---|
| ChatComposer.tsx lines | 6,923 | 6,700 |
| ComposerFooterControls.tsx lines | n/a | 227 |
| Renders, 20 typed chars | 678 | 678 |

Renders measured with the shared fiber counter (`rc-init.js`) on a seeded dev server: typing 20 characters into an existing thread's composer, median of 3 runs. This is a move only; it does not change renders.

Tests run: `vp lint` and `vp fmt --check` on the changed files, `tsc-rs --noEmit` for apps/web, and `reactCompilerCoverage.test.ts` for the changed files (0 bailouts).

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

