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',