// Topnav uniquement — altimètre supprimé du projet. const SECTIONS = ["accueil", "apropos", "projets", "competences", "contact"]; function Chrome() { const [stuck, setStuck] = React.useState(false); const [navActive, setNavActive] = React.useState("accueil"); const [navTheme, setNavTheme] = React.useState("dark"); const [menuOpen, setMenuOpen] = React.useState(false); React.useEffect(() => { const onScroll = () => { const y = window.scrollY; setStuck(y > 80); // Topnav : highlight + theme // On ignore les sections en display:none (rect 0×0) pour éviter // que Contact soit marqué actif avant qu'il ne soit révélé. let curIdx = 0; SECTIONS.forEach((id, i) => { const el = document.getElementById(id); if (!el) return; const rect = el.getBoundingClientRect(); if (rect.width === 0 && rect.height === 0) return; if (rect.top <= window.innerHeight * 0.4) curIdx = i; }); setNavActive(SECTIONS[curIdx]); setNavTheme(curIdx === 0 || curIdx === 4 ? "dark" : "light"); // Mirror v1 toggleHeaderFooter() : swap header/footer pour éviter // qu'ils se chevauchent (tous deux fixed, height 100vh). const competences = document.getElementById("competences"); const competencesTop = competences ? competences.getBoundingClientRect().top : Infinity; const footerRevealed = competencesTop <= 0; document.body.classList.toggle("show-footer", footerRevealed); }; onScroll(); window.addEventListener("scroll", onScroll, { passive: true }); window.addEventListener("resize", onScroll); return () => { window.removeEventListener("scroll", onScroll); window.removeEventListener("resize", onScroll); }; }, []); const items = [ { id:"accueil", n:"01", label:"ACCUEIL" }, { id:"apropos", n:"02", label:"À PROPOS" }, { id:"projets", n:"03", label:"PROJETS" }, { id:"competences", n:"04", label:"COMPÉTENCES" }, { id:"contact", n:"05", label:"CONTACT" }, ]; const dark = navTheme === "dark"; const cls = `vm-topnav ${dark?"is-dark":"is-light"} ${stuck?"is-stuck":""} ${stuck && dark?"is-dark-stuck":""} ${menuOpen?"menu-open":""}`; const handleNavClick = (e, id) => { setMenuOpen(false); // Hero (accueil) et Contact sont en position:fixed avec display toggle : // on force un scroll absolu pour les atteindre correctement. if (id === "accueil") { e.preventDefault(); window.scrollTo({ top: 0, behavior: "smooth" }); } else if (id === "contact") { e.preventDefault(); window.scrollTo({ top: document.documentElement.scrollHeight - window.innerHeight, behavior: "smooth", }); } }; return (
{/* burger — visible uniquement sur mobile */}
); } window.Chrome = Chrome;