'use client'; import React from 'react'; import Link from 'next/link'; import Image from 'next/image'; import { Button } from '@/components/ui/button-website'; import { cn } from '@/lib/utils'; import { MenuToggleIcon } from '@/components/ui/menu-toggle-icon'; import { createPortal } from 'react-dom'; import { NavigationMenu, NavigationMenuContent, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, } from '@/components/ui/navigation-menu'; import { LucideIcon } from 'lucide-react'; import { BarChart3, Eye, Funnel, Send, FileText, Puzzle, HelpCircle, } from 'lucide-react'; type LinkItem = { title: string; href: string; icon?: LucideIcon; description?: string; }; const featureLinks: LinkItem[] = [ { title: 'Dashboard', href: '/features#dashboard', icon: BarChart3, description: 'Real-time traffic overview', }, { title: 'Visitor Insights', href: '/features#visitors', icon: Eye, description: 'Browser, device & geo data', }, { title: 'Conversion Funnels', href: '/features#funnels', icon: Funnel, description: 'Multi-step drop-off analysis', }, { title: 'Email Reports', href: '/features#reports', icon: Send, description: 'Scheduled inbox summaries', }, ]; const resourceLinks: LinkItem[] = [ { title: 'Installation', href: '/installation', icon: FileText, description: 'Setup guides & code snippets', }, { title: 'Integrations', href: '/integrations', icon: Puzzle, description: '75+ framework guides', }, { title: 'FAQ', href: '/faq', icon: HelpCircle, description: 'Common questions answered', }, ]; export function Header() { const [open, setOpen] = React.useState(false); const scrolled = useScroll(10); React.useEffect(() => { if (open) { document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = ''; } return () => { document.body.style.overflow = ''; }; }, [open]); return (
Features {featureLinks.map((link) => ( ))} Resources {resourceLinks.map((link) => ( ))}
Pricing Plans & billing
); } type MobileMenuProps = React.ComponentProps<'div'> & { open: boolean; }; function MobileMenu({ open, children, className, ...props }: MobileMenuProps) { if (!open || typeof window === 'undefined') return null; return createPortal(
{children}
, document.body, ); } function ListItem({ title, description, icon: Icon, className, href, ...props }: React.ComponentProps & LinkItem) { return (
{Icon ? ( ) : null}
{title} {description}
); } function useScroll(threshold: number) { const [scrolled, setScrolled] = React.useState(false); const onScroll = React.useCallback(() => { setScrolled(window.scrollY > threshold); }, [threshold]); React.useEffect(() => { window.addEventListener('scroll', onScroll); return () => window.removeEventListener('scroll', onScroll); }, [onScroll]); React.useEffect(() => { onScroll(); }, [onScroll]); return scrolled; }