'use client'; import { useState } from 'react'; import { usePathname } from 'next/navigation'; import { useAuth } from '@/contexts/AuthContext'; import { Wordmark, Ticker } from '@/components/vyndr'; import { HeartbeatBar } from '@/components/vyndr/LiveLayer'; import NotificationBell from '@/components/NotificationBell'; // Nav labels are English literals for now; nav-string i18n lands in Phase G // (Session 38) once the locale dictionaries carry slate/terminal/etc. keys. // VYNDR 2.0 nav (§6, Session 34). Primary links are SLATE / TERMINAL / SCAN / // LEDGER; everything else lives under a More dropdown. All nav chrome is // JetBrains Mono, uppercase, 11px — system language, not SaaS sans. Active // route is grade-green (--g-a); a Ticker runs under the bar. const PRIMARY = [ { id: 'slate', label: 'Slate', href: '/dashboard' }, { id: 'terminal', label: 'Terminal', href: '/terminal' }, { id: 'scan', label: 'Scan', href: '/scan' }, { id: 'ledger', label: 'Ledger', href: '/ledger' }, ]; const MORE = [ { label: 'Explore', href: '/explore' }, { label: 'Compare', href: '/compare' }, { label: 'Tracker', href: '/tracker' }, { label: 'The Report', href: '/blog' }, { label: 'Invite', href: '/invite' }, { label: 'Pricing', href: '/pricing' }, { label: 'Settings', href: '/settings' }, ]; const TICKER_ITEMS = [ { tag: 'A+', text: 'Signal detected · Wembanyama Points', glow: true }, { tag: 'LIVE', text: 'NYK vs SA · Q3 4:22', color: 'var(--live)' }, { tag: 'CASCADE', text: 'Murray OUT → Jokic usage', delta: '▲+12%', color: 'var(--g-b)' }, { tag: 'MOVE', text: 'Tatum o27.5 → o26.5', delta: '▼-1.0', color: 'var(--amber)' }, ]; function isActive(pathname: string, href: string) { return pathname === href || pathname.startsWith(href + '/'); } const linkStyle = (active: boolean) => ({ fontFamily: 'var(--mono)', fontSize: 11, fontWeight: 700, letterSpacing: '0.08em', textTransform: 'uppercase' as const, color: active ? 'var(--g-a)' : 'var(--text-1)', textDecoration: 'none', whiteSpace: 'nowrap' as const, transition: 'color .15s', background: 'transparent', border: 'none', cursor: 'pointer', padding: '6px 4px', }); export default function Nav() { const { user, tier, scansRemaining, signOut } = useAuth(); const pathname = usePathname() || ''; const [menuOpen, setMenuOpen] = useState(false); const [moreOpen, setMoreOpen] = useState(false); const [mobileOpen, setMobileOpen] = useState(false); const showReadCounter = pathname.startsWith('/scan') || pathname.startsWith('/dashboard'); const moreActive = MORE.some((l) => isActive(pathname, l.href)); return (
{/* Ticker + heartbeat under the bar (§8 living layer) */}
); } const menuItem: React.CSSProperties = { display: 'block', padding: '10px 12px', fontSize: 13, color: 'var(--text-1)', textDecoration: 'none', fontFamily: 'var(--sans)', };