From c467696fa3b332a7074fb1804915280974823114 Mon Sep 17 00:00:00 2001 From: jyswee Date: Thu, 23 Jul 2026 22:09:26 +0000 Subject: [PATCH] Seed: ecommerce template (24 files) --- src/components/Header.tsx | 148 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 src/components/Header.tsx diff --git a/src/components/Header.tsx b/src/components/Header.tsx new file mode 100644 index 0000000..3e1ba25 --- /dev/null +++ b/src/components/Header.tsx @@ -0,0 +1,148 @@ +import { useState, useEffect } from "react"; +import { Link } from "react-router-dom"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Badge } from "@/components/ui/badge"; +import { Sheet, SheetContent, SheetTrigger } from "@/components/ui/sheet"; +import { Menu, Search, ShoppingBag, User, Heart, Separator as SeparatorIcon } from "lucide-react"; +import { Separator } from "@/components/ui/separator"; +import { ThemeToggle } from "@/components/ThemeToggle"; +import { useCart } from "@/lib/cart-context"; + +const cartPreviewItems = [ + { name: "Classic Leather Jacket", price: 189, qty: 1 }, + { name: "Silk Scarf", price: 65, qty: 1 }, + { name: "Organic Cotton Tee", price: 45, qty: 2 }, +]; + +const navLinks = [ + { label: "Home", to: "/" }, + { label: "Shop", to: "/products" }, + { label: "New Arrivals", to: "/products" }, + { label: "Sale", to: "/products" }, +]; + +export default function Header() { + const [mobileOpen, setMobileOpen] = useState(false); + const [scrolled, setScrolled] = useState(false); + const { itemCount } = useCart(); + + useEffect(() => { + const onScroll = () => setScrolled(window.scrollY > 20); + window.addEventListener("scroll", onScroll); + return () => window.removeEventListener("scroll", onScroll); + }, []); + + return ( +
+ {/* Top Banner */} +
+ Free shipping on orders over $100 | Use code STYLE20 for 20% off +
+ +
+ {/* Logo */} + + StyleHaus + + + {/* Desktop Nav */} + + + {/* Right Icons */} +
+ + + + + + + +

Your Cart

+
+ {cartPreviewItems.map((item, i) => ( +
+
+

{item.name}

+

Qty: {item.qty}

+
+ \${(item.price * item.qty).toFixed(2)} +
+ ))} +
+ +
+ Subtotal + \${cartPreviewItems.reduce((s, i) => s + i.price * i.qty, 0).toFixed(2)} +
+
+ + +
+
+
+ + + + {/* Mobile Menu */} + + + + + + + + +
+
+
+ ); +}