Aller au contenu principal

Interactions Utilisateurs — UI/UX & Comportement de l'Application

Automobile Business Center — Burkina Faso

Document de référence pour les interactions utilisateurs, les spécifications UI/UX et le comportement attendu de chaque écran de la plateforme.
Dernière mise à jour : février 2026


Table des matières

  1. Principes généraux
  2. Rôles et permissions
  3. Navigation & Header
  4. Page d'accueil (/)
  5. Marketplace / Catalogue (/marketplace)
  6. Recherche avancée (/advanced-search)
  7. Détail d'un véhicule (/vehicle/[id])
  8. Inscription (/register)
  9. Connexion (/login)
  10. Tableau de bord (/dashboard)
  11. Mes annonces (/mes-annonces)
  12. Créer une annonce (/creer-annonce)
  13. Favoris (/favoris)
  14. Mon profil (/profil)
  15. Pages SEO catégories (/voitures/[slug])
  16. Pages statiques
  17. États de chargement & erreurs
  18. Comportement mobile
  19. Système de notifications
  20. Flux de données & séquences

1. Principes généraux

1.1 Design mobile-first

  • +80 % des utilisateurs naviguent sur téléphone au Burkina Faso
  • Taille de touche minimum : 44 × 44 px sur mobile
  • Les images s'adaptent à la largeur de l'écran (responsive)
  • Le menu de navigation se replie en hamburger sous md (768 px)

1.2 Performance

  • Images optimisées, chargement progressif (lazy load)
  • Pages légères — connexion souvent lente en zone sahélienne
  • Squelette de chargement (skeleton) affiché pendant les requêtes réseau

1.3 Langue & localisation

  • Interface entièrement en français
  • Devise : FCFA (XOF) — format 1 500 000 FCFA
  • Villes : liste officielle des villes du Burkina Faso uniquement
  • Numéros de téléphone : préfixe +226 (BF)

1.4 Palette de couleurs et sémantique des badges

CouleurUsageExemple
Accent (orange-rouge)Appels à l'action principaux, prixBouton "Publier", prix en FCFA
Vert #22c55eSuccès, statut "En ligne", vérifiéBadge "En ligne", "Compte vérifié"
Orange #f97316Avertissement, statut "En attente"Badge "En attente de validation"
Rouge #ef4444Erreur, danger, statut "Refusé"Message d'erreur, badge "Refusé"
GrisStatut neutre, "Vendu"Badge "Vendu"
Bleu #3b82f6Information, "Brouillon"Badge "Brouillon"
#25D366 (WhatsApp vert)Bouton WhatsApp uniquementBouton "WhatsApp" sur la fiche véhicule

1.5 Feedback utilisateur

  • Toast / notification : toute action modifiant la base de données → toast succès ou toast erreur (3 secondes)
  • Indicateur de chargement : spinner ou texte "Chargement…" pendant les appels réseau
  • Message vide : illustration + texte explicatif + bouton d'action si une liste est vide
  • Validation inline : les erreurs de formulaire s'affichent sous le champ concerné, en rouge, immédiatement après la perte de focus ou la soumission

2. Rôles et permissions

2.1 Visiteur (non connecté)

ActionAutoriséComportement
Voir la liste des véhiculesAccès libre
Utiliser la rechercheAccès libre
Ouvrir la fiche d'un véhiculeAccès libre
Voir le numéro de téléphone du vendeurAffiché si renseigné
Appeler le vendeurLien tel:
Contacter via WhatsAppLien wa.me/
Envoyer un messageRedirection vers /register avec message "Créez un compte gratuit pour contacter le vendeur"
Ajouter aux favorisRedirection vers /login
Publier une annonceRedirection vers /login ou /sell

2.2 Acheteur (BUYER, connecté)

ActionAutorisé
Toutes les actions visiteur
Ajouter / retirer des favoris
Envoyer un message à un vendeur
Gérer son profil
Créer une annonce❌ (doit changer de rôle vers SELLER)

2.3 Vendeur particulier (SELLER)

ActionAutorisé
Toutes les actions Acheteur
Créer une annonce (max 2 gratuites)
Modifier / supprimer ses annonces
Ajouter jusqu'à 10 photos par annonce
Marquer une annonce "Vendu"
Voir les stats de ses annonces (vues, clics WhatsApp)

2.4 Revendeur (RESELLER) / Importateur (IMPORTER)

ActionAutorisé
Toutes les actions Vendeur
Nombre d'annonces élevé (selon abonnement)
Page boutique (à venir)🔜

