// 1. IMPORTATIONS DES MODULES ET ASSETS import React, { useState } from 'react'; // Webpack Encore gère l'empreinte de hachage (hash) et le chemin public de l'image de fond import impactBg from '../../img/impact.png'; /** * 2. STRUCTURE DE DONNÉES STATIQUE : DIAPOSITIVES DU CARROUSEL * Externaliser les données hors du composant évite de recréer ce tableau * en mémoire à chaque nouveau cycle de rendu (re-render) du composant. * * Le tableau est structuré sous forme de tableau de diapositives (slides). * SLIDES[0] contient le groupe actif affiché à l'écran. */ const SLIDES = [ [ { value: '3000 +', label: 'personnes accompagnées', size: 'w-16 h-16 sm:w-20 sm:h-20', // Taille standard des pastilles latérales }, { value: '94% - 97%', label: 'de réussites en insertion', size: 'w-24 h-24 sm:w-28 sm:h-28', // Pastille centrale plus imposante pour créer une hiérarchie visuelle }, { value: '20 ANS', label: 'de recherches appliquées', size: 'w-16 h-16 sm:w-20 sm:h-20', // Taille standard }, ], ]; /** * 3. COMPOSANT PRINCIPAL : Impact * Présente la section "NOTRE IMPACT" avec : * - Un arrière-plan immersif en pleine largeur * - 3 indicateurs chiffrés majeurs avec pastilles colorées * - Des contrôles de carrousel (flèches gauche/droite et indicateurs à points) */ export default function Impact() { /** * ÉTAT LOCAL (State) : Indice du point actif de pagination * Initialisé à 2 pour correspondre au point central parmi les 5 points du design Figma. */ const [currentSlide, setCurrentSlide] = useState(2); return ( /* Balise sémantique
: - relative : point d'ancrage pour positionner l'overlay sombre absolu - w-full : occupe toute la largeur de l'écran (full bleed) - py-24 sm:py-32 : padding vertical généreux pour donner de l'espace à la section - px-6 sm:px-12 : padding horizontal adaptatif - bg-cover bg-center : l'image remplit tout l'arrière-plan sans déformation et reste centrée - overflow-hidden : empêche tout débordement lié aux animations de zoom */
{/* CALQUE D'OVERLAY SOMBRE : - absolute inset-0 : couvre 100% de la surface de la section - bg-black/40 : voile noir à 40% d'opacité pour garantir la lisibilité des textes blancs - pointer-events-none : empêche ce filtre de capturer les clics */}
{/* CONTENEUR DE CONTENU : - relative z-10 : positionne le contenu au-dessus du voile sombre - max-w-[1400px] mx-auto : largeur maximale cadrée et centrée - text-center text-white : typographie blanche centrée par défaut */}
{/* ==================================================================== A. EN-TÊTE : SURTITRE & TITRE PRINCIPAL ==================================================================== */} {/* Surtitre en majuscules avec espacement étendu (tracking-wide) */} NOTRE IMPACT {/* Titre descriptif sobre avec marge basse importante avant les chiffres */}

Des résultats concrets et durables

{/* ==================================================================== B. ZONE CENTRALE : FLÈCHE GAUCHE + 3 MÉTRIQUES + FLÈCHE DROITE - flex items-center justify-between : alignement horizontal sur une seule ligne ==================================================================== */}
{/* Bouton de navigation gauche (Précédent) */} {/* Grille des 3 métriques chiffrées : - 1 colonne sur mobile (grid-cols-1) - 3 colonnes à partir des écrans moyens (md:grid-cols-3) - items-end : aligne les éléments par le bas pour absorber la différence de taille du cercle central - flex-1 max-w-4xl mx-auto : occupe l'espace central disponible de façon équilibrée */}
{SLIDES[0].map((item, index) => (
{/* Pastille ronde vert olive (#9da74d) : - Taille dynamique issue de la donnée (item.size) - shadow-[...] : ombre portée sombre accentuant la profondeur - hover:scale-105 : micro-interaction au survol */}
{/* Valeur numérique mise en avant (ex: 3000 +, 94% - 97%) */} {item.value} {/* Libellé descriptif sous le chiffre */} {item.label}
))}
{/* Bouton de navigation droit (Suivant) */}
{/* ==================================================================== C. INDICATEURS DE PAGINATION (CAROUSEL DOTS) - 5 points horizontaux centrés en bas de section ==================================================================== */}
{[0, 1, 2, 3, 4].map((dot) => ( ))}
); }