初始提交:AI医疗展示网站,包含回到顶部按钮功能(排除大文件)

This commit is contained in:
高浩然
2025-06-26 17:47:01 +08:00
commit a6e406539f
78 changed files with 17704 additions and 0 deletions

137
src/components/Header.jsx Normal file
View File

@@ -0,0 +1,137 @@
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;