138 lines
4.8 KiB
JavaScript
138 lines
4.8 KiB
JavaScript
import React, { useState, useEffect } from 'react';
|
|
import { motion } from 'framer-motion';
|
|
import { Menu, X, Brain, Heart, Activity } from 'lucide-react';
|
|
|
|
const Header = () => {
|
|
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
|
const [isScrolled, setIsScrolled] = useState(false);
|
|
|
|
useEffect(() => {
|
|
const handleScroll = () => {
|
|
setIsScrolled(window.scrollY > 50);
|
|
};
|
|
window.addEventListener('scroll', handleScroll);
|
|
return () => window.removeEventListener('scroll', handleScroll);
|
|
}, []);
|
|
|
|
const scrollToSection = (sectionId) => {
|
|
const element = document.getElementById(sectionId);
|
|
if (element) {
|
|
element.scrollIntoView({ behavior: 'smooth' });
|
|
}
|
|
setIsMenuOpen(false);
|
|
};
|
|
|
|
const navItems = [
|
|
{ id: 'hero', label: '首页' },
|
|
{ id: 'company', label: '关于我们' },
|
|
{ id: 'products', label: '产品矩阵' },
|
|
{ id: 'scenarios', label: 'AI应用' },
|
|
{ id: 'architecture', label: '系统架构' },
|
|
{ id: 'vision', label: '未来愿景' },
|
|
{ id: 'contact', label: '总结展望' }
|
|
];
|
|
|
|
return (
|
|
<motion.header
|
|
className={`fixed top-0 left-0 right-0 z-50 transition-all duration-300 ${
|
|
isScrolled ? 'bg-white/95 backdrop-blur-md shadow-lg' : 'bg-transparent'
|
|
}`}
|
|
initial={{ y: -100 }}
|
|
animate={{ y: 0 }}
|
|
transition={{ duration: 0.5 }}
|
|
>
|
|
<div className="container-custom">
|
|
<div className="flex items-center justify-between py-4">
|
|
{/* Logo */}
|
|
<motion.div
|
|
className="flex items-center space-x-3"
|
|
whileHover={{ scale: 1.05 }}
|
|
transition={{ type: "spring", stiffness: 400, damping: 10 }}
|
|
>
|
|
<div className="relative">
|
|
<div className="w-10 h-10 medical-gradient rounded-lg flex items-center justify-center">
|
|
<Brain className="w-6 h-6 text-white" />
|
|
</div>
|
|
<div className="absolute -top-1 -right-1 w-4 h-4 bg-blue-500 rounded-full flex items-center justify-center">
|
|
<Activity className="w-2 h-2 text-white" />
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<h1 className={`text-xl font-bold ${isScrolled ? 'text-gray-900' : 'text-white'}`}>
|
|
数曜科技
|
|
</h1>
|
|
<p className={`text-sm ${isScrolled ? 'text-gray-600' : 'text-white/80'}`}>
|
|
AI赋能医疗与健康
|
|
</p>
|
|
</div>
|
|
</motion.div>
|
|
|
|
{/* Desktop Navigation */}
|
|
<nav className="hidden md:flex items-center space-x-8">
|
|
{navItems.map((item, index) => (
|
|
<motion.button
|
|
key={item.id}
|
|
onClick={() => scrollToSection(item.id)}
|
|
className={`text-sm font-medium transition-colors hover:text-blue-600 ${
|
|
isScrolled ? 'text-gray-700' : 'text-white'
|
|
}`}
|
|
whileHover={{ scale: 1.05 }}
|
|
whileTap={{ scale: 0.95 }}
|
|
initial={{ opacity: 0, y: -20 }}
|
|
animate={{ opacity: 1, y: 0 }}
|
|
transition={{ delay: index * 0.1 }}
|
|
>
|
|
{item.label}
|
|
</motion.button>
|
|
))}
|
|
</nav>
|
|
|
|
{/* Mobile Menu Button */}
|
|
<motion.button
|
|
className={`md:hidden p-2 rounded-lg ${
|
|
isScrolled ? 'text-gray-700' : 'text-white'
|
|
}`}
|
|
onClick={() => setIsMenuOpen(!isMenuOpen)}
|
|
whileTap={{ scale: 0.95 }}
|
|
>
|
|
{isMenuOpen ? <X className="w-6 h-6" /> : <Menu className="w-6 h-6" />}
|
|
</motion.button>
|
|
</div>
|
|
|
|
{/* Mobile Navigation */}
|
|
{isMenuOpen && (
|
|
<motion.nav
|
|
className="md:hidden py-4 border-t border-white/20"
|
|
initial={{ opacity: 0, height: 0 }}
|
|
animate={{ opacity: 1, height: 'auto' }}
|
|
exit={{ opacity: 0, height: 0 }}
|
|
transition={{ duration: 0.3 }}
|
|
>
|
|
<div className="space-y-3">
|
|
{navItems.map((item, index) => (
|
|
<motion.button
|
|
key={item.id}
|
|
onClick={() => scrollToSection(item.id)}
|
|
className={`block w-full text-left py-2 px-4 rounded-lg transition-colors ${
|
|
isScrolled
|
|
? 'text-gray-700 hover:bg-gray-100'
|
|
: 'text-white hover:bg-white/10'
|
|
}`}
|
|
initial={{ opacity: 0, x: -20 }}
|
|
animate={{ opacity: 1, x: 0 }}
|
|
transition={{ delay: index * 0.1 }}
|
|
>
|
|
{item.label}
|
|
</motion.button>
|
|
))}
|
|
</div>
|
|
</motion.nav>
|
|
)}
|
|
</div>
|
|
</motion.header>
|
|
);
|
|
};
|
|
|
|
export default Header;
|
|
|