← back to Watches
src/components/EnhancedHeader.jsx
171 lines
import React, { useState, useEffect } from 'react';
import { motion } from 'framer-motion';
import { FiSun, FiMoon, FiBarChart2, FiList, FiLayers, FiMenu, FiX, FiSearch } from 'react-icons/fi';
import { useDarkMode } from '../hooks/useLocalStorage';
/**
* Premium luxury header with glass morphism design
*/
function EnhancedHeader({ view, setView }) {
const [darkMode, setDarkMode] = useDarkMode();
const [isScrolled, setIsScrolled] = useState(false);
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
useEffect(() => {
const handleScroll = () => setIsScrolled(window.scrollY > 20);
window.addEventListener('scroll', handleScroll);
return () => window.removeEventListener('scroll', handleScroll);
}, []);
const navItems = [
{ id: 'dashboard', label: 'Dashboard', icon: FiBarChart2 },
{ id: 'list', label: 'Collection', icon: FiList },
{ id: 'compare', label: 'Compare', icon: FiLayers }
];
return (
<header
className={`fixed top-0 left-0 right-0 z-50 transition-all duration-300 ${
isScrolled
? 'bg-slate-900/95 backdrop-blur-lg shadow-xl border-b border-amber-500/20'
: 'bg-transparent'
}`}
>
<div className="container mx-auto px-4 md:px-6">
<div className="flex items-center justify-between h-16 md:h-20">
{/* Logo */}
<motion.div
initial={{ opacity: 0, x: -20 }}
animate={{ opacity: 1, x: 0 }}
className="flex items-center gap-3"
>
<div className="relative">
<div className="w-10 h-10 md:w-12 md:h-12 rounded-full bg-gradient-to-br from-amber-400 to-amber-600 flex items-center justify-center shadow-lg shadow-amber-500/30">
<span className="text-xl md:text-2xl">Ω</span>
</div>
<div className="absolute -bottom-1 -right-1 w-4 h-4 bg-green-500 rounded-full border-2 border-slate-900 animate-pulse" />
</div>
<div className="hidden sm:block">
<h1 className="text-lg md:text-xl font-bold text-white tracking-wide">
OMEGA <span className="text-amber-400">VAULT</span>
</h1>
<p className="text-[10px] md:text-xs text-gray-400 uppercase tracking-[0.2em]">
Price Intelligence
</p>
</div>
</motion.div>
{/* Desktop Navigation */}
<nav className="hidden md:flex items-center gap-1">
{navItems.map((item, index) => {
const Icon = item.icon;
const isActive = view === item.id;
return (
<motion.button
key={item.id}
initial={{ opacity: 0, y: -10 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: index * 0.1 }}
onClick={() => setView(item.id)}
className={`relative flex items-center gap-2 px-5 py-2.5 rounded-lg font-medium transition-all ${
isActive
? 'text-amber-400'
: 'text-gray-300 hover:text-white'
}`}
>
<Icon className="text-lg" />
<span className="text-sm">{item.label}</span>
{isActive && (
<motion.div
layoutId="activeTab"
className="absolute inset-0 bg-amber-500/10 border border-amber-500/30 rounded-lg -z-10"
transition={{ type: "spring", bounce: 0.2, duration: 0.6 }}
/>
)}
</motion.button>
);
})}
</nav>
{/* Right Side Actions */}
<div className="flex items-center gap-2 md:gap-4">
{/* Search Button */}
<motion.button
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
className="p-2.5 text-gray-400 hover:text-white hover:bg-white/10 rounded-lg transition-colors"
>
<FiSearch className="text-lg" />
</motion.button>
{/* Dark Mode Toggle */}
<motion.button
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
onClick={() => setDarkMode(!darkMode)}
className="p-2.5 text-gray-400 hover:text-white hover:bg-white/10 rounded-lg transition-colors"
title={darkMode ? 'Switch to light mode' : 'Switch to dark mode'}
>
{darkMode ? <FiSun className="text-lg" /> : <FiMoon className="text-lg" />}
</motion.button>
{/* CTA Button */}
<motion.button
whileHover={{ scale: 1.02 }}
whileTap={{ scale: 0.98 }}
className="hidden lg:flex items-center gap-2 px-5 py-2.5 bg-gradient-to-r from-amber-500 to-amber-600 hover:from-amber-600 hover:to-amber-700 text-black font-semibold text-sm rounded-lg shadow-lg shadow-amber-500/25 transition-all"
>
<span>Get Alerts</span>
</motion.button>
{/* Mobile Menu Button */}
<motion.button
whileTap={{ scale: 0.95 }}
onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}
className="md:hidden p-2.5 text-gray-400 hover:text-white hover:bg-white/10 rounded-lg transition-colors"
>
{isMobileMenuOpen ? <FiX className="text-xl" /> : <FiMenu className="text-xl" />}
</motion.button>
</div>
</div>
{/* Mobile Menu */}
{isMobileMenuOpen && (
<motion.div
initial={{ opacity: 0, height: 0 }}
animate={{ opacity: 1, height: 'auto' }}
exit={{ opacity: 0, height: 0 }}
className="md:hidden py-4 border-t border-gray-700"
>
<nav className="flex flex-col gap-2">
{navItems.map((item) => {
const Icon = item.icon;
const isActive = view === item.id;
return (
<button
key={item.id}
onClick={() => {
setView(item.id);
setIsMobileMenuOpen(false);
}}
className={`flex items-center gap-3 px-4 py-3 rounded-lg transition-colors ${
isActive
? 'bg-amber-500/10 text-amber-400 border border-amber-500/30'
: 'text-gray-300 hover:bg-white/5'
}`}
>
<Icon className="text-lg" />
<span className="font-medium">{item.label}</span>
</button>
);
})}
</nav>
</motion.div>
)}
</div>
</header>
);
}
export default EnhancedHeader;