fix(ui): keyboard-first-tap, Teilen-Button bigger, Header-Icon hitSlop

(app)/index.tsx:
- FlatList keyboardShouldPersistTaps="handled" — Bild-Icon im ComposeCard
  reagiert ab erstem Tap auch wenn Tastatur offen. Vorher dismisste der
  Tap nur die Tastatur (RN-Default "never").

ComposeCard.tsx Teilen-Button:
- height 44→52, px-5→px-6, paper-plane-outline-Icon size 18 + text-base
  Nunito_700Bold. Standard-iOS-Filled-Primary-Button-Style.

AppHeader.tsx Bell + Avatar:
- hitSlop 4pt allseitig auf beiden Pressables — effective tap-area
  36→44pt ohne Layout-Verschiebung
- Bell-Icon size 18→22 (konsistent mit Avatar-36pt-Kreis)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
chahinebrini 2026-05-07 21:23:46 +02:00
parent 192f67cd07
commit 0d52cb1846
3 changed files with 10 additions and 4 deletions

View File

@ -87,6 +87,7 @@ export default function HomeScreen() {
keyExtractor={keyExtractor}
contentContainerStyle={{ paddingHorizontal: 16, paddingTop: 12, paddingBottom: 32 }}
showsVerticalScrollIndicator={false}
keyboardShouldPersistTaps="handled"
// Performance tuning — measured on Galaxy A50 (older mid-range):
// VirtualizedList warned with dt=2.26s for ~7k content. These props
// shrink the per-batch render cost and reclaim off-screen views.

View File

@ -71,10 +71,11 @@ export function AppHeader({ notifCount, showBack, title }: Props = {}) {
<View className="flex-row items-center gap-1">
<Pressable
onPress={() => setNotifOpen(true)}
hitSlop={{ top: 4, bottom: 4, left: 4, right: 4 }}
className="w-9 h-9 rounded-full bg-white items-center justify-center"
style={({ pressed }) => ({ opacity: pressed ? 0.7 : 1 })}
>
<Ionicons name="notifications-outline" size={18} color="#737373" />
<Ionicons name="notifications-outline" size={22} color="#737373" />
{badge > 0 && (
<View className="absolute top-0 right-0 w-4 h-4 rounded-full bg-rebreak-500 items-center justify-center">
<Text className="text-white text-[9px]" style={{ fontFamily: 'Nunito_700Bold' }}>
@ -87,6 +88,7 @@ export function AppHeader({ notifCount, showBack, title }: Props = {}) {
{/* Avatar = Trigger für Dropdown-Menu (kein separates 3-Punkte-Icon) */}
<Pressable
onPress={() => setMenuOpen(true)}
hitSlop={{ top: 4, bottom: 4, left: 4, right: 4 }}
className={`w-9 h-9 rounded-full items-center justify-center overflow-hidden ${showAvatarImage ? 'bg-neutral-100' : 'bg-rebreak-500'}`}
style={({ pressed }) => ({ opacity: pressed ? 0.7 : 1 })}
>

View File

@ -163,16 +163,19 @@ export function ComposeCard({ onPosted }: Props) {
<Pressable
onPress={submit}
disabled={!content.trim() || posting}
className="px-5 rounded-full bg-rebreak-500 items-center justify-center flex-row gap-1.5"
className="px-6 rounded-full bg-rebreak-500 items-center justify-center flex-row gap-2"
style={({ pressed }) => ({
height: 44,
height: 52,
opacity: pressed || !content.trim() || posting ? 0.5 : 1,
})}
>
{posting ? (
<ActivityIndicator size="small" color="#fff" />
) : (
<Text className="text-white text-sm" style={{ fontFamily: 'Nunito_600SemiBold' }}>{t('community.share')}</Text>
<>
<Ionicons name="paper-plane-outline" size={18} color="#fff" />
<Text className="text-white text-base" style={{ fontFamily: 'Nunito_700Bold' }}>{t('community.share')}</Text>
</>
)}
</Pressable>
</View>