'use client'; import { useState, useEffect, useRef } from 'react'; import Image from 'next/image'; import { motion, AnimatePresence } from 'framer-motion'; import { Navbar as HeroNavbar, NavbarBrand, NavbarContent, NavbarItem, Button, Dropdown, DropdownTrigger, DropdownMenu, DropdownItem } from '@heroui/react'; import { ArrowRight, ChevronDown, Menu, X, Sun, Moon, Globe, Layers, Rocket, ArrowLeftRight, Coins, LayoutDashboard, Radio, BookOpen, ShieldCheck, GraduationCap, MessageCircle, Headphones, Users, Briefcase, Mail, Newspaper, Rainbow } from 'lucide-react'; import ProductMenu from './ProductMenu'; import ResourceMenu from './ResourceMenu'; import { useLanguage } from '@/contexts/LanguageContext'; import { useTheme } from '@/contexts/ThemeContext'; export default function Navbar() { const [scrolled, setScrolled] = useState(false); const { language, setLanguage, t } = useLanguage(); const { theme, toggleTheme } = useTheme(); const [showProductMenu, setShowProductMenu] = useState(false); const [showResourceMenu, setShowResourceMenu] = useState(false); const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const [mobileProductOpen, setMobileProductOpen] = useState(false); const [mobileResourceOpen, setMobileResourceOpen] = useState(false); const [navBottom, setNavBottom] = useState(64); const navRef = useRef(null); useEffect(() => { const handleScroll = () => { setScrolled(window.scrollY > 50); }; window.addEventListener('scroll', handleScroll); return () => window.removeEventListener('scroll', handleScroll); }, []); useEffect(() => { if (mobileMenuOpen) { document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = ''; } return () => { document.body.style.overflow = ''; }; }, [mobileMenuOpen]); useEffect(() => { if (!showProductMenu && !showResourceMenu) return; const handleClickOutside = (e: MouseEvent) => { const target = e.target as Element; if (showProductMenu && !target.closest('.product-menu-container')) { setShowProductMenu(false); } if (showResourceMenu && !target.closest('.resource-menu-container')) { setShowResourceMenu(false); } }; // 延迟注册,避免当前 click 事件冒泡立即触发 const timer = requestAnimationFrame(() => { document.addEventListener('click', handleClickOutside); }); return () => { cancelAnimationFrame(timer); document.removeEventListener('click', handleClickOutside); }; }, [showProductMenu, showResourceMenu]); useEffect(() => { const handleResize = () => { if (window.innerWidth >= 1024) { setMobileMenuOpen(false); setMobileProductOpen(false); setMobileResourceOpen(false); } }; window.addEventListener('resize', handleResize); return () => window.removeEventListener('resize', handleResize); }, []); useEffect(() => { const measure = () => { const el = navRef.current ?? (document.querySelector('header, nav') as HTMLElement); if (el) { navRef.current = el; const h = Math.ceil(el.getBoundingClientRect().height); setNavBottom(h); document.documentElement.style.setProperty('--navbar-height', `${h}px`); } }; measure(); const ro = new ResizeObserver(measure); const el = document.querySelector('header, nav') as HTMLElement; if (el) ro.observe(el); return () => ro.disconnect(); }, []); const isDark = theme === 'dark'; return ( <> {/* Logo */} Logo {/* Center Menu */} {/* Product */} {/* Ecosystem */} {/* Resource */} {/* Right Content */} {/* Launch App Button */} {/* Theme Toggle - desktop only */} {/* Language Selector - desktop only */} setLanguage(key as 'zh' | 'en')} selectedKeys={new Set([language])} classNames={{ list: "py-2" }} itemClasses={{ base: "py-3 flex items-center justify-center" }} > 中文 English {/* Hamburger - mobile only */} {/* Mobile Menu */} {mobileMenuOpen && ( <> {/* Backdrop — click outside to close */} { setMobileMenuOpen(false); setMobileProductOpen(false); setMobileResourceOpen(false); }} />
{/* Product */} {/* Product Accordion */} {mobileProductOpen && (
{/* Core Yield Assets */}
{language === 'zh' ? '核心收益资产' : 'Core Yield Assets'}
AX-Fund
{language === 'zh' ? '最高22% APY' : 'up to 22% APY'}
AX-Pool
{language === 'zh' ? '多元化' : 'Diversified'}
{/* Platforms & Protocols */}
{language === 'zh' ? '平台与协议' : 'Platforms & Protocols'}
{[ { Icon: Rocket, titleZh: 'Launchpad', titleEn: 'Launchpad' }, { Icon: ArrowLeftRight, titleZh: 'DeFi市场', titleEn: 'DeFi Market' }, { Icon: Coins, titleZh: 'Token Factory', titleEn: 'Token Factory' }, ].map(({ Icon, titleZh, titleEn }) => (
{language === 'zh' ? titleZh : titleEn}
))}
{/* Infrastructure */}
{language === 'zh' ? '基础设施' : 'Infrastructure'}
{[ { Icon: LayoutDashboard, titleZh: 'Asset Cockpit', titleEn: 'Asset Cockpit' }, { Icon: Radio, titleZh: 'Oracle Network', titleEn: 'Oracle Network' }, ].map(({ Icon, titleZh, titleEn }) => (
{language === 'zh' ? titleZh : titleEn}
))}
{/* Bottom */}
{language === 'zh' ? '最新审计:' : 'Latest Audit: '} Oct 2025 (Certik) {language === 'zh' ? '查看文档 →' : 'View Docs →'}
)}
{/* Ecosystem */}
{/* Resource */} {/* Resource Accordion */} {mobileResourceOpen && (
{/* Documentation & Learning */}
{language === 'zh' ? '文档与学习' : 'Documentation & Learning'}
{language === 'zh' ? '文档' : 'Docs'}
{language === 'zh' ? '已更新' : 'Updated'}
{language === 'zh' ? '信任与安全' : 'Trust & Security'}
{/* Help & Support */}
{language === 'zh' ? '帮助与支持' : 'Help & Support'}
{[ { Icon: GraduationCap, titleZh: '学习中心', titleEn: 'Learning Center' }, { Icon: MessageCircle, titleZh: '社区论坛', titleEn: 'Community Forum' }, { Icon: Headphones, titleZh: '联系支持', titleEn: 'Contact Support' }, ].map(({ Icon, titleZh, titleEn }) => (
{language === 'zh' ? titleZh : titleEn}
))}
{/* Company */}
{language === 'zh' ? '公司' : 'Company'}
{[ { Icon: Users, titleZh: '关于团队', titleEn: 'About Team' }, { Icon: Briefcase, titleZh: '招聘', titleEn: 'Careers' }, { Icon: Mail, titleZh: '联系我们', titleEn: 'Contact Us' }, { Icon: Newspaper, titleZh: '新闻媒体', titleEn: 'Press & Media' }, ].map(({ Icon, titleZh, titleEn }) => (
{language === 'zh' ? titleZh : titleEn}
))}
{/* Bottom */}
{language === 'zh' ? '最新更新:' : 'Latest Update: '} December 2025
{language === 'zh' ? '隐私政策' : 'Privacy Policy'} {language === 'zh' ? '服务条款' : 'Terms of Service'}
)}
{/* Theme + Language */}
{/* Theme Toggle */} {/* Language */} setLanguage(key as 'zh' | 'en')} selectedKeys={new Set([language])} classNames={{ list: "py-2" }} itemClasses={{ base: "py-3 flex items-center justify-center" }}> 中文 English
)} {/* Custom Menus */} setShowProductMenu(false)} language={language} top={navBottom} /> setShowResourceMenu(false)} language={language} top={navBottom} /> ); }