Focus, a fill, never a lift
TV focus is one treatment everywhere: the surface fills with --component-bg-active. No scale, no shadow, no halo, no white-invert. Rows take the fill alone; chrome (header action buttons) takes the fill and steps its border from --border to --border-hover, because a button already carries a border at rest.
Label and icon stay --text in both states. Source: list-item.tsx · button.tsx.
01 · Row focus
.row.focused
fill only
__tears_of_steel__
544.89 MB
Rows carry no border at rest, so focus is the fill alone, --component-bg-active, no scale, no shadow, no halo. Exactly as tv-native's list-item renders it, so list rhythm is preserved.
02 · Chrome focus
.btn.focused
Same fill as a row, plus a border step, --border → --border-hover. The label stays --text; there is no inversion and no shadow.
The list is not dimmed while chrome holds focus.
Platform variation · implementation, not redesign
The visual is identical across all four TV platforms: every column below is the same value, because list-item.tsx and button.tsx are cross-platform React Native with no per-platform divergence. Only the engine drawing it differs.
Focus applies instantly. pressable.tsx is a bare re-export of RN Pressable: no Animated, no timing curve, and tvParallaxProperties sets enabled: false.