mirror of
https://github.com/movie-web/native-app.git
synced 2025-09-13 13:43:25 +00:00
[ui] font added, movie item added, pages layout
This commit is contained in:
@@ -3,6 +3,7 @@ import { Tabs } from 'expo-router';
|
||||
import { StyleProp, TextStyle } from 'react-native';
|
||||
|
||||
import Colors from '../../constants/Colors';
|
||||
import { globalStyles } from '../../styles/global';
|
||||
|
||||
/**
|
||||
* You can explore the built-in icon families and icons on the web at https://icons.expo.fyi/
|
||||
@@ -45,9 +46,12 @@ export default function TabLayout() {
|
||||
paddingVertical: 18,
|
||||
height: 82,
|
||||
},
|
||||
tabBarLabelStyle: {
|
||||
marginTop: 2,
|
||||
},
|
||||
tabBarLabelStyle: [
|
||||
{
|
||||
marginTop: 2,
|
||||
},
|
||||
globalStyles.fOpenSansMedium,
|
||||
],
|
||||
}}
|
||||
>
|
||||
<Tabs.Screen
|
||||
@@ -72,7 +76,7 @@ export default function TabLayout() {
|
||||
name="search"
|
||||
options={{
|
||||
title: 'Search',
|
||||
tabBarLabel: 'test',
|
||||
tabBarLabel: '',
|
||||
tabBarShowLabel: false,
|
||||
tabBarLabelStyle: {
|
||||
display: 'none',
|
||||
|
@@ -1,19 +1,20 @@
|
||||
import { StyleSheet } from 'react-native';
|
||||
|
||||
import EditScreenInfo from '../../components/EditScreenInfo';
|
||||
import { Text, View } from '../../components/Themed';
|
||||
import ScreenLayout from '../../components/layout/screenLayout';
|
||||
import { globalStyles } from '../../styles/global';
|
||||
import { RegularText } from '../../components/Styled';
|
||||
|
||||
export default function TabTwoScreen() {
|
||||
return (
|
||||
<View style={styles.container}>
|
||||
<Text style={styles.title}>Tab Two</Text>
|
||||
<View
|
||||
style={styles.separator}
|
||||
lightColor="#eee"
|
||||
darkColor="rgba(255,255,255,0.1)"
|
||||
/>
|
||||
<EditScreenInfo path="app/(tabs)/two.tsx" />
|
||||
</View>
|
||||
<ScreenLayout
|
||||
title="About"
|
||||
subtitle="What is movie-web and how content is served?"
|
||||
>
|
||||
<RegularText style={globalStyles.textWhite}>
|
||||
No content is served from movie-web directly and movie web does not host
|
||||
anything.
|
||||
</RegularText>
|
||||
</ScreenLayout>
|
||||
);
|
||||
}
|
||||
|
||||
|
@@ -1,30 +1,18 @@
|
||||
import { StyleSheet } from 'react-native';
|
||||
import { StyleSheet, Text } from 'react-native';
|
||||
|
||||
import EditScreenInfo from '../../components/EditScreenInfo';
|
||||
import { Text, View } from '../../components/Themed';
|
||||
import { globalStyles } from '../../styles/global';
|
||||
import ScreenLayout from '../../components/layout/screenLayout';
|
||||
import { RegularText } from '../../components/Styled';
|
||||
|
||||
export default function AccountScreen() {
|
||||
return (
|
||||
<View style={styles.container}>
|
||||
<Text>Home</Text>
|
||||
<EditScreenInfo path="app/(tabs)/two.tsx" />
|
||||
</View>
|
||||
<ScreenLayout
|
||||
title="Account"
|
||||
subtitle="Manage your movie web account from here"
|
||||
>
|
||||
<RegularText style={globalStyles.textWhite}>
|
||||
Hey Bro! what are you up to?
|
||||
</RegularText>
|
||||
</ScreenLayout>
|
||||
);
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
},
|
||||
title: {
|
||||
fontSize: 20,
|
||||
fontWeight: 'bold',
|
||||
},
|
||||
separator: {
|
||||
marginVertical: 30,
|
||||
height: 1,
|
||||
width: '80%',
|
||||
},
|
||||
});
|
||||
|
@@ -1,31 +1,13 @@
|
||||
import { StyleSheet } from 'react-native';
|
||||
import { RegularText } from '../../components/Styled';
|
||||
import ScreenLayout from '../../components/layout/screenLayout';
|
||||
import { globalStyles } from '../../styles/global';
|
||||
|
||||
import EditScreenInfo from '../../components/EditScreenInfo';
|
||||
import { Text, View } from '../../components/Themed';
|
||||
import Colors from '../../constants/Colors';
|
||||
|
||||
export default function TabOneScreen() {
|
||||
export default function HomeScreen() {
|
||||
return (
|
||||
<View style={styles.container}>
|
||||
<Text>Home</Text>
|
||||
</View>
|
||||
<ScreenLayout title="Home" subtitle="This is where all magic happens">
|
||||
<RegularText style={globalStyles.textWhite}>
|
||||
Movies will be listed here
|
||||
</RegularText>
|
||||
</ScreenLayout>
|
||||
);
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
alignItems: 'center',
|
||||
backgroundColor: Colors.dark.shade900,
|
||||
justifyContent: 'center',
|
||||
},
|
||||
title: {
|
||||
fontSize: 20,
|
||||
fontWeight: 'bold',
|
||||
},
|
||||
separator: {
|
||||
marginVertical: 30,
|
||||
height: 1,
|
||||
width: '80%',
|
||||
},
|
||||
});
|
||||
|
@@ -1,35 +0,0 @@
|
||||
import { StyleSheet } from 'react-native';
|
||||
|
||||
import EditScreenInfo from '../../components/EditScreenInfo';
|
||||
import { Text, View } from '../../components/Themed';
|
||||
|
||||
export default function SearchScreen() {
|
||||
return (
|
||||
<View style={styles.container}>
|
||||
<Text style={styles.title}>Tab Two</Text>
|
||||
<View
|
||||
style={styles.separator}
|
||||
lightColor="#eee"
|
||||
darkColor="rgba(255,255,255,0.1)"
|
||||
/>
|
||||
<EditScreenInfo path="app/(tabs)/two.tsx" />
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
},
|
||||
title: {
|
||||
fontSize: 20,
|
||||
fontWeight: 'bold',
|
||||
},
|
||||
separator: {
|
||||
marginVertical: 30,
|
||||
height: 1,
|
||||
width: '80%',
|
||||
},
|
||||
});
|
64
apps/mobile/app/(tabs)/search/Searchbar.tsx
Normal file
64
apps/mobile/app/(tabs)/search/Searchbar.tsx
Normal file
@@ -0,0 +1,64 @@
|
||||
import { FontAwesome5 } from '@expo/vector-icons';
|
||||
import { useCallback, useRef, useState } from 'react';
|
||||
import { View } from 'react-native';
|
||||
import { TextInput } from 'react-native-gesture-handler';
|
||||
import { globalStyles } from '../../../styles/global';
|
||||
import Colors from '../../../constants/Colors';
|
||||
import { useFocusEffect } from 'expo-router';
|
||||
|
||||
export default function Searchbar() {
|
||||
const [keyword, setKeyword] = useState('');
|
||||
const inputRef = useRef<TextInput>(null);
|
||||
|
||||
useFocusEffect(
|
||||
useCallback(() => {
|
||||
// When the screen is focused
|
||||
const focus = () => {
|
||||
setTimeout(() => {
|
||||
inputRef?.current?.focus();
|
||||
}, 20);
|
||||
};
|
||||
focus();
|
||||
return focus; // cleanup
|
||||
}, []),
|
||||
);
|
||||
|
||||
return (
|
||||
<View
|
||||
style={{
|
||||
...globalStyles.flexRow,
|
||||
...globalStyles.itemsCenter,
|
||||
...globalStyles.border,
|
||||
...globalStyles.roundedFull,
|
||||
marginTop: 14,
|
||||
marginBottom: 24,
|
||||
}}
|
||||
>
|
||||
<View
|
||||
style={{
|
||||
...globalStyles.justifyCenter,
|
||||
...globalStyles.itemsCenter,
|
||||
width: 48,
|
||||
marginLeft: 4,
|
||||
}}
|
||||
>
|
||||
<FontAwesome5 name="search" size={18} color={Colors.dark.shade200} />
|
||||
</View>
|
||||
<TextInput
|
||||
value={keyword}
|
||||
autoFocus={true}
|
||||
onChangeText={(text) => setKeyword(text)}
|
||||
ref={inputRef}
|
||||
placeholder="What are you looking for?"
|
||||
placeholderTextColor={Colors.dark.shade200}
|
||||
style={[
|
||||
globalStyles.input,
|
||||
globalStyles.fOpenSansRegular,
|
||||
{
|
||||
width: '100%',
|
||||
},
|
||||
]}
|
||||
></TextInput>
|
||||
</View>
|
||||
);
|
||||
}
|
41
apps/mobile/app/(tabs)/search/_layout.tsx
Normal file
41
apps/mobile/app/(tabs)/search/_layout.tsx
Normal file
@@ -0,0 +1,41 @@
|
||||
import { Dimensions, ScrollView, View } from 'react-native';
|
||||
|
||||
import { globalStyles } from '../../../styles/global';
|
||||
import ScreenLayout from '../../../components/layout/screenLayout';
|
||||
import { TextInput } from 'react-native-gesture-handler';
|
||||
import styles from './styles';
|
||||
import { useCallback, useEffect, useRef, useState } from 'react';
|
||||
import { useFocusEffect } from 'expo-router';
|
||||
import { BoldText } from '../../../components/Styled';
|
||||
import Item from '../../../components/item/item';
|
||||
import Searchbar from './Searchbar';
|
||||
|
||||
export default function SearchScreen() {
|
||||
return (
|
||||
<ScrollView>
|
||||
<ScreenLayout
|
||||
title={
|
||||
<View
|
||||
style={{ ...globalStyles.flexRow, ...globalStyles.itemsCenter }}
|
||||
>
|
||||
<BoldText style={globalStyles.sectionTitle}>Search</BoldText>
|
||||
</View>
|
||||
}
|
||||
subtitle="Looking for something?"
|
||||
>
|
||||
<Searchbar />
|
||||
<View style={styles.items}>
|
||||
<View style={styles.itemOuter}>
|
||||
<Item />
|
||||
</View>
|
||||
<View style={styles.itemOuter}>
|
||||
<Item />
|
||||
</View>
|
||||
<View style={styles.itemOuter}>
|
||||
<Item />
|
||||
</View>
|
||||
</View>
|
||||
</ScreenLayout>
|
||||
</ScrollView>
|
||||
);
|
||||
}
|
19
apps/mobile/app/(tabs)/search/styles.tsx
Normal file
19
apps/mobile/app/(tabs)/search/styles.tsx
Normal file
@@ -0,0 +1,19 @@
|
||||
import { StyleSheet } from 'react-native';
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
items: {
|
||||
display: 'flex',
|
||||
flexWrap: 'wrap',
|
||||
justifyContent: 'flex-start',
|
||||
width: '100%',
|
||||
flexDirection: 'row',
|
||||
flex: 1,
|
||||
},
|
||||
itemOuter: {
|
||||
flexBasis: '50%',
|
||||
paddingHorizontal: 12,
|
||||
paddingBottom: 12,
|
||||
},
|
||||
});
|
||||
|
||||
export default styles;
|
@@ -1,35 +1,14 @@
|
||||
import { StyleSheet } from 'react-native';
|
||||
|
||||
import EditScreenInfo from '../../components/EditScreenInfo';
|
||||
import { Text, View } from '../../components/Themed';
|
||||
import { RegularText } from '../../components/Styled';
|
||||
import ScreenLayout from '../../components/layout/screenLayout';
|
||||
import { globalStyles } from '../../styles/global';
|
||||
import { StyleSheet, Text } from 'react-native';
|
||||
|
||||
export default function SettingsScreen() {
|
||||
return (
|
||||
<View style={styles.container}>
|
||||
<Text style={styles.title}>Tab Two</Text>
|
||||
<View
|
||||
style={styles.separator}
|
||||
lightColor="#eee"
|
||||
darkColor="rgba(255,255,255,0.1)"
|
||||
/>
|
||||
<EditScreenInfo path="app/(tabs)/two.tsx" />
|
||||
</View>
|
||||
<ScreenLayout title="Settings" subtitle="Need to change something?">
|
||||
<RegularText style={globalStyles.textWhite}>
|
||||
Settings would be listed in here. Coming soon
|
||||
</RegularText>
|
||||
</ScreenLayout>
|
||||
);
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
},
|
||||
title: {
|
||||
fontSize: 20,
|
||||
fontWeight: 'bold',
|
||||
},
|
||||
separator: {
|
||||
marginVertical: 30,
|
||||
height: 1,
|
||||
width: '80%',
|
||||
},
|
||||
});
|
||||
|
@@ -1,17 +1,18 @@
|
||||
import { Link, Stack } from 'expo-router';
|
||||
import { StyleSheet } from 'react-native';
|
||||
|
||||
import { Text, View } from '../components/Themed';
|
||||
import { StyleSheet, View } from 'react-native';
|
||||
import { BoldText, RegularText } from '../components/Styled';
|
||||
|
||||
export default function NotFoundScreen() {
|
||||
return (
|
||||
<>
|
||||
<Stack.Screen options={{ title: 'Oops!' }} />
|
||||
<View style={styles.container}>
|
||||
<Text style={styles.title}>This screen doesn't exist.</Text>
|
||||
<BoldText style={styles.title}>
|
||||
This screen doesn't exist.
|
||||
</BoldText>
|
||||
|
||||
<Link href="/" style={styles.link}>
|
||||
<Text style={styles.linkText}>Go to home screen!</Text>
|
||||
<RegularText style={styles.linkText}>Go to home screen!</RegularText>
|
||||
</Link>
|
||||
</View>
|
||||
</>
|
||||
|
@@ -28,7 +28,12 @@ SplashScreen.preventAutoHideAsync();
|
||||
export default function RootLayout() {
|
||||
const [loaded, error] = useFonts({
|
||||
// eslint-disable-next-line global-require
|
||||
SpaceMono: require('../assets/fonts/SpaceMono-Regular.ttf'),
|
||||
OpenSansRegular: require('../assets/fonts/OpenSans-Regular.ttf'),
|
||||
OpenSansLight: require('../assets/fonts/OpenSans-Light.ttf'),
|
||||
OpenSansMedium: require('../assets/fonts/OpenSans-Medium.ttf'),
|
||||
OpenSansBold: require('../assets/fonts/OpenSans-Bold.ttf'),
|
||||
OpenSansSemiBold: require('../assets/fonts/OpenSans-SemiBold.ttf'),
|
||||
OpenSansExtra: require('../assets/fonts/OpenSans-ExtraBold.ttf'),
|
||||
...FontAwesome.font,
|
||||
});
|
||||
|
||||
|
@@ -1,19 +1,13 @@
|
||||
import { StatusBar } from 'expo-status-bar';
|
||||
import { Platform, StyleSheet } from 'react-native';
|
||||
|
||||
import EditScreenInfo from '../components/EditScreenInfo';
|
||||
import { Text, View } from '../components/Themed';
|
||||
import { Platform, StyleSheet, View } from 'react-native';
|
||||
import { BoldText, RegularText } from '../components/Styled';
|
||||
|
||||
export default function ModalScreen() {
|
||||
return (
|
||||
<View style={styles.container}>
|
||||
<Text style={styles.title}>Modal</Text>
|
||||
<View
|
||||
style={styles.separator}
|
||||
lightColor="#eee"
|
||||
darkColor="rgba(255,255,255,0.1)"
|
||||
/>
|
||||
<EditScreenInfo path="app/modal.tsx" />
|
||||
<BoldText style={styles.title}>Modal</BoldText>
|
||||
<View style={styles.separator} />
|
||||
<RegularText>Modal?!</RegularText>
|
||||
|
||||
{/* Use a light status bar on iOS to account for the black space above the modal */}
|
||||
<StatusBar style={Platform.OS === 'ios' ? 'light' : 'auto'} />
|
||||
|
BIN
apps/mobile/assets/fonts/OpenSans-Bold.ttf
Normal file
BIN
apps/mobile/assets/fonts/OpenSans-Bold.ttf
Normal file
Binary file not shown.
BIN
apps/mobile/assets/fonts/OpenSans-ExtraBold.ttf
Normal file
BIN
apps/mobile/assets/fonts/OpenSans-ExtraBold.ttf
Normal file
Binary file not shown.
BIN
apps/mobile/assets/fonts/OpenSans-Light.ttf
Normal file
BIN
apps/mobile/assets/fonts/OpenSans-Light.ttf
Normal file
Binary file not shown.
BIN
apps/mobile/assets/fonts/OpenSans-Medium.ttf
Normal file
BIN
apps/mobile/assets/fonts/OpenSans-Medium.ttf
Normal file
Binary file not shown.
BIN
apps/mobile/assets/fonts/OpenSans-Regular.ttf
Normal file
BIN
apps/mobile/assets/fonts/OpenSans-Regular.ttf
Normal file
Binary file not shown.
BIN
apps/mobile/assets/fonts/OpenSans-SemiBold.ttf
Normal file
BIN
apps/mobile/assets/fonts/OpenSans-SemiBold.ttf
Normal file
Binary file not shown.
@@ -1,41 +0,0 @@
|
||||
import React from 'react';
|
||||
import { StyleSheet } from 'react-native';
|
||||
|
||||
import { ExternalLink } from './ExternalLink';
|
||||
import { MonoText } from './StyledText';
|
||||
import { Text, View } from './Themed';
|
||||
import Colors from '../constants/Colors';
|
||||
|
||||
export default function EditScreenInfo({ path }: { path: string }) {
|
||||
return <View />;
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
getStartedContainer: {
|
||||
alignItems: 'center',
|
||||
marginHorizontal: 50,
|
||||
},
|
||||
homeScreenFilename: {
|
||||
marginVertical: 7,
|
||||
},
|
||||
codeHighlightContainer: {
|
||||
borderRadius: 3,
|
||||
paddingHorizontal: 4,
|
||||
},
|
||||
getStartedText: {
|
||||
fontSize: 17,
|
||||
lineHeight: 24,
|
||||
textAlign: 'center',
|
||||
},
|
||||
helpContainer: {
|
||||
marginTop: 15,
|
||||
marginHorizontal: 20,
|
||||
alignItems: 'center',
|
||||
},
|
||||
helpLink: {
|
||||
paddingVertical: 15,
|
||||
},
|
||||
helpLinkText: {
|
||||
textAlign: 'center',
|
||||
},
|
||||
});
|
44
apps/mobile/components/Styled.tsx
Normal file
44
apps/mobile/components/Styled.tsx
Normal file
@@ -0,0 +1,44 @@
|
||||
import { Text } from 'react-native';
|
||||
|
||||
export const RegularText = ({ style, children, ...rest }: Text['props']) => {
|
||||
return (
|
||||
<Text style={[{ fontFamily: 'OpenSansRegular' }, style]} {...rest}>
|
||||
{children}
|
||||
</Text>
|
||||
);
|
||||
};
|
||||
export const BoldText = ({ style, children, ...rest }: Text['props']) => {
|
||||
return (
|
||||
<Text style={[{ fontFamily: 'OpenSansBold' }, style]} {...rest}>
|
||||
{children}
|
||||
</Text>
|
||||
);
|
||||
};
|
||||
export const SemiBoldText = ({ style, children, ...rest }: Text['props']) => {
|
||||
return (
|
||||
<Text style={[{ fontFamily: 'OpenSansSemiBold' }, style]} {...rest}>
|
||||
{children}
|
||||
</Text>
|
||||
);
|
||||
};
|
||||
export const MediumText = ({ style, children, ...rest }: Text['props']) => {
|
||||
return (
|
||||
<Text style={[{ fontFamily: 'OpenSansMedium' }, style]} {...rest}>
|
||||
{children}
|
||||
</Text>
|
||||
);
|
||||
};
|
||||
export const ExtraBoldText = ({ style, children, ...rest }: Text['props']) => {
|
||||
return (
|
||||
<Text style={[{ fontFamily: 'OpenSansExtraBold' }, style]} {...rest}>
|
||||
{children}
|
||||
</Text>
|
||||
);
|
||||
};
|
||||
export const LightText = ({ style, children, ...rest }: Text['props']) => {
|
||||
return (
|
||||
<Text style={[{ fontFamily: 'OpenSansLight' }, style]} {...rest}>
|
||||
{children}
|
||||
</Text>
|
||||
);
|
||||
};
|
@@ -1,5 +0,0 @@
|
||||
import { Text, TextProps } from './Themed';
|
||||
|
||||
export function MonoText(props: TextProps) {
|
||||
return <Text {...props} style={[props.style, { fontFamily: 'SpaceMono' }]} />;
|
||||
}
|
@@ -1,50 +0,0 @@
|
||||
/**
|
||||
* Learn more about Light and Dark modes:
|
||||
* https://docs.expo.io/guides/color-schemes/
|
||||
*/
|
||||
|
||||
import {
|
||||
Text as DefaultText,
|
||||
View as DefaultView,
|
||||
useColorScheme,
|
||||
} from 'react-native';
|
||||
|
||||
import Colors from '../constants/Colors';
|
||||
|
||||
type ThemeProps = {
|
||||
lightColor?: string;
|
||||
darkColor?: string;
|
||||
};
|
||||
|
||||
export type TextProps = ThemeProps & DefaultText['props'];
|
||||
export type ViewProps = ThemeProps & DefaultView['props'];
|
||||
|
||||
export function useThemeColor(
|
||||
props: { light?: string; dark?: string },
|
||||
colorName: keyof typeof Colors.light & keyof typeof Colors.dark,
|
||||
) {
|
||||
const theme = useColorScheme() ?? 'light';
|
||||
const colorFromProps = props[theme];
|
||||
|
||||
if (colorFromProps) {
|
||||
return colorFromProps;
|
||||
}
|
||||
return Colors[theme][colorName];
|
||||
}
|
||||
|
||||
export function Text(props: TextProps) {
|
||||
const { style, lightColor, darkColor, ...otherProps } = props;
|
||||
const color = useThemeColor({ light: lightColor, dark: darkColor }, 'text');
|
||||
|
||||
return <DefaultText style={[{ color }, style]} {...otherProps} />;
|
||||
}
|
||||
|
||||
export function View(props: ViewProps) {
|
||||
const { style, lightColor, darkColor, ...otherProps } = props;
|
||||
const backgroundColor = useThemeColor(
|
||||
{ light: lightColor, dark: darkColor },
|
||||
'background',
|
||||
);
|
||||
|
||||
return <DefaultView style={[{ backgroundColor }, style]} {...otherProps} />;
|
||||
}
|
30
apps/mobile/components/item/item.tsx
Normal file
30
apps/mobile/components/item/item.tsx
Normal file
@@ -0,0 +1,30 @@
|
||||
import { globalStyles } from '../../styles/global';
|
||||
import { Image, Text, View } from 'react-native';
|
||||
import styles from './styles';
|
||||
import { BoldText, RegularText } from '../Styled';
|
||||
|
||||
export default function Item() {
|
||||
return (
|
||||
<View style={styles.wrapper}>
|
||||
<View style={styles.imageWrapper}>
|
||||
<Image
|
||||
source={{
|
||||
uri: 'https://image.tmdb.org/t/p/w342//gdIrmf2DdY5mgN6ycVP0XlzKzbE.jpg',
|
||||
width: 200,
|
||||
}}
|
||||
style={styles.image}
|
||||
/>
|
||||
</View>
|
||||
<BoldText style={globalStyles.textWhite}>Hamilton</BoldText>
|
||||
<View style={styles.meta}>
|
||||
<RegularText style={[globalStyles.textMuted, styles.smallText]}>
|
||||
Movie
|
||||
</RegularText>
|
||||
<View style={[globalStyles.dotSeperator]}></View>
|
||||
<RegularText style={[globalStyles.textMuted, styles.smallText]}>
|
||||
2023
|
||||
</RegularText>
|
||||
</View>
|
||||
</View>
|
||||
);
|
||||
}
|
31
apps/mobile/components/item/styles.tsx
Normal file
31
apps/mobile/components/item/styles.tsx
Normal file
@@ -0,0 +1,31 @@
|
||||
import Colors from '../../constants/Colors';
|
||||
import { StyleSheet } from 'react-native';
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
wrapper: {
|
||||
width: '100%',
|
||||
},
|
||||
imageWrapper: {
|
||||
borderRadius: 16,
|
||||
aspectRatio: 9 / 14,
|
||||
width: '100%',
|
||||
overflow: 'hidden',
|
||||
position: 'relative',
|
||||
marginBottom: 6,
|
||||
},
|
||||
image: {
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
resizeMode: 'cover',
|
||||
},
|
||||
meta: {
|
||||
flexDirection: 'row',
|
||||
gap: 6,
|
||||
alignItems: 'center',
|
||||
},
|
||||
smallText: {
|
||||
fontSize: 12,
|
||||
},
|
||||
});
|
||||
|
||||
export default styles;
|
31
apps/mobile/components/layout/screenLayout.tsx
Normal file
31
apps/mobile/components/layout/screenLayout.tsx
Normal file
@@ -0,0 +1,31 @@
|
||||
import { View } from 'react-native';
|
||||
import { globalStyles } from '../../styles/global';
|
||||
import { styles } from './styles';
|
||||
import { BoldText, RegularText } from '../Styled';
|
||||
|
||||
type Props = {
|
||||
title?: React.ReactNode | string;
|
||||
subtitle?: string;
|
||||
children?: React.ReactNode;
|
||||
};
|
||||
|
||||
export default function ScreenLayout({ title, subtitle, children }: Props) {
|
||||
return (
|
||||
<View
|
||||
style={[
|
||||
globalStyles.pageContainer,
|
||||
globalStyles.container,
|
||||
styles.container,
|
||||
]}
|
||||
>
|
||||
{typeof title === 'string' && (
|
||||
<BoldText style={globalStyles.sectionTitle}>{title}</BoldText>
|
||||
)}
|
||||
{typeof title !== 'string' && title}
|
||||
<RegularText style={[{ marginTop: 4 }, globalStyles.sectionSubtitle]}>
|
||||
{subtitle}
|
||||
</RegularText>
|
||||
<View style={styles.children}>{children}</View>
|
||||
</View>
|
||||
);
|
||||
}
|
10
apps/mobile/components/layout/styles.tsx
Normal file
10
apps/mobile/components/layout/styles.tsx
Normal file
@@ -0,0 +1,10 @@
|
||||
import { Dimensions, StyleSheet } from 'react-native';
|
||||
|
||||
export const styles = StyleSheet.create({
|
||||
container: {
|
||||
minHeight: Dimensions.get('window').height,
|
||||
},
|
||||
children: {
|
||||
paddingVertical: 12,
|
||||
},
|
||||
});
|
75
apps/mobile/styles/global.tsx
Normal file
75
apps/mobile/styles/global.tsx
Normal file
@@ -0,0 +1,75 @@
|
||||
import { StyleSheet } from 'react-native';
|
||||
import Colors from '../constants/Colors';
|
||||
|
||||
export const globalStyles = StyleSheet.create({
|
||||
pageContainer: {
|
||||
flex: 1,
|
||||
backgroundColor: Colors.dark.shade900,
|
||||
paddingVertical: 48,
|
||||
},
|
||||
container: {
|
||||
padding: 24,
|
||||
},
|
||||
sectionTitle: {
|
||||
color: '#FFF',
|
||||
letterSpacing: -1.5,
|
||||
fontWeight: 'bold',
|
||||
fontSize: 28,
|
||||
},
|
||||
sectionSubtitle: {
|
||||
color: Colors.dark.shade200,
|
||||
fontSize: 14,
|
||||
},
|
||||
textWhite: {
|
||||
color: '#FFF',
|
||||
},
|
||||
flexRow: {
|
||||
flexDirection: 'row',
|
||||
},
|
||||
itemsCenter: {
|
||||
alignItems: 'center',
|
||||
},
|
||||
justifyCenter: {
|
||||
justifyContent: 'center',
|
||||
},
|
||||
input: {
|
||||
borderRadius: 24,
|
||||
paddingRight: 18,
|
||||
paddingVertical: 12,
|
||||
color: '#FFF',
|
||||
},
|
||||
border: {
|
||||
borderWidth: 1,
|
||||
borderColor: 'rgba(255,255,255,.1)',
|
||||
},
|
||||
roundedFull: {
|
||||
borderRadius: 34,
|
||||
},
|
||||
fOpenSansLight: {
|
||||
fontFamily: 'OpenSansLight',
|
||||
},
|
||||
fOpenSansBold: {
|
||||
fontFamily: 'OpenSansBold',
|
||||
},
|
||||
fOpenSansSemiBold: {
|
||||
fontFamily: 'OpenSansSemiBold',
|
||||
},
|
||||
fOpenSansMedium: {
|
||||
fontFamily: 'OpenSansMedium',
|
||||
},
|
||||
fOpenSansExtraBold: {
|
||||
fontFamily: 'OpenSansExtraBold',
|
||||
},
|
||||
fOpenSansRegular: {
|
||||
fontFamily: 'OpenSansRegular',
|
||||
},
|
||||
textMuted: {
|
||||
color: '#5F5F7A',
|
||||
},
|
||||
dotSeperator: {
|
||||
width: 4,
|
||||
height: 4,
|
||||
backgroundColor: '#5F5F7A',
|
||||
borderRadius: 50,
|
||||
},
|
||||
});
|
Reference in New Issue
Block a user