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