// Auteur : Simon-Pierre Boucher — contact@spboucher.ai /** * Navigation d'en-tête. Le menu mobile utilise le motif checkbox + peer-checked : * il s'ouvre et se ferme en PUR CSS — fonctionne même sans JavaScript (cache * périmé, hydratation cassée, JS bloqué). Le JS n'est qu'une amélioration * (fermeture au changement de page, verrou de défilement). */ "use client"; import { useEffect, useRef } from "react"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { useLang } from "./LangContext"; export default function HeaderNav() { const { lang, setLang } = useLang(); const path = usePathname(); const fr = lang === "fr"; const box = useRef(null); // améliorations JS (facultatives) : fermer à la navigation, verrouiller le scroll useEffect(() => { if (box.current) box.current.checked = false; document.body.style.overflow = ""; }, [path]); const onToggle = () => { document.body.style.overflow = box.current?.checked ? "hidden" : ""; }; const items = [ { href: "/", label: fr ? "Estimer" : "Estimate" }, { href: "/ka", label: fr ? "Ka · agent IA" : "Ka · AI agent" }, { href: "/parc", label: fr ? "Parc immobilier" : "Portfolio" }, { href: "/stats", label: fr ? "Statistiques" : "Statistics" }, { href: "/methodologie", label: fr ? "Méthodologie" : "Methodology" }, ]; const isActive = (href: string) => href === "/" ? path === "/" : path.startsWith(href); return ( <> {/* nav pilule — desktop */} {/* ---- menu mobile : checkbox cachée + peer-checked, zéro JS requis ---- */}
{/* hamburger (label = bouton) */} {/* panneau plein écran — sibling du checkbox, affiché via peer-checked */}
{/* barre du haut : marque + fermer */}
Valo Plex
{/* liens géants */} {/* pied du menu */}
{fr ? "Conditions" : "Terms"} {fr ? "Confidentialité" : "Privacy"} contact@spboucher.ai
); }