mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-01-20 10:08:06 +00:00
Compare commits
1 Commits
develop
...
fix/text-u
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9c0de94247 |
@@ -144,7 +144,10 @@ export const Button: React.FC<PropsWithChildren<ButtonProps>> = ({
|
|||||||
${colorClasses}
|
${colorClasses}
|
||||||
${className}`}
|
${className}`}
|
||||||
>
|
>
|
||||||
<Text className={`${textColorClass} text-xl font-bold`}>
|
<Text
|
||||||
|
className={`${textColorClass} text-xl font-bold`}
|
||||||
|
ellipsizeMode='tail'
|
||||||
|
>
|
||||||
{children}
|
{children}
|
||||||
</Text>
|
</Text>
|
||||||
</View>
|
</View>
|
||||||
@@ -186,6 +189,7 @@ export const Button: React.FC<PropsWithChildren<ButtonProps>> = ({
|
|||||||
${iconRight ? "mr-2" : ""}
|
${iconRight ? "mr-2" : ""}
|
||||||
${iconLeft ? "ml-2" : ""}
|
${iconLeft ? "ml-2" : ""}
|
||||||
`}
|
`}
|
||||||
|
ellipsizeMode='tail'
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</Text>
|
</Text>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ const JellyfinServerDiscovery: React.FC<Props> = ({ onServerSelect }) => {
|
|||||||
return (
|
return (
|
||||||
<View className='mt-2'>
|
<View className='mt-2'>
|
||||||
<Button onPress={startDiscovery} color='black'>
|
<Button onPress={startDiscovery} color='black'>
|
||||||
<Text className='text-white text-center'>
|
<Text maxFontSizeMultiplier={1.2} className='text-white text-center'>
|
||||||
{isSearching
|
{isSearching
|
||||||
? t("server.searching")
|
? t("server.searching")
|
||||||
: t("server.search_for_local_servers")}
|
: t("server.search_for_local_servers")}
|
||||||
|
|||||||
@@ -532,18 +532,24 @@ export const PlayButton: React.FC<Props> = ({
|
|||||||
className='flex flex-row items-center justify-center bg-transparent rounded-full z-20 h-12 w-full '
|
className='flex flex-row items-center justify-center bg-transparent rounded-full z-20 h-12 w-full '
|
||||||
>
|
>
|
||||||
<View className='flex flex-row items-center space-x-2'>
|
<View className='flex flex-row items-center space-x-2'>
|
||||||
<Animated.Text style={[animatedTextStyle, { fontWeight: "bold" }]}>
|
<Animated.Text
|
||||||
|
style={[animatedTextStyle, { fontWeight: "bold" }]}
|
||||||
|
maxFontSizeMultiplier={1.2}
|
||||||
|
>
|
||||||
{runtimeTicksToMinutes(
|
{runtimeTicksToMinutes(
|
||||||
(item?.RunTimeTicks || 0) -
|
(item?.RunTimeTicks || 0) -
|
||||||
(item?.UserData?.PlaybackPositionTicks || 0),
|
(item?.UserData?.PlaybackPositionTicks || 0),
|
||||||
)}
|
)}
|
||||||
{(item?.UserData?.PlaybackPositionTicks || 0) > 0 && " left"}
|
{(item?.UserData?.PlaybackPositionTicks || 0) > 0 && " left"}
|
||||||
</Animated.Text>
|
</Animated.Text>
|
||||||
<Animated.Text style={animatedTextStyle}>
|
<Animated.Text style={animatedTextStyle} maxFontSizeMultiplier={1.2}>
|
||||||
<Ionicons name='play-circle' size={24} />
|
<Ionicons name='play-circle' size={24} />
|
||||||
</Animated.Text>
|
</Animated.Text>
|
||||||
{client && (
|
{client && (
|
||||||
<Animated.Text style={animatedTextStyle}>
|
<Animated.Text
|
||||||
|
style={animatedTextStyle}
|
||||||
|
maxFontSizeMultiplier={1.2}
|
||||||
|
>
|
||||||
<Feather name='cast' size={22} />
|
<Feather name='cast' size={22} />
|
||||||
<CastButton tintColor='transparent' />
|
<CastButton tintColor='transparent' />
|
||||||
</Animated.Text>
|
</Animated.Text>
|
||||||
|
|||||||
@@ -198,10 +198,13 @@ export const PlayButton: React.FC<Props> = ({
|
|||||||
className='flex flex-row items-center justify-center bg-transparent rounded-xl z-20 h-12 w-full '
|
className='flex flex-row items-center justify-center bg-transparent rounded-xl z-20 h-12 w-full '
|
||||||
>
|
>
|
||||||
<View className='flex flex-row items-center space-x-2'>
|
<View className='flex flex-row items-center space-x-2'>
|
||||||
<Animated.Text style={[animatedTextStyle, { fontWeight: "bold" }]}>
|
<Animated.Text
|
||||||
|
style={[animatedTextStyle, { fontWeight: "bold" }]}
|
||||||
|
maxFontSizeMultiplier={1.2}
|
||||||
|
>
|
||||||
{runtimeTicksToMinutes(item?.RunTimeTicks)}
|
{runtimeTicksToMinutes(item?.RunTimeTicks)}
|
||||||
</Animated.Text>
|
</Animated.Text>
|
||||||
<Animated.Text style={animatedTextStyle}>
|
<Animated.Text style={animatedTextStyle} maxFontSizeMultiplier={1.2}>
|
||||||
<Ionicons name='play-circle' size={24} />
|
<Ionicons name='play-circle' size={24} />
|
||||||
</Animated.Text>
|
</Animated.Text>
|
||||||
</View>
|
</View>
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export function ThemedText({
|
|||||||
}: ThemedTextProps) {
|
}: ThemedTextProps) {
|
||||||
return (
|
return (
|
||||||
<Text
|
<Text
|
||||||
|
maxFontSizeMultiplier={1.3}
|
||||||
style={[
|
style={[
|
||||||
{ color: "white" },
|
{ color: "white" },
|
||||||
type === "default" ? styles.default : undefined,
|
type === "default" ? styles.default : undefined,
|
||||||
|
|||||||
@@ -736,6 +736,7 @@ export const AppleTVCarousel: React.FC<AppleTVCarouselProps> = ({
|
|||||||
>
|
>
|
||||||
<TouchableOpacity onPress={() => navigateToItem(item)}>
|
<TouchableOpacity onPress={() => navigateToItem(item)}>
|
||||||
<Animated.Text
|
<Animated.Text
|
||||||
|
maxFontSizeMultiplier={1.2}
|
||||||
style={{
|
style={{
|
||||||
color: `rgba(255, 255, 255, ${TEXT_OPACITY})`,
|
color: `rgba(255, 255, 255, ${TEXT_OPACITY})`,
|
||||||
fontSize: GENRES_FONT_SIZE,
|
fontSize: GENRES_FONT_SIZE,
|
||||||
@@ -801,6 +802,7 @@ export const AppleTVCarousel: React.FC<AppleTVCarouselProps> = ({
|
|||||||
>
|
>
|
||||||
<TouchableOpacity onPress={() => navigateToItem(item)}>
|
<TouchableOpacity onPress={() => navigateToItem(item)}>
|
||||||
<Animated.Text
|
<Animated.Text
|
||||||
|
maxFontSizeMultiplier={1.2}
|
||||||
numberOfLines={OVERVIEW_MAX_LINES}
|
numberOfLines={OVERVIEW_MAX_LINES}
|
||||||
style={{
|
style={{
|
||||||
color: `rgba(255, 255, 255, ${TEXT_OPACITY * 0.85})`,
|
color: `rgba(255, 255, 255, ${TEXT_OPACITY * 0.85})`,
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export function Input(props: InputProps) {
|
|||||||
${isFocused ? "bg-neutral-700 border-2 border-white" : "bg-neutral-900 border-2 border-transparent"}
|
${isFocused ? "bg-neutral-700 border-2 border-white" : "bg-neutral-900 border-2 border-transparent"}
|
||||||
text-white ${extraClassName}
|
text-white ${extraClassName}
|
||||||
`}
|
`}
|
||||||
allowFontScaling={false}
|
maxFontSizeMultiplier={1.2}
|
||||||
style={[
|
style={[
|
||||||
style,
|
style,
|
||||||
{
|
{
|
||||||
@@ -45,7 +45,7 @@ export function Input(props: InputProps) {
|
|||||||
<TextInput
|
<TextInput
|
||||||
ref={inputRef}
|
ref={inputRef}
|
||||||
className='p-4 rounded-xl bg-neutral-900'
|
className='p-4 rounded-xl bg-neutral-900'
|
||||||
allowFontScaling={false}
|
maxFontSizeMultiplier={1.2}
|
||||||
style={[{ color: "white" }, style]}
|
style={[{ color: "white" }, style]}
|
||||||
placeholderTextColor={"#9CA3AF"}
|
placeholderTextColor={"#9CA3AF"}
|
||||||
clearButtonMode='while-editing'
|
clearButtonMode='while-editing'
|
||||||
|
|||||||
@@ -19,7 +19,9 @@ export const SectionHeader: React.FC<Props> = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<View className='px-4 flex flex-row items-center justify-between mb-2'>
|
<View className='px-4 flex flex-row items-center justify-between mb-2'>
|
||||||
<Text className='text-lg font-bold text-neutral-100'>{title}</Text>
|
<Text className='text-lg font-bold text-neutral-100' ellipsizeMode='tail'>
|
||||||
|
{title}
|
||||||
|
</Text>
|
||||||
{shouldShowAction && (
|
{shouldShowAction && (
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
onPress={onPressAction}
|
onPress={onPressAction}
|
||||||
@@ -29,6 +31,7 @@ export const SectionHeader: React.FC<Props> = ({
|
|||||||
className='py-1 pl-3'
|
className='py-1 pl-3'
|
||||||
>
|
>
|
||||||
<Text
|
<Text
|
||||||
|
ellipsizeMode='tail'
|
||||||
style={{
|
style={{
|
||||||
color: actionDisabled ? "rgba(255,255,255,0.4)" : Colors.primary,
|
color: actionDisabled ? "rgba(255,255,255,0.4)" : Colors.primary,
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ export function Text(props: TextProps) {
|
|||||||
if (Platform.isTV)
|
if (Platform.isTV)
|
||||||
return (
|
return (
|
||||||
<RNText
|
<RNText
|
||||||
allowFontScaling={false}
|
maxFontSizeMultiplier={1.3}
|
||||||
style={[{ color: "white" }, style]}
|
style={[{ color: "white" }, style]}
|
||||||
{...otherProps}
|
{...otherProps}
|
||||||
/>
|
/>
|
||||||
@@ -12,7 +12,7 @@ export function Text(props: TextProps) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<RNText
|
<RNText
|
||||||
allowFontScaling={false}
|
maxFontSizeMultiplier={1.3}
|
||||||
style={[{ color: "white" }, style]}
|
style={[{ color: "white" }, style]}
|
||||||
{...otherProps}
|
{...otherProps}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -175,10 +175,16 @@ export const Favorites = () => {
|
|||||||
contentFit='contain'
|
contentFit='contain'
|
||||||
source={heart}
|
source={heart}
|
||||||
/>
|
/>
|
||||||
<Text className='text-xl font-semibold text-white mb-2'>
|
<Text
|
||||||
|
maxFontSizeMultiplier={1.2}
|
||||||
|
className='text-xl font-semibold text-white mb-2'
|
||||||
|
>
|
||||||
{t("favorites.noDataTitle")}
|
{t("favorites.noDataTitle")}
|
||||||
</Text>
|
</Text>
|
||||||
<Text className='text-base text-white/70 text-center max-w-xs px-4'>
|
<Text
|
||||||
|
maxFontSizeMultiplier={1.2}
|
||||||
|
className='text-base text-white/70 text-center max-w-xs px-4'
|
||||||
|
>
|
||||||
{t("favorites.noData")}
|
{t("favorites.noData")}
|
||||||
</Text>
|
</Text>
|
||||||
</View>
|
</View>
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ export const KefinTweaksSettings = () => {
|
|||||||
return (
|
return (
|
||||||
<View className=''>
|
<View className=''>
|
||||||
<View className='flex flex-col rounded-xl overflow-hidden p-4 bg-neutral-900'>
|
<View className='flex flex-col rounded-xl overflow-hidden p-4 bg-neutral-900'>
|
||||||
<Text className='text-xs text-red-600 mb-2'>
|
<Text maxFontSizeMultiplier={1.2} className='text-xs text-red-600 mb-2'>
|
||||||
{t("home.settings.plugins.kefinTweaks.watchlist_enabler")}
|
{t("home.settings.plugins.kefinTweaks.watchlist_enabler")}
|
||||||
</Text>
|
</Text>
|
||||||
|
|
||||||
<View className='flex flex-row items-center justify-between mt-2'>
|
<View className='flex flex-row items-center justify-between mt-2'>
|
||||||
<Text className='text-white'>
|
<Text maxFontSizeMultiplier={1.2} className='text-white'>
|
||||||
{isEnabled ? t("Watchlist On") : t("Watchlist Off")}
|
{isEnabled ? t("Watchlist On") : t("Watchlist Off")}
|
||||||
</Text>
|
</Text>
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,9 @@ const SkipButton: React.FC<SkipButtonProps> = ({
|
|||||||
onPress={onPress}
|
onPress={onPress}
|
||||||
className='bg-black/60 rounded-md px-3 py-3 border border-neutral-900'
|
className='bg-black/60 rounded-md px-3 py-3 border border-neutral-900'
|
||||||
>
|
>
|
||||||
<Text className='text-white font-bold'>{buttonText}</Text>
|
<Text maxFontSizeMultiplier={1.2} className='text-white font-bold'>
|
||||||
|
{buttonText}
|
||||||
|
</Text>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ const SliderScrubber: React.FC<SliderScrubberProps> = ({
|
|||||||
contentFit='cover'
|
contentFit='cover'
|
||||||
/>
|
/>
|
||||||
<Text
|
<Text
|
||||||
|
maxFontSizeMultiplier={1.2}
|
||||||
style={{
|
style={{
|
||||||
position: "absolute",
|
position: "absolute",
|
||||||
bottom: 5,
|
bottom: 5,
|
||||||
@@ -126,10 +127,16 @@ const SliderScrubber: React.FC<SliderScrubberProps> = ({
|
|||||||
maximumValue={max}
|
maximumValue={max}
|
||||||
/>
|
/>
|
||||||
<View className='flex flex-row items-center justify-between mt-0.5'>
|
<View className='flex flex-row items-center justify-between mt-0.5'>
|
||||||
<Text className='text-[12px] text-neutral-400'>
|
<Text
|
||||||
|
maxFontSizeMultiplier={1.2}
|
||||||
|
className='text-[12px] text-neutral-400'
|
||||||
|
>
|
||||||
{formatTimeString(currentTime, "ms")}
|
{formatTimeString(currentTime, "ms")}
|
||||||
</Text>
|
</Text>
|
||||||
<Text className='text-[12px] text-neutral-400'>
|
<Text
|
||||||
|
maxFontSizeMultiplier={1.2}
|
||||||
|
className='text-[12px] text-neutral-400'
|
||||||
|
>
|
||||||
-{formatTimeString(remainingTime, "ms")}
|
-{formatTimeString(remainingTime, "ms")}
|
||||||
</Text>
|
</Text>
|
||||||
</View>
|
</View>
|
||||||
|
|||||||
@@ -195,6 +195,7 @@ export const TechnicalInfoOverlay: FC<TechnicalInfoOverlayProps> = memo(
|
|||||||
<View style={styles.infoBox}>
|
<View style={styles.infoBox}>
|
||||||
{playMethod && (
|
{playMethod && (
|
||||||
<Text
|
<Text
|
||||||
|
maxFontSizeMultiplier={1.2}
|
||||||
style={[
|
style={[
|
||||||
styles.infoText,
|
styles.infoText,
|
||||||
{ color: getPlayMethodColor(playMethod) },
|
{ color: getPlayMethodColor(playMethod) },
|
||||||
@@ -204,28 +205,31 @@ export const TechnicalInfoOverlay: FC<TechnicalInfoOverlayProps> = memo(
|
|||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
{transcodeReasons && transcodeReasons.length > 0 && (
|
{transcodeReasons && transcodeReasons.length > 0 && (
|
||||||
<Text style={[styles.infoText, styles.reasonText]}>
|
<Text
|
||||||
|
maxFontSizeMultiplier={1.2}
|
||||||
|
style={[styles.infoText, styles.reasonText]}
|
||||||
|
>
|
||||||
{transcodeReasons.map(formatTranscodeReason).join(", ")}
|
{transcodeReasons.map(formatTranscodeReason).join(", ")}
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
{info?.videoWidth && info?.videoHeight && (
|
{info?.videoWidth && info?.videoHeight && (
|
||||||
<Text style={styles.infoText}>
|
<Text maxFontSizeMultiplier={1.2} style={styles.infoText}>
|
||||||
{info.videoWidth}x{info.videoHeight}
|
{info.videoWidth}x{info.videoHeight}
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
{info?.videoCodec && (
|
{info?.videoCodec && (
|
||||||
<Text style={styles.infoText}>
|
<Text maxFontSizeMultiplier={1.2} style={styles.infoText}>
|
||||||
Video: {formatCodec(info.videoCodec)}
|
Video: {formatCodec(info.videoCodec)}
|
||||||
{info.fps ? ` @ ${formatFps(info.fps)} fps` : ""}
|
{info.fps ? ` @ ${formatFps(info.fps)} fps` : ""}
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
{info?.audioCodec && (
|
{info?.audioCodec && (
|
||||||
<Text style={styles.infoText}>
|
<Text maxFontSizeMultiplier={1.2} style={styles.infoText}>
|
||||||
Audio: {formatCodec(info.audioCodec)}
|
Audio: {formatCodec(info.audioCodec)}
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
{(info?.videoBitrate || info?.audioBitrate) && (
|
{(info?.videoBitrate || info?.audioBitrate) && (
|
||||||
<Text style={styles.infoText}>
|
<Text maxFontSizeMultiplier={1.2} style={styles.infoText}>
|
||||||
Bitrate:{" "}
|
Bitrate:{" "}
|
||||||
{info.videoBitrate
|
{info.videoBitrate
|
||||||
? formatBitrate(info.videoBitrate)
|
? formatBitrate(info.videoBitrate)
|
||||||
@@ -235,17 +239,22 @@ export const TechnicalInfoOverlay: FC<TechnicalInfoOverlayProps> = memo(
|
|||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
{info?.cacheSeconds !== undefined && (
|
{info?.cacheSeconds !== undefined && (
|
||||||
<Text style={styles.infoText}>
|
<Text maxFontSizeMultiplier={1.2} style={styles.infoText}>
|
||||||
Buffer: {info.cacheSeconds.toFixed(1)}s
|
Buffer: {info.cacheSeconds.toFixed(1)}s
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
{info?.droppedFrames !== undefined && info.droppedFrames > 0 && (
|
{info?.droppedFrames !== undefined && info.droppedFrames > 0 && (
|
||||||
<Text style={[styles.infoText, styles.warningText]}>
|
<Text
|
||||||
|
maxFontSizeMultiplier={1.2}
|
||||||
|
style={[styles.infoText, styles.warningText]}
|
||||||
|
>
|
||||||
Dropped: {info.droppedFrames} frames
|
Dropped: {info.droppedFrames} frames
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
{!info && !playMethod && (
|
{!info && !playMethod && (
|
||||||
<Text style={styles.infoText}>Loading...</Text>
|
<Text maxFontSizeMultiplier={1.2} style={styles.infoText}>
|
||||||
|
Loading...
|
||||||
|
</Text>
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
</Animated.View>
|
</Animated.View>
|
||||||
|
|||||||
Reference in New Issue
Block a user