, 'children'> {
+ isOpen: boolean
+ onClick: () => void
+}
+
+export function MobileMenuButton({ isOpen, onClick, className, ...props }: MobileMenuButtonProps) {
+ return (
+
+ )
+}
diff --git a/src/components/navigation/Navbar.tsx b/src/components/navigation/Navbar.tsx
index c92e9cd..467c184 100644
--- a/src/components/navigation/Navbar.tsx
+++ b/src/components/navigation/Navbar.tsx
@@ -1,46 +1,91 @@
import { Container, Logo } from '@/components/ui'
import { cn } from '@/lib/cn'
-import { Link } from '@tanstack/react-router'
+import { Link, useRouter } from '@tanstack/react-router'
+import { useEffect, useState } from 'react'
+import { MobileMenu } from './MobileMenu'
+import { MobileMenuButton } from './MobileMenuButton'
+import { ctaLink, navLinks } from './navLinks'
interface NavbarProps {
className?: string
}
export function Navbar({ className }: NavbarProps) {
+ const [isMenuOpen, setIsMenuOpen] = useState(false)
+ const router = useRouter()
+
+ // Close menu on route change
+ useEffect(() => {
+ return router.subscribe('onBeforeNavigate', () => {
+ setIsMenuOpen(false)
+ })
+ }, [router])
+
+ // Close menu when viewport crosses md breakpoint
+ useEffect(() => {
+ const mediaQuery = window.matchMedia('(min-width: 768px)')
+ const handleChange = () => {
+ if (mediaQuery.matches) {
+ setIsMenuOpen(false)
+ }
+ }
+ mediaQuery.addEventListener('change', handleChange)
+ return () => mediaQuery.removeEventListener('change', handleChange)
+ }, [])
+
return (
-
-
-
-
-
+
+ {/* Desktop Navigation */}
+
+ {navLinks.map((link) => (
+
+ {link.label}
+
+ ))}
+
+ {ctaLink.label}
+
+
+
+ {/* Mobile Navigation Controls */}
+
+
+ {ctaLink.label}
+
+ setIsMenuOpen((prev) => !prev)}
+ />
+
+
+
+
+
+ {/* Mobile Menu Overlay */}
+ setIsMenuOpen(false)} links={navLinks} />
+ >
)
}
diff --git a/src/components/navigation/index.ts b/src/components/navigation/index.ts
index 0a0c674..acb235b 100644
--- a/src/components/navigation/index.ts
+++ b/src/components/navigation/index.ts
@@ -1,3 +1,4 @@
export { NavLink } from './NavLink'
export { Navbar } from './Navbar'
export { Footer } from './Footer'
+export { navLinks, ctaLink, type NavLinkItem } from './navLinks'
diff --git a/src/components/navigation/navLinks.ts b/src/components/navigation/navLinks.ts
new file mode 100644
index 0000000..617ff2a
--- /dev/null
+++ b/src/components/navigation/navLinks.ts
@@ -0,0 +1,14 @@
+export interface NavLinkItem {
+ href: string
+ label: string
+}
+
+export const navLinks: NavLinkItem[] = [
+ { href: '/products', label: 'Products' },
+ { href: '/services', label: 'Services' },
+]
+
+export const ctaLink: NavLinkItem = {
+ href: '/contact',
+ label: "Let's Talk",
+}