Seed: wedding template (15 files)
This commit is contained in:
@@ -0,0 +1,61 @@
|
|||||||
|
import { useState, useEffect } from "react";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
|
import { Sheet, SheetContent, SheetTrigger } from "@/components/ui/sheet";
|
||||||
|
import { Menu, Heart } from "lucide-react";
|
||||||
|
import { ThemeToggle } from "@/components/ThemeToggle";
|
||||||
|
|
||||||
|
export default function Header() {
|
||||||
|
const [open, setOpen] = useState(false);
|
||||||
|
const [scrolled, setScrolled] = useState(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const fn = () => setScrolled(window.scrollY > 20);
|
||||||
|
window.addEventListener("scroll", fn);
|
||||||
|
return () => window.removeEventListener("scroll", fn);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const links = [
|
||||||
|
{ label: "Our Story", to: "/#story" },
|
||||||
|
{ label: "Details", to: "/details" },
|
||||||
|
{ label: "Gallery", to: "/gallery" },
|
||||||
|
{ label: "RSVP", to: "/rsvp" },
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<header className={`fixed top-0 inset-x-0 z-50 transition-all duration-300 \${scrolled ? "bg-white/90 dark:bg-stone-950/90 backdrop-blur-lg border-b border-rose-100 dark:border-stone-800 shadow-sm" : "bg-transparent"}`}>
|
||||||
|
<div className="mx-auto max-w-7xl flex items-center justify-between px-6 py-4">
|
||||||
|
<Link to="/" className="font-serif text-xl md:text-2xl tracking-tight text-rose-800 dark:text-rose-300 hover:text-rose-600 transition-colors flex items-center gap-2">
|
||||||
|
Sarah & James <Heart className="h-4 w-4 fill-rose-400 text-rose-400" />
|
||||||
|
</Link>
|
||||||
|
<nav className="hidden md:flex items-center gap-8">
|
||||||
|
{links.map((l) => (
|
||||||
|
<Link key={l.to} to={l.to} className="text-sm text-stone-600 dark:text-stone-300 hover:text-rose-500 dark:hover:text-rose-400 transition-colors font-medium">{l.label}</Link>
|
||||||
|
))}
|
||||||
|
</nav>
|
||||||
|
<div className="hidden md:flex items-center gap-3">
|
||||||
|
<ThemeToggle />
|
||||||
|
<Button asChild size="sm" className="bg-rose-400 hover:bg-rose-500 active:scale-[0.98] text-white rounded-full px-6">
|
||||||
|
<Link to="/rsvp">RSVP</Link>
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
<Sheet open={open} onOpenChange={setOpen}>
|
||||||
|
<SheetTrigger asChild className="md:hidden">
|
||||||
|
<Button variant="ghost" size="icon" className="text-rose-700 dark:text-rose-300"><Menu className="h-5 w-5" /></Button>
|
||||||
|
</SheetTrigger>
|
||||||
|
<SheetContent side="right" className="w-72 bg-white dark:bg-stone-950 border-rose-100 dark:border-stone-800">
|
||||||
|
<nav className="mt-8 flex flex-col gap-4">
|
||||||
|
{links.map((l) => (
|
||||||
|
<Link key={l.to} to={l.to} className="text-lg font-serif text-stone-700 dark:text-stone-200 hover:text-rose-500 transition-colors" onClick={() => setOpen(false)}>{l.label}</Link>
|
||||||
|
))}
|
||||||
|
<Button asChild className="mt-4 w-full bg-rose-400 hover:bg-rose-500 active:scale-[0.98] text-white rounded-full">
|
||||||
|
<Link to="/rsvp" onClick={() => setOpen(false)}>RSVP</Link>
|
||||||
|
</Button>
|
||||||
|
<ThemeToggle />
|
||||||
|
</nav>
|
||||||
|
</SheetContent>
|
||||||
|
</Sheet>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user