Spaces:
Sleeping
Sleeping
File size: 4,954 Bytes
4bea261 | 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | import { useState, useEffect } from 'react';
import { Search, Menu, X } from 'lucide-react';
const navLinks = [
{ href: '/', label: 'Trang chủ' },
{ href: '/danh-sach/phim-le', label: 'Phim Lẻ' },
{ href: '/danh-sach/phim-bo', label: 'Phim Bộ' },
{ href: '/danh-sach/hoat-hinh', label: 'Hoạt hình' },
];
export default function Header() {
const [scrolled, setScrolled] = useState(false);
const [menuOpen, setMenuOpen] = useState(false);
const [query, setQuery] = useState('');
const [mounted, setMounted] = useState(false);
useEffect(() => {
setMounted(true);
const onScroll = () => setScrolled(window.scrollY > 20);
window.addEventListener('scroll', onScroll);
return () => window.removeEventListener('scroll', onScroll);
}, []);
const handleSearch = (e) => {
e.preventDefault();
if (query.trim()) {
window.location.href = `/tim-kiem?q=${encodeURIComponent(query.trim())}`;
}
};
if (!mounted) {
return (
<header className="fixed top-0 left-0 right-0 z-50 bg-black/90 opacity-0">
<div className="mx-auto max-w-[1400px] px-4 py-2.5">
<div className="text-2xl font-black text-white">T<span className="text-primary">PHIM</span>X</div>
</div>
</header>
);
}
return (
<header
suppressHydrationWarning
className={`fixed top-0 left-0 right-0 z-50 transition-all duration-500 ${scrolled ? 'glass bg-black/70 shadow-2xl' : 'bg-gradient-to-b from-black/95 to-transparent'}`}
>
{/* Row 1: Logo + Search + Auth */}
<div suppressHydrationWarning className="mx-auto flex max-w-[1400px] items-center justify-between px-4 lg:px-6 py-2.5">
<a href="/" className="flex items-center shrink-0 transition-transform hover:scale-[1.02] active:scale-95">
<div className="h-9 md:h-10 w-auto overflow-hidden">
<img src="/logo-full.png" className="h-full w-full object-contain" alt="TPHIMX" />
</div>
</a>
<form onSubmit={handleSearch} className="hidden md:flex items-center flex-1 max-w-md mx-6 rounded-lg bg-white/[0.06] border border-white/[0.06] px-4 py-2 focus-within:bg-white/10 focus-within:border-primary/30 transition-all">
<Search size={12} className="text-gray-500 mr-3 shrink-0" />
<input
type="text"
placeholder="Tìm kiếm phim, diễn viên..."
value={query}
onChange={(e) => setQuery(e.target.value)}
className="flex-1 bg-transparent text-xs font-medium text-white outline-none placeholder:text-gray-500"
/>
</form>
<div suppressHydrationWarning className="flex items-center gap-2 shrink-0">
<button onClick={() => setMenuOpen(!menuOpen)} className="flex h-10 w-10 items-center justify-center rounded-lg bg-white/5 text-white transition-all hover:bg-primary hover:text-dark md:hidden">
{menuOpen ? <X size={18} /> : <Menu size={18} />}
</button>
</div>
</div>
{/* Row 2: Nav Bar */}
<nav suppressHydrationWarning className={`hidden md:block border-t border-white/[0.04] ${scrolled ? 'bg-transparent' : 'bg-black/20'}`}>
<div className="mx-auto max-w-[1400px] flex items-center gap-0.5 px-4 lg:px-6 py-0 text-[11px] font-bold">
{navLinks.map((link) => (
<a key={link.href} href={link.href} className="px-4 py-2.5 text-gray-400 hover:text-white hover:bg-white/5 rounded-lg transition-all whitespace-nowrap">
{link.label}
</a>
))}
<a href="/dien-vien" className="px-4 py-2.5 text-gray-400 hover:text-white hover:bg-white/5 rounded-lg transition-all whitespace-nowrap">Diễn viên</a>
<a href="/lich-chieu" className="px-4 py-2.5 text-gray-400 hover:text-white hover:bg-white/5 rounded-lg transition-all whitespace-nowrap">Lịch chiếu</a>
</div>
</nav>
{/* Mobile Menu */}
{menuOpen && (
<div suppressHydrationWarning className="glass flex flex-col border-t border-white/5 bg-black/95 p-4 md:hidden">
{navLinks.map((link) => (
<a key={link.href} href={link.href} className="flex items-center justify-between rounded-xl px-5 py-4 text-xs font-bold text-gray-300 transition-all active:scale-95 active:bg-primary active:text-dark" onClick={() => setMenuOpen(false)}>
{link.label}
<i className="fas fa-chevron-right text-[9px] opacity-30"></i>
</a>
))}
<a href="/dien-vien" className="flex items-center justify-between rounded-xl px-5 py-4 text-xs font-bold text-gray-300 transition-all" onClick={() => setMenuOpen(false)}>Diễn viên</a>
<a href="/lich-chieu" className="flex items-center justify-between rounded-xl px-5 py-4 text-xs font-bold text-gray-300 transition-all" onClick={() => setMenuOpen(false)}>Lịch chiếu</a>
</div>
)}
</header>
);
}
|