import { useState, useEffect } from 'react' import { motion, AnimatePresence } from 'framer-motion' import Link from './link' import ThemeToggle from './theme-toggle' import { NAV_LINKS, SITE } from '../../consts' import { cn } from '@/lib/utils' import debounce from 'lodash.debounce' import Logo from '../ui/logo' import { Button } from '@/components/ui/button' import { Menu, X } from 'lucide-react' import { Separator } from '../ui/separator' const Navbar = () => { const [scrollLevel, setScrollLevel] = useState(0) const [isScrolled, setIsScrolled] = useState(false) const [isMobile, setIsMobile] = useState(false) const [mobileMenuOpen, setMobileMenuOpen] = useState(false) const [activePath, setActivePath] = useState("/") useEffect(() => { setActivePath(window.location.pathname) const handleRouteChange = () => { setActivePath(window.location.pathname) } window.addEventListener('popstate', handleRouteChange) return () => { window.removeEventListener('popstate', handleRouteChange) } }, []) useEffect(() => { const handleResize = debounce(() => { const isMobileView = window.matchMedia('(max-width: 768px)').matches setIsMobile(isMobileView) if (!isMobileView && mobileMenuOpen) { setMobileMenuOpen(false) } }, 100) handleResize() window.addEventListener('resize', handleResize) return () => { window.removeEventListener('resize', handleResize) } }, [mobileMenuOpen]) useEffect(() => { const handleScroll = debounce(() => { const scrollY = window.scrollY setScrollLevel( scrollY > 500 ? 4 : scrollY > 300 ? 3 : scrollY > 150 ? 2 : scrollY > 0 ? 1 : 0 ) setIsScrolled(scrollY > 0) }, 50) window.addEventListener('scroll', handleScroll) return () => { window.removeEventListener('scroll', handleScroll) } }, []) useEffect(() => { if (mobileMenuOpen) { document.body.style.overflow = 'hidden' } else { document.body.style.overflow = '' } return () => { document.body.style.overflow = '' } }, [mobileMenuOpen]) const sizeVariants: Record = { 0: { width: '100%' }, 1: { width: '90%' }, 2: { width: '80%' }, 3: { width: '70%' }, 4: { width: '50%' }, } const menuVariants = { closed: { opacity: 0, y: "-100%", transition: { duration: 0.5, ease: [0.22, 1, 0.36, 1], } }, open: { opacity: 1, y: "0%", transition: { duration: 0.5, ease: [0.22, 1, 0.36, 1], } } } return ( <>
{SITE.title}
{isMobile && ( )}
{mobileMenuOpen && (
2020 - {new Date().getFullYear()} © All rights reserved.

Open-source under MIT license

)}
) } export default Navbar