2.5 Concessionnaire (DEALER)

ActionAutorisé
Toutes les actions Revendeur
Profil de concessionnaire vérifié (badge)✅ (après validation admin)
Page boutique avec logo et description

2.6 Administrateur (admin panel)

ActionAutorisé
Valider / refuser les annonces
Supprimer les annonces frauduleuses
Bloquer des utilisateurs
Gérer les mises en avant
Voir les statistiques globales

3. Navigation & Header

3.1 Structure du header (desktop, ≥ 768 px)

[Logo + "Automobile Business Center"]   [Acheter] [Vendre] [Revendeurs] [Recherche avancée]   [♡] [+ Publier] [Mes annonces] [Mon compte ▼] [Déconnexion]
↑ Caché si non connecté ↑ Visible si connecté

Si non connecté :

[Logo]   [Acheter] [Vendre] [Revendeurs] [Recherche avancée]   [Connexion] [Inscription]

3.2 Menu mobile (hamburger, < 768 px)

  • Clic sur → tiroir vertical qui s'ouvre sous le header
  • Liste des liens avec séparation visuelle entre navigation publique et espace personnel
  • Clic sur un lien → ferme le menu et navigue

Contenu du menu mobile si connecté :

Acheter
Vendre
Revendeurs
Recherche avancée
──────────────
Mes favoris
Mes annonces
Mon profil
Tableau de bord
──────────────
Déconnexion

3.3 Comportement du lien actif

  • Le lien correspondant à la page courante s'affiche avec la couleur accent + font-medium
  • Déterminé par usePathname() comparé au href de chaque lien

3.4 Bouton "Publier" (header)

  • Bouton accent visible uniquement si connecté
  • Clic → /creer-annonce
  • Si non connecté, ce bouton est remplacé par "Connexion" / "Inscription"

3.5 Déconnexion

  • Clic "Déconnexion" → supabase.auth.signOut()setUser(null) → l'interface repasse en mode visiteur sans rechargement de page

4. Page d'accueil (/)

4.1 Layout général

┌─────────────────────────────────────┐
│ HEADER │
├─────────────────────────────────────┤
│ HERO — Titre + Barre de recherche │
│ Recherches populaires │
├─────────────────────────────────────┤
│ DERNIÈRES ANNONCES (4 cartes) │
│ [Voir tout le catalogue →] │
├─────────────────────────────────────┤
│ POURQUOI NOUS CHOISIR (4 cartes) │
├─────────────────────────────────────┤
│ COMMENT ÇA MARCHE (3 étapes) │
├─────────────────────────────────────┤
│ CTA — "Prêt à trouver votre voiture?"│
├─────────────────────────────────────┤
│ STATS (annonces, vendeurs, etc.) │
├─────────────────────────────────────┤
│ FOOTER │
└─────────────────────────────────────┘

4.2 Hero & Barre de recherche rapide

Composant : LandingSearchBar

  • Champ texte libre : "Rechercher une marque, modèle…"
  • Bouton "Rechercher" → soumet le formulaire vers /marketplace?search=<valeur>
  • Autocomplete (SearchAutocomplete) : après 2 caractères saisis, suggestions dynamiques apparaissent en dropdown
  • Clic sur une suggestion → navigation directe vers /marketplace?search=<suggestion>
  • Touche Escape → ferme le dropdown

Recherches populaires :

  • Boutons pill cliquables : "Toyota Prado", "Toyota Hilux", "Mercedes Classe C", "BMW Série 3"
  • Clic → soumet vers /marketplace?search=<terme>

4.3 Section "Dernières annonces"

  • 4 cartes véhicules les plus récents (status = PUBLISHED)
  • Chaque carte est un lien vers /vehicle/<id>
  • Survol → légère mise à l'échelle de l'image (scale-110)
  • Badge prix en haut à droite de l'image
  • Si aucune annonce publiée : section masquée
  • Bouton "Parcourir les annonces" → /marketplace
  • Bouton "Vendre ma voiture" → /sell

5. Marketplace / Catalogue (/marketplace)

5.1 Layout

┌──────────────────────────────────────────┐
│ HEADER │
├──────────────────────────────────────────┤
│ HERO │
│ "Trouvez votre prochaine voiture" │
│ [Barre de recherche texte] [Filtres ▼] │
│ Panneau de filtres rapides (si ouvert) │
├──────────────────────────────────────────┤
│ N véhicule(s) trouvé(s) [Trier par ▼]│
├──────────────────────────────────────────┤
│ GRILLE 4 colonnes (lg), 2 (md), 1 (sm) │
│ [Card] [Card] [Card] [Card] │
│ [Card] [Card] [Card] [Card] │
│ … │
└──────────────────────────────────────────┘

