"use client"; import React, { useEffect, useState, useRef } from "react"; import Footer from "./components/Footer"; import "./assets/main.css"; import "./globals.css"; import NavLink from "./components/NavLink"; export default function RootLayout({ children }: { children: React.ReactNode }) { const [visitCount, setVisitCount] = useState(0); const [isMenuOpen, setIsMenuOpen] = useState(false); const menuRef = useRef(null); const burgerRef = useRef(null); const closeTimerRef = useRef | null>(null); const AUTO_CLOSE_MS = 4000; const clearAutoClose = () => { if (closeTimerRef.current) { clearTimeout(closeTimerRef.current); closeTimerRef.current = null; } }; const scheduleAutoClose = () => { clearAutoClose(); closeTimerRef.current = setTimeout(() => setIsMenuOpen(false), AUTO_CLOSE_MS); }; const openMenu = () => setIsMenuOpen(true); const closeMenu = () => setIsMenuOpen(false); const toggleMenu = () => setIsMenuOpen((v) => !v); useEffect(() => { const visits = localStorage.getItem("visitCount"); const newVisitCount = visits ? parseInt(visits) + 1 : 1; localStorage.setItem("visitCount", newVisitCount.toString()); setVisitCount(newVisitCount); }, []); useEffect(() => { if (!isMenuOpen) { clearAutoClose(); return; } scheduleAutoClose(); const handleKey = (e: KeyboardEvent) => { if (e.key === "Escape") setIsMenuOpen(false); }; const handleResize = () => { if (window.innerWidth >= 768) setIsMenuOpen(false); }; window.addEventListener("keydown", handleKey); window.addEventListener("resize", handleResize); return () => { clearAutoClose(); window.removeEventListener("keydown", handleKey); window.removeEventListener("resize", handleResize); }; }, [isMenuOpen]); useEffect(() => { if (!isMenuOpen && burgerRef.current) { burgerRef.current.focus({ preventScroll: true }); } }, [isMenuOpen]); return (
{/* Conserve le fond en plein écran */}
{/* Contenu centré avec largeur contrôlée */}
{/* Cercles animés */}
{/* Header */}

Portfolio Gras-Calvet Fernand

{/* Bouton menu burger */} {/* Menu desktop */}
{/* Drawer mobile (tiroir gauche, 70%, fond sombre translucide) */}
{/* Voile : tap pour fermer */}
{children}
NV : {visitCount}
); }