import type { ReactNode } from 'react'; import { Pressable, StyleSheet, View, type StyleProp, type ViewStyle } from 'react-native'; import { AppText } from './app-text'; import { colors, radius, size, spacing } from './tokens'; type Props = { title: string; context?: string; subtitle?: string; leading?: ReactNode; trailing?: ReactNode; avatar?: { initials: string; onPress: () => void }; compact?: boolean; style?: StyleProp; }; export function AppHeader({ title, context, subtitle, leading, trailing, avatar, compact = false, style }: Props) { if (compact) return {leading} {title} {trailing} ; const resolvedTrailing = trailing ?? (avatar ? ( [styles.avatar, pressed && styles.avatarPressed]}> {avatar.initials || '?'} ) : null); return {context ? {context} : null} {title} {subtitle ? {subtitle} : null} {resolvedTrailing ? {resolvedTrailing} : null} ; } const styles = StyleSheet.create({ root: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', gap: spacing[5], paddingTop: spacing[4] }, copy: { flex: 1 }, titleWithContext: { marginTop: spacing[1] }, subtitle: { marginTop: spacing[1] }, rootTrailing: { alignSelf: 'flex-start', paddingTop: spacing[1] }, avatar: { width: 40, height: 40, borderRadius: radius.control, borderCurve: 'continuous', backgroundColor: colors.brand.cobaltSoft, alignItems: 'center', justifyContent: 'center' }, avatarPressed: { opacity: 0.78 }, compact: { height: 56, flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' }, side: { width: size.touchTargetMin, minHeight: size.touchTargetMin, justifyContent: 'center' }, trailing: { alignItems: 'flex-end' }, compactTitle: { flex: 1, textAlign: 'center', paddingHorizontal: spacing[3] }, });