5.2 Barre de recherche

  • Saisie en temps réel → filtre la liste côté client (sans rechargement)
  • Touche Enter ou bouton "Rechercher" → idem
  • Icône loupe à gauche du champ

5.3 Panneau de filtres rapides

Déclenché par le bouton ⚙ Filtres ▼ :

FiltreTypeValeurs
PrixSelectTranches en FCFA (< 1 M, 1–3 M, 3–5 M, 5–10 M, > 10 M)
CarburantSelectEssence, Diesel, Électrique, Hybride, GPL
VilleSelect16 villes du Burkina Faso
MarqueSelectListe des marques (MAKES_MODELS)
Année min/maxSelect1900–2027
Trier parSelectPlus récentes, Prix ↑, Prix ↓, Kilométrage ↑, Année ↓
  • Fermeture du panneau : re-clic sur le bouton "Filtres" (chevron bascule)
  • Bouton "Réinitialiser les filtres" : remet tous les filtres à leur valeur par défaut

5.4 Carte véhicule

┌──────────────────────────────────┐
│ [IMAGE 16:10] │
│ [Badge : En ligne 🟢] [♡ Favori]│
├──────────────────────────────────┤
│ Titre du véhicule │
│ Année · Transmission · Carburant │
│ Kilométrage │
│ ─────────────────────────────── │
│ PRIX (FCFA) Vendeur [✓] │
└──────────────────────────────────┘

Interactions sur la carte :

ÉlémentActionRésultat
Image ou titreClicNavigation vers /vehicle/<id>
Bouton ♡ FavoriClic (connecté)Ajout/retrait de favoris, cœur plein/vide
Bouton ♡ FavoriClic (non connecté)Toast : "Connectez-vous pour sauvegarder des favoris"
Badge "En ligne"Indicateur visuel uniquement
Badge "Vendu"Carte légèrement grisée

Image manquante : placeholder texte "PAS D'IMAGE" sur fond gris

5.5 Filtre par concessionnaire

Si ?dealerId=<id> est présent dans l'URL :

  • Badge "Annonces de : <Nom concessionnaire>" affiché
  • Lien "Voir toutes les annonces" → /marketplace (sans dealerId)

5.6 État vide

"Aucun véhicule trouvé"
[Réinitialiser les filtres]

6.1 Layout

┌─────────────────────────────────────────────────────┐
│ HEADER │
├──────────────────────┬──────────────────────────────┤
│ SIDEBAR FILTRES │ RÉSULTATS │
│ (collapsible mobile) │ N véhicule(s) trouvé(s) │
│ │ [Grille de cartes] │
│ [Réinitialiser] │ │
└──────────────────────┴──────────────────────────────┘

Sur mobile : la sidebar passe au-dessus des résultats, avec un bouton ⊞ Filtres pour l'afficher/masquer.

6.2 Sections de filtres (toutes collapsibles)

Chaque section a un titre cliquable avec icône ▲/▼ :

SectionType de contrôleValeurs
Marque & ModèleSelect Marque → Select Modèle (dynamique)MAKES_MODELS
VillesCheckboxes multi-sélection16 villes BF
Prix (FCFA)Slider double ou inputs min/max0 → 1 000 000 000
AnnéeSlider double1900 → 2027
KilométrageSlider double0 → 500 000 km
CarburantCheckboxesEssence, Diesel, Électrique, Hybride, GPL
TransmissionCheckboxesManuelle, Automatique
CarrosserieCheckboxesBerline, SUV, Pickup, Citadine, Break, Cabriolet, Utilitaire, Autre
Couleur extérieureCheckboxes13 couleurs
Couleur intérieureCheckboxes12 couleurs
SellerieCheckboxesCuir, Alcantara, Tissu
TractionCheckboxesPropulsion, 4×4, Traction avant, Transmission intégrale
OptionsCheckboxes groupées46 options (confort, multimédia, sécurité, extérieur)
Options admin.Checkboxes10 options (dédouané, carte grise, importé…)
Nombre de placesCheckboxes2, 4, 5, 7
Type de vendeurCheckboxesParticulier, Concessionnaire, Revendeur, Importateur
PhotosToggle Switch"Uniquement avec photos"
PromotionsToggle Switch"Uniquement en promotion"

