// sections2.jsx — Map, Operators, Vision, Payments, Stats, FAQ, Contact, CTA, Footer const { useState: s2UseState, useEffect: s2UseEffect, useRef: s2UseRef } = React; // ---------- BURKINA MAP ---------- // Approximate city positions on a stylized map const BF_CITIES = [ { id: "ouaga", name: "Ouagadougou", x: 390, y: 220, major: true }, { id: "bobo", name: "Bobo-Dioulasso", x: 250, y: 285, major: true }, { id: "koudougou", name: "Koudougou", x: 340, y: 225, major: false }, { id: "banfora", name: "Banfora", x: 215, y: 320, major: false }, { id: "ouahigouya", name: "Ouahigouya", x: 310, y: 145, major: false }, { id: "fada", name: "Fada N'Gourma", x: 470, y: 230, major: false }, { id: "kaya", name: "Kaya", x: 400, y: 175, major: false }, { id: "tenkodogo", name: "Tenkodogo", x: 430, y: 290, major: false }, ]; const BF_ROUTES = [ ["ouaga", "bobo"], ["ouaga", "koudougou"], ["ouaga", "ouahigouya"], ["ouaga", "fada"], ["ouaga", "kaya"], ["ouaga", "tenkodogo"], ["bobo", "banfora"], ["bobo", "koudougou"], ]; function BurkinaMap({ t }) { const [hovered, setHovered] = s2UseState(null); const byId = Object.fromEntries(BF_CITIES.map(c => [c.id, c])); // Real Burkina Faso outline path (simplified from actual borders) const bfOutline = "M 155 152 L 170 140 L 183 132 L 195 118 L 205 105 L 220 95 L 240 88 L 265 82 L 290 78 L 310 80 L 325 90 L 340 95 L 355 92 L 370 96 L 388 95 L 405 88 L 425 82 L 445 80 L 460 85 L 475 92 L 490 95 L 508 92 L 525 100 L 540 115 L 548 135 L 555 155 L 560 180 L 568 200 L 578 215 L 588 235 L 595 255 L 598 275 L 596 295 L 590 315 L 578 330 L 560 340 L 540 348 L 520 355 L 498 360 L 475 362 L 450 358 L 425 350 L 400 348 L 380 355 L 360 360 L 340 358 L 320 355 L 298 352 L 278 350 L 258 345 L 240 338 L 220 325 L 205 310 L 190 292 L 175 275 L 165 255 L 155 230 L 148 205 L 148 180 L 150 165 Z"; return (
{/* Country surface with terrain gradient — Sahel/savane */} {/* Noise for terrain texture */} {/* Halo */} {/* Drop shadow cast under country */} {/* Extruded side (3D edge) — back layers simulating thickness */} {Array.from({ length: 14 }).map((_, i) => ( ))} {/* Top surface */} {/* Texture overlay */} {/* Rivers (Mouhoun/Volta Noire hint) */} {/* Relief spots — small elevated dots for hills/mountains */} {[ { x: 220, y: 180, r: 6 }, { x: 180, y: 220, r: 5 }, { x: 290, y: 140, r: 5 }, { x: 400, y: 170, r: 7 }, { x: 480, y: 210, r: 6 }, { x: 520, y: 280, r: 5 }, { x: 260, y: 300, r: 5 }, { x: 340, y: 330, r: 6 }, ].map((h, i) => ( ))} {/* Routes with glow */} {BF_ROUTES.map(([a, b], i) => { const A = byId[a], B = byId[b]; const isActive = hovered && (hovered === a || hovered === b); return ( ); })} {/* Cities with 3D pin effect */} {BF_CITIES.map(c => { const active = hovered === c.id; const color = c.major ? "#dc2626" : "#fbbf24"; return ( setHovered(c.id)} onMouseLeave={() => setHovered(null)} style={{ cursor: "pointer" }} className={`bf-city ${active ? "active" : ""}`}> {/* Glow halo */} {/* Shadow */} {/* Pin stem */} {/* Pin head */} {/* Label */} {active && ( )} {c.name} ); })} {/* Compass */} N {/* Scale */} 100 km {/* Legend */}
Grandes villes
Villes régionales
Routes desservies
); } function Destinations({ t }) { return (
{t.destinations.eyebrow}

{t.destinations.title}

{t.destinations.sub}

{t.destinations.cities.map((c, i) => (
{c.n}
{c.pop} {c.role}
))}
); } // ---------- STATS BANDEAU ---------- function StatsStrip({ t }) { return (
{t.stats.map((s, i) => (
{s.l}
))}
); } // ---------- OPERATORS ---------- function Operators({ t, onNotify, onPartner }) { return (
{t.operators.eyebrow}

