diff --git a/mobile/app/(tabs)/index.tsx b/mobile/app/(tabs)/index.tsx index b54ccad..af66137 100644 --- a/mobile/app/(tabs)/index.tsx +++ b/mobile/app/(tabs)/index.tsx @@ -5,6 +5,7 @@ import { useAuthStore } from '@/lib/auth-store'; import { useRapport } from '@/hooks/useRapport'; import { useSaisies } from '@/hooks/useTracker'; import { Colors } from '@/lib/colors'; +import RepubliqueHeader from '@/components/RepubliqueHeader'; export default function DashboardScreen() { const router = useRouter(); @@ -15,7 +16,9 @@ export default function DashboardScreen() { const recentSaisies = (saisies || []).slice(0, 3); return ( - + + + Bonjour, {user?.prenom} 👋 Comment allez-vous aujourd'hui ? @@ -80,40 +83,42 @@ export default function DashboardScreen() { ))} )} - + + ); } const styles = StyleSheet.create({ + screen: { flex: 1, backgroundColor: Colors.white }, container: { flex: 1, backgroundColor: Colors.white }, content: { padding: 20 }, greeting: { fontSize: 28, fontWeight: '800', color: Colors.black, marginTop: 8 }, subtitle: { fontSize: 16, color: Colors.gray[500], marginTop: 4, marginBottom: 24 }, actionsRow: { flexDirection: 'row', gap: 12, marginBottom: 24 }, actionCard: { - flex: 1, backgroundColor: Colors.gray[50], borderRadius: 16, padding: 20, - alignItems: 'center', gap: 12, borderWidth: 1, borderColor: Colors.gray[100], + flex: 1, backgroundColor: Colors.white, borderRadius: 4, padding: 20, + alignItems: 'center', gap: 12, borderWidth: 1, borderColor: Colors.gray[200], }, - actionIcon: { width: 56, height: 56, borderRadius: 16, justifyContent: 'center', alignItems: 'center' }, - actionText: { fontSize: 14, fontWeight: '600', color: Colors.gray[700] }, + actionIcon: { width: 56, height: 56, borderRadius: 4, justifyContent: 'center', alignItems: 'center' }, + actionText: { fontSize: 14, fontWeight: '600', color: Colors.black }, statsContainer: { marginBottom: 24 }, sectionTitle: { fontSize: 18, fontWeight: '700', color: Colors.black, marginBottom: 12 }, statsRow: { flexDirection: 'row', gap: 12 }, statCard: { - flex: 1, backgroundColor: Colors.gray[50], borderRadius: 16, padding: 16, - alignItems: 'center', borderWidth: 1, borderColor: Colors.gray[100], + flex: 1, backgroundColor: Colors.gray[50], borderRadius: 4, padding: 16, + alignItems: 'center', borderWidth: 1, borderColor: Colors.gray[200], }, - statValue: { fontSize: 24, fontWeight: '800', color: Colors.black }, + statValue: { fontSize: 24, fontWeight: '800', color: Colors.primary }, statLabel: { fontSize: 12, color: Colors.gray[500], marginTop: 4 }, recentContainer: { marginBottom: 24 }, sectionHeader: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 12 }, - seeAll: { fontSize: 14, fontWeight: '600', color: Colors.secondary }, + seeAll: { fontSize: 14, fontWeight: '600', color: Colors.primary, textDecorationLine: 'underline' }, saisieItem: { flexDirection: 'row', alignItems: 'center', gap: 12, padding: 14, - backgroundColor: Colors.gray[50], borderRadius: 14, marginBottom: 8, - borderWidth: 1, borderColor: Colors.gray[100], + backgroundColor: Colors.white, borderRadius: 4, marginBottom: 8, + borderWidth: 1, borderColor: Colors.gray[200], }, - emotionIcon: { width: 44, height: 44, borderRadius: 12, justifyContent: 'center', alignItems: 'center' }, + emotionIcon: { width: 44, height: 44, borderRadius: 4, justifyContent: 'center', alignItems: 'center' }, emotionEmoji: { fontSize: 22 }, saisieContent: { flex: 1 }, saisieEmotion: { fontSize: 15, fontWeight: '600', color: Colors.black }, diff --git a/mobile/app/(tabs)/info/[slug].tsx b/mobile/app/(tabs)/info/[slug].tsx index ebd8de1..0700195 100644 --- a/mobile/app/(tabs)/info/[slug].tsx +++ b/mobile/app/(tabs)/info/[slug].tsx @@ -11,7 +11,7 @@ export default function FeedDetailScreen() { if (isLoading) { return ( - + ); } @@ -32,7 +32,7 @@ export default function FeedDetailScreen() { - + Information santé mentale @@ -52,10 +52,10 @@ const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: Colors.white }, content: { padding: 20, paddingBottom: 40 }, centered: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: Colors.white }, - badge: { flexDirection: 'row', alignItems: 'center', gap: 6, alignSelf: 'flex-start', backgroundColor: `${Colors.secondary}15`, paddingHorizontal: 10, paddingVertical: 5, borderRadius: 999, marginBottom: 12 }, - badgeText: { fontSize: 12, fontWeight: '600', color: Colors.secondary }, + badge: { flexDirection: 'row', alignItems: 'center', gap: 6, alignSelf: 'flex-start', backgroundColor: `${Colors.primary}15`, paddingHorizontal: 10, paddingVertical: 5, borderRadius: 4, marginBottom: 12 }, + badgeText: { fontSize: 12, fontWeight: '600', color: Colors.primary }, title: { fontSize: 24, fontWeight: '800', color: Colors.black, marginBottom: 8, lineHeight: 30 }, date: { fontSize: 13, color: Colors.gray[400], marginBottom: 20 }, - body: { fontSize: 15, lineHeight: 24, color: Colors.gray[700] ?? '#374151' }, + body: { fontSize: 15, lineHeight: 24, color: Colors.black }, errorText: { marginTop: 12, fontSize: 16, color: Colors.gray[400] }, }); diff --git a/mobile/app/(tabs)/info/index.tsx b/mobile/app/(tabs)/info/index.tsx index 3eb92d4..702e6a7 100644 --- a/mobile/app/(tabs)/info/index.tsx +++ b/mobile/app/(tabs)/info/index.tsx @@ -15,7 +15,7 @@ export default function InfoListScreen() { onPress={() => router.push(`/(tabs)/info/${item.slug}`)} > - + {item.titre} @@ -62,14 +62,14 @@ const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: Colors.white }, listContent: { padding: 16 }, header: { marginBottom: 20 }, - headerTitle: { fontSize: 14, fontWeight: '700', color: Colors.secondary, textTransform: 'uppercase', letterSpacing: 1 }, + headerTitle: { fontSize: 14, fontWeight: '700', color: Colors.primary, textTransform: 'uppercase', letterSpacing: 1 }, headerSubtitle: { fontSize: 15, color: Colors.gray[500], marginTop: 4 }, card: { flexDirection: 'row', alignItems: 'center', gap: 14, padding: 16, - backgroundColor: Colors.gray[50], borderRadius: 16, marginBottom: 10, - borderWidth: 1, borderColor: Colors.gray[100], + backgroundColor: Colors.white, borderRadius: 4, marginBottom: 10, + borderWidth: 1, borderColor: Colors.gray[200], }, - cardIcon: { width: 48, height: 48, borderRadius: 14, backgroundColor: `${Colors.secondary}15`, justifyContent: 'center', alignItems: 'center' }, + cardIcon: { width: 48, height: 48, borderRadius: 4, backgroundColor: `${Colors.primary}15`, justifyContent: 'center', alignItems: 'center' }, cardContent: { flex: 1 }, cardTitle: { fontSize: 15, fontWeight: '700', color: Colors.black, marginBottom: 4 }, cardExcerpt: { fontSize: 13, color: Colors.gray[500], lineHeight: 18 }, diff --git a/mobile/app/(tabs)/journal/edit.tsx b/mobile/app/(tabs)/journal/edit.tsx index 84c6da7..1048296 100644 --- a/mobile/app/(tabs)/journal/edit.tsx +++ b/mobile/app/(tabs)/journal/edit.tsx @@ -112,7 +112,7 @@ export default function EditEntryScreen() { onPress={handleSubmit} disabled={updateSaisie.isPending || !emotionId} > - + {updateSaisie.isPending ? 'Envoi...' : 'Enregistrer'} @@ -129,34 +129,35 @@ const styles = StyleSheet.create({ loadingText: { color: Colors.gray[400], fontSize: 16 }, title: { fontSize: 24, fontWeight: '800', color: Colors.black, marginBottom: 24 }, section: { marginBottom: 24 }, - label: { fontSize: 15, fontWeight: '700', color: Colors.gray[700], marginBottom: 10 }, + label: { fontSize: 15, fontWeight: '700', color: Colors.black, marginBottom: 10 }, intensityContainer: { flexDirection: 'row', alignItems: 'baseline', justifyContent: 'center', marginBottom: 16 }, intensityValue: { fontSize: 48, fontWeight: '800', color: Colors.black }, intensityUnit: { fontSize: 20, color: Colors.gray[400], marginLeft: 4 }, sliderButtons: { flexDirection: 'row', justifyContent: 'space-between', marginBottom: 4 }, sliderDot: { - width: 28, height: 28, borderRadius: 14, + width: 28, height: 28, borderRadius: 4, backgroundColor: Colors.gray[100], justifyContent: 'center', alignItems: 'center', }, sliderDotActive: { backgroundColor: Colors.primary }, sliderDotText: { fontSize: 12, fontWeight: '600', color: Colors.gray[500] }, - sliderDotTextActive: { color: Colors.black }, + sliderDotTextActive: { color: Colors.white }, sliderLabels: { flexDirection: 'row', justifyContent: 'space-between', marginTop: 4 }, sliderLabel: { fontSize: 12, color: Colors.gray[400] }, textArea: { - backgroundColor: Colors.gray[50], borderWidth: 1, borderColor: Colors.gray[200], - borderRadius: 16, padding: 16, fontSize: 15, color: Colors.black, minHeight: 100, + backgroundColor: Colors.gray[100], borderTopLeftRadius: 4, borderTopRightRadius: 4, + borderBottomWidth: 2, borderBottomColor: Colors.black, + padding: 16, fontSize: 15, color: Colors.black, minHeight: 100, }, actionsRow: { flexDirection: 'row', justifyContent: 'space-between', marginTop: 8, gap: 12 }, cancelBtn: { - flex: 1, paddingVertical: 16, borderRadius: 14, - backgroundColor: Colors.gray[100], alignItems: 'center', + flex: 1, paddingVertical: 16, borderRadius: 4, + backgroundColor: Colors.white, alignItems: 'center', borderWidth: 1, borderColor: Colors.primary, }, - cancelBtnText: { fontSize: 15, fontWeight: '600', color: Colors.gray[600] }, + cancelBtnText: { fontSize: 15, fontWeight: '600', color: Colors.primary }, submitBtn: { - flex: 1, flexDirection: 'row', gap: 8, paddingVertical: 16, borderRadius: 14, - backgroundColor: Colors.secondary, alignItems: 'center', justifyContent: 'center', + flex: 1, flexDirection: 'row', gap: 8, paddingVertical: 16, borderRadius: 4, + backgroundColor: Colors.primary, alignItems: 'center', justifyContent: 'center', }, - submitBtnText: { fontSize: 15, fontWeight: '700', color: Colors.black }, + submitBtnText: { fontSize: 15, fontWeight: '700', color: Colors.white }, btnDisabled: { opacity: 0.5 }, }); diff --git a/mobile/app/(tabs)/journal/index.tsx b/mobile/app/(tabs)/journal/index.tsx index 30da3cb..87c6602 100644 --- a/mobile/app/(tabs)/journal/index.tsx +++ b/mobile/app/(tabs)/journal/index.tsx @@ -81,7 +81,7 @@ export default function JournalScreen() { } /> router.push('/(tabs)/journal/new')}> - + ); @@ -92,14 +92,14 @@ const styles = StyleSheet.create({ listContent: { padding: 16, paddingBottom: 80 }, saisieCard: { flexDirection: 'row', alignItems: 'flex-start', gap: 12, padding: 16, - backgroundColor: Colors.gray[50], borderRadius: 16, marginBottom: 10, - borderWidth: 1, borderColor: Colors.gray[100], + backgroundColor: Colors.white, borderRadius: 4, marginBottom: 10, + borderWidth: 1, borderColor: Colors.gray[200], }, - emotionIcon: { width: 48, height: 48, borderRadius: 14, justifyContent: 'center', alignItems: 'center' }, + emotionIcon: { width: 48, height: 48, borderRadius: 4, justifyContent: 'center', alignItems: 'center' }, emotionEmoji: { fontSize: 24 }, saisieContent: { flex: 1 }, saisieHeader: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 6 }, - badge: { paddingHorizontal: 10, paddingVertical: 3, borderRadius: 8 }, + badge: { paddingHorizontal: 10, paddingVertical: 3, borderRadius: 4 }, badgeText: { fontSize: 13, fontWeight: '600' }, intensityText: { fontSize: 12, color: Colors.gray[400] }, intensityBar: { height: 4, backgroundColor: Colors.gray[200], borderRadius: 2, marginBottom: 6 }, @@ -113,7 +113,7 @@ const styles = StyleSheet.create({ emptyText: { fontSize: 14, color: Colors.gray[400], marginTop: 4 }, fab: { position: 'absolute', right: 20, bottom: 20, - width: 56, height: 56, borderRadius: 28, + width: 56, height: 56, borderRadius: 4, backgroundColor: Colors.primary, justifyContent: 'center', alignItems: 'center', shadowColor: '#000', shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.2, shadowRadius: 8, elevation: 6, diff --git a/mobile/app/(tabs)/journal/new.tsx b/mobile/app/(tabs)/journal/new.tsx index f5a06c1..6e59f56 100644 --- a/mobile/app/(tabs)/journal/new.tsx +++ b/mobile/app/(tabs)/journal/new.tsx @@ -59,7 +59,7 @@ export default function NewEntryScreen() { disabled={!emotionId} > Suivant - + )} @@ -96,12 +96,12 @@ export default function NewEntryScreen() { setStep(1)}> - + Retour setStep(3)}> Suivant - + @@ -122,7 +122,7 @@ export default function NewEntryScreen() { /> setStep(2)}> - + Retour - + {createSaisie.isPending ? 'Envoi...' : 'Enregistrer'} @@ -149,11 +149,11 @@ const styles = StyleSheet.create({ width: 32, height: 32, borderRadius: 16, backgroundColor: Colors.gray[200], justifyContent: 'center', alignItems: 'center', }, - stepActive: { backgroundColor: Colors.secondary }, + stepActive: { backgroundColor: Colors.primary }, stepNumber: { fontSize: 14, fontWeight: '700', color: Colors.gray[500] }, stepNumberActive: { color: Colors.white }, stepLine: { width: 40, height: 3, backgroundColor: Colors.gray[200], marginHorizontal: 4 }, - stepLineActive: { backgroundColor: Colors.secondary }, + stepLineActive: { backgroundColor: Colors.primary }, stepTitle: { fontSize: 20, fontWeight: '700', color: Colors.black, marginBottom: 20 }, intensityContainer: { flexDirection: 'row', alignItems: 'baseline', justifyContent: 'center', marginBottom: 24 }, intensityValue: { fontSize: 64, fontWeight: '800', color: Colors.black }, @@ -165,20 +165,21 @@ const styles = StyleSheet.create({ sliderTrack: { height: 6, backgroundColor: Colors.gray[200], borderRadius: 3, marginBottom: 8 }, sliderFill: { height: 6, backgroundColor: Colors.primary, borderRadius: 3 }, sliderButtons: { flexDirection: 'row', justifyContent: 'space-between' }, - sliderDot: { width: 28, height: 28, borderRadius: 14, backgroundColor: Colors.gray[100], justifyContent: 'center', alignItems: 'center' }, + sliderDot: { width: 28, height: 28, borderRadius: 4, backgroundColor: Colors.gray[100], justifyContent: 'center', alignItems: 'center' }, sliderDotActive: { backgroundColor: Colors.primary }, sliderDotText: { fontSize: 12, fontWeight: '600', color: Colors.gray[500] }, - sliderDotTextActive: { color: Colors.black }, + sliderDotTextActive: { color: Colors.white }, textArea: { - backgroundColor: Colors.gray[50], borderWidth: 1, borderColor: Colors.gray[200], - borderRadius: 16, padding: 16, fontSize: 15, color: Colors.black, + backgroundColor: Colors.gray[100], borderTopLeftRadius: 4, borderTopRightRadius: 4, + borderBottomWidth: 2, borderBottomColor: Colors.black, + padding: 16, fontSize: 15, color: Colors.black, minHeight: 120, marginBottom: 24, }, navRow: { flexDirection: 'row', justifyContent: 'space-between', marginTop: 16 }, - backBtn: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingVertical: 14, paddingHorizontal: 20, borderRadius: 12, backgroundColor: Colors.gray[100] }, - backBtnText: { fontSize: 15, fontWeight: '600', color: Colors.gray[600] }, - nextBtn: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingVertical: 14, paddingHorizontal: 24, borderRadius: 12, backgroundColor: Colors.primary }, - submitBtn: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingVertical: 14, paddingHorizontal: 24, borderRadius: 12, backgroundColor: Colors.secondary }, - nextBtnText: { fontSize: 15, fontWeight: '700', color: Colors.black }, + backBtn: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingVertical: 14, paddingHorizontal: 20, borderRadius: 4, backgroundColor: Colors.white, borderWidth: 1, borderColor: Colors.primary }, + backBtnText: { fontSize: 15, fontWeight: '600', color: Colors.primary }, + nextBtn: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingVertical: 14, paddingHorizontal: 24, borderRadius: 4, backgroundColor: Colors.primary }, + submitBtn: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingVertical: 14, paddingHorizontal: 24, borderRadius: 4, backgroundColor: Colors.primary }, + nextBtnText: { fontSize: 15, fontWeight: '700', color: Colors.white }, btnDisabled: { opacity: 0.5 }, }); diff --git a/mobile/app/(tabs)/journal/reports.tsx b/mobile/app/(tabs)/journal/reports.tsx index 55ed2c2..0cd10b4 100644 --- a/mobile/app/(tabs)/journal/reports.tsx +++ b/mobile/app/(tabs)/journal/reports.tsx @@ -53,7 +53,7 @@ export default function ReportsScreen() { Intensite moy. - + {rapport.stats.emotion_dominante?.icone || '—'} {rapport.stats.emotion_dominante?.nom || 'Aucune'} @@ -102,17 +102,17 @@ export default function ReportsScreen() { const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: Colors.white }, content: { padding: 20, paddingBottom: 40 }, - periodRow: { flexDirection: 'row', backgroundColor: Colors.gray[100], borderRadius: 12, padding: 4, marginBottom: 20 }, - periodBtn: { flex: 1, paddingVertical: 10, alignItems: 'center', borderRadius: 10 }, - periodBtnActive: { backgroundColor: Colors.white, shadowColor: '#000', shadowOffset: { width: 0, height: 1 }, shadowOpacity: 0.1, shadowRadius: 4, elevation: 2 }, + periodRow: { flexDirection: 'row', backgroundColor: Colors.gray[100], borderRadius: 4, padding: 4, marginBottom: 20 }, + periodBtn: { flex: 1, paddingVertical: 10, alignItems: 'center', borderRadius: 4 }, + periodBtnActive: { backgroundColor: Colors.primary }, periodText: { fontSize: 13, fontWeight: '600', color: Colors.gray[500] }, - periodTextActive: { color: Colors.black }, + periodTextActive: { color: Colors.white }, loading: { padding: 40, alignItems: 'center' }, loadingText: { color: Colors.gray[400] }, statsRow: { flexDirection: 'row', gap: 10, marginBottom: 16 }, statCard: { - flex: 1, backgroundColor: Colors.gray[50], borderRadius: 16, padding: 16, - alignItems: 'center', gap: 6, borderWidth: 1, borderColor: Colors.gray[100], + flex: 1, backgroundColor: Colors.gray[50], borderRadius: 4, padding: 16, + alignItems: 'center', gap: 6, borderWidth: 1, borderColor: Colors.gray[200], }, statValue: { fontSize: 22, fontWeight: '800', color: Colors.black }, statLabel: { fontSize: 11, color: Colors.gray[500] }, @@ -123,7 +123,7 @@ const styles = StyleSheet.create({ repartitionItem: { marginBottom: 16 }, repartitionHeader: { flexDirection: 'row', alignItems: 'center', marginBottom: 6 }, colorDot: { width: 10, height: 10, borderRadius: 5, marginRight: 8 }, - repartitionName: { flex: 1, fontSize: 14, fontWeight: '600', color: Colors.gray[700] }, + repartitionName: { flex: 1, fontSize: 14, fontWeight: '600', color: Colors.black }, repartitionPct: { fontSize: 14, fontWeight: '700', color: Colors.black }, progressBar: { height: 6, backgroundColor: Colors.gray[200], borderRadius: 3, marginBottom: 4 }, progressFill: { height: 6, borderRadius: 3 }, diff --git a/mobile/app/(tabs)/profile.tsx b/mobile/app/(tabs)/profile.tsx index c13bbc2..2310438 100644 --- a/mobile/app/(tabs)/profile.tsx +++ b/mobile/app/(tabs)/profile.tsx @@ -58,7 +58,7 @@ export default function ProfileScreen() { {/* Logout */} - + Se deconnecter @@ -82,26 +82,26 @@ const styles = StyleSheet.create({ content: { padding: 20, paddingBottom: 40 }, profileHeader: { alignItems: 'center', marginBottom: 32, marginTop: 12 }, avatar: { - width: 80, height: 80, borderRadius: 40, backgroundColor: Colors.primary, + width: 80, height: 80, borderRadius: 4, backgroundColor: Colors.primary, justifyContent: 'center', alignItems: 'center', marginBottom: 12, }, - avatarText: { fontSize: 28, fontWeight: '800', color: Colors.black }, + avatarText: { fontSize: 28, fontWeight: '800', color: Colors.white }, name: { fontSize: 22, fontWeight: '700', color: Colors.black }, email: { fontSize: 14, color: Colors.gray[500], marginTop: 4 }, - roleBadge: { backgroundColor: `${Colors.secondary}20`, paddingHorizontal: 12, paddingVertical: 4, borderRadius: 8, marginTop: 8 }, - roleText: { fontSize: 12, fontWeight: '600', color: Colors.secondary, textTransform: 'capitalize' }, + roleBadge: { backgroundColor: `${Colors.primary}15`, paddingHorizontal: 12, paddingVertical: 4, borderRadius: 4, marginTop: 8 }, + roleText: { fontSize: 12, fontWeight: '600', color: Colors.primary, textTransform: 'capitalize' }, menuSection: { marginBottom: 24 }, - sectionTitle: { fontSize: 13, fontWeight: '700', color: Colors.gray[400], textTransform: 'uppercase', letterSpacing: 1, marginBottom: 8 }, - menuCard: { backgroundColor: Colors.gray[50], borderRadius: 16, overflow: 'hidden', borderWidth: 1, borderColor: Colors.gray[100] }, + sectionTitle: { fontSize: 13, fontWeight: '700', color: Colors.gray[500], textTransform: 'uppercase', letterSpacing: 1, marginBottom: 8 }, + menuCard: { backgroundColor: Colors.white, borderRadius: 4, overflow: 'hidden', borderWidth: 1, borderColor: Colors.gray[200] }, menuItem: { flexDirection: 'row', alignItems: 'center', gap: 12, paddingVertical: 15, paddingHorizontal: 16, - borderBottomWidth: 1, borderBottomColor: Colors.gray[100], + borderBottomWidth: 1, borderBottomColor: Colors.gray[200], }, - menuLabel: { flex: 1, fontSize: 15, color: Colors.gray[700] }, + menuLabel: { flex: 1, fontSize: 15, color: Colors.black }, logoutBtn: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 8, - paddingVertical: 16, borderRadius: 14, backgroundColor: '#DC143C10', + paddingVertical: 16, borderRadius: 4, backgroundColor: Colors.errorBg, }, - logoutText: { fontSize: 15, fontWeight: '600', color: '#DC143C' }, + logoutText: { fontSize: 15, fontWeight: '600', color: Colors.error }, version: { textAlign: 'center', fontSize: 12, color: Colors.gray[400], marginTop: 20 }, }); diff --git a/mobile/app/(tabs)/urgence.tsx b/mobile/app/(tabs)/urgence.tsx index d3b6cd6..4db180b 100644 --- a/mobile/app/(tabs)/urgence.tsx +++ b/mobile/app/(tabs)/urgence.tsx @@ -68,7 +68,7 @@ export default function UrgenceScreen() { - + Vous n'êtes pas seul(e) @@ -79,7 +79,7 @@ export default function UrgenceScreen() { {CONTACTS.map((c) => ( appeler(c.numero, c.nom)}> - + {c.nom} @@ -92,7 +92,7 @@ export default function UrgenceScreen() { ))} - + En cas d'urgence vitale, appelez immédiatement le 15 (SAMU) ou le 112. @@ -105,21 +105,21 @@ const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: Colors.white }, content: { padding: 16, paddingBottom: 32 }, header: { marginBottom: 20, alignItems: 'flex-start' }, - iconBadge: { width: 40, height: 40, borderRadius: 999, backgroundColor: '#FEE2E2', justifyContent: 'center', alignItems: 'center', marginBottom: 12 }, + iconBadge: { width: 40, height: 40, borderRadius: 4, backgroundColor: Colors.errorBg, justifyContent: 'center', alignItems: 'center', marginBottom: 12 }, headerTitle: { fontSize: 22, fontWeight: '800', color: Colors.black, marginBottom: 6 }, headerSubtitle: { fontSize: 14, color: Colors.gray[500], lineHeight: 20 }, card: { flexDirection: 'row', alignItems: 'center', gap: 14, padding: 16, - backgroundColor: Colors.gray[50], borderRadius: 16, marginBottom: 10, - borderWidth: 1, borderColor: Colors.gray[100], + backgroundColor: Colors.white, borderRadius: 4, marginBottom: 10, + borderWidth: 1, borderColor: Colors.gray[200], }, - cardIcon: { width: 44, height: 44, borderRadius: 12, backgroundColor: '#FEE2E2', justifyContent: 'center', alignItems: 'center' }, + cardIcon: { width: 44, height: 44, borderRadius: 4, backgroundColor: Colors.errorBg, justifyContent: 'center', alignItems: 'center' }, cardContent: { flex: 1 }, cardName: { fontSize: 14, fontWeight: '700', color: Colors.black, marginBottom: 2 }, - cardNumber: { fontSize: 20, fontWeight: '800', color: '#DC2626', marginBottom: 6 }, + cardNumber: { fontSize: 20, fontWeight: '800', color: Colors.error, marginBottom: 6 }, cardDescription: { fontSize: 12, color: Colors.gray[500], lineHeight: 17 }, - cardAvailability: { fontSize: 11, color: Colors.secondary, marginTop: 4, fontWeight: '600' }, - warning: { marginTop: 8, padding: 14, borderRadius: 12, backgroundColor: '#FEF2F2', borderWidth: 1, borderColor: '#FECACA', flexDirection: 'row', gap: 10, alignItems: 'flex-start' }, - warningText: { flex: 1, fontSize: 13, color: '#B91C1C', lineHeight: 19 }, + cardAvailability: { fontSize: 11, color: Colors.primary, marginTop: 4, fontWeight: '600' }, + warning: { marginTop: 8, padding: 14, borderRadius: 4, backgroundColor: Colors.errorBg, borderWidth: 1, borderColor: Colors.error, flexDirection: 'row', gap: 10, alignItems: 'flex-start' }, + warningText: { flex: 1, fontSize: 13, color: Colors.error, lineHeight: 19 }, bold: { fontWeight: '800' }, }); diff --git a/mobile/app/_layout.tsx b/mobile/app/_layout.tsx index 021a13b..862f1f7 100644 --- a/mobile/app/_layout.tsx +++ b/mobile/app/_layout.tsx @@ -33,7 +33,7 @@ function AuthGuard({ children }: { children: React.ReactNode }) { if (isLoading) { return ( - + ); } diff --git a/mobile/app/auth/forgot-password.tsx b/mobile/app/auth/forgot-password.tsx index be66107..36aad47 100644 --- a/mobile/app/auth/forgot-password.tsx +++ b/mobile/app/auth/forgot-password.tsx @@ -30,7 +30,7 @@ export default function ForgotPasswordScreen() { - + Demande enregistrée @@ -95,17 +95,17 @@ const styles = StyleSheet.create({ header: { alignItems: 'center', marginBottom: 32 }, logo: { fontSize: 26, fontWeight: '800', color: Colors.black, textAlign: 'center' }, subtitle: { fontSize: 14, color: Colors.gray[500], marginTop: 10, textAlign: 'center', lineHeight: 20 }, - form: { backgroundColor: Colors.gray[50], borderRadius: 24, padding: 24 }, + form: { backgroundColor: Colors.gray[50], borderRadius: 4, padding: 24, borderWidth: 1, borderColor: Colors.gray[200] }, inputGroup: { marginBottom: 16 }, - label: { fontSize: 14, fontWeight: '600', color: Colors.gray[700], marginBottom: 6 }, - input: { backgroundColor: Colors.white, borderWidth: 1, borderColor: Colors.gray[300], borderRadius: 12, paddingHorizontal: 16, paddingVertical: 14, fontSize: 16, color: Colors.black }, - errorText: { color: '#DC2626', marginTop: 6, fontSize: 12 }, - button: { backgroundColor: Colors.primary, borderRadius: 12, paddingVertical: 16, alignItems: 'center', marginTop: 8 }, - buttonText: { fontSize: 16, fontWeight: '700', color: Colors.black }, + label: { fontSize: 14, fontWeight: '600', color: Colors.black, marginBottom: 6 }, + input: { backgroundColor: Colors.gray[100], borderTopLeftRadius: 4, borderTopRightRadius: 4, borderBottomWidth: 2, borderBottomColor: Colors.black, paddingHorizontal: 16, paddingVertical: 14, fontSize: 16, color: Colors.black }, + errorText: { color: Colors.error, marginTop: 6, fontSize: 12 }, + button: { backgroundColor: Colors.primary, borderRadius: 4, paddingVertical: 16, alignItems: 'center', marginTop: 8 }, + buttonText: { fontSize: 16, fontWeight: '700', color: Colors.white }, footer: { alignItems: 'center', marginTop: 20 }, - link: { color: Colors.secondary, fontSize: 14, fontWeight: '600' }, + link: { color: Colors.primary, fontSize: 14, fontWeight: '600', textDecorationLine: 'underline' }, success: { padding: 24, alignItems: 'center', flex: 1, justifyContent: 'center' }, - successIcon: { width: 72, height: 72, borderRadius: 999, backgroundColor: `${Colors.secondary}15`, justifyContent: 'center', alignItems: 'center', marginBottom: 20 }, + successIcon: { width: 72, height: 72, borderRadius: 999, backgroundColor: `${Colors.primary}15`, justifyContent: 'center', alignItems: 'center', marginBottom: 20 }, successTitle: { fontSize: 22, fontWeight: '800', color: Colors.black, marginBottom: 12 }, successText: { fontSize: 14, color: Colors.gray[600], textAlign: 'center', lineHeight: 20, marginBottom: 12 }, bold: { fontWeight: '700', color: Colors.black }, diff --git a/mobile/app/auth/login.tsx b/mobile/app/auth/login.tsx index 00f3ce6..8d64c70 100644 --- a/mobile/app/auth/login.tsx +++ b/mobile/app/auth/login.tsx @@ -4,6 +4,7 @@ import { Link, useRouter } from 'expo-router'; import { useAuthStore } from '@/lib/auth-store'; import { getApiError } from '@/lib/api'; import { Colors } from '@/lib/colors'; +import RepubliqueHeader from '@/components/RepubliqueHeader'; export default function LoginScreen() { const router = useRouter(); @@ -30,6 +31,7 @@ export default function LoginScreen() { return ( + CESIZen @@ -95,17 +97,18 @@ const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: Colors.white }, scrollContent: { flexGrow: 1, justifyContent: 'center', padding: 24 }, header: { alignItems: 'center', marginBottom: 40 }, - logo: { fontSize: 36, fontWeight: '800', color: Colors.black }, + logo: { fontSize: 36, fontWeight: '800', color: Colors.primary }, subtitle: { fontSize: 16, color: Colors.gray[500], marginTop: 8 }, - form: { backgroundColor: Colors.gray[50], borderRadius: 24, padding: 24 }, + form: { backgroundColor: Colors.gray[50], borderRadius: 4, padding: 24, borderWidth: 1, borderColor: Colors.gray[200] }, title: { fontSize: 24, fontWeight: '700', color: Colors.black, marginBottom: 24 }, inputGroup: { marginBottom: 16 }, - label: { fontSize: 14, fontWeight: '600', color: Colors.gray[700], marginBottom: 6 }, + label: { fontSize: 14, fontWeight: '600', color: Colors.black, marginBottom: 6 }, input: { - backgroundColor: Colors.white, - borderWidth: 1, - borderColor: Colors.gray[300], - borderRadius: 12, + backgroundColor: Colors.gray[100], + borderTopLeftRadius: 4, + borderTopRightRadius: 4, + borderBottomWidth: 2, + borderBottomColor: Colors.black, paddingHorizontal: 16, paddingVertical: 14, fontSize: 16, @@ -113,15 +116,15 @@ const styles = StyleSheet.create({ }, button: { backgroundColor: Colors.primary, - borderRadius: 12, + borderRadius: 4, paddingVertical: 16, alignItems: 'center', marginTop: 8, }, buttonDisabled: { opacity: 0.6 }, - buttonText: { fontSize: 16, fontWeight: '700', color: Colors.black }, + buttonText: { fontSize: 16, fontWeight: '700', color: Colors.white }, forgotLink: { alignItems: 'center', marginTop: 12 }, footer: { flexDirection: 'row', justifyContent: 'center', marginTop: 16 }, footerText: { color: Colors.gray[500], fontSize: 14 }, - link: { color: Colors.secondary, fontSize: 14, fontWeight: '600' }, + link: { color: Colors.primary, fontSize: 14, fontWeight: '600', textDecorationLine: 'underline' }, }); diff --git a/mobile/app/auth/register.tsx b/mobile/app/auth/register.tsx index 87a19e7..137ed19 100644 --- a/mobile/app/auth/register.tsx +++ b/mobile/app/auth/register.tsx @@ -5,6 +5,7 @@ import { Ionicons } from '@expo/vector-icons'; import { useAuthStore } from '@/lib/auth-store'; import { getApiError } from '@/lib/api'; import { Colors } from '@/lib/colors'; +import RepubliqueHeader from '@/components/RepubliqueHeader'; const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; @@ -61,6 +62,7 @@ export default function RegisterScreen() { return ( + CESIZen @@ -132,24 +134,24 @@ const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: Colors.white }, scrollContent: { flexGrow: 1, justifyContent: 'center', padding: 24 }, header: { alignItems: 'center', marginBottom: 32 }, - logo: { fontSize: 36, fontWeight: '800', color: Colors.black }, + logo: { fontSize: 36, fontWeight: '800', color: Colors.primary }, subtitle: { fontSize: 16, color: Colors.gray[500], marginTop: 8 }, - form: { backgroundColor: Colors.gray[50], borderRadius: 24, padding: 24 }, + form: { backgroundColor: Colors.gray[50], borderRadius: 4, padding: 24, borderWidth: 1, borderColor: Colors.gray[200] }, title: { fontSize: 24, fontWeight: '700', color: Colors.black, marginBottom: 24 }, row: { flexDirection: 'row' }, inputGroup: { marginBottom: 16 }, - label: { fontSize: 14, fontWeight: '600', color: Colors.gray[700], marginBottom: 6 }, - input: { backgroundColor: Colors.white, borderWidth: 1, borderColor: Colors.gray[300], borderRadius: 12, paddingHorizontal: 16, paddingVertical: 14, fontSize: 16, color: Colors.black }, - errorText: { color: '#DC2626', marginTop: 4, fontSize: 12 }, + label: { fontSize: 14, fontWeight: '600', color: Colors.black, marginBottom: 6 }, + input: { backgroundColor: Colors.gray[100], borderTopLeftRadius: 4, borderTopRightRadius: 4, borderBottomWidth: 2, borderBottomColor: Colors.black, paddingHorizontal: 16, paddingVertical: 14, fontSize: 16, color: Colors.black }, + errorText: { color: Colors.error, marginTop: 4, fontSize: 12 }, consentRow: { flexDirection: 'row', alignItems: 'flex-start', gap: 10, marginVertical: 12 }, - checkbox: { width: 22, height: 22, borderRadius: 6, borderWidth: 2, borderColor: Colors.gray[300], backgroundColor: Colors.white, justifyContent: 'center', alignItems: 'center', marginTop: 1 }, - checkboxChecked: { backgroundColor: Colors.secondary, borderColor: Colors.secondary }, - consentText: { flex: 1, fontSize: 13, color: Colors.gray[700], lineHeight: 18 }, - consentLink: { color: Colors.secondary, fontWeight: '600' }, - button: { backgroundColor: Colors.primary, borderRadius: 12, paddingVertical: 16, alignItems: 'center', marginTop: 12 }, + checkbox: { width: 22, height: 22, borderRadius: 4, borderWidth: 2, borderColor: Colors.black, backgroundColor: Colors.white, justifyContent: 'center', alignItems: 'center', marginTop: 1 }, + checkboxChecked: { backgroundColor: Colors.primary, borderColor: Colors.primary }, + consentText: { flex: 1, fontSize: 13, color: Colors.black, lineHeight: 18 }, + consentLink: { color: Colors.primary, fontWeight: '600', textDecorationLine: 'underline' }, + button: { backgroundColor: Colors.primary, borderRadius: 4, paddingVertical: 16, alignItems: 'center', marginTop: 12 }, buttonDisabled: { opacity: 0.6 }, - buttonText: { fontSize: 16, fontWeight: '700', color: Colors.black }, + buttonText: { fontSize: 16, fontWeight: '700', color: Colors.white }, footer: { flexDirection: 'row', justifyContent: 'center', marginTop: 20 }, footerText: { color: Colors.gray[500], fontSize: 14 }, - link: { color: Colors.secondary, fontSize: 14, fontWeight: '600' }, + link: { color: Colors.primary, fontSize: 14, fontWeight: '600', textDecorationLine: 'underline' }, }); diff --git a/mobile/components/EmotionPicker.tsx b/mobile/components/EmotionPicker.tsx index d46ea17..7a071a5 100644 --- a/mobile/components/EmotionPicker.tsx +++ b/mobile/components/EmotionPicker.tsx @@ -87,13 +87,13 @@ export default function EmotionPicker({ value, onChange }: EmotionPickerProps) { const styles = StyleSheet.create({ loading: { padding: 40, alignItems: 'center' }, backBtn: { marginBottom: 12 }, - backText: { fontSize: 14, color: Colors.gray[500] }, + backText: { fontSize: 14, color: Colors.primary, textDecorationLine: 'underline' }, subTitle: { fontSize: 14, color: Colors.gray[600], marginBottom: 12 }, grid: { flexDirection: 'row', flexWrap: 'wrap', gap: 10 }, emotionCard: { width: '30%', - backgroundColor: Colors.gray[50], - borderRadius: 16, + backgroundColor: Colors.white, + borderRadius: 4, padding: 14, alignItems: 'center', gap: 6, @@ -101,6 +101,6 @@ const styles = StyleSheet.create({ borderColor: Colors.gray[200], }, emotionEmoji: { fontSize: 30 }, - emotionName: { fontSize: 12, fontWeight: '600', color: Colors.gray[700], textAlign: 'center' }, + emotionName: { fontSize: 12, fontWeight: '600', color: Colors.black, textAlign: 'center' }, arrow: { fontSize: 10, color: Colors.gray[400] }, }); diff --git a/mobile/components/RepubliqueHeader.tsx b/mobile/components/RepubliqueHeader.tsx new file mode 100644 index 0000000..89075c8 --- /dev/null +++ b/mobile/components/RepubliqueHeader.tsx @@ -0,0 +1,52 @@ +import { View, Text, StyleSheet } from 'react-native'; +import { Colors } from '@/lib/colors'; + +interface RepubliqueHeaderProps { + /** Affiche le nom du service (CESIZen) à côté du bloc Marianne. */ + showService?: boolean; +} + +/** + * En-tête institutionnel reprenant l'identité visuelle de l'État (DSFR) : + * bloc « RÉPUBLIQUE / FRANÇAISE » accompagné du nom du service. + */ +export default function RepubliqueHeader({ showService = true }: RepubliqueHeaderProps) { + return ( + + + RÉPUBLIQUE + FRANÇAISE + Liberté{'\n'}Égalité{'\n'}Fraternité + + {showService && ( + + CESIZen + Santé mentale + + )} + + ); +} + +const styles = StyleSheet.create({ + container: { + flexDirection: 'row', + alignItems: 'center', + paddingHorizontal: 16, + paddingVertical: 12, + backgroundColor: Colors.white, + borderBottomWidth: 1, + borderBottomColor: Colors.gray[200], + }, + marianneBlock: { + paddingRight: 16, + borderRightWidth: 1, + borderRightColor: Colors.gray[200], + }, + republique: { fontSize: 12, fontWeight: '700', color: Colors.black, letterSpacing: 0.5, lineHeight: 14 }, + francaise: { fontSize: 12, fontWeight: '700', color: Colors.black, letterSpacing: 0.5, lineHeight: 14 }, + devise: { fontSize: 8, color: Colors.gray[500], marginTop: 4, lineHeight: 10, fontStyle: 'italic' }, + serviceBlock: { paddingLeft: 16 }, + serviceName: { fontSize: 18, fontWeight: '800', color: Colors.primary }, + serviceTagline: { fontSize: 11, color: Colors.gray[500], marginTop: 1 }, +}); diff --git a/mobile/lib/colors.ts b/mobile/lib/colors.ts index a350df7..daa1a9e 100644 --- a/mobile/lib/colors.ts +++ b/mobile/lib/colors.ts @@ -1,22 +1,38 @@ +// Palette inspirée du Système de Design de l'État (DSFR / gouv.fr). +// Le DSFR est un framework web (HTML/CSS) ; ici on en applique uniquement +// l'identité visuelle via les couleurs des StyleSheet React Native. export const Colors = { - primary: '#fce117', - primaryDark: '#e5cc15', - secondary: '#06c656', - secondaryDark: '#05a348', - black: '#000000', + // Bleu France — couleur primaire / actions + primary: '#000091', + primaryDark: '#1212FF', // bleu survol / accent + blueFranceSun: '#6A6AF4', + // Rouge Marianne — accent institutionnel / alertes + secondary: '#000091', // conservé en bleu pour les accents secondaires institutionnels + secondaryDark: '#1212FF', + rougeMarianne: '#E1000F', + black: '#161616', // texte principal DSFR white: '#FFFFFF', + // Échelle de gris DSFR (du plus clair au plus foncé) gray: { - 50: '#f9fafb', - 100: '#f3f4f6', - 200: '#e5e7eb', - 300: '#d1d5db', - 400: '#9ca3af', - 500: '#6b7280', - 600: '#4b5563', - 700: '#374151', - 800: '#1f2937', - 900: '#111827', + 50: '#F6F6F6', // fond alternatif + 100: '#EEEEEE', // gris contrasté + 200: '#DDDDDD', // séparateurs / bordures + 300: '#CECECE', + 400: '#929292', // texte désactivé + 500: '#666666', // texte secondaire / mention + 600: '#3A3A3A', + 700: '#2A2A2A', + 800: '#1F1F1F', + 900: '#161616', }, + // États DSFR + success: '#18753C', + successBg: '#B8FEC9', + error: '#CE0500', + errorBg: '#FFE9E9', + info: '#0063CB', + warning: '#B34000', + // Couleurs par émotion — issues du référentiel, conservées telles quelles emotions: { joie: '#FFD700', colere: '#DC143C',