- TVSearchSection: replace contentInset+contentOffset (offset only applies on
initial mount, so the reused FlatList lost its left padding on a second
search and snapped to the edge) with stable contentContainerStyle padding.
- TVSearchPage: drop the horizontal margin around the native tvOS search bar so
it spans full width; the extra margin squeezed the bar and clipped its
trailing "Hold to Dictate in <Language>" hint.
On the Apple TV search page, the native tvOS search field owns focus while
typing. Both result renderers set hasTVPreferredFocus on their first item,
which re-requests focus on every re-render. Since results re-render on each
keystroke, the first poster kept yanking focus out of the search field into
the grid.
Stop search results from requesting preferred focus in both Library and
Discover modes; the user navigates down to the grid manually (standard tvOS
.searchable behavior).
- Match the loading skeleton to TVSearchSection's scaled layout (poster
width, item gap, edge padding, heading, poster radius) so placeholders
line up with the real content.
- Move the native search field up ~50px (drop marginTop).
- Remove the downward focus guide that re-captured upward focus, so
pressing up from the native search now reaches the tab bar.
Add a local `tv-search` Expo module that hosts SwiftUI's `.searchable`
in a UIHostingController (adapted from expo-tvos-search, minus its native
results grid). It emits typed text to React Native so the existing search
pipeline and custom TV results grid are reused. Handles the RN-tvOS remote
gesture release needed for keyboard input on device.
Wire it into TVSearchPage as a sticky header above the scrollable results,
with a TVFocusGuideView bridge so focus can move from the tab bar into the
native search field.
Render titled option groups as nested Menu submenus instead of flat
Pickers, and convert the Discover filters from ContextMenu to Menu.
Keeps single-tap-to-open behavior (ContextMenu requires a long press
and reads as a context menu) while giving the nicer nested grouping.
Native Button no longer renders RN <Text> children in SDK 55; use the
label prop. Wrap both buttons in a single Host + HStack with a trailing
Spacer so they sit flush-left with no centering inset.