diff --git a/frontend/src/components/PageTransition.tsx b/frontend/src/components/PageTransition.tsx new file mode 100644 index 0000000..5801aa6 --- /dev/null +++ b/frontend/src/components/PageTransition.tsx @@ -0,0 +1,26 @@ +import { motion } from "framer-motion" +import { useLocation } from "react-router-dom" +import { type ReactNode } from "react" + +interface PageTransitionProps { + children: ReactNode +} + +/** + * Enveloppe chaque page dans une transition d'entrée subtile : + * légère remontée + fade-in. Utilise la clé `location.pathname` + * pour que framer-motion rejoue l'animation à chaque navigation. + */ +export function PageTransition({ children }: PageTransitionProps) { + const location = useLocation() + return ( + + {children} + + ) +} diff --git a/frontend/src/components/header.tsx b/frontend/src/components/header.tsx index 90dc536..022f858 100644 --- a/frontend/src/components/header.tsx +++ b/frontend/src/components/header.tsx @@ -12,8 +12,20 @@ import useAuth from "@/hooks/useAuth" export function Header() { const { isAuthenticated } = useAuth() const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false) + const [scrolled, setScrolled] = useState(false) const location = useLocation() + useEffect(() => { + const onScroll = () => setScrolled(window.scrollY > 8) + onScroll() + window.addEventListener("scroll", onScroll, { passive: true }) + return () => window.removeEventListener("scroll", onScroll) + }, []) + + // Ferme le menu mobile quand on change de route + useEffect(() => { + setIsMobileMenuOpen(false) + }, [location.pathname]) const toggleMobileMenu = () => { setIsMobileMenuOpen(!isMobileMenuOpen) @@ -36,32 +48,62 @@ export function Header() { const filteredNavItems = navItems.filter((item) => item.public || isAuthenticated) return ( -
+
-
- - + + +
+ +
-
+ {/* Navigation desktop */} { isAuthenticated && ( -