6.3 Comportement des filtres

  • Filtrage en temps réel côté client sur les données déjà chargées
  • Modèle : la liste de modèles se met à jour dynamiquement lorsqu'une marque est sélectionnée. Si la marque est changée, le modèle sélectionné est réinitialisé.
  • Sliders (Radix UI Slider) :
    • Affichage de la valeur actuelle sous le slider
    • Prix formaté en FCFA
    • Kilométrage formaté avec séparateur de milliers + "km"
  • "Réinitialiser les filtres" : bouton en bas de la sidebar → tous les filtres reviennent aux valeurs par défaut

6.4 Affichage du compteur de résultats

  • En tête de la zone de résultats : **N** véhicule(s) trouvé(s)
  • Le nombre se met à jour en temps réel sans rechargement

7. Détail d'un véhicule (/vehicle/[id])

7.1 Layout

┌──────────────────────────────────────────────────┐
│ HEADER │
├──────────────────────────────────────────────────┤
│ ← Retour aux annonces │
├──────────────────────────┬───────────────────────┤
│ COL GAUCHE (lg:2/3) │ COL DROITE (lg:1/3) │
│ │ [Sticky top-24] │
│ [Galerie photos] │ Titre + Prix FCFA │
│ [Thumbnails] │ [Appeler] [WhatsApp] │
│ │ [♡] [Share] │
│ [Caractéristiques] │ ───────────────── │
│ [Équipements] │ Vendeur │
│ [Description] │ (info + badges) │
│ │ [Envoyer un message] │
└──────────────────────────┴───────────────────────┘

7.2 Galerie photos

InteractionComportement
Flèche gauche Affiche l'image précédente (cyclique)
Flèche droite Affiche l'image suivante (cyclique)
Clic sur une miniatureAffiche la photo correspondante dans la vue principale
Miniature activeBordure de couleur accent (2 px)
CompteurX / N affiché en bas au centre de l'image principale
Aucune imageTexte "Aucune image disponible" sur fond gris

7.3 Boutons de contact

Bouton "Appeler"

  • Style : bouton plein couleur accent
  • Action : href="tel:<numéro>" → ouvre le numéroteur du téléphone
  • Affiché uniquement si le vendeur a renseigné un numéro

Bouton "WhatsApp"

  • Style : bouton vert #25D366, icône MessageCircle
  • Action : href="https://wa.me/<numéro>?text=<message_encodé>"
  • Message pré-rempli : "Bonjour, je suis intéressé par votre annonce: <titre> sur Automobile Business Center"
  • target="_blank" + rel="noopener noreferrer"
  • Affiché uniquement si le vendeur a renseigné un numéro

Bouton "♡ Favori"

  • Icône cœur (vide/plein selon état)
  • Connecté : toggle favori
  • Non connecté : redirection vers /login

Bouton "Share"

  • Icône Share2
  • Comportement à venir (futur : navigator.share() ou copier le lien)

7.4 Section "Vendeur"

Concessionnaire vérifié :

[Logo]  Nom du concessionnaire
[Badge "Revendeur vérifié" — couleur accent]
Adresse, Ville

Particulier vérifié :

[Avatar initiale]  Nom complet
[Badge "Compte vérifié" — vert]

Informations de contact (si renseignées) :

  • 📞 Numéro de téléphone
  • ✉️ Adresse email

7.5 Section "Caractéristiques"

Grille 2 colonnes avec icône + label + valeur :

ChampIcône
Marque & Modèle🚗
Année📅
Kilométrage🔢
Carburant
Transmission📄
Carrosserie🚗
Couleur🎨
VIN📄
Ville📍

7.6 Section "Équipements"

  • Liste des options (issues du champ features[]) en grille 3 colonnes
  • Chaque option précédée d'un ✓ accent

7.7 Section "Description"

  • Texte libre du vendeur
  • whitespace-pre-line pour respecter les sauts de ligne

8. Inscription (/register)

8.1 Champs communs à tous les types

ChampTypeRequisRègle
PrénomTexte
NomTexte
EmailEmailFormat email valide
Mot de passePassword≥ 6 caractères
Confirmer mot de passePassword= mot de passe
Type de compteRadio5 choix (voir ci-dessous)
VilleSelect16 villes BF

8.2 Types de comptes et champs conditionnels

Acheteur (BUYER)

Aucun champ supplémentaire.

Vendeur particulier (SELLER)

ChampTypeRequis
TéléphoneTel
Type de pièce d'identitéSelect
Copie de la pièce d'identitéFile (image/pdf)

