diff --git a/frontend/src/app/index.tsx b/frontend/src/app/index.tsx index 648f45d..4ef3629 100644 --- a/frontend/src/app/index.tsx +++ b/frontend/src/app/index.tsx @@ -1,4 +1,4 @@ -import { View, Text } from "react-native"; +/*import { View, Text, ScrollView } from "react-native"; export default function HomeScreen() { return ( @@ -12,4 +12,91 @@ export default function HomeScreen() { Inicio ); -} +}*/ + +import { View, ScrollView } from 'react-native'; + +import EtaCard from '../components/EtaCard'; +import QuickAction from '../components/QuickAction'; +import SectionTitle from '../components/SectionTitle'; +import AlertItem from '../components/Alertltem'; + +export default function Home() { + return ( + + + {/*ETA*/} + + + {/*ACCIONES RÁPIDAS*/} + + + + + + + + + {/*IMPACTO SEMANAL*/} + + + + + + + + + + + {/* 🔔 ALERTAS RECIENTES */} + + + + + + + + + + + + ); +} \ No newline at end of file diff --git a/frontend/src/components/Alertltem.tsx b/frontend/src/components/Alertltem.tsx index e69de29..6022048 100644 --- a/frontend/src/components/Alertltem.tsx +++ b/frontend/src/components/Alertltem.tsx @@ -0,0 +1,59 @@ +import { View, Text, StyleSheet } from 'react-native'; +import { Colors, Spacing } from '../constants/theme'; + +type AlertItemProps = { + message: string; + type?: 'success' | 'warning' | 'danger'; +}; + +export default function AlertItem({ + message, + type = 'success', +}: AlertItemProps) { + + const theme = Colors.light; + + const getColor = () => { + switch (type) { + case 'success': + return '#22C55E'; + case 'warning': + return '#FACC15'; + case 'danger': + return '#EF4444'; + default: + return theme.textSecondary; + } + }; + + return ( + + + + {message} + + + ); +} + +const styles = StyleSheet.create({ + container: { + flexDirection: 'row', + padding: Spacing.three, + marginHorizontal: Spacing.three, + marginVertical: Spacing.one, + borderRadius: 12, + backgroundColor: '#F0F0F3', + alignItems: 'center', + }, + bar: { + width: 6, + height: '100%', + borderRadius: 4, + marginRight: Spacing.two, + }, + text: { + fontSize: 14, + flex: 1, + }, +}); \ No newline at end of file diff --git a/frontend/src/components/InputField.tsx b/frontend/src/components/InputField.tsx index e69de29..20e8f47 100644 --- a/frontend/src/components/InputField.tsx +++ b/frontend/src/components/InputField.tsx @@ -0,0 +1,49 @@ +import { View, TextInput, StyleSheet } from 'react-native'; +import { Colors, Spacing } from '../constants/theme'; + +type InputFieldProps = { + placeholder?: string; + value?: string; + onChangeText?: (text: string) => void; + secureTextEntry?: boolean; +}; + +export default function InputField({ + placeholder, + value, + onChangeText, + secureTextEntry, +}: InputFieldProps) { + + const theme = Colors.light; + + return ( + + + + ); +} + +const styles = StyleSheet.create({ + container: { + paddingHorizontal: Spacing.three, + paddingVertical: Spacing.two, + borderRadius: 12, + marginVertical: 8, + }, + input: { + fontSize: 16, + }, +}); \ No newline at end of file diff --git a/frontend/src/components/PrimaryButton.tsx b/frontend/src/components/PrimaryButton.tsx index e69de29..4d1ee8c 100644 --- a/frontend/src/components/PrimaryButton.tsx +++ b/frontend/src/components/PrimaryButton.tsx @@ -0,0 +1,39 @@ +import { Pressable, Text, StyleSheet } from 'react-native'; +import { Colors, Spacing } from '../constants/theme'; + +type PrimaryButtonProps = { + title: string; + onPress?: () => void; +}; + +export default function PrimaryButton({ + title, + onPress, +}: PrimaryButtonProps) { + + const theme = Colors.light; + + return ( + + + {title} + + + ); +} + +const styles = StyleSheet.create({ + button: { + padding: Spacing.three, + borderRadius: 12, + alignItems: 'center', + justifyContent: 'center', + }, + text: { + fontSize: 16, + fontWeight: '600', + }, +}); \ No newline at end of file diff --git a/frontend/src/components/QuickAction.tsx b/frontend/src/components/QuickAction.tsx index e69de29..916a6b7 100644 --- a/frontend/src/components/QuickAction.tsx +++ b/frontend/src/components/QuickAction.tsx @@ -0,0 +1,76 @@ +import { + Pressable, + Text, + StyleSheet, + View, +} from 'react-native'; + +import { Colors, Spacing } from '../constants/theme'; + +type QuickActionProps = { + title: string; + icon: string; + onPress?: () => void; +}; + +export default function QuickAction({ + title, + icon, + onPress, +}: QuickActionProps) { + + const theme = Colors.light; + + return ( + + + + {icon} + + + + + {title} + + + ); +} + +const styles = StyleSheet.create({ + container: { + width: 100, + padding: Spacing.three, + borderRadius: 16, + alignItems: 'center', + justifyContent: 'center', + }, + + iconContainer: { + marginBottom: Spacing.two, + }, + + icon: { + fontSize: 28, + }, + + title: { + fontSize: 14, + fontWeight: '600', + textAlign: 'center', + }, +}); \ No newline at end of file diff --git a/frontend/src/components/SectionTitle.tsx b/frontend/src/components/SectionTitle.tsx index e69de29..5eb555f 100644 --- a/frontend/src/components/SectionTitle.tsx +++ b/frontend/src/components/SectionTitle.tsx @@ -0,0 +1,27 @@ +import { Text, StyleSheet } from 'react-native'; +import { Colors, Spacing } from '../constants/theme'; + +type SectionTitleProps = { + title: string; +}; + +export default function SectionTitle({ title }: SectionTitleProps) { + + const theme = Colors.light; + + return ( + + {title} + + ); +} + +const styles = StyleSheet.create({ + title: { + fontSize: 18, + fontWeight: '700', + marginTop: Spacing.four, + marginBottom: Spacing.two, + marginLeft: Spacing.three, + }, +}); \ No newline at end of file diff --git a/frontend/src/components/StatusBadge.tsx b/frontend/src/components/StatusBadge.tsx index e69de29..14381e2 100644 --- a/frontend/src/components/StatusBadge.tsx +++ b/frontend/src/components/StatusBadge.tsx @@ -0,0 +1,50 @@ +import { View, Text, StyleSheet } from 'react-native'; +import { Colors, Spacing } from '../constants/theme'; + +type StatusType = 'success' | 'warning' | 'danger'; + +type StatusBadgeProps = { + label: string; + type?: StatusType; +}; + +export default function StatusBadge({ + label, + type = 'success', +}: StatusBadgeProps) { + + const theme = Colors.light; + + const getColor = () => { + switch (type) { + case 'success': + return '#22C55E'; + case 'warning': + return '#FACC15'; + case 'danger': + return '#EF4444'; + default: + return theme.textSecondary; + } + }; + + return ( + + {label} + + ); +} + +const styles = StyleSheet.create({ + badge: { + paddingHorizontal: Spacing.two, + paddingVertical: 4, + borderRadius: 20, + alignSelf: 'flex-start', + }, + text: { + color: '#fff', + fontSize: 12, + fontWeight: '600', + }, +}); \ No newline at end of file