153 lines
6.0 KiB
TypeScript
Executable File
153 lines
6.0 KiB
TypeScript
Executable File
"use client"
|
|
|
|
import Link from "next/link"
|
|
import { useState, useEffect } from "react"
|
|
import { Menu, X, Phone, ArrowRight } from "lucide-react"
|
|
import { Button } from "@/components/ui/button"
|
|
import { HpsLogo } from "@/components/hps-logo"
|
|
import { cn } from "@/lib/utils"
|
|
|
|
export function SiteHeader() {
|
|
const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
|
|
const [scrolled, setScrolled] = useState(false)
|
|
|
|
useEffect(() => {
|
|
const handleScroll = () => {
|
|
setScrolled(window.scrollY > 20)
|
|
}
|
|
window.addEventListener("scroll", handleScroll)
|
|
return () => window.removeEventListener("scroll", handleScroll)
|
|
}, [])
|
|
|
|
const navigation = [
|
|
{ name: "Home", href: "/" },
|
|
{ name: "Services", href: "/services" },
|
|
{ name: "Resources", href: "/resources" },
|
|
{ name: "Blog", href: "/blog" },
|
|
{ name: "Contact", href: "/contact" },
|
|
]
|
|
|
|
return (
|
|
<header
|
|
className={cn(
|
|
"fixed top-0 left-0 right-0 z-50 transition-all duration-500 ease-in-out",
|
|
scrolled ? "bg-white/90 backdrop-blur-xl py-3 shadow-sm" : "bg-transparent py-6",
|
|
)}
|
|
>
|
|
<div className="container mx-auto px-6 md:px-12">
|
|
<div className="flex items-center justify-between">
|
|
{/* Logo */}
|
|
<div className="flex-shrink-0 relative z-50">
|
|
<div className="block group">
|
|
<HpsLogo size={scrolled ? "sm" : "md"} className="transition-all duration-500" />
|
|
</div>
|
|
</div>
|
|
|
|
{/* Desktop Navigation - Minimalist Centered */}
|
|
<div className="hidden md:flex items-center justify-center absolute left-1/2 transform -translate-x-1/2">
|
|
<nav className="flex items-center gap-1 bg-white/80 backdrop-blur-md px-2 py-1.5 rounded-full border border-gray-100 shadow-sm">
|
|
{navigation.map((item) => (
|
|
<Link
|
|
key={item.name}
|
|
href={item.href}
|
|
className="px-5 py-2 text-sm font-medium text-gray-600 hover:text-deep-navy hover:bg-gray-50 rounded-full transition-all duration-300"
|
|
>
|
|
{item.name}
|
|
</Link>
|
|
))}
|
|
</nav>
|
|
</div>
|
|
|
|
{/* Right Side Actions */}
|
|
<div className="hidden md:flex items-center gap-6">
|
|
<a
|
|
href="tel:7199008850"
|
|
className={cn(
|
|
"group flex items-center gap-2 text-sm font-semibold transition-colors",
|
|
scrolled ? "text-gray-600 hover:text-deep-navy" : "text-white/90 hover:text-white",
|
|
)}
|
|
>
|
|
<span
|
|
className={cn(
|
|
"w-8 h-8 rounded-full flex items-center justify-center transition-colors",
|
|
scrolled
|
|
? "bg-gray-100 group-hover:bg-hps-blue/10 group-hover:text-hps-blue"
|
|
: "bg-white/10 backdrop-blur-sm text-white group-hover:bg-white/20",
|
|
)}
|
|
>
|
|
<Phone className="h-3.5 w-3.5" />
|
|
</span>
|
|
<span className="hidden lg:inline">719.900.8850</span>
|
|
</a>
|
|
<Button className="rounded-full bg-deep-navy hover:bg-hps-blue text-white px-6 font-medium transition-all duration-300 shadow-lg shadow-deep-navy/20 hover:shadow-hps-blue/30">
|
|
Get a Quote
|
|
</Button>
|
|
</div>
|
|
|
|
{/* Mobile Navigation Toggle */}
|
|
<div className="md:hidden flex items-center gap-4 z-50">
|
|
<Button
|
|
variant="ghost"
|
|
size="icon"
|
|
onClick={() => setMobileMenuOpen(!mobileMenuOpen)}
|
|
className={cn(
|
|
"relative z-50 rounded-full w-12 h-12 transition-colors",
|
|
scrolled || mobileMenuOpen ? "text-deep-navy hover:bg-gray-100" : "text-white hover:bg-white/10",
|
|
)}
|
|
>
|
|
{mobileMenuOpen ? <X className="h-6 w-6" /> : <Menu className="h-6 w-6" />}
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Mobile Navigation Overlay */}
|
|
<div
|
|
className={cn(
|
|
"fixed inset-0 bg-white z-[60] transition-all duration-500 ease-in-out md:hidden flex flex-col justify-center",
|
|
mobileMenuOpen ? "opacity-100 translate-y-0" : "opacity-0 -translate-y-full pointer-events-none",
|
|
)}
|
|
>
|
|
{/* Close Button in Mobile Menu */}
|
|
<div className="absolute top-6 right-6 z-[70]">
|
|
<Button
|
|
variant="ghost"
|
|
size="icon"
|
|
onClick={() => setMobileMenuOpen(false)}
|
|
className="rounded-full w-12 h-12 text-deep-navy hover:bg-gray-100"
|
|
>
|
|
<X className="h-6 w-6" />
|
|
</Button>
|
|
</div>
|
|
|
|
<div className="container mx-auto px-6 py-12 flex flex-col gap-8">
|
|
<nav className="flex flex-col gap-6">
|
|
{navigation.map((item, index) => (
|
|
<Link
|
|
key={item.name}
|
|
href={item.href}
|
|
className="text-4xl font-bold text-deep-navy hover:text-hps-blue transition-colors flex items-center justify-between group border-b border-gray-100 pb-4"
|
|
onClick={() => setMobileMenuOpen(false)}
|
|
style={{ transitionDelay: `${index * 50}ms` }}
|
|
>
|
|
{item.name}
|
|
<ArrowRight className="h-6 w-6 opacity-0 -translate-x-4 group-hover:opacity-100 group-hover:translate-x-0 transition-all duration-300 text-hps-cyan" />
|
|
</Link>
|
|
))}
|
|
</nav>
|
|
|
|
<div className="mt-8 flex flex-col gap-6">
|
|
<a href="tel:7199008850" className="text-xl font-medium text-gray-600 flex items-center gap-3">
|
|
<div className="w-10 h-10 rounded-full bg-gray-100 flex items-center justify-center text-deep-navy">
|
|
<Phone className="h-5 w-5" />
|
|
</div>
|
|
719.900.8850
|
|
</a>
|
|
<Button className="w-full bg-deep-navy text-white py-6 text-lg rounded-full mt-4">Get a Quote</Button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
)
|
|
}
|