Revendeur (RESELLER) / Importateur (IMPORTER)

ChampTypeRequis
Nom de l'entrepriseTexte
TéléphoneTel
Date de début d'activitéDate
Type de pièce d'identitéSelect
Copie de la pièce d'identitéFile

Concessionnaire certifié (DEALER)

ChampTypeRequis
Nom du concessionnaireTexte
Numéro RCBTexte
Site webURL
TéléphoneTel
Date de début d'activitéDate
AdresseTexte
Type de pièce d'identitéSelect
Copie de la pièce d'identitéFile

Types de pièces d'identité : CNIB, Acte de naissance, Permis de conduire, Passeport

8.3 Affichage conditionnel

  • Les champs supplémentaires s'affichent immédiatement lorsque le type de compte correspondant est sélectionné (pas de rechargement de page)
  • Animation : apparition fluide (transition CSS)

8.4 Validation du formulaire

CasComportement
Mot de passe < 6 caractèresMessage d'erreur sous le champ, soumission bloquée
Mots de passe différentsMessage d'erreur "Les mots de passe ne correspondent pas"
Email déjà utiliséMessage d'erreur Supabase affiché
Champs requis videsMise en évidence rouge du champ, soumission bloquée

8.5 Après l'inscription (succès)

  1. Affichage d'un écran de succès avec icône ✓ verte
  2. Message : "Votre compte a été créé avec succès ! Veuillez vérifier votre email pour confirmer votre inscription."
  3. Redirection automatique vers /login après 3 secondes

8.6 Lien vers la connexion

En bas du formulaire : "Déjà un compte ? Connectez-vous" → /login


9. Connexion (/login)

9.1 Champs

ChampTypeRequis
EmailEmail
Mot de passePassword

9.2 Soumission

  1. Appel supabase.auth.signInWithPassword()
  2. Succès → redirection vers /marketplace + router.refresh()
  3. Échec → message d'erreur affiché en haut du formulaire

9.3 Lien

  • "Pas encore de compte ? Inscrivez-vous" → /register

10. Tableau de bord (/dashboard)

Accès requis : utilisateur connecté. Si non connecté → redirection vers /login.

10.1 Chargement

Le serveur :

  1. Vérifie l'authentification Supabase
  2. Récupère le profil depuis la table users
  3. Affiche "Bonjour, <prénom> 👋" ou <email_prefix> si pas de nom

10.2 Cartes de statistiques

StatistiqueIcôneCouleur
Annonces actives🚗Accent
Vues totales👁Bleu
Favoris reçusRouge
Annonces totales📄Vert

Ces valeurs sont actuellement à 0 (à brancher sur les requêtes réelles).

10.3 Actions rapides (grille 2×2 sur mobile, 4 colonnes sur desktop)

BoutonDestination
Publier une annonce/creer-annonce
Mes annonces/mes-annonces
Mes favoris/favoris
Mon profil/profil

Chaque action : carte cliquable avec icône + texte, bordure accent au survol.

10.4 Activité récente

  • Vide : illustration 🚗 + texte "Aucune activité récente" + bouton "Publier ma première annonce" → /creer-annonce
  • Non vide (futur) : liste chronologique des dernières actions

11. Mes annonces (/mes-annonces)

Accès requis : utilisateur connecté → redirection vers /login sinon.

11.1 En-tête de page

"Mes annonces"    N annonce(s)          [+ Créer une annonce]

11.2 État vide

🚗  "Vous n'avez pas encore d'annonces"
"Publiez votre première annonce et touchez des milliers d'acheteurs"
[Créer ma première annonce]

11.3 Ligne d'annonce

┌───────────────────────────────────────────────────────┐
│ [Miniature 96×80] │ Titre [Badge statut] │
│ │ PRIX FCFA │
│ │ Marque Modèle · Année · km │
│ │ [Voir] [Modifier] [Marquer vendu] [Supprimer] │
└───────────────────────────────────────────────────────┘

11.4 Badges de statut

Statut DBLabel affichéCouleur
PUBLISHEDEn ligneVert
PENDINGEn attenteOrange
REJECTEDRefuséRouge
SOLDVenduGris
DRAFTBrouillonBleu

11.5 Actions sur chaque annonce

BoutonActionVisibilité
Voir/vehicle/<id>Toujours
Modifier/creer-annonce?edit=<id> (à implémenter)Toujours
Marquer venduMet le statut à SOLDSi statut ≠ SOLD
SupprimerSupprime l'annonce (confirmation préalable)Toujours

