File size: 1,999 Bytes
59bd45e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | import React from 'react';
import { Home, NotebookPen, Users, User } from 'lucide-react';
import { Tab } from '../types';
interface BottomNavProps {
currentTab: Tab;
onTabChange: (tab: Tab) => void;
}
export const BottomNav: React.FC<BottomNavProps> = ({ currentTab, onTabChange }) => {
const navItems = [
{ id: Tab.HOME, label: '首页', icon: Home },
{ id: Tab.RECORD, label: '记录', icon: NotebookPen },
{ id: Tab.COMMUNITY, label: '社区', icon: Users },
{ id: Tab.MINE, label: '我的', icon: User },
];
return (
<div className="fixed bottom-0 left-0 right-0 z-[150] px-6 pb-6 pt-2">
<nav className="relative bg-white/70 backdrop-blur-xl shadow-lg shadow-purple-100/50 rounded-3xl flex justify-between items-center px-6 py-4 max-w-md mx-auto ring-1 ring-white/50">
{navItems.map((item) => {
const isActive = currentTab === item.id;
return (
<button
key={item.id}
onClick={() => onTabChange(item.id)}
className="relative flex flex-col items-center justify-center gap-1 w-12 h-12 transition-all duration-300"
>
<div
className={`
absolute inset-0 rounded-full transition-all duration-500
${isActive ? 'bg-gradient-to-br from-pink-100 to-purple-100 opacity-100 scale-100' : 'opacity-0 scale-75'}
`}
/>
<item.icon
size={22}
strokeWidth={isActive ? 2 : 1.5}
className={`relative z-10 transition-colors duration-300 ${isActive ? 'text-purple-600' : 'text-slate-400'}`}
/>
<span
className={`relative z-10 text-[10px] font-medium transition-colors duration-300 ${isActive ? 'text-purple-700' : 'text-slate-400'}`}
>
{item.label}
</span>
</button>
);
})}
</nav>
</div>
);
}; |