Installation
Usage
"use client";
import { useState } from "react";
import {
GlassMobileNav,
GlassMobileNavHeader,
GlassMobileNavMenu,
GlassMobileNavToggle,
GlassNav,
GlassNavbarButton,
GlassNavbarLogo,
GlassNavBody,
GlassNavItems,
} from "@/components/ui/glass-nav";
export default function GlassNavDemo() {
const navItems = [
{ name: "Features", link: "#features" },
{ name: "Pricing", link: "#pricing" },
{ name: "About", link: "#about" },
{ name: "Contact", link: "#contact" },
];
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
return (
<div className="relative bg-gradient-to-br from-blue-50 via-white to-purple-50 dark:from-gray-900 dark:via-gray-800 dark:to-gray-900">
<GlassNav>
{/* Desktop Navigation */}
<GlassNavBody>
<GlassNavbarLogo />
<GlassNavItems items={navItems} />
<div className="flex items-center gap-3">
<GlassNavbarButton variant="ghost">Sign In</GlassNavbarButton>
<GlassNavbarButton variant="primary">Get Started</GlassNavbarButton>
</div>
</GlassNavBody>
{/* Mobile Navigation */}
<GlassMobileNav>
<GlassMobileNavHeader>
<GlassNavbarLogo />
<GlassMobileNavToggle
isOpen={isMobileMenuOpen}
onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}
/>
</GlassMobileNavHeader>
<GlassMobileNavMenu
isOpen={isMobileMenuOpen}
onClose={() => setIsMobileMenuOpen(false)}
>
{navItems.map((item, idx) => (
<a
key={`mobile-link-${idx}`}
href={item.link}
onClick={() => setIsMobileMenuOpen(false)}
className="w-full py-2 text-foreground/80 transition-colors hover:text-foreground"
>
{item.name}
</a>
))}
<div className="mt-4 flex w-full flex-col gap-3">
<GlassNavbarButton
onClick={() => setIsMobileMenuOpen(false)}
variant="ghost"
className="w-full justify-center"
>
Sign In
</GlassNavbarButton>
<GlassNavbarButton
onClick={() => setIsMobileMenuOpen(false)}
variant="primary"
className="w-full justify-center"
>
Get Started
</GlassNavbarButton>
</div>
</GlassMobileNavMenu>
</GlassMobileNav>
</GlassNav>
</div>
);
}Examples
Simple Navigation
const basicNavItems = [
{ name: "Home", link: "/" },
{ name: "Products", link: "/products" },
{ name: "Services", link: "/services" },
{ name: "Contact", link: "/contact" },
]
<GlassNav>
<GlassNavBody>
<GlassNavbarLogo />
<GlassNavItems items={basicNavItems} />
<GlassNavbarButton variant="primary">Get Started</GlassNavbarButton>
</GlassNavBody>
</GlassNav>Custom Logo
const CustomLogo = () => {
return (
<a
href="/"
className="flex items-center space-x-2 text-lg font-semibold text-foreground"
>
<svg className="h-8 w-8" viewBox="0 0 24 24" fill="none">
<path d="M12 2L2 7l10 5 10-5-10-5z" fill="currentColor" />
<path
d="M2 17l10 5 10-5"
stroke="currentColor"
strokeWidth="2"
fill="none"
/>
<path
d="M2 12l10 5 10-5"
stroke="currentColor"
strokeWidth="2"
fill="none"
/>
</svg>
<span>Your Brand</span>
</a>
);
};
<GlassNav>
<GlassNavBody>
<CustomLogo />
<GlassNavItems items={navItems} />
<div className="flex items-center gap-3">
<GlassNavbarButton variant="secondary">Login</GlassNavbarButton>
<GlassNavbarButton variant="primary">Sign Up</GlassNavbarButton>
</div>
</GlassNavBody>
</GlassNav>;Components
GlassNav
The main container component that handles scroll detection and visibility state.
<GlassNav className="custom-nav-styles">{/* Navigation content */}</GlassNav>GlassNavBody
Desktop navigation container with glassmorphism styling.
<GlassNavBody className="custom-body-styles">
<GlassNavbarLogo />
<GlassNavItems items={navItems} />
<div className="flex gap-2">
<GlassNavbarButton>Action</GlassNavbarButton>
</div>
</GlassNavBody>GlassNavItems
Renders navigation items with hover effects.
<GlassNavItems
items={[
{ name: "Home", link: "/" },
{ name: "About", link: "/about" },
]}
onItemClick={() => console.log("Item clicked")}
/>GlassMobileNav
Mobile navigation container with responsive design.
<GlassMobileNav>
<GlassMobileNavHeader>
<GlassNavbarLogo />
<GlassMobileNavToggle isOpen={isOpen} onClick={toggle} />
</GlassMobileNavHeader>
<GlassMobileNavMenu isOpen={isOpen} onClose={close}>
{/* Mobile menu content */}
</GlassMobileNavMenu>
</GlassMobileNav>GlassNavbarButton
Customizable button component with multiple variants.
<GlassNavbarButton variant="primary">Primary</GlassNavbarButton>
<GlassNavbarButton variant="secondary">Secondary</GlassNavbarButton>
<GlassNavbarButton variant="ghost">Ghost</GlassNavbarButton>Props
GlassNav Props
| Prop | Type | Default | Description |
|---|---|---|---|
children | React.ReactNode | - | Navigation content |
className | string | "" | Additional CSS classes for the container |
GlassNavItems Props
| Prop | Type | Default | Description |
|---|---|---|---|
items | Array<{name: string, link: string}> | - | Navigation items to display |
className | string | "" | Additional CSS classes |
onItemClick | () => void | - | Callback when an item is clicked |
GlassNavbarButton Props
| Prop | Type | Default | Description |
|---|---|---|---|
variant | "primary" | "secondary" | "ghost" | "primary" | Button styling variant |
href | string | - | Link URL (renders as anchor) |
as | React.ElementType | "a" | Component to render as |
children | React.ReactNode | - | Button content |
className | string | "" | Additional CSS classes |
GlassMobileNavToggle Props
| Prop | Type | Default | Description |
|---|---|---|---|
isOpen | boolean | - | Whether menu is open |
onClick | () => void | - | Callback when toggle is clicked |
GlassMobileNavMenu Props
| Prop | Type | Default | Description |
|---|---|---|---|
children | React.ReactNode | - | Menu content |
className | string | "" | Additional CSS classes |
isOpen | boolean | - | Whether menu is open |
onClose | () => void | - | Callback when menu should close |