diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index fd5eac86..4471692e 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -1,28 +1,74 @@ import { NavLink, Link } from "react-router-dom"; -import { useState, useContext } from "react"; +import { useState, useContext, useRef, useEffect } from "react"; import { ThemeContext } from "../context/ThemeContext"; -import { Moon, Sun, Menu, X, Github } from "lucide-react"; +import { Moon, Sun, Menu, X } from "lucide-react"; + +const navItems = [ + { to: "/", label: "Home" }, + { to: "/track", label: "Tracker" }, + { to: "/contributors", label: "Contributors" }, + { to: "/login", label: "Login" }, +]; const Navbar: React.FC = () => { const [isOpen, setIsOpen] = useState(false); - + const [pillStyle, setPillStyle] = useState<{ + left: number; + width: number; + opacity: number; + }>({ left: 0, width: 0, opacity: 0 }); + + const [scrolled,setScrolled]= useState(false); + useEffect( () => { + const handleScroll = () => { + setScrolled(window.scrollY>20); + }; + + handleScroll(); + window.addEventListener("scroll", handleScroll, { passive: true }); + return () => window.removeEventListener("scroll", handleScroll); + },[]); + + const navRef = useRef(null); const themeContext = useContext(ThemeContext); if (!themeContext) return null; const { toggleTheme, mode } = themeContext; - const navLinkStyles = ({ isActive }: { isActive: boolean }) => - `px-4 py-2 rounded-xl text-sm lg:text-base font-semibold transition-all duration-300 ${ + const closeMenu = () => setIsOpen(false); + + const handleMouseEnter = (e: React.MouseEvent) => { + const nav = navRef.current; + const item = e.currentTarget; + if (!nav) return; + const navRect = nav.getBoundingClientRect(); + const itemRect = item.getBoundingClientRect(); + setPillStyle({ + left: itemRect.left - navRect.left, + width: itemRect.width, + opacity: 1, + }); + }; + + const handleMouseLeave = () => { + setPillStyle((prev) => ({ ...prev, opacity: 0 })); + }; + + const navLinkClass = ({ isActive }: { isActive: boolean }) => + `relative z-10 px-4 py-2 rounded-xl text-sm lg:text-base font-semibold transition-colors duration-200 ${ isActive - ? "text-blue-600 bg-blue-100 dark:bg-blue-900/40 shadow-sm" - : "text-slate-700 dark:text-gray-300 hover:text-blue-500" + ? "text-blue-600 dark:text-blue-400" + : "text-slate-700 dark:text-gray-300" }`; - const closeMenu = () => setIsOpen(false); - return ( -