import { useState, useEffect, useRef } from 'react' import type { CSSProperties } from 'react' import { NavLink } from 'react-router-dom' import { Search, Menu, X } from 'lucide-react' import { motion, AnimatePresence } from 'framer-motion' import { useLang } from '@/context/LangContext' /* ───────────────────────────────────────────────────────── DESIGN TOKENS ───────────────────────────────────────────────────────── */ const T = { paper: 'var(--paper)', paper2: 'var(--paper-2)', ink: 'var(--ink)', ink3: 'var(--ink-3)', ink4: 'var(--ink-4)', ink5: 'var(--ink-5)', ruleThin: 'var(--rule-thin)', red: 'var(--red)', } as const /* ───────────────────────────────────────────────────────── DATA ───────────────────────────────────────────────────────── */ const NAV_ITEMS: { fa: string; en: string; to: string }[] = [ { fa: 'خانه', en: 'Home', to: '/' }, { fa: 'آینده‌پژوهی و رصد هوشمند', en: 'Foresight & Intelligence', to: '/radar' }, { fa: 'پایداری و فولاد سبز', en: 'Sustainability & Green Steel', to: '/sustainability' }, { fa: 'ژئوپلیتیک و اقتصاد جهانی', en: 'Geopolitics & Global Economy', to: '/geopolitics' }, { fa: 'فناوری و نوآوری', en: 'Technology & Innovation', to: '/technology' }, { fa: 'بازار و زنجیره فولاد', en: 'Market & Steel Chain', to: '/pulse' }, ] const META_LEFT: { fa: string; en: string }[] = [ { fa: 'درباره ما', en: 'About' }, { fa: 'کارشناسان', en: 'Experts' }, { fa: 'همکاری', en: 'Careers' }, { fa: 'رسانه', en: 'Press' }, ] /* ───────────────────────────────────────────────────────── NAV LINK (used in main + drawer) ───────────────────────────────────────────────────────── */ function MainNavItem({ to, label }: { to: string; label: string }) { const [hovered, setHovered] = useState(false) return ( setHovered(true)} onMouseLeave={() => setHovered(false)} style={({ isActive }: { isActive: boolean }): CSSProperties => ({ fontSize: 13, fontWeight: 600, color: isActive ? T.red : hovered ? T.ink : T.ink3, textDecoration: 'none', padding: '6px 0', position: 'relative', whiteSpace: 'nowrap', transition: 'color 120ms', borderBottom: isActive ? `2px solid ${T.red}` : '2px solid transparent', letterSpacing: '0.1px', })} > {label} ) } function DrawerNavItem({ to, label, onClose, }: { to: string label: string onClose: () => void }) { const [hovered, setHovered] = useState(false) return ( setHovered(true)} onMouseLeave={() => setHovered(false)} style={({ isActive }: { isActive: boolean }): CSSProperties => ({ display: 'block', padding: '13px 20px', fontSize: 14, fontWeight: 600, color: isActive || hovered ? T.paper : T.ink, background: isActive ? T.ink : hovered ? T.paper2 : 'transparent', textDecoration: 'none', borderBottom: `1px solid ${T.ruleThin}`, transition: 'background 120ms, color 120ms', })} > {label} ) } /* ───────────────────────────────────────────────────────── MAIN COMPONENT ───────────────────────────────────────────────────────── */ export default function Header() { const [mobileOpen, setMobileOpen] = useState(false) const [isMobile, setIsMobile] = useState(false) const [searchOpen, setSearchOpen] = useState(false) const [scrolled, setScrolled] = useState(false) const searchInputRef = useRef(null) const { lang, toggle: toggleLang } = useLang() /* scroll listener — toggles glass + collapses meta strip */ useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 8) onScroll() window.addEventListener('scroll', onScroll, { passive: true }) return () => window.removeEventListener('scroll', onScroll) }, []) /* viewport listener */ useEffect(() => { const mq = window.matchMedia('(max-width: 1023px)') const handler = (e: MediaQueryListEvent | MediaQueryList) => setIsMobile(e.matches) handler(mq) mq.addEventListener('change', handler) return () => mq.removeEventListener('change', handler) }, []) /* body scroll lock */ useEffect(() => { document.body.style.overflow = mobileOpen ? 'hidden' : '' return () => { document.body.style.overflow = '' } }, [mobileOpen]) /* focus search on open */ useEffect(() => { if (searchOpen) searchInputRef.current?.focus() }, [searchOpen]) return (
{/* ═══════════════════════════════════════════ MAIN BAR — brand | nav | actions ═══════════════════════════════════════════ */}
{/* ── Brand ── */}
اندیشکده فولاد آینده FUTURE STEEL POLICY INSTITUTE
{/* ── Center: Nav (desktop only) ── */} {!isMobile && ( )} {/* ── Left: Actions ── */}
{/* Search icon button */} {/* Login + lang toggle — desktop only */} {!isMobile && ( <> {lang === 'fa' ? 'ورود / ثبت‌نام' : 'Login / Register'} )} {/* Mobile menu */} {isMobile && ( )}
{/* ═══════════════════════════════════════════ SEARCH DROPDOWN ═══════════════════════════════════════════ */} {searchOpen && (
e.key === 'Escape' && setSearchOpen(false)} style={{ width: '100%', border: `1px solid ${T.ink}`, padding: '12px 16px', fontSize: 14, background: T.paper, color: T.ink, outline: 'none', borderRadius: 0, fontFamily: 'inherit', direction: 'rtl', }} />
)}
{/* ═══════════════════════════════════════════ MOBILE DRAWER ═══════════════════════════════════════════ */} {mobileOpen && ( <> setMobileOpen(false)} style={{ position: 'fixed', inset: 0, background: 'rgba(7,29,73,0.55)', zIndex: 100, }} /> {/* Drawer header */}
اندیشکده فولاد آینده
{/* Nav */} {/* Footer */}
{lang === 'fa' ? 'اشتراک سازمانی' : 'Membership'} {lang === 'fa' ? 'ورود' : 'Login'}
{META_LEFT.map((item) => ( {lang === 'fa' ? item.fa : item.en} ))}
)}
) } /* ───────────────────────────────────────────────────────── BUTTONS ───────────────────────────────────────────────────────── */ function RedCtaButton({ children, style: extraStyle, }: { children: React.ReactNode style?: CSSProperties }) { const [hovered, setHovered] = useState(false) return ( ) } function OutlineButton({ children, style: extraStyle, }: { children: React.ReactNode style?: CSSProperties }) { const [hovered, setHovered] = useState(false) return ( ) }