← back to ClawCoder
src/components/nav.tsx
118 lines
'use client'
import Link from 'next/link'
import { usePathname } from 'next/navigation'
import { useState } from 'react'
import { UserBadge } from './user-badge'
const navLinks = [
{ href: '/', label: 'Home' },
{ href: '/analyzer', label: 'Analyzer' },
{ href: '/builder', label: 'Builder' },
{ href: '/marketplace', label: 'Marketplace' },
{ href: '/my-files', label: 'My Files' },
{ href: '/mass-update', label: 'Mass Update' },
]
export function Nav() {
const pathname = usePathname()
const [menuOpen, setMenuOpen] = useState(false)
function isActive(href: string) {
if (href === '/') return pathname === '/'
return pathname.startsWith(href)
}
return (
<nav className="sticky top-0 z-40 h-16 border-b border-slate-200 bg-white shadow-sm">
<div className="mx-auto flex h-full max-w-7xl items-center justify-between px-4 sm:px-6">
{/* Logo */}
<Link
href="/"
className="text-xl font-bold text-slate-800 transition-colors hover:text-blue-600"
>
ClawCoder
</Link>
{/* Desktop links */}
<div className="hidden items-center gap-1 md:flex">
{navLinks.map((link) => (
<Link
key={link.href}
href={link.href}
className={`rounded-lg px-3 py-2 text-sm font-medium transition-colors ${
isActive(link.href)
? 'bg-blue-50 text-blue-600'
: 'text-slate-600 hover:bg-slate-100 hover:text-slate-900'
}`}
>
{link.label}
</Link>
))}
</div>
{/* User badge (desktop) */}
<div className="hidden md:flex">
<UserBadge />
</div>
{/* Mobile hamburger */}
<button
type="button"
onClick={() => setMenuOpen(!menuOpen)}
className="inline-flex min-h-[44px] min-w-[44px] items-center justify-center rounded-lg text-slate-600 hover:bg-slate-100 md:hidden"
aria-label={menuOpen ? 'Close menu' : 'Open menu'}
aria-expanded={menuOpen}
>
<svg
className="h-6 w-6"
fill="none"
viewBox="0 0 24 24"
strokeWidth={1.5}
stroke="currentColor"
>
{menuOpen ? (
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M6 18L18 6M6 6l12 12"
/>
) : (
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5"
/>
)}
</svg>
</button>
</div>
{/* Mobile menu */}
{menuOpen && (
<div className="border-b border-slate-200 bg-white shadow-lg md:hidden">
<div className="space-y-1 px-4 py-3">
{navLinks.map((link) => (
<Link
key={link.href}
href={link.href}
onClick={() => setMenuOpen(false)}
className={`block rounded-lg px-4 py-3 text-sm font-medium transition-colors ${
isActive(link.href)
? 'bg-blue-50 text-blue-600'
: 'text-slate-600 hover:bg-slate-100 hover:text-slate-900'
}`}
>
{link.label}
</Link>
))}
<div className="border-t border-slate-200 pt-3">
<UserBadge />
</div>
</div>
</div>
)}
</nav>
)
}