This commit is contained in:
gpt-engineer-app[bot]
2026-03-05 15:50:22 +00:00
parent b331aa1a7d
commit a11683b7dc
23 changed files with 2958 additions and 96 deletions

80
src/components/Navbar.tsx Normal file
View File

@@ -0,0 +1,80 @@
import { useState, useEffect } from "react";
import { motion } from "framer-motion";
import { Menu, X } from "lucide-react";
import { NAV_LINKS } from "@/data/event-data";
/**
* Navbar sticky con menú responsive.
* Los links se definen en event-data.ts
*/
const Navbar = () => {
const [scrolled, setScrolled] = useState(false);
const [menuOpen, setMenuOpen] = useState(false);
useEffect(() => {
const onScroll = () => setScrolled(window.scrollY > 50);
window.addEventListener("scroll", onScroll);
return () => window.removeEventListener("scroll", onScroll);
}, []);
return (
<nav
className={`fixed top-0 left-0 right-0 z-50 transition-all duration-300 ${
scrolled
? "bg-background/95 backdrop-blur-md shadow-card"
: "bg-transparent"
}`}
>
<div className="container mx-auto flex items-center justify-between px-4 py-3">
{/* Logo */}
<a href="#" className="font-display text-xl font-bold text-gradient">
ZoukLambadaBCN
</a>
{/* Desktop links */}
<div className="hidden md:flex items-center gap-6">
{NAV_LINKS.map((link) => (
<a
key={link.href}
href={link.href}
className="text-sm font-medium text-foreground/80 hover:text-primary transition-colors"
>
{link.label}
</a>
))}
</div>
{/* Mobile toggle */}
<button
className="md:hidden text-foreground"
onClick={() => setMenuOpen(!menuOpen)}
aria-label="Toggle menu"
>
{menuOpen ? <X size={24} /> : <Menu size={24} />}
</button>
</div>
{/* Mobile menu */}
{menuOpen && (
<motion.div
initial={{ opacity: 0, y: -10 }}
animate={{ opacity: 1, y: 0 }}
className="md:hidden bg-background/98 backdrop-blur-md border-t border-border px-4 pb-4"
>
{NAV_LINKS.map((link) => (
<a
key={link.href}
href={link.href}
onClick={() => setMenuOpen(false)}
className="block py-3 text-sm font-medium text-foreground/80 hover:text-primary transition-colors border-b border-border/50"
>
{link.label}
</a>
))}
</motion.div>
)}
</nav>
);
};
export default Navbar;