# fix\(mobile\): models stay visible in the picker with Android animations removed · PR \#23888 · pingdotgg/t3code

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

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

Visibility: public

State: open

Source repository: Unavailable fork

Source branch: issue-watch/23875

Target branch: main

Head commit: dca2654bbf5f2572867fce174499bf863d891ff0

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

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

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

## Description

---

Unproven: with Remove animations off, the picker still fades and every row renders. I checked this by hand on the F4 but didn't record it. Same for the no-repro runs listed under Evidence.

Closes #23875

## Problem

On Android with **Settings → Accessibility → Remove animations** on, the model picker in thread settings shows blank gaps where models should be. The gaps keep their height and still select the model when tapped. It shows up most with OpenCode because its list is long enough to scroll.

Each catalog row mounts with a Reanimated `FadeIn` once the list has loaded. With animations removed, Android can leave the row at the fade's starting opacity of 0, so every row that mounts while scrolling stays invisible. #19239 fixed the same failure in the composer toolbar.

## Fix

The thread settings sheet now skips its row and option fades when `useReducedMotion()` is true, the same way #19239 does. Normal motion keeps the fades. Reanimated reads the reduced-motion setting when the app starts, so restart the app after changing it.

## Evidence

POCO F4, Android 14, dark mode, Remove animations on. Sandbox server with OpenCode 1.19.4 and 60 test models. I open the picker, expand OpenCode and scroll.

| Before (main) | After (this PR) |
| --- | --- |
| ![before](https://github.com/user-attachments/assets/990c0455-2cec-49b0-b9a4-628d9af4db9b) | ![after](https://github.com/user-attachments/assets/a24adcb0-c552-4305-97d8-f42125097b1a) |

Before: rows that mount while scrolling are blank. The screenshot was taken after tapping a gap, which still selected a model ("Save" appears top right). The video ends before that tap.

https://github.com/user-attachments/assets/ee3ff374-8845-4d3a-816b-1ebc8175e136

After: every row renders while scrolling.

https://github.com/user-attachments/assets/e6e8f1b8-53a0-411b-adbb-a30608b6fa0d

I also checked with Remove animations off: the list still fades and renders normally. Without Remove animations I couldn't reproduce the bug on f4 or m3, in dev or production JS, in light or dark mode.

## Checks

- `vp run check:changed`: format, lint, knip and typecheck pass.
- No test added. This is a visual bug, so the captures above are the proof.

Follow-up, not in this PR: `PullRequestFiles` uses the same `entering={animationsReady ? FadeIn : undefined}` pattern inside a list and might have the same problem. I haven't checked it.

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


