// sections-soul.jsx — l'âme burkinabé : Héritage, Témoignages, Contraste Avant/Avec. // Ajouté en 2026-05 pour ancrer la landing dans la culture du pays au-delà // du visuel générique africain. Voir Correction en cours.md section 14. const { useState: ssUseState, useEffect: ssUseEffect, useRef: ssUseRef } = React; // ---------- Drapeau du Burkina Faso — bande défilante horizontale infinie ---------- // Le drapeau officiel : 2 bandes horizontales (rouge en haut, vert en bas) // avec une étoile jaune à 5 branches au centre. Reproduit en SVG comme une // banderole de stade qui défile à l'infini de droite à gauche. // // Géométrie d'1 unité de drapeau : 240px × hauteur. Étoile au centre vertical. // On en aligne 8 pour boucler sans couture grâce à translateX(-50%). function FasoDanfani({ height = 36 }) { const parallaxRef = useParallax(0.18); const flagWidth = 240; // Une unité = un drapeau du Burkina avec son étoile centrale const flagUnit = ( {/* Bande rouge supérieure */} {/* Bande verte inférieure */} {/* Étoile jaune à 5 branches, centrée — coordonnées calculées pour que la pointe haute soit à y=8, pointe basse à y=28, centre à y=18 */} {/* Très fine bordure entre rouge et vert pour la lisibilité */} ); // 8 drapeaux côte-à-côte. La track fait 8×240=1920px. On translateX(-50%) // (=-960px=4 drapeaux) pour boucler sur les 4 drapeaux suivants identiques. return (
{flagUnit}{flagUnit}{flagUnit}{flagUnit} {flagUnit}{flagUnit}{flagUnit}{flagUnit}
); } // ---------- HERITAGE — Monument des Héros + citation Sankara ---------- function Heritage({ t }) { // Détection du thème pour basculer la photo jour/nuit du monument const [isLight, setIsLight] = ssUseState(() => typeof document !== "undefined" && document.documentElement.classList.contains("light"), ); ssUseEffect(() => { if (typeof document === "undefined") return; const el = document.documentElement; const obs = new MutationObserver(() => setIsLight(el.classList.contains("light"))); obs.observe(el, { attributes: true, attributeFilter: ["class"] }); return () => obs.disconnect(); }, []); const monumentSrc = isLight ? "assets/monument-day.png" : "assets/monument-night.png"; const monumentParallax = useParallax(0.08); return (
{t.heritage.eyebrow}
{t.heritage.title}

{t.heritage.sub}

Thomas Sankara
{t.heritage.sankaraQuote}
{t.heritage.sankaraAttribution}

{t.heritage.bridgeText}

{t.heritage.monumentLabel}
{t.heritage.monumentLabel} {t.heritage.monumentCity}
); } // Portrait stylisé Sankara — silhouette + béret rouge + écharpe Faso Danfani. // Approche illustrative : honore l'icône sans dépendre d'une photo aux droits // incertains. À remplacer par une vraie photo si l'utilisateur en fournit une. function SankaraPortrait() { return ( {/* Halo doré */} {/* Cou + épaules */} {/* Faso danfani écharpe sur l'épaule */} {/* Visage — silhouette sobre */} {/* Yeux */} {/* Sourcils déterminés */} {/* Nez */} {/* Lèvres */} {/* Béret rouge — signature visuelle de Sankara */} {/* Étoile sur béret — symbole révolutionnaire */} ); } // ---------- VOICES — 3 témoignages humains ---------- function Voices({ t }) { return (
{t.voices.eyebrow}
{t.voices.title}

{t.voices.sub}

{t.voices.list.map((v, i) => (
{v.name.charAt(0)}

{v.name}

{v.role}

{v.quote}
{v.trip} {v.frequency}
))}
); } // ---------- CONTRAST — Avant FasoTravel / Avec FasoTravel ---------- function Contrast({ t }) { return (
{t.contrast.eyebrow}
{t.contrast.title}
{/* AVANT — sombre, douleur */}
{t.contrast.before.label}
    {t.contrast.before.items.map((it, i) => (
  • {it.icon}
    {it.t}
    {it.d}
  • ))}
{/* Connector vertical Faso Danfani au milieu */}
{/* AVEC — clair, solution */}
{t.contrast.with.label}
    {t.contrast.with.items.map((it, i) => (
  • {it.icon}
    {it.t}
    {it.d}
  • ))}
); } Object.assign(window, { Heritage, Voices, Contrast, FasoDanfani, SankaraPortrait });