Confirmation de suppression : dialogue modal "Êtes-vous sûr de vouloir supprimer cette annonce ? Cette action est irréversible." avec boutons "Annuler" et "Supprimer".


12. Créer une annonce (/creer-annonce)

Accès requis : utilisateur connecté. Si non connecté → redirection vers /login.

12.1 Indicateur de progression (step stepper)

① Informations véhicule → ② Détails & options → ③ Photos → ④ Contact → ⑤ Récapitulatif
  • Étape complétée : cercle vert avec ✓
  • Étape active : cercle couleur accent + texte en gras
  • Étape future : cercle gris
  • Sur mobile : seules les icônes sont visibles (labels masqués sous md)

12.2 Étape 1 — Informations véhicule

ChampTypeRequis
MarqueSelect (MAKES_MODELS)
ModèleSelect (dynamique selon marque)
AnnéeSelect (2026 → 1900)
KilométrageNombre
CarburantSelect
TransmissionSelect
CarrosserieSelect
Couleur extérieureSelect (EXTERIOR_COLORS)
Nombre de portesSelect (2/3/4/5)
Nombre de placesSelect (2/4/5/7)

Comportement :

  • La sélection de la Marque réinitialise le Modèle et met à jour dynamiquement sa liste
  • Si le Modèle est désactivé tant que la Marque n'est pas sélectionnée

12.3 Étape 2 — Détails & options

ChampTypeRequis
Titre de l'annonceTexte (max 100 car.)
Prix (FCFA)Nombre (max 1 000 000 000)
VilleSelect (BURKINA_CITIES)
Prix négociableCheckbox
DescriptionTextarea (max 2 000 car.)
Options du véhiculeCheckboxes groupées
Options administrativesCheckboxes

Bouton "Générer automatiquement" (titre) :

  • Cliquable uniquement si Marque, Modèle, Année et Ville sont renseignés
  • Génère le titre : "<Marque> <Modèle> <Année> - <Ville>"

Compteur de caractères :

  • Description : compteur en temps réel N/2000 en bas à droite de la textarea

