diff --git a/mobile/App.js b/mobile/App.js index 75f5745..c2c51ae 100644 --- a/mobile/App.js +++ b/mobile/App.js @@ -50,17 +50,32 @@ function HomeTabs() { return ( ({ - headerShown: false, - tabBarStyle: { backgroundColor: '#1e1e1e', borderTopColor: '#2a2a2a' }, + headerStyle: { + backgroundColor: '#121212', + elevation: 0, + shadowOpacity: 0, + borderBottomWidth: 0, + }, + headerTintColor: '#fff', + headerTitleStyle: { fontWeight: '800', fontSize: 20 }, + tabBarStyle: { + backgroundColor: '#1a1a1a', + borderTopColor: '#2a2a2a', + borderTopWidth: 1, + height: 60, + paddingBottom: 8, + paddingTop: 4, + }, tabBarActiveTintColor: '#1db954', - tabBarInactiveTintColor: '#888', + tabBarInactiveTintColor: '#666', + tabBarLabelStyle: { fontSize: 10, fontWeight: '600', marginTop: 2 }, tabBarIcon: ({ color, size }) => { const icons = { Home: 'home', Artists: 'person', Albums: 'disc', Search: 'search', Settings: 'settings-outline' }; - return ; + return ; }, })} > - + diff --git a/mobile/src/screens/AlbumDetail.js b/mobile/src/screens/AlbumDetail.js index 74cb84b..3fe6eff 100644 --- a/mobile/src/screens/AlbumDetail.js +++ b/mobile/src/screens/AlbumDetail.js @@ -4,6 +4,7 @@ import { StyleSheet, ActivityIndicator, } from 'react-native'; import { useNavigation, useRoute } from '@react-navigation/native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { Ionicons } from '@expo/vector-icons'; import { api, ensureArtistSortMap, dispAlbumName, dispArtistById, coverUrl } from '../api'; import { playQueue, skipToIndex } from '../audio/player'; @@ -12,6 +13,7 @@ import SongItem from '../components/SongItem'; export default function AlbumDetailScreen() { const navigation = useNavigation(); + const insets = useSafeAreaInsets(); const { album } = useRoute().params; const { cfg } = useStore(); const [songs, setSongs] = useState([]); @@ -49,7 +51,7 @@ export default function AlbumDetailScreen() { ListHeaderComponent={() => ( {/* Back button */} - navigation.goBack()}> + navigation.goBack()}> @@ -111,10 +113,10 @@ export default function AlbumDetailScreen() { const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#121212' }, backBtn: { - position: 'absolute', top: 44, left: 12, zIndex: 10, + position: 'absolute', left: 12, zIndex: 10, backgroundColor: 'rgba(0,0,0,0.5)', borderRadius: 20, padding: 6, }, - artWrap: { alignItems: 'center', paddingTop: 60, paddingBottom: 16 }, + artWrap: { alignItems: 'center', paddingTop: 72, paddingBottom: 16 }, art: { width: 220, height: 220, borderRadius: 8, shadowColor: '#000', shadowOpacity: 0.5, shadowRadius: 16, diff --git a/mobile/src/screens/ArtistDetail.js b/mobile/src/screens/ArtistDetail.js index 6e917a2..eb81ed5 100644 --- a/mobile/src/screens/ArtistDetail.js +++ b/mobile/src/screens/ArtistDetail.js @@ -6,12 +6,14 @@ import { const SCREEN_WIDTH = Dimensions.get('window').width; import { useNavigation, useRoute } from '@react-navigation/native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { Ionicons } from '@expo/vector-icons'; import { api, apiCached, dispArtistById, dispAlbumName, coverUrl, getArtistImage, cacheArtistSortNames } from '../api'; import AlbumCard from '../components/AlbumCard'; export default function ArtistDetailScreen() { const navigation = useNavigation(); + const insets = useSafeAreaInsets(); const { artist } = useRoute().params; const [albums, setAlbums] = useState([]); const [img, setImg] = useState(null); @@ -43,7 +45,7 @@ export default function ArtistDetailScreen() { 🎤 )} - navigation.goBack()}> + navigation.goBack()}> @@ -91,7 +93,7 @@ const styles = StyleSheet.create({ heroName: { color: '#fff', fontSize: 24, fontWeight: '800', textShadowColor: '#000', textShadowRadius: 8 }, heroSub: { color: '#ddd', fontSize: 13, marginTop: 2 }, backBtn: { - position: 'absolute', top: 44, left: 12, + position: 'absolute', left: 12, backgroundColor: 'rgba(0,0,0,0.5)', borderRadius: 20, padding: 6, }, diff --git a/mobile/src/screens/Home.js b/mobile/src/screens/Home.js index d61b977..700dfae 100644 --- a/mobile/src/screens/Home.js +++ b/mobile/src/screens/Home.js @@ -92,8 +92,7 @@ export default function HomeScreen() { style={styles.container} refreshControl={ { setRefreshing(true); load(true); }} tintColor="#1db954" />} > - Willkommen zurück 👋 - + diff --git a/mobile/src/screens/Login.js b/mobile/src/screens/Login.js index 5c73ef5..ce36504 100644 --- a/mobile/src/screens/Login.js +++ b/mobile/src/screens/Login.js @@ -120,7 +120,7 @@ export default function LoginScreen() { const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#121212' }, - content: { padding: 24, paddingTop: 60 }, + content: { padding: 24, paddingTop: 24 }, logo: { fontSize: 32, textAlign: 'center', marginBottom: 8 }, subtitle: { color: '#aaa', textAlign: 'center', marginBottom: 32, fontSize: 14 }, label: { color: '#ccc', fontSize: 13, marginBottom: 6, marginTop: 16 }, diff --git a/mobile/src/screens/NowPlaying.js b/mobile/src/screens/NowPlaying.js index 04e2ccc..634c0b9 100644 --- a/mobile/src/screens/NowPlaying.js +++ b/mobile/src/screens/NowPlaying.js @@ -1,9 +1,10 @@ import React, { useState } from 'react'; import { View, Text, Image, TouchableOpacity, - StyleSheet, Dimensions, PanResponder, + StyleSheet, Dimensions, } from 'react-native'; import { useNavigation } from '@react-navigation/native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { Ionicons } from '@expo/vector-icons'; import { usePlaybackState, useProgress, State } from 'react-native-track-player'; import Slider from '@react-native-community/slider'; @@ -15,6 +16,7 @@ const { width } = Dimensions.get('window'); export default function NowPlayingScreen() { const navigation = useNavigation(); + const insets = useSafeAreaInsets(); const { currentTrack, repeat, shuffle, setShuffle } = useStore(); const playbackState = usePlaybackState(); const { position, duration } = useProgress(500); @@ -38,7 +40,7 @@ export default function NowPlayingScreen() { } return ( - + {/* Header */} navigation.goBack()} style={styles.headerBtn}> @@ -119,13 +121,13 @@ export default function NowPlayingScreen() { } const styles = StyleSheet.create({ - container: { flex: 1, backgroundColor: '#121212', paddingBottom: 40 }, + container: { flex: 1, backgroundColor: '#121212' }, empty: { flex: 1, backgroundColor: '#121212', alignItems: 'center', justifyContent: 'center' }, emptyText: { color: '#aaa', fontSize: 16 }, back: { color: '#1db954', marginTop: 12, fontSize: 14 }, header: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', - paddingTop: 52, paddingHorizontal: 16, paddingBottom: 12, + paddingTop: 12, paddingHorizontal: 16, paddingBottom: 12, }, headerBtn: { width: 40, alignItems: 'flex-start' }, headerTitle: { color: '#fff', fontSize: 14, fontWeight: '700', letterSpacing: 0.5 },