// Top navigation function LangToggle({ compact }) { const { lang, setLang, t } = useLang(); const next = lang === 'en' ? 'zh' : 'en'; return ( ); } function Nav() { const { t } = useLang(); const [scrolled, setScrolled] = React.useState(false); const [menuOpen, setMenuOpen] = React.useState(false); const [ddOpen, setDdOpen] = React.useState(false); const [mobileSvcOpen, setMobileSvcOpen] = React.useState(false); const ddCloseTimer = React.useRef(null); React.useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 30); window.addEventListener('scroll', onScroll, { passive: true }); return () => window.removeEventListener('scroll', onScroll); }, []); // Lock body scroll when menu open React.useEffect(() => { document.body.style.overflow = menuOpen ? 'hidden' : ''; return () => { document.body.style.overflow = ''; }; }, [menuOpen]); const close = () => { setMenuOpen(false); setMobileSvcOpen(false); }; // Dropdown hover handlers — small delay on close so user can move down into it const openDd = () => { if (ddCloseTimer.current) clearTimeout(ddCloseTimer.current); setDdOpen(true); }; const scheduleCloseDd = () => { if (ddCloseTimer.current) clearTimeout(ddCloseTimer.current); ddCloseTimer.current = setTimeout(() => setDdOpen(false), 140); }; const services = [ { href: '/services-websites/', title: t('svc.1.title'), cn: t('svc.1.cn'), desc: t('nav.dd.1.desc'), icon: }, { href: '/services-web-apps/', title: t('svc.2.title'), cn: t('svc.2.cn'), desc: t('nav.dd.2.desc'), icon: }, { href: '/services-saas/', title: t('svc.3.title'), cn: t('svc.3.cn'), desc: t('nav.dd.3.desc'), icon: }, ]; return ( {/* Mobile slide-down menu */}
); } window.Nav = Nav; window.LangToggle = LangToggle;