← back to Angels Flowers
components/Navbar.tsx
131 lines
'use client'
import { useState, useEffect } from 'react'
import Link from 'next/link'
import { usePathname } from 'next/navigation'
import { FaPhone, FaBars, FaTimes } from 'react-icons/fa'
import ThemeToggle from './ThemeToggle'
const navigation = [
{ name: 'Home', href: '/' },
{ name: 'Flowers', href: '/flowers' },
{ name: 'Our Story', href: '/about' },
{ name: 'Contact', href: '/contact' },
]
export default function Navbar() {
const [isScrolled, setIsScrolled] = useState(false)
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false)
const pathname = usePathname()
useEffect(() => {
const handleScroll = () => {
setIsScrolled(window.scrollY > 10)
}
window.addEventListener('scroll', handleScroll)
return () => window.removeEventListener('scroll', handleScroll)
}, [])
const isActive = (path: string) => pathname === path
return (
<nav
className={`fixed top-0 left-0 right-0 z-50 transition-all duration-300 ${
isScrolled
? 'bg-white dark:bg-gray-900 shadow-md dark:shadow-gray-900/50 py-2'
: 'bg-white/95 dark:bg-gray-900/95 backdrop-blur-sm py-4'
}`}
>
<div className="container-custom">
<div className="flex items-center justify-between">
{/* Logo */}
<Link href="/" className="flex items-center space-x-2">
<div className="w-10 h-10 bg-gradient-to-br from-primary-500 to-primary-600 rounded-full flex items-center justify-center">
<span className="text-white text-xl font-bold">A</span>
</div>
<div className="flex flex-col">
<span className="font-serif text-xl font-bold text-gray-900 dark:text-white leading-tight">
Angel's Flowers
</span>
<span className="text-xs text-gray-600 dark:text-gray-400 leading-tight">
East Los Angeles
</span>
</div>
</Link>
{/* Desktop Navigation */}
<div className="hidden md:flex items-center space-x-8">
{navigation.map((item) => (
<Link
key={item.name}
href={item.href}
className={`text-sm font-medium transition-colors duration-200 ${
isActive(item.href)
? 'text-primary-600 dark:text-primary-400'
: 'text-gray-700 dark:text-gray-300 hover:text-primary-600 dark:hover:text-primary-400'
}`}
>
{item.name}
</Link>
))}
<ThemeToggle />
<a
href="tel:+13231234567"
className="flex items-center space-x-2 text-sm font-medium text-white bg-primary-600 hover:bg-primary-700 dark:bg-primary-500 dark:hover:bg-primary-600 px-4 py-2 rounded-md transition-colors duration-200"
>
<FaPhone className="text-xs" />
<span>(323) 123-4567</span>
</a>
</div>
{/* Mobile Menu Button */}
<div className="md:hidden flex items-center space-x-2">
<ThemeToggle />
<button
onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}
className="p-2 rounded-md text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors duration-200"
aria-label="Toggle menu"
>
{isMobileMenuOpen ? (
<FaTimes className="w-6 h-6" />
) : (
<FaBars className="w-6 h-6" />
)}
</button>
</div>
</div>
{/* Mobile Menu */}
{isMobileMenuOpen && (
<div className="md:hidden mt-4 pb-4 border-t border-gray-200 dark:border-gray-700">
<div className="pt-4 space-y-3">
{navigation.map((item) => (
<Link
key={item.name}
href={item.href}
onClick={() => setIsMobileMenuOpen(false)}
className={`block px-4 py-2 rounded-md text-base font-medium transition-colors duration-200 ${
isActive(item.href)
? 'text-primary-600 dark:text-primary-400 bg-primary-50 dark:bg-primary-900/20'
: 'text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800'
}`}
>
{item.name}
</Link>
))}
<a
href="tel:+13231234567"
className="flex items-center justify-center space-x-2 px-4 py-3 rounded-md text-base font-medium text-white bg-primary-600 hover:bg-primary-700 dark:bg-primary-500 dark:hover:bg-primary-600 transition-colors duration-200"
>
<FaPhone className="text-sm" />
<span>(323) 123-4567</span>
</a>
</div>
</div>
)}
</div>
</nav>
)
}