'use client'; import * as React from 'react'; import { useEffect, useState, useRef, useId } from 'react'; import { SearchIcon, BellIcon, UserIcon, ChevronDownIcon } from 'lucide-react'; import { Button } from '@repo/shadcn-ui/components/ui/button'; import { Input } from '@repo/shadcn-ui/components/ui/input'; import { NavigationMenu, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, } from '@repo/shadcn-ui/components/ui/navigation-menu'; import { Popover, PopoverContent, PopoverTrigger, } from '@repo/shadcn-ui/components/ui/popover'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from '@repo/shadcn-ui/components/ui/dropdown-menu'; import { Avatar, AvatarFallback, AvatarImage } from '@repo/shadcn-ui/components/ui/avatar'; import { Badge } from '@repo/shadcn-ui/components/ui/badge'; import { cn } from '@repo/shadcn-ui/lib/utils'; import type { ComponentProps } from 'react'; // Simple logo component for the navbar const Logo = (props: React.SVGAttributes) => { return ( ); }; // Hamburger icon component const HamburgerIcon = ({ className, ...props }: React.SVGAttributes) => ( ); // Notification Menu Component const NotificationMenu = ({ notificationCount = 3, onItemClick }: { notificationCount?: number; onItemClick?: (item: string) => void; }) => ( Notifications onItemClick?.('notification1')}>

New message received

2 minutes ago

onItemClick?.('notification2')}>

System update available

1 hour ago

onItemClick?.('notification3')}>

Weekly report ready

3 hours ago

onItemClick?.('view-all')}> View all notifications
); // User Menu Component const UserMenu = ({ userName = 'John Doe', userEmail = 'john@example.com', userAvatar, onItemClick }: { userName?: string; userEmail?: string; userAvatar?: string; onItemClick?: (item: string) => void; }) => (

{userName}

{userEmail}

onItemClick?.('profile')}> Profile onItemClick?.('settings')}> Settings onItemClick?.('billing')}> Billing onItemClick?.('logout')}> Log out
); // Types export interface Navbar08NavItem { href?: string; label: string; active?: boolean; } export interface Navbar08Props extends React.HTMLAttributes { logo?: React.ReactNode; logoHref?: string; navigationLinks?: Navbar08NavItem[]; searchPlaceholder?: string; searchShortcut?: string; userName?: string; userEmail?: string; userAvatar?: string; notificationCount?: number; onNavItemClick?: (href: string) => void; onSearchSubmit?: (query: string) => void; onNotificationItemClick?: (item: string) => void; onUserItemClick?: (item: string) => void; } // Default navigation links const defaultNavigationLinks: Navbar08NavItem[] = [ { href: '#', label: 'Home', active: true }, { href: '#', label: 'Features' }, { href: '#', label: 'Pricing' }, { href: '#', label: 'About' }, ]; export const Navbar08 = React.forwardRef( ( { className, logo = , logoHref = '#', navigationLinks = defaultNavigationLinks, searchPlaceholder = 'Search...', searchShortcut = '⌘K', userName = 'John Doe', userEmail = 'john@example.com', userAvatar, notificationCount = 3, onNavItemClick, onSearchSubmit, onNotificationItemClick, onUserItemClick, ...props }, ref ) => { const [isMobile, setIsMobile] = useState(false); const containerRef = useRef(null); const searchId = useId(); useEffect(() => { const checkWidth = () => { if (containerRef.current) { const width = containerRef.current.offsetWidth; setIsMobile(width < 768); // 768px is md breakpoint } }; checkWidth(); const resizeObserver = new ResizeObserver(checkWidth); if (containerRef.current) { resizeObserver.observe(containerRef.current); } return () => { resizeObserver.disconnect(); }; }, []); // Combine refs const combinedRef = React.useCallback((node: HTMLElement | null) => { containerRef.current = node; if (typeof ref === 'function') { ref(node); } else if (ref) { ref.current = node; } }, [ref]); const handleSearchSubmit = (e: React.FormEvent) => { e.preventDefault(); const formData = new FormData(e.currentTarget); const query = formData.get('search') as string; if (onSearchSubmit) { onSearchSubmit(query); } }; return (
{/* Top section */}
{/* Left side */}
{/* Mobile menu trigger */} {isMobile && ( {navigationLinks.map((link, index) => ( ))} )} {/* Logo */}
{/* Middle area */}
{/* Search form */}
{searchShortcut}
{/* Right side */}
{/* Notification */} {/* User menu */}
{/* Bottom navigation */} {!isMobile && (
{/* Navigation menu */} {navigationLinks.map((link, index) => ( { e.preventDefault(); if (onNavItemClick && link.href) onNavItemClick(link.href); }} className={cn( 'text-muted-foreground hover:text-primary py-1.5 font-medium transition-colors cursor-pointer group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50', link.active && 'text-primary' )} data-active={link.active} > {link.label} ))}
)}
); } ); Navbar08.displayName = 'Navbar08'; export { Logo, HamburgerIcon, NotificationMenu, UserMenu };