151 lines
5.3 KiB
TypeScript
151 lines
5.3 KiB
TypeScript
"use client"
|
|
|
|
import { useState, useEffect } from "react"
|
|
import Link from "next/link"
|
|
import Image from "next/image"
|
|
import { Menu, X } from "lucide-react"
|
|
import { Button } from "@/components/ui/button"
|
|
import { cn } from "@/lib/utils"
|
|
|
|
export default function Header() {
|
|
const [isMenuOpen, setIsMenuOpen] = useState(false)
|
|
const [scrolled, setScrolled] = useState(false)
|
|
const [activeSection, setActiveSection] = useState("home")
|
|
|
|
useEffect(() => {
|
|
const handleScroll = () => {
|
|
setScrolled(window.scrollY > 10)
|
|
|
|
// Determine active section based on scroll position
|
|
const sections = ["home", "about", "team-groups", "achievements", "robots", "contact"]
|
|
for (const section of sections.reverse()) {
|
|
const element = document.getElementById(section)
|
|
if (element && window.scrollY >= element.offsetTop - 100) {
|
|
setActiveSection(section)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
window.addEventListener("scroll", handleScroll)
|
|
return () => window.removeEventListener("scroll", handleScroll)
|
|
}, [])
|
|
|
|
const toggleMenu = () => {
|
|
setIsMenuOpen(!isMenuOpen)
|
|
}
|
|
|
|
const navLinks = [
|
|
{ name: "主页", href: "#home", id: "home", en: "INDEX" },
|
|
{ name: "关于", href: "#about", id: "about", en: "INFORMATION" },
|
|
{ name: "团队", href: "#team-groups", id: "team-groups", en: "OPERATOR" },
|
|
{ name: "成就", href: "#achievements", id: "achievements", en: "GAMEPLAY" },
|
|
{ name: "机器人", href: "#robots", id: "robots", en: "ROBOTS" },
|
|
{ name: "联系我们", href: "#contact", id: "contact", en: "NEWS" },
|
|
]
|
|
|
|
return (
|
|
<header
|
|
className={cn(
|
|
"fixed top-0 left-0 right-0 z-50 transition-all duration-300",
|
|
scrolled ? "bg-background/90 backdrop-blur-md" : "bg-transparent",
|
|
)}
|
|
>
|
|
<div className="flex items-center justify-between px-4 py-3">
|
|
<Link href="/" className="flex items-center gap-2 z-10">
|
|
<Image src="/logo.svg" alt="Simba Robotics Logo" width={40} height={40} className="w-10 h-10" />
|
|
<div className="flex flex-col">
|
|
<span className="font-bold text-lg tracking-wider">SIMBA</span>
|
|
<span className="text-xs text-muted-foreground font-mono">ROBOTICS</span>
|
|
</div>
|
|
</Link>
|
|
|
|
{/* Desktop Navigation */}
|
|
<nav className="hidden md:flex items-center">
|
|
{navLinks.map((link) => (
|
|
<Link
|
|
key={link.name}
|
|
href={link.href}
|
|
className={cn(
|
|
"px-6 py-2 flex flex-col items-center text-sm transition-colors",
|
|
activeSection === link.id
|
|
? "text-foreground nav-active"
|
|
: "text-muted-foreground hover:text-foreground",
|
|
)}
|
|
>
|
|
<span className="text-xs font-mono uppercase">{link.en}</span>
|
|
<span>{link.name}</span>
|
|
</Link>
|
|
))}
|
|
</nav>
|
|
|
|
<div className="flex items-center gap-2">
|
|
<Button variant="ghost" size="icon" className="button-hover-effect">
|
|
<svg
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
width="24"
|
|
height="24"
|
|
viewBox="0 0 24 24"
|
|
fill="none"
|
|
stroke="currentColor"
|
|
strokeWidth="2"
|
|
strokeLinecap="round"
|
|
strokeLinejoin="round"
|
|
className="h-5 w-5"
|
|
>
|
|
<path d="M3 18v-6a9 9 0 0 1 18 0v6"></path>
|
|
<path d="M21 19a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3zM3 19a2 2 0 0 0 2 2h1a2 2 0 0 0 2-2v-3a2 2 0 0 0-2-2H3z"></path>
|
|
</svg>
|
|
</Button>
|
|
|
|
<Button variant="ghost" size="icon" className="button-hover-effect">
|
|
<svg
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
width="24"
|
|
height="24"
|
|
viewBox="0 0 24 24"
|
|
fill="none"
|
|
stroke="currentColor"
|
|
strokeWidth="2"
|
|
strokeLinecap="round"
|
|
strokeLinejoin="round"
|
|
className="h-5 w-5"
|
|
>
|
|
<circle cx="12" cy="12" r="10"></circle>
|
|
<circle cx="12" cy="10" r="3"></circle>
|
|
<path d="M7 20.662V19a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v1.662"></path>
|
|
</svg>
|
|
</Button>
|
|
|
|
{/* Mobile Menu Button */}
|
|
<Button variant="ghost" size="icon" className="md:hidden button-hover-effect" onClick={toggleMenu}>
|
|
{isMenuOpen ? <X className="h-6 w-6" /> : <Menu className="h-6 w-6" />}
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Mobile Navigation */}
|
|
{isMenuOpen && (
|
|
<div className="md:hidden bg-background/95 backdrop-blur-md">
|
|
<nav className="flex flex-col">
|
|
{navLinks.map((link) => (
|
|
<Link
|
|
key={link.name}
|
|
href={link.href}
|
|
className={cn(
|
|
"px-4 py-3 border-b border-border/30 transition-colors flex items-center justify-between",
|
|
activeSection === link.id ? "text-primary" : "text-muted-foreground",
|
|
)}
|
|
onClick={() => setIsMenuOpen(false)}
|
|
>
|
|
<span>{link.name}</span>
|
|
<span className="text-xs font-mono uppercase">{link.en}</span>
|
|
</Link>
|
|
))}
|
|
</nav>
|
|
</div>
|
|
)}
|
|
</header>
|
|
)
|
|
}
|