From 2b36d4bc76042508ddfbc2a0bb7d6edc1db169ef Mon Sep 17 00:00:00 2001 From: Fredrik Burmester Date: Mon, 19 Jan 2026 20:01:00 +0100 Subject: [PATCH] fix(tv): font sizes --- components/Badge.tsx | 49 ++++++++-- components/GenreTags.tsx | 31 ++++++- components/ItemContent.tv.tsx | 51 +++++++---- components/home/Favorites.tv.tsx | 5 +- components/home/Home.tv.tsx | 9 +- .../InfiniteScrollingCollectionList.tv.tsx | 43 +++++++-- .../StreamystatsPromotedWatchlists.tv.tsx | 16 +++- .../home/StreamystatsRecommendations.tv.tsx | 16 +++- components/series/TVEpisodeCard.tsx | 21 +++-- components/series/TVSeriesHeader.tsx | 39 ++++++-- components/series/TVSeriesPage.tsx | 30 +++--- components/tv/TVActorCard.tsx | 21 +++-- components/tv/TVCancelButton.tsx | 3 +- components/tv/TVCastCrewText.tsx | 11 ++- components/tv/TVCastSection.tsx | 11 ++- components/tv/TVLanguageCard.tsx | 5 +- components/tv/TVMetadataBadges.tsx | 13 ++- components/tv/TVNextEpisodeCountdown.tsx | 7 +- components/tv/TVOptionButton.tsx | 91 ++++++++++++++----- components/tv/TVOptionCard.tsx | 5 +- components/tv/TVOptionSelector.tsx | 3 +- components/tv/TVSeriesNavigation.tsx | 5 +- components/tv/TVSeriesSeasonCard.tsx | 21 +++-- components/tv/TVSubtitleResultCard.tsx | 9 +- components/tv/TVTabButton.tsx | 3 +- components/tv/TVTechnicalDetails.tsx | 13 +-- components/tv/TVTrackCard.tsx | 5 +- components/tv/settings/TVLogoutButton.tsx | 3 +- components/tv/settings/TVSectionHeader.tsx | 3 +- .../tv/settings/TVSettingsOptionButton.tsx | 7 +- components/tv/settings/TVSettingsRow.tsx | 7 +- components/tv/settings/TVSettingsStepper.tsx | 7 +- .../tv/settings/TVSettingsTextInput.tsx | 11 ++- components/tv/settings/TVSettingsToggle.tsx | 5 +- constants/TVTypography.ts | 25 +++++ 35 files changed, 437 insertions(+), 167 deletions(-) create mode 100644 constants/TVTypography.ts diff --git a/components/Badge.tsx b/components/Badge.tsx index c5806c8d..0cb76a74 100644 --- a/components/Badge.tsx +++ b/components/Badge.tsx @@ -1,5 +1,7 @@ +import { BlurView } from "expo-blur"; import { Platform, StyleSheet, View, type ViewProps } from "react-native"; import { GlassEffectView } from "react-native-glass-effect-view"; +import { TVTypography } from "@/constants/TVTypography"; import { Text } from "./common/Text"; interface Props extends ViewProps { @@ -38,8 +40,45 @@ export const Badge: React.FC = ({ ); } - // On TV, use transparent backgrounds for a cleaner look - const isTV = Platform.isTV; + // On TV, use BlurView for consistent styling + if (Platform.isTV) { + return ( + + + {iconLeft && {iconLeft}} + + {text} + + + + ); + } return ( = ({ alignSelf: "flex-start", flexDirection: "row", alignItems: "center", - backgroundColor: isTV - ? "rgba(255,255,255,0.1)" - : variant === "purple" - ? "#9333ea" - : "#262626", + backgroundColor: variant === "purple" ? "#9333ea" : "#262626", }, props.style, ]} diff --git a/components/GenreTags.tsx b/components/GenreTags.tsx index 540f153c..bc83eafa 100644 --- a/components/GenreTags.tsx +++ b/components/GenreTags.tsx @@ -1,4 +1,5 @@ // GenreTags.tsx +import { BlurView } from "expo-blur"; import type React from "react"; import { Platform, @@ -9,6 +10,7 @@ import { type ViewProps, } from "react-native"; import { GlassEffectView } from "react-native-glass-effect-view"; +import { TVTypography } from "@/constants/TVTypography"; import { Text } from "./common/Text"; interface TagProps { @@ -40,6 +42,32 @@ export const Tag: React.FC< ); } + // TV-specific styling with blur background + if (Platform.isTV) { + return ( + + + + {text} + + + + ); + } + return ( @@ -66,7 +94,8 @@ export const Tags: React.FC< return ( {tags.map((tag, idx) => ( diff --git a/components/ItemContent.tv.tsx b/components/ItemContent.tv.tsx index 9a99f001..c19644b1 100644 --- a/components/ItemContent.tv.tsx +++ b/components/ItemContent.tv.tsx @@ -6,6 +6,7 @@ import type { } from "@jellyfin/sdk/lib/generated-client/models"; import { getUserLibraryApi } from "@jellyfin/sdk/lib/utils/api"; import { useQueryClient } from "@tanstack/react-query"; +import { BlurView } from "expo-blur"; import { Image } from "expo-image"; import { useAtom } from "jotai"; import React, { useCallback, useEffect, useMemo, useState } from "react"; @@ -28,6 +29,7 @@ import { TVSeriesNavigation, TVTechnicalDetails, } from "@/components/tv"; +import { TVTypography } from "@/constants/TVTypography"; import useRouter from "@/hooks/useAppRouter"; import useDefaultPlaySettings from "@/hooks/useDefaultPlaySettings"; import { useImageColorsReturn } from "@/hooks/useImageColorsReturn"; @@ -453,7 +455,7 @@ export const ItemContentTV: React.FC = React.memo( = React.memo( ) : ( @@ -476,10 +478,10 @@ export const ItemContentTV: React.FC = React.memo( {/* Episode info for TV shows */} {item.Type === "Episode" && ( - + = React.memo( S{item.ParentIndexNumber} E{item.IndexNumber} · {item.Name} @@ -515,18 +517,34 @@ export const ItemContentTV: React.FC = React.memo( {/* Overview */} {item.Overview && ( - - {item.Overview} - + + + {item.Overview} + + + )} {/* Action buttons */} @@ -550,7 +568,7 @@ export const ItemContentTV: React.FC = React.memo( /> = React.memo( (item.UserData?.PlaybackPositionTicks || 0) / item.RunTimeTicks } + fillColor='#FFFFFF' /> )} diff --git a/components/home/Favorites.tv.tsx b/components/home/Favorites.tv.tsx index 6da3befa..a4aab9b5 100644 --- a/components/home/Favorites.tv.tsx +++ b/components/home/Favorites.tv.tsx @@ -11,6 +11,7 @@ import heart from "@/assets/icons/heart.fill.png"; import { Text } from "@/components/common/Text"; import { InfiniteScrollingCollectionList } from "@/components/home/InfiniteScrollingCollectionList.tv"; import { Colors } from "@/constants/Colors"; +import { TVTypography } from "@/constants/TVTypography"; import { apiAtom, userAtom } from "@/providers/JellyfinProvider"; const HORIZONTAL_PADDING = 60; @@ -147,7 +148,7 @@ export const Favorites = () => { /> { style={{ textAlign: "center", opacity: 0.7, - fontSize: 18, + fontSize: TVTypography.body, color: "#FFFFFF", }} > diff --git a/components/home/Home.tv.tsx b/components/home/Home.tv.tsx index 28b0a79f..2acdfdf9 100644 --- a/components/home/Home.tv.tsx +++ b/components/home/Home.tv.tsx @@ -31,6 +31,7 @@ import { InfiniteScrollingCollectionList } from "@/components/home/InfiniteScrol import { StreamystatsPromotedWatchlists } from "@/components/home/StreamystatsPromotedWatchlists.tv"; import { StreamystatsRecommendations } from "@/components/home/StreamystatsRecommendations.tv"; import { Loader } from "@/components/Loader"; +import { TVTypography } from "@/constants/TVTypography"; import useRouter from "@/hooks/useAppRouter"; import { useNetworkStatus } from "@/hooks/useNetworkStatus"; import { useInvalidatePlaybackProgressCache } from "@/hooks/useRevalidatePlaybackProgressCache"; @@ -525,7 +526,7 @@ export const Home = () => { > { style={{ textAlign: "center", opacity: 0.7, - fontSize: 18, + fontSize: TVTypography.body, color: "#FFFFFF", }} > @@ -577,7 +578,7 @@ export const Home = () => { > { style={{ textAlign: "center", opacity: 0.7, - fontSize: 18, + fontSize: TVTypography.body, color: "#FFFFFF", }} > diff --git a/components/home/InfiniteScrollingCollectionList.tv.tsx b/components/home/InfiniteScrollingCollectionList.tv.tsx index c66004a0..8de15f87 100644 --- a/components/home/InfiniteScrollingCollectionList.tv.tsx +++ b/components/home/InfiniteScrollingCollectionList.tv.tsx @@ -21,6 +21,7 @@ import MoviePoster, { } from "@/components/posters/MoviePoster.tv"; import { TVFocusablePoster } from "@/components/tv/TVFocusablePoster"; import { Colors } from "@/constants/Colors"; +import { TVTypography } from "@/constants/TVTypography"; import useRouter from "@/hooks/useAppRouter"; import { SortByOption, SortOrderOption } from "@/utils/atoms/filters"; import ContinueWatchingPoster, { @@ -54,12 +55,19 @@ const TVItemCardText: React.FC<{ item: BaseItemDto }> = ({ item }) => { {item.Type === "Episode" ? ( <> - + {item.Name} {`S${item.ParentIndexNumber?.toString()}:E${item.IndexNumber?.toString()}`} {" - "} @@ -68,10 +76,19 @@ const TVItemCardText: React.FC<{ item: BaseItemDto }> = ({ item }) => { ) : ( <> - + {item.Name} - + {item.ProductionYear} @@ -119,7 +136,13 @@ const TVSeeAllCard: React.FC<{ color='white' style={{ marginBottom: 8 }} /> - + {t("common.seeAll", { defaultValue: "See all" })} @@ -369,7 +392,7 @@ export const InfiniteScrollingCollectionList: React.FC = ({ {/* Section Header */} = ({ {isLoading === false && allItems.length === 0 && ( {t("home.no_items")} @@ -420,7 +447,7 @@ export const InfiniteScrollingCollectionList: React.FC = ({ color: "#262626", backgroundColor: "#262626", borderRadius: 6, - fontSize: 16, + fontSize: TVTypography.callout, }} numberOfLines={1} > diff --git a/components/home/StreamystatsPromotedWatchlists.tv.tsx b/components/home/StreamystatsPromotedWatchlists.tv.tsx index 264a6039..7bd2320c 100644 --- a/components/home/StreamystatsPromotedWatchlists.tv.tsx +++ b/components/home/StreamystatsPromotedWatchlists.tv.tsx @@ -16,6 +16,7 @@ import MoviePoster, { } from "@/components/posters/MoviePoster.tv"; import SeriesPoster from "@/components/posters/SeriesPoster.tv"; import { TVFocusablePoster } from "@/components/tv/TVFocusablePoster"; +import { TVTypography } from "@/constants/TVTypography"; import useRouter from "@/hooks/useAppRouter"; import { apiAtom, userAtom } from "@/providers/JellyfinProvider"; import { useSettings } from "@/utils/atoms/settings"; @@ -28,10 +29,19 @@ const SCALE_PADDING = 20; const TVItemCardText: React.FC<{ item: BaseItemDto }> = ({ item }) => { return ( - + {item.Name} - + {item.ProductionYear} @@ -145,7 +155,7 @@ const WatchlistSection: React.FC = ({ = ({ item }) => { return ( - + {item.Name} - + {item.ProductionYear} @@ -208,7 +218,7 @@ export const StreamystatsRecommendations: React.FC = ({ = ({ style={{ width: TV_EPISODE_WIDTH, aspectRatio: 16 / 9, - borderRadius: 12, + borderRadius: 24, overflow: "hidden", backgroundColor: "#1a1a1a", - borderWidth: 1, - borderColor: "#262626", }} > {thumbnailUrl ? ( @@ -109,7 +108,7 @@ export const TVEpisodeCard: React.FC = ({ {episodeLabel && ( = ({ )} {duration && ( <> - - {duration} + + • + + + {duration} + )} = ({ item }) => { ) : ( = ({ item }) => { }} > {yearString && ( - {yearString} + + {yearString} + )} {item.OfficialRating && ( @@ -101,17 +105,34 @@ export const TVSeriesHeader: React.FC = ({ item }) => { {/* Overview */} {item.Overview && ( - - {item.Overview} - + + + {item.Overview} + + + )} ); diff --git a/components/series/TVSeriesPage.tsx b/components/series/TVSeriesPage.tsx index f393fe94..23a78b9a 100644 --- a/components/series/TVSeriesPage.tsx +++ b/components/series/TVSeriesPage.tsx @@ -32,6 +32,7 @@ import { TVEpisodeCard, } from "@/components/series/TVEpisodeCard"; import { TVSeriesHeader } from "@/components/series/TVSeriesHeader"; +import { TVTypography } from "@/constants/TVTypography"; import useRouter from "@/hooks/useAppRouter"; import { useTVOptionModal } from "@/hooks/useTVOptionModal"; import { useDownload } from "@/providers/DownloadProvider"; @@ -146,7 +147,7 @@ const TVSeasonButton: React.FC<{ const animateTo = (v: number) => Animated.timing(scale, { toValue: v, - duration: 120, + duration: 150, easing: Easing.out(Easing.quad), useNativeDriver: true, }).start(); @@ -156,7 +157,7 @@ const TVSeasonButton: React.FC<{ onPress={onPress} onFocus={() => { setFocused(true); - animateTo(1.02); + animateTo(1.05); }} onBlur={() => { setFocused(false); @@ -170,33 +171,34 @@ const TVSeasonButton: React.FC<{ transform: [{ scale }], shadowColor: "#fff", shadowOffset: { width: 0, height: 0 }, - shadowOpacity: focused ? 0.4 : 0, - shadowRadius: focused ? 12 : 0, + shadowOpacity: focused ? 0.6 : 0, + shadowRadius: focused ? 20 : 0, }} > {seasonName} @@ -572,7 +574,7 @@ export const TVSeriesPage: React.FC = ({ /> = ({ = ({ diff --git a/components/tv/TVActorCard.tsx b/components/tv/TVActorCard.tsx index b477cb5d..888da829 100644 --- a/components/tv/TVActorCard.tsx +++ b/components/tv/TVActorCard.tsx @@ -3,6 +3,7 @@ import { Image } from "expo-image"; import React from "react"; import { Animated, Pressable, View } from "react-native"; import { Text } from "@/components/common/Text"; +import { TVTypography } from "@/constants/TVTypography"; import { useTVFocusAnimation } from "./hooks/useTVFocusAnimation"; export interface TVActorCardProps { @@ -22,7 +23,7 @@ export const TVActorCard = React.forwardRef( useTVFocusAnimation({ scaleAmount: 1.08 }); const imageUrl = person.Id - ? `${apiBasePath}/Items/${person.Id}/Images/Primary?fillWidth=200&fillHeight=200&quality=90` + ? `${apiBasePath}/Items/${person.Id}/Images/Primary?fillWidth=280&fillHeight=280&quality=90` : null; return ( @@ -38,7 +39,7 @@ export const TVActorCard = React.forwardRef( animatedStyle, { alignItems: "center", - width: 120, + width: 160, shadowColor: "#fff", shadowOffset: { width: 0, height: 0 }, shadowOpacity: focused ? 0.5 : 0, @@ -48,12 +49,12 @@ export const TVActorCard = React.forwardRef( > ( > @@ -83,11 +84,11 @@ export const TVActorCard = React.forwardRef( @@ -97,7 +98,7 @@ export const TVActorCard = React.forwardRef( {person.Role && ( = ({ /> = React.memo( = React.memo( = React.memo( > {t("item_card.director")} - + {director.Name} @@ -54,7 +55,7 @@ export const TVCastCrewText: React.FC = React.memo( = React.memo( > {t("item_card.cast")} - + {cast.map((c) => c.Name).join(", ")} diff --git a/components/tv/TVCastSection.tsx b/components/tv/TVCastSection.tsx index 9c58e273..828ca3f6 100644 --- a/components/tv/TVCastSection.tsx +++ b/components/tv/TVCastSection.tsx @@ -3,6 +3,7 @@ import React from "react"; import { useTranslation } from "react-i18next"; import { ScrollView, TVFocusGuideView, View } from "react-native"; import { Text } from "@/components/common/Text"; +import { TVTypography } from "@/constants/TVTypography"; import { TVActorCard } from "./TVActorCard"; export interface TVCastSectionProps { @@ -30,13 +31,13 @@ export const TVCastSection: React.FC = React.memo( } return ( - + {t("item_card.cast")} @@ -54,8 +55,8 @@ export const TVCastSection: React.FC = React.memo( style={{ marginHorizontal: -80, overflow: "visible" }} contentContainerStyle={{ paddingHorizontal: 80, - paddingVertical: 12, - gap: 20, + paddingVertical: 16, + gap: 28, }} > {cast.map((person, index) => ( diff --git a/components/tv/TVLanguageCard.tsx b/components/tv/TVLanguageCard.tsx index b2b8e6b1..24e3ec84 100644 --- a/components/tv/TVLanguageCard.tsx +++ b/components/tv/TVLanguageCard.tsx @@ -2,6 +2,7 @@ import { Ionicons } from "@expo/vector-icons"; import React from "react"; import { Animated, Pressable, StyleSheet, View } from "react-native"; import { Text } from "@/components/common/Text"; +import { TVTypography } from "@/constants/TVTypography"; import { useTVFocusAnimation } from "./hooks/useTVFocusAnimation"; export interface TVLanguageCardProps { @@ -81,11 +82,11 @@ const styles = StyleSheet.create({ paddingHorizontal: 12, }, languageCardText: { - fontSize: 15, + fontSize: TVTypography.callout, fontWeight: "500", }, languageCardCode: { - fontSize: 11, + fontSize: TVTypography.callout, marginTop: 2, }, checkmark: { diff --git a/components/tv/TVMetadataBadges.tsx b/components/tv/TVMetadataBadges.tsx index feea2609..b2ccab2e 100644 --- a/components/tv/TVMetadataBadges.tsx +++ b/components/tv/TVMetadataBadges.tsx @@ -3,6 +3,7 @@ import React from "react"; import { View } from "react-native"; import { Badge } from "@/components/Badge"; import { Text } from "@/components/common/Text"; +import { TVTypography } from "@/constants/TVTypography"; export interface TVMetadataBadgesProps { year?: number | null; @@ -19,15 +20,19 @@ export const TVMetadataBadges: React.FC = React.memo( flexDirection: "row", alignItems: "center", flexWrap: "wrap", - gap: 12, - marginBottom: 20, + gap: 16, + marginBottom: 24, }} > {year != null && ( - {year} + + {year} + )} {duration && ( - {duration} + + {duration} + )} {officialRating && } {communityRating != null && ( diff --git a/components/tv/TVNextEpisodeCountdown.tsx b/components/tv/TVNextEpisodeCountdown.tsx index 222e3413..2030d109 100644 --- a/components/tv/TVNextEpisodeCountdown.tsx +++ b/components/tv/TVNextEpisodeCountdown.tsx @@ -13,6 +13,7 @@ import Animated, { withTiming, } from "react-native-reanimated"; import { Text } from "@/components/common/Text"; +import { TVTypography } from "@/constants/TVTypography"; import { getPrimaryImageUrl } from "@/utils/jellyfin/image/getPrimaryImageUrl"; export interface TVNextEpisodeCountdownProps { @@ -129,19 +130,19 @@ const styles = StyleSheet.create({ width: 280, }, label: { - fontSize: 13, + fontSize: TVTypography.callout, color: "rgba(255,255,255,0.5)", textTransform: "uppercase", letterSpacing: 1, marginBottom: 4, }, seriesName: { - fontSize: 16, + fontSize: TVTypography.callout, color: "rgba(255,255,255,0.7)", marginBottom: 2, }, episodeInfo: { - fontSize: 20, + fontSize: TVTypography.body, color: "#fff", fontWeight: "600", marginBottom: 12, diff --git a/components/tv/TVOptionButton.tsx b/components/tv/TVOptionButton.tsx index 8ef8a7dd..342caac9 100644 --- a/components/tv/TVOptionButton.tsx +++ b/components/tv/TVOptionButton.tsx @@ -1,6 +1,8 @@ +import { BlurView } from "expo-blur"; import React from "react"; import { Animated, Pressable, View } from "react-native"; import { Text } from "@/components/common/Text"; +import { TVTypography } from "@/constants/TVTypography"; import { useTVFocusAnimation } from "./hooks/useTVFocusAnimation"; export interface TVOptionButtonProps { @@ -34,36 +36,77 @@ export const TVOptionButton = React.forwardRef( }, ]} > - - - {label} - - + {label} + + + {value} + + + ) : ( + - {value} - - + + + {label} + + + {value} + + + + )} ); diff --git a/components/tv/TVOptionCard.tsx b/components/tv/TVOptionCard.tsx index 912f46df..ee36fc64 100644 --- a/components/tv/TVOptionCard.tsx +++ b/components/tv/TVOptionCard.tsx @@ -2,6 +2,7 @@ import { Ionicons } from "@expo/vector-icons"; import React from "react"; import { Animated, Pressable, View } from "react-native"; import { Text } from "@/components/common/Text"; +import { TVTypography } from "@/constants/TVTypography"; import { useTVFocusAnimation } from "./hooks/useTVFocusAnimation"; export interface TVOptionCardProps { @@ -58,7 +59,7 @@ export const TVOptionCard = React.forwardRef( > ( {sublabel && ( = React.memo( {t("item_card.from_this_series") || "From this Series"} diff --git a/components/tv/TVSeriesSeasonCard.tsx b/components/tv/TVSeriesSeasonCard.tsx index b7d97642..eb69f7f8 100644 --- a/components/tv/TVSeriesSeasonCard.tsx +++ b/components/tv/TVSeriesSeasonCard.tsx @@ -3,6 +3,7 @@ import { Image } from "expo-image"; import React from "react"; import { Animated, Pressable, View } from "react-native"; import { Text } from "@/components/common/Text"; +import { TVTypography } from "@/constants/TVTypography"; import { useTVFocusAnimation } from "./hooks/useTVFocusAnimation"; export interface TVSeriesSeasonCardProps { @@ -34,22 +35,22 @@ export const TVSeriesSeasonCard: React.FC = ({ style={[ animatedStyle, { - width: 140, + width: 210, shadowColor: "#fff", shadowOffset: { width: 0, height: 0 }, shadowOpacity: focused ? 0.5 : 0, - shadowRadius: focused ? 16 : 0, + shadowRadius: focused ? 20 : 0, }, ]} > = ({ alignItems: "center", }} > - + )} @@ -89,7 +90,7 @@ export const TVSeriesSeasonCard: React.FC = ({ {subtitle && ( = ({ > = React.memo( {t("item_card.technical_details")} @@ -36,7 +37,7 @@ export const TVTechnicalDetails: React.FC = React.memo( = React.memo( > Video - + {videoStream.DisplayTitle || `${videoStream.Codec?.toUpperCase()} ${videoStream.Width}x${videoStream.Height}`} @@ -55,7 +56,7 @@ export const TVTechnicalDetails: React.FC = React.memo( = React.memo( > Audio - + {audioStream.DisplayTitle || `${audioStream.Codec?.toUpperCase()} ${audioStream.Channels}ch`} diff --git a/components/tv/TVTrackCard.tsx b/components/tv/TVTrackCard.tsx index 4945285f..e1b7106f 100644 --- a/components/tv/TVTrackCard.tsx +++ b/components/tv/TVTrackCard.tsx @@ -2,6 +2,7 @@ import { Ionicons } from "@expo/vector-icons"; import React from "react"; import { Animated, Pressable, StyleSheet, View } from "react-native"; import { Text } from "@/components/common/Text"; +import { TVTypography } from "@/constants/TVTypography"; import { useTVFocusAnimation } from "./hooks/useTVFocusAnimation"; export interface TVTrackCardProps { @@ -86,11 +87,11 @@ const styles = StyleSheet.create({ paddingHorizontal: 12, }, trackCardText: { - fontSize: 16, + fontSize: TVTypography.callout, textAlign: "center", }, trackCardSublabel: { - fontSize: 12, + fontSize: TVTypography.callout, marginTop: 2, }, checkmark: { diff --git a/components/tv/settings/TVLogoutButton.tsx b/components/tv/settings/TVLogoutButton.tsx index d9d214bc..9df832f1 100644 --- a/components/tv/settings/TVLogoutButton.tsx +++ b/components/tv/settings/TVLogoutButton.tsx @@ -2,6 +2,7 @@ import React from "react"; import { useTranslation } from "react-i18next"; import { Animated, Pressable, View } from "react-native"; import { Text } from "@/components/common/Text"; +import { TVTypography } from "@/constants/TVTypography"; import { useTVFocusAnimation } from "../hooks/useTVFocusAnimation"; export interface TVLogoutButtonProps { @@ -48,7 +49,7 @@ export const TVLogoutButton: React.FC = ({ > = ({ title }) => ( = ({ }, ]} > - {label} + + {label} + = ({ }, ]} > - {label} + + {label} + = ({ focusable={!disabled} > - {label} + + {label} + @@ -86,7 +89,7 @@ export const TVSettingsStepper: React.FC = ({ = ({ }, ]} > - + {label} = ({ autoCapitalize='none' autoCorrect={false} style={{ - fontSize: 18, + fontSize: TVTypography.body, color: "#FFFFFF", backgroundColor: "rgba(255, 255, 255, 0.05)", borderRadius: 8, diff --git a/components/tv/settings/TVSettingsToggle.tsx b/components/tv/settings/TVSettingsToggle.tsx index cfeb182f..c50a6518 100644 --- a/components/tv/settings/TVSettingsToggle.tsx +++ b/components/tv/settings/TVSettingsToggle.tsx @@ -1,6 +1,7 @@ import React from "react"; import { Animated, Pressable, View } from "react-native"; import { Text } from "@/components/common/Text"; +import { TVTypography } from "@/constants/TVTypography"; import { useTVFocusAnimation } from "../hooks/useTVFocusAnimation"; export interface TVSettingsToggleProps { @@ -47,7 +48,9 @@ export const TVSettingsToggle: React.FC = ({ }, ]} > - {label} + + {label} +