12.4 Étape 3 — Photos

  • Zone de dépôt cliquable (<label> + <input type="file" hidden>)
  • Accepte : image/*, multiple, max 10 photos
  • Prévisualisation en grille 3 colonnes
  • Badge "Principal" sur la première photo (photo de couverture)
  • Bouton ✕ sur chaque miniature (survol) → supprime la photo
  • Désactivé si 10 photos déjà ajoutées
  • Pas de restriction minimale (photos recommandées min. 3)

12.5 Étape 4 — Contact

ChampTypeRequis
Numéro de téléphoneTel
Numéro WhatsAppTel— (si vide = même que téléphone)
Email de contactEmail

12.6 Étape 5 — Récapitulatif

  • Affichage en tableau de toutes les informations saisies
  • Nombre de photos
  • Liste des options sélectionnées (badges)
  • Bandeau orange : "Votre annonce sera vérifiée par notre équipe avant publication (généralement sous 24h)."
  • Bouton "Publier l'annonce" → soumet vers Supabase avec status: "PENDING"
  • Après succès → redirection vers /mes-annonces

12.7 Navigation entre étapes

BoutonAction
SuivantValide l'étape courante. Si erreur → message rouge + scroll vers l'erreur. Sinon passe à l'étape suivante.
PrécédentRetour à l'étape précédente sans validation
Publier l'annonce (étape 5)Valide + soumet tout le formulaire

13. Favoris (/favoris)

Accès requis : utilisateur connecté → /login sinon.

13.1 État vide

♥  "Vous n'avez pas encore de favoris"
"Parcourez nos annonces et ajoutez vos véhicules préférés"
[Parcourir les annonces]

13.2 Grille de véhicules favoris

Même design que la marketplace (cartes 16:10) avec :

  • Icône ♥ rouge plein en haut à droite
  • Lien vers /vehicle/<id>

13.3 Suppression d'un favori

  • Futur : bouton ✕ sur la carte ou bouton "Retirer des favoris"
  • Feedback immédiat : disparition de la carte + toast "Retiré des favoris"

14. Mon profil (/profil)

Accès requis : utilisateur connecté.
Le chargement initial est côté client avec useEffect.

14.1 Carte "Informations du compte" (lecture seule)

[Avatar/initiale]  Nom complet ou email
email@exemple.com
[Badge type de compte] [Badge "Vérifié" si applicable]

14.2 Formulaire de modification

ChampTypePré-rempli
Nom completTexteOui (depuis users.full_name)
TéléphoneTelOui
VilleSelect (BURKINA_CITIES)Oui
URL de l'avatarURLOui

Soumission :

  1. Mise à jour dans supabase.from("users").update(...)
  2. Succès → bandeau vert "Profil mis à jour avec succès" (dans le formulaire)
  3. Erreur → bandeau rouge avec le message d'erreur

Le type de compte (BUYER/SELLER/DEALER…) n'est pas modifiable depuis cette page.


15. Pages SEO catégories (/voitures/[slug])

15.1 Résolution du slug

Type de slugExempleComportement
Ville BF (slugifié)ouagadougouFiltre city = "Ouagadougou"
Marque (slugifiée)toyotaFiltre make = "Toyota"
Non reconnuxyzAffiche "Voitures au Burkina Faso" sans filtre

Exemple de slugification : "Bobo-Dioulasso""bobo-dioulasso"

15.2 Metadata SEO dynamique

  • Ville : "Voitures à Ouagadougou - Automobile Business Center"
  • Marque : "Toyota au Burkina Faso - Automobile Business Center"
  • Description : inclut le nombre de résultats trouvés

15.3 Grille de résultats

Identique à la marketplace (cartes 16:10). Si vide : lien "Voir toutes les annonces" → /marketplace.


16. Pages statiques

PageURLContenu
À propos/aboutPrésentation de la plateforme
Contact/contactFormulaire de contact
Aide/helpFAQ et support
Mentions légales/legalCGU, confidentialité
Revendeurs/dealersListe des concessionnaires
Vendre/sellPrésentation des offres vendeurs

16.1 Page Vendre (/sell)

Si connecté :

[Commencer maintenant] → /creer-annonce

Si non connecté :

"Vous devez vous connecter pour publier une annonce"
[Se connecter] [Créer un compte]

17. États de chargement & erreurs

17.1 Loading global

Fichier app/loading.tsx — affiché automatiquement par Next.js lors des transitions de page :

  • Spinner centré ou skeleton de la page

17.2 Squelette (Skeleton) — à implémenter

Pour les listes de véhicules : afficher 8 cartes skeleton bg-muted animate-pulse pendant le chargement.

17.3 Page 404

not-found() de Next.js — déclenché si un véhicule n'existe pas dans la base.

17.4 Erreurs API / Supabase

  • Si la base de données est inaccessible → liste vide + message discret
  • Si une action échoue → toast rouge : "Une erreur est survenue. Réessayez."
  • Les erreurs techniques ne sont jamais affichées brutes à l'utilisateur

17.5 Messages d'erreur de formulaire

[Champ texte avec bordure rouge]
⚠ Message d'erreur explicite en dessous

18. Comportement mobile

18.1 Header

  • Logo tronqué sur petits écrans : "ABC" ou icône seule (< 480 px)
  • Menu hamburger remplace la navigation desktop
  • Le menu mobile est un tiroir vertical en position sticky

18.2 Marketplace

  • 1 colonne sur mobile, 2 sur tablette, 3–4 sur desktop
  • Bouton "Filtres" collé en haut (sticky) pour faciliter l'accès

18.3 Détail véhicule

  • Colonne droite (infos vendeur + boutons) passe sous la galerie
  • Boutons "Appeler" et "WhatsApp" : pleine largeur, taille tactile ≥ 48 px

18.4 Créer une annonce

  • Stepper horizontal → scrollable sur mobile
  • Grilles 2 colonnes réduites à 1 colonne si nécessaire
  • Photos : grille 3 colonnes réduite à 2 sur très petits écrans

18.5 Sidebar de filtres (Recherche avancée)

  • Masquée par défaut sur mobile
  • Bouton "Filtres" flottant ou en haut → affiche la sidebar en overlay (fond grisé)
  • Bouton ✕ pour fermer

19. Système de notifications

19.1 Types de notifications (base de données)

TypeDéclencheurMessage exemple
LISTING_APPROVEDAdmin valide une annonce"Votre annonce Toyota Prado a été publiée"
LISTING_REJECTEDAdmin refuse une annonce"Votre annonce a été refusée. Raison : …"
LISTING_EXPIREDDate d'expiration atteinte"Votre annonce a expiré"
LISTING_SOLDVendeur marque vendu"Félicitations pour la vente !"
NEW_MESSAGEAcheteur envoie un message"Nouveau message sur votre annonce"
NEW_REVIEWÉvaluation reçue"Vous avez reçu une évaluation"
SYSTEM_UPDATEAdminInformation système

19.2 Affichage (à implémenter)

  • Cloche 🔔 dans le header avec badge compteur (non lus)
  • Dropdown avec liste des notifications récentes
  • Marquer comme lu au clic

20. Flux de données & séquences

20.1 Flux d'achat d'un visiteur → contact vendeur

Accueil
→ Recherche / Marketplace
→ Fiche véhicule
├── Appeler (tel:) ────────────────────────────────► Appel direct
├── WhatsApp (wa.me/) ─────────────────────────────► WhatsApp
└── Envoyer un message ──► Si non connecté : /register
Si connecté : formulaire message

20.2 Flux de publication d'une annonce (vendeur)

/register (SELLER) → Email de confirmation
→ /login
→ /creer-annonce (5 étapes)
→ Soumission → status: PENDING
→ Admin valide dans le panel admin
→ Notification "LISTING_APPROVED"
→ status: PUBLISHED → visible dans /marketplace

20.3 Flux de mise en avant (monétisation)

Vendeur paie via Orange Money / Moov
→ Envoie preuve à l'admin
→ Admin active "isFeatured: true" dans le panel
→ Annonce apparaît en haut des résultats

20.4 Cycle de vie d'une annonce

DRAFT ──► PENDING ──► PUBLISHED ──► SOLD
└──► REJECTED └──► ARCHIVED

PUBLISHED ──► EXPIRED (si expiresAt atteinte)
PUBLISHED ──► SUSPENDED (si signalement admin)

20.5 Authentification (Supabase Auth)

Inscription ──► Email de confirmation ──► Clic lien (/auth/callback) ──► Connecté
Connexion ─────────────────────────────────────────────────────────────► Connecté
Déconnexion ───────────────────────────────────────────────────────────► Visiteur
Token expiré ──► Refresh token automatique (Supabase SDK)

Annexe A — URLs et routes de l'application

RouteComposantAccès
/app/page.tsxPublic
/marketplaceapp/marketplace/page.tsxPublic
/marketplace?search=<q>Même page, filtre clientPublic
/marketplace?dealerId=<id>Même page, filtre concessionnairePublic
/advanced-searchapp/advanced-search/page.tsxPublic
/vehicle/<id>app/vehicle/[id]/page.tsxPublic
/voitures/<slug>app/voitures/[slug]/page.tsxPublic (SEO)
/loginapp/login/page.tsxPublic
/registerapp/register/page.tsxPublic
/auth/callbackapp/auth/callback/page.tsxPublic
/dashboardapp/dashboard/page.tsx🔒 Connecté
/mes-annoncesapp/mes-annonces/page.tsx🔒 Connecté
/creer-annonceapp/creer-annonce/page.tsx🔒 Connecté
/favorisapp/favoris/page.tsx🔒 Connecté
/profilapp/profil/page.tsx🔒 Connecté
/sellapp/sell/page.tsxPublic
/dealersapp/dealers/page.tsxPublic
/aboutapp/about/page.tsxPublic
/contactapp/contact/page.tsxPublic
/helpapp/help/page.tsxPublic
/legalapp/legal/page.tsxPublic

Annexe B — Données de référence

Villes du Burkina Faso (16)

Ouagadougou, Bobo-Dioulasso, Koudougou, Banfora, Ouahigouya, Kaya, Tenkodogo, Fada N'Gourma, Dedougou, Manga, Ziniaré, Kongoussi, Gaoua, Dori, Titao, Diébougou

Marques disponibles (27)

Acura, Audi, BMW, Cadillac, Chevrolet, Ford, Genesis, GMC, Honda, Hyundai, Infiniti, Jaguar, Jeep, Kia, Land Rover, Lexus, Mazda, Mercedes-Benz, Mitsubishi, Nissan, Peugeot, Porsche, Renault, Suzuki, Toyota, Volkswagen, Volvo

Statuts d'annonce

Valeur DBLibellé FRCouleur
DRAFTBrouillonBleu
PENDINGEn attente de validationOrange
PUBLISHEDEn ligneVert
SOLDVenduGris
REJECTEDRefuséRouge
EXPIREDExpiréGris
SUSPENDEDSuspenduRouge
ARCHIVEDArchivéGris

Types d'utilisateurs

Valeur DBLibellé FR
BUYERAcheteur
SELLERVendeur particulier
DEALERConcessionnaire certifié
RESELLERRevendeur
IMPORTERImportateur

Document généré à partir du code source de la branche copilot/check-features-status.
Automobile Business Center — Burkina Faso — 2026