{t.operators.title}

{t.operators.lead}

{/* Dashboard mockup */}
TABLEAU DE BORD · STAF
Live
{/* Mini chart */}
Revenus
1.2M F
Remplissage
87%
Trajets
42
{t.operators.benefits.map((b, i) => (
{i+1}

{b.t}

{b.d}

))}
{/* Partenaires transporteurs */}

{t.operators.partnersLabel}

{t.operators.partnersNote}
{t.operators.partnersList.map((p, i) => (
{p.n.slice(0, 3).toUpperCase()}
{p.n}
{p.desc}
))}
); } // ---------- VISION ---------- function Vision({ t }) { return (
{t.vision.eyebrow}

{t.vision.title}

{t.vision.lead}

{/* Phases */}
{/* Timeline line */}
{t.vision.phases.map((p, i) => { const isLeft = i % 2 === 0; const color = ["#dc2626", "#f59e0b", "#16a34a", "#fbbf24"][i]; return (
0{i+1}
Phase {i+1} · {p.tag}

{p.t}

{p.d}

); })}
{/* Founder */}
{t.vision.founderIntro}

« Nous ne vendons pas des billets. Nous rendons l'Afrique plus proche. »

NY
{t.vision.founder}
{t.vision.founderRole}
); } // ---------- PAYMENTS ---------- function Payments({ t }) { const icons = [ { name: "Orange Money", color: "#ff6600", text: "OM" }, { name: "Moov Money", color: "#0066cc", text: "MM" }, { name: "Wave", color: "#1dc8f5", text: "W" }, { name: "Visa", color: "#1a1f71", text: "VISA" }, { name: "Mastercard", color: "#eb001b", text: "MC" }, ]; return (
{t.payments.eyebrow}

{t.payments.title}

{icons.map((m, i) => (
{m.text}
{m.name}
Instantané
))}
); } // ---------- FAQ ---------- function FAQ({ t }) { const [open, setOpen] = s2UseState(null); return (
{t.faq.eyebrow}

{t.faq.title}

{t.faq.items.map((it, i) => (
setOpen(open === i ? null : i)} data-hover>
{it.q} +
{it.a}
))}
); } // ---------- CTA + Contact ---------- function FinalCTA({ t, onNotify, lang }) { const waLink = `https://wa.me/${(t.contact.phone || "+22600000000").replace(/[^\d]/g, "")}`; return (
{t.contact.eyebrow}
{t.cta.final}

{t.cta.finalSub}

{lang === "fr" ? "Bientôt disponible" : "Coming soon"}
{lang === "fr" ? "Bientôt disponible" : "Coming soon"}
WhatsApp {t.contact.phone}
{lang === "fr" ? "Bureau" : "Office"} {t.contact.city}
); } // ---------- FOOTER ---------- function Footer({ t }) { return ( ); } // ---------- Agent WhatsApp (réservation par chat) ---------- // Numéro WhatsApp Business officiel de FasoTravel, format international SANS « + ». // WA-AGENT (déploiement — 2026-06-18) : numéro officiel posé. NB : le webhook de // l'agent IA n'est réellement actif qu'en Phase 3 (WABA prod — RCCM/IFU). const WA_AGENT_NUMBER = "22651591414"; function WhatsAppAgent({ t, lang, onNotify }) { const a = (t && t.agent) || {}; const waUrl = `https://wa.me/${WA_AGENT_NUMBER.replace(/[^\d]/g, "")}` + `?text=${encodeURIComponent(a.prefill || "Bonjour FasoTravel")}`; const points = a.points || []; const thread = a.thread || []; const WaGlyph = ({ size = 22 }) => ( ); return (
{/* Colonne texte + CTA */}
{a.badge}
{a.eyebrow}

{a.title}

{a.lead}

{points.map((p, i) => (
{p.icon}
{p.t}
{p.d}
))}
{a.cta} {a.note}
{/* Colonne aperçu conversation (mockup WhatsApp) */}
FasoTravel
{a.chatName || "FasoTravel"}
{a.chatStatus}
{thread.map((m, i) => { if (m.kind === "chips") { return (
{(m.items || []).map((c, j) => {c})}
); } if (m.kind === "ticket") { return (
🎟️{m.text}
); } const out = m.from === "user"; return (
{m.text}{out && ✓✓}
); })}
{a.inputPlaceholder}
); } Object.assign(window, { BurkinaMap, Destinations, StatsStrip, Operators, Vision, Payments, FAQ, FinalCTA, Footer, WhatsAppAgent });