"use client"; import { IconBrandDiscord, IconBrandReddit, IconMenu2, IconX } from "@tabler/icons-react"; import { AnimatePresence, motion } from "motion/react"; import Link from "next/link"; import { useEffect, useRef, useState } from "react"; import { SignInButton } from "@/components/auth/sign-in-button"; import { NavbarGitHubStars } from "@/components/homepage/github-stars-badge"; import { Logo } from "@/components/Logo"; import { ThemeTogglerComponent } from "@/components/theme/theme-toggle"; import { cn } from "@/lib/utils"; interface NavbarProps { /** Override the scrolled-state background classes (desktop & mobile). */ scrolledBgClassName?: string; } export const Navbar = ({ scrolledBgClassName }: NavbarProps = {}) => { const [isScrolled, setIsScrolled] = useState(false); const navItems = [ { name: "Pricing", link: "/pricing" }, { name: "Changelog", link: "/changelog" }, { name: "Docs", link: "/docs" }, { name: "Contact\u00A0Us", link: "/contact" }, ]; useEffect(() => { if (typeof window === "undefined") return; const handleScroll = () => { setIsScrolled(window.scrollY > 20); }; handleScroll(); window.addEventListener("scroll", handleScroll); return () => window.removeEventListener("scroll", handleScroll); }, []); return (
); }; const DesktopNav = ({ navItems, isScrolled, scrolledBgClassName }: any) => { const [hovered, setHovered] = useState(null); return ( { setHovered(null); }} className={cn( "mx-auto hidden w-full max-w-7xl flex-row items-center justify-between self-start rounded-full px-4 py-2 lg:flex transition-all duration-300", isScrolled ? (scrolledBgClassName ?? "bg-white/80 backdrop-blur-md border border-white/20 shadow-lg dark:bg-neutral-950/80 dark:border-neutral-800/50") : "bg-transparent border border-transparent" )} > SurfSense
{navItems.map((navItem: any, idx: number) => ( setHovered(idx)} onMouseLeave={() => setHovered(null)} className="relative px-4 py-2 text-neutral-600 dark:text-neutral-300" key={`link=${idx}`} href={navItem.link} > {hovered === idx && ( )} {navItem.name} ))}
); }; const MobileNav = ({ navItems, isScrolled, scrolledBgClassName }: any) => { const [open, setOpen] = useState(false); const navRef = useRef(null); useEffect(() => { if (!open) return; const handleClickOutside = (e: MouseEvent | TouchEvent) => { if (navRef.current && !navRef.current.contains(e.target as Node)) { setOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); document.addEventListener("touchstart", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); document.removeEventListener("touchstart", handleClickOutside); }; }, [open]); return (
SurfSense
{open && ( {navItems.map((navItem: any, idx: number) => ( {navItem.name} ))}
)}
); };