gitshark

Clone repository

git clone https://git.vilip.de/git/vilip/taskflow.git
git clone git@git.vilip.de:vilip/taskflow.git

← Commits

๐Ÿ’„ Major UI improvements

750e6a8d3213ff4931f86b6db5161bbef6f6b621 ยท vvilip ยท 2025-11-04T17:14:45Z

Changes

13 files changed, +208 -224

MODIFY app.json +1 -1
diff --git a/app.json b/app.json
index 5865fa9..a23ae09 100644
--- a/app.json
+++ b/app.json
@@ -4,7 +4,7 @@
4 4 "slug": "taskflow",
5 5 "version": "1.0.0",
6 6 "orientation": "portrait",
7 - "icon": "./assets/images/icon.png",
7 + "icon": "./assets/images/Logo.png",
8 8 "scheme": "taskflow",
9 9 "userInterfaceStyle": "automatic",
10 10 "newArchEnabled": true,
MODIFY app/(tabs)/_layout.tsx +4 -2
diff --git "a/app/\050tabs\051/_layout.tsx" "b/app/\050tabs\051/_layout.tsx"
index c642b08..b3e68af 100644
--- "a/app/\050tabs\051/_layout.tsx"
+++ "b/app/\050tabs\051/_layout.tsx"
@@ -1,6 +1,7 @@
1 1 import { Tabs } from 'expo-router';
2 2 import React from 'react';
3 3 import { Ionicons } from '@expo/vector-icons';
4 +import { useSafeAreaInsets } from 'react-native-safe-area-context';
4 5
5 6 import { HapticTab } from '@/components/haptic-tab';
6 7 import { Colors } from '@/constants/theme';
@@ -8,6 +9,7 @@
8 9
9 10 export default function TabLayout() {
10 11 const colorScheme = useColorScheme();
12 + const insets = useSafeAreaInsets();
11 13
12 14 return (
13 15 <Tabs
@@ -16,9 +18,9 @@
16 18 headerShown: false,
17 19 tabBarButton: HapticTab,
18 20 tabBarStyle: {
19 - paddingBottom: 8,
21 + height: 60 + insets.bottom,
22 + paddingBottom: insets.bottom,
20 23 paddingTop: 8,
21 - height: 60,
22 24 },
23 25 }}>
24 26 <Tabs.Screen
MODIFY app/(tabs)/calendar.tsx +42 -28
diff --git "a/app/\050tabs\051/calendar.tsx" "b/app/\050tabs\051/calendar.tsx"
index d34e0ab..e8fd969 100644
--- "a/app/\050tabs\051/calendar.tsx"
+++ "b/app/\050tabs\051/calendar.tsx"
@@ -1,5 +1,6 @@
1 1 import React, { useEffect, useState } from 'react';
2 -import { StyleSheet, SafeAreaView, Alert, ScrollView, TouchableOpacity, View } from 'react-native';
2 +import { StyleSheet, Alert, ScrollView, TouchableOpacity, View } from 'react-native';
3 +import { SafeAreaView } from 'react-native-safe-area-context';
3 4 import { router, useFocusEffect } from 'expo-router';
4 5 import { ThemedView } from '@/components/themed-view';
5 6 import { ThemedText } from '@/components/themed-text';
@@ -161,19 +162,21 @@
161 162 ]}
162 163 onPress={() => handleDateSelect(day)}
163 164 >
164 - <ThemedText style={[
165 - styles.dayText,
166 - isSelected && styles.selectedDayText,
167 - ]}>
168 - {day}
169 - </ThemedText>
170 - {taskCount > 0 && (
171 - <View style={[styles.taskBadge, { backgroundColor: isSelected ? '#fff' : colors.tint }]}>
172 - <ThemedText style={[styles.taskBadgeText, { color: isSelected ? colors.tint : '#fff' }]}>
173 - {taskCount}
174 - </ThemedText>
175 - </View>
176 - )}
165 + <View style={styles.dayCellContent}>
166 + <ThemedText style={[
167 + styles.dayText,
168 + isSelected && styles.selectedDayText,
169 + ]}>
170 + {day}
171 + </ThemedText>
172 + {taskCount > 0 && (
173 + <View style={[styles.taskBadge, { backgroundColor: isSelected ? '#fff' : colors.tint }]}>
174 + <ThemedText style={[styles.taskBadgeText, { color: isSelected ? colors.tint : '#fff' }]}>
175 + {taskCount}
176 + </ThemedText>
177 + </View>
178 + )}
179 + </View>
177 180 </TouchableOpacity>
178 181 );
179 182 }
@@ -187,12 +190,13 @@
187 190 };
188 191
189 192 return (
190 - <SafeAreaView style={styles.container}>
191 - <ThemedView style={styles.header}>
192 - <ThemedText type="title">Calendar</ThemedText>
193 - </ThemedView>
193 + <ThemedView style={styles.container}>
194 + <SafeAreaView style={styles.safeArea} edges={['top']}>
195 + <ThemedView style={styles.header}>
196 + <ThemedText type="title">Calendar</ThemedText>
197 + </ThemedView>
194 198
195 - <ThemedView style={styles.monthSelector}>
199 + <ThemedView style={styles.monthSelector}>
196 200 <TouchableOpacity onPress={handlePrevMonth}>
197 201 <ThemedText style={[styles.monthButton, { color: colors.tint }]}>โ†</ThemedText>
198 202 </TouchableOpacity>
@@ -226,7 +230,8 @@
226 230 </ScrollView>
227 231
228 232 <FabButton onPress={handleAddTask} />
229 - </SafeAreaView>
233 + </SafeAreaView>
234 + </ThemedView>
230 235 );
231 236 }
232 237
@@ -234,6 +239,9 @@
234 239 container: {
235 240 flex: 1,
236 241 },
242 + safeArea: {
243 + flex: 1,
244 + },
237 245 header: {
238 246 paddingHorizontal: 16,
239 247 paddingTop: 16,
@@ -279,9 +287,12 @@
279 287 dayCell: {
280 288 width: `${100 / 7}%`,
281 289 aspectRatio: 1,
290 + padding: 4,
291 + },
292 + dayCellContent: {
293 + flex: 1,
282 294 justifyContent: 'center',
283 295 alignItems: 'center',
284 - padding: 4,
285 296 position: 'relative',
286 297 },
287 298 today: {
@@ -293,6 +304,7 @@
293 304 },
294 305 dayText: {
295 306 fontSize: 16,
307 + textAlign: 'center',
296 308 },
297 309 selectedDayText: {
298 310 color: '#fff',
@@ -300,18 +312,20 @@
300 312 },
301 313 taskBadge: {
302 314 position: 'absolute',
303 - top: 4,
304 - right: 4,
305 - minWidth: 18,
306 - height: 18,
307 - borderRadius: 9,
315 + top: 2,
316 + right: 2,
317 + minWidth: 16,
318 + width: 16,
319 + height: 16,
320 + borderRadius: 8,
308 321 justifyContent: 'center',
309 322 alignItems: 'center',
310 - paddingHorizontal: 4,
311 323 },
312 324 taskBadgeText: {
313 - fontSize: 10,
325 + fontSize: 9,
314 326 fontWeight: 'bold',
327 + lineHeight: 9,
328 + includeFontPadding: false,
315 329 },
316 330 tasksSection: {
317 331 marginTop: 24,
MODIFY app/(tabs)/index.tsx +66 -59
diff --git "a/app/\050tabs\051/index.tsx" "b/app/\050tabs\051/index.tsx"
index 7fa30c7..062c9d7 100644
--- "a/app/\050tabs\051/index.tsx"
+++ "b/app/\050tabs\051/index.tsx"
@@ -1,5 +1,6 @@
1 1 import React, { useEffect, useState } from 'react';
2 -import { StyleSheet, SafeAreaView, Alert, TouchableOpacity, ScrollView } from 'react-native';
2 +import { StyleSheet, Alert, TouchableOpacity, ScrollView, View } from 'react-native';
3 +import { SafeAreaView } from 'react-native-safe-area-context';
3 4 import { router, useFocusEffect } from 'expo-router';
4 5 import { ThemedView } from '@/components/themed-view';
5 6 import { ThemedText } from '@/components/themed-text';
@@ -64,65 +65,67 @@
64 65 const colors = Colors[colorScheme];
65 66
66 67 return (
67 - <SafeAreaView style={styles.container}>
68 - <ThemedView style={styles.header}>
69 - <ThemedText type="title">Inbox</ThemedText>
70 - <ThemedText style={styles.count}>{tasks.length} tasks</ThemedText>
71 - </ThemedView>
68 + <ThemedView style={styles.container}>
69 + <SafeAreaView style={styles.safeArea} edges={['top']}>
70 + <ThemedView style={styles.header}>
71 + <ThemedText type="title">Inbox</ThemedText>
72 + <ThemedText style={styles.count}>{tasks.length} tasks</ThemedText>
73 + </ThemedView>
72 74
73 - <ThemedView style={styles.filterContainer}>
74 - <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.filterScroll}>
75 - <TouchableOpacity
76 - style={[
77 - styles.filterButton,
78 - { borderColor: colors.border },
79 - statusFilter === 'all' && [styles.filterButtonActive, { backgroundColor: colors.tint, borderColor: colors.tint }],
80 - ]}
81 - onPress={() => setStatusFilter('all')}
82 - >
83 - <ThemedText style={[
84 - styles.filterText,
85 - statusFilter === 'all' && styles.filterTextActive,
86 - ]}>All</ThemedText>
87 - </TouchableOpacity>
88 - <TouchableOpacity
89 - style={[
90 - styles.filterButton,
91 - { borderColor: colors.border },
92 - statusFilter === 'waiting' && [styles.filterButtonActive, { backgroundColor: colors.tint, borderColor: colors.tint }],
93 - ]}
94 - onPress={() => setStatusFilter('waiting')}
95 - >
96 - <ThemedText style={[
97 - styles.filterText,
98 - statusFilter === 'waiting' && styles.filterTextActive,
99 - ]}>โณ Waiting</ThemedText>
100 - </TouchableOpacity>
101 - <TouchableOpacity
102 - style={[
103 - styles.filterButton,
104 - { borderColor: colors.border },
105 - statusFilter === 'someday' && [styles.filterButtonActive, { backgroundColor: colors.tint, borderColor: colors.tint }],
106 - ]}
107 - onPress={() => setStatusFilter('someday')}
108 - >
109 - <ThemedText style={[
110 - styles.filterText,
111 - statusFilter === 'someday' && styles.filterTextActive,
112 - ]}>๐Ÿ’ญ Someday</ThemedText>
113 - </TouchableOpacity>
114 - </ScrollView>
115 - </ThemedView>
116 -
117 - <TaskList
118 - tasks={tasks}
119 - onTaskPress={handleTaskPress}
120 - onToggleComplete={handleToggleComplete}
121 - emptyMessage="๐ŸŽ‰ Inbox is empty!"
122 - />
123 -
124 - <FabButton onPress={handleAddTask} />
125 - </SafeAreaView>
75 + <ThemedView style={styles.filterContainer}>
76 + <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.filterScroll}>
77 + <TouchableOpacity
78 + style={[
79 + styles.filterButton,
80 + { borderColor: colors.border },
81 + statusFilter === 'all' && [styles.filterButtonActive, { backgroundColor: colors.tint, borderColor: colors.tint }],
82 + ]}
83 + onPress={() => setStatusFilter('all')}
84 + >
85 + <ThemedText style={[
86 + styles.filterText,
87 + statusFilter === 'all' && styles.filterTextActive,
88 + ]}>All</ThemedText>
89 + </TouchableOpacity>
90 + <TouchableOpacity
91 + style={[
92 + styles.filterButton,
93 + { borderColor: colors.border },
94 + statusFilter === 'waiting' && [styles.filterButtonActive, { backgroundColor: colors.tint, borderColor: colors.tint }],
95 + ]}
96 + onPress={() => setStatusFilter('waiting')}
97 + >
98 + <ThemedText style={[
99 + styles.filterText,
100 + statusFilter === 'waiting' && styles.filterTextActive,
101 + ]}>โณ Waiting</ThemedText>
102 + </TouchableOpacity>
103 + <TouchableOpacity
104 + style={[
105 + styles.filterButton,
106 + { borderColor: colors.border },
107 + statusFilter === 'someday' && [styles.filterButtonActive, { backgroundColor: colors.tint, borderColor: colors.tint }],
108 + ]}
109 + onPress={() => setStatusFilter('someday')}
110 + >
111 + <ThemedText style={[
112 + styles.filterText,
113 + statusFilter === 'someday' && styles.filterTextActive,
114 + ]}>๐Ÿ’ญ Someday</ThemedText>
115 + </TouchableOpacity>
116 + </ScrollView>
117 + </ThemedView>
118 +
119 + <TaskList
120 + tasks={tasks}
121 + onTaskPress={handleTaskPress}
122 + onToggleComplete={handleToggleComplete}
123 + emptyMessage="๐ŸŽ‰ Inbox is empty!"
124 + />
125 +
126 + <FabButton onPress={handleAddTask} />
127 + </SafeAreaView>
128 + </ThemedView>
126 129 );
127 130 }
128 131
@@ -130,6 +133,9 @@
130 133 container: {
131 134 flex: 1,
132 135 },
136 + safeArea: {
137 + flex: 1,
138 + },
133 139 header: {
134 140 paddingHorizontal: 16,
135 141 paddingTop: 16,
@@ -142,6 +148,7 @@
142 148 },
143 149 filterContainer: {
144 150 paddingVertical: 8,
151 + paddingBottom: 4,
145 152 },
146 153 filterScroll: {
147 154 paddingHorizontal: 16,
MODIFY app/(tabs)/projects.tsx +32 -26
diff --git "a/app/\050tabs\051/projects.tsx" "b/app/\050tabs\051/projects.tsx"
index ee8a626..de94173 100644
--- "a/app/\050tabs\051/projects.tsx"
+++ "b/app/\050tabs\051/projects.tsx"
@@ -1,5 +1,6 @@
1 1 import React, { useEffect, useState } from 'react';
2 -import { StyleSheet, SafeAreaView, Alert, TouchableOpacity, FlatList, View } from 'react-native';
2 +import { StyleSheet, Alert, TouchableOpacity, FlatList, View } from 'react-native';
3 +import { SafeAreaView } from 'react-native-safe-area-context';
3 4 import { router, useFocusEffect } from 'expo-router';
4 5 import { ThemedView } from '@/components/themed-view';
5 6 import { ThemedText } from '@/components/themed-text';
@@ -71,32 +72,34 @@
71 72 );
72 73
73 74 return (
74 - <SafeAreaView style={styles.container}>
75 - <ThemedView style={styles.header}>
76 - <ThemedText type="title">Projects</ThemedText>
77 - <ThemedText style={styles.count}>{projects.length} projects</ThemedText>
78 - </ThemedView>
79 -
80 - {projects.length === 0 ? (
81 - <ThemedView style={styles.emptyContainer}>
82 - <ThemedText style={styles.emptyText}>
83 - ๐Ÿ“ No projects yet
84 - </ThemedText>
85 - <ThemedText style={styles.emptySubtext}>
86 - Create a project to organize your tasks
87 - </ThemedText>
75 + <ThemedView style={styles.container}>
76 + <SafeAreaView style={styles.safeArea} edges={['top']}>
77 + <ThemedView style={styles.header}>
78 + <ThemedText type="title">Projects</ThemedText>
79 + <ThemedText style={styles.count}>{projects.length} projects</ThemedText>
88 80 </ThemedView>
89 - ) : (
90 - <FlatList
91 - data={projects}
92 - keyExtractor={(item) => item.id}
93 - renderItem={renderProject}
94 - contentContainerStyle={styles.list}
95 - />
96 - )}
97 -
98 - <FabButton onPress={handleAddProject} />
99 - </SafeAreaView>
81 +
82 + {projects.length === 0 ? (
83 + <ThemedView style={styles.emptyContainer}>
84 + <ThemedText style={styles.emptyText}>
85 + ๐Ÿ“ No projects yet
86 + </ThemedText>
87 + <ThemedText style={styles.emptySubtext}>
88 + Create a project to organize your tasks
89 + </ThemedText>
90 + </ThemedView>
91 + ) : (
92 + <FlatList
93 + data={projects}
94 + keyExtractor={(item) => item.id}
95 + renderItem={renderProject}
96 + contentContainerStyle={styles.list}
97 + />
98 + )}
99 +
100 + <FabButton onPress={handleAddProject} />
101 + </SafeAreaView>
102 + </ThemedView>
100 103 );
101 104 }
102 105
@@ -104,6 +107,9 @@
104 107 container: {
105 108 flex: 1,
106 109 },
110 + safeArea: {
111 + flex: 1,
112 + },
107 113 header: {
108 114 paddingHorizontal: 16,
109 115 paddingTop: 16,
MODIFY app/(tabs)/settings.tsx +14 -8
diff --git "a/app/\050tabs\051/settings.tsx" "b/app/\050tabs\051/settings.tsx"
index d60dd9d..d29e82a 100644
--- "a/app/\050tabs\051/settings.tsx"
+++ "b/app/\050tabs\051/settings.tsx"
@@ -1,5 +1,6 @@
1 1 import React, { useState } from 'react';
2 -import { StyleSheet, SafeAreaView, Alert, TouchableOpacity, ScrollView, Switch } from 'react-native';
2 +import { StyleSheet, Alert, TouchableOpacity, ScrollView, Switch } from 'react-native';
3 +import { SafeAreaView } from 'react-native-safe-area-context';
3 4 import { ThemedView } from '@/components/themed-view';
4 5 import { ThemedText } from '@/components/themed-text';
5 6 import { storageService, taskService } from '@/services';
@@ -85,12 +86,13 @@
85 86 };
86 87
87 88 return (
88 - <SafeAreaView style={styles.container}>
89 - <ThemedView style={styles.header}>
90 - <ThemedText type="title">Settings</ThemedText>
91 - </ThemedView>
92 -
93 - <ScrollView style={styles.scrollView}>
89 + <ThemedView style={styles.container}>
90 + <SafeAreaView style={styles.safeArea} edges={['top']}>
91 + <ThemedView style={styles.header}>
92 + <ThemedText type="title">Settings</ThemedText>
93 + </ThemedView>
94 +
95 + <ScrollView style={styles.scrollView}>
94 96 <ThemedView style={styles.section}>
95 97 <ThemedText type="subtitle" style={styles.sectionTitle}>Appearance</ThemedText>
96 98
@@ -210,7 +212,8 @@
210 212 </TouchableOpacity>
211 213 </ThemedView>
212 214 </ScrollView>
213 - </SafeAreaView>
215 + </SafeAreaView>
216 + </ThemedView>
214 217 );
215 218 }
216 219
@@ -218,6 +221,9 @@
218 221 container: {
219 222 flex: 1,
220 223 },
224 + safeArea: {
225 + flex: 1,
226 + },
221 227 header: {
222 228 paddingHorizontal: 16,
223 229 paddingTop: 16,
MODIFY app/(tabs)/today.tsx +36 -94
diff --git "a/app/\050tabs\051/today.tsx" "b/app/\050tabs\051/today.tsx"
index b546224..0713953 100644
--- "a/app/\050tabs\051/today.tsx"
+++ "b/app/\050tabs\051/today.tsx"
@@ -1,5 +1,6 @@
1 1 import React, { useEffect, useState } from 'react';
2 -import { StyleSheet, SafeAreaView, Alert, ScrollView } from 'react-native';
2 +import { StyleSheet, Alert, ScrollView } from 'react-native';
3 +import { SafeAreaView } from 'react-native-safe-area-context';
3 4 import { router, useFocusEffect } from 'expo-router';
4 5 import { ThemedView } from '@/components/themed-view';
5 6 import { ThemedText } from '@/components/themed-text';
@@ -10,8 +11,6 @@
10 11
11 12 export default function TodayScreen() {
12 13 const [todayTasks, setTodayTasks] = useState<Task[]>([]);
13 - const [tomorrowTasks, setTomorrowTasks] = useState<Task[]>([]);
14 - const [overdueTasks, setOverdueTasks] = useState<Task[]>([]);
15 14 const [loading, setLoading] = useState(true);
16 15
17 16 useFocusEffect(
@@ -22,15 +21,8 @@
22 21
23 22 const loadTasks = async () => {
24 23 try {
25 - const [today, tomorrow, overdue] = await Promise.all([
26 - taskService.getTodayTasks(),
27 - taskService.getTomorrowTasks(),
28 - taskService.getOverdueTasks(),
29 - ]);
30 -
24 + const today = await taskService.getTodayTasks();
31 25 setTodayTasks(today);
32 - setTomorrowTasks(tomorrow);
33 - setOverdueTasks(overdue);
34 26 } catch (error) {
35 27 Alert.alert('Error', 'Failed to load tasks');
36 28 } finally {
@@ -40,8 +32,7 @@
40 32
41 33 const handleToggleComplete = async (taskId: string) => {
42 34 try {
43 - const allTasks = [...overdueTasks, ...todayTasks, ...tomorrowTasks];
44 - const task = allTasks.find(t => t.id === taskId);
35 + const task = todayTasks.find(t => t.id === taskId);
45 36 if (!task) return;
46 37
47 38 if (task.completed) {
@@ -61,70 +52,38 @@
61 52 };
62 53
63 54 const handleAddTask = () => {
64 - router.push('/task/new');
55 + const today = new Date();
56 + today.setHours(23, 59, 59, 999);
57 + router.push({
58 + pathname: '/task/new',
59 + params: { dueDate: today.getTime().toString() },
60 + });
65 61 };
66 62
67 63 return (
68 - <SafeAreaView style={styles.container}>
69 - <ThemedView style={styles.header}>
70 - <ThemedText type="title">Today</ThemedText>
71 - <ThemedText style={styles.date}>
72 - {new Date().toLocaleDateString('de-DE', {
73 - weekday: 'long',
74 - day: 'numeric',
75 - month: 'long'
76 - })}
77 - </ThemedText>
78 - </ThemedView>
79 -
80 - <ScrollView style={styles.scrollView}>
81 - {overdueTasks.length > 0 && (
82 - <ThemedView style={styles.section}>
83 - <ThemedText type="subtitle" style={styles.overdueTitle}>โš ๏ธ Overdue</ThemedText>
84 - <TaskList
85 - tasks={overdueTasks}
86 - onTaskPress={handleTaskPress}
87 - onToggleComplete={handleToggleComplete}
88 - scrollable={false}
89 - />
90 - </ThemedView>
91 - )}
92 -
93 - {todayTasks.length > 0 && (
94 - <ThemedView style={styles.section}>
95 - <ThemedText type="subtitle">Today</ThemedText>
96 - <TaskList
97 - tasks={todayTasks}
98 - onTaskPress={handleTaskPress}
99 - onToggleComplete={handleToggleComplete}
100 - scrollable={false}
101 - />
102 - </ThemedView>
103 - )}
104 -
105 - {tomorrowTasks.length > 0 && (
106 - <ThemedView style={styles.section}>
107 - <ThemedText type="subtitle">Tomorrow</ThemedText>
108 - <TaskList
109 - tasks={tomorrowTasks}
110 - onTaskPress={handleTaskPress}
111 - onToggleComplete={handleToggleComplete}
112 - scrollable={false}
113 - />
114 - </ThemedView>
115 - )}
116 -
117 - {overdueTasks.length === 0 && todayTasks.length === 0 && tomorrowTasks.length === 0 && (
118 - <ThemedView style={styles.emptyContainer}>
119 - <ThemedText style={styles.emptyText}>
120 - โ˜€๏ธ All clear! No scheduled tasks.
121 - </ThemedText>
122 - </ThemedView>
123 - )}
124 - </ScrollView>
125 -
126 - <FabButton onPress={handleAddTask} />
127 - </SafeAreaView>
64 + <ThemedView style={styles.container}>
65 + <SafeAreaView style={styles.safeArea} edges={['top']}>
66 + <ThemedView style={styles.header}>
67 + <ThemedText type="title">Today</ThemedText>
68 + <ThemedText style={styles.date}>
69 + {new Date().toLocaleDateString('de-DE', {
70 + weekday: 'long',
71 + day: 'numeric',
72 + month: 'long'
73 + })}
74 + </ThemedText>
75 + </ThemedView>
76 +
77 + <TaskList
78 + tasks={todayTasks}
79 + onTaskPress={handleTaskPress}
80 + onToggleComplete={handleToggleComplete}
81 + emptyMessage="โ˜€๏ธ No tasks for today!"
82 + />
83 +
84 + <FabButton onPress={handleAddTask} />
85 + </SafeAreaView>
86 + </ThemedView>
128 87 );
129 88 }
130 89
@@ -132,6 +91,9 @@
132 91 container: {
133 92 flex: 1,
134 93 },
94 + safeArea: {
95 + flex: 1,
96 + },
135 97 header: {
136 98 paddingHorizontal: 16,
137 99 paddingTop: 16,
@@ -142,24 +104,4 @@
142 104 opacity: 0.6,
143 105 marginTop: 4,
144 106 },
145 - scrollView: {
146 - flex: 1,
147 - },
148 - section: {
149 - marginBottom: 24,
150 - },
151 - overdueTitle: {
152 - color: '#ef4444',
153 - },
154 - emptyContainer: {
155 - flex: 1,
156 - justifyContent: 'center',
157 - alignItems: 'center',
158 - paddingVertical: 60,
159 - },
160 - emptyText: {
161 - fontSize: 16,
162 - opacity: 0.5,
163 - textAlign: 'center',
164 - },
165 107 });
MODIFY app/_layout.tsx +8 -3
diff --git a/app/_layout.tsx b/app/_layout.tsx
index 5df177b..12f1082 100644
--- a/app/_layout.tsx
+++ b/app/_layout.tsx
@@ -1,6 +1,7 @@
1 1 import { DarkTheme, DefaultTheme, ThemeProvider as NavigationThemeProvider } from '@react-navigation/native';
2 2 import { Stack } from 'expo-router';
3 3 import { StatusBar } from 'expo-status-bar';
4 +import { SafeAreaProvider } from 'react-native-safe-area-context';
4 5 import 'react-native-reanimated';
5 6
6 7 import { useColorScheme } from '@/hooks/use-color-scheme';
@@ -17,6 +18,8 @@
17 18 <NavigationThemeProvider value={colorScheme === 'dark' ? DarkTheme : DefaultTheme}>
18 19 <Stack>
19 20 <Stack.Screen name="(tabs)" options={{ headerShown: false }} />
21 + <Stack.Screen name="task/[id]" options={{ headerShown: false }} />
22 + <Stack.Screen name="project/[id]" options={{ headerShown: false }} />
20 23 <Stack.Screen name="modal" options={{ presentation: 'modal', title: 'Modal' }} />
21 24 </Stack>
22 25 <StatusBar style="auto" />
@@ -26,8 +29,10 @@
26 29
27 30 export default function RootLayout() {
28 31 return (
29 - <ThemeProvider>
30 - <RootLayoutNav />
31 - </ThemeProvider>
32 + <SafeAreaProvider>
33 + <ThemeProvider>
34 + <RootLayoutNav />
35 + </ThemeProvider>
36 + </SafeAreaProvider>
32 37 );
33 38 }
MODIFY app/project/[id].tsx +2 -1
diff --git "a/app/project/\133id\135.tsx" "b/app/project/\133id\135.tsx"
index 2994421..b9c27af 100644
--- "a/app/project/\133id\135.tsx"
+++ "b/app/project/\133id\135.tsx"
@@ -1,5 +1,6 @@
1 1 import React, { useEffect, useState } from 'react';
2 -import { StyleSheet, SafeAreaView, Alert, ScrollView, TouchableOpacity, TextInput } from 'react-native';
2 +import { StyleSheet, Alert, ScrollView, TouchableOpacity, TextInput } from 'react-native';
3 +import { SafeAreaView } from 'react-native-safe-area-context';
3 4 import { router, useLocalSearchParams } from 'expo-router';
4 5 import { ThemedView } from '@/components/themed-view';
5 6 import { ThemedText } from '@/components/themed-text';
MODIFY app/task/[id].tsx +2 -1
diff --git "a/app/task/\133id\135.tsx" "b/app/task/\133id\135.tsx"
index a9d7040..550e19c 100644
--- "a/app/task/\133id\135.tsx"
+++ "b/app/task/\133id\135.tsx"
@@ -1,5 +1,6 @@
1 1 import React, { useEffect, useState } from 'react';
2 -import { StyleSheet, SafeAreaView, Alert, ScrollView, TouchableOpacity, TextInput, Platform } from 'react-native';
2 +import { StyleSheet, Alert, ScrollView, TouchableOpacity, TextInput, Platform } from 'react-native';
3 +import { SafeAreaView } from 'react-native-safe-area-context';
3 4 import { router, useLocalSearchParams } from 'expo-router';
4 5 import { ThemedView } from '@/components/themed-view';
5 6 import { ThemedText } from '@/components/themed-text';
ADD assets/images/Logo.png +0 -0
diff --git a/assets/images/Logo.png b/assets/images/Logo.png
new file mode 100644
index 0000000..7b2fddc
--- /dev/null
+++ b/assets/images/Logo.png
0 0 Binary files differ
ADD assets/images/Logo@2.png +0 -0
diff --git a/assets/images/Logo@2.png b/assets/images/Logo@2.png
new file mode 100644
index 0000000..a54dc37
--- /dev/null
+++ b/assets/images/Logo@2.png
0 0 Binary files differ
MODIFY components/fab-button.tsx +1 -1
diff --git a/components/fab-button.tsx b/components/fab-button.tsx
index 07ea9ed..e0a2276 100644
--- a/components/fab-button.tsx
+++ b/components/fab-button.tsx
@@ -27,7 +27,7 @@
27 27 fab: {
28 28 position: 'absolute',
29 29 right: 20,
30 - bottom: Platform.OS === 'ios' ? 90 : 80,
30 + bottom: Platform.OS === 'ios' ? 20 : 20,
31 31 width: 56,
32 32 height: 56,
33 33 borderRadius: 28,

Keyboard shortcuts

?Show this help
g hGo home
